Komunikacja Arduino

komunikacja arduino

Wstęp – podstawowe pojęcia

Komunikacja w Arduino, a dokładniej zdolność cyfrowej komunikacji Arduino ze światem zewnętrznym, jest jedną z podstawowych zalet tej platformy. Możemy komunikować się z różnego rodzaju modułami, czujnikami, zewnętrznymi układami scalonymi, innymi płytkami Arduino, komputerem, tabletem czy telefonem.

Komunikacja może odbywać się w sposób bezpośredni (podłączamy bezpośrednio z urządzeniem zewnętrznym) lub pośrednio – niezbędne jest podłączenie do Arduino układu lub modułu pośredniczącego (np. moduł RS232, bluetooth).

Nadajnik – urządzenie, które w danej chwili nadaje informacje,
Odbiornik – urządzenie, które w danej chwili odbiera informacje.

Warto podkreślić, iż zazwyczaj Arduino może być nadajnikiem jak i odbiornikiem w tym samym czasie, tzn. jednocześnie odbiera i nadaje informacje.

Protokół komunikacyjny nazywamy pewnego rodzaju język (sposób) przesyłu danych, zrozumiały dla komunikujących się urządzeń.

Połączenie urządzeń komunikujących się (magistrala komunikacyjna) możemy zrealizować na dwa sposoby:

Równoległy:

Do przesłania jednego bajtu wykorzystywane są po 9 pinów nadajnika oraz 9 pinów odbiornika (osiem do przesłania danych, jeden do przesłania sygnału synchronizującego zegara). Zaletą tego podłączenia jest duża szybkość transmisji danych (pojedyncze bity przesyłane są w tym samym czasie). Szybkość transmisji determinuje częstotliwość taktowania zegara (o ile wejścia i wyjścia są w stanie wysyłać i odbierać z tą częstotliwością). Schemat podłączenia równoległego zamieszczono na Rys.1.

Aby zrealizować komunikację równoległą w dwóch kierunkach musielibyśmy użyć po 17 pinów (8 wejść, 8 wyjść, 1 zegar) lub ewentualnie po 10 pinów (8 wejść/wyjść, 1 zegar, 1 pin definiujący kierunek przesyłu danych). Duża ilość pinów wykorzystanych do przesyłu danych jest podstawową wadą tego rozwiązania.

Magistralę równoległą warto stosować, gdy mamy wystarczającą ilość pinów w mikrokontrolerze i potrzebujemy bardzo dużej szybkości transmisji danych.

Rys. 1. Schemat podłączenia 8 bitowej synchronicznej magistrali równoległej.

Szeregowy:

Do przesłania jednego bajtu wykorzystywane są po 2 piny w nadajniku jak i odbiorniku. Pojedyncze bity z przesyłanego bajtu transmitowane są jeden po drugim. Szybkość transmisji determinuje częstotliwość taktowania zegara. Aby zrealizować dwukierunkową transmisję synchroniczną należy zastosować po 3 piny (2 piny do przesyłu/odbioru danych oraz jeden do przesłania sygnału synchronizującego zegara).

Zaletą transmisji danych poprzez magistralę szeregową jest niewielka ilość wykorzystywanych pinów mikrokontrolera. Wadą to bardziej skomplikowany protokół transmisji oraz niewielka szybkość przesyłu danych. Schemat podłączenia szeregowego zamieszczono na Rys.2.

Rys. 2. Schemat podłączenia 8 bitowej synchronicznej magistrali szeregowej.

Komunikacja w Arduino – Transmisja synchroniczna i asynchroniczna

O transmisji synchronicznej mówimy wtedy, gdy między nadajnikiem i odbiornikiem przesyłany jest sygnał synchronizujący zegara (skrót CLK). Sygnał taki przesyłany jest za pomocą osobnego pinu w odbiorniku jak i nadajniku. Odbiornik zatem dokładnie wie, w którym momencie ma spodziewać się kolejnego bitu przesyłanego przez nadajnik.

Transmisja asynchroniczna nie wymaga przesyłania sygnału synchronizującego. Synchronizacja realizowana jest za pomocą nadmiarowych bitów w przesyłanych danych (z tego powodu transmisja asynchroniczna jest wolniejsza od synchronicznej). W tym przypadku, dwukierunkowa transmisja danych może odbywać się za pomocą dwóch linii sygnałowych.

Schematyczne porównanie sposobu przesyłania danych w transmisji synchronicznej oraz asynchronicznej przedstawiono na Rys. 3.


Komunikacja Arduino – port szeregowy USART (UART)

Przykładem magistrali szeregowej z transmisją asynchroniczną jest interfejs UART (skrót od ang. Universal Asynchronous Receiver and Transmitter). Często spotykamy także skrót USART (Universal Synchronous and Asynchronous Receiver and Transmitter) – jest to interfejs zapewniający przesył danych w trybie synchronicznym lub asynchronicznym (czyli rozszerzony UART o transmisję synchroniczną) – Rys.3.

Rys. 3. Porównanie sposobu przesyłania danych w transmisji synchronicznej oraz asynchronicznej.

