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.
#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é...
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
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.
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)
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
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
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);
}
}
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'
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 !
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 :
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.
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