Autor poniższej konstrukcji przedstawiał już podobny układ - miniaturowy zegarek oparty o ATtiny (Link) - ale teraz idzie krok dalej i umieszcza całą konstrukcję w niewielkiej obudowie w kształcie pierścionka. Poniżej, krok po kroku, przedstawiono jak zmontować takie urządzenie
Krok 1: Przygotowania
Mikrokontroler
Układ oparty jest o mikrokontrolery AVR firmy Atmel ATtiny85. Autor wykorzystał element w obudowie SOIC z uwagi na niezwykle mały rozmiar. Układ ten zasilany jest z pojedynczej baterii; wybrana wersja ATtiny85V-10SU pracować może z zasilaniem już od 2 V.
Programator
Do zaprogramowania układu potrzebny będzie programator ISCP. Autor korzysta z modelu Digispark littleWire,
Bateria
Do zasilania zegarka wykorzystano pojedynczą baterię CR1220; autor przewiduje że czas pracy zegarka na tym układzie powinien wynosić co najmniej pół roku.
Wyświetlacz
Jako że liczba pinów wyjściowych z ATtiny85 jest bardzo mała autor wykorzystuje w projekcie wyświetlacz sterowany poprzez interfejs I²C. Dodatkowym czynnikiem wpływającym na wybór ekranu zegarka jest dostępność elementów na rynku i pobór prądu przez ten element. Po analizie dostępnych wyświetlaczy autor wybrał OLEDowy ekran sterowany przez układ SSD1306. Ekrany tego rodzaju dostępne są w kilku rozdzielczościach: 64 x 32, 128 x 64, 128 x 32 oraz 64x48.
Obudowa Zegarka
Wstępny pomysł zakładał wykonanie obudowy z drewna, ale z uwagi na swoje lenistwo (jak sam napisał) autor konstrukcji zdecydował się na wydruk 3D. W obudowie zamontowany jest kawałek przeźroczystej folii PET, która ochrania wyświetlacz.
Pozostałe elementy i potrzebne narzędzia:
* Klips do układów SOIC do programatora ISP
* 3 x śrubka M2
* 3 x przycisk (microswitch)
* 2 x oporniki (powyżej 1k)
* Emaliowany drucik miedziany.
* Cienkie metalowe płytki do wykonania uchwytu do baterii
* Przejściówka z SOIC8 do DIP8
* Fragment płytki uniwersalnej7
Krok 2: Konfiguracja Arduino do pracy z ATtiny85, EEPROMem i TinyWireM
Najlepiej jest korzystać z Arduino IDE w wersji 1.6.5 - późniejsze (1.6.6 i 1.6.7 mają pewne problemy z kompatybilnością. Następnie pobieramy ArduinoTiny (https://github.com/vprimachenko/ArduinoTiny) i instalujemy wszystko na naszym komputerze. Najpewniej Arduino zainstaluje się w domyślnym folderze:
C:\Program Files\Arduino
Aby dodać wsparcie dla mikrokontrolerów z rodziny ATtiny rozpakowujemy pobraną paczkę i kopiujemy pliki do folderu z Arduino. Podobnie robimy ze wsparciem dla EEPROMu, kopiując potrzebne pliki z folderu hardware\arduino\avr\libraries\EEPROM\EEPROM.h do folderu hardware\tiny\avr\cores\tiny w folderze Arduino na dysku C:
Następnie musimy zainstalować bibliotekę do TinyWireM. W tym celu uruchamiamy IDE, wybieramy następnie: Sketch Menu -> Include Library sub-menu -> Manage Libraries... na liście odszukujemy TinyWireM i naciskami przycisk instalacji. Teraz możemy zamknąć menu i wyłączyć IDE.
Biblioteka TinyWireM ma pewien problem z działaniem, jednakże jest on szeroko znany i łatwo go naprawić. W folderze, gdzie zainstalowaliśmy bibliotekę ("My Documents\Arduino\libraries\TinyWireM) znajdujemy plik TinyWireM.cpp i w linii 53 zmieniamy z:
Na:
Krok 3: Kod źródłowy zegarka
Kod źródłowy do obsługi zegarka pobrać możemy stąd. Kod zegarka (plik .ino) prezentuje się następująco:
Rozdzielczość ekranu OLED zmieniamy w pliku ssd1306.h:
Krok 4: Wykonanie obudowy zegarka
Obudowa wykonana została przez autora z plastiku w technologii druku 3D. Nic nie stoi na przeszkodzie, aby wykonać ją z drewna, aby cała konstrukcja była dużo bardziej elegancka.
Do wykonania są dwa elementy, tutaj i tutaj odnaleźć można pliki .stl opisujące te elementy.
Krok 5: Lutowanie ATtiny do PCB
Przylutowania mikrokontrolera do płytki drukowanej nie jest niezbędne do montażu zegarka, jednakże istotnie ułatwi jego programowanie i kolejne kroki podczas montażu elementów elektronicznych.
Krok 6: Płytka z przyciskami
W poprzednim projekcie, wspominanym we wstępie, autor wykorzystał do obsługi dwóch przycisków dwa piny mikrokontrolera. W prezentowanym tutaj zegarku trzy przyciski podłączone zostały do jednego pinu - wejścia analogowego - w bardzo sprytny sposób. Pierwszy przycisk (set) łączy masę z pinem PB3 (ADC3), drugi (up) podobnie, ale poprzez opornik 6,8 kΩ, a trzeci (down) poprzez opornik 68 kΩ. Dzięki temu odczytując wartość napięcia na wejściu można rozróżnić który przycisk został naciśnięty. Autor dobierając oporniki zmierzył napięcia dla różnych wartości. Jeśli planujecie użyć inne nic opisane powyżej, należy zmienić w programie linijkę odpowiedzialną za rozpoznawanie wartości:
Krok 7: Lutowanie układu
Jako że pierścionek jest zakrzywiony, nie można zamontować elementów na jednej płaskiej płytce drukowanej. Mikrokontroler, wyświetlacz, bateria i przyciski zamocowane są osobno i połączone ze sobą cienkim drucikiem w emaliowej izolacji. Do podłączenia masy i zasilania do poszczególnych elementów potrzebne jest około 6..8 cm drucika. Emalię zdjąć można z pomocą np. papieru ściernego, w miejscach, które mają być przylutowane.
Do mikrokontrolera podłączamy:
Pin 2: Moduł z przyciskami
Pin 4: OLED GND; moduł z przyciskami; bateria
Pin 5: OLED SDA
Pin 7: OLED SCL
Pin 8: OLED VCC; bateria
Krok 8: Uchwyt do baterii
W pierścionku nie zmieści się normalny uchwyt na baterię CR1220, dlatego też trzeba wykonać taki element samodzielnie. Autor wykonał go z dwóch blaszek, do których przylutowano cienki drucik. Po umieszczeniu blaszek i baterii w obudowie sprawdzić można połączenie z wykorzystaniem multimetra.
Krok 9: Programowanie mikrokontrolera
Aby zaprogramować układu musimy po kolei:
* Podłączyć programator do komputera
* Uruchomić Arduino IDE
* Otworzyć plik ATtinyWatch.ino
* Wybieramy z menu Tools -> Board -> ATtiny85
* Wybieramy z menu Tools -> Clock -> 1 MHz (oscylator wewnętrzny, wyłączone BOD)
* Wybieramy z menu Tools -> Programmer -> nasz kabel ISP
* Usuwamy z zegarka baterię
* Podłączamy klips do programowania do mikrokontrolera i naciskamy przycisk Upload.
Jeśli nie dysponujemy klipsem dla elementów SOIC możemy podłączyć kabel w następujący sposób
MISO -> Pin 6
VCC -> Pin
SCK -> Pin 7
MOSI -> Pin 5
RESET -> Pin 1
GND -> Pin 4
Krok 10: Ekran testowy
Aby wejść do ekranu testowego, który wyświetla szereg interesujących parametrów należy nacisnąć przyciski up lub down gdy nie jest wybrane żadne pole daty lub godziny. Na ekranie zobaczymy wtedy informacje w czterech wierszach:
Wiersz 1 (I): Licznik przerwania watchdoga (WDT); resetuje się on co godzinę.
Wiersz 2 (M): Dostrajana liczba mikrosekund na jedno przerwanie watchdoga. Wartość ta jest dostrajana co godzinę.
Wiersz 3 (V): Skalibrowana wartość napięcia z baterii w miliwoltach.
Wiersz 4 (T): Temperatura układu ATtiny85 w jednostkach umownych; wartość uśredniona na podstawie 64 pomiarów.
Krok 11: Kalibracja czasu
Naciskamy przycisk set i ustawiamy się na pole czasu lub daty, które zostanie podświetlone. Przyciskami up i down przestawiają pole które jest aktualnie edytowane. Po naciśnięciu set podczas gdy podświetlone jest pole wyświetlające sekundy kalibracja zakończy się. Teraz czas będzie automatycznie dostrajany z pomocą watchdoga układu. Doświadczenia autora pokazały, że przy stabilnym napięciu zasilania i temperaturze zegarek nie spóźnia/śpieszy się więcej niż minutę dziennie po kalibracji.
Krok 12: Kalibracja napięcia
W kodzie programu musimy zakomentować linie #define z DEBUG_SCREEN_V i MULTI_METER_VOLTAGE w pliku WDT_time.h. programujemy zmienionym kodem układu i odczytujemy napięcie z ekranu, porównując je z wskazaniami multimetru. Następnie możemy wpisać wartość do kodu i od tego momentu wartość zmierzonego napięcia będzie poprawnie prezentowana. Program z uzupełnionymi polami będzie prezentował się tak:
Krok 13: Kalibracja termometru w układzie
Analogicznie jak dla napięcia musimy zmienić kod programu - odkomentować zmienne DEBUG_SCREEN_T_1, TEMPERATURE_1, DEBUG_SCREEN_T_2 i TEMPERATURE_2 i uzupełnić je o wartości zmierzone dla dwóch temperatur. Następnie ponownie programujemy zegarek. Fragment kodu z definicjami tych stałych wyglądać po wypełnieniu powinien np. tak:
Krok 14: Montaż
Ekran OLED umieszczamy w wyznaczonym miejscu w obudowie, następnie wsuwamy do niej resztę elementów. Obudowę skręcamy z pomocą trzech śrubek M2. Przeźroczystą folię, o wymiaracg 16 mm x 82 mm wsuwamy w obudowę, mocując przy brzegach taśmą. Warto delikatnie zaokrąglić rogi plastikowej folii, aby lepiej mieściła się w obudowie.
Skończony zegarek prezentuje się następująco:
Co dalej? autor w planach ma szereg modyfikacji układu:
* Zmniejszenie jego wymiarów, poprzez usunięcie płytki do której przylutowany jest mikrokontroler, a płytka z przyciskami może być jeszcze zmniejszona z wykorzystaniem elementów SMD.
* Podłączenie kolejnych modułów I²C.
* Dodanie sensora światła w celu kontroli jasności ekranu i dostosowywania jej do warunków otoczenia.
* Dodanie opcji lepszej synchronizacji czasu, np. poprzez GPS, WiFi, Bluetooth itp.
Źródło: http://www.instructables.com/id/ATtiny85-Ring-Watch/?ALLSTEPS
Krok 1: Przygotowania
Mikrokontroler
Układ oparty jest o mikrokontrolery AVR firmy Atmel ATtiny85. Autor wykorzystał element w obudowie SOIC z uwagi na niezwykle mały rozmiar. Układ ten zasilany jest z pojedynczej baterii; wybrana wersja ATtiny85V-10SU pracować może z zasilaniem już od 2 V.
Programator
Do zaprogramowania układu potrzebny będzie programator ISCP. Autor korzysta z modelu Digispark littleWire,
Bateria
Do zasilania zegarka wykorzystano pojedynczą baterię CR1220; autor przewiduje że czas pracy zegarka na tym układzie powinien wynosić co najmniej pół roku.
Wyświetlacz
Jako że liczba pinów wyjściowych z ATtiny85 jest bardzo mała autor wykorzystuje w projekcie wyświetlacz sterowany poprzez interfejs I²C. Dodatkowym czynnikiem wpływającym na wybór ekranu zegarka jest dostępność elementów na rynku i pobór prądu przez ten element. Po analizie dostępnych wyświetlaczy autor wybrał OLEDowy ekran sterowany przez układ SSD1306. Ekrany tego rodzaju dostępne są w kilku rozdzielczościach: 64 x 32, 128 x 64, 128 x 32 oraz 64x48.
Obudowa Zegarka
Wstępny pomysł zakładał wykonanie obudowy z drewna, ale z uwagi na swoje lenistwo (jak sam napisał) autor konstrukcji zdecydował się na wydruk 3D. W obudowie zamontowany jest kawałek przeźroczystej folii PET, która ochrania wyświetlacz.
Pozostałe elementy i potrzebne narzędzia:
* Klips do układów SOIC do programatora ISP
* 3 x śrubka M2
* 3 x przycisk (microswitch)
* 2 x oporniki (powyżej 1k)
* Emaliowany drucik miedziany.
* Cienkie metalowe płytki do wykonania uchwytu do baterii
* Przejściówka z SOIC8 do DIP8
* Fragment płytki uniwersalnej7
Krok 2: Konfiguracja Arduino do pracy z ATtiny85, EEPROMem i TinyWireM
Najlepiej jest korzystać z Arduino IDE w wersji 1.6.5 - późniejsze (1.6.6 i 1.6.7 mają pewne problemy z kompatybilnością. Następnie pobieramy ArduinoTiny (https://github.com/vprimachenko/ArduinoTiny) i instalujemy wszystko na naszym komputerze. Najpewniej Arduino zainstaluje się w domyślnym folderze:
C:\Program Files\Arduino
Aby dodać wsparcie dla mikrokontrolerów z rodziny ATtiny rozpakowujemy pobraną paczkę i kopiujemy pliki do folderu z Arduino. Podobnie robimy ze wsparciem dla EEPROMu, kopiując potrzebne pliki z folderu hardware\arduino\avr\libraries\EEPROM\EEPROM.h do folderu hardware\tiny\avr\cores\tiny w folderze Arduino na dysku C:
Następnie musimy zainstalować bibliotekę do TinyWireM. W tym celu uruchamiamy IDE, wybieramy następnie: Sketch Menu -> Include Library sub-menu -> Manage Libraries... na liście odszukujemy TinyWireM i naciskami przycisk instalacji. Teraz możemy zamknąć menu i wyłączyć IDE.
Biblioteka TinyWireM ma pewien problem z działaniem, jednakże jest on szeroko znany i łatwo go naprawić. W folderze, gdzie zainstalowaliśmy bibliotekę ("My Documents\Arduino\libraries\TinyWireM) znajdujemy plik TinyWireM.cpp i w linii 53 zmieniamy z:
Kod: C / C++
Na:
Kod: C / C++
Krok 3: Kod źródłowy zegarka
Kod źródłowy do obsługi zegarka pobrać możemy stąd. Kod zegarka (plik .ino) prezentuje się następująco:
Kod: C / C++
Rozdzielczość ekranu OLED zmieniamy w pliku ssd1306.h:
Kod: C / C++
Krok 4: Wykonanie obudowy zegarka
Obudowa wykonana została przez autora z plastiku w technologii druku 3D. Nic nie stoi na przeszkodzie, aby wykonać ją z drewna, aby cała konstrukcja była dużo bardziej elegancka.
Do wykonania są dwa elementy, tutaj i tutaj odnaleźć można pliki .stl opisujące te elementy.
Krok 5: Lutowanie ATtiny do PCB
Przylutowania mikrokontrolera do płytki drukowanej nie jest niezbędne do montażu zegarka, jednakże istotnie ułatwi jego programowanie i kolejne kroki podczas montażu elementów elektronicznych.
Krok 6: Płytka z przyciskami
W poprzednim projekcie, wspominanym we wstępie, autor wykorzystał do obsługi dwóch przycisków dwa piny mikrokontrolera. W prezentowanym tutaj zegarku trzy przyciski podłączone zostały do jednego pinu - wejścia analogowego - w bardzo sprytny sposób. Pierwszy przycisk (set) łączy masę z pinem PB3 (ADC3), drugi (up) podobnie, ale poprzez opornik 6,8 kΩ, a trzeci (down) poprzez opornik 68 kΩ. Dzięki temu odczytując wartość napięcia na wejściu można rozróżnić który przycisk został naciśnięty. Autor dobierając oporniki zmierzył napięcia dla różnych wartości. Jeśli planujecie użyć inne nic opisane powyżej, należy zmienić w programie linijkę odpowiedzialną za rozpoznawanie wartości:
Kod: C / C++
Krok 7: Lutowanie układu
Jako że pierścionek jest zakrzywiony, nie można zamontować elementów na jednej płaskiej płytce drukowanej. Mikrokontroler, wyświetlacz, bateria i przyciski zamocowane są osobno i połączone ze sobą cienkim drucikiem w emaliowej izolacji. Do podłączenia masy i zasilania do poszczególnych elementów potrzebne jest około 6..8 cm drucika. Emalię zdjąć można z pomocą np. papieru ściernego, w miejscach, które mają być przylutowane.
Do mikrokontrolera podłączamy:
Pin 2: Moduł z przyciskami
Pin 4: OLED GND; moduł z przyciskami; bateria
Pin 5: OLED SDA
Pin 7: OLED SCL
Pin 8: OLED VCC; bateria
Krok 8: Uchwyt do baterii
W pierścionku nie zmieści się normalny uchwyt na baterię CR1220, dlatego też trzeba wykonać taki element samodzielnie. Autor wykonał go z dwóch blaszek, do których przylutowano cienki drucik. Po umieszczeniu blaszek i baterii w obudowie sprawdzić można połączenie z wykorzystaniem multimetra.
Krok 9: Programowanie mikrokontrolera
Aby zaprogramować układu musimy po kolei:
* Podłączyć programator do komputera
* Uruchomić Arduino IDE
* Otworzyć plik ATtinyWatch.ino
* Wybieramy z menu Tools -> Board -> ATtiny85
* Wybieramy z menu Tools -> Clock -> 1 MHz (oscylator wewnętrzny, wyłączone BOD)
* Wybieramy z menu Tools -> Programmer -> nasz kabel ISP
* Usuwamy z zegarka baterię
* Podłączamy klips do programowania do mikrokontrolera i naciskamy przycisk Upload.
Jeśli nie dysponujemy klipsem dla elementów SOIC możemy podłączyć kabel w następujący sposób
MISO -> Pin 6
VCC -> Pin
SCK -> Pin 7
MOSI -> Pin 5
RESET -> Pin 1
GND -> Pin 4
Krok 10: Ekran testowy
Aby wejść do ekranu testowego, który wyświetla szereg interesujących parametrów należy nacisnąć przyciski up lub down gdy nie jest wybrane żadne pole daty lub godziny. Na ekranie zobaczymy wtedy informacje w czterech wierszach:
Wiersz 1 (I): Licznik przerwania watchdoga (WDT); resetuje się on co godzinę.
Wiersz 2 (M): Dostrajana liczba mikrosekund na jedno przerwanie watchdoga. Wartość ta jest dostrajana co godzinę.
Wiersz 3 (V): Skalibrowana wartość napięcia z baterii w miliwoltach.
Wiersz 4 (T): Temperatura układu ATtiny85 w jednostkach umownych; wartość uśredniona na podstawie 64 pomiarów.
Krok 11: Kalibracja czasu
Naciskamy przycisk set i ustawiamy się na pole czasu lub daty, które zostanie podświetlone. Przyciskami up i down przestawiają pole które jest aktualnie edytowane. Po naciśnięciu set podczas gdy podświetlone jest pole wyświetlające sekundy kalibracja zakończy się. Teraz czas będzie automatycznie dostrajany z pomocą watchdoga układu. Doświadczenia autora pokazały, że przy stabilnym napięciu zasilania i temperaturze zegarek nie spóźnia/śpieszy się więcej niż minutę dziennie po kalibracji.
Krok 12: Kalibracja napięcia
W kodzie programu musimy zakomentować linie #define z DEBUG_SCREEN_V i MULTI_METER_VOLTAGE w pliku WDT_time.h. programujemy zmienionym kodem układu i odczytujemy napięcie z ekranu, porównując je z wskazaniami multimetru. Następnie możemy wpisać wartość do kodu i od tego momentu wartość zmierzonego napięcia będzie poprawnie prezentowana. Program z uzupełnionymi polami będzie prezentował się tak:
Kod: C / C++
Krok 13: Kalibracja termometru w układzie
Analogicznie jak dla napięcia musimy zmienić kod programu - odkomentować zmienne DEBUG_SCREEN_T_1, TEMPERATURE_1, DEBUG_SCREEN_T_2 i TEMPERATURE_2 i uzupełnić je o wartości zmierzone dla dwóch temperatur. Następnie ponownie programujemy zegarek. Fragment kodu z definicjami tych stałych wyglądać po wypełnieniu powinien np. tak:
Kod: C / C++
Krok 14: Montaż
Ekran OLED umieszczamy w wyznaczonym miejscu w obudowie, następnie wsuwamy do niej resztę elementów. Obudowę skręcamy z pomocą trzech śrubek M2. Przeźroczystą folię, o wymiaracg 16 mm x 82 mm wsuwamy w obudowę, mocując przy brzegach taśmą. Warto delikatnie zaokrąglić rogi plastikowej folii, aby lepiej mieściła się w obudowie.
Skończony zegarek prezentuje się następująco:
Co dalej? autor w planach ma szereg modyfikacji układu:
* Zmniejszenie jego wymiarów, poprzez usunięcie płytki do której przylutowany jest mikrokontroler, a płytka z przyciskami może być jeszcze zmniejszona z wykorzystaniem elementów SMD.
* Podłączenie kolejnych modułów I²C.
* Dodanie sensora światła w celu kontroli jasności ekranu i dostosowywania jej do warunków otoczenia.
* Dodanie opcji lepszej synchronizacji czasu, np. poprzez GPS, WiFi, Bluetooth itp.
Źródło: http://www.instructables.com/id/ATtiny85-Ring-Watch/?ALLSTEPS
