Communication full duplex entre un PC et un Arduino avec une module XBee

Bonjour,
J’ai pour objectif de faire communiquer une PC et un Arduino avec une liaison XBee afin d’obtenir une action et/ou une réponse de l’Arduino.
J’obtiens bien une réponse de l’Arduino vers le PC mais pas l’inverse.

Le Matériel :

XBee Adapter kit (AdaFruit)
2 Module XBee
1 Arduino UNO
1 4-channel I2C-safe Bi-directional Logic Level Converter - BSS138 (AdaFruit)

Le code source:

/*
Configuration :
 --------------------------------------------------------------------------
 speedCOM 	-> 9600 (vitesse de communication du port série)
 --------------------------------------------------------------------------
 XBee
        0 - 1200 
        1 - 2400 
        2 - 4800 
        3 - 9600 
        4 - 19200 
        5 - 38400 
        6 - 57600 
        7 - 115200 
 */
#define speedCOM 9600

const String nodeIdentifier="mon_node_1";
const boolean mode = false; // "false" Slave ou "true" COORDINATOR (Maitre)
const int panID=1111;
const int addressXBee=1;
const int destinationXBee=0;

const int pinLedA = 11; 
const int pinLedB = 12;
String inputString = "";
boolean stringComplete = false;


void setup() {
  // Configuration des pins de sortie
  pinMode (pinLedA, OUTPUT);
  pinMode (pinLedB, OUTPUT);
  
  // Configuration de la communication série
  Serial.begin(speedCOM);  
  
  // Configuration du XBee
  setConfigXBee();     
  
  // Afficher  la configuration du XBee
  getConfigXBee();
}

void loop() {
if(stringComplete){
    if(inputString == "ACT 1")
      actionA();
    if(inputString == "ACT 2")
      actionB();
    if(inputString == "ACT 3")
      actionC();
    if(inputString == "ACT 4")
      actionD();  
  }
  stringComplete = false;
  sendData();
}

void actionA(){
  digitalWrite(pinLedA, HIGH);
  Serial.print("\nHIGH");
}

void actionB(){
      digitalWrite(pinLedA, LOW);
      Serial.print("\nLOW");
}   

void actionC(){
  digitalWrite(pinLedB, HIGH);
  Serial.print("\nHIGH");
}

void actionD(){
      digitalWrite(pinLedB, LOW);
      Serial.print("\nLOW");
}   

void sendData(){
    delay(500);
    Serial.print("\nSend...");
}

void serialEvent() {
 while (Serial.available()) {

   char in = Serial.read();

        //Debug, vérification des caractères reçus
       Serial.print("\nCharacter is : ");
        Serial.print(in + "\n");       

        //Nous utilisons le retour de chariot pour indiquer
        //la fin de la chaîne de caractères
        if( in == '\n' || in == '\r') {
            Serial.print("\nString is : ");
            Serial.print(inputString+"\n");
            inputString = "";
            stringComplete = true;
        } else {
            //Vu que Serial.read() retourne seulement un
            //caractère à la fois, nous avons besoin de les accumuler
            inputString.concat( in );
        }  

   }
}

// Xbee configuration
void setConfigXBee() {
  int speedXBee = convertRateXBee();
  Serial.print("+++"); // XBee en mode configuration
  
  char thisByte = 0;
  while (thisByte != '\r') {
    if (Serial.available() > 0) {
      thisByte = Serial.read(); 
    }
  }
  delay(25);
  Serial.print("ATRE\r");
  
  if(mode)
    Serial.print("ATCE 1\r"); // Module en mode COORDINATOR(Maitre)
  else
    Serial.print("ATCE 0\r");// "END DEVICE"  c'est-à-dire en "esclave", donc pour nous en récepteur essentiellement
  
  Serial.print("ATSP\r"); // Laisser cette valeur par défaut à 0 qui signifie que le module ne dort jamais ( to sleep = dormir )  mais travaille sans arrêt )
  //Serial.print("ATA1 6\r"); 
  //Serial.print("ATNI " + nodeIdentifier + "\r");
  Serial.print("ATID " + String(panID) + "\r"); // choix de l'ID du réseau
  Serial.print("ATMY " + String(addressXBee) + "\r"); // Adresse du XBee 
  //Serial.print("ATMY\r");
  //Serial.print("ATSC 1FFE\r"); // Canal 20 à 12
  //Serial.print("ATMDH0");
  Serial.print("ATDL " + String(destinationXBee) + "\r"); // Destination du XBEE
  Serial.print("ATBD " + String(speedXBee) + "\r"); // Vitesse de communication
  Serial.print("ATWR\r"); // Enregistrement en mémoire
  Serial.print("ATCN\r"); // Sortie du mode configuration
  delay(11000);
}

void getConfigXBee(){
  Serial.print("\nXBee reciver module");
  Serial.print("\nWilly ROY-BELLEPLAINE");
  Serial.print("\nMode        : ");
    if (mode)
      Serial.print("COORDINATOR");
    else
      Serial.print("SLAVE");
  Serial.print("\nName        : ");
  Serial.print(nodeIdentifier);
  Serial.print("\nPAN ID      : "); 
  Serial.print(String(panID));
  Serial.print("\nAddress     : "); 
  Serial.print(String(addressXBee));
  Serial.print("\nDestination : ");
  Serial.print(String(destinationXBee));
  //Serial.print("\nConfiguration du XBee:\n");
}


// blinkLED 
void blinkLED(byte targetPin, int numBlinks, int blinkRate) {
  for (int i=0; i < numBlinks; i++) {
    digitalWrite(targetPin, HIGH);   // sets the LED on
    delay(blinkRate);                     // waits for blinkRate milliseconds
    digitalWrite(targetPin, LOW);    // sets the LED off
    delay(blinkRate);
  }
}

// Convertion Rate XBee
int convertRateXBee(){
  int speedXBee;
  //String nodeIdentifier, int panID, int addressXBee, int destinationXBee, int speedCOM
  switch (speedCOM){
    case 1200:
      speedXBee = 0;
    break;
    case 2400:
      speedXBee = 1;
    break;
    case 4800:
      speedXBee = 2;
    break;
    case 9600:
      speedXBee = 3;
    break;
    case 19200:
      speedXBee = 4;
    break;
    case 38400:
      speedXBee = 5;
    break;
    case 57600:
      speedXBee = 6;
    break;
    case 115200:
      speedXBee = 7;
    break;
    default:
      speedXBee = 3;
    break;
  }
  return speedXBee;
}

Bonsoir,

Sur le schéma, j'ai un doute sur la liaison TX UNO et B3 de l'adaptateur de niveau: ce ne serait pas plutôt B2?

As-tu testé d'abord les X-bee en mode par default (liaison série transparente) avant de les configurer? en faisant un test simple pour vérifier Uno vers PC : l'exemple de l'IDE "ASCIITable"....etc

bonjour, teste déjà en direct, tu as le schéma ici http://bildr.org/2011/04/arduino-xbee-wireless/

Merci encore !

J’ai fait une modification de mon script et ajouté 3 LED au lieu de 2.
Voir pièce jointe.

xbee.pde (10.3 KB)