Inhaltsverzeichnis:

Arduino serielle Kommunikation - Gunook
Arduino serielle Kommunikation - Gunook

Video: Arduino serielle Kommunikation - Gunook

Video: Arduino serielle Kommunikation - Gunook
Video: How to use Serial Monitor in Arduino 2024, Juli
Anonim
Arduino Serielle Kommunikation
Arduino Serielle Kommunikation

Viele Arduino-Projekte beruhen auf der Übertragung von Daten zwischen mehreren Arduinos.

Egal, ob Sie ein Bastler sind, der ein RC-Auto, ein RC-Flugzeug baut oder eine Wetterstation mit Fernanzeige entwirft, Sie müssen wissen, wie Sie serielle Daten zuverlässig von einem Arduino auf einen anderen übertragen können. Leider ist es für Bastler schwierig, die serielle Datenkommunikation in ihren eigenen Projekten zum Laufen zu bringen. Dies liegt daran, dass serielle Daten als Bytestrom gesendet werden.

Ohne Kontext innerhalb des Bytestroms ist es fast unmöglich, die Daten zu interpretieren. Ohne die Daten interpretieren zu können, können Ihre Arduinos nicht zuverlässig kommunizieren. Der Schlüssel besteht darin, diese Kontextdaten dem Bytestrom hinzuzufügen, indem ein standardmäßiges serielles Paketdesign verwendet wird.

Serielles Paketdesign, Packet Stuffing und Paketparsing sind komplex und schwer zu erreichen. Glücklicherweise gibt es für Arduino-Benutzer Bibliotheken, die all diese komplexe Logik hinter den Kulissen ausführen können, sodass Sie sich darauf konzentrieren können, Ihr Projekt ohne zusätzlichen Aufwand zum Laufen zu bringen. Dieses Instructable verwendet die Bibliothek SerialTransfer.h für die serielle Paketverarbeitung.

Kurz gesagt: In diesem Instructable erfahren Sie, wie Sie mit der Bibliothek SerialTransfer.h problemlos robuste serielle Daten in jedem Projekt implementieren können. Wenn Sie mehr über die Low-Level-Theorie zur robusten seriellen Kommunikation erfahren möchten, lesen Sie dieses Tutorial.

Lieferungen

  • 2 Arduinos

    Es wird dringend empfohlen, Arduinos zu verwenden, die über mehrere Hardware-UARTs verfügen (z. B. Arduino Mega)

  • Anschlusskabel
  • SerialTransfer.h. installieren

    Verfügbar über den Bibliotheksmanager der Arduino IDE

Schritt 1: Physische Verbindungen

Physische Verbindungen
Physische Verbindungen

Bei Verwendung der seriellen Kommunikation müssen einige Verdrahtungspunkte beachtet werden:

  • Stellen Sie sicher, dass alle Erdungen verbunden sind!
  • Der Arduino TX (Transmit) Pin muss mit dem anderen Arduino RX (Receive) Pin verbunden werden

Schritt 2: So verwenden Sie die Bibliothek

So verwenden Sie die Bibliothek
So verwenden Sie die Bibliothek

SerialTransfer.h ermöglicht Ihnen das einfache Senden großer Datenmengen mithilfe eines benutzerdefinierten Paketprotokolls. Nachfolgend finden Sie eine Beschreibung aller Funktionen der Bibliothek – viele davon werden wir später in diesem Tutorial verwenden:

SerialTransfer.txBuff

Dies ist ein Byte-Array, in dem alle seriell zu sendenden Nutzdaten vor der Übertragung gepuffert werden. Sie können diesen Puffer mit Datenbytes füllen, um sie an einen anderen Arduino zu senden.

SerialTransfer.rxBuff

Dies ist ein Byte-Array, in dem alle vom anderen Arduino empfangenen Nutzdaten gepuffert werden.

SerialTransfer.bytesRead

Die Anzahl der Nutzdatenbytes, die vom anderen Arduino empfangen und in SerialTransfer.rxBuff gespeichert wurden

SerialTransfer.begin(Stream &_port)

Initialisiert eine Instanz der Klasse der Bibliothek. Als Parameter können Sie jedes beliebige "Serial"-Klassenobjekt übergeben - sogar "SoftwareSerial"-Klassenobjekte!

SerialTransfer.sendData(const uint16_t &messageLen)

Dadurch sendet Ihr Arduino eine "messageLen" -Anzahl von Bytes im Sendepuffer an den anderen Arduino. Wenn "messageLen" beispielsweise 4 ist, werden die ersten 4 Bytes von SerialTransfer.txBuff seriell an das andere Arduino gesendet.

SerialTransfer.verfügbar()

Dadurch kann Ihr Arduino alle empfangenen seriellen Daten vom anderen Arduino analysieren. Wenn diese Funktion den booleschen Wert "true" zurückgibt, bedeutet dies, dass ein neues Paket erfolgreich geparst wurde und die Daten des neu empfangenen Pakets in SerialTransfer.rxBuff gespeichert/verfügbar sind.

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

Füllt die "len" Anzahl von Bytes eines beliebigen Objekts (byte, int, float, double, struct, etc…) in den Sendepuffer, beginnend mit dem durch das Argument "index" angegebenen Index.

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

Liest "len" Anzahl von Bytes aus dem Empfangspuffer (rxBuff) beginnend mit dem durch das Argument "index" angegebenen Index in ein beliebiges Objekt (byte, int, float, double, struct, etc…).

HINWEIS:

Der einfachste Weg, Daten zu übertragen, besteht darin, zuerst eine Struktur zu definieren, die alle Daten enthält, die Sie senden möchten. Das Arduino auf der Empfangsseite sollte eine identische Struktur haben.

Schritt 3: Basisdaten übertragen

Die folgende Skizze überträgt sowohl den ADC-Wert von analogRead(0) als auch den in Spannung umgewandelten Wert von analogRead(0) an Arduino #2.

Laden Sie die folgende Skizze zu Arduino # 1 hoch:

#include "SerialTransfer.h"

SerialTransfer myTransfer; struct STRUCT { uint16_t adcVal; Schwebespannung; } Daten; Void setup () { Serial.begin (115200); Serial1.begin(115200); myTransfer.begin(Serial1); aufrechtzuerhalten. Void Schleife () { data.adcVal = analogRead (0); Daten. Spannung = (Daten.adcVal * 5,0) / 1023.0; myTransfer.txObj(Daten, Größe(Daten)); myTransfer.sendData(sizeof(data)); Verzögerung (100); }

Schritt 4: Grunddaten erhalten

Der folgende Code druckt die von Arduino # 1 empfangenen ADC- und Spannungswerte.

Laden Sie den folgenden Code in Arduino #2 hoch:

#include "SerialTransfer.h"

SerialTransfer myTransfer; struct STRUCT { uint16_t adcVal; Schwebespannung; } Daten; Void setup () { Serial.begin (115200); Serial1.begin(115200); myTransfer.begin(Serial1); aufrechtzuerhalten. Void Schleife () { if (myTransfer.available ()) { myTransfer.rxObj (Daten, Größe (Daten)); Serial.print (data.adcVal); Serial.print (' '); Serial.println (Daten. Spannung); Serial.println(); aufrechtzuerhalten. Sonst if (myTransfer.status <0) { Serial.print ("FEHLER: "); if(myTransfer.status == -1) Serial.println(F("CRC_ERROR")); sonst if (myTransfer.status == -2) Serial.println (F ("PAYLOAD_ERROR")); sonst if (myTransfer.status == -3) Serial.println (F ("STOP_BYTE_ERROR")); } }

Schritt 5: Testen

Sobald beide Skizzen auf ihre jeweiligen Arduinos hochgeladen wurden, können Sie den Serial Monitor auf Arduino # 2 verwenden, um zu überprüfen, ob Sie Daten von Arduino # 1 erhalten!

Empfohlen: