Inhoudsopgave:

Arduino seriële communicatie: 5 stappen
Arduino seriële communicatie: 5 stappen

Video: Arduino seriële communicatie: 5 stappen

Video: Arduino seriële communicatie: 5 stappen
Video: 🇳🇱 HERHALINGEN MET FOR / WHILE LOOPS - Arduino theorie #5 2024, Juli-
Anonim
Arduino seriële communicatie
Arduino seriële communicatie

Veel Arduino-projecten zijn afhankelijk van het verzenden van gegevens tussen verschillende Arduino's.

Of je nu een hobbyist bent die een RC-auto, een RC-vliegtuig bouwt of een weerstation met een extern display ontwerpt, je moet weten hoe je op betrouwbare wijze seriële gegevens van de ene Arduino naar de andere kunt overbrengen. Helaas is het voor hobbyisten moeilijk om seriële datacommunicatie werkend te krijgen in hun eigen projecten. Dit komt omdat seriële data als een stroom van bytes worden verzonden.

Zonder enige vorm van context binnen de stroom van bytes, is het bijna onmogelijk om de gegevens te interpreteren. Zonder de gegevens te kunnen interpreteren, kunnen uw Arduino's niet betrouwbaar communiceren. De sleutel is om deze contextgegevens aan de bytestroom toe te voegen met behulp van een standaard serieel pakketontwerp.

Serieel pakketontwerp, pakketvulling en pakketparsing zijn complex en moeilijk te realiseren. Gelukkig voor Arduino-gebruikers zijn er bibliotheken beschikbaar die al deze complexe logica achter de schermen kunnen doen, zodat je je kunt concentreren op het laten werken van je project zonder extra kopzorg. Deze Instructable gebruikt de bibliotheek SerialTransfer.h voor seriële pakketverwerking.

Kortom: deze Instructable gaat over hoe u robuuste seriële gegevens eenvoudig in elk project kunt implementeren met behulp van de bibliotheek SerialTransfer.h. Als je meer wilt weten over de low-level theorie over robuuste seriële communicatie, bekijk dan deze tutorial.

Benodigdheden

  • 2 Arduino's

    Het wordt sterk aangemoedigd om Arduino's te gebruiken die meerdere hardware UART's hebben (d.w.z. Arduino Mega)

  • Aansluitdraad
  • Installeer SerialTransfer.h

    Beschikbaar via de bibliothekenmanager van de Arduino IDE

Stap 1: Fysieke verbindingen

Fysieke verbindingen
Fysieke verbindingen

Bij gebruik van seriële communicatie moet u rekening houden met een aantal bedradingspunten:

  • Zorg ervoor dat alle aardingen zijn aangesloten!
  • Arduino TX (zenden) pin moet worden aangesloten op de andere Arduino's RX (ontvangen) pin

Stap 2: Hoe de bibliotheek te gebruiken

Hoe de bibliotheek te gebruiken
Hoe de bibliotheek te gebruiken

Met SerialTransfer.h kunt u eenvoudig grote hoeveelheden gegevens verzenden met behulp van een aangepast pakketprotocol. Hieronder vindt u een beschrijving van alle functies van de bibliotheek - waarvan we er vele later in deze zelfstudie zullen gebruiken:

SerialTransfer.txBuff

Dit is een bytearray waarin alle payloadgegevens die via serieel moeten worden verzonden, worden gebufferd voordat ze worden verzonden. Je kunt deze buffer vullen met bytes aan gegevens om naar een andere Arduino te sturen.

SerialTransfer.rxBuff

Dit is een byte-array waarin alle payload-gegevens die van de andere Arduino worden ontvangen, worden gebufferd.

SerialTransfer.bytesRead

Het aantal payload-bytes dat is ontvangen door de andere Arduino en is opgeslagen in SerialTransfer.rxBuff

SerialTransfer.begin(Stream &_port)

Initialiseert een instantie van de klasse van de bibliotheek. U kunt elk klasseobject "Serial" doorgeven als parameter - zelfs klasseobjecten "SoftwareSerial"!

SerialTransfer.sendData(const uint16_t &messageLen)

Dit zorgt ervoor dat uw Arduino "messageLen" aantal bytes in de verzendbuffer naar de andere Arduino stuurt. Als "messageLen" bijvoorbeeld 4 is, worden de eerste 4 bytes van SerialTransfer.txBuff via serieel naar de andere Arduino verzonden.

SerialTransfer.available()

Dit zorgt ervoor dat uw Arduino alle ontvangen seriële gegevens van de andere Arduino ontleden. Als deze functie de boolean "true" retourneert, betekent dit dat een nieuw pakket met succes is geparseerd en dat de gegevens van het nieuw ontvangen pakket zijn opgeslagen/beschikbaar in SerialTransfer.rxBuff.

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

Vult "len" aantal bytes van een willekeurig object (byte, int, float, double, struct, enz…) in de verzendbuffer vanaf de index zoals gespecificeerd door het argument "index".

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

Leest het "len" aantal bytes uit de ontvangstbuffer (rxBuff) beginnend bij de index zoals gespecificeerd door het argument "index" in een willekeurig object (byte, int, float, double, struct, etc…).

OPMERKING:

De eenvoudigste manier om gegevens te verzenden, is door eerst een structuur te definiëren die alle gegevens bevat die u wilt verzenden. De Arduino aan de ontvangende kant moet een identieke structuur hebben gedefinieerd.

Stap 3: Basisgegevens verzenden

De volgende schets verzendt zowel de ADC-waarde van analogRead(0) als de waarde van analogRead(0) geconverteerd naar spanning naar Arduino #2.

Upload de volgende schets naar Arduino #1:

#include "SerialTransfer.h"

SerialTransfer mijnTransfer; struct STRUCT { uint16_t adcVal; vlotter spanning; } gegevens; void setup() { Serial.begin(115200); Serieel1.begin(115200); myTransfer.begin(Serial1); } void loop () { data.adcVal = analogRead (0); data.voltage = (data.adcVal * 5.0) / 1023,0; myTransfer.txObj(data, sizeof(data)); myTransfer.sendData(sizeof(data)); vertraging (100); }

Stap 4: Ontvang basisgegevens

De volgende code drukt de ADC- en spanningswaarden af die zijn ontvangen van Arduino # 1.

Upload de volgende code naar Arduino #2:

#include "SerialTransfer.h"

SerialTransfer mijnTransfer; struct STRUCT { uint16_t adcVal; vlotter spanning; } gegevens; void setup() { Serial.begin(115200); Serieel1.begin(115200); myTransfer.begin(Serial1); } void loop() {if(myTransfer.available()) { myTransfer.rxObj(data, sizeof(data)); Serial.print(data.adcVal); Serieel.print(' '); Serial.println(data.voltage); Serieel.println(); } else if(myTransfer.status <0) { Serial.print("ERROR: "); 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")); } }

Stap 5: Testen

Zodra beide schetsen zijn geüpload naar hun respectievelijke Arduino's, kunt u de seriële monitor op Arduino #2 gebruiken om te controleren of u gegevens ontvangt van Arduino #1!

Aanbevolen: