Semplicissimo collegamento seriale tra due Arduino o Arduino – modulo

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
}
}

Importare waypoints su Skoda navigatore Amudsen

Dopo ben 3 gg di lettura dei forum e prove varie sono riuscito ad importare i miei POI sul nav Amudsen della Skoda; per il Columbus la procedura dovrebbe essere la stessa. Ho provato varie strade descritte nel web in qua e in la ma con gran sbattimento. L’unico modo funzionante è il seguente:

  • Convertire i POI dal nav precedente che può essere TomTom Garmin o altro, tramite un SW di conversione che si trova freeware in rete, in formato Excel, ne risulta un file .xlv disposto in 3 colonne di cui col1 e col2 sono le coordinate, la col3 è il nome del poi. In questa fase si possono modificare i dati, correggere nomi poi ecc da Excel. Attenzione che se la lista supera i 200 POI il nav Skoda lo tronca e va in errore, in questo caso dividere il file excel in piu parti, magari creando gruppi logici di poi, es. Clienti, hotel, ecc
  • Andare sul sito http://mydestination.skoda-auto.com/POIs che è dedicato Skoda, tramite l’opzione in basso di Import aggiungere tutti i file excel. Attenzione che l’importazione avverte che può prendere anche files di vari formati tipo .ASP .GPX ecc ma li ho provati tutti e non vanno, l’unico che va è il formato .XLS. Una volta finito salvare in formato proprietario Skoda, crea un file ZIP.
  • Copiate il file ZIP su SD memory card. NO USB, non funziona! Scompattare lo .zip ma mantere anche il file zippato. Dalla cartella scompattata copiare la sottocartella Personal POI e il file metainfo nella root della SD card (es E:\) e volendo si può cancellare il resto della cartella scompattata, io l’ho cmq lasciata che non fa male.
  • Accendere l’autoradio in modo NAV e andare in setup e premere versione. A questo punto dovrebbe cercare se è presente un aggiornamento software (in realtà i POI) e confermare di aggiornare.
  • Verificare la presenza dei personal poi anche a SD disinserita.

Un doppio semaforo con Arduino

Per i miei bimbi ho voluto realizzare un vero semaforo, come quelli che si trovano per strada, quindi 4 torrette con i tre colori rosso, giallo e verde, pilotate in parallelo due a due. Lo sketch al momento ha dei tempi impostati per il cambio di stato, in futuro penso di aggiungere un potenziometro collegato ad un ingresso analogico per variare a posteriori il tempo di persistenza del rosso. Essendo uno dei miei primi progetti ho usato l’istruzione goto e le labels, andrebbero evitate. Probabilmente oggi scriverei un programma strutturato meglio e piu corto, ma ho altri progetti, per cui questo funziona, i bimbi sono felici e lo lascio così :-)

Il pulsante cambia la modalità diurna (semaforo attivo) in notturna (semaforo lampeggiante).

Ecco lo sketch molto semplice, nessuna libreria richiesta; progettato con UNO poi attivato nel progetto finale con Iduino micro che è grande come una moneta, alimentato da pila 9V:

bool swap = 0; // se 1 lampeggia il giallo, se 0 va il semaforo, commuta su button premuto

void setup() {
// PINS: 2 pulsante – 3 verde – 4 giallo – 5 rosso – 8 verde2 – 9 giallo2 – 10 rosso2
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}

void loop() {
inizio:
delay (500);
while (swap == 0 ) {
digitalWrite(3, HIGH); digitalWrite (8, LOW);
digitalWrite(4, LOW); digitalWrite (9, LOW);
digitalWrite(5, LOW); digitalWrite (10, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
for (int i = 0; i <= 30; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, HIGH); digitalWrite (3, LOW);
digitalWrite(9, LOW); digitalWrite (4, LOW);
digitalWrite(10, LOW); digitalWrite (5, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
for (int i = 0; i <= 30; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (5);
}
}
while (swap == 1 ) {
digitalWrite(3, LOW); digitalWrite (8, LOW);
digitalWrite(4, HIGH); digitalWrite (9, LOW);
digitalWrite(5, LOW); digitalWrite (10, LOW);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 0;
goto inizio;
}
delay (100);
}
digitalWrite(3, LOW); digitalWrite (8, LOW);
digitalWrite(4, LOW); digitalWrite (9, HIGH);
digitalWrite(5, LOW); digitalWrite (10, LOW);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 0;
goto inizio;
}
delay (100);
}
}

}