Kurs Arduino – Kłopoty z Pro Mini Strong
W tym odcinku zabawimy się w detektywów i odkryjemy, dlaczego nie chciał działać mój rejestrator z kwadratową płytką „strong”, a działał we współpracy z „kanoniczną” płytką Arduino Pro Mini.
Porównanie modułów pokazuje fotografia 1.
W Internecie można znaleźć informacje, że są problemy z podróbkami niektórych konwerterów USB-TTL (gdy firmowy sterownik zainstalowany w systemie Windows wykryje nieoryginalny, podrobiony układ scalony, zgłasza błąd). To na pewno nie był ten przypadek, bo na płytce Arduino konwetera nie ma, a ten wykorzystywany do ćwiczeń z kostką CP2103 kłopotów nie sprawia.
Coś było nie tak ze „strongiem”. Sytuacja była tajemnicza, ponieważ wcześniej sprawdziłem, że można prawidłowo zaprogramować „stronga” za pomocą konwertera USB-TTL, dołączonego do złącza programującego. Nieoczekiwanie to samo złącze nie chce jednak współpracować z modułem OpenLog. Sądząc, że problemem jest to złącze do programowania, dołączyłem OpenLog trzema kabelkami wprost do wyraźnie oznaczonych pinów płytki. Sprawny moduł OpenLog, niewątpliwie prawidłowo zasilany, z wejściem RXI dołączonym do pinu 1 (Digital 1 = D1 = TXO) Arduino Pro Mini Strong nadal nie działał!
Zaczęły się poszukiwania w Internecie informacji na temat kwadratowego modułu Strong. Może ktoś już miał podobny problem i go opisał.
Ale nie w tym przypadku! Niestety, w Internecie znalazłem praktycznie tylko informacje handlowe, jedną sensowną informację od zadowolonego użytkownika, żadnych doniesień o problemach i co gorsza: żadnej dokumentacji. A już na pierwszy rzut oka widać, że mój kwadratowy moduł Strong ma inny schemat i zawiera inne elementy niż kanoniczna wersja Arduino Pro Mini. Wystarczy porównać fotografię 2 z rysunkiem 3.
Na poszukiwania informacji o „strongu” straciłem mnóstwo czasu, ale nie posunęło to sprawy ani o krok. Przypadek, łut szczęścia czy intuicja (a może bezmyślne działanie wbrew rozsądkowi) spowodowały, że w układzie (z rysunku 16 i fotografii 17 z poprzedniego odcinka) przepiąłem zielony kabelek z pinu 1 na pin 0, jak pokazuje fotografia 4.
I zupełnie nieoczekiwanie OpenLog ożył i zaczął prawidłowo pracować: diody LED zaczęły migać dokładnie tak, jak we wcześniejszych wersjach! Układ zaczął rejestrować dane, ale nie było to jeszcze pełne rozwiązanie zagadki!
Zacząłem jeszcze raz szukać w Internecie schematu „stronga”.
I nadal nie znalazłem ani żadnej dokumentacji płytki Strong, ani żadnych wzmianek o problemie z pinami cyfrowymi 0, 1. Zacząłem więc szukać różnych informacji o „kanonicznej” wersji Arduino Pro Mini. „Kwiatki”, które kolejno znajdowałem w trakcie nadmiernie przedłużających się poszukiwań, tylko pogłębiały chaos.
Chaos i bałagan
Niestety, chaos i bałagan są charakterystyczne dla inicjatywy Arduino, a przyczyną jest fakt, że jest to platforma otwarta. Z tego wynika jej ogromna popularność. Do dowolnego wykorzystania mamy mnóstwo bibliotek oraz niezliczone programy-szkice, z czego jesteśmy ogromnie zadowoleni. Także ograniczenia licencyjne dotyczące sprzętu są znikome (dotyczą praktycznie tylko umieszczania oficjalnego logo na płytkach). Z jednej strony taka swoboda jest błogosławieństwem, ale jednocześnie jest to przekleństwo. Dostępnych jest bowiem mnóstwo klonów, które mogą sprawiać kłopoty, choć trzeba przyznać, generalnie pracują tak samo dobrze jak oryginały, firmowane przez inicjatorów.
Ale na rynku są najrozmaitsze płytki. Najprościej mówiąc, oprócz charakterystycznych „prawdziwych oryginałów” Arduino (https://store.arduino.cc/) bardzo dobrą, nieskazitelną opinią cieszą się też wersje Arduino oraz liczne rozszerzenia i moduły pochodzące przede wszystkim z dwóch firm: SparkFun i Adafruit, które nie tylko produkują i sprzedają sprzęt, ale też mają znaczny udział w rozwoju sprzętu i oprogramowania. To są „trzy najpewniejsze źródła”, ale ceny są tam stosunkowo wysokie właśnie ze względu na konieczność pokrycia dodatkowych kosztów.
A teraz płytki „z drugiego końca”: wielu chińskich producentów skopiowało, a z reguły też nieco zmodyfikowało wspomniane oryginały i masowo produkuje liczne klony Arduino, które są dostępne w śmiesznie niskich cenach. Często cały chiński moduł jest tańszy niż sam procesor lub inny kluczowy element na płytce, co też nasuwa pytania, czy takie moduły zawierają oryginalne układy scalone, czy chińskie podróbki?
Nie sposób tego dociec. Ale też nie trzeba dociekać. Ogólnie biorąc, nawet najtańsze chińskie moduły zazwyczaj pracują dobrze, jednak wiele z nich może mieć niektóre właściwości gorsze niż płytki z najlepszych źródeł, w tym gorszą niezawodność. W przypadku różnych czujników czy przetworników, gdzie ważne są parametry analogowe, gorsza może być stabilność, powtarzalność i dokładność. To jeden aspekt.
Drugi aspekt to zmiany konstrukcyjne. Otóż w przypadku płytek Arduino, z uwagi na luźne zasady licencyjne, producent klonów nie jest praktycznie niczym związany, więc schemat i wyprowadzenia mogą odbiegać od oryginałów. Odstępstwa powodują, że na płytce nie ma logo Arduino, płytka nie ma odpowiednika w wyrobach wiodących producentów, ale i tak jest reklamowana jako „Arduino”. I właśnie tak jest też w przypadku „kwadratowego stronga”, którego schemat został znacząco zmodyfikowany. Ale cała sprawa ma też zupełnie inne oblicza.
Pewność i niepewność…
Zacznijmy od tego, że podstawowa płytka, czyli Arduino Uno, niewątpliwie ma piny 0, 1 powiązane z łączem szeregowym.
Rysunek 5 pokazuje fragment schematu Arduino Uno. Pin 0 ewidentnie połączony jest z pinem PD.0 procesora, a pin 1 Arduino – z pinem PD.1 procesora ATmega328P. Z karty katalogowej procesora jednoznacznie wynika, że piny PD.0, PD.1 mogą pełnić funkcję sprzętowego łącza szeregowego. Pin PD.0 zawsze jest wejściem RXD (USART input pin), natomiast pin PD.1 – wyjściem TXD (USART output pin). I to jest pewnik. Pin PD.0 w procesorze w „dużej” obudowie DIP jest dołączony do nóżki 2, natomiast w mniejszych SMD (TQFP i 32MLF) do nóżki 30 – rysunek 6.
Nie ulega więc wątpliwości, że w Arduino Uno pin 0 jest wejściem RXD, które odbiera przychodzące dane transmisji szeregowej. Nie ulega też kwestii, że pin 1 Arduino Uno to wyjście TXD, wysyłające dane na zewnątrz.
A w Arduino Pro Mini?
Odpowiedź wcale nie jest oczywista! Jak pokazuje pochodzący ze „źródłowej” strony (https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf), rysunek 7, na oryginalnym schemacie nie ma oznaczeń pinów 0, 1, tylko są etykiety i oznaczenia TXO, RXI. Drobna różnica oznaczeń (TXD, TXO oraz RXD, RXI) nie ma znaczenia. Pewne i oczywiste jest to, że pin PD0 oznaczony jest RXI, a więc jest wejściem odbierającym dane. Pin PD1 oznaczony TXO niewątpliwie jest wyjściem danych i to on powinien być dołączony do wejścia RXI modułu OpenLog.
A numeracja pinów Arduino?
W małej, „kanonicznej” wersji Arduino Pro Mini numerami oznaczone są piny cyfrowe od 2 do 13. Na schemacie nie ma numerów pinów 11…13, a tylko etykiety MOSI, MISO, SCK – oznaczenia łącza SPI. Nie ma też numerów pinów 0, 1. Rysunek 7 nie pozwala na określenie, czy pin oznaczony TXO to pin numer 0, czy numer 1. Mylący jest fakt, że piny o numerach 2…9, a potem 10…13 i dalej A0…A3 (czyli 14…17) na płytce są ustawione kolejno, co pokazuje fotografia 8.
A przy okazji, na fotografii 8 mamy kolejny przykład niekonsekwencji i dowolności: piny złącza programującego umieszczone na prawej krawędzi płytki w obu wersjach mają odwrotną kolejność!
Kolejność pinów cyfrowych na fotografii 8 i na rysunku 7 mogą sugerować, że pierwszy pin oznaczony TXO ma numer 0, a ten oznaczony RXI – numer 1. Wtedy kolejność by się zgadzała…
Mało tego! W Internecie można znaleźć opinie, które wydają się mocnym argumentem za takim wnioskiem. Otóż niektórzy twierdzą, że w oznaczeniach są także zawarte numery pinów. Twierdzą, że nie chodzi o oznaczenie TXO (te-iks-o), gdzie O to output-wyjście, tylko TX0 (te-iks-zero). Podobnie twierdzą, że drugie to nie RXI (er-iks-i) z I od input-wejście, tylko RX1 (er-iks-jeden).
Argument jest, ale niesłuszny. Przeczy temu choćby wygląd górnej płytki na rysunku 8. Mianowicie w numerach pinów (10, A0) zero jest przekreślone (Ø), natomiast w opisie TXO – nie.
W Internecie można znaleźć mnóstwo materiałów pomocniczych do płytek Arduino, w tym tzw. „pinout” – rysunki pokazujące funkcje i możliwości/opcje poszczególnych pinów. I wśród nich można znaleźć, co prawda nieliczne, ale jednak, materiały wyraźnie pokazujące, że pierwszy pin oznaczony TXO ma numer 0. Przykład na rysunku 9.
Taka numeracja ewidentnie nie zgadzałaby się z Arduino Uno, ale inne płytki Arduino mogą mieć odmienną numerację, więc można byłoby dopuścić taki wniosek. Przecież podczas kompilacji programu uwzględniana jest wersja płytki Arduino i różnice między Uno i Pro Mini mogłyby być uwzględniane.
Ale tak NIE jest! Na stronie https://www.sparkfun.com/products/11114 z ofertą Pro Mini (10 dolarów) można przeczytać: (…) the silk-screening for the TX and RX pins is quite confusing (…) Arduino UNO, for example, labels their pins TX->1 and RX<-0. (…) On this board, however, the pin numbers are missing (…) Instead, the letters I (in) and O (out) appear, which are easy to confuse with pin numbers. RXI is in fact pin 0, and TXO is in fact pin 1. Także zdecydowana większość rysunków „pinout” prawidłowo podaje numerację pinów – przykład na rysunku 10.
Co ciekawe, podobnie zamienione piny cyfrowe 0, 1 mają płytki Arduino Nano, ale tam istotnie w oznaczeniu na płytce zawarty jest numer pinu, mianowicie wejście danych, pin 0 ma oznaczenie RX0 (zero), a wyjście, pin 1 – TX1 (jeden). Przykład na fotografii 11. Uff!
Jak widać, otwarty system Arduino charakteryzuje się, najdelikatniej mówiąc, różnorodnością i brakiem konsekwencji.
I teraz wracamy do kwadratowego modułu Arduino Pro Mini Strong: wszystko wskazuje, że jakiś Chińczyk, mało obeznany z Arduino, zaprojektował „stronga”, trzeba przyznać dość sprytnie, ale nie dopatrzył omawianego właśnie szczegółu i po prostu pomylił, zamienił piny cyfrowe oznaczone 0, 1, natomiast prawidłowo poprowadził połączenia do złącza programującego.
To wyjaśnia, dlaczego cyfrowy pin 0 jest wyjściem. Ale dlaczego „strong” nie chce współpracować z modułem OpenLog dołączonym do złącza programującego, gdzie nie ma podobnego błędu? Odpowiedź jest zaskakująca. Chińczyk-modyfikator znacząco zmienił schemat. Zastosował nieco przestarzały już dziś, a za to tani stabilizator AMS1117 i napięcie z głównego złącza zasilającego 7…16V podawane jest wprost na ten stabilizator. W wielu podobnych rozwiązaniach napięcie to podawane jest na wejście stabilizatora przez diodę Schottky’ego, ale nie tu. Oczywiście wyjście tego stabilizatora daje „systemowe” napięcie zasilające, w tym przypadku równe 5V, które jest dostępne na wszystkich pinach oznaczonych V.
A teraz trzeba zwrócić uwagę, że „pin zasilający” w złączu programującym nie jest oznaczony ani VCC, ani V, tylko 5V. W „kanonicznych” płytkach Arduino Pro Mini ten pin jest dołączony do „systemowego” napięcia VCC. Ale nie na tej płytce!
Tu pin oznaczony 5V dołączony jest do… anody diody Schottky’ego SS34, której katoda połączona jest z obwodem „systemowego” napięcia VCC. Schemat obwodów zasilania „stronga” wygląda tak, jak pokazuje rysunek 12.
Obecność diody Schottky’ego powoduje, że przy programowaniu wszystko jest w porządku, bo napięcie 5V z konwertera USB/TTL przechodzi przez diodę, zmniejszone o mniej niż 0,5V. Ale dioda ta uniemożliwia przepływ prądu w drugą stronę, więc po dołączeniu modułu OpenLog nie jest on zasilany. W moim przypadku na pinie oznaczonym TXD pojawiały się jakieś impulsy z procesora, dlatego przez przypadek zaświecała się jedna z kontrolek LED modułu, co wprowadziło mnie w błąd, sugerując, że moduł jest zasilany.
Tajemnica wyjaśniła się, ale po długich poszukiwaniach. Podstawowym problemem był brak dokumentacji – schematu „stronga”, a drugą przyczyną wątpliwości okazała się ewidentna pomyłka osoby projektującej płytkę co do pinów 0, 1.
Na koniec tej detektywistycznej opowieści jeszcze dwa szczegóły. W artykule konsekwentnie pisałem, że w przypadku łącza szeregowego (serial) zawsze łączymy wyjście z wejściem. Wykorzystywany przeze mnie konwerter USB/TTL ma oznaczenia RXD, TXD. Arduino ma oznaczenia RXI, TXO, więc trzeba połączyć punkty RXD–TXO oraz TXD–RXI. W przypadku OpenLog łączymy TXO–RXI, TXO–RXI.
Jednak podczas wspomnianych szeroko zakrojonych poszukiwań zauważyłem, iż w niektórych źródłach można znaleźć odmienne wskazówki. Mianowicie, że należy połączyć końcówki o jednakowych oznaczeniach. Przykład z jednej z polskich stron:
(…) [należy] połączyć masy USB Mini z Pro Mini (GND z GND), Zasilanie z USB Mini (+5V) do Vcc na Pro Mini, RX z USB Mini do RX1 na Pro Mini, TX z USB Mini do TX0 na Pro Mini (…)
Być może Autor zacytowanego opracowania wykorzystywał jakiś dziwny, nietypowy konwerter, ale zdecydowanie bardziej prawdopodobne jest, że to przypadkowy błąd w opisie (na co wskazują też fotografie na stronie, skąd pochodzi ten tekst).
Tu znowu warto poinformować o wynikach przeszukania Internetu i zwracania uwagi na pokrewne kwestie. Sprawa połączenia konwertera do Arduino Pro Mini, „prostego” czy „krzyżowego”, była poważnie dyskutowana na forach i można tam znaleźć zadziwiające rozważania i argumenty. Wiele z tych dyskusji śmieszy. Niektórzy uczestnicy sięgnęli do starego standardu RS-232, argumentując, że przy łączeniu urządzenia DTE z urządzeniem DCE należy łączyć „na wprost”, czyli TxD–TxD oraz RxD–RxD, bowiem w urządzeniach DCE RxD jest wyjściem, a TxD – wejściem (a tylko w urządzeniach DTE RxD jest wejściem, a TxD – wyjściem).
Nie musisz zagłębiać się w szczegóły standardu 232. Jeśli chodzi o połączenia konwertera z Arduino Pro Mini, opisy bywają różne, ale wszystkie fotografie modeli pokazują, że konwertery USB/TTL, zarówno te z bardziej znanymi FTDI, jak i te z tańszymi kostkami CH340, CP2102 czy PL2303, powinny być dołączane do Arduino Pro Mini (w wersji 5-woltowej) bez żadnego kombinowania czy zamiany, więc łączone są końcówki TXD–RXI oraz RXD–TXO.
W przypadku wersji 3,3-woltowych trzeba dodatkowo uważać, żeby nie podać na układ/system napięcia 5V, a tylko 3,3V. Jeżeli w konwerterze występuje końcówka oznaczona CTS, jest to (zwykle niewykorzystywane) wejście, które jest łączone do masy.
I jeszcze jeden drobiazg. Rozważaliśmy dość poważny problem z pinami łącza szeregowego. Ale można natknać się na podobne problemy dotyczące innych szczegółów. Ja przy przepinaniu połączeń z jednego modułu do drugiego miałem wątpliwość, jak dołączyć moduł RTC. Procesor ATmega328P ma sprzętowe łącze I2C (TWI – Two WIre) „na wejściach analogowych” A4, A5. Ja po prostu nie pamiętałem, który pin Arduino jest SDA (A4), który SCL (A5).
Gdybym zajrzał do znalezionych w Internecie źródeł pokazanych na rysunkach 13 oraz 14, miałbym kolejny kłopot.
Co prawda są to niewątpliwie przykłady zwyczajnej ludzkiej pomyłki (errare humanum est…), jednak wspominam o tym dlatego, że zapewne i Ty wcześniej czy później spotkasz podobne przykłady, przez które stracisz mnóstwo czasu. Dlatego zawsze warto porównywać co najmniej dwa źródła.
Tyle o Arduino Pro Mini. W następnym odcinku (UR017) zajmujemy się tematem RS485 i MODBUS na przykładzie specyficznych czujników wilgotności.
Piotr Górecki