liaison série avec 2 xbee et un arduino

Bonjour,

Mon but est de lire la valeur numérique d’un potentiomètre avec un arduino via deux xbee.

  • J’ai deux xbee pro S1 avec le protocole 802.15.4 (avec la même version) et je les ai paramétré de cette manière :
XBee 1
XBee 2
D8
-
-
D7
DOL
DI
D6
DOL
DI
D5
DOL
DI
D4
DOL
DI
D3
-
ADC
D2
-
ADC
D1
-
ADC
D0
-
ADC
CE
End device
Coordinator
NI
drone
télécommande
CH
D
D
ID
84FF
84FF
DH
0
0
DL
BAFE
CEDE
MY
CEDE
BAFE

DOL : Digital Output Low
DI : Digital Input (mais c’est pas le sujet)

J’ai compris que les pins ADC des xbee convertissent des valeurs analogiques en valeurs numériques. Pour cela il faut utiliser la pin 14 qui est VREF et la brancher sur VCC (ce que j’ai fait). L’arduino est en 5V et le potentiomètre aussi : j’utilise des ponts de résistance pour le convertir en 3,23V (j’alimente mon xbee en 3,23V pour une meilleur précision, puisque VREF est relié à VCC). J’alimente l’arduino via la prise jack en 7.5V (et pas par USB)(l’arduino converti tout seul en 5V). Les xbee sont alimenter par une vieille alim de PC reconvertie (qui marche très bien). J’ai compris (et je suis toujours pas sûr) que si un xbee (le xbee1) reçoit une valeur par ADC, l’autre xbee (xbee2) donnera la valeur en ascii via tx et rx. J’ai relié tx et rx (du xbee2 avec un pont de résistance) à rx (pin0) et tx (pin1) respectivement. J’ai réussi (après quelque galère) à connecter les deux xbee via XCTU

Le problème c’est que je ne reçoit rien sur l’arduino (aucune des LED rx ou tx ne clignote) ! C’est la faute des xbee !
J’ai essayé de vous donner le max d’info.

Merci d’avance pour vos réponse ! :slight_smile:

Et votre code est....

Merci de m’avoir répondu !

Désolée j’ai compétemment zappé, le voici :

#include <SoftwareSerial.h>

SoftwareSerial xbee(2,3); // liaison RX TX respectif sur pin 2 et 3
char data;

void setup() {
  xbee.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (xbee.available()) {
    data = xbee.read();
    Serial.println(data);
  }
}

Normalement le problème ne viens pas du code, j’ai testé avec un voltmètre la pin Tx du xbee, rien ne sortait.
Avec ce code je suis censé lire les données venant de la liaison série avec le xbee et ensuite les affichées sur le port série de l’ordi. J’espère que ca va vous aidé…

oui le code devrait aller si les xbee sont bien configurés et connectés à 9600 bauds.

dans cette doc ils disent

The XBee can be configured to automatically send data from digital I/O or ADC’s. It requires the receiving node to be in API Mode and the data parsed for the I/O values. See Chapter 6

faut vérifier votre config

Merci beaucoup !

Ca doit être ça, j'ai oublié de les mettre en mode API. Comme j'ai beaucoup de cours, je vous redis les résultats demain.

Bonjour,

Malheureusement, ce n'est pas ça ! J'ai vérifier ils étaient bien en mod API. Par ailleurs, Ils sont tous les deux à 9600 baud et j'ai réussi à faire des test de débit.

J'ai du louper quelque chose...

PS : J'ai acheté mes xbee en reconditionné.

Sans les avoir sous la main ça va être difficile de vous aider… commencez par vraiment la base et établir la connexion entre les 2

Heu ben normalement je l'ai déjà fait. J'utilise le coordinator pour paramétrer le deuxième xbee via xctu. Donc à partir de la ils sont bien connecter non. Ce que j'essaye de faire normalement c'est tout bête et c'est justement un test pour plus tard :
Envoyer les données d'un potentiomètre. Ma théorie c'est que en donnant une valeur analogique au xbee coordinator, il le convertie en numérique pour l'envoyer au xbee end device. Je peux ensuite récupérer l'info via les pin rx tx de ce xbee avec un arduino. D'ailleurs je suis pas sûr sur ce point : Est-ce que le xbee va me donner les infos par la liaison série ? Et comment savoir si deux xbee sont connecté entre eux sans xctu ? (le mode sleep est désactivé)

Est-ce que c'est ça, établir une connection entre les deux ?

N'hésitez pas a me dire si ce que je vous dit est flou.

Ma théorie c'est que en donnant une valeur analogique au xbee coordinator, il le convertie en numérique pour l'envoyer au xbee end device

ça fait une éternité que je n'ai plus joué avec ces modules mais il me semble que non, la valeur devient visible sous forme de PWM de l'autre côté il me semble (mode "Line Passing" ou "Line Transfer" ou un truc du genre)

Bonjour,

S'il y en a qui passe par là, je n'ai toujours pas trouvé la solution.
Je reformule ma question :

Comment envoyer et recevoir une donné analogique via deux xBee ?

vous avez vérifié ce que je vous ai dit ci dessus ?

il me semble que non, la valeur devient visible sous forme de PWM de l'autre côté il me semble (mode "Line Passing" ou "Line Transfer" ou un truc du genre)

==> si c'est le cas, il faut côté Arduino récepteur détecter le duty cycle PWM

Okéééé ! Je crois que j'ai compris !

Seulement, il n'y a que deux sortie PWM qui sont disponible sur mes xbee je crois. Or, j'ai 4 axes à prendre en compte...
C'est peut-être mieux de faire via la liaison série non ? En lisant les valeurs analogiques avec un arduino et en les envoyant ensuite via la liaison série qui est disponible. Dans ce cas, est-ce que c'est possible d'envoyer ces infos dans une liste ? Est-ce que c'est le meilleur moyen ?

En passant par la liaison série vous pouvez envoyer les données soit en ascii, soit en binaire. Il faut décider d’un petit protocole pour que de l’autre côté vous sachiez décoder
Par exemple en ascii vous pourriez juste émettre les 4 valeurs séparées par des virgules et terminer par un passage à la ligne. Ça se décode facilement

Pour écouter le port série en réception vous pouvez jeter un oeil à mon petit tuto sur le sujet

Après différents tests (voir le code en dessous), voici ce que je reçoit :










erreur

envoyé : 10 - recu :~
erreur
~
envoyé : 10 - recu :
erreur

envoyé : 10 - recu :
erreur

envoyé : 10 - recu :⸮
erreur

envoyé : 10 - recu :
erreur

Moi aussi j’ai rien compris. Les premiers carrés apparaissent quand je n’ai pas encore alimenter les xbee (1 carré par test). Il y a un retour à la ligne qui est apparu de je ne sais où. Rien ne se passe si j’envoie une valeur différente 1. Mais ce qui me donne de l’espoir, c’est que j’ai bien reçu quelque chose ! Est-ce vous penser pouvoir comprendre quelque chose ? Voici le code :

#include <SoftwareSerial.h>
SoftwareSerial xbee_telecomande(2,3); // Rx et Tx
SoftwareSerial xbee_drone(4,5); // Rx et Tx

char donnee = 2; //variable qui me sert pour déclencher un test
char donnee_drone = 4; //donnée recu par le xbee

void setup() {
  xbee_telecomande.begin(9600);
  xbee_drone.begin(9600);
  Serial.begin(9600);

}

void loop() {
  if (Serial.available()) {
    donnee = Serial.read();
  }
  switch (donnee) {
    case 49: //1
      xbee_telecomande.println(10); // je lance le test en envoyant 10
      if (xbee_drone.available()){
        donnee_drone = xbee_drone.read();
        if (donnee_drone != -1){
          Serial.print("envoyé : 10  -  recu :");
          Serial.println(donnee_drone); //j'affiche les données recu par l'autre xbee
        }
        else (donnee_drone = -1);{
          Serial.println("erreur");
        }
      }
      Serial.println(donnee_drone); //j'ai essayé de comprendre le problème
      donnee = 0;
    break;
    Serial.println(donnee);
  }

}

PS : j’ai essayé de suivre votre tuto.

Votre problème vient de la

 else (donnee_drone = -1);{
          Serial.println("erreur");
        }

vous forcez donnee_drone à -1 dans le else et imprimez erreur en permanence.. les {} ne sont pas au bon endroit...

else {
  // donnee_drone = -1; // NE SERT A RIEN PUISQUE DANS LES ELSE ON SAIT QUE ÇA VAUT -1
  Serial.println("erreur");
}

