Spisu treści:

Komunikacja szeregowa Arduino: 5 kroków
Komunikacja szeregowa Arduino: 5 kroków

Wideo: Komunikacja szeregowa Arduino: 5 kroków

Wideo: Komunikacja szeregowa Arduino: 5 kroków
Wideo: Kurs Arduino odc. 15: Port Szeregowy, Odbieranie Danych 2024, Listopad
Anonim
Komunikacja szeregowa Arduino
Komunikacja szeregowa Arduino

Wiele projektów Arduino polega na przesyłaniu danych między kilkoma Arduino.

Niezależnie od tego, czy jesteś hobbystą, który buduje samochód RC, samolot RC, czy projektuje stację pogodową ze zdalnym wyświetlaczem, musisz wiedzieć, jak niezawodnie przesyłać dane szeregowe z jednego Arduino do drugiego. Niestety, hobbystom trudno jest uruchomić komunikację danych szeregowych we własnych projektach. Dzieje się tak, ponieważ dane szeregowe są przesyłane jako strumień bajtów.

Bez jakiegokolwiek kontekstu w strumieniu bajtów interpretacja danych jest prawie niemożliwa. Bez możliwości interpretacji danych Twoje Arduino nie będą w stanie komunikować się niezawodnie. Kluczem jest dodanie tych danych kontekstowych do strumienia bajtów przy użyciu standardowego projektu pakietu szeregowego.

Szeregowe projektowanie pakietów, wypychanie pakietów i parsowanie pakietów jest złożone i trudne do osiągnięcia. Na szczęście dla użytkowników Arduino dostępne są biblioteki, które mogą wykonywać całą tę złożoną logikę za kulisami, dzięki czemu możesz skupić się na uruchomieniu projektu bez dodatkowego wysiłku. Ten Instruktaż użyje biblioteki SerialTransfer.h do przetwarzania pakietów szeregowych.

W skrócie: ten Instruktaż omówi, w jaki sposób można łatwo zaimplementować solidne dane szeregowe w dowolnym projekcie przy użyciu biblioteki SerialTransfer.h. Jeśli chcesz dowiedzieć się więcej o teorii niskiego poziomu dotyczącej niezawodnej komunikacji szeregowej, zapoznaj się z tym samouczkiem.

Kieszonkowe dzieci

  • 2 Arduino

    Gorąco zachęcamy do korzystania z Arduino, które ma wiele sprzętowych UARTów (np. Arduino Mega)

  • Podłączyć przewód
  • Zainstaluj SerialTransfer.h

    Dostępne za pośrednictwem Menedżera bibliotek Arduino IDE

Krok 1: Połączenia fizyczne

Połączenia fizyczne
Połączenia fizyczne

Korzystając z komunikacji szeregowej, należy pamiętać o kilku punktach okablowania:

  • Upewnij się, że wszystkie uziemienia są podłączone!
  • Pin Arduino TX (Transmit) musi być podłączony do drugiego pinu Arduino RX (Receive)

Krok 2: Jak korzystać z biblioteki

Jak korzystać z biblioteki
Jak korzystać z biblioteki

SerialTransfer.h umożliwia łatwe wysyłanie dużych ilości danych przy użyciu niestandardowego protokołu pakietowego. Poniżej znajduje się opis wszystkich funkcji biblioteki - z wielu z nich skorzystamy w dalszej części tego samouczka:

SerialTransfer.txt

Jest to tablica bajtów, w której wszystkie dane ładunku, które mają być wysłane przez port szeregowy, są buforowane przed transmisją. Możesz wypełnić ten bufor bajtami danych do wysłania do innego Arduino.

SerialTransfer.rxBuff

Jest to tablica bajtów, w której buforowane są wszystkie dane ładunku otrzymane z drugiego Arduino.

SerialTransfer.bytesRead

Liczba bajtów ładunku odebranych przez inne Arduino i przechowywanych w SerialTransfer.rxBuff

