Bonjour à tous, je dispose de 3 Xbee pro XBP24-AWI (je ne sais plus si ce sont des s1 ou s2...) et je souhaite les faire communiquer de la sorte :
BASE : comme son nom l'indique, c'est la base qui communique avec les différents RECEPTEUR(s) afin d'acquérir une valeur.
RECEPTEUR : Reçoit un ordre de BASE, le transmet à un arduino relié en Rx-Tx. l'arduino traite l'instruction et agît en considération. Suivant l'instruction reçue, il peut aussi être amené à envoyer un message à RECEPTEUR pour envoyer un ordre à EMETTEUR.
EMETTEUR : capte une valeur analogique sur un de ses pins et le transmet à RECEPTEUR qui va le transmettre à la carte arduino auquel il est relié
Et je ne parviens pas à communiquer uniquement de la BASE au RECEPTEUR. Soit le message est envoyé en broadcast soit les autres ne le reçoivent pas...
Bah... pour le moment je n'ai pas grand chose, le code n'est pas complet, ce qu'il y a dans l'arduino n'est qu'a titre de test pour l'instant :
#include <SoftwareSerial.h>
SoftwareSerial emetteur(2,3);
void setup()
{
Serial.begin(9600);
emetteur.begin(19200);
Serial.println("## Xbee Communication ##");
Serial.println();
}
void loop()
{
emetteur.listen(); // On écoute "emetteur"
// Si on écoute "emetteur"
if(emetteur.isListening())
{
// S'il y a des données à lires
if(emetteur.available())
{
String data = getData(&emetteur); // On récupère les données
Serial.print("Message recu : "+data); // Puis on les affiches
}
}
delay(2000);
}
String getData(SoftwareSerial *source)
{
String value = "";
// Tant qu'il y a des données à lire dans le buffer
while(source->available())
{
value += (char)source->read(); // Concaténation des caractère lue dans le buffer "source"
}
return value;
}
Ce mode est très bien pour faire du broadcast ou de la communication entre seulement 2 modules mais il n'est pas du tout adapté pour un système à plusieurs modules.
Je te conseils vivement de t'orienter vers le mode API qui offre de nombreux avantages :
Encapsulation des trames sous forme de paquet
Possibilité de sélectionner précisément l'adresse du module à qui on veut envoyer un paquet
Possibilité de savoir de quel adresse provient un paquet reçu
Gestion des accusés de réception pour savoir si le paquet a bien été transmis
...
Il te faudra reconfigurer tes modules avec XCTU pour utiliser ce mode.
Quand au code sur arduino, il existe une lib pour utiliser les XBee dans ce mode là.
Le problème c'est que je les ai déjà configuré en mode API... c'est là que je ne comprends pas comment les paramétré de sorte pour que je puisse m'adresser à un module particulier.
Avec cette lib, tu auras des fonctions pour envoyer des packets :
// Création des données du packet à envoyer
char payload[] = "HelloWorld";
// Création de l'adresse du récepteur (SH + SL) :
XBeeAddress64 addr = XBeeAddress64(0x0054A30B, 0xA521F6EB);
// Création du paquet à envoyer :
ZBTxRequest packet = ZBTxRequest(addr, payload, sizeof(payload));
// Envoie du paquet :
xbee.send(packet);
Avec ce code, tu vas utiliser le Serial Hardware de l'arduino.
Ce qui signifie que tu ne pourras plus mettre à jour ton code sans débrancher le XBee ni utiliser le Serial pour afficher des messages dans la console.
Autant dire que ce n'est pas très pratique...
Tu ferais mieux d'utiliser un SoftwareSerial pour dialoguer avec le Xbee.
Ce qui nous donne :
#include <XBee.h>
#include <SoftwareSerial.h>
// Affectation des pins
uint8_t softRxPin = 10;
uint8_t softTxPin = 11;
// Gestionnaire du SoftwareSerial pour le XBee
SoftwareSerial SerialXbee(softRxPin, softTxPin);
// Creation du gestionnaire Xbee
XBee xbee = XBee();
void setup() {
// Initialisation du Serial avec le PC
Serial.begin(9600);
// Initialisation de Serial avec le Xbee
SerialXbee.begin(9600);
xbee.setSerial(SerialXbee);
}
void loop() {
// Création des données du packet à envoyer
uint8_t payload[] = "HelloWorld";
// Création de l'adresse du récepteur (SH + SL) :
XBeeAddress64 addr = XBeeAddress64(0x0013A200, 0x404BD71B);
// Création du paquet à envoyer
ZBTxRequest packet = ZBTxRequest(addr, payload, sizeof(payload));
// Envoie du paquet
xbee.send(packet);
delay(2000);
}
Avec ce code, la pin 10 sert de Rx et doit donc être connectée au DOUT du Xbee
Quand à la pin 11, elle sert de Tx et doit donc être connectée au DIN du Xbee
Tu peux changer ces numéros si tu le souhaites mais attention : toutes les pins ne peuvent pas servir de Rx !
Puis, pour tester dans un premier temps que les modules communiques bien entre eux, j'ai réalisé une petite trame de communication Tx-Rx (à adapter pour le destinataire (et le message)) :
Et pour finir, le code arduino (en reprenant ce que m'avez fournis lorrio)
#include <XBee.h>
#include <SoftwareSerial.h>
// Affectation des pins
uint8_t softRxPin = 10;
uint8_t softTxPin = 11;
int curseur = 0; // curseur de déplacement
// Création des adresses des récepteurs
uint16_t addr16[2] = {0x0000, 0x0001};
// Création des données du packet à envoyer
uint8_t payload[2][30] = {"[RECEPTEUR] : bonjour chef !", "[RECEPTEUR] : salut copain"};
// Gestionnaire du SoftwareSerial pour le XBee
SoftwareSerial SerialXbee(softRxPin, softTxPin);
// Creation du gestionnaire Xbee
XBee xbee = XBee();
void setup() {
// Initialisation du Serial avec le PC (Port serie)
Serial.begin(9600);
// Initialisation de Serial avec le Xbee
SerialXbee.begin(9600);
xbee.setSerial(SerialXbee);
}
void loop() {
if(curseur > 1) curseur = 0;
// Création du paquet à envoyer
Tx16Request tx = Tx16Request(addr16[curseur], payload[curseur], sizeof(payload[curseur]));
// Envoie du paquet
xbee.send(tx);
delay(2000); // attente de 2 secondes
curseur++; // incrémentation du curseur
}
Bonjour ! Alors moi j'ai exactement le même problème sauf que je dois coder tout ça en python et je suis un peu perdue.. Pourrais-je avoir un peu d'aide.
Bonsoir MaudeLP. Le projet que je réalise avec ces xbee et une reprise de mon projet de bac. A l'origine j'utilisés un script en python pour la communication raspberry pi <-> xbee.
Voici un script que j'avais fait :
import serial
#Connexion entre 2 Xbee
#Add ,9600 if problems
ser = serial.Serial('/dev/ttyUSB0', 9600)
#Variable for Xbee
#Poste in HEX
#poste = 0x02
#Definition des variables
var = 0 #consigne en lux
var_mli = var * 1023 / 800 #rapport consigne <-> quantum
var_hexa = "{0:0>4X}".format(var_mli) #conversion en Hexa (4 octets)
ser.open()
#Bytes Start
ser.write(b'\x7E')
#Digi part of lengh (always 0)
ser.write(b'\x00')
ser.write(b'\x11')
#Instruction
ser.write(b'\x17')
ser.write(b'\x01')
#ID of dest.
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
ser.write(b'\x00')
#Destinataire
ser.write(b'\x00')
ser.write(b'\x02')
ser.write(b'\x02')
#Commande ASCII : M1 (PWM)
ser.write(b'\x4D')
ser.write(b'\x31')
#Command Data
ser.write(var_hexa[:2].decode("hex")) #On récupère la première valeur hexa (les 2 premiers octets)
ser.write(var_hexa[2:].decode("hex")) #On récupère la première valeur hexa (les 2 derniers octets)
#Checksum Calculator
cons1 = "0x" + var_hexa[:2]
cons2 = "0x" + var_hexa[2:]
sum = 0x17 + 0x01 + 0x02 + 0x02 + 0x4D + 0x31 + int(cons1, 16) + int(cons2, 16)
checksum = 0xFF - (sum & 0xFF)
hexa = hex(checksum)
print(sum)
print(checksum)
#Envoie du checksum
ser.write(str(chr(checksum)))
print(str(chr(checksum)))
#Fin de notre requete
ser.close()
Bon il y a probablement des choses à revoir, mais l'idée est là. A "l'époque", je n'étais pas parvenu à trouver de librairies en python exclusive ZigBee (ou xbee pour les modules de Digit). Je me suis donc servie de la libraire serial pour communiquer sur le les ports de la raspberry.
Si il existe des lib python sur google, je les ai déjà importées. mais je suis un peu nouvelle dans le milieu de la programmation j'essaie de déchiffrer un peu tout ça Merci beaucoup Yoratheon, pour ton script je vais analyser ça de plus près. En vérité, mon problème est peut être un petit peu différent. (je suis en stage dans un labo robotique). Je dois réaliser une triangulation avec trois ou plus xbee. Je dois utiliser les récepteurs qui capteront l'intensité du signal qu'il existe entre eux et la base, et de ça je dois en déduire la distance des récepteurs à la base. Tout ça codé en python. Les gars avec qui je bosse m'ont dit d'utiliser ROS mais mes xbee sont série 2 et par conséquent la lib que j'ai trouvé ne convient pas car elle marche pour les série 1.. ils m'ont aussi parler de rasperry pi mais je n'ai jamais travaillé dessus je vais donc faire quelques tutos pour me familiariser.. Comme vous l'aurez compris je ne suis pas encore au point mais j'ai trois mois pour faire tout ça , mais la moindre aide me serait très utile.
Ehhhh, avant de chercher à comprendre comment utiliser le XBee, je te conseillerais plutôt de chercher à voir si c'est possible de faire ça avec des Xbee !
En effet, j'ai de gros doutes sur la faisabilité d'une triangulation par XBee...
Déjà, pour faire une triangulation correct, il faut au minimum 3 positions connues, ce qui fait un système à 4 XBee :
3 XBee fixe et de position connues qui serviront de référence (un peu comme les satellites pour la géolocalisation GPS)
1 Xbee mobile sur lequel tu cherches à triangularisation sa position.
Ensuite, pour faire de la triangularisation, il faut connaitre la distance qu'il y a entre chaque module.
Pour cela, je ne vois que 2 solutions possible :
Mesurer le temps de propagation du signal entre les XBee pour en déduire la distance sachant que la vitesse de déplacement d'une onde dans l'air est connue
Mesurer la puissance du signal reçu sachant qu'il est possible de modéliser les pertes de puissance en fonction de la distance
Mais dans les 2 cas, j'ai du mal à voir comment tu vas pouvoir faire ça avec XBee sachant que :
Pour le premier cas, il faut synchroniser les XBee et mesurer des temps extrêmement court étant donné qu'une onde se déplace pratiquement à la vitesse de la lumière
Pour le second cas, il faut connaitre la puissance de réception (RSSI) de tous les modules entre eux (l'interface XBee permet-elle de récupérer ça ? à vérifier...)
A mon avis, tu peux oublier la première technique qui demande un matériel spécialisé pour la synchronisation et la mesure de ces temps.
Je te conseille donc t'orienter tes recherches sur l'approximation de distance par RSSI.
En tous cas je ferai mon possible pour essayer de trouver une solution avec xbee si solution(s) il y a ! J'avais pour idée de faire avec ta seconde proposition car il est possible de récuperer des RSSI "counts" grâce au logiciel XCTU, et en déduire la puissance. En revanche, je n'avais pas pensé à faire une référence consitituée de 3 xbee..
Okay en fait j'ai un nouveau problème. Ce n'est pas de la triangulation qu'il faut que je fasse. En fait j'ai un robot sur lequel il y aurait 2 xbee (disons a et b), et il y aurait un autre xbee mis à une certaine distance (appelé c). il faut que a et b sur le robot renvoit la force de signal qu'il existe entre eux et c (donc force entre a - b et b - c). De cette sorte il faut que lorsque le robot avance, il faut déterminer dans quelle direction (dans un premier temps) il doit se tourner pour que les forces de signal a - b et b - c soient à nouveau les mêmes. le but ultime est que le robot arrive jusqu'au xbee c. Donc j'aurais 2 end device sur le robot et un rooter à distance, tout ça coordonné par un coordinateur qui serait sur un ordinateur. Pensez vous que cette fois ce serait possible de faire un code python avec tout ça ?
bsr mes cher grand frères oft je suis très content pour du fait que ça cadre avec mon thème de fin d'etude pourriez vs m'aider à faire communique 3 xbee pro s1 en proteus svp il me reste 2 jours
Communication entre 3 Xbee Pro
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.