Utiliser 2 instances de software serial même juste en lecture c’est chercher les ennuis surtout si la communication est assez importante... passez sur une méga ou mini mega...

au lieu de faire

 switch (donnee) {
    case 49: //1

préférez directement le codage de la lettre, le code sera plus lisible

 switch (donnee) {
    case '1': // le commentaire devrait expliquer ce que l'on fait quand on reçoit '1'

Ah ok merci !

En faite je voulais mettre une condition après le “else” parce que je ne sais pas pourquoi, mais il m’obligeait à mettre ça “(” après le else. Du coup ben j’ai mis “(donnee_drone = -1);” alors que j’aurai du mettre (parce que l’IDE voulait “(” ) : “(donnee_drone == -1)”. (j’ai mis un point virgule parce que du coup il m’en demandait un, logique.)

Je reçoit une méga a Noël ! :slight_smile: :slight_smile: :slight_smile:

Le “case 49” j’avais vu ça dans un autre code mais merci beaucoup c’est une super idée !

Du coup j’ai refait des test avec ce code :

#include <SoftwareSerial.h>
SoftwareSerial xbee_telecomande(2,3); // Rx et Tx
SoftwareSerial xbee_drone(4,5); // Rx et Tx

char donnee = 2; //variable qui me sert pour déclencher un test
char donnee_drone = 4; //donnée recu par le xbee

void setup() {
  xbee_telecomande.begin(9600);
  xbee_drone.begin(9600);
  Serial.begin(9600);

}

void loop() {
  if (Serial.available()) {
    donnee = Serial.read();
  }
  switch (donnee) {
    case '1': // je lance le test en envoyant 10 sur le 1er xbee
      xbee_telecomande.println(10); 
      if (xbee_drone.available()){
        donnee_drone = xbee_drone.read(); //je devrai le recevoir sur le 2e
        if (donnee_drone != -1){
          Serial.print("envoyé : 10  -  reçu :");
          Serial.println(donnee_drone); //j'affiche les données reçu par l'autre xbee
        }
        else {
          Serial.println("erreur");
        }
      }
      donnee = 0;
    break;
  }

}

Je pense que le 10 que j’envoi, il s’en fou complètement.
Le montage que j’ai fait c’est :

  • des ponts diviseur pour la réception coté xbee pour abaissé la tension à 3.3V
  • une alimentation externe avec une vieille alim de pc pour les xbee
  • et le réception pour l’arduino c’est en 3.3V, peut être que je dois faire en sorte que ca renvoi du 5v ?

Sinon j’ai fait plusieurs tests et en gros à chaque fois que je coupe puis que remet l’alimentation des xbee j’obtiens cette réponse :

erreur
envoyé : 10 - recu :~
envoyé : 10 - recu :
envoyé : 10 - recu :
envoyé : 10 - recu :⸮
envoyé : 10 - recu :
envoyé : 10 - recu :u

Après, plus de réactions.
Je comprends pas, ça “” et ça “⸮” c’est pas de l’ascii si ?

Enfaite vous avez raison, j'ai fait plusieurs tests avec les liaisons série et c'est foireux. Je reçois n'importe quoi.
Je vais tester plus tard avec la méga.

Avec quelque tests sur les pins des xbee je suis presque sûr qu'ils ne sont pas connecté.
Pourtant, Je n'utilise qu'un seul xbee pour les configurer tous les deux (avec la wifi) avec xctu.
J'ai compris qu'il y avait un mode transparent mais je ne sais pas comment le mettre. Est-ce que c'est juste un paramètre ou tout une configuration ?
J'ai changer la destination adress low (DL) de chaque xbee pour la mettre au serial nomber low (SL) de l'autre xbee.
(DL du XBEE1 = SL du XBEE2, et inversement)
Et j'ai mis la destination adress high au serial nomber high pour les deux.
Je ne voit pas ce qu'il ne va pas.

Pourtant, Je n'utilise qu'un seul xbee pour les configurer tous les deux (avec la wifi) avec xctu.

ça veut dire quoi ? que vient faire le WiFi dans cette histoire ?

Et ben je crois que ça fonctionne en 2,4 Gz, donc c'est comme le Wifi.
Ce que je voulais dire c'est que je connecte mon 1er xbee avec des fils, et l'autre avec la communication sans fils grâce au 1er xbee. Comme ca je ^peux configurer les deux en même temps