je viens vers vous car je débute dans les communications sans fil XBEE, et je ne sais pas trop comment m'y prendre
J'ai 2 arduino MEGA branché sur 2ordi différents , sur chacun des 2 arduino j'ai un shield XBEE plus un XBEE de connecté.
Je voudrais que le premier sur lequel j'ai branché un potentiomètre soit l'émetteur.
Mon but est juste de transférer la valeur analogique ([0;1023]) du potentiomètre du premier arduino vers le second pour ensuite l'afficher sue le serial monitor sauf que je ne sais pas du tout m'y prendre pour émettre et recevoir une variable de type chiffre
si vous avez des bouts de codes, des tutos ou des trucs qui pourrait m'aider je suis preneur.
Une première étape sera de réussir à afficher correctement une variable de type int sur le moniteur série (sans xbee). Pour ca le tuto Arduino sur le site devra te permettre d'y arriver.
Ensuite on pourra mettre en place la transmission XBEE
Je maîtrise le fait d'écrire dans le moniteur Série des valeurs de variable ou du texte (avec Serial.print, Serial.println ). Je sais aussi interagir avec l'arduino en tapant des choses dans le Serial monitor ( changer l'état d'une led...).
En fouillant un peu j'ai trouvé un bout de code que j'ai un peu modifier pour pouvoir émettre la valeur d'un potentiomètre. Peu tu me dire ce que tu en pense?
int Pot =A0;
float Valeur =0; //Valeur a emettre
void setup() {
Serial.begin(9600);
Configuration();
}
void loop() {
Valeur = analogRead(pot); //Lecture de la valeur
Serial.println(MaValeur); //Emission de la valeur
}
delay(50);
}
//Configuration du XBEE
void Configuration() {
Serial.print("+++");
char thisByte = 0;
while (thisByte != '\r') {
if (Serial.available() > 0) {
thisByte = Serial.read();
}
}
Serial.print("ATRE\r");
Serial.print("ATDL0\r"); // sent to xbee 0
Serial.print("ATMY1\r"); // this xbee is 1
Serial.print("ATID1111\r");
Serial.print("ATCN\r");
}
Il faudrait que je me remette dans les docs des modules sur l'idée ca a l'air correcte (au jugé, je vais pas aller compiler pour vérifier).
Perso je mettrais un petit délai après la configuration, et je mettrais aussi un controle du retour des commande AT pour vérifier que tout se passe bien et éviter d'envoyer les commandes trop vite et que le module pige rien...
Quand tu écris une commande AT à ton module, ce dernier est censé te répondre (souvent il répond "OK"). Une bonne pratique serait de vérifier qu'il répond ce que tu attends.
Ensuite, pour la réception, qu'elle est le format de la donnée que tu attends ? car la si tu recois une virgule tu vas juste la virer...
Sinon tu es sur une carte MEGA, sais-tu sur quelle liaison série ton Xbee est branché ? Une bonne idée serait de mettre la liaison XBee sur un autre serial que celui de l'USB, comme ca tu peux faire un echo sur le moniteur USB de tout ce qui arrive sur la voie XBee.
A ok comme genre un bit de contrôle je voie avec une boucle if je doit surement pouvoir vérifier ça.
j'aimerais émettre et recevoir une valeur avec une précision de 10^-2, Pour cela il faut que j'utilise des variable de type float mais dans mon programme de réception si je remplace char par float j'ai un bug a la compilation...
Sinon pour ma connections XBEE/arduino j'utilise ce shield http://tinyurl.com/ascdpa5 je n'ai donc aucun fils sur les RX et TX de mon arduino
Ah ca c'est dommage, ca aurait été pratique de pouvoir débugguer en utilisant 2 voie série... si tu as des fils males/males, tu pourrais "externaliser" le module (en y amenant via des fils le 5V, la masse, le TX et le RX)
Justement l'idée "d'externaliser" le shield serait de pouvoir le brancher sur une autre voie série pour pouvoir débugguer sur l'USB et en meme temps se servir du shield
Pour envoyer un float tu peux faire un truc un peu malin...
Un float à la taille de 4 char. En faisant des opérations de décalage et masquage tu vas pouvoir envoyer les 4 octets à la suite, puis ensuite il suffira de faire l'opération inverse du coté récepteur pour reconstruire le float.
Oui pour utiliser le shield et la voie serie USB en même temps il me suffit juste de déclarer mon serial XBBE en Serial.begin(9600); et mon Serial USB en Serial1.begin(9600);.
J'ai chercher et trouver un de tes post sur le forum concernant le flot to char et j'ai donc modifier mon code en intégrant la conversion.
int Pot =A0;
float Valeur =0;
void setup() {
Serial.begin(9600);
Configuration();
}
void loop() {
Valeur = analogRead(Pot); //Lecture de la valeur
char message[20]; //taille max de 20 caractère pour le message, pour l'exemple
sprintf(message, "%f", Valeur); //comme un printf mais dans une chaine !
Serial.println(Valeur); //Emission de la valeur
delay(50);
}
//Configuration du XBEE
void Configuration() {
Serial.print("+++");
char thisByte = 0;
while (thisByte != '\r') {
if (Serial.available() > 0) {
thisByte = Serial.read();
}
}
Serial.print("ATRE\r");
Serial.print("ATDL0\r"); // sent to xbee 0
Serial.print("ATMY1\r"); // this xbee is 1
Serial.print("ATID1111\r");
Serial.print("ATCN\r");
}
Cependant je ne comprend pas a quoi correspond message sprintf(message, "%f", Valeur);
Es normal que sprintf ne ce colore pas dans l'éditeur?
Je ne peu pas tester mes codes car le matériel est au lycée... Peu tu me dire ce que tu en pense?
Je ne pensais pas à un de mes vieux messages (qui dans le cas d'Arduino se révèle être faux, sprintf ne marche pas pour les float pour Arduino si mes souvenirs sont bons...)
Ce que je te propose est différent et sera de la forme suivante :
void envoyer(float value) {
for(char i=0; i<4; i++) {
Serial.print(value & 0x000000FF); //on envoie seulement les derniers bits
value = value >> 8; //on décale value vers la droite
}
}
float recevoir() {
float value = 0;
float temp = 0;
for (char i=0; i<4; i++) {
temp = Serial.read() & 0x000000FF;
value |= temp << (i*8);
}
return value;
}
Sans garantie de succès mais ca peut peut etre marcher!
Et toujours rien. Alors je me pose plusieurs questions:
-Es que le fait que ce soit le RX0 et TX0 qui soit utilisé puisse faire bugger?
-Le shield est'il compatible arduino mega?
-Il y a t'il une configuration spéciale a faire aux XBEE?
J'ai essayé d'"externalisé" les XBEE en suivant ce shémat http://jeromeabel.net/files/ressources/xbee-arduino/images/large/xbee-arduino-send-bb.png mais toujours rien.
Pour finir j'ai mit un fils du RX0 de la carte 1 au TX0 de la carte2 et un autre du RXO de la carte 2 au TX0 de la carte1 et sa a fonctionné!
Si vous avez une idée pour faire marché ces modules XBEE (j'utilise des XBEE chip série 2) je suis preneur
Tester le programme en reliant par des fils -> très bonne idée
Pour les shields, garde les "externaliser" (ce que au passage j'avais proposé quelques posts plus tot) en branchant le xbee sur les pins de la voie série 1 par exemple (et laissant la voie série 0 pour l'USB). Si possible fais nous un schéma ou une bonne photo qu'on voit si le montage est correcte (ou alors une bonne explication)
C'est en relisant tes post que je me suis dit après tout il y a qu'a externalisé Ce qui est une chose non aisé du fait que les pin du XBEE ont un espacement plus petit que ce des trous des platines de test
J'ai fait un schéma du câblage (c'est le même pour les 2 arduino sauf que un a une led sur le pin 13 en plus)
Au niveau du programme si j'ai bien compris vue que j'utilise le RX et TX 1 je doit pour envoyer avec le XBEE écrire par ex:
void setup(){
Serial.begin(9600); //connexion pour le USB
Serial1.begin(9600); //connexion pour le XBEE
}
void loop(){
Serial1.print("H");
Serial1.print("L");
}
Ou il y a t'il une configuration a faire pour emmètre sur le RX et TX 1?
Bon ben j'ai essayé en mais toujours aucun résultat...
En me cherchant sur le net j'ai vue qu'un mec rajouté une librairie pour les XBEE
#include <SoftwareSerial.h>
SoftwareSerial xbee(2, 3); // RX, TX
char c = 'A';
int pingPong = 1;
void setup()
{
Serial.begin(9600);
Serial.println( "Arduino started sending bytes via XBee" );
//Set the data rate for the SoftwareSerial port
xbee.begin(9600);
}
void loop() {
// Send character via XBee to other XBee connected to Mac
// via USB cable.
xbee.write( c );
//--- Display the character just sent on console. ---
Serial.println( c );
//--- Get the next letter in the alphabet, and reset to ---
//--- 'A' once we have reached 'Z'.
c = c + 1;
if ( c>'Z' )
c = 'A';
//--- Switch LED on Arduino board for every character sent---
if ( pingPong == 0 )
digitalWrite(13, LOW);
else
digitalWrite(13, HIGH);
pingPong = 1 - pingPong;
delay( 1000 );
}
Je sais pas si sa pourrait me faire avancé.
Tu m'as dit que si il était bien configuré sa pourrais marché mais perso j'ai fait aucun paramétrage a mes XBEE . De quel paramétrage parlé tu?
Plutôt que de déterrer un sujet vieux de 2 ans, je t'invite à créer ton propre sujet.
Profites en aussi pour ajouter un bonjour au début de ton message (ça fait toujours plaisir) et dit nous un peu ce que tu as essayé de faire ou ce que tu aimerais faire car on ne va pas faire le travail à ta place (surtout quand on sait qu'il y a une infinité de tutoriel XBee sur internet).
Sur ceux, je ferme pour éviter d'autres déterrages.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !