Buon pomeriggio a tutti
Mi sono da poco approciato all'universo di Arduino e mi sono trovato davanti al seguente problema:
Ho due Arduino, uno utilizzato per gestire 4 motori passo-passo e 4 servomotori e un'altro per gestire ben 54 led RGB in multiplexing. Ho fatto due conti e stringendo al massimo non riesco a gestire tutto con un solo Arduino perciò ne utilizzo due.
I due Arduino devono più volte scambiarsi i valori contenuti in alcune variabili perciò devo utilizzare una comunicazione seriale (e non ho la più pallida idea di quale tra RS232, I2C e TTL devo utilizzare) che mi permetta di inviare un valore che automaticamente verrà inserito dall'arduino ricevente nella giusta variabile.
Schematizzando (o almeno ci provo) all avvio di tutto il sistema io inserisco i valori delle mie 54 variabili nell'Arduino A il quale, una volta inseriti tutti e avendo acceso i led RGB opportunamente, invia i valori all'Arduino B che esegue il suo codice. Ad ogni movimento dei motori passo-passo una buona parte delle 54 variabili cambia il proprio valore perciò l'Arduino B deve di volta in volta "aggiornare" il suo amico Arduino A in modo che questi cambi il colore dei led RGB.
Spero di non essere stato tropo caotico
So benissimo che molto probabilmente risolverei tutto con un Arduino Mega ma preferisco imparare almeno le basi della comunicazione seriale tra due Arduino per lo scambio di valori in modo da poterla utilizzare anche per progetti più complessi.
Ringrazio anticipatamente chi avrà voglia di buttare via 15 mins del suo tempo
"Basta" che colleghi in qualche modo gli Arduino e inventi dei messaggi da scambiare (= un protocollo applicativo) per fare tutte le operazioni che ti servono.
Puoi farlo in tutti i modi: seriale (hardware o eventulamente software), SPI, i2c, Ethernet, Wifi, e quant'altro ti venga in mente. Probabilmente la prima è la soluzione più semplice (e anche abbastanza veloce: col supporto hardware puoi arrivare stabilmente a 115200 bps), tieni solo presente che se usi la seriale in questo modo non potrai usarla per la console.
Si molto propabilmente optero per la comunicazione seriale.
Portesti darmi qualche suggerimento/delucidazione sul protocollo applicativo che dovrei creare?
Boh, parti da una cosa semplice tipo inviare gruppi di 4 byte: il primo indica il numero del led (0-53), i successivi 3 i valori rispettivamente R, G e B (0-255 ciascuno). Poi puoi terminare il flusso con 4 byte, tutti a 255, per fare capire che lista è finita.
Ok credo di aver afferrato il concetto! Ti dispiacerebbe crearmi due righe di codice sia dal lato trasmissione che dal lato ricezione come piccolo esempio? Perchè al momento sono abbastanza ignorante in merito. Grazie mille!
Senza conoscere le strutture dati che utilizzi non è mica semplice... Comunque lato trasmettitore ci sarà un ciclo for dentro a cui mandi il tutto:
for (byte i = 0; i < 54; i++) {
Serial.write (i);
Serial.write (rgb[i].r);
Serial.write (rgb[i].g);
Serial.write (rgb[i].b);
}
Lato ricevente avrai una roba simile, usando la stessa struttura dati:
while (Serial.available ()) {
byte b = Serial.read ();
if (b < 54) {
rgb[b].r = Serial.read ();
rgb[b].g = Serial.read ();
rgb[b].b = Serial.read ();
} else if (b == 255) {
// Fine messaggio
break;
}
}
Il codice del ricevitore è un po' da rivedere, ma dovrebbe più o meno farti capire come procedere.
Senza conoscere le strutture dati che utilizzi non è mica semplice... Comunque lato trasmettitore ci sarà un ciclo for dentro a cui mandi il tutto:
for (byte i = 0; i < 54; i++) {
Serial.write (i);
Serial.write (rgb[i].r);
Serial.write (rgb[i].g);
Serial.write (rgb[i].b);
}
Lato ricevente avrai una roba simile, usando la stessa struttura dati:
while (Serial.available ()) {
byte b = Serial.read ();
if (b < 54) {
rgb[b].r = Serial.read ();
rgb[b].g = Serial.read ();
rgb[b].b = Serial.read ();
} else if (b == 255) {
// Fine messaggio
break;
}
}
Il codice del ricevitore è un po' da rivedere per assicurare la disponibilità dei dati che si leggono (il Serial.available() è messo un po a caso :D), ma dovrebbe più o meno farti capire come procedere.
Ok benissimo! Grazie mille