Digispark: mały robot mobilny

Digispark: mały robot mobilny

W świecie płytek typu Arduino, łatwo jest realizować pojedyncze doświadczenia. Mruganie diodami, kilkakrotne obrócenie serwem, bipniecie buzzerem – do podstawowych eksperymentów wystarczy garść kabelków i kilka linijek kodu.

Trudności zaczynają się, gdy chcemy zrealizować jakieś konkretne zadanie, która wymaga połączenia kilku bloków funkcjonalnych. Wtedy wychodzą na jaw problemy z zasilaniem, dogadywaniem się niektórych elementów, poziomami logiki, niewystarczającą liczbą pinów oraz “hakami” w bibliotekach.

Kilka razy sprawdzałem już, co potrafi Digispark. Radzi sobie z generowaniem sygnałów cyfrowych, PWM czy odczytywaniem wartości sygnałów analogowych. Badanie pojedynczych funkcji to jednak nie to samo, co połączenie ich w pewną działającą całość. Dlatego właśnie postanowiłem sprawdzić klona Digisparka w warunkach “bojowych”.

Mały robot mobilny zbudowany na klonie Digispark'a
Mały robot mobilny zbudowany na klonie Digispark’a

Ten tekst oryginalnie opublikowałem na moim blogu uczymy.edu.pl. Tam też znajdziecie więcej szczegółów na temat Digisparka.

Cel

Celem projektu było skonstruowanie małego i taniego robota mobilnego, na częściach popularnie dostępnych na rynku (w szafie). Oparty na klasycznym, 3-punktowym podwoziu, napędzany dwoma serwa 360stopni, zasilany z baterii, zdalnie sterowany za pomocą pilota na podczerwień, wykonany z materiałów dostępnych pod ręką (jak metalowe klocki konstrukcyjne) – ot, taka zabawka sterowana za pomocą Digisparka.

Digispark

Będziecie potrzebować: (klona lub oryginalny) Digispark z bootloaderem micronucleus oraz kabel microUSB do programowania.

Za jednostkę sterującą użyłem klona Digispark’a. Digispark to nic innego jak AtTiny85 osadzony na zgrabnej płytce z wyprowadzeniami dla wszystkich pinów i dodatkowym stabilizatorem napięcia.

Co ciekawe, Digispark’a wyposażono w interfejs USB… ale taki emulowany przez oprogramowanie. Nie ma tu osobnego czipa do komunikacji w stylu CH340 w klonach Arduino. Wszystko realizują odpowiednie biblioteki i kilka sztuczek na granicy (albo trochę poza nimi) standardu USB.

Digispark (klon): AtTiny85, stabilizator napięcia i USB
Digispark (klon): AtTiny85, stabilizator napięcia i USB

Te sztuczki sprawiają, że Digispark bywa kapryśny. Przeprogramowanie układu czasami wymaga kilkukrotnego włożenia – wyciągnięcia go z portu USB komputera. Aktywny hub niewiele tu pomaga. Szkice czasem tylko udają, że się ładują. Bootloaderowi zdarza się zniknąć a piny nie zawsze działają zgodnie ze swoim przeznaczeniem… Brzmi jak wyzwanie, nieprawdaż?

Bootloader: niewielki kod w pamięci kontrolera, który umożliwia np. ładowanie Waszych programów przez USB z komputera (hosta).

Środowisko programowania…

Będziecie potrzebować: Arduino IDE z zainstalowanym wsparciem dla Digispark (pod Windows lub Linux)

Za środowisko programowania wybrałem Arduino IDE 1.5.8 dla Linux 64-bit (używam MINT 17.3), zmodyfikowane dla Digisparka. Dlaczego akurat to? Digispark, którego użyłem do tego projektu, swego czasu się zbuntował i konieczne było wgranie nowego bootloadera (zobacz; Digispark i micronucleus: crash). Niestety okazało się, że najnowsze Arduino IDE (1.6.6) pobrane ze strony arduino.cc, rozszerzone o wsparcie dla Digispark (zobacz: Digispark: jak zacząć pod Windows), nie obsługuje wersji micronucleus 2.+ – akurat tej, która jest dostępna na githubie Digistump. Użyłem więc starszej wersji środowiska, udostępnianej przez Digistump.

