Bonjour !
je me fais un projet qui me tient a coeur, que beaucoup ont surement déjà fait mais ça m'entraine et c'est plutot amusant.
enfin bref j'ai des ecrans de type 16x02 et 20x04 (nombre de caractere x nombre de ligne) et je fais un programme sur processing qui affiche sur le PC l'equivalent de l'ecran 16x02, et sur lequel on peut "dessiner" dessus. Ensuite, en appuyant sur un bouton, ça envoi le "dessin" sur l'ecran 16x02/20x04.
j'en suis a ... allez.. 98 % ? x)
je pensais que mon code avait des soucis a plusieurs endroits car j'avais des resultats bizarre a l'affichage sur l'ecran, mais en realité, apres avoir regardé les valeurs qu'Arduino récupere de la liaison Série de Processing vers Arduino, j'ai tout de suite compris que le coeur du probleme etait la.
le fonctionnement de mon programme processing est simple :
on "dessine" sur les pixels et cela stocke dans un tableau a 2 dimensions si c'est un 1 ou un 0 pour tel ou tel pixel.
ensuite, quand on veut envoyer le dessin sur lecran, une boucle met toute ces valeurs dans un tableau de string sous la forme :
< 031 016 000 000 031 000 000 001 >
la communication série doit envoyer 32 string de ce genre (chacune de ces string represente un seul caractere de lecran, et chacune des valeur (031 par exemple) represente une "ligne de pixel" d'un caractere.
enfin bref, le calcul de ces valeurs se déroule parfaitement dans Processing, et j'affiche avant l'envoi le tableau entier que voici :
< 000 000 000 000 000 000 000 000 >
< 000 000 000 000 001 002 006 004 >
< 000 000 007 024 016 000 000 000 >
< 000 015 016 000 000 000 000 000 >
< 000 023 000 000 000 000 000 000 >
< 000 031 000 000 000 000 000 000 >
< 007 028 000 000 000 000 000 000 >
< 031 000 000 000 000 000 000 000 >
< 031 000 000 000 000 000 000 000 >
< 031 000 000 000 000 000 000 000 >
< 016 015 000 000 000 000 000 000 >
< 000 028 003 000 000 000 000 000 >
< 000 000 024 007 000 000 000 000 >
< 000 000 000 016 014 001 000 000 >
< 000 000 000 000 000 024 012 006 >
< 000 000 000 000 000 000 000 000 >
< 000 000 000 000 000 000 000 000 >
< 004 004 004 006 002 001 000 000 >
< 000 000 000 000 000 028 007 000 >
< 000 000 000 000 000 000 024 007 >
< 000 000 000 000 000 000 000 031 >
< 000 000 000 000 000 000 007 024 >
< 000 000 000 000 000 000 031 000 >
< 000 000 000 000 000 000 030 001 >
< 000 000 000 000 000 000 000 031 >
< 000 000 000 000 000 000 000 031 >
< 000 000 000 000 000 000 000 031 >
< 000 000 000 000 000 000 000 029 >
< 000 000 000 000 000 000 005 024 >
< 000 000 000 000 000 000 031 000 >
< 002 002 006 004 004 024 016 000 >
< 000 000 000 000 000 000 000 000 >
le code d'envoi Processing vers Arduino de ces valeurs est le suivant :
for(int g=0;g<caractere*ligne;g++) // caractere*ligne = 32 (pour 32 caracteres a envoyer)
{
//println(theStg[g]); // code donnant l'affichage precedant
port.write(theStg[g]);
}
avec cette ligne dans le setup :
port = new Serial(this, "COM5", 9600);
------------ Partie Arduino :
dans Arduino, la réception est gérée comme cela :
String chaine[32];
void loop()
{
if (Serial.available()) // si des données sont en attente
{
while (Serial.available()) //tant que des données sont en attente
{
for(int i=0;i<nbcar*ligne;i++) // recupere caractere par caractere l'affichage
{
for(int j=0;j<35;j++) // parcours toute la chaine du "<" j'usqu'au ">" de fin du caractere en cours
{
char c = Serial.read(); // l’Arduino lit le caractère
chaine[i] += String(c); // et l’ajoute à l’objet reception
delay(10); //petite attente (ces 3 lignes sont sugérées par Openclassroom)
}
}
}
}
je "televerse" le programme arduino avec l'arduino et l'ecran branché sur le port COM5, puis j'execute le code Processing, je fais mon petit dessin, et j'envoi le resultat vers l'ecran.
voici ce que ça fait (a gauche, ce qu'envoie Processing, et a droite, ce que recois Arduino)
la première ligne ainsi que la seconde, tout est OK, la structure de la string est identique, les données aussi... et puis viens la troisième string... tout part en sucette, et viens ensuite un ocean de ÿ venus d'on ne sait ou..
le problème est donc la transmission des données via le Serial, mais comment résoudre ça ?
j'ai cherché, et certains conseillent de deplacer le "While(Serial.available())" ou encore de mettre un "While(!Serial.available())" avant, mais ça ne résoud pas le probleme
j'ai essayé d'enlever le "delay(10)", ou de mettre d'autres valeurs dedans, ça change effectivement le resultat, mais pas en mieux..
j'ai essayé de mettre aussi un "delay(10)" du coté de processing, pareil, ça n'ameliore pas.
j'ai essayé de changer la valeur de "bauds", qui est a 9600 de base. ça ne change pas grand chose et ça n'ameliore rien.
j'ai essayé autrement, plutot que d'envoyer plusieurs string dans une boucle, j'ai fait une seule string qui contient toutes les valeurs, ce qui permet donc de faire un seul write depuis Processing et un seul read depuis arduino, en me disant que du coup, si il le passe, ca serait forcement en entier... Le probleme surviens aussi, la string deviens totalement alterée apres environ une dizaine de caracteres...
je suis perdu, c'est le seul probleme que j'ai, tout les reste fonctionne et je suis a 2 doigts de reussir. si vous avez une solution ou un conseil, je suis preneur ! merci à l'avance