Mikrokontroler w Arduino posiada wbudowany interfejs USART, lecz w praktyce wykorzystywany jest tylko w trybie asynchronicznym tzn. w trybie UART. Z tego powodu komunikacja w Arduino za pomocą portu szeregowego UART zrealizowana jest za pomocą dwóch pinów nazwanych skrótowo RX (ang. receiver) – odbiornik oraz TX (ang. transmitter) – nadajnik.

Podstawowe Arduino UNO posiada jeden port szeregowy UART, natomiast np. wersja płytki Arduino Mega posiada cztery niezależne porty szeregowe. Mowa tutaj o tzw. sprzętowym porcie szeregowym – obsługę tego portu wykonuje niewidoczna dla nas warstwa sprzętowa mikrokontrolera. Jeśli przykładowo w Arduino UNO jeden port szeregowy to za mało, można zaimplementować tzw. programowy port szeregowy (opis w dalszej części rozdziału).

W Arduino UNO piny odpowiedzialne za komunikację szeregową to pin nr 0 – RX oraz pin nr 1 – TX  (Rys. 4).

Rys. 4. Umiejscowienie portu szeregowego w Arduino UNO – piny nr 0 (RX) oraz 1 (TX).

Odległość komunikacji UART

Mikrokontrolery w Arduino działają przy napięciu stanów logicznych 5V (lub 3,3V) – takie napięcie generuje pin nadajnika TX lub oczekuje pin odbiornika RX. W praktyce znaczy to, że bezpośrednio UART może być wykorzystany na niewielką odległość między dwoma urządzeniami komunikującymi się (rzędu metrów, jednak im bliżej tym lepiej). W bezpośredni sposób możemy podłączyć dwie płytki Arduino  (Rys. 5), shield lub moduł.

Rys. 5. Przykład bezpośredniego połączenia dwóch płytek Arduino UNO za pomocą UART.

Aby komunikować się na większe odległości stosuje się pośrednie układy elektroniczne (moduły pośredniczące), konwertujące sygnał wysyłany/odbierany bezpośrednio z Arduino. Konwersja polega na zmianie sygnału według specyficznych standardów komunikacji przewodowych lub bezprzewodowych (np. RS-232, RS-485, bluetooth, WiFi itd.).


Komunikacja w Arduino – port USB

Jedną z ogromnych zalet Arduino, jest fabryczne wyposażenie płytki Arduino (poza płytkami typu Arduino mini) w układ konwertujący UART na standard USB. Choć zasięg takiego połączenia jest niewielki (zgodnie ze standardem USB), połączenie Arduino z komputerem daje wiele użytecznych możliwości.

Konwersja na standard USB odbywa się najczęściej z wykorzystaniem: mikrokontrolera Atmega8, układu FT232 lub CH340/CH341.

Dla każdego z powyższych połączeń instalujemy oddzielny sterownik na komputerze.

Pobierz paczkę sterowników dla Arduino
                  (dysk lokalny)

Port USB w Arduino ma dwie podstawowe funkcje: umożliwia zaprogramowanie Arduino oraz pozwala użytkownikowi na komunikację naszego programu z komputerem. Niestety komunikacja za pomocą USB w najbardziej popularnym Arduino UNO oraz NANO przebiega z wykorzystaniem tylko jednego dostępnego portu UART (piny 0,1). Jeśli wykorzystamy go do innych celów np. komunikacji z jakimś modułem lub drugą płytką Arduino, mogą pojawić się problemy z wgrywaniem nowego programu do płytki.

Najczęściej wykorzystujemy terminal dla portu szeregowego w komputerze w celu wyświetlania odbieranych lub wysyłania danych. Najprościej użyć wbudowany w oprogramowanie ARDUINO IDE „Monitor portu szeregowego”. Wybierany z menu z zakładki „Narzędzia” (CTRL+SHIFT+M) lub innego programu tego typu np. „Realterm”.


Komunikacja w Arduino – programowy port szeregowy

Jeśli przykładowo w Arduino UNO jeden port szeregowy to za mało, można zaimplementować tzw. programowy port szeregowy.

Programowy port szeregowy to program (lub biblioteka), który odbiera i wysyła dane w zbliżony do UART’a sposób. Z punktu widzenia użytkownika, programowy UART zachowuje się niemal identycznie jak sprzętowy – nie jest jednak tak dobrym rozwiązaniem jak użycie sprzętowego UART. Programowy UART nie jest doskonały, ponieważ zużywa zasoby mikrokontrolera, może działać niepoprawnie z innymi bibliotekami lub zawierać błędy programowe.


Przykładowa biblioteka programowego portu szeregowego:

Link do biblioteki programowego portu szeregowego
>>> AltSoftSerial Library<<<

Biblioteka umożliwia uzyskanie jednego dodatkowego portu szeregowego UART. Wymaga podpięcia RX oraz TX do konkretnie wyszczególnionych pinów (w Arduino UNO są to piny 8 oraz 9).  Biblioteka ogranicza użycie jednego z pinów jako wyjście PWM (dla Arduino Uno jest to pin nr 10). Odbiór i zapis danych odbywa się w tym samym czasie.