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;
}