¿Cómo hacer que XBee duerma?

3

Arduino Fio con radio XBee.

He leído el manual de XBee (pág. 24-25), tratando de averiguar cómo Para ponerlo a dormir, pero lo que intenté no funcionó. Luego encontré un boceto usando XBee durmiendo, y he condensado el código en esto:

#include <avr/sleep.h>
#define XBEE_sleepPin 6

void setup() {
  Serial.begin(57600);
}

void xbeesleep() {
  Serial.println("sleep");    
  pinMode (XBEE_sleepPin,INPUT);    // put XBee to sleep
  digitalWrite(XBEE_sleepPin,LOW);  // Setting this pin to LOW turns off the pull up resistor, thus saving precious current
}

void xbeewake() {
  Serial.println("wake");    
  pinMode(XBEE_sleepPin,OUTPUT);   // Set the "wake-up pin" to output
  digitalWrite(XBEE_sleepPin,LOW); // wake-up XBee
  delay(1000); //make sure that XBee is ready
}

int i = 0;
void loop() {
  if (i==0)
    xbeewake();
  else if (i==5)
    xbeesleep();
  Serial.println(i);
  i = (i+1) % 10;
  delay(2000);
}

He conectado un cable del puerto digital 6 al puerto DTR en el Arduino, que creo que está conectado directamente al pin DTR / SLEEP_RQ en el XBee. De acuerdo con el manual, al dormir, el XBee debe ignorar todas las entradas a través de la conexión en serie. Pero todavía se transmite en los períodos en que se supone que debe dormir. Aquí está la salida del monitor de la consola:

wake
0
1
2
3
4
sleep
5
6
7
8
9
wake
0

¿Alguna idea de lo que está mal con mi configuración? ¿O simplemente consejos sobre cómo hacer que el XBee duerma?

    
pregunta Lucy Brennan

3 respuestas

1

Primero debes configurar tu XBee con atsm = 5 y atdi7 = 0. entonces es mejor usar una resistencia de 10k entre el pin 6 y dtr / sleep_rq y, finalmente, cuando quieras que el XBee entre en suspensión, no dejes que el programa para imprimir los números del 5-10.

Este es su código actualizado:

#include <avr/sleep.h>
#define XBEE_sleepPin 6

void setup() {
  Serial.begin(9600);
}

void xbeesleep() {
  Serial.println("sleep");   
 delay (3000); 
  pinMode (XBEE_sleepPin,OUTPUT);    // put XBee to sleep0
  digitalWrite(XBEE_sleepPin,HIGH);  // Setting this pin to LOW turns off the pull up resistor, thus saving precious current
}

void xbeewake() {
  Serial.println("wake");    
  pinMode(XBEE_sleepPin,OUTPUT);   // Set the "wake-up pin" to output
  digitalWrite(XBEE_sleepPin,LOW); // wake-up XBee
  delay(1000); //make sure that XBee is ready
}

int i = 0;
void loop() {
  if (i==0)
    {
     xbeewake();
    }
  else if (i==5)
    {
    xbeesleep();
    }
  if (i<5)
  {
  Serial.println(i);
  }
  i = (i+1) % 10;
  delay(3000);
} 
    
respondido por el user20520
1

He ejecutado el siguiente código en mi Arduino Uno

#include <avr/sleep.h>
#define XBEE_sleepPin 5

void setup() {
Serial.begin(9600);
}

void xbeesleep() {
Serial.println("sleep");   
delay (3000); 
pinMode (XBEE_sleepPin,OUTPUT);    // put XBee to sleep0
digitalWrite(XBEE_sleepPin,HIGH);  // Setting this pin to LOW turns off the 
pull up resistor, thus saving precious current
}

void xbeewake() {
Serial.println("wake");    
pinMode(XBEE_sleepPin,OUTPUT);   // Set the "wake-up pin" to output
digitalWrite(XBEE_sleepPin,LOW); // wake-up XBee
delay(1000); //make sure that XBee is ready
}

int i = 0;
void loop() {
if (i==0)
{
 xbeewake();
}
else if (i==5)
{
xbeesleep();
}
if (i<5)
{
Serial.println(i);
}
  i = (i+1) % 10;
  delay(3000);
}

Y se comporta como se espera. Tenga en cuenta que si está utilizando Xbee Shield, entonces tendría que cambiar la configuración en su módulo. Todo lo que tiene que hacer es abrir el software Xctu y cambiar la opción D7 a Do Low [4]. La razón por la que tiene que cambiar esta opción es que cuando xbee se pone en reposo, el CTS se pone alto, lo que a su vez restablece su arduino, por lo que su código no se está ejecutando.

    
respondido por el JFC
0

Al marcar la casilla de verificación para cargar el firmware más reciente en x-ctu, generalmente se soluciona el problema, pero debes asegurarte de que todos tus xbees usan la misma versión de firmware.

    
respondido por el Visual Micro

Lea otras preguntas en las etiquetas