Go Down

Topic: Communication bluetooth avec un module TEL0026. Réception aléatoire de "255". (Read 618 times) previous topic - next topic

simonlefort

Bonjour à tous,

Je travaille actuellement sur un robot mobile ( Photo) avec 4 moteurs CC pour les roues et 3 servomoteurs pour gérer les bras et la tête.

J'ai réalisé une télécommande ( photo ), basée du les modules "Gravity" de chez DFRobot.

Pour communiquer entre la télécommande et le robot, j'utilise deux modules  bluetooth TEL0026. Les deux modules sont bien connectés, je peux échanger des données entre les deux.

Cependant, j'ai des valeurs "parasites" régulièrement. Je reçois les bonnes valeurs puis j'ai des "pic" à 255. Si j'essaye de piloter un servomoteur, il fait des aller-retour... :-/

Ce que j'envoie :
Code: [Select]
a3 a18  a28 a37 a43 a49  a52 a57  a67  a79  a89 (...)
Ce que je reçois :
Code: [Select]
a3 a255 a28 a37 a43 a255 a52 a255 a255 a255 a89 (...)

Je fais un tout petit peu de nettoyage et je poste les codes.

Le code de la télécommande.

Le code du robot.

/!\ Les deux programmes ne sont pas terminés. Il manque encore des boutons sur la télécommande, je n'ai pas encore programmé toutes les actions dans le code du robot, etc.

Voici un extrait du code du robot, à mon avis c'est dans cette partie là qu'il y a un soucis :
Code: (c) [Select]
void loop() {
  if(Serial1.available() > 0){
    incomingByte = Serial1.read();
    delay(10);
   
    if(incomingByte == 10){
      Serial.println();
    }
    else if(isAlpha(incomingByte)){
      switch(incomingByte){
        case 'c':
          Serial.write(incomingByte);
          switchRot_Value = Serial1.read();
          delay(10);
          //debug
          Serial.print(switchRot_Value);
         
          //tete.write(map(switchRot_Value, 0, 255, 0, 180));
          break;

        default:
          Serial.println("fail");
          //
          break;
      }
    }
  }
}

simonlefort

Je me réponds à moi-même.

J'ai changé le "delay(10);" en "delay(20);" après chaque "Serial1.read();" et ça marche BEAUCOUP mieux. Plus de valeurs foireuses pour l'instant.

Cependant, j'aimerais comprendre :
  - Pourquoi doit-on attendre? La fonction Serial1.read() n'attend pas d'avoir fini pour envoyer la valeur dans la variable ? 
  - Pourquoi ça n'est pas décrit dans la documentation ?
  - Quelle est la valeur "optimale" ?
  - Doit-on ajouter des "delay(..);" après les "Serial.write();" et "Serial.print();" ? (Pour l'instant, ça semble marcher sans...)

Si quelqu'un a des explications pour tout ça, ça m'intéresse grandement. :-)

fdufnews

avant de faire un Serial.read() il faut systématiquement faire if Serial.available() sinon tu risque de lire n'importe quoi.
Ne pas perdre de vue que les caractères arrivent lentement par rapport à la vitesse d'exécution du processeur.

Go Up