Dodatkowe narzędzia…

W trakcie rozwijania i testowania przydadzą się: przejściówka UART2USB (+Putty na hoście), analizator logiczny ewentualnie – oscyloskop. Jeżeli “zniknie” bootloader – przyda się programator ISP, np. USBASP2.

Niestety, z Digisparkiem nie zawsze wszystko idzie zgodnie z planem. Oczywiście idealną pomocą jest oscyloskop – ale to dość kosztowna “zabawka”. Alternatywnie polecam np. analizator logiczny. Podstawowe modele można kupić za bardzo rozsądne pieniądze.

Konieczna będzie przejściówka USB2UART. Dzięki niej użyjecie biblioteki SoftSerial do przesyłania logów z Digisparka i określenia kodów klawiszy pilota na podczerwień. Więcej o połączeniu szeregowym dowiecie się tutaj: Digispark: port szeregowy UART.

W procesie projektowania bardzo przydaje się analizator logiczny oraz konwerter UART2USB.
W procesie projektowania bardzo przydaje się analizator logiczny oraz konwerter UART2USB.

Budowa

Będziecie potrzebować: materiały do konstrukcji podwozia – kółka, klocki konstrukcyjne, klocki lego; płytkę stykową (do osadzenia wszystkich elementów) pojemnik na baterie, paski plastykowe do spinania elementów (tralki), recepturki, taśmę klejącą dwustronną.

Jeden z prototypów - tu jeszcze z silnikami RF - 300A
Jeden z prototypów – tu jeszcze z silnikami RF – 300A

Swoje roboty najczęściej buduję z metalowych klocków konstrukcyjnych. Swego czasu byłem nawet w ich muzeum w Police nad Metui – niektórzy czytelnicy na pewno kojarzą firmę Merkur. Ale i w Polsce mamy ciekawych producentów – np. firmę Alexander i jej serię Mały Konstruktor. Oczywiście bardzo lubię też lego – które łatwo łączą się z np. serwami.

Do konstruowania robotów często wykorzystuję tzw. “drewno cytrusowe”. Pochodzi ze… skrzynek na owoce wyproszonych z okolicznego warzywniaka. Niektóre skrzynki zrobiono ze zwykłej dykty – inne z 3mm sklejki – bardzo lekkiej i łatwej w obróbce (wystarczy nóż segmentowy).

Do montażu stosuję też paski plastykowe (tzw. tralki), dwustronną taśmę klejącą, recepturki – co tam podpadnie pod rękę.

Serwa

Będziecie potrzebować: silniki DC albo serwa 360 zasilane na 4-6V, najlepiej wyposażone w przekładnie – 100obr/min to już dość rozsądna szybkość.

Do napędu mojego robota planowałem użyć tanich silników RF-300A. Oryginalnie wykorzystywane są w napędach CD/DVD. Można je zasilać napięciem 3-6V. Na biegu jałowym zużywają 22mA, a przy zatrzymaniu wału maksymalnie 390mA.

Silniczki RF-300A montowane do drewnianych kółek
Silniczki RF-300A montowane do drewnianych kółek

Właściwie to kupiłem je głównie dlatego, że były tanie (ok. 5PLN/szt). Niestety okazały się za słabe. Przy ciężarze 4-rech baterii AA, 2 silniki mogły uciągnąć prototyp tylko na pełnej mocy, jedynie na wprost i po kafelkach – o jeździe po dywanie czy skręcaniu jednym silnikiem nie było mowy.

Inną opcja mogą być mini-silniczki z przekładniami, np. polulu. To świetne rozwiązanie. Takie napędy są naprawdę bardzo trwałe i dają niesamowity ciąg. Niestety… kosztują konkretne pieniądze.

