Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-23 15:01
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
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
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:
PIC MCU en Python seriële communicatie: 5 stappen
PIC MCU en Python seriële communicatie: Hallo, jongens! In dit project zal ik proberen mijn experimenten op PIC MCU en Python seriële communicatie uit te leggen. Via internet zijn er veel tutorials en video's over hoe te communiceren met PIC MCU via een virtuele terminal, wat erg handig is. maar
Arduino en Python seriële communicatie - toetsenbordweergave - Ajarnpa
Arduino en Python seriële communicatie - Toetsenbordweergave: dit project is gemaakt voor Mac-gebruikers, maar het kan ook worden geïmplementeerd voor Linux en Windows, de enige stap die anders zou moeten zijn, is de installatie
Draadloze seriële communicatie met Bluefruit: 4 stappen
Draadloze seriële communicatie met Bluefruit: Hier is een eenvoudige stapsgewijze handleiding om uw draden te vervangen door een Bluetooth low energy-verbinding: het kostte me een tijdje om dit uit te zoeken omdat er nauwelijks documentatie is om dit te doen met moderne Bluetooth low energy-technologie zoals als de Bluefrui
Webgebaseerde SmartMirror met seriële communicatie: 6 stappen
Webgebaseerde SmartMirror met behulp van seriële communicatie: deze instructable wordt geleverd met alle code klaar voor gebruik. De ontwikkeling was erg ingewikkeld, maar als het eenmaal is ingesteld, is het heel eenvoudig aan te passen. Neem een kijkje en geniet ervan;)
Seriële communicatie met ARM Cortex-M4: 4 stappen
Seriële communicatie met ARM Cortex-M4: dit is een op breadboard gebaseerd project dat ARM Cortex-M4 (Texas Instruments EK-TM4C123GXL) gebruikt voor seriële communicatie met behulp van Virtual Terminal. De uitvoer kan worden verkregen op een 16x2 LCD-scherm en invoer voor seriële communicatie kan worden gegeven in Serial Mo