BTS Mesure BTS Mesure
pH IOTMySQLressources phpjaugegraphesrobotGyro

               

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