Arduino, co w środku piszczy – #1 – schemat

Arduino, co w środku piszczy – #1 – schemat

Wakacyjny upał ma czasem swoje zalety. Mając dosyć urlopu można poświęcić chwilę lub dwie na hobby, a nawet napisać mały artykuł.

Niby wszyscy znają  Arduino, ale czym ono jest? Jak zostało zaprojektowane i skonfigurowane? Jaki jest jego związek z C oraz C++? Mając wolną chwilę postanowiłem zagłębić się trochę w kodach i dokumentacji. Do czego dotarłem?

Część sprzętowa - hardware

Obecnie platforma ta ma wiele odmian oraz płytek kompatybilnych. Zacznijmy od czegoś prostego Arduino Uno, to chyba dobry wybór, żeby poznać niejako wzorcową implementację. Jakiś czas temu wśród twórców Arduino nastąpił rozłam i obecnie Arduino Uno dostępne jest w dwóch oryginalnych wersjach oraz niezliczonej liczbie klonów. Na szczęście oba oryginały – opisane na stronach https://www.arduino.cc oraz http://www.arduino.org właściwie nie różnią się sprzętowo.

Najpierw warto spojrzeć na schemat płytki:

Schemat płytki Arduino UNO.

Schemat płytki Arduino UNO.

Układ jest prosty, ale warto prześledzić go krok-po-kroku.

Zasilanie Arduino-UNO

Najważniejsze jest zasilanie (zasilane układy elektroniczne działają lepiej). Arduino wyposażone jest w dość standardowy układ zasilania oraz stabilizator NCP1117:

Zasilanie Arduino UNO.

Zasilanie Arduino UNO.

Więcej o stabilizatorze przeczytamy w jego nocie katalogowej. Gdy już uzyskamy napięcie na linii +5V, to zobaczymy, że świeci się zielona dioda:

Dioda zas.

Dioda sygnalizująca dopływ zasilania.

Zamiast zewnętrznego zasilacza oraz wbudowanego stabilizatora Arduino może być zasilane z USB. Ten układ jest nieco bardziej skomplikowany. Wynika to prawdopodobnie z chęci przygotowania układu, który może być bez konfliktów podłączony jednocześnie do zasilacza oraz złącza USB – w takiej sytuacji USB powinno dawać możliwość komunikacji z płytką, ale nie zasilać układu. Najprościej taki układ byłoby uzyskać zasilając płytkę przez diody, jednak spadek napięcie powodowałby pracę z niższym napięciem niż oczekiwane 5V.

Pierwsza jego część, to rozpoznanie, skąd powinno być pobierane zasilanie modułu. Wzmacniacz LMV358 jest użyty jako komparator (co chyba jest błędem projektowym, ale jak widać działa). Napięcie wejściowe z zasilacza (linia VIN), jest podawane na dzielnik oraz porównywane z wzorcowym 3.3V (z dodatkowego stabilizatora).

Fragment schematu z komparatorem.

Fragment schematu z komparatorem.

Dzielnik działa w proporcji 1:2 więc jeśli napięcie zasilania jest wyższe od 6.6V, tranzystor T1 nie przewodzi i do zasilania wykorzystywane jest zewnętrzne źródło. Natomiast w przeciwnym przypadku, T1 podaje 5V z USB bezpośrednio do Arduino.

Dzięki temu układ pracuje poprawnie przy obu zasilaniach oraz nie występuje spadek 0,7V typowy dla rozwiązań z diodami na wejściu (tylko szkoda, że wzmacniacz udaje komparator). Ponieważ LMV385 zawiera dwa wzmacniacze operacyjne, wolny moduł został wykorzystany jako „wtórnik napięciowy”. Dzięki niemu linia SCK, czyli zegara SPI może sterować żółtą diodą na płytce:

Fragment schematu odpowiedzialny za sterowanie żółtą LED.

Fragment schematu odpowiedzialny za sterowanie żółtą LED.

Komunikacja Arduino przez USB

Układ zasilania mamy już omówiony, jak widzimy nie jest bardzo skomplikowany. Teraz czas popatrzeć na mikrokontrolery. Liczba mnoga jest użyta nie bez powodu. Jak wszyscy wiemy Arduino jest wyposażone w układ ATMega328. Jednak na schemacie widzimy jeszcze jeden mikrokontroler – ATMega16.

Drugi mikrokontroler na płytce Arduino.

Drugi mikrokontroler na płytce Arduino.

Domyślnie ten układ pełni funkcję konwertera USB-UART. Uart jest bardzo prostym protokołem komunikacji szeregowej. Dwie linie: RX do odbierania danych oraz TX do wysyłania pozwalają na przesyłanie danych między układami. Na schemacie widzimy je w prawym dolnym rogu.

Dodatkowo do programowania wykorzystywana jest linia reset – resetująca główny procesor. Te trzy linie wystarczają do programowania naszego procesora. Można w tym miejscu zapytać, jak zaprogramować ATMegę16? Odpowiedź jest widoczna na schemacie jako złącze ICSP1, które służy do programowania układu.

Potrzebny jest do tego programator AVR ISP, np. zgodny z STK500. Odpowiednie narzędzie jest łatwo dostępne właściwie w każdym sklepie elektronicznym lub na „popularnym portalu aukcyjnym”. Taki interfejs ma ciekawą cechę – można byłoby zaprogramować ten układ i na jednym Arduino mieć w pełni sprawny układ dwuprocesorowy!

Główny mikrokontroler na pokładzie Arduino

Na koniec możemy spojrzeć na schemat podłączenia głównego mikrokontrolera:

Fragment schematu Arduino z ATMega328.

Fragment schematu Arduino z ATMega328.

Ten moduł jest zaskakująco prosty – poza filtracją zasilania, znajdziemy tylko rezonator kwarcowy 16 MHz, złącze programatora ICSP oraz wyprowadzone piny. To chyba dobry przykład na to, że prostota jest najlepsza. Układ, który właściwie nic nie ma zawojował świat.

Jak widzieliśmy analizując układ Atmegą16, linie reset, RX, TX są połączone z konwerterem. Dzięki temu USB można wykorzystać do programowania głównego mikrokontrolera. Za pomocą UART-a można też komunikować się z komputerem PC.

Warto zwrócić uwagę na złącze ICSP – dzięki niemu Arduino można programować tym samym programatorem, co Atmegę16. Złącze to służy również do wgrywania bootloader-a.


W kolejnej części zobaczymy jak działa bootloader oraz jak Arduino sprytnie wykorzystuje w pełni standardowe narzędzia, jak np. avrdude, czy kompilator gcc.

Autor: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański

Nawigacja kursu

arduino, Atmega, avr, programownie