Digispark i klony – kilka słów o portach (kompendium)

Digispark to niewielka płytka w stylu Arduino. W odróżnieniu do UNO, opiera się na kontrolerze AtTiny85. Porty AtTiny85 wyprowadzono na wygodne piny. Płytka zawiera też stabilizator napięcia.

Ale najciekawszy jest taki trochę „oszukany” USB. Nie ma tu, jak w Arduino, osobnego czipa w stylu CH340 (jak w chińskich klonach UNO). Kombinacja rezystorów i diod wykorzystująca pewne właściwości USB sprawia, że Digispark’a można programować przez USB.

Zanim jednak zaczniecie wykorzystywać Digisparka w swoich projektach, warto przyglądnąć się kilku właściwościom jego portów. Momentami mogą… zaskoczyć.

Więcej o Digispark: O uruchamianiu Digispark (również: archiwum digispark).

Digispark, Digistump i klony

Digispark, projekt firmy Digistump, zadebiutował  na Kickstarterze. Celem było zgromadzenie 5000 dolarów – udało się zebrać ponad 330 tysięcy! I nic dziwnego: niewielkie rozmiary, stabilizator, możliwość programowania przez USB, wsparcie przez Arduino IDE – AtTiny85 stał się nagle całkiem prosty do okiełznania.

W skrócie:

  • Wsparcie  Arduino IDE,
  • Zasilanie przez USB lub zewnętrznie: 5v lub 7-35v (zalecane 12v),
  • Stabilizator 5v, 500mA (zależnie od modelu, też 100mA),
  • Programowanie i zasilanie po USB,
  • 6 pinów wejściowo-wyjściowych (niektóre wymagają specjalnych zabiegów),
  • Pamięć programów (flash) 8kB (około 6kB po załadownaiu bootloadera),
  • Komunikacja po I2C i SPI,
  • PWM sprzętowy na 3 pinach (więcej możliwe w oprogramowaniu),
  • Przetwornik analog-cyfra na 4 pinach,
  • Diody świecące (LED) sygnalizujące zasilanie i dodatkowa do użycia w kodzie.

Szybko pojawiły się klony Digisparka. Niektóre wtyka się bezpośrednio do portu USB (jak oryginalny produkt) – w innych zamontowano gniazdo microUSB. Zdarzają się różne wersje stabilizatorów (np. 78L05 czy 78M05).

Oprócz samej płytki, jej rozkładu, jedną z zasadniczych różnic między projektem Digistumpa i klonami – jest podłączenie resetu do pinu P5. W oryginalnym produkcie reset kontrolera jest wyłączony fusami i pin P5 działa jak kolejny port. Minusem tego jest to, że bez specjalnego programatora (HVSP)  nie można przeprogramować takiego Digisparka za pomocą ICSP. Czyli np. nie  da radę wymienić bootloadera (w tej roli micronucleus).

Budowę HVSP dla AtTiny85 opisywałem tutaj: HVSP dla AtTiny85.

W klonach reset jest najczęściej włączony i podpięty pod P5. W rezultacie P5 jest praktycznie stracony dla Waszych aplikacji. Obniżenie jego stanu do 0 (cóż, właściwie poniżej 2.2v) spowoduje reset układu. ALE za to można np. wymienić bootloader (tutaj: Digispark i micronucleus… crash).

Piny Digispark

Na płytce Digispark znajdziecie następujące wyprowadzenia:

Pin ADC* PWM Uwagi
USB Port USB. W zależności od realizacji „zwykła” wtyczka (USB A) lub micro.
GND Masa
VIN Wejście stabilizatora napięcia. Minimalne napięcie to ok. 7v – maksymalnie 35v.
5v Jeżeli zasilany z USB: 5v z USB
Jeżeli zasilany z VIN: 5v ze stabilizatora.
P0 TAK: 504Hz LED w starszych modelach, i2c/SDA
P1 TAK: 504Hz Podczepiona dioda LED
P2 ADC1  i2c/SCL
P3 ADC3 Komunikacja po USB – D-, UWAGA: pull-up 1k5Ω i dioda zenera 3.6v. Sterowany przez bootloader, potem w stanie wysokim.
P4 ADC2 TAK: 1007Hz Komunikacja po USB – D+.
P5 ADC0 UWAGA: może być podłączony pod reset (zależnie od realizacji) – ustawienie stanu niskiego spowoduje resetowanie układu. Startuje w stan wysoki.

*ADC: przetwornik analog-cyfra; pozwala na zamianę napięcia na wartości cyfrowe; w UNO porty A0..A5.

USB?!

Jak wspominałem, Digispark nie ma osobnego czipu do obsługi USB.

Układ jest stosunkowo prosty:

Digispark: USB (pobrane z Digispark)

…co nie zawsze działa:) Czasami będziecie musieli po kilka razy wkładać Digisparka do USB. Ale za którymś razem powinno się udać.

