Go Down

Topic: Programme Voiture (Read 185 times) previous topic - next topic

stribuda

Salut, mon projet consiste a envoyer deux variables x et y ( chacune min=0 et max=1023 : 2 potentiomètre ) à la voiture qui va les recevoir puis les traiter pour avancer , reculer tourner a droite ou a gauche .
J'ai presque terminé le code de la voiture mais mon grand problème maintenant c'est le code de transmission et d' émission : je ne comprend plus mon code qui voici :
1.Code de la manette :
Code: [Select]
void loop() {
  x = analogRead(A0);  // lecture x
  y = analogRead(A1);  // lecture y
  Serial.write(0xAA);  // code de début de trame "xy" (10101010) peut être n'importe que nombre, éviter 0 ou 255, mais reconnu par le récepteur...
  Serial.write(lowByte(x)); // envoi du premier octet LSB de x
  Serial.write(highByte(x)); // envoi du second octet MSB de x
  Serial.write(lowByte(y)); // envoi du troisième octet LSB de y
  Serial.write(highByte(y)); // envoi du quatrième octet MSB de y
  Serial.write(0x55);  // code de fin de trame (01010101)
  delay(100);  // pour laisser le temps au récepteur d'interpréter le code
}

Ici je me demande si il envoi toutes les informations ou non car si j'ai 1023,  en binaire c'est plus que 2 octet donc il va perdre quelque bites non ?
2.Code Voiture :
Code: [Select]
void loop() {
  while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
  a0 = Serial.read();  // récupérer la donnée
  switch(a0){
    case 0xAA :  // code de début de trame "xy"
      while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
      a1 = Serial.read();           // lecture LSB x
      while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
      a2 = Serial.read();           // lecture MSB x
      while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
      a3 = Serial.read();           // lecture LSB y
      while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
      a4 = Serial.read();           // lecture MSB y
      while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
      a5 = Serial.read();           // lecture code de fin de trame
      if (a5 == 0x55) {             // si c'est la fin de trame, validation des données reçues
        x1 = word(a2, a1);            // recomposition de x
        y1 = word(a4, a3);        // recomposition de y

Ici x1 et y1 sont des nombres entiers/décimales non ?

Finalement j'espère que vous me répondrai avec précision :)

Christian_R

word() recompose un mot de 2 octets, donc il y a 256 x 256 = 65536 valeurs possibles, l'entier 1023 ça passe

http://arduino.cc/en/Reference/WordCast
Christian

fdufnews

Coté émission:
  - émission d'une entête 0xAA
  - émission des 2 variables en les découpant en octets
  - émission d'une balise de fin 0x55

Coté réception (le code est incomplet donc on ne peut pas tout expliquer):
  - attente d'un caractère
  - si le caractère est 0xAA
     - attente de 4 octets
     - attente d'un caractère
         - si c'est le terminateur 0x55
           - reconstruction des 2 int
  La partie du code manquant devrait assurer la gestion des erreurs.
    - si on ne reçoit pas le terminateur rejet des octets reçus
    - pour le case si on ne reçoit pas le 0xAA rejeter l'octet reçu et attendre le suivant

Il faut faire attention le code 0xAA peut se trouver dans les données donc il faut considérer la trame dans son ensemble pour juger de sa cohérence.

Go Up