Il dubbio se un collegamento seriale fosse efficace mi è sorto dopo l’acquisto della nuova ESP8266, quella di colore nero, che ho scoperto comunica solo a 115200 rispetto la precedente blu che comunica a 9600. Ricevendo caratteri strain in comunicazione ho iniziato a pensare che Arduino con la libreria SoftwareSerial non gestisse bene tale velocità, o perlomeno non tutti I modelli (I vecchi atmega 168 ad esempio). Per cui ecco un semplice tool in grado di mettere in comunicazione seriale 2 Arduino tra di loro, o in alternative un Arduino e un qualsiasi dispositivo connesso via seriale.
Ricordo che Arduino ha una logica TTL per cui se occorre comunicare direttamente con una porta standard PC RS232 occorre applicare un convertitore TTl-232 tipo MAX232 per adattare le tensioni delle 2 diverse tipologie.
Il programma permette di usare il “serial monitor” IDE di Arduino per comunicare con l’altro dispositivo collegato, ovvero tutto quello che si scrive nel monitor viene inviato via seriale. Pertanto per testare 2 arduino occorrerà attivare 2 IDE diversi, uno per ogni Arduino, settarli correttamente, inviare lo sketch e aprire I 2 serial monitor. Quello che si scrive in uno dovrà comparire nell’altro e viceversa.
Invece collegando Arduino ad un modulo, appunto la ESP8266 ad esempio, tutto quello che si scrive nel serial monitor viene inviato al modulo, e di seguito si vedrà cosa risponde il modulo. Risultato: Arduino può comunicare bene a 115200, ma stranamente la connessione è più pulita se si tiene una velocità leggermente inferior tipo 114200; probabilmente il clock o l’interrupt di Arduino non è gestito perfettamente.
Ecco il semplice Sketch:
/* Programmino per testare le comunicazioni tra 2 dispositivi seriali, quindi anche tra 2 arduino
* tutto quello che viene digitato nella Serial Monitor viene passata al secondo sispositivo
* (secondo serial monitor). Quindi occorre tenere attivi 2 arduini o 2 dispositivi.
* Uso 2 TX e 3 RX quindi i cavi tra 2 arduini vanno incrociati.
* Premendo uil pulsante sul pin 4 viene passata una stringa lunga in modo da testare la velocità e la perdita dati.
* Considerare che ho ampliato il buffer della SoftSerial.h a 256 nelle impostazioni della libreria.
*
* Ho provato AltSoftSerail che è una libreria piu leggera ma limita i pin al 8,9
* Nel loop preferisco gestire funzioni che rendono piu chiaro il loop stesso.
*/
#include <SoftwareSerial.h>
SoftwareSerial nSerial(2, 3); // RX, TX
//#include <AltSoftSerial.h>
//AltSoftSerial nSerial;
void setup() {
nSerial.begin(114200);
Serial.begin(9600);
pinMode(4, INPUT);
}
void loop() {
Comunica(); // questa funzione provvede allo scambio seriale bilaterale
Pulsante(); // se si preme il pulsante invia stringa lunga
}
void Comunica() {
while (Serial.available())
{
//char D = Serial.read();
nSerial.write(Serial.read());
}
while (nSerial.available())
{
//char c = nSerial.read();
Serial.write(nSerial.read());
}
}
void Pulsante() {
if (digitalRead(4)) {
nSerial.println (“Questa è una frase lunga da inviare per testare la comunicazione seriale che avvenga correttamente a questa velocita”);
delay (500); // attendi 1/2 s in modo che il pulsante non risulti sempre attivo e ripeta il msg
}
}