- Obsługa za pomocą dwóch przycisków.
- Strojenie gitary z użyciem efektu stroboskopowego.
- Wielkość i kształt płytki drukowanej zbliżony do kostki gitarowej.
- Mikrokontroler ATtiny24 taktowany rezonatorem 3,6864 MHz.
- Zasilanie z baterii CR2032.
Jak wspomniano we wstępie, układ stroika oświetla strojoną strunę za pomocą światła o określonej częstotliwości migotania. Jeśli obserwowana struna drga z częstotliwością inną niż emitowana przez LED, będzie wydawało się, że porusza się w górę i w dół wolniej lub szybciej, zależnie od stopnia odstrojenia. W wypadku nastrojenia struny do częstotliwości migania diod LED struna ta będzie wydawała się nieruchoma. W ten sposób możemy zrealizować układ oryginalnego stroika gitarowego, który z powodzeniem zastąpi rozwiązania tradycyjne.
Zanim jednak przejdziemy do opisu urządzenia konieczne wydaje się przyswojenie podstawowej wiedzy na temat częstotliwości dźwięków muzycznych. W powszechnie używanym tzw. systemie równomiernie temperowanym stosunek częstotliwości dwóch kolejnych dźwięków jest stały i wynosi )12, czyli dwukrotnie! Przyjęto ponadto, że podstawową częstotliwością, do której stroi się wszystkie instrumenty, jest częstotliwość dźwięku A1 równa 440 Hz. Dla takich założeń częstotliwości prawidłowo nastrojonych strun gitary klasycznej wynoszą kolejno: E2→82,41 Hz, A2→110 Hz, D3→146,83 Hz, G3→196 Hz, B3→246,94 Hz, E4→329,63 Hz. Na tym etapie posiadamy już niezbędną z punktu widzenia projektu wiedzę z zakresu muzyki, w związku z czym pora przejść do rozwiązania sprzętowego.
Schemat ideowy stroika pokazano na rysunku 1. Jest to nieskomplikowany system procesorowy, którego sercem jest mikrokontroler ATtiny24 realizujący całą, zakładaną funkcjonalność urządzenia. Mikrokontroler steruje pracą dwóch diod LED1 i LED2 będących oświetlaczem stroboskopowym oraz realizuje interfejs użytkownika zbudowany z 6 diod LED wskazujących rodzaj strojonej struny oraz dwóch przycisków: TONE odpowiedzialnego za wybór rodzaju strojonej struny oraz POWER służącego do włączania/wyłączania zasilania urządzenia. Warto podkreślić, że całe urządzenie jest zasilane z niewielkiej baterii CR2032 o napięciu 3 V, więc w tym projekcie istotne było odpowiednie gospodarowanie pobieraną energią. Do realizacji tego wymagania wykorzystano możliwość wprowadzania mikrokontrolera w tryb uśpienia (w naszym wypadku tryb Power Down), w którym prąd pobierany przez urządzenie spada do wartości poniżej 0,1 μA! W porównaniu do prądu obciążenia włączonego urządzenia (pobieranego głównie przez diody LED) rzędu 30 mA osiągnięto gigantyczną wręcz oszczędność energii, zapewniając długą pracę urządzenia na jednej baterii zasilającej. Mikrokontroler jest usypiany każdorazowo po naciśnięciu przycisku Power (dokładnie, co drugie naciśnięcie) lub po 2 minutach bezczynności urządzenia.
• CKSEL3…0: 1101
• SUT1…0: 11
• CKDIV8: 1
• CKOUT: 1
Przejdźmy zatem do szczegółów implementacyjnych. W celu realizacji efektu stroboskopowego wykorzystano układ czasowo-licznikowy Timer1 pracujący w trybie CTC (porównania wartości licznika TCNT1 z zawartością rejestru OCR1A) taktowany przebiegiem zegarowym o częstotliwości 3,6864 MHz (Preskaler=1). Dzięki odpowiedniej konfiguracji Timer1 przejmuje kontrolę nad wyprowadzeniem OC1A mikrokontrolera, pozwalając na generowanie przebiegu prostokątnego o częstotliwości zależnej od wartości wpisanej do rejestru OCR1A a obliczanej według wzoru:
- fclk – częstotliwość taktowania mikrokontrolera równa 3,6864 MHz,
- N – wartość preskalera ustawiana w rejestrze TCCR1B (w naszym wypadku 1),
- OCR1A – wartość wpisana do rejestru OCR1A.
Na listingu 1 pokazano sposób konfigurowania Timera1 oraz niezbędne stałe wyznaczone dla potrzeb generowania przebiegów o określonej częstotliwości (dla kolejnych strun gitary). Zmiany częstotliwości na wyjściu OC1A dokonujemy poprzez wczytanie do rejestru OCR1A stosownej stałej z tablicy Tones[], używając w tym celu makra z pliku pgmspace.h dostarczanego wraz z pakietem AVR-GCC w następujący sposób: OCR1A=pgm_read_word(&Tones[Index]);.
//Tablica przechowująca wartości OCR1A odpowiadające częstotliwościom poszczególnych strun
const uint16_t Tones[] PROGMEM = {22365, 16755, 12552, 9403, 7463, 5590};
//Konfigurowanie Timera1 adla generowania przebiegu na wyjściu OC1A
TCCR1A = (1<<COM1A0); //Zmiana stanu OC1A przy porównaniu
TCCR1B = (1<<WGM12)|(1<<CS10); //Tryb CTC, Preskaler = 1
OCR1A = 22365; //Na starcie ustawiamy częstotliwość struny E
DDRA |= (1<<PA6); //Port OC1A, jako port wyjściowy
Do omówienia pozostaje poruszona na wstępie kwestia energooszczędności urządzenia i trybu uśpienia mikrokontrolera. W celu zminimalizowania energii pobieranej przez układ zastosowano następujące, charakterystyczne dla wszystkich mikrokontrolerów AVR zabiegi programowo-sprzętowe:
- Wszystkie nieużywane porty I/O ustawiono jako wyjściowe (opcjonalnie można było pozostawić je jako wejściowe z włączonym podciąganiem do napięcia zasilania).
- Wyłączono wszystkie nieużywane peryferia mikrokontrolera.
- Nieużywane urządzenie wprowadzano w stan uśpienia Power Down.
Za realizację powyższej funkcjonalności odpowiada fragment programu przedstawiony na listingu 2.
//Redukcja poboru mocy poprzez wyłączenie nieużywanych peryferiów
PRR = (1<<PRTIM0)|(1<<PRUSI)|(1<<PRADC); //Timer0, Universal Serial Interface, ADC
ACSR = (1<<ACD); //Wyłączenie komparatora analogowego
//Nieużywany port, jako wyjściowy ze stanem 0
DDRB |= (1<<PB3);
Do rozwiązania pozostaje jeszcze kwestia usypiania i wybudzania mikrokontrolera. Do wybudzania mikrokontrolera ze stanu uśpienia wykorzystano wejście przerwania zewnętrznego INT0 skonfigurowane jako wyzwalane poziomem niskim, ponieważ dla tego wejścia to jedyna dostępna możliwość wybudzania. Samą procedurę obsługi przerwania INT0 pozostawiono pustą, gdyż przerwanie służy wyłącznie do wyprowadzenia mikrokontrolera ze stanu uśpienia, w który został wcześniej wprowadzony za pomocą przycisku Power, a które inicjuje wykonanie fragmentu programu odpowiedzialnego za uśpienie mikrokontrolera z listingu 3. Zaprezentowany kod z list. 3 korzysta z wygodnych makr zawartych w pliku sleep.h dostarczanym z pakietem AVR-GCC.
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Ustawienie rodzaju trybu uśpienia
sleep_enable(); //Aktywacja możliwości uśpienia mikrokontrolera
sei(); //Zezwolenie na obsługę przerwań (w celu późniejszego wybudzenia mikrokontrolera)
sleep_cpu(); //Uśpienie mikrokontrolera
sleep_disable(); //Dezaktywacja możliwości uśpienia mikrokontrolera
To tyle, jeśli chodzi o opis zagadnień implementacyjnych. Pora na pokazanie schematu montażowego urządzenia, który zamieszczono na rysunku 2.
Jak widać, zaprojektowano niewielki i zwarty obwód drukowany ze zdecydowaną przewagą elementów SMD, który kształtem i wymiarami przypomina kostkę gitarową. Montaż rozpoczynamy od przylutowania elementów umieszczonych na warstwie TOP, przy czym w pierwszej kolejności lutujemy mikrokontroler, następnie wszystkie LED-y zachowując odpowiednią biegunowość, kolejno elementy bierne, a na samym końcu przyciski POWER i TONE oraz rezonator kwarcowy. Następnie przechodzimy na stronę BOTTOM, gdzie wlutowujemy gniazdo baterii CR2032 będące jedynym elementem przeznaczonym do montażu przewlekanego. Warto także pocynować duże pole lutownicze umieszczone pod gniazdem baterii będące jednocześnie stykiem ujemnego bieguna baterii. Zaprogramowane urządzenie nie wymaga żadnych procedur konfiguracyjnych i powinno działać tuż po włączeniu zasilania.
Robert Wołgajew, EP
- R1, R2: 62 Ω
- R3: 220 Ω
- C1: 100 nF
- C2, C3: 22 pF
- U1: ATtiny24 (SOIC14)
- LED1, LED2: LED typu OSR5120641E (SMD 1206)
- LED3…LED8: LED czerwona (SMD 1206)
- Q1: rezonator kwarcowy SMD 3,6864 MHz (HC49SM)
- POWER, TONE: przycisk SMD typu TACTM-34N
- BATT: gniazdo baterii CR2032 typu COMF BC-2002