[pas résolu] liaison RX TX xbee

Bonjours à tous!

je veux actuellement connecter un xbee a une carte arduino Uno en liaison Rx Tx
mais j'ai vu deux type de monte

j'ai vu ça: (xbee monté directement sur l'arduino)
Xbee dongle

et ça: (xbee monté avec un convertisseur)
Convertisseur

lequel est le bon? j'ai un doute monumentale!
sachant que je sais qu'il est si facile de détruire un xbee!

merci :slight_smile:

Edit de Jean-François : mis des lien plus court :wink:

up!

Le 2eme cas est le bon.

Le module XBee est 3V3 alors que l''Arduino de base est 5V.
Comme le dit le commentaire sur le 1er lien, l'auteur du post a tord car il risque de cramer son XBee avec des signaux 5V.

Le 2eme lien montre l'utilisation d'un adapateur de niveaux 3V3/5V.

Si tu prend un Shield XBee, l'électronique est déjà dessus tel que SparkFun XBee Shield - WRL-12847 - SparkFun Electronics qui contient

  • Un régulateur 3V3 pour alimenter l'XBee proporement en 3V3 a partir du 5V de l'Arduino (certaines cartes/clones n'ont que le 5V, pas de 3V3)
  • Un translateur de niveau sur la broche RX de l'XBee (TX de l'Arduino). Dans l'autre sens y'a pas de problème, l'Arduino amrche avec les signaux 3V3 issus de l'XBee.

La platine XBee explorer proposé par AlienArea51 fait la même chose mais dans un format non-shield.

