Structure de la trame pour communiquer avec la télécommande
Tx : Arduino vers Télécommande

void debug() { // La structure de la trame est importante à respecter pour pouvoir utiliser l'application App Inventor
if (!vitesse) { // A l'arrêt on ne transmet que Gz: Gz/1000 -> -> A: angle -> -> gz: gz
Serial.print("Gz: ");Serial.print(Gz/1000);
Serial.print("\t\tA: ");Serial.print(angle);
Serial.print("\t\tgz: ");Serial.println(gz);
}
else { // Attention App Inventor compte les tab et repère "A:" et "c:" pour isoler angle et consigne...
Serial.print(nav); //(1)nav->(2)P->(3)I->(4)D->(5)A: ->(6)c: ->(7)G: ->(8)D: (x)position dans la liste...
//Serial.print("\t");Serial.print(micros()-t0); // Pour debug
Serial.print("\tP ");Serial.print(P,0);
Serial.print("\tI ");Serial.print(I,0);
Serial.print("\tD ");Serial.print(D,0);
//Serial.print("\tPr ");Serial.print(precis); // Pour debug
Serial.print("\tA: ");Serial.print(angle); // "A:" 5ème position soit après 4 tab
Serial.print("\tc: ");Serial.print(consigne); // "c:" 6ème position soit après 5 tab
Serial.print("\tG: ");Serial.print(Gauche);
Serial.print("\tD: ");Serial.println(Droite);
}
} // debug()
Rx : Télécommande vers Arduino

void lireSerie () {
if (Serial.available()<=0) return;
vitesse=Serial.parseInt(); // Attention la méthode parse attend un caractère non numérique ou un timeout de 1s pour se terminer
consigne=Serial.parseInt(); // Pour éviter l'attente du timeout de 1s on termine la transmission par ;
if (Serial.available()>1) // Il faudra penser à éliminer ce ; du buffer série par un Serial.read()
{Kp=Serial.parseInt();
if (Kp!=0) Kp0=Kp;}
else {Serial.read();return;} // Ordre court => pas de réponse pour être plus rapide
if (Serial.available()>1) Ki0=Serial.parseFloat();
if (Serial.available()>1) Kd0=Serial.parseFloat()/1000;
Kp=Kp0;Ki=Ki0;Kd=Kd0;
while (Serial.available()) Serial.read();
Serial.println ("Ordre V="+String(vitesse)+"\t C="+String(consigne)+"\t Kp="+String(Kp)+"\t Ki="+String(Ki)+"\t Kd="+String(Kd*1000)+"E-3");
I=0;nav=0;Gz=0;angle=0;
} // lireSerie ()
La télécommande App Inventor
Au final voici la structure de notre programme App Inventor :
Pour aller plus loin
Par moment on souhaite tourner d'un angle différent de 90° ou 2°. Pour cela nous avons mis en oeuvre la procédure angle :
La procédure vitesse
Nous avons souhaité ralentir automatiquement (sans appuyer sur un bouton) lorsque l'angle de tangage dépasse 40° (Cf procédure angle ci-dessus)
Pour ne pas envoyer des consignes de manière trop rapprochée :
- nous avons pris une résolution d'angle de Pitch élevée (10°)
- le changement de vitesse automatique n'est autorisé que
durant les lignes droites
- on envoie la consigne vitesse que si celle-ci a changé
- la consigne est envoyée qu'après réception d'un message par
la procédure lireSerie