Serial Arduino – Continua lo speciale sulla comunicazione seriale per Arduino. Oggi presentiamo un doppio sketch per invio e ricezione dati.
La scorsa settimana abbiamo affrontato l’argomento della comunicazione seriale dal punto di vista teorico, ed abbiamo appreso in che modo le informazioni vengono trasferite da un sistema all’altro. Oggi, come promesso, inizieremo a lavorare in modo più squisitamente pratico sull’argomento, producendo un paio di listati che trasformeranno due schede Arduino in un sistema ricetrasmittente.
Nello specifico, utilizzeremo una scheda Arduino con un tasto per trasmettere uno stato (HIGH – LOW) attraverso il collegamento seriale, ed un secondo Arduino per ricevere lo stato ed accendere un LED. Vediamo come.
Il sistema trasmittente
Il nostro sistema trasmittente è basato sul classico pulsante in PULL_UP, che abbassa il livello sul PIN digitale al quale è connesso quando viene premuto. Uno dei PIN del pulsante è collegato con il GND in comune con le due schede, mentre l’altro va diretto verso il PIN 2 della scheda trasmittente.
Ecco il codice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/* * Codice basato sul testo Seriale & Arduino, di Paolo Di Leo * https://amzn.to/3B3ziOc * * Altra fonte: https://www.arduino.cc/en/Tutorial/BuiltInExamples/InputPullupSerial * * La pressione ed il rilascio del tasto determina l'invio di un carattere via seriale. * La ricezione del carattere determina accensione e spegnimento del LED. * * Connessioni tra le schede Arduino: * GND -> GND * TX1 -> RX2 * RX1 -> TX2 * * Connessioni del tasto: * primo polo su GND * secondo polo sul PIN D2 della prima scheda * * Viene utilizzato il LED presente sul PIN 13 della scheda Arduino 2. * */ int P1; // Il valore del pulsante void setup() { // Inizializziamo il pulsante pinMode(2, INPUT_PULLUP); Serial.begin(9600); } void loop() { // Leggiamo lo stato del pulsante P1 = digitalRead(2); if (!P1) { Serial.write('H'); } else { Serial.write('L'); } delay(100); } |
Il testo si commenta da solo: vengono inizializzati il pulsante e la seriale (necessaria per trasmettere il carattere), quindi nel loop() eseguiamo un ciclo infinito di letture.
A differenza di pinMode(INPUT), non è necessaria alcuna resistenza di pull-down. Un resistore interno da 20K-ohm porta il segnale del PIN a 5V. Questa configurazione fa sì che l’ingresso legga ALTO quando l’interruttore è aperto, e BASSO quando è chiuso su GND.
Il primo Arduino quindi trasmette una serie di caratteri attraverso la porta seriale. Il carattere trasmesso può essere ‘H’ (tasto rilasciato) o ‘L’ (tasto premuto). Ad ogni ciclo viene impostato un delay di 100 millisecondi per evitare di ingolfare la porta di trasmissione
Il sistema ricevente
Passiamo alla seconda scheda.
Il LED built-in sula seconda scheda Arduino è collegato internamente al PIN 13. Vogliamo che rispecchi il segnale inviato dal pulsante attraverso la seriale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* * Codice basato sul testo Seriale & Arduino, di Paolo Di Leo * https://amzn.to/3B3ziOc * * Altra fonte: https://www.arduino.cc/en/Tutorial/BuiltInExamples/InputPullupSerial * * La pressione ed il rilascio del tasto determina l'invio di un carattere via seriale. * La ricezione del carattere determina accensione e spegnimento del LED. * * Connessioni tra le schede Arduino: * GND -> GND * TX1 -> RX2 * RX1 -> TX2 * * Connessioni del tasto: * primo polo su GND * secondo polo sul PIN D2 della prima scheda * * Viene utilizzato il LED presente sul PIN 13 della scheda Arduino 2. * */ byte dato; void setup() { // Inizializziamo il LED built-in pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { // Leggiamo lo stato della seriale if (Serial.available() ) { // Se abbiamo un byte in arrivo sulla seriale... dato = Serial.read(); if (dato == 'H') digitalWrite(13, HIGH); if (dato == 'L') digitalWrite(13, LOW); } delay(100); } |
Rispetto alla classica connessione via seriale, osserviamo il metodo Serial.available(), che restituisce un valore booleano a seconda se ci sia o meno un byte in attesa nel buffer di lettura, e l’utilizzo di Serial.read() e Serial.write() al posto dell’onnipresente Serial.print() che usiamo per monitorare la nostra scheda.
Per il resto, è ordinaria amministrazione: se il carattere ricevuto sulla seriale è ‘H’ viene acceso il LED, se invece è ‘L’ il LED viene spento.
In caso di ricezione di byte spuri o rumore, il LED mantiene lo stato precedente.
Considerazioni finali
Il progetto è terminato, troverete i sorgenti su GitHub. Abbiamo imparato come utilizzare il classico sistema a due fili + terra per trasmettere le informazioni tra un Arduino e l’altro.
Ma quanto lontano possiamo trasmettere in questo modo? E come possiamo fare se i PIN 0 e 1 sono già utilizzati da un altro apparato?
Ne parleremo diffusamente nei prossimi articoli. Nel frattempo, se l’articolo vi è piaciuto continuate a seguirci qui sul Blog e sugli altri social media. Noi ci risentiremo il prossimo venerdì.
Le puntate precedenti:
Join our groups on Telegram…