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.