Komunikacja UART to jeden z najprostszych i najbardziej wszechstronnych sposobów wymiany danych między Arduino a komputerem. Dzięki wbudowanemu interfejsowi szeregowemu możesz debugować programy, wysyłać polecenia lub odbierać wyniki pomiarów w czasie rzeczywistym.
W artykule tym omówimy podstawy UART, konfigurację w Arduino, praktyczne przykłady kodu oraz narzędzia do monitorowania transmisji. Dowiesz się, jak wykorzystać tę technologię w projektach robotycznych i elektronicznych – od symulacji po rzeczywiste połączenia z PC.
Czym jest UART i jak działa?
UART (uniwersalny asynchroniczny odbiornik‑nadajnik) to moduł sprzętowy wbudowany w mikrokontrolery Arduino, umożliwiający komunikację szeregową między urządzeniami. W odróżnieniu od transmisji synchronicznej (z zegarem), UART działa asynchronicznie – bez wspólnego sygnału zegarowego, co upraszcza połączenia.
Kluczowe parametry UART to:
- RX (odbiornik) – pin odbioru danych;
- TX (nadajnik) – pin nadawania danych;
- Szybkość transmisji (baud rate) – szybkość transmisji, np. 9600 bps (bitów na sekundę);
- Format ramki – bit startu (0), 8 bitów danych, bit stopu (1), opcjonalny bit parzystości.
Komunikacja może być simplex (jednokierunkowa), half‑duplex (jedna strona naraz) lub full‑duplex (jednocześnie w obie strony). W Arduino Uno dostępny jest jeden sprzętowy port UART (piny 0 (RX), 1 (TX)), podczas gdy Mega ma cztery niezależne porty UART.
Odległość transmisji UART TTL (5 V lub 3,3 V) jest ograniczona do kilku metrów – idealnie sprawdza się w bezpośrednich połączeniach Arduino z komputerem przez USB lub między płytkami.
Komunikacja Arduino z komputerem przez USB
Port USB w Arduino (oprócz Mini) pełni podwójną rolę: programowania i komunikacji szeregowej. Wbudowany konwerter (np. FT232, CH340, ATmega16U2) przekształca sygnały UART na USB, umożliwiając połączenie z PC bez dodatkowych elementów.
Inicjalizacja UART w kodzie Arduino zaczyna się od funkcji Serial.begin(baud_rate) w setup(). Przykładowy kod weryfikujący połączenie:
void setup() {
Serial.begin(115200); // Inicjalizacja UART z szybkością 115200
Serial.println("Arduino UART jest gotowy!"); // Wysłanie komunikatu
}
void loop() {
// Pusta pętla – dane wysyłane na żądanie
}
Po wgraniu sketcha otwórz Serial Monitor w Arduino IDE (Ctrl+Shift+M lub Narzędzia > Monitor portu szeregowego). Ustaw baud rate 115200 – zobaczysz komunikat „Arduino UART jest gotowy!”.
Wysyłanie i odbieranie danych – funkcje Serial
Arduino oferuje bogaty zestaw funkcji do obsługi UART (wbudowane w rdzeniu Arduino, bez dodatkowych bibliotek). Najczęściej używane funkcje wysyłania to:
Serial.print(wartość)– wysyła dane bez znaku nowej linii;Serial.println(wartość)– wysyła dane i dodaje znak nowej linii (CR+LF);Serial.write(bajt)– wysyła surowy bajt (dane binarne).
Przykład: wysyłanie odczytu z ADC na żądanie (symulacja w Tinkercad z Serial Monitor):
int adc = A0; // Pin analogowy A0
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) { // Sprawdź, czy są dane z PC
char cmd = Serial.read(); // Odczytaj komendę
Serial.print("Dziękuję za: ");
Serial.println(cmd);
Serial.print("To dla Ciebie: ");
int sensorValue = analogRead(adc); // Odczyt ADC (0-1023)
Serial.println(sensorValue); // Wyślij wartość
}
}
Wpisz „A” w Serial Monitor, a Arduino odeśle podziękowanie i bieżącą wartość z sensora.
Odbieranie danych z PC na Arduino
Do odbioru danych użyj tych funkcji:
Serial.available()– zwraca liczbę dostępnych bajtów do odczytu;Serial.read()– odczytuje pojedynczy bajt;Serial.readString()– odczytuje cały tekst do upłynięcia timeoutu;Serial.readBytes(bufor, długość)– odczytuje określoną liczbę bajtów do bufora;Serial.parseInt()/Serial.parseFloat()– parsuje liczby z tekstu.
Przykład dwustronnej komunikacji – PC wysyła polecenie, a Arduino odpowiada pomiarem i statusem wykonania.
Symulacja i narzędzia do testów
Do nauki, diagnostyki i analizy protokołu UART sprawdzą się następujące narzędzia:
- 123D Circuits (Tinkercad) – dodaj Arduino, wklej kod, uruchom i otwórz Serial Monitor ikoną po prawej, idealne do nauki bez hardware’u;
- Arduino IDE Serial Monitor – podstawowe narzędzie, obsługuje zakres 300–115200 baud i szybkie testy;
- RealTerm lub PuTTY – zaawansowane terminale do precyzyjnej kontroli ramek i logowania danych;
- Aplikacje desktopowe (np. C# w Visual Studio) – własne GUI do wysyłania/odbierania danych przez port COM.
Uwaga: przy użyciu pinów 0/1 do komunikacji z modułem (np. GPS), odłącz je przed wgrywaniem skecza – blokują upload.
Programowy Serial (SoftwareSerial) – gdy brakuje portów sprzętowych
W Uno jeden UART to za mało? Użyj biblioteki SoftwareSerial – emuluje UART na wybranych pinach cyfrowych (np. 8 = RX, 9 = TX). Uwaga: zajmuje część zasobów i może ograniczyć PWM na pinie 10.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9); // RX=8, TX=9
void setup() {
Serial.begin(9600); // USB Serial
mySerial.begin(9600); // Programowy Serial
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read()); // Przekazanie danych do USB
}
}
Zastosowania w robotyce i elektronice
Najczęstsze scenariusze użycia UART w praktycznych projektach to:
- debugging – wysyłanie wartości zmiennych, logów i błędów do PC podczas testów robota;
- sterowanie – PC wysyła komendy (np. „START”, „STOP”), a Arduino wykonuje akcje na silnikach/serwach;
- czujniki – przesyłanie odczytów (temperatura, odległość) do wizualizacji lub zapisu na PC;
- moduły – łączenie z ESP8266 (Wi‑Fi) lub HC‑05 (Bluetooth) przez UART dla komunikacji bezprzewodowej;
- sieci Arduino – łańcuch wielu płytek komunikujących się przez UART dla rozproszonego sterowania.
Porównanie sprzętowego i programowego UART
Poniższa tabela ułatwia dobór odpowiedniego rozwiązania do projektu:
| Cecha | Sprzętowy UART (piny 0/1) | SoftwareSerial |
|---|---|---|
| Wydajność | wysoka, sprzętowa | niższa, emulowana |
| Liczba portów | 1 (Uno), 4 (Mega) | praktycznie dowolna liczba |
| Baud rate max | do 115200+ | do 57600 stabilnie |
| Zastosowanie | USB, kluczowe moduły | dodatkowe połączenia pomocnicze |
Potencjalne problemy i rozwiązania
Jeśli transmisja nie działa poprawnie, sprawdź te najczęstsze przyczyny:
- niezgodny baud rate – brak danych lub „śmieci” w terminalu; zsynchronizuj szybkość po obu stronach;
- poziomy napięć – Arduino 5 V, moduły 3,3 V; użyj konwertera logic level lub dzielnika;
- przepełniony bufor – regularnie czyść odbiór przez
Serial.read()i przetwarzaj dane na bieżąco; - brak odpowiedzi – sprawdź okablowanie (krzyżowe RX↔TX), resetuj Arduino po starcie PC i upewnij się, że port COM jest właściwy.
UART to podstawa wielu projektów – od prostego monitorowania po złożone systemy robotyczne. Eksperymentuj w symulatorach, a potem buduj realne obwody.