SerialTransfer.begin(strumień i_port)

Inicjuje wystąpienie klasy biblioteki. Jako parametr możesz przekazać dowolny obiekt klasy "Serial" - nawet obiekty klasy "SoftwareSerial"!

SerialTransfer.sendData(const uint16_t &messageLen)

To sprawia, że Arduino wysyła "messageLen" liczbę bajtów w buforze transmisji do drugiego Arduino. Na przykład, jeśli „messageLen” wynosi 4, pierwsze 4 bajty SerialTransfer.txBuff zostaną wysłane przez port szeregowy do drugiego Arduino.

SerialTransfer.dostępny()

To sprawia, że Arduino analizuje wszystkie odebrane dane szeregowe z innego Arduino. Jeśli ta funkcja zwraca wartość logiczną „prawda”, oznacza to, że nowy pakiet został pomyślnie przeanalizowany, a dane nowo otrzymanego pakietu są przechowywane/dostępne w SerialTransfer.rxBuff.

SerialTransfer.txObj(const T &val, const uint16_t &len, const uint16_t &index=0)

Wstawia "len" liczbę bajtów dowolnego obiektu (byte, int, float, double, struct, itd.) do bufora transmisji, zaczynając od indeksu określonego przez argument "index".

SerialTransfer.rxObj(const T &val, const uint16_t &len, const uint16_t &index=0)

Odczytuje "len" liczbę bajtów z bufora odbierania (rxBuff) zaczynając od indeksu określonego przez argument "index" do dowolnego obiektu (byte, int, float, double, struct, itp.).

NOTATKA:

Najłatwiejszym sposobem przesyłania danych jest najpierw zdefiniowanie struktury zawierającej wszystkie dane, które chcesz wysłać. Arduino na końcu odbiorczym powinno mieć zdefiniowaną identyczną strukturę.

Krok 3: Prześlij podstawowe dane

Poniższy szkic przesyła zarówno wartość ADC analogRead (0), jak i wartość analogRead (0) przekonwertowaną na napięcie do Arduino #2.

Prześlij następujący szkic do Arduino #1:

#include "SerialTransfer.h"

SerialTransfer myTransfer; struct STRUCT { uint16_t adcVal; napięcie pływaka; } dane; void setup() { Serial.begin(115200); Serial1.początek (115200); myTransfer.begin(Serial1); } void loop() { data.adcVal = analogRead(0); dane.napięcie = (dane.adcVal * 5,0) / 1023,0; myTransfer.txObj(dane, sizeof(dane)); myTransfer.sendData(sizeof(data)); opóźnienie (100); }

Krok 4: Odbierz podstawowe dane

Poniższy kod drukuje wartości ADC i napięcia otrzymane z Arduino #1.

Prześlij następujący kod do Arduino #2:

#include "SerialTransfer.h"

SerialTransfer myTransfer; struct STRUCT { uint16_t adcVal; napięcie pływaka; } dane; void setup() { Serial.begin(115200); Serial1.początek (115200); myTransfer.begin(Serial1); } void loop() { if(mojTransfer.available()) { mojTransfer.rxObj(dane, sizeof(dane)); Serial.print(data.adcVal); Serial.print(' '); Serial.println(dane.napięcie); Serial.println(); } else if(mojTransfer.status < 0) { Serial.print("BŁĄD:"); if(myTransfer.status == -1) Serial.println(F("CRC_ERROR")); else if(myTransfer.status == -2) Serial.println(F("PAYLOAD_ERROR")); else if(myTransfer.status == -3) Serial.println(F("STOP_BYTE_ERROR")); } }

Krok 5: Testowanie

Po przesłaniu obu szkiców do odpowiednich Arduino, możesz użyć monitora szeregowego na Arduino #2, aby sprawdzić, czy otrzymujesz dane z Arduino #1!

Zalecana: