chmurka.net

[2006-11-02]

Tic Tac Play. Malutka pozytywka w opakowaniu po tiktakach.

Jakość zdjęć jest jaka jest, bo taka jest.

0.jpg

1.jpg

2.jpg

3.jpg

Co to umie? Po otworzeniu pudełka (tak jakby ktoś chciał wyciągnąć tik-taka) gra. Małe, proste, poręczne. Tym co odróżnia ją od innych wynalazków tego typu jest własna melodia. Na przykład ulubiona piosenka osoby, której dajemy takie pudełko. Jeżeli szukasz czegoś, co zagra jakąś popularną melodię z tego typu zabawek, to kup za parę groszy UM66 (z melodią Dla Elizy) albo inny (np. UM3481 albo UM34811, jeden zna 6 melodii a drugi 12) i nie zawracaj sobie głowy w programowanie AVRów (to mimo wszystko dosyć zaawansowany mikrokontroler).

Chyba że chcesz się nauczyć :) W takim wypadku NAJPIERW polecam przeczytanie strony http://www.toxygen.net/avr/.

BOM.
  1. 1x ATmega8-L
  2. 1x Przetwornik piezo
  3. 1x Kwarc 8 MHz
  4. 2x 33pF
  5. 1x Switch chwilowy rozwierny
  6. 3x Ogniwo LR44 (nie lutujcie ich, lubią wybuchać w twarz)
  7. 1x Płytka uniwersalna
Układ przy 3 ogniwach ciągnie ok. 5mA. Przy pojemności jednego ogniwa 105mAh wystarczy na ponad 21 godzin grania non-stop (dużo ponad - przy 3V ciągnie 2,4mA, czyli mamy na oko 3 doby ciągłego grania, a podejrzewam że po wystartowaniu oscylatora nawet 5).

Wymagany sprzęt i soft.
  1. Dowolny komputer z portem LPT (albo innym interfejsem do programatora) i Linuksem
  2. Programator AVR (STK200, DAPA albo jakikolwiek inny)
  3. uisp
  4. Jakby ktoś chciał zmieniać firmware: avr-gcc, avr-binutils, avr-libc
Dlaczego Linux? Nie wiem, pewnie może być też Windows, ale nigdy nie bawiłem się w programowanie AVRów pod Windows (słyszałem że jest jakiś WinAVR), więc nie jestem w stanie polecić.

Składamy całość, podłączając kwarc do X1 i X2, po jednym 33pF między każdą końcówkę kwarcu a masę, a piezo między OC1A a VCC. Wyprowadzamy interfejs do programatora (RST, MISO, MOSI, SCK, GND) i tyle. Schematu mi się nie chce rysować, wybaczycie? Wiem, że wybaczycie. Jakby ktoś koniecznie chciał być pr0, to powinien podłączyć reset do zewnętrznego układu RC, ale AVR bez problemu chodzi i bez tego. Zresztą bez 33pF też chodzi, ale głupio byłoby, gdyby przy lekkim wyczerpaniu baterii oscylator miał problemy ze startem.

Reszta to już napisanie firmware dla AVR.

Tak się składa, że napisałem ten firmware, więc nie musicie nic szczególnego robić. Najwyżej jakby ktoś chciał zmienić domyślną melodię z Sum 41 - Pieces na coś innego, powinien zmienić tablicę notes[] w pliku note.c, wypełniając ją wartościami nut zgodnymi z formatem Extended Pattern z FastTrackera i przekompilować całość przy pomocy Makefile, który też dla was zrobiłem. Moduł, który można obrobić w FT2 i wyciągnąć z niego tablicę wzorców, można uzyskać z mida np. przy pomocy konsolowego mid2xm - ja tak zrobiłem, przy okazji rozgryzając format XP i opisując go tutaj. Jakby ktoś miał duże trudności ze zdobyciem mida, to może wypróbować jakiegoś programu do analizy widmowej - niestety mój malutki, zajmujący 2 kB konwerter wav na midi spisał się gorzej niż źle, a profesjonalne narzędzia tego typu niewiele lepiej. Co w sumie nawet cieszy, bo demo żadnego z 7 programów, które wypróbowałem, nie chciało zapisywać tego, co stworzyło, a crackowałem coś ostatnio 6 lat temu i nie chcę zerować tego licznika :) Jedna uwaga: Nuty powinny zaczynać się na oktawie 0. Zdefiniowane są dwie oktawy, bo na tyle rozciąga się Pieces, ale jakby ktoś chciał więcej, to powinien dodać je do pliku player.c. Gdyby dla kogoś domyślne częstotliwości oktaw były za duże lub za małe, to też może je pozmieniać w player.c - mnożniki można znaleźć w makrodefinicjach DIV_H() i DIV_L() (te dwa makra przeliczają częstotliwość na starszy i młodszy bajt dzielnika timera - należy pamiętać, że ATmega8 jest 8-bitowy).

Oprócz tego do zmiany melodii przyda się kilka niewielkich programów, które w międzyczasie napisałem (coś do scalenia nut rozrzuconych po różnych ścieżkach do jednej ścieżki, coś do zamiany binarki na ciąg w C itd.), ale bez przesady, coś takiego można napisać w ciągu 3 minut. Może kiedyś dopracuję konwerter binarek na C i wrzucę na stronę z projektami.

Są dwa timery.
  1. Timer 1: Odlicza z częstotliwością 2 MHz od 0 i jeżeli wartość licznika osiągnie wartość dzielnika częstotliwości (CTC), to neguje wartość na porcie przetwornika piezo. Dzięki temu piezo odkształca się z częstotliwością 1 MHz / dzielnik (1, bo jedno odkształcenie to połowa okresu fali sterującej piezo). Funkcjonalność jest implementowana sprzętowo.
  2. Timer 0: Z dużo mniejszą częstotliwością odlicza kolejne nuty i zgodnie z nimi programuje dzielniki dla poprzedniego timera. Potrafi też wyłączyć timer 1, implementując pauzę nutową, ale ta funkcja nie jest na razie wykorzystywana. Funkcjonalność jest implementowana programowo.
Co robi program?
  1. Włącza driver portu piezo, wyłącza przerwania, inicjuje timery i włącza przerwania
  2. Ustawia tryb idle (wyłączenie rdzenia i zegarów CPU i flasha)
  3. Idluje w pętli, oszczędzając baterię
Gdy przyjdzie przerwanie z timera 0 (timer 1 nie generuje przerwania, procesor sam obsługuje podział częstotliwości), rdzeń wstaje ze snu i robi co trzeba, a potem znowu się wyłącza. Szczegóły? RTFS.

Bym zapomniał. Firmware (tarball).

Skargi i wnioski: Adam Wysocki, gophi (małpa) chmurka.net

Powrót do www.chmurka.net.