Tuto UART 2
Avec le code fais précédemment nous envoyons des données mais on peut difficilement les traités par la suite. Nous allons donc voir comment faire.
Tout d’abord aller dans le programme main.cpp sur la Raspberry :
cd /usr/local/vigiclient/opencv nano aruco/main.cpp
Nous allons créer un union de structure afin de convertir facilement les octets en entier ou tout autres type de variable. Pour cela taper sous les include :
union TESTR{ struct{ uint8_t id; struct{ uint16_t x; uint16_t y; } coord; uint16_t sumbytes; } aruco; uint8_t bytes[7]; } testr;
Image1.png 12,24 Ko
36 téléchargement(s)
L’union permet de faire la conversion entre ici le numéro du tag Aruco et les bytes qui sont ensuite envoyés à l’Arduino. Si vous voulez modifier cette union par la suite il faut faire attention à la valeur dans bytes[7]. Il s’agit du nombre d’octets contenu dans la structure. Lorsque l’on met uint8_t on envoie 1 octet mais si vous mettez uint16_t cela envoi 2 octets. Vous pouvez trouver sur internet le nombre d’octets par type pour faire le compte.
Ensuite nous allons créer une nouvelle fonction afin de remplacer celle qu’utilise vigibot :
Taper :
void writeModemTest(int fd, TESTR &testr) { for(int i = 0; i < sizeof(testr.bytes); i++) serialPutchar(fd, testr.bytes[i]); }
Puis taper en dessous (nous verrons à quoi cela servira plus tard):
int posex; int posey;
Nous allons maintenant revenir dans le for pour pouvoir remplacer l’ancien programme.
Vous pouvez mettre en commentaire tout ce qu’il y a dans le for car nous n’en auront plus besoin (ne supprimer rien car vous pourrez vous en servir pour retrouver les formules).
Au début tapez :
testr.aruco.id=ids[i];
Afin d’obtenir l’id du tag Aruco.
Nous allons maintenant calculer les coordonnées du centre du Tag Aruco :
posex = (corners[0][0].x+corners[0][1].x+corners[0][2].x+corners[0][3].x)/4; testr.aruco.coord.x = posex; posey = (corners[0][0].y+corners[0][1].y+corners[0][2].y+corners[0][3].y)/4; testr.aruco.coord.y= posey;
Nous avons désormais calculé toutes nos valeurs, il faut maintenant les envoyer, il faut d’abord ajouter une variable de test pour savoir si nous avons bien tout envoyer :
int sumbytes=0; for(int j=0; j<sizeof(testr.bytes)-3;j++){ sumbytes=sumbytes+testr.bytes[j]; } testr.aruco.sumbytes=sumbytes;
Maintenant nous pouvons enfin envoyer des données. Pour commencer il faut envoyer un caractère pour débuter l’envoie :
serialPutchar(serial_port, 'a');
Pour envoyer tout ce qu’il y a dans l’union il suffit de faire :
writeModemTest(serial_port, testr);
Nous pouvons maintenant enregistrer le programme et le compiler (ne pas le lancer tout de suite).
Il faut maintenant ouvrir l’IDE Arduino afin de programmer la carte Arduino. Attention ici j’utilise une Arduino due il peut donc y avoir quelque différence car j’utilise le Rx et Tx 3 de l’Arduino donc je dois mettre 3 devant Serial si vous programmez sur une arduino classique il ne faut pas le mettre. Au début du programme il faut copier/coller le même union afin de faire la conversion dans l’autre sens :
Image2.png 4,17 Ko
34 téléchargement(s)
Maintenant dans le loop il suffit de copier ceci :
if (Serial3.available() >= 8) { SerialUSB.print("nouveau tour \n"); int donnee = Serial3.read(); int sumbytes=0; if (donnee=='a'){ for(uint8_t i=0; i<7; i++) { testr.bytes[i] = Serial3.read(); } for(int j=0; j<sizeof(testr.bytes)-3;j++){ sumbytes=sumbytes+testr.bytes[j]; } if (sumbytes==testr.aruco.sumbytes){ SerialUSB.print("Id: "); SerialUSB.println(testr.aruco.id); SerialUSB.print("Coordonnée: "); SerialUSB.print(testr.aruco.coord.x); SerialUSB.print(" "); SerialUSB.println(testr.aruco.coord.y); SerialUSB.print("\n");
Serial.available() doit être supérieur à 8 car on envoie un octet supplémentaire pour démarrer la lecture. Ensuite on test lorsque l’on lit l’octet de démarrage (ici ‘a’). Puis on calcul la somme des octets lu, si ça correspond à celui envoyé alors on peut afficher ce que l’on a lu.
Vous pouvez maintenant lancer le compiler le code sur votre Arduino et le lancer sur votre Raspberry avec :
aruco/bin
Si vous obtenez ceci alors votre programme fonctionne:
Image3.png 3,84 Ko
35 téléchargement(s)