Merci à vous deux :slight_smile:
( patience... j'était près a brancher le xbee en 5v ^^)

j'ai trouvais une 3ème solutions mais je sais pas ce que ça vaux
c'est de mettre deux résistance de 10k entre chacune des deux liaisons....
mais je sais pas ce que ça vaux

cependant si doit me taper une conversion 3,3/5v
il y aurais pas un moyen de trouver le schémas électronique de ce Shield??

Les schemas sparkfun sont toujours dispo sur les pages web concernés. Descend, avant les commentaires clients.

Ils ont fait une adaptation 5V/3V3 a l'arrache : une simple diode.
Il doit y avoir des pull-ups sur l'XBee.
Quand la pin de l'arduino est à 0V, ca tire la pin de l'XBee pareil
Quand la pin de l'Arduino est en haut, la diode isole le 5V de l'arduino et c'est le pull-up interne a l'XBee qui fait le niveau haut 3V3.
J'aurais jamais pensé à un truc pareil XD

L'alimentation 3V3 c'est un bête régulateur linéaire LDO 3V3 qui prend le 5V de l'Arduino.
Si ton Arduino (quel modèle) fournit déjà un 3V3 sur la broche concerné, c'est tout bon.

merci pour ces dernières info :slight_smile:

je vais me faire le montage du convertisseur 3,3/5v en vue d'une implantation CI
merci bonne soirée

ReBonjours

une simple liaison série avec les pin Rx Tx de l'arduino n'est pas possible?
Sans cette librairie j'ai pu faire communiqué des informations entre deux arduino sans problème ?
Avec des Xbee ça ne fonctionnerais pas ?

j'ai modifier le programme avec la librairie <SoftwareSerial.h> car elle succède à <NewSoftSerial.h>

mais je ne sais toujours pas a quoi sers de mettre la liaison Rx Tx sur des pin autre que 0(rx) et 1(tx) ....

ah énorme!

okey merci beaucoup pour les conseils
:wink:

bonjours

Un simple pont diviseur ne marcherais pas, pour passer d'une liaison série Rx Tx 5v à 3,3 pour le xbee ?

:astonished:

Comme indiqué plus haut je crois, regarde le schema du shield XBee ou l'XBee Explorer de Sparkfun.
Un diode Si 1N4148 entre le TX de l'Arduino et le RX de l'XBeee et c'est tout.
Cathode coté Arduino.
Cela marche parce que les pins de l'XBee soivent avoir un pull-up interne.

Arduino à 0 -> diode passante -> tire le signal a 0
Arduino à +5V -> diode bloqué -> signal tiré à 3V3 par le pull-up interne

Ah ok!

merci :slight_smile:

Re bonjours j'aurais une questions qui as rien a voir mais...

j'ai réaliser le code pour une liaison série avec deux Xbee et deux arduino de telle façon a avoir deux potar en entrée et deux LEDs en sortie ( émetteur/récepteur)
ça fonctionne parfaitement
c'est alors que je fait un test avec cette fois 4 potar pour 4leds et échec...
deux fonctionne mais les autres marche en tout ou rien...

donc voila je comprend pas d'ou viens le problème.
j'ai une hypothèse: dépassement de capacité de l'xbee? ou mauvais code?

Ma boule de cristal ne me dit rien.
Code ?

Emetteur:
////////////////////PROGRAMME EMETTEUR 4 //////////////

int analogValue2, analogValue3, analogValue4, analogValue5;
int val2, val3, val4, val5;

void setup(){

Serial.begin(9600);
}

void loop(){

analogValue2 = analogRead(2);
analogValue3 = analogRead(3);
analogValue4 = analogRead(4);
analogValue5 = analogRead(5);

val2 = map(analogValue2, 0, 1023, 253, 0);
val3 = map(analogValue3, 0, 1023, 253, 0);
val4 = map(analogValue4, 0, 1023, 253, 0);
val5 = map(analogValue5, 0, 1023, 253, 0);

Serial.write(byte(254));
Serial.write(byte(val2));

delay(5);
Serial.write(byte(250));
Serial.write(byte(val3));
delay(5);

Serial.write(byte(200));
Serial.write(byte(val4));
delay(5);

Serial.write(byte(22));
Serial.write(byte(val5));
delay(5);
delay(150);
}

Récepteur:
/////////////////// PROGRAMME RECEPTEUR 4 //////////////

byte incomingByte, sensor1, sensor2, sensor3, sensor4;

void setup(){

Serial.begin(9600);
Serial.println("Ready!");

pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
pinMode (8, OUTPUT);
delay(5);

}
void loop() {

if (Serial.available()) {
incomingByte = Serial.read();

Serial.println(int(incomingByte));

if ((int(incomingByte) == 254)) {
sensor1 = Serial.read();
Serial.println(" Sensor 1 = ");
Serial.println(int(sensor1));

}

if ((int(incomingByte) == 250)) {
sensor2 = Serial.read();
Serial.println(" Sensor 2 = ");
Serial.println(int(sensor2));

}

if ((int(incomingByte) == 200)) {
sensor3 = Serial.read();
Serial.println(" Sensor 3 = ");
Serial.println(int(sensor3));

}

if ((int(incomingByte) == 22)) {
sensor4 = Serial.read();
Serial.println(" Sensor 4 = ");
Serial.println(int(sensor4));

}
}

analogWrite (5, sensor1);
delay(5);
analogWrite (6, sensor2);
delay(5);
analogWrite (7, sensor3);
delay(5);
analogWrite (8, sensor4);
delay(5);
}

A priori en théorie ton code semble presque ok à part que tu persiste à utiliser la liaison série de l'Arduino à la fois pour l'XBee et pour l'affichage PC.

Mais je le trouve plutôt risqué et sensible aux problèmes de timings et de pertes de données.
Du moins coté récepteur ou tu prend 20ms a chaque passage dans loop().

De même j'aurais utilisé comme identifiant du capteur des valeurs qui ne peuvent pas être confondues avec les valeurs possibles des données. Tu l'as fait sur les 2 premiers mais pas pour les suivants. Si tu perd un octet, tu risque de te planter.

Je suggère :

  • remap entre 0 et 250; garde 251, 252, 253 et 254 comme identifiant de capteurs. C'est ce que tu avais fait au début.

  • dans le récepteur utilise un switch() c'est plus lisible (mais c'est pas çà qui fera marcher)

  • dans le récepteur fait l'analogWrite tout de suite, et n'utilise pas de délais ici

Ma proposition pour le récepteur devient

void loop()
{
  if ( Serial.available() )
  {
    incomingByte = Serial.read();
    switch( incomingByte )
    {
    case 254:
      sensor1 = Serial.read();
      Serial.println("  Sensor 1 = ");
      Serial.println(int(sensor1));
      analogWrite (5, sensor1);
      break;
    case 253:
      // .. etc ...
    }
  }
}

Et n'hésite pas a faire l'essai sans les XBee avec un fil direct entre le TX de l'emetteur et le RX du recepteur.

Merci pour ces conseils

donc j'ai appliquer a la lettre vos conseils ceux qui donne ça:

Emetteur:

////////////////////PROGRAMME EMETTEUR 4bis /////////////////
#include <SoftwareSerial.h>
SoftwareSerial xbee(2, 3);

int analogValue2, analogValue3, analogValue4, analogValue5;
int val2, val3, val4, val5;

void setup(){

  Serial.begin(9600); 
  xbee.begin(9600);
}

void loop()
{
  
    analogValue2 = analogRead(2);
    analogValue3 = analogRead(3); 
    analogValue4 = analogRead(4);
    analogValue5 = analogRead(5);
    
    val2 = map(analogValue2, 0, 1023, 253, 0);  
    val3 = map(analogValue3, 0, 1023, 253, 0);
    val4 = map(analogValue4, 0, 1023, 253, 0);
    val5 = map(analogValue5, 0, 1023, 253, 0);
    
    xbee.write(byte(251));
    xbee.write(byte(val2));
    
    xbee.write(byte(252));
    xbee.write(byte(val3));
    
    xbee.write(byte(253));
    xbee.write(byte(val4));
    
    xbee.write(byte(254));
    xbee.write(byte(val5));
    
    delay(150);
}

Récepteur:

/////////////////// PROGRAMME RECEPTEUR 4 bis//////////////
#include <SoftwareSerial.h>
SoftwareSerial xbee(2, 3);

byte incomingByte, sensor1, sensor2, sensor3, sensor4;

void setup()
{

  Serial.begin(9600);
  xbee.begin(9600);
  
  pinMode (5, OUTPUT);
  pinMode (6, OUTPUT);
  pinMode (7, OUTPUT);
  pinMode (8, OUTPUT);
  delay(5);
  
}
void loop() 
{ 
  
  if (xbee.available())
  {  
      incomingByte = xbee.read();
      switch (incomingByte)
        {
      case 251:
          sensor1 = xbee.read();
          Serial.println("  Sensor 1 = ");
          Serial.println(int(sensor1));
          analogWrite (5, sensor1);
          break;
          
      case 252:
          sensor2 = xbee.read();
          Serial.println("  Sensor 2 = ");
          Serial.println(int(sensor2));
          analogWrite (6, sensor2);
          break;
      
      case 253:
          sensor3 = xbee.read();
          Serial.println("  Sensor 3 = ");
          Serial.println(int(sensor3));
          analogWrite (7, sensor3);
          break;
          
      case 254:
          sensor4 = xbee.read();
          Serial.println("  Sensor 4 = ");
          Serial.println(int(sensor4));
          analogWrite (8, sensor4);
          break;
        }
  }
}

Et je retrouve exactement le même problème,
c'est à dire deux potard avec deux led qui fonctionne
un potar qui fait fonctionner une led en logique
et un des deux potard qui fonctionne fait fonctionner la dernière led en logique
et le dernier potar ne fonctionnant pas du tout...

ps: avec les xbee ou avec une liaison filaire c'est le même résultat

Et que disent les traces en Serial.print ?

Elles disent la même chose que l'info lumineuse que j'ai à quelques choses près...

j'ai les quatre pot qui font un signal analogique ( vérifier a la console )
mais seulement deux LED représente le pot
et les deux entres LED font un signal Logique ( après un certain seuil du pot )

AnalogueWrite

On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11.

Comme quoi plus le problème est simple moins on voit la solution....
RTFM :smiley: