Problema di comunicazione I2C

Scusate innanzitutto il disturbo, ma ho un problema con una comunicazione I2C che mi blocca da un paio di settimane; qui di seguito la spiegazione e un estratto dei software.
Ho un sistema di controllo basato su un Arduino UNO 3 e un paio di Arduino NANO collegati tra di loro con una linea I2C . Considerando le distanze tra i 3 componenti (circa 100cm tra il Master ed i due slave) ho utilizzato dei qwiicBus della Sparkfun e cavo cat.6.
L’Arduino UNO (in funzione di master) trasmette un codice numerico ai due Arduini NANO , quali eseguono delle elaborazioni e rimandano al master due codici in base all’elaborazione eseguita. Qui di seguito un estratto degli sketch relativi:
Istruzioni sul MASTER per trasmettere ai NANO
Trasmissione “Codice” (definito intero) al NANO 1 (indirizzo 72)

Wire.beginTransmission(72);
        Wire.write (Codice);
        Wire.endTransmission(72);
        delay (500);

Trasmissione “Codice” (definito intero) al NANO 2 (indirizzo 81)

Wire.beginTransmission(81);      
        Wire.write (Codice);
        Wire.endTransmission(81);
        delay (5000);

Istruzioni sul MASTER per ricevere dai NANO
Ricezione dal NANO 1 di un byte “knt”

 Wire.requestFrom(72, 2);
        while (Wire.available()) {
         knt = Wire.read();
         }

Ricezione dal NANO 2 di un byte “knt1”

Wire.requestFrom(81,2);
        while (Wire.available()) {
         knt1 = Wire.read();
        }

Istruzioni sui NANO per trasmettere al MASTER
Sul NANO 1 le istruzioni sono:
Nel setup

Wire.onReceive(controllo); //Fnz che riceve il “Codice” dal master e lo passa al LOOP che lo elabora 
Wire.onRequest(confermo);

quindi:

int controllo () {                                       
  while (Wire.available()) {
    Codice = Wire.read();
  }
   return Codice;
}
void confermo() {       // Fnz che scrive su richiesta del master, il codice di controllo knt elaborato nel LOOP;                                        	
  while (Wire.available()) {
    Wire.write(knt);
  }
  Serial.print ("Ho inviato codice di controllo knt: ");
  prt (knt);
  Serial.println();

Sul NANO 2 le istruzioni sono:
Nel setup

Wire.onReceive(ricevo_codice); //Fnz che riceve il codice itinerario e lo passa al LOOP
Wire.onRequest(confermo);

quindi:

int ricevo_codice () {                                       
  while (Wire.available()) {
    Codice = Wire.read();
  }
   return Codice;
}

void confermo() {   //Funzione che scrive su richiesta del master,
                    il codice di controllo knt elaborato nel LOOP;
  while (Wire.available()) {
    Wire.write(knt1);
  }
  Serial.print ("Ho inviato codice di controllo knt1: ");
  prt (knt1);
  Serial.println();
}

Risultati:
Il sistema funzione perfettamente con il NANO 1 dal momento che il MASTER riceve esattamente il “knt” inviato dal NANO (controllo con la stampa bit x bit) sia monitorando il NANO sia monitorando il MASTER, con il NANO 2 il MASTER riceve sempre un codice knt1=11111111, mentre il NANO ha inviato un knt1 diverso e corretto con l’elaborazione del suo LOOP.
Scusate la lunghezza, ma ho cercato di condensarlo al massimo. Grazie in anticipo per il vs aiuto.

Mmmm ... la libreria Wire, per molti dei suoi metodi, ritorna un codice di errore ma io non vedo alcun controllo di tale codice da parte tua ... magari aiuterebbe :roll_eyes:

Guglielmo

Purtroppo non sono molto pratico con questi controlli; dove posso trovare materiale per aggiornamento? Grazie in anticipo

Nel reference della libreria Wire … per ogni singolo metodo è riportato come si usa e se ritorna o meno un codice di errore :slight_smile:

Guglielmo

Problema risolto: era dovuto ad un’impostazione errata sul numero di byte trasmessi. Ho utilizzato i codici di errore come da suggerimento e, finalmente, ho individuato l’errore. Grazie

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.