Digisparka można przerobić na urządzenie USB! Już niedługo opiszę DigiCDC.

Zasilanie Digispark

Jednym z praktyczniejszych elementów płytki Digispark jest stabilizator napięcia. jego wejście oznaczone jest VIN.

W zależności od realizacji, zasilanie Digispark przez pin VIN wymaga co najmniej 7v i maksymalnie 35v. W klonach znalazłem 78L05 lub 78M05. I faktycznie – te układy mają maksymalne napięcie 35v – ale to wartość naprawdę maksymalna (ang. absolute maximum rating). W takich warunkach producent nie gwarantuje poprawnego działania. Powyżej tej wartości stabilizator może ulec zniszczeniu.

Jeżeli zasilicie Digisparka przez VIN, na pinie oznaczonym „5V” pojawi się napięcie 5V ze stabilizatora.

Jeżeli zasilicie Digisparka z USB, na pinie VIN nie będzie żadnego napięcia (stabilizator jest pomijany). Na pinie „5v” pojawi się 5v.

Możecie też zasilić Digisparka przez 5v. Ale wtedy musicie się upewnić, że nie nakarmicie go więcej niż ok. 5.5v. Nie ma tam żadnego zabezpieczenia i AtTiny może pójść z dymem.

Po włączeniu zasilania… (standardowy bootloader)

Po włączeniu zasilania uruchamiany jest bootloader. Jeżeli bootloader w ciągu 5 sekund wykryje Arduino IDE podłączone przez USB i czekające na Digisparka, rozpocznie ładowanie nowego programu. Jeżeli Arduino IDE nie zostanie wykryte – bootloader uruchomi program, który już jest w pamięci.

W tym poście znajdziecie link do bootloadera, który startuje szybciej pomijając 5-cio sekundowe oczekiwanie na komunikację po USB.

Po włączeniu zasilania, pin P3 ustawiany jest przy starcie bootloadera:

W ten sposób Digispark sprawdza, czy po drugiej stronie nie ma Arduino IDE czekającego, żeby załadować nowy kod. Tuż przed końcem działania bootloadera, pin jest na chwilę ściągany w dół i potem znowu ustawiany w stan wysoki. Dioda zenera sprawia, że po tej operacji pin ustawiany jest na napięcie trochę powyżej 3v.

Co ciekawe, jeżeli w swoim programie ustawicie P3 w stan wysoki… pin przyjmie poziom 5v:

Pin p5 (reset) tuż po włączeniu zasilania ustawiany jest w stan wysoki:

Jeżeli w programie ustawicie piny na stan wysoki, otrzymacie go dopiero gdy bootloader załaduje program (czyli po 5 sekundach).

Rozważcie to zachowanie (zmiany stanów i maksymalne napięcia) przy projektowaniu Waszych układów. Najlepiej nie używać P3 jako pin wyjściowy, bo przy starcie bootloadera może wysyłać „coś” na podłączony do niego układ. Jeżeli P5 jest podłączony do resetu, w ogóle najlepiej go nie używać – albo unikać sprowadzenia go do „zera” – inaczej zresetuje kontroler.

Dodatkowo, podanie sygnału np. PWM na P3 lub P4 może uniemożliwić start Digisparka. Sądzę, że jest to związane z tym, że po tych pinach bootloader komunikuje się z komputerem przez USB. Wprowadzenie na nie sygnału może „ogłupić” bootloader, któremu będzie się wydawać, że dostaje coś z Arduino IDE i usilnie będzie próbował „czytać z tego portu. Digispark może wtedy nie wystartować.

Programowanie portów pod Arduino IDE

Konfiguracja portów:

port Px jako wyjście pinMode(x, OUTPUT);
port Px jako wejście pinMode(x, INPUT);

Odczyty analogowe:

Uwaga: P2 = analogRead(1) itp – to nie pomyłka.

odczyt analogowy z P2 (0..1023) analogRead(1);
odczyt analogowy z P3 analogRead(3);
odczyt analogowy z P4 analogRead(2);
odczyt analogowy z P5
analogRead(0);

Dla uniwersalnych portów cyfrowych:

odczyt z Px digitalRead(x);
zapis cyfrowy z P1 (tu podłączona jest LED) digitalWrite(1, LOW);
digitalWrite(1, HIGH);
zapis cyfrowy do Px digitalWrite(x, LOW);
digitalWrite(x, HIGH);

Generacja PWM:

PWM z P0 (504 Hz) analogWrite(0);
PWM z P1 (504 Hz) analogWrite(1);
PWM z P4 (1007 Hz) analogWrite(4);


Piny P3 i P4 używane są do komunikacji z komputerem po USB. W czasie programowania będziecie musieli je odłączyć od układu.

Generacja sygnału PWM

PWM (inaczej Pulse Width Modulation lub Modulacja Szerokością Impulsu) używa się np. do sterowania silnikami, serwami, jasnością świecenia LED, głośnikami.

pwm_0Sygnał PWM to nic innego jak sygnał prostokątny, który charakteryzuje się dwoma głównymi parametrami:

  • Częstotliwością, czyli ilością powtarzalnych cykli w ciągu jednej sekundy, wyrażana w Hz (Hertzach); 1Hz = 1 cykl w ciągu 1 sekundy,
  • Stopniem wypełnienia (ang. duty) jako stosunek czasu trwania stanu wysokiego do całkowitego czasu trwania jednego cyklu.

Częstotliwość jest ważna. Dla przykładu, serwa modelarskie (analogowe) sterowane są sygnałem o częstotliwości 50Hz (żółty lub biały kabelek). Znacząco większa lub mniejsza częstotliwość sprawi, że serwo przestanie reagować – albo będzie się zachowywać kompletnie nieprzewidywalnie.

50Hz oznacza 50 cykli w ciągu sekundy. Każdy cykl trwa więc 1/50 sekundy, czyli 20 ms.

W ciągu takiego cyklu, stan sygnału zmienia się z wysokiego na niski. Stosunek trwania sygnału wysokiego do całego czasu trwania cyklu nazywamy stopniem wypełnienia.

Stopień wypełnienia jest ważny – bo to właściwie on steruje urządzeniami. Przykładowo, 7.5% wypełnienie sygnału ustawia serwo w pozycji neutralnej (0 stopni). 7.5% wypełnienie oznacza czas trwania impulsu wysokiego:
20[ms] \cdot 0.075 = 1.5 [ms]

5% (1ms) i 10% wypełnienie (2ms) ustawiają serwa w pozycji skrajnej.

pwm_1


Możecie podglądnąć przebiegi PWM za pomocą np. oscyloskopu lub analizatora logicznego (zobacz: Sigrok: analizator logiczny).

analogWrite

W świecie Arduino IDE, do wygenerowania sygnału PWM służy funkcja analogWrite. Przyjmuje 2 parametry:

  • Pin, na którym PWM ma być generowany
  • Stopień wypełnienia (ang. duty) jako liczbę z zakresu 0..255.

Typowe wywołanie:
analogWrite( 1, 127);
…wygeneruje sygnał PWM na pinie 1 o stopniu wypełnienia 50%.

Żeby uniknąć wszelkich wątpliwości:

  • Arduino UNO: sygnał PWM może być generowany na określonych pinach. Na płytce oznaczone są one najczęściej tyldą („~”) umieszczoną przy numerze pinu. Sa to: 3, 5, 6, 9, 10 i 11,
  • Digispark: sygnał PWM sprzętowo można generować na 3 pinach P0, P1 i P4.

Wywołując funkcję analogWrite(pin,..., wstawiamy numer pinu zgodnie z numeracją portów, np.:analogWrite(0,... wygeneruje sygnał PWM na porcie P0 (1:P1, 4: P4).

Warto pamiętać, że częstotliwość generowanego sygnału jest różna w zależności od pinu:

  • Arduino UNO: piny 5,6: 980 Hz, pozostałe: 490Hz.
  • Digispark: piny P0 i P1: 504Hz, pin P4: 1007 Hz

Na stronie: Digispark tricks znajdziecie kilka sztuczek, jak generować PWM o innej częstotliwości. Ale generalnie możecie sterować wypełnieniem sygnału.

Powyższy opis dotyczy PWM generowanego sprzętowo, przez zegary działające w AtTiny85. PWM możecie również wygenerować na wszystkich innych pinach – są do tego odpowiednie biblioteki.

Port szeregowy

AtTiny, inaczej niż kontrolery z serii AtMega (np. 328p w UNO) nie ma na pokładzie portu szeregowego. To duża niedogodność, ponieważ trudno „zobaczyć” co się dzieje w kodzie programu.

ALE: możecie do projektu dodać bibliotekę DigisparkSoftSerial. Używa się ją podobnie jak tą „Serial” znaną z UNO:

Niestety biblioteka ta jest dość „pamięcio – żerna”. O ile pusty projekt zajmuje ok. 302 bajty, dodanie powyższego kodu zwiększa program do 2508 bajtów – czyli o ponad 2.2kB. To całkiem dużo, biorąc pod uwagę, że po wgraniu bootloadera, w pamięci flash zostaje niecałe 6kB na program.

Podsumownie

„Normalne” UNO nie zawsze jest dobrym rozwiązaniem. Mimo wszystko, jest stosunkowo duże. Do mniejszych projektów, gdzie nie ma potrzeby obsługiwania zbyt wielu sygnałów, Digispark może się okazać idealnym rozwiązaniem. Pamiętajcie jednak o pewnych ograniczeniach. Zaoszczędzicie sobie kilku problemów:)

Źródła

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *