Comunicazione seriale
salve tutti sono ancora io!
volevo verificare un dubbio che mi è venuto sulla comunicazione seriale. come ho già scritto in un precedente post sto costruendo un cubo led 8x8x8. per comandare l'accensione diretta dei led uso arduino, mentre per decidere quali led utilizzare uso un programma in c# scritto da me. tramite quest'ultimo io ho la possibilità di creare le animazioni grazie all'interfaccia grafica. in particolare creo frame per frame e li concateno uno dietro all'altro per poi salvarli in un file. in sostanza l'idea era quella di passare un frame per volta ad arduino in modo che lui lo accendesse. io passo quindi una riga per volta (8 byte) di una matrice tridimensionale che rappresenta appunto il mio frame. il codice del ciclo è qualcosa de tipo:
il programma "lato arduino" sarà invece questo:
la mia domanda è: c'è un modo per essere sicuri che ogni volta che il programma in c# scrive quello su arduino legga? voglio dire così come l'ho impostato dovrebbero essere già sincronizzati nella scrittura/lettura due programmi?
volevo verificare un dubbio che mi è venuto sulla comunicazione seriale. come ho già scritto in un precedente post sto costruendo un cubo led 8x8x8. per comandare l'accensione diretta dei led uso arduino, mentre per decidere quali led utilizzare uso un programma in c# scritto da me. tramite quest'ultimo io ho la possibilità di creare le animazioni grazie all'interfaccia grafica. in particolare creo frame per frame e li concateno uno dietro all'altro per poi salvarli in un file. in sostanza l'idea era quella di passare un frame per volta ad arduino in modo che lui lo accendesse. io passo quindi una riga per volta (8 byte) di una matrice tridimensionale che rappresenta appunto il mio frame. il codice del ciclo è qualcosa de tipo:
code: [select]
for (z = 0; z < 8; z++)
{
for (y = 0; y < 8; y++)
{
for (x = 0; x < 8; x++)
{
//scrivi un byte
}
}
}
di seguito io gli faccio aspettare un tempo che è il prodotto del tempo che arduino ci mette ad accendere per una volta tutti piani (considerando che accendo un solo piano per volta) e il numero di volte che deve ripetere tale accensione in modo da far si che si possa vedere anche ad occhio nudo. in particolare il numero di volte dipenderà da un valore che passo precendentemente.il programma "lato arduino" sarà invece questo:
code: [select]
void loop()
{
byte leggi = 0;
while(serial.available())
{
//legge per prima cosa il numero di frame in modo da sapere il numero di cicli che deve fare
if(nframe == 0)
{
nframe = serial.read();
}
//se si tratta degli stati dei led allora li aggiunge alla matrice
else
{
//legge la durata del frame
freq = serial.read();
//legge un byte per volta e lo mette nella matrice di byte
for(int z = 0; z < 8; z++)
{
for(int y = 0; y < 8; y++)
{
for(int x = 0; x < 8; x++)
{
mat[x][y][z] = serial.read();
}
}
}
//freq è il parametro, passato anch'esso da seriale, che stabilisce quanto un frame deve "rimanere" acceso
//così facendo la frequenza di aggiornamento dei frame di un'animazione non sarà costante.
//freq indica quindi il numero di cicli da eseguire
for(int = 0; < freq; i++) accendi(mat);
}
}
}
la mia domanda è: c'è un modo per essere sicuri che ogni volta che il programma in c# scrive quello su arduino legga? voglio dire così come l'ho impostato dovrebbero essere già sincronizzati nella scrittura/lettura due programmi?
--> http://www.billporter.info/2011/05/30/easytransfer-arduino-library/
--> https://github.com/madsci1016/arduino-easytransfer
se vuoi avere una visualizzazione in tempo reale ti conviene passare le varie righe con dei byte iniziali che definiscono la posizione.
cosi leggendoli sai dove collocarli nella matrice.
ti conviene aggiungere anche un carattere di stop.
Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Comunicazione seriale
arduino
Comments
Post a Comment