W końcu zastosowałem 2 serwa 360st. Dokładniej są to zmodyfikowane Redoxy s90. Ze względu na sposób wykonania modyfikacji, steruje się nimi jak zwykłymi silnikami DC (prądu stałego) kluczując zasilanie sygnałem PWM. Przerobienie “normalnego” serwa na 360 nie jest takie trudne – sam zrobiłem to kilka razy (zobaczcie: Modyfikacja serwa tower pro sg90 na 360st).

Serwa przypiąłem do podwozia za pomocą 2 tralek. Użyłem też kółek lego – łatwo je przymocować do krzyżakowych orczyków serwa za pomocą cienkiego drutu.

Serwa przymocowane do podwozia z metalowych klocków konstrukcyjnych
Serwa przymocowane do podwozia z metalowych klocków konstrukcyjnych

Sterowanie silnikami: tranzystory

Będziecie potrzebować: tranzystory NPN, np. TIP122, rezystory bazowe – w zależności od silników i tranzystorów.

Z każdego z serw wychodzą 2 kabelki. Jeżeli podłączę je po prostu do + i masy zasilania – nie będę miał żadnej możliwości sterowania nimi. Oczywiście nie mogę też podłączyć kabelków bezpośrednio do AtTiny85 – pobór prądu z silników by je usmażył.

Dlatego podłączyłem je inaczej: jeden kabelek silniczka do “+” zasilania, a drugi – przez tranzystor do masy. Podłączając kabelek od silnika do kolektora tranzystora, którego emiter połączyłem z masą, będę mógł sterować przepływem prądu przez silnik. Tranzystor w stanie nasycenia, sterowany przez sygnał PWM podawany na bazę, będzie zachowywał się jak przełącznik. Włączając i wyłączając prąd (zgodnie z sygnałem PWM), będę sterował szybkością obrotową silników.

Pozostaje wybrać tranzystor. Kilka NPN znalazłem w szufladzie:

Polecam Wam świetny tekst na temat doboru tranzystorów i rezystora bazowego: How to Use A Transistor as a Switch.

Zacznijmy od Ic – maksymalnego prądu, jako może przepłynąć przez złącze kolektor-emiter. Zablokowane serwo tego typu pobierze nawet 500mA. Ic dla 2n2222 to 600mA – trochę za blisko granicy. TIP122 to 5A (wow!). bc547 – tylko 100mA, więc odpada ze stawki. bd139 ma Ic na poziomie 1.5A – też się nada.

Teraz sprawdzimy jaki prąd Ib musi popłynąć przez złącze baza-emiter, żeby tranzystor się nasycił. W przypadku bd139:

Tranzystor BD139 - wzmocnienie bazy (pobrano z instrukcji)
Tranzystor BD139 – wzmocnienie bazy (pobrano z instrukcji)

Widać to, że:
Ic = 10 * Ib

Czyli, żeby wygenerować 500mA, potrzebowalibyśmy prądu bazy 50mA. To znacząco za dużo dla AtTiny.
W instrukcji do TIP122 znajdziecie wykres 2.

TIP122: nasycenie (pobrano z instrukcji)
TIP122: nasycenie (pobrano z instrukcji)

Widać na nim, że:
Ic = 250 * Ib

Stąd dla 500mA, minimalny prąd bazy to 2mA. AtTiny wyrobi się bez problemu.

Z powyższego wykresu widać jeszcze jedno: napięcie Vbe nasycenia dla prądu 0.5A to ok. 1.4V. Informacja ta będzie nam potrzebna do wyznaczenia rezystora bazy Rb. Skoro zasilanie bazy będzie 5V, na złączu baza-emitor spadek wyniesie 1.4V, spadek napięcia na rezystorze musi wynieść 3.6V. Stąd:
I = U \ Rb,
Rb = U \ I = 3.6 \ 0.002 = 1750Ω

Rezystor 1750Ω powinien dać radę – ja użyję mniejszego (1kΩ), który da większy prąd bazy gwarantując nasycenie.

TIP122 - opis pinów (pobrano z instrukcji)
TIP122 – opis pinów (pobrano z instrukcji)

Podłączenie:

Podłączenie silnika (M) przez tranzystor do mikrokontrolera i zasilania
Podłączenie silnika (M) przez tranzystor do mikrokontrolera i zasilania

Tranzystory zamontowałem na płytce stykowej i podłączyłem do Digispark’a:

Tranzystory TIP122 zamontowane na płytce stykowej robota
Tranzystory TIP122 zamontowane na płytce stykowej robota

Zauważcie, że bazy tranzystorów podłączyłem do pinów P1 i P4 Digisparka.

Oczywiście w ten sposób będę mógł jedynie włączać/wyłączać silniki oraz regulować ich szybkość obracania się tylko w jedną stronę. Możliwość odwracania biegu dają dopiero układy takie jak L293D.

Zasilanie

Będziecie potrzebować: baterii lub akumulatorów – np. 4xAA, 2×14500, pudełka na akumulatory/baterie – najlepiej z wyłącznikiem, LM78S05 (jeżeli napięcie akumulatorów, baterii > 6v), jeżeli LM78S05: kondensatory 0.33uF i 0.1uF (330 i 100nF, oznaczenia 334 i 104), kabelki połączeniowe – męsko-męskie i męsko-żeńskie

Serwa wymagają zasilania ok. 4-6V. Z początku planowałem użyć pojemnika z 4-ma bateriami AA. Niestety baterie te – choć łatwo dostępne, dość dużo ważą. Postanowiłem zamienić je na 2 akumulatory LiIon z serii 14500. To bardzo ciekawe ogniwa. Mają rozmiar paluszków AA – a każda daje napięcie ok. 3.7 (naładowane nawet 4.3). Wystarczą więc tylko 2 połączone szeregowo.

Akumulatory LiIon - typ 14500, 3,7V
Akumulatory LiIon – typ 14500, 3,7V

Nie ma jednak nic za darmo: naładowane akumulatory dają razem ponad 8 woltów. Taki poziom napięcia mógłby uszkodzić napędy. Potrzebny jest więc dodatkowy stabilizator. LM78S05 powinien wystarczyć. Daje 5V na wyjściu przy maksymalnym prądzie 2A. Koszt ok. 1,5 PLN.

Stabilizator LM78s05 (pobrano z instrukcji)
Stabilizator LM78s05 (pobrano z instrukcji)

Model “s” może przewodzić dwa razy więcej prądu od wersji 7805. Wydawało mi się to bezpiecznym marginesem.

W jaki sposób podłączyć ten stabilizator? Instrukcja podaje tak:

Podłączenie LM78s05 do robota
Podłączenie LM78s05 do robota

Nie miałem pod ręką kondensatora 330nF – użyłem 220nF – też powinien być ok. Podłączyłem wszystko na płytce stykowej:

LM78s05 na płytce stykowej robota
LM78s05 na płytce stykowej robota

Odpowiednie umieszczenie pudełka z bateriami umożliwia też użycie jego przełącznika do włączania/wyłączania robota:

Umieście pudełko z bateriami tak, żeby jego wyłącznik służył do uruchamiania robota
Umieście pudełko z bateriami tak, żeby jego wyłącznik służył do uruchamiania robota

Zdalne sterowanie

Będziecie potrzebować: pilota na podczerwień, diodę IR odbiorczą, np. TSSOP2238, kondensator elektrolityczny ok. 4.7uF, podłączony między Vcc i GND. Dodatkowo, do zidentyfikowania kodów klawiszy pilota: przejściówkę UART2USB.

Do zdalnego sterowania robotem użyłem podczerwieni: zestawu pilot – dioda odbiorcza IR. Raczej nie próbujcie walczyć z diodą IR bez kondensatora między zasilaniem a masą. Będziecie dostawać przedziwne wyniki. Kolejne wciśnięcia tego samego klawisza mogą dawać inne kody.

Podłączenie jest bardzo proste:

TSSOP2238 (pobrane z instrukcji)
TSSOP2238 (pobrane z instrukcji)

Zasilanie Vcc podłączyłem do 5V (wyjście z 78S05), masę do masy GND, a pin OUT do P2 Digisparka.

Podłączenie diody IR TSSOP2238
Podłączenie diody IR TSSOP2238

Jeżeli chodzi o samego pilota – chwyciłem co leżało pod ręką – akurat zgrabny nadajnik od radiomagnetofonu sony.

W przypadku diod tego typu, bardziej skomplikowane jest samo oprogramowanie. Najpierw do nowego projektu dodajcie bibliotekę: DigisparkIrLib. W kodzie pojawią się dodatkowe nagłówki:

Biblioteka DigisparkIrLib wymaga drobnej modyfikacji. Odnajdźcie plik w katalogu Arduino IDE: ./hardware/digistump/avr/libraries/DigisparkIRLib/IRLib.h i zmieńcie linijkę:

Tak, żeby określała rodzaj Waszego pilota; u mnie:

Najczęściej:

Takim protokołem posługuje się np. pilot Keyes:

Pilot Keyes IR
Pilot Keyes IR

Uwaga: dekoder przetworzy tylko sygnały z protokołu, który wybierzecie; tzn. jeżeli podacie:

…biblioteka zdekoduje sygnały z pilota sony, ale nie keyes’a (który posługuje się protokołem nec’a). Generalnie można by włączyć wszystkie znane protokoły:

…ale wtedy kod rozrośnie się tak, że nie zmieści się w AtTiny85.

Biblioteka DigisparkIrLib wczytuje sygnał ze wskazanej linii IR i umieszcza go buforze. Bufor ten przetwarza dekoder. Dekoder używa MY_IR_PROTOCOL, żeby poprawnie zinterpretować zawartość tego bufora. W przypadku poprawnego rozpoznania, dostaniecie liczbę (typu long), inną dla każdego przyciśniętego klawisza.

Teraz będziecie musieli określić, jakie kody generują się po wciśnięciu klawiszy na pilocie. Do pustego szkicu dodajcie bibliotekę DigisparkIrLib, DigisparkTinyPinChange oraz DigisparkSoftSerial. Teraz wpiszcie taki program:

Pamiętajcie o “My_Receiver.resume()”, który przestawia odbiornik do wczytania kolejnego kodu z pilota.

Skomilujcie program i wgrajcie do Digisparka. Podłączcie diodę IR do zasilania, masy i pinu P2 Digisparka (pamiętajcie o kondensatorze). Połączcie pin RX przejściówki USB2UART do pinu P1 Digisparka. Pamiętajcie również o połączeniu mas Digisparka, przejściówki i diody IR.  Wciskajcie przyciski na pilocie – na konsoli hosta (komputera, do którego podłączona jest przejściówka) zobaczycie kolejne kody klawiszy, np:

Dla Windows możecie użyć Putty otwierając port szeregowy przejściówki (COMx) z szybkością 9600.

Teraz już wiecie jakie kody generuje przyciśnięcie klawisza na pilocie zdalnego sterowania.

Układ do badania kodów klawiszy (od lewej: przejściówka USB2UART, Digispark i dioda IR)
Układ do badania kodów klawiszy (od lewej: przejściówka USB2UART, Digispark i dioda IR)

Oprogramowanie

Oprogramowanie jest niezbyt skomplikowane. Oprócz DigisparkIrLib, sketch wymaga dodania biblioteki DigisparkTinySoftPwm. Znając kody klawiszy pilota:

Biblioteka IR wczytuje i dekoduje kody z pinu P2. Wynik jest porównany do kodów klawiszy pilota (np. 26150 oznacza wciśnięcie klawisza ‘play’). Jeżeli wciśnięto klawisz ‘play’ na pilocie, na P1 i P4 generowany jest sygnał PWM, który uruchamia silniki. Wciśnięcie ‘stop’ je zatrzymuje. W przypadku skręcania – zatrzymuję jeden silnik i kręcę drugim.

To oczywiście bardzo prosty algorytm – możecie go ulepszyć!

Efekty

Tak jeździ:

I kilka fotek:

Robot sterowany Digispark
Robot sterowany Digispark
Robot sterowany Digispark
Robot sterowany Digispark
Robot sterowany Digispark
Robot sterowany Digispark

Podsumowanie

No i udało się: robot reaguje na pilota, jeździ po dywanie – od biedy można by dołączyć do niego jeszcze kilka detali.

Podczas całej budowy okazało się, że największym problemem są… biblioteki. A dokładniej ich niepełna – i raczej nastawiona na programistów, niż użytkowników – dokumentacja. Trochę trzeba się naczytać kodu, żeby dowiedzieć się, że IR używa dodatkowego timera – blokując w ten sposób pin P0.

Sam klon Digispark też nie pomaga – pin P3 jest uruchamiany przez bootloader szukający hosta. Jeżeli podłączycie do P3 silnik – przy starcie czipu zacznie się obracać… P5 to reset – podanie na niego stanu niskiego, spowoduje zresetowanie układu (nie dotyczy to oryginalnych Digisparków, które mają wyłączoną możliwość zewnętrznego resetu).

Jeżeli jednak nie zniechęcą Was te przeszkody – efekty mogą być całkiem ciekawe.

Źródła

Ocena: 4.22/5 (głosów: 45)

Podobne posty

9 komentarzy do “Digispark: mały robot mobilny

  • Czytam Cię już od jakiegoś czasu, ale po raz pierwszy pozwalam sobie na komentarz. Nie wszystkie blogi potrafią zainteresować. Twój tak. Nie wszystkich blogerów można pozytywnie kojarzyć. Ciebie jak najbardziej. Jednym słowem – lubię tu bywać i mam nadzieję wracać tu częściej :)

    Odpowiedz
    • To nie jest blog jednego autora, każdy może tutaj umieścić własny artykuł. A ten wpis jest pierwszym od Elektronika Bez Spięcia (
      Arkadiusz Merta). Pozdrawiam :)

      Odpowiedz
  • Post dosyć konkretny i bardzo treściwy,
    Ostatnimi czasy był tutaj deficyt krótkich ale treściwych postów z dziedziny elektroniki, choć ostatnio wygląda to lepiej ;)

    Testowałeś robota na innych podłożach? Oczywiście nie ma co oczekiwać cudów :D
    A co do digisparka, nie łatwiej było włożyć gołą atmegę ? osobiście pozbyłem się takich problemów kupując klona uno i gdy zaprogramuje układ najprościej w świecie wyciągam z Arduino, wilk syty i owca cała. Choć pewnie lubisz wyzwania ;)

    Odpowiedz
    • Cieszę się, jeżeli post się podobał. “Jeździka” testowałem na kafelkach i dywanie:) Serwa może nie są zbyt szybkie, ale oferują całkiem niezły ciąg – teraz pracuję nad ciężarówką z napędem na 2-osie:).
      Oczywiście w tym projekcie można było zastosować wiele różnych czipów – atmega to jeden, esp8266 to kolejna ciekawa możliwość – jest ich pewnie więcej. Ale ten konkretny tekst pochodzi z dłuższej serii o digisparkach. Po kilku postach opisujących poszczególne funkcje, postanowiłem sprawdzić, jak zadziała w ramach większej całości. Zadziałał:)

      Pozdrawiam,
      Arek

      Odpowiedz
  • Dzięki za artykuł, czy ten P3 i poszukiwanie hosta można jakoś wyłączyć. Zacząłem sie bawić digisparkiem klonem i zauważyłem napięcie ~3v na P3 w rożnych moich sketch-ach, myślałem że ja coś uwaliłem bo mi czasem głupoty się dzieją. Nie podłączałem P3 pod oscyloskop, być możne wtedy bym zauważył ze to więcej niż napięcie :] Z P5 już się pogodziłem z uwagi na prostotę programowania na początek;)

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?