Moduły Trinket https://learn.adafruit.com/introducing-trinket/ firmy Adafruit są niewielkimi płytkami rozwojowymi dla mikrokontrolerów. Oparte one są o układ ATiny85 firmy Atmel. Płytka została zaprojektowana tak, aby była niewielka, co umożliwia jej integracje z dowolnym niemalże projektem. Doskonale przydaje się jeśli chcemy zrealizować szybko jakieś proste urządzenie, a nie chcemy w nim montować drogiej pełnowymiarowej płytki rozwojowej. Jest to najmniejsza i najtańsza płytka kompatybilna z arduino-IDE na rynku.
Trinket jest dobrze dostosowany do zbudowania w oparciu o niego zegara. Jest mały i łatwo da się go umieścić w obudowie dowolnego zegara. Zegarki nie potrzebują dodatkowych układów, ani dużej ilości kodu. Można do tej płytki dodać np. wyświetlacz 7-segmentowy poprzez I2C.
W poniższym projekcie wykorzystano oprócz Trinketa moduł Adafruit DS1307 - zegar czasu rzeczywistego. Jednakże aby uczynić projekt ciekawszym wykorzystamy do wyświetlania czasu dwa mierniki wskazówkowe.
Moduł Trinket ma możliwość sterowania wskaźnikami analogowymi bez wykorzystania DACa. Wystarczy wykorzystać sugnały PWM obecne na trzech z pinów modułu. Wykorzystane mierniki uśredniają płynący prąd na indukcyjności uzwojenia, więc zależnie od szerokości impulsów miernik widzieć będzie różne napięcie. Układ generuje impulsy o różnej szerokości, zależnie jakie ma być wskazanie godzin i minut na zegarze.
Do wysterowania dwóch mierników wykorzystamy dwa wyjścia PWM, na trzecim znajduje się interfejs I²C, podłączony do modułu zegara czasu rzeczywistego.
Budowa układu
Trinket zasilany może być napięciem w zakresie od 3,7 do 16 V poprzez wejście BAT+. W projekcie układ będzie zasilany napięciem 5 V, podobnie jak płytka z zegarem czasu rzeczywistego. Jeśli zmieni się napięcie zasilające konieczna może być powtórna kalibracja zegara.
Dla układu zasilanego napięciem 5 V i mierników 50 µA, potrzebny jest szeregowy rezystor z miernikiem, aby prąd nie przekroczył maksymalnego. Z prawa Ohma wyliczamy, że rezystancja musi wynosić 100 kΩ. Potrzebne są dwa takie oporniki o możliwie małej tolerancji - 5% lub mniej. Można je zastąpić potencjometrami precyzyjnymi o rezystancji 100k z szeregowo włączonym opornikiem 10..47 kΩ i dokładnie skalibrować. Pozwoli to na precyzyjne nastawienie rezystancji tych oporników. W projekcie wykorzystano oporniki 100 kΩ, które okazały się dostatecznie precyzyjne do tego zastosowania.
Połączenie elementów jest dosyć proste. Wykorzystano wszystkie piny modułu z AVRem poza GPIO #3. Ten pin został podłączony tymczasowo do modułu FTDI Friend, który wykorzystano do debugowania układu poprzez dedykowany terminal.
Tekst pokazuje datę i czas wraz z dwoma numerami (od 0 do 255), które odpowiadają wypełnieniu przebiegu PWM. Jak widać na powyższym przykładzie 255 to południe, 13 minut po pełnej godzinie to 55. Jeśli nie udało się zobaczyć czegoś podobnego na wyjściu szeregowym układu poprzez terminal, trzeba sprawdzić kod i połączenia.
Przygotowanie do programowania
Skorzystać można z tutoriala, jak dostosować środowisko Arduino IDE do pracy z modułami Trinket. Wystarczy dodać plik z definicją sprzętową, plik avrdude.cong, zmienić wersję ld.exe z 2008 na 2009 i zainstalować sterownik do USBtinyISP.
Aby przygotować Trinket do programowania można wgrać do środowiska Arduino przykładowy szkic Blink. Pozwoli to na sprawdzenie czy Trinket działa poprawnie. Wystarczy nacisnąć sprzętowy reset na module i szybko wgrać program z środowiska Arduino. Jeśli pojawią się jakieś błędy, można próbować wgrywać program jeszcze raz. Jeśli problem nie ustępuje należy upewnić się że do pinu 3 i 4 nic nie jest połączone, a środowisko Arduino IDE zostało poprawnie skonfigurowane.
Po uruchomieniu szkicu Blink musimy doinstalować biblioteki TinyRTClib oraz TinyWire. Teraz można skopiować szkic do następnej stronie i rozpocząć tworzenie zegara.
Problemy z debugowaniem
Przy problemach z środowiskiem Arduino IDE:
Upewnij się że zainstalowałeś dodatek do Trinketa, sterownik USBtinyISP oraz podmieniłeś program ld.exe.
Zainstalowałeś biblioteki TinyWireM i TinyRTClib.
Upewnij się że zresetowałeś Trinket przed wgraniem szkicu. Czerwona dioda będzie mrugała w 10 s okienku, gdy wgranie jest możliwe.
Jeśli w szkicu umieścimy dużo kodu lub innych bibliotek, łatwo jest przekroczyć maksymalny rozmiar kody dla Trinketa. Jeśli musimy wykorzystywać tak duży szkic skorzystajmy z Arduino Uno, Adafruit Boarduino, Pro Trinket lub Adafruit Flora.
Jeśli otrzymujemy błędy podobne do tego poniżej:
arduino-1.0.1/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x2):relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in /arduino-1.0.1/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)być może wykorzystaliśmy liczby dziesiętne, a biblioteka do liczb zmiennoprzecinkowych została dodana do Arduino IDE, co przekracza dostępną ilość pamięci programu modułu.
Kod zaprezentowany poniżej pozostawia dużo pamięci programu na dodanie dodatkowych funkcji, szczególnie jeśli usuniemy kod dla interfejsu szeregowego. Jednakże pamiętać musimy, że deklaracja dużych macierzy, długich stringów i zmiennych dziesiętnych/zmiennoprzecinkowych lub innych bibliotek, może łatwo zająć całą dostępną pamięć programu lub ją przepełnić.
Kod programu
Konieczne jest dwukrotne uruchomienie skeczu, raz aby ustawić zegar, a drugi aby umożliwić mu pracę. Kod w setup() sprawdzający czy rtc.isrunning() powinien być odkomentowany. Pozwoli to na ustawienie czasu w zegarze za pierwszym razem, gdy kod będzie skompilowany. Do normalnego działania linijka ta musi być zakomentowana, tak aby korzystać normalnie z czasu w DS1307.
Jeśli planujesz inne funkcje kody, niż poniższy przykład, albo masz problemy z jego działanie, interfejs szeregowy pozwala na debugowanie jego pracy. Przetestowano bibliotekę SendOnlySoftwareSerial do tego celu. Dodaje to około 1300 bajtów kodu, więc można ją usunąć po uruchomieniu projektu.
Kod: text
PWM na pinie 4
Można zauważyć, że funkcja analogWrite zainicjuje działanie PWMa na pinach #0 i #1, ale nie na #4. Arduino IDE nie pozwala na łatwe uruchomienie tej funkcji. Funkcja PWM4_init w powyższym przykładzie ustawia Timer 1 ATTiny85 do włączenia PWMa wstępnie na 50%. Funkcja analogWrite4 pozwoli na konfigurację tego PWMa. Wykorzystanie Timera 1 do PWMa uniemożliwi jego wykorzystanie do innych zastosowań, ale nie jest on potrzebny w zegarku. Należy się upewnić, że inne biblioteki nie potrzebują tego timera.
Mierniki
W pierwszej kolejności trzeba wymienić w miernikach skale z tych w mikroamperach na godziny i minuty. Poniżej przykłądowe szablony:
Należy delikatnie rozkręcić i otworzyć miernik, podnieść obudowę i rozciąć będącą tam etykietę. Następnie można delikatnie wsunąć odpowiednio docięty wydruk według powyższego przykładu, tak aby nie uszkodzić igły miernika. Następnie można złożyć miernik w całość. Ewentualne niedopasowanie skali do pozycji igły skompensować można śrubką do korekcji położenia zera.
Montaż
Mierniki montuje się z wykorzystaniem czterech śrub, co pozwala zamontować je na każdej powierzchni. Wykorzystano mniej tradycyjną metodę montażu. Mierniki zamontowano obok siebie i zawieszono w obudowie. Płytka z elektroniką znajduje się za miernikami, przymocowana do kawałka drewna. Inną metodą montowania układu byłoby skorzystanie z elementów wykonanych w technologii druku 3D.
W przedstawionym projekcie płytka drukowana została zamontowana za miernikami. Dodatkowo dodano baterię 9 V, ale w Waszych projektach można wykorzystać zasilacz DC. Niezależnie od zasilania, zegar z DS1307 będzie odmierzał czas poprawnie przez wiele miesięcy wykorzystując w tym celu wbudowaną w moduł własną baterię.
Jeśli zamontujesz układ w innej obudowie, masz większy wybór montażu płytki z elektroniką.
Źródło:
https://learn.adafruit.com/trinket-powered-analog-meter-clock?view=all
Fajne? Ranking DIY
