Powrót

Wokół Arduino. Sprzętowe tajemnice Arduino

W serii artykułów „Wokół Arduino” wyjaśniamy trudniejsze zagadnienia dotyczące sprzętu i programowania.


Nazwa Arduino kojarzy się dziś przede wszystkim z charakterystyczną płytką drukowaną – przykład na fotografii 1 oraz mniej czy bardziej słusznie także z „obrazkowymi”, kolorowymi schematami, realizowanymi za pomocą darmowego programu Fritzingrysunek 2.

Fotografia 1

Rysunek 2

Historia Arduino zaczęła się kilkanaście lat temu, w roku 2005 we Włoszech w jednej ze szkół podyplomowych (Inter­action Design Institute Ivrea), gdzie chodziło o realizację zajęć programowania mikrokontrolerów za pomocą sprzętu tańszego niż dostępne wówczas zestawy prototypowe oraz oprogramowania łatwego w obsłudze także dla mniej zorientowanych.

Nazwa pochodzi od jednego z włoskich królów sprzed tysiąca lat, Arduina z Ivrei (Arduino d’Ivrea,­
r. 955–1015). Wśród inicjatorów projektu wymieniani są: Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino i David Mellis. Od strony programowej wykorzystano z jednej strony koncepcje projektu Processing, a z drugiej biblioteki projektu Wiring, stworzonego przez Hernando Barragána.

Pierwsza płytka Arduino była wyposażona w procesor ATmega8, nie miała łącza USB, tylko gniazdo portu szeregowego COM (RS-232) – fotografia 3 (fotografie 3–8, 10 pochodzą z Wikipedii – https://en.wikipedia.org/wiki/Arduino).

Fotografia 3

Płytka mogła być zasilana niestabilizowanym napięciem, a po przełączeniu zworki – napięciem stabilizowanym 5V. Nie przewidywano obwodów zasilania napięciem 3,3V.

Dużym unowocześnieniem było wprowadzenie łącza USB i obsługującej je kostki FTDI (FT232). Kolejne modyfikacje związane były także ze zmianami nazw. I tak pojawiły się Arduino Extreme, Arduino NG (Nuova Generazione – nowa generacja) z procesorem ATmega168, Arduino Diecimila (fotografia 4), gdzie dodano bezpiecznik polimerowy w obwodzie zasilania. W roku 2009 pojawiło się Arduino Duemilanove (fotografia 5), gdzie unowocześniono obwody zasilania, usuwając zworę do przełączania zasilania oraz zastosowano procesor ATmega328 z pamięcią programu 32kB.

Fotografia 4

Fotografia 5

W roku 2011 pojawiła się wersja Arduino Uno (ściślej Arduino Uno Punto Zero, czyli Arduino 1.0, bowiem uno to po włosku jeden). Z czasem wprowadzono drobne zmiany, m.in. zastąpienie 50-miliamperowego stabilizatora 3,3V wbudowanego w kostkę FTDI bardziej wydajnym stabilizatorem LP2895 oraz dodanie kilku styków. Dziś Uno w wersji R3 (rewizji 3) to podstawowy, referencyjny moduł Arduino, mający „standardowe” rozmiary i układ wyprowadzeń. Płytka ma 20 uniwersalnych wyprowadzeń wejścia/wyjścia (I/O).

Fotografia 6

Pojawiło się też wiele innych modułów głównych, m.in. miniaturowe Arduino Nano (fotografia 6) z procesorem ATmega328. Koniecznie należy wspomnieć o Arduino Mega (fotografia 7) ze znacznie silniejszym procesorem (najpierw ATmega1280, potem ATmega2560) i zdecydowanie większą liczbą peryferii, portów i końcówek (54 piny I/O).

Fotografia 7

Dostępne są też nowsze moduły, np. Arduino Leonardo, Micro i Mini, gdzie jedynym procesorem jest ATmega32U4, wyposażony w sprzętową obsługę łącza USB. Powstały moduły z różnymi innymi, także zdecydowanie silniejszymi procesorami. Trzeba jednak pamiętać, że w dziedzinie „dużo silniejszych” procesorów równolegle innym popularnym standardem stał się miniaturowy komputer Raspberry Pi. Hobbyści zamiast sięgać po potężniejsze wersje „arduinopodobne”, bardzo często wykorzystują współpracę prostszych modułów Arduino z Raspberry Pi.

Oprócz takich „kanonicznych” płytek dostępne są moduły o innych kształtach, jak Arduino Robot i Esplora, a także oryginalna seria LilyPad (fotografia 8) do elektroniki noszonej (wearable), tekstylnej, gdzie moduły są wszywane w ubranie. Na stronie

https://www.arduino.cc/en/Main/Products

https://www.arduino.cc/en/Products/Compare

można poznać oficjalną ofertę modułów Arduino.

Fotografia 8

Warto też wiedzieć, że oprócz płytek „kanonicznych”, dostępne są też płytki w pełni lub częściowo kompatybilne z Arduino – przykład na fotografii 9 to płytka Atmega328PB Xplained produkcji Atmela.

Fotografia 9

Oprócz kompatybilnych z Arduino modułów głównych, na rynek wypuszczono mnóstwo modułów rozszerzających – płytek pomocniczych. Część z nich ma rozmiary takie jak podstawowa płytka Arduino, szereg „standardowych” złączy stykowych i niejako przykrywa, osłania płytkę główną. Stąd nazwa shield (tarcza, osłona, przykrywka) i zwyczaj nazywania w naszym języku takich rozszerzeń szyldami. Umożliwiają one budowę „piętrowych kanapek” jak na fotografii 10. Oprócz modułów – szyldów o rozmiarach standardowej płytki Arduino, w ofertach handlowych można znaleźć mnóstwo innych mniejszych płytek, też nazywanych modułami Arduino.

Fotografia 10

Warto wiedzieć, że elementy platformy Arduino mają status open source: mogą być bez licencji i opłat produkowane i sprzedawane przez każdego chętnego, a dokumentacja jest dostępna bez ograniczeń. W efekcie na rynku są dostępne moduły Arduino różnej produkcji. Przede wszystkim dostępne są oryginalne moduły produkowane przez firmy związane z twórcami Arduino. Wśród nich wystąpiły nieporozumienia i przez pewien czas funkcjonowały dwie konkurencyjne strony internetowe (arduino.org oraz arduino.cc) i oprócz Arduino pojawiła się marka Genuino. Niedawno nieporozumienia zostały zażegnane i główną stroną jest arduino.cc.

Oryginalne płytki Uno R3 kosztują tam netto 20 euro, a w naszym kraju zazwyczaj nieco poniżej 100zł. Oprócz tych płytek oryginalnych oferowane są też płytki bardziej i mniej znanych producentów, reklamowane jako w pełni kompatybilne z oryginałami. Dostępne są także zdecydowanie tańsze wersje bez oznaczenia Arduino (fot. 1), których ceny detaliczne w Chinach (Aliexpress) zaczynają się poniżej 3 dolarów.

Trzeba pamiętać, że cały system Arduino został opracowany nie z myślą o elektronikach, tylko wprost przeciwnie – o osobach, które z elektroniką nie mają nic wspólnego (o artystach, dizajnerach i hobbystach). Dlatego zdecydowano się na liczne uproszczenia i rozwiązania, które dla elektronika wcale nie są optymalne. Niemniej dużą zaletą jest dostępność i niska cena rozmaitych modułów, które można wykorzystać nie tylko w systemie Arduino.

Wielu, a może większość użytkowników Arduino traktuje główny moduł jako „czarną skrzynkę”, nie zastanawiając się, co jest w środku. My jak najbardziej jesteśmy zainteresowani, co jest w środku, bo jesteśmy elektronikami i sporo już wiemy o mikroprocesorach. Jest to potrzebne tym bardziej, jeśli wykorzystanie Arduino traktujemy nie jako cel, tylko jako początek i wprowadzenie do przygody z programowaniem. Musimy dobrze rozumieć działanie sprzętu, jeżeli chcemy w pełni i świadomie wykorzystać jego możliwości.

Nasz kurs będzie oparty na najpopularniejszym module Arduino Uno R3. Fotografia 11  pokazuje wersję oryginalną. Już pierwszy rzut oka wskazuje, że sercem jest procesor ATmega328P, „dość duży”, bo mający 32kB pamięci programu Flash, 2kB pamięci RAM i 1kB EEPROM.

Fotografia 11

Zdziwienie może budzić obecność na płytce drugiego procesora ATmega16U2 w małej obudowie SMD – jego głównym, a właściwie jedynym zadaniem jest współpraca z gniazdem USB. Obecność uniwersalnego, dość silnego procesora ATmega16U2 zamiast specjalizowanego konwertera ma szereg zalet i daje nowe możliwości, co jednak w pełni jest wykorzystywane bardzo rzadko. We wcześniejszych wersjach zamiast drugiego procesora montowany był popularny specjalizowany układ FTDI (FT232), który pośredniczył między popularnym łączem szeregowym RS232 (serial port) a łączem USB. Nadal dostępne są też chińskie płytki Uno z konwerterem USB-RS232 typu CH340.

Warto poznać budowę Arduino Uno R3. Elektronik byłby skłonny posługiwać się numerami i nazwami pinów portów z katalogu procesora ATmega328P (według rysunku 12), jednak jak mówiliśmy, system Arduino jest swego rodzaju zasłoną, parawanem, który ma ukryć trudniejsze szczegóły. Dlatego dla uproszczenia kolejne piny portów mają na płytce po prostu numery (zaczynające się od zera).

Rysunek 12

Rysunek 13  pokazuje schemat elektryczny, a rysunek 14 – projekt oryginalnej płytki Arduino. Główny procesor (ATmega328P w dużej obudowie przewlekanej) oznaczony jest ZU4. Żółtym i czerwonym kolorem oznaczone są piny i złącza dostępne dla użytkownika.

Rysunek 13

Rysunek 14

Arduino Uno ma czternaście (0…13) tzw.  pinów cyfrowych oraz sześć (A0…A5) tak zwanych pinów analogowych. Wszystkie 20 wyprowadzeń (które domyślnie bez konfiguracji są cyfrowymi wejściami bez podciągnięcia) możemy albo pozostawić jako wejścia z możliwością podciągnięcia, albo ustawić jako cyfrowe wyjścia. Wyprowadzenia A0…A5 mogą być wejściami multipleksera współpracującego z 10-bitowym przetwornikiem A/D. Końcówki Arduino o numerach 3, 5, 6, 9, 10, 11 oznaczone  znakiem tyldy (~) i mogą pracować jako wyjścia przebiegu PWM o regulowanym „ośmiobitowym” wypełnieniu (0…255) i częstotliwości około 490Hz (na pinach 5, 6 około 980Hz).

Trzeba pamiętać, że cyfrowe końcówki 0, 1 Arduino są też dołączone przez rezystory 1k do procesora pomocniczego, bowiem są wykorzystywane do programowania, a także do późniejszej komunikacji przez łącze szeregowe (serial, COM, RS232) i kabel USB. Końcówki 10…13 oraz sześcioszpilkowe złącze ICSP mogą być wykorzystane do współpracy z układami z szybkim interfejsem SPI, stąd oznaczenia SS, MOSI, MISO, SCK. Z kolei piny A4, A5 są połączone z końcówkami SDA, SCL i wykorzystywane do sterowania układów z łączem TWI, czyli I2C. Wszystkie trzy łącza wykorzystują sprzętowe rozwiązania zawarte w mikroprocesorze, co pozwala zmniejszyć rozmiary programu.

Główny procesor ma dość rozbudowane obwody resetu, w tym przycisk, co dla zwykłego użytkownika ma niewielkie znaczenie.

Oba procesory taktowane są częstotliwością 16MHz. Na płytce widać rezonator kwarcowy 16MHz, ale okazuje się, że taktuje on wyłącznie pomocniczy procesor 16U2! Natomiast procesor główny ‚328 taktowany jest przebiegiem stabilizowanym nie przez rezonator kwarcowy, tylko ceramiczny (oznaczony XTAL), a więc o gorszej stabilności, co jednak w zdecydowanej większości zastosowań nie ma znaczenia. Polecenia delayMicroseconds(), micros() oraz bardzo popularne delay() i millis() wykorzystują rezonator ceramiczny oraz wewnętrzne dzielniki, przez co czasy odmierzane przez Arduino nie są dokładne. Nie tylko z uwagi na rezonator ceramiczny, ale i dzielniki przez 8 i przez 256 preskalera i timera0 w procesorze. Dlatego odmierzana przez Arduino „milisekunda” w rzeczywistości trwa 1,024 milisekundy (co odpowiada częstotliwości około 0,976kHz), a opóźnienia odmierzane w funkcji delay() mogą być jeszcze trochę dłuższe z uwagi na zastosowane niedoskonałe rozwiązania programowe.

Dla większości użytkowników Arduino nie mają znaczenia obwody współpracy z łączem USB, w szczególności obwody procesora U3 (32U4). W związku z obsługą łącza USB, wymagającego napięcia w zakresie 3…3,6V, ten procesor ma rozbudowane obwody zasilania i masy, ale nie trzeba tego analizować. Wystarczy wiedzieć, że ten pomocniczy procesor współpracuje z głównym i że steruje też kontrolkami LED odbierania (RX) i nadawania (TX) danych przez łącze szeregowe. Warto natomiast dokładniej poznać obwody zasilania.

Procesory zasilane są napięciem 5V (na schemacie jest to etykieta +5V). Zielona kontrolka LED oznaczona ON sygnalizuje obecność zasilania w tym obwodzie. Dodatkowo płytka zawiera pomocniczy stabilizator 3,3V (U3, LP2985) o wydajności 150mA, co jest bardzo przydatne do zasilania niektórych dołączonych modułów zewnętrznych. Oba napięcia 5V i 3,3V są wyprowadzone na tak oznaczone punkty/gniazda złącza listwowego POWER. Jeden punkt tego złącza jest tajemniczo oznaczony IOREF. IOREF to napięcie odniesienia (referencyjne) dla pinów I/O. W płytce Uno R3 zasilanej napięciem 5V jest on połączony z obwodem +5V. Istnieją jednak nowsze płytki Arduino, np. Zero czy Duo, które są zasilane napięciem 3,3V i w nich na punkcie IOREF występuje napięcie 3,3V.

Jeżeli Arduino zasilane jest przez złącze zasilania X1 napięciem 7…12V, dodatnie napięcie jest najpierw podawane na diodę D1 (etykieta PWRIN), co chroni w przypadku odwrotnej biegunowości. Dalej napięcie podawane jest na 5-woltowy stabilizator U1 typu NCP1117, a jego wyjście to już główne napięcie zasilające +5V.

Warto zauważyć, że jeden z punktów złącza POWER jest oznaczony VIN. Jest on połączony z wejściem stabilizatora U1. Jak widać, można też podać zewnętrzne zasilanie +6…+12V na punkt VIN, jednak  wtedy omijana jest dioda zabezpieczająca D1.

Arduino Uno może być zasilane z łącza USB. Na rysunku 13 widać, że obwód bieguna dodatniego zaczyna się na nóżce 1 gniazda USB (etykieta XUSB) i dla zabezpieczenia włączony jest tam bezpiecznik polimerowy FUSE1 (500mA). Dalej, jak pokazuje etykieta USBVCC, napięcie podawane jest nie wprost na obwód +5V, tylko na dren tranzystora T1 (MOSFET P typu FDN340P). Jeśli tranzystor ten jest zatkany, napięcie z obwodu głównego +5V nie może się „cofnąć” do złącza USB, co groziłoby komplikacjami, jeśli do gniazda byłoby dołączone jakieś inne urządzenie.

Ale nawet gdy tranzystor T1 jest zatkany, dodatnie napięcie 5V z łącza USB może przejść przez wbudowaną weń pasożytniczą diodę, co jednak wiązałoby się ze spadkiem i stratą napięcia o około 0,7V. Aby zminimalizować te straty, tranzystor T1 (MOSFET P) jest włączany stanem niskim podawanym z wyjścia komparatora U5A (etykieta GATE_CMD). Stan niski występuje tam wtedy, gdy napięcie w punkcie VIN jest mniejsze niż 6,6V (2×3,3V), czyli wtedy, gdy nie ma zasilania zewnętrznego z gniazda X1 lub punktu VIN. Nie ma żadnego problemu, gdy jednocześnie doprowadzone jest zarówno zasilanie zewnętrzne przez X1, jak i napięcie z USB: tranzystor T1 jest wtedy zatkany, napięcie +5V z głównego stabilizatora U1 jest praktycznie równe napięciu łącza USB (5V ±0,25V), więc przez diodę wbudowaną w T1 prąd nie płynie, bo jej napięcie przewodzenia to około 0,7V.

Na płytce przewidziano też punkt AREF, na który można podać z zewnątrz napięcie odniesienia dla przetwornika ADC.

Na koniec sprawa dodatkowej diody LED dołączonej do pinu 13. Nie jest to dołączenie bezpośrednie, bo ograniczałoby użyteczność pinu 13. Do pinu 13 (oznaczonego etykietą SCK) dołączone jest tylko wejście nieodwracające wzmacniacza operacyjnego U5B, pracującego jako wtórnik. Wyjście tego wtórnika steruje omawianą dodatkową diodą LED oznaczoną L. W efekcie takie dołączenie diody LED nie obciąża pinu 13, a jedynie jest on cały czas podciągany do plusa zasilania znikomym prądem wejściowym wzmacniacza operacyjnego. W przypadku ulepszonej wersji LM358, jaką jest bipolarna kostka LMV358 produkcji Texas Instruments, ten prąd podciągający wynosi typowo 0,007uA, maksymalnie 0,25uA (ON Semi produkuje LMV358 w technologii CMOS i wtedy nie ma podciągania, bo prądy wejściowe są wręcz niemierzalnie małe).

Jak widać, w płytce Arduino Uno pod względem elektronicznym nie ma niczego niezwykłego czy tajemniczego – jest to po prostu mikroprocesor ATmega328, tylko „obudowany”, który zyskał ogromną popularność z uwagi na łatwość wykorzystania. Niewątpliwie jest to dobrze przemyślany moduł, znakomity dla początkujących. Ale z drugiej strony, choć zawiera procesor z bardzo energooszczędnej rodziny picoPower, zastosowane rozwiązania i ułatwienia związane z obecnością dodatkowych elementów nie pozwalają zredukować poboru prądu do granic, na jakie pozwala główny procesor ATmega328P. Choćby tylko z uwagi na obecność stale świecącej zielonej kontrolki LED i stabilizatorów.

Na pewno warto zaczynać od takiego modułu, ale po zdobyciu doświadczenia, w praktycznych zastosowaniach należy raczej wykorzystać albo inne odmiany Arduino, albo inne moduły z podobnymi procesorami lub same procesory. W przyszłości będziemy jeszcze wracać do szczegółów budowy procesora i jego możliwości, ale głównie omawiać będziemy kwestie programowania.

Piotr Górecki