Sommario:

Comunicazione seriale Arduino: 5 passaggi
Comunicazione seriale Arduino: 5 passaggi

Video: Comunicazione seriale Arduino: 5 passaggi

Video: Comunicazione seriale Arduino: 5 passaggi
Video: Tutorial Arduino ITA 5: comunicazione seriale, invio e ricezione di dati con il monitor seriale 2024, Luglio
Anonim
Comunicazione seriale Arduino
Comunicazione seriale Arduino

Molti progetti Arduino si basano sulla trasmissione di dati tra diversi Arduino.

Che tu sia un hobbista che sta costruendo un'auto RC, un aeroplano RC o progettando una stazione meteorologica con un display remoto, dovrai sapere come trasferire in modo affidabile i dati seriali da un Arduino a un altro. Sfortunatamente, è difficile per gli hobbisti far funzionare la comunicazione di dati seriali nei propri progetti. Questo perché i dati seriali vengono inviati come un flusso di byte.

Senza alcun tipo di contesto all'interno del flusso di byte, è quasi impossibile interpretare i dati. Senza essere in grado di interpretare i dati, i tuoi Arduino non saranno in grado di comunicare in modo affidabile. La chiave consiste nell'aggiungere questi dati di contesto al flusso di byte utilizzando un progetto di pacchetto seriale standard.

La progettazione di pacchetti seriali, il riempimento dei pacchetti e l'analisi dei pacchetti sono complessi e difficili da ottenere. Fortunatamente per gli utenti Arduino, sono disponibili librerie che possono eseguire tutta questa logica complessa dietro le quinte in modo che tu possa concentrarti sul far funzionare il tuo progetto senza ulteriori problemi. Questo Instructable utilizzerà la libreria SerialTransfer.h per l'elaborazione dei pacchetti seriali.

In breve: questo Instructable spiegherà come implementare facilmente dati seriali robusti in qualsiasi progetto utilizzando la libreria SerialTransfer.h. Se vuoi saperne di più sulla teoria di basso livello sulla comunicazione seriale robusta, guarda questo tutorial.

Forniture

  • 2 Arduino

    Si consiglia vivamente di utilizzare Arduino con più UART hardware (ad esempio Arduino Mega)

  • Cavo di collegamento
  • Installa SerialTransfer.h

    Disponibile tramite Libraries Manager dell'IDE Arduino

Passaggio 1: connessioni fisiche

Connessioni fisiche
Connessioni fisiche

Quando si utilizza la comunicazione seriale, è necessario tenere a mente alcuni punti di cablaggio:

  • Assicurati che tutte le messe a terra siano collegate!
  • Il pin TX (trasmissione) di Arduino deve essere collegato all'altro pin RX (ricezione) di Arduino

Passaggio 2: come utilizzare la libreria

Come usare la libreria
Come usare la libreria

SerialTransfer.h ti consente di inviare facilmente grandi quantità di dati utilizzando un protocollo a pacchetto personalizzato. Di seguito è riportata una descrizione di tutte le funzionalità della libreria, molte delle quali verranno utilizzate più avanti in questo tutorial:

SerialTransfer.txBuff

Questo è un array di byte in cui tutti i dati del payload da inviare su seriale vengono memorizzati nel buffer prima della trasmissione. Puoi riempire questo buffer con byte di dati da inviare a un altro Arduino.

SerialTransfer.rxBuff

Questo è un array di byte in cui tutti i dati del payload ricevuti dall'altro Arduino vengono memorizzati nel buffer.

SerialTransfer.bytesRead

Il numero di byte del payload ricevuti dall'altro Arduino e memorizzati in SerialTransfer.rxBuff

SerialTransfer.begin(Stream &_port)

Inizializza un'istanza della classe della libreria. Puoi passare qualsiasi oggetto di classe "Serial" come parametro, anche oggetti di classe "SoftwareSerial"!

SerialTransfer.sendData(const uint16_t &messageLen)

Questo fa sì che il tuo Arduino invii il numero "messageLen" di byte nel buffer di trasmissione all'altro Arduino. Ad esempio, se "messageLen" è 4, i primi 4 byte di SerialTransfer.txBuff verranno inviati via seriale all'altro Arduino.

Trasferimento seriale.disponibile()

Questo fa sì che il tuo Arduino analizzi tutti i dati seriali ricevuti dall'altro Arduino. Se questa funzione restituisce il booleano "true", significa che un nuovo pacchetto è stato analizzato con successo ei dati del pacchetto appena ricevuto sono archiviati/disponibili in SerialTransfer.rxBuff.

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

Inserisce "len" il numero di byte di un oggetto arbitrario (byte, int, float, double, struct, ecc…) nel buffer di trasmissione a partire dall'indice come specificato dall'argomento "indice".

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

Legge il numero "len" di byte dal buffer di ricezione (rxBuff) a partire dall'indice come specificato dall'argomento "indice" in un oggetto arbitrario (byte, int, float, double, struct, ecc…).

NOTA:

Il modo più semplice per trasmettere i dati è definire prima una struttura che contenga tutti i dati che si desidera inviare. L'Arduino all'estremità ricevente dovrebbe avere una struttura identica definita.

Passaggio 3: trasmissione dei dati di base

Lo sketch seguente trasmette sia il valore ADC di analogRead(0) che il valore di analogRead(0) convertito in tensione ad Arduino #2.

Carica il seguente sketch su Arduino #1:

#include "SerialTransfer.h"

SerialTransfer mioTransfer; struct STRUCT { uint16_t adcVal; tensione di galleggiamento; } dati; void setup() { Serial.begin(115200); Serial1.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)); ritardo(100); }

Passaggio 4: ricezione dei dati di base

Il codice seguente stampa l'ADC e i valori di tensione ricevuti da Arduino #1.

Carica il seguente codice su Arduino #2:

#include "SerialTransfer.h"

SerialTransfer mioTransfer; struct STRUCT { uint16_t adcVal; tensione di galleggiamento; } dati; void setup() { Serial.begin(115200); Serial1.begin(115200); myTransfer.begin(Serial1); } void loop() { if(myTransfer.available()) { myTransfer.rxObj(data, sizeof(data)); Serial.print(data.adcVal); Serial.print(' '); Serial.println(data.voltage); Serial.println(); } else if(myTransfer.status < 0) { Serial.print("ERRORE: "); 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")); } }

Passaggio 5: test

Una volta che entrambi gli sketch sono stati caricati sui rispettivi Arduino, puoi utilizzare il monitor seriale su Arduino #2 per verificare che stai ricevendo dati da Arduino #1!

Consigliato: