Gen 232014
 

Nel precedente articolo abbiamo visto le basi per creare una rete RS485 che permetta di connettere multiple schede Arduino fra loro. In quell’occasione abbiamo collegato due schede Arduino insieme che si inviavano in modo autonomo dei semplicissimi caratteri ed una delle schede quando riconosceva il carattere inviato dall’altra accendeva il led sulla porta 13. Non ci siamo inoltrati oltre in quanto l’articolo era già corposo di per se e rischiava di essere troppo dispersivo. Oggi aggiungiamo una terza scheda Arduino e la dotiamo di un pulsante. Lo scopo di oggi è fare in modo che la pressione del pulsante avvii una serie di comunicazioni fra le schede che verranno accertate dal solito lampeggiamento del led sulla porta 13. 

In realtà non ci sono molte modifiche rispetto al precedente articolo. Da un punto di vista hardware aggiungiamo una terza replica del circuito precedentemente visto. Dobbiamo poi ricordarci di collegare le linee A e B e la massa in comune con le altre due. Anche se nel precedente articolo non l’ho fatto per semplicità, vi ricordo che è buona norma mettere per ogni circuito integrato un piccolo condensatore da 100nF fra massa e alimentazione dello stesso, posizionandolo il più vicino possibile all’integrato stesso, in modo da ridurre i disturbi provocati dai chip stessi sulla linea di alimentazione. Come accennavo nella nuova scheda ho aggiunto anche un pulsante per darci la possibilità di controllare con mano la partenza della sequenza di comunicazioni fra le schede.

Nell’esempio odierno ho seguito questa logica. La nuova scheda aggiunta che potremmo chiamare A, attende la pressione del tasto e quando rileva tale pressione invia sul bus RS485 il “numero 4”. Una seconda scheda che possiamo nominare B intercetta il 4 dal bus e quando verifica tale evento fa lampeggiare il led interno. Dopodiché aspetta un secondo per dare il tempo al nostro occhio di visualizzare il procedimento degli eventi ed invia il numero 7 sul bus. A questo punto la terza scheda (C) intercetta il 7, fa lampeggiare il led interno, attende un secondo ed invia il “3” sul bus. A questo punto la scheda A intercetta il numero 3, fa anch’essa lampeggiare il led interno ed il cerchio si chiude. 

L’esempio può sembrare banale ma dimostra come utilizzare tutte le schede sia come master che slave in modo del tutto trasparente senza dover agire sui pin di abilitazione in trasmissione o lettura del Max485. Non vi ripropongo lo schema elettronico che tanto è sovrapponibile a quello del precedente articolo, soffermiamoci piuttosto sul software caricato sulle tre schede:

Scheda A
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
  pinMode(8, INPUT); 
  delay(500);
}

void loop() 
{
  if(digitalRead(8)==HIGH) // attende la pressione del tasto (collegato all'ingresso 8)
  {
   Serial.print("4"); //...ed invia il "4"
   delay(100);   
  } 

  while (Serial.available())
  {
    char inChar = (char)Serial.read(); 
    if(inChar=='3')
    {
     digitalWrite(13, HIGH);  
     delay(50);              
     digitalWrite(13, LOW);   
     
    }
}
  delay(100);
}


Schede B e C
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
  delay(500);
}

void loop() 
{
  while (Serial.available()) // se ci sono dati da interpretare sulla porta seriale......
  {
    char inChar = (char)Serial.read();  // leggo un carattere dal buffer seriale e lo metto nella variabile inChar
    if(inChar=='4') //7 nella C ... se il carattere è questo
    {
     digitalWrite(13, HIGH);   // accende il led
     delay(50);               // aspettas 50 ms
     digitalWrite(13, LOW);    //spegne il led
     delay(1000); // attende un secondo
     Serial.print("7");  //3 nella C // carattere inviato sulla porta seriale
   }
}
  delay(100);  // attende un decimo di secondo fra ogni loop
}

In realtà non abbiamo altro da aggiungere. Questo articolo è stato breve ma non sottovalutatene l’importanza, è infatti lo scheletro di base della comunicazione RS485 multimaster in cui le schede avviano le comunicazioni in parte in modo controllato dall’utente (pressione del tasto), dall’altra in modo autonomo (alla ricezione di un comando ne inviano un’altro). Ovviamente da questo esempio al costruire un vero e proprio protocollo di comunicazione ne passa di acqua sotto i ponti. Ci sono infatti una miriade di cose da tenere in considerazione. Ad esempio è necessario costruire un metodo di indirizzamento delle schede, altrimenti come facciamo a sapere chi ha inviato un messaggio e a chi è indirizzato? Ci vuole un sistema che verifichi l’integrità dei messaggi ed in caso il messaggio risulti alterato se ne permetta la ritrasmissione. Andrà prevista una codifica per i tipi di messaggi che vogliamo inviare, potrebbe essere necessario creare un sistema di conferma di avvenuta ricezione di un messaggio, etc, etc.