Go Down

Topic: Voiture téléguidé via Xbee (Read 742 times) previous topic - next topic

stribuda

Oubli la mega aide moi sur le code stp =)

Super_Cinci

Je me permets, car je crains qu'à un moment, tu ne tombes sur un os.

Le traitement des données reçues au niveau récepteur est très lourd (fonction atoi() notamment). Il se peut donc que l'émetteur envoie les données plus rapidement que ne peut les recevoir le récepteur, et ainsi, faire déborder le buffer de réception, et donc risque de perdre des données en route, et même décaler la trame d'un octet par exemple...

Je te propose d'oublier les caractères de print et de passer au vrai numérique avec write :

Emetteur :
Code: [Select]

int x, y;

loop{
  x = analogRead(A0);  // lecture x
  y = analogRead(A0);  // 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
}

Récepteur :
Code: [Select]

int x, y;
byte a0, a1, a2, a3, a4, a5;

loop{
  while(!Serial.available()){} // attendre l'arrivée d'une donnée série.
  a0 = Serial.read();  // récupérer la donnée
  sxitch(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
        x = word(a2, a1);            // recomposition de x
        y = word(a4, a3);            // recomposition de y
        // ici le traitement de x et y vers les moteurs
      }
    break;
    case trame2 :    // code de début de trame 2
      // ici le traitement d'une trame différente... config, autres actions...
    break;
    default :  // l'octet de début de trame n'est pas reconnu.
      // ici les choses à faire en cas de mauvaise trame.
    break;
  }
}


Quels avantages?
- sécurité dans la réception : tant que le récepteur ne reçoit pas le bon code de début de trame, il ne fait rien. si la trame est erronée, il n'en tient pas compte.
- rapidité : seulement 6 octets pour deux valeurs 16bits
- large possibilités pour le futur : possibilité d'envoyer des trames différentes (jusqu'à 256 trames) selon ce qu'on veut "dire" au récepteur...
- utilisation de Serial.write() au lieu de Serial.print() : le print() transforme tout ce qu'on envoie en chaine de caractère. le write(octet) envoie l'octet telquel, sans modifier quoi que ce soit : bien plus rapide.

à toi de voir... c'est comme ça que j'implémente toutes mes liaisons séries, et ça n'a jamais planté tant qu'on respecte les délais de traitement du récepteur...

papybricol

J'approuve.
Etape toute cuite! Un grand pas en avant.

"Ce qui se conçoit bien se code clairement"

ça devrait mieux satisfaire Barbudor, notre docteur ès protocole. ;)
...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

stribuda

Merci tout le monde , surtout pour ce code , j'espére que ca va marcher , et que je vais comprendre xD
Je vous informe dans tout les cas j'éspére  ;)

stribuda

Ça marche :)
Maintenant , 2eme étape : transmission et Emission en même temps  :
je m'explique , déjà ece-que c'est possible qu'une xbee envoi et reçoit des données en même temps ?
si oui quel est son code sur arduino ?

Go Up