Conexion de un modulo Xbee a Netduino


Como usted probablemente sabe, es bastante posible usar un Netduino Plus , o un Netduino normal  con un escudo Ethernet , para conectar un Netduino directamente a Internet. De hecho, O’Reilly ha publicado recientemente un libro protagonizado por el Netduino Plus , que le muestra básicamente como salvar medidas en la plataforma M2M cosm.com  antes Pachube y luego Xively.

 

En lugar de Ethernet, el autor usó  un Xbee  con conexión a un PC que actúa como intermediario, en parte porque el autor ya tenía esa configuración  para apoyar el monitoreo Tweet-A-Watt , pero también debido a ciertas ventajas evidentes:

  • Conexiones Ethernet con cable no son prácticos para la mayoría de las partes de una casa pues es dificultoso tener red cableada   por todas partes ( auque sabemos que esta dificultad se puede minimizar con PLC’s o inlcuso con repetidores WIFI con salida  ethernet
  • XBee es más barato que el Wi-Fi, especialmente si usted planea usar múltiples Netduinos en varias partes de la casa (que lo haremos, una vez que añadimos monitoreo de sensores a la mezcla)
  • El Netduino es una plataforma de desarrollo relativamente limitada en comparación con un PC. Por lo tanto, esta perspectiva ayuda a limitar el papel del Netduino para  las «líneas del frente»gracias a que  tienen gran parte del código que se ejecuta en un PC que actúa como «comando y control». Esto, también, se convertirá en una ventaja más grande cuando haya múltiples Netduinos involucrados.

La gran desventaja de este enfoque es que necesita  un PC encendido 24/7.Eso  supone  una gran cantidad de electricidad desperdiciada, considerando qué  su carga de trabajo va a ser muy baja . Dedicando un 120W + PC para este proyecto es  claramente  excesivo,pero afortunadamente, hay un número creciente de dispositivos de ultra baja potencia que son capaces de actuar como el PC para este propósito. Como siempre esto es cierto siempre que tenga un puerto USB, conexión a Internet y se puede ejecutar Python, 

 BeagleBoard puede ser un alternativa cuando se ejecuta la secuencia de comandos de Linux y Python en este proyecto, un BeagleBoard XM utiliza sobre 3W (medida por un medidor Kill A Watt).

En comparación, la «eficiencia energética»  con 2 años de uso es mucho mayor que usando un PC ,pues los promedios de PC de Windows  consumen cerca de 200W. Teniendo en cuenta que es capaz de servir como un servidor principal de pleno derecho, la BeagleBoard es increíble, y es de esperar una indicación de la dirección futura de PCs para el hogar.

Por cierto, la combinación Netduino / Arduino / LCD utilizado en este proyecto consume  menos de 1W, así que usar * duinos en sus proyectos en el hogar es definitivamente una alternativa de energía respetuosa.

TonidoPlug ordenador

TonidoPlug ordenador

Una opción menos costosa, y que usa este  proyecto, es el $ 99 TonidoPlug . Viene con Ubuntu ya instalado, y un puerto  Ethernet y puerto USB. Puede conectar el XBee al puerto USB directamente si lo desea, y que va a funcionar bien para los fines de este proyecto. Sin embargo, si desea ejecutar el software Tonido entonces usted necesitará un concentrador USB con alimentación – el software Tonido requiere una unidad USB, y no sólo el 1 puerto integrado.

 

Al igual que los Beagleboards,el TonidoPlug es un dispositivo muy fiable, y es igual de eficiente de la energía. No es fácil de actualizar o reemplazar el sistema operativo, pero la versión incorporada de Ubuntu es más que suficiente para los proyectos normales.

Si usted decide ir con un BeagleBoard, uno de los últimos artículos cubre la instalación de Angstrom y Python , y esta página eLinux es la guia ideal  si está instalando Ubuntu.

En cuanto aTonidoPlug, viene con Ubuntu 9.04 (Jaunty Jack), Python 2.5 y un servidor SSH  incluidos . Todo lo que necesita para agregar a este proyecto es la biblioteca de serie Python y la utilidad de la pantalla de GNU para el funcionamiento de la aplicación Python en una sesión de terminal de fondo.

Para instalarlos, entrar como root a través de SSH, cree entonces directorio utilizado por el gestor de paquetes apt, a continuación, instalar un par de paquetes:

  mkdir-p / var / cache / apt / archives / partial
 apt-get update
 apt-get install python-serial
 apt-get pantalla de instalación

 

 

 

La conexión de hardware a la Netduino es relativamente simple, porque el Netduino utiliza el mismo nivel de tensión de 3,3 V como el XBee y pins de serie del Netduino hablar el mismo idioma que el XBee.

La única complicación es que el XBee utiliza un espaciamiento generalmente apretado para sus pines, sólo 2 mm de separación. Esto hace que sea difícil de conectar los cables de puente a los pines, y imposible enchufar el XBee en un tablero. La mayoría de la gente utiliza un tablero del desbloqueo de resolver este problema, como la de Sparkfun XBee Breakout Junta o de Adafruit adaptador XBee PCB (que es el PCB utilizados en su kit de adaptador – que funciona bien como un tablero del desbloqueo).

Como se muestra en la foto de abajo, se ha conectado el XBee en una placa protoboard usando un adaptador XBee Adafruit. Esto hace que sea fácil compartir pin 3.3V del Netduino con otros dispositivos, además de la XBee, y le permite conectar un LED para algunos de los pines del XBee para la solución de problemas:

XBee Pin Conexión
1 3.3V
2 Netduino RX (por ejemplo D0)
3 Netduino TX (por ejemplo, D1)
6 LED (encendido cuando se recibe, opcional)
10 Suelo

 

XBee Para Netduino Conexiones

XBee Para Netduino Conexiones

Ejecución del software Python

Una vez que el hardware está en su lugar, el siguiente paso es iniciar el software Python en ejecución.

Usted tendrá que tener pySerial instalado. Si has seguido las  instrucciones para configurar Angstrom Linux en un BeagleBoard , o configurar Ubuntu en un TonidoPlug , entonces ya está todo listo. De lo contrario, consulte lasinstrucciones de instalación que aparecen en la pySerial pag e.

Descargue el código Python del proyecto en Google Code. Guarde el archivo en cualquier carpeta del PC host – si usted está usando un TonidoPlug o BeagleBoard ejecutando Linux, a continuación, la carpeta de inicio está bien.

Si utiliza Linux, es probable que necesite para ejecutar el código Python como root para poder acceder al puerto serie:

es decir,

  sudo python TimeServer.py

Los parámetros de línea de comandos para el programa son todos opcionales:

  TimeServer.py [nl] [-d] [-port xxxx]
  • -Nl – Desactiva el registro. De lo contrario, cualquier error se escriben en el directorio actual en un archivo llamado controller.txt. Esperemos que este archivo no obtendrá grandes, pero desactivando el registro es necesario si está ejecutando el código de un directorio de sólo lectura.
  • -D – enciende los mensajes de depuración por escrito a la consola.
  • -Port – Especifica el puerto serie que el XBee está conectado. El valor predeterminado es / dev/ttyUSB0. En un TonidoPlug o BeagleBoard, que debe ser el puerto correcto.En un PC con Windows, el puerto tendrá un nombre totalmente diferente, como COM3 – comprobar el Administrador de dispositivos si usted no sabe cuál usar. Si está utilizando Windows, consulte la sección «Windows Weirdness» a continuación.

Si inicia el programa cuando se conecta a través de SSH, debe utilizar primero la GNU Screen utilidad para abrir un símbolo del sistema virtual, y ejecutar el programa desde allí. De lo contrario, el programa dejará de funcionar cuando se desconecta de SSH.

Para ejecutar la pantalla, sólo tiene que escribir «pantalla». Usted será llevado a un nuevo símbolo del sistema, en el que se ejecuta TimeServer.py que el anterior.

Cuando TimeRelay está en funcionamiento, puede desconectarse de la sesión de pantalla pulsando CTRL-A, a continuación, D. Esto deja el código Python funcionando en segundo plano. Para volver a conectar a la sesión de la pantalla, introduzca screen-r-d.

GNU Screen es muy útil para el funcionamiento de un proceso de fondo como éste, porque se puede volver a conectar en cualquier momento, desde cualquier lugar, y ejecutar screen-r-d para ver la salida de corriente del programa TimeServer.py. Esto es realmente útil para la depuración, y para reiniciar el código Python 

Al ejecutar el código Python en Windows presenta un par de otras complicaciones,

Si Python lanza una excepción «El sistema no puede encontrar el archivo especificado» cuando intenta abrir el puerto serie, puede que se han topado con el problema descrito en StackOverflow aquí . Trate de especificar el puerto COM como «\. COMxx» por ejemplo,

  Puertos \. COM10

Además, la apertura de un puerto serie a veces se traduce en un «acceso denegado» excepción en Windows si no lo cierre antes de abrirlo. Como he dicho, no me preguntes.Desde el cierre del puerto serie antes de abrirlo no parece causar ningún problema, he actualizado el código Python con esta revisión.

Ejecutar el código Netduino

Puede obtener el código Netduino en una de 2 maneras:

  1. Si está familiarizado con Subversion, usted utiliza cualquier cliente SVN (mi favorito es TortoiseSVN ) para obtener una copia de todos los archivos del proyecto. La URL SVN es https://gigamega-micro.googlecode.com/svn/trunk . Si desea que la versión anterior del código para que coincida con uno de los últimos artículos, obtener la revisión correspondiente. (Vea la lista de revisión aquí )
  2. O bien, descargue el buen viejo. Zip desde la sección de descargas del proyecto en Google Code. Aquí hay un enlace directo al código para este artículo .

Si el programa de Python está funcionando, entonces sabrá dentro de un minuto de encender el Netduino si todo funciona correctamente: la fecha y la hora se ajustarán automáticamente correctamente a través de la conexión y , eso no es todo: el LED conectado a la XBee recibira por pin se encenderá una vez por minuto.

 

Sobre el único otro cambio en el software Netduino esta vez es que finalmente he añadido un ajuste de horario de verano para el menú del Netduino: puede activar o desactivar el horario de verano en el menú «Fecha».

 Se utiliza en el cálculo de la «Sun Up» y tiempos «Sun Down», si usted está basando el temporizador de luz de la planta en aquellos tiempos. Los puristas señalarna que un Netduino conectado a Internet no debería tener que depender de un ajuste manual para saber cuando el horario de verano está en vigor, pero vamos a hacer caso omiso de esos puristas por ahora.

Se ha encontrado el XBee para ser un complemento muy fiable a la Netduino. Hecho, el autor escribió el código utilizado en este artículo y han estado funcionando continuamente desde entonces, y todavía tiene  algún caso donde la conexión XBee cae permanente o deja de responder. En suexperiencia, esto es una gran ventaja sobre el uso de una conexión Ethernet – cuando la conexión Ethernet del Netduino cae tiende a quedarse abajo.

Así que, si tan grande del Xbee, ¿por qué estoy usando sólo para ajustar el tiempo?  Si usted navega a través de la clase principal Program.cs en el código fuente, verá que hay un nuevo método llamado uploadSensorData, que no apuntal a un posible envios desde Netduino a  Nimbits.

Código en pyton

El código Python es ciertamente muy simple: todo lo mejor para aprender programación Python desde, ¿verdad?

Conexión de puerto serie del XBee se abre durante el inicio. Si la conexión no se puede abrir, el programa mostrará un mensaje de error y terminara llamando a la función sys.exit Python. Si tuviera algunos problemas para conseguir el puerto serie de trabajo antes, sin duda usted estará bien familiarizado con este mensaje de error.

1
2
3
4
5
6
7
try:
    ser = serial.Serial(SERIALPORT, BAUDRATE, timeout=TIMEOUT)
    ser.close() # workaround for known problem when running on Windows
    ser.open()
except:
    print "Unable to open serial port ", SERIALPORT, ". See ya."
    sys.exit(1)

 

Los principales controles de bucle si el tiempo ha cambiado (sólo el minuto, en realidad – lo dejaremos la Netduino manejar los segundos). Si es así, se llama a la función sendDateTime (). A continuación, tiene capacidad para un rato antes de repetir el ciclo.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def displayTime():
    lastMin = -1
    while 1==1:
        try:
            currTime = datetime.datetime.now()
            if DEBUG:
                print "in displayTime, currTime = " + currTime.strftime("%Y-%m-%d %H:%M:%S")
            currMin = currTime.minute
            if lastMin != currMin:
                lastMin = currMin
                sendDateTime()
            time.sleep(15);
        except Exception:
            LogMsg("Error in displayTime")
            print sys.exc_info()[0]

Tenga en cuenta que que el controlador de excepciones es diferente de la utilizada cuando se abre el puerto serie : se registra el error , muestra alguna información sobre el error en la consola ( usando la función de Python sys.exc_info ) , a continuación, con optimismo sigue adelante . Si no hay controlador de excepciones , ninguna excepción en este bucle , o en las funciones llamadas por este bucle, que causaría la aplicación termine.

Este enfoque de » iniciar y seguir adelante » es generalmente mal visto en el diseño de software, pero lo recomendaría para un programa tan simple como este que se ejecuta en segundo plano. Debes encontrar que este código de la aplicación , y Python que se comunica a través de XBee , en general , es muy poco mantenimiento : sólo puede iniciarlo, luego olvidarse de él . De vez en cuando se puede comprobar en el código usando GNU Screen o mirando el contenido del registro de errores controller.txt .

La función sendDateTime sólo convierte la fecha y la hora en el formato que el Netduino lo espera , entonces lo escribe en el puerto serie. Tenga en cuenta que el » ser.flush ()» función se utiliza para asegurarse de que los datos se envían de inmediato en lugar de ser amortiguada – esto es, literalmente, los datos sensibles al tiempo.

 

 

1
2
3
4
5
6
7
8
def sendCommand(strPrefix, strCommand):
    if ser:
        ser.write(strPrefix + ":" + strCommand + chr(0))
        ser.flush()
def sendDateTime():
    timeStr = time.strftime("%Y-%m-%d %H:%M")
    sendCommand("D", timeStr)

 

En el lado Netduino, se requiere muy poco código nuevo para hablar con el XBee. Estamos usando el XBee como un dispositivo de puerto serie, en lugar de hacer uso de la API de la XBee (una opción más versátil que podría explorar en un próximo artículo). Desde la perspectiva del Netduino, el XBee podría ser un tipo sentado en una terminal de serie, de vez en cuando escribiendo un comando «set time». Ya hemos implementado ese apoyo, de vuelta en el «Netduino: Tiempo y Clima» artículo.

 

La conexión XBee se abre durante el inicio, usando casi exactamente el mismo código que se utilizó para abrir una conexión serie a un terminal de PC:
1
2
3
// last parm should be true for UART terminal (to send
//   user confirmation), but false for UART XBee
uart = new clsUART(strUARTPort, 9600, 512, false);
El controlador de eventos es el mismo que se utilizó para el terminal de PC: el evento se produce cuando nuestra clase genérica de puerto serie, clsUART, recibe algunos datos. De hecho, si usted está utilizando el Kit LCD serie SparkFun, este controlador de eventos todavía se utiliza cuando el Netduino recibe datos desde el Arduino, como se explica en el «A Little ayuda de sus amigos» artículo.Compartir un controlador de eventos de comandos serie entre Arduino y el XBee funciona bien, y es fácil de implementar en. Net. El Netduino no lo sabe, o la necesidad de conocer, que ha de enviar el comando, y el. NET Micro Framework asegura que no hay ningún conflicto entre los 2 puertos serie.Lo único que ha cambiado es que el XBee envía la fecha y hora en el mismo comando:
D: 2011-07-25 18:01

Entonces,se puede  modificar   clsUART para comprobar para ver si la cadena está en este formato, y plantea tanto una «fecha fijada» y «Set Time» caso si lo es.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (strDateParts.Length == 5)
{
    intHours = Int32.Parse(strDateParts[3]);
    intMinutes = Int32.Parse(strDateParts[4]);
    intSeconds = 0;
    blnTimeSet = true;
}
...
// tell rest of application that the date has been set
raiseCommand(strCommand);
if (blnTimeSet)
{
    // raise the time event too
    raiseCommand("T:" + Program.Int_ToZeroPrefixedString(intHours, 2) + ":" + Program.Int_ToZeroPrefixedString(intMinutes, 2));
}

El controlador de eventos ya sabía cómo manejar los cambios de fecha y los cambios de tiempo, por lo que no se requería ningún cambio en el código allí.

El único otro cambio significativo fue modificando el menú para añadir un interruptor de «horario de verano». Dado que el código de menú ha sido diseñado para ser fácilmente extendida – como se explica en la Expulsión del artículo de menú – esto requiere sólo 1 nueva línea a la matriz strMenuItems:

1
2
3
"2-1", "Hour `HH`", "_UD-`HH`",
"2-1", "Min `mm`", "_UD-`mm`",
"2-1", "DST `DS`", "_DST", // NEW - Daylight Savings Time setting

El formato se ve bastante críptico, pero tendrá más sentido si usted lee el «Programador Show and Tell» de pedir a la carta.

El código en clsLCDMenu pasa el «DS` `» de palabras clave para su método de devolución de llamada para obtener el ajuste DST actual y pasa a la palabra clave «_DST» para el método de devolución de llamada para el manejo de un nuevo ajuste introducido por el usuario.

Por ejemplo, el código agrega al método de devolución de llamada setValueFromMenu () para la palabra clave «_DST» es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
else if (menuCode == "_DST")
{
    // toggle DST
    blnUseDaylightSavingsTime = !blnUseDaylightSavingsTime;
    calculateSunriseAndSunset(DateTime.Now);
    if (blnUseDaylightSavingsTime)
    {
        SaveSettingToEEPROM(ADDR_DST, 2);
    }
    else
    {
        SaveSettingToEEPROM(ADDR_DST, 1);
    }
}

Esto vuelve a calcular la salida del sol y puesta del sol (y actualiza los temporizadores de luz la planta si se basan en estos tiempos), a continuación, pasa a la nueva configuración para el Arduino en el Kit LCD Sparkfun para guardarla en la memoria EEPROM.

 

 

 

 

 

Conexión de un XBee a un PC

La comunicación punto a punto no es ninguna diversión con un solo punto, por lo que tendrá que conectar un XBee tanto a la PC y el Netduino.

Al final PC, ya sea que use un BeagleBoard, TonidoPlug, o una PC completa, necesitará un adaptador USB para el XBee.

Hay muchas opciones que hay. El autor usa un adaptador XBee Adafruit y un cable USB TTL-232 . Sin embargo, a menos que le sucede que tiene un cable de repuesto se trata de una opción relativamente costosa, puesto que el adaptador cuesta $ 10 y el cable cuesta $ 20. Otras opciones son  $ 20 Adaptador XBee Parallax , y versátil $ 20 de Seeedstudio UartSBee .

Antes de conectar el XBee al Netduino, debe configurar los 2 XBees para que puedan hablar entre sí.

Por defecto, los adaptadores XBee están configurados como adaptador de 0 en PAN (ID de red) 3332, y van a enviar sus datos a otros 0s adaptador. Aunque esto funciona bien si uno XBee sólo envía, y el otro XBee sólo recibe, pronto tendremos la Netduino y PC charlando alegremente de distancia entre sí. Por lo tanto, usted debe asignar una de las XBees tener un adaptador de ID diferente (número 1 funciona bien), a continuación, establecer la dirección de destino del otro XBee ser el mismo ID.

Esta página en Adafruit cubre las 2 opciones para configurar un XBee: el sólo para Windows del programa X-CTU, y entrar los comandos AT desde una terminal serie.

Sea cual sea el método de configuración que utilice, es necesario cambiar la configuración de «MI» en la primera XBee a 1, y la del «DL» ajuste en el otro XBee a 1 Eso es:. Los demás valores predeterminados están bien.

Me gustaría recomendar el uso del programa X-CTU si estás empezando con XBees: es mucho más fácil de usar ya prueba de tontos que un terminal serie. Mientras que usted está allí, usted debe actualizar el firmware de los XBees, algo que no se puede hacer desde un terminal serie.

Si usted es incondicional sobre el uso de un TonidoPlug o BeagleBoard como un PC, o quiere evitar encontrarse con X-CTU por otras razones, de un terminal serie es el camino a seguir.

El autor ha utilizado minicom en un BeagleBoard y TonidoPlug para esto. Con el fin de hablar con el XBee tendrá que ejecutar minicom como root y cambiar algunos de los ajustes por defecto. Conecte un XBee en su adaptador al puerto USB, entonces:

  1. En la línea de comandos de Linux, escriba «minicom-s». Si va a guardar la configuración en un perfil (una buena idea), se debe ejecutar como root: «sudo minicom-s»
  2. Seleccione «Configuración del puerto serie»
  3. La configuración del puerto serie deben ser como se muestra en la siguiente imagen.Pulse el botón «E» para cambiar el BPS en 9600, y presione «F» para configurar hardware de control de flujo en «No». También puede ser que tenga que cambiar la configuración de dispositivos de serie: el general «/ dev/ttyUSB0», pero si hay otros dispositivos USB conectados: podría ser / dev/ttyUSB1 o / dev/ttyUSB2, etc
  4. Pulse Intro para volver al menú de configuración de Minicom, a continuación, seleccione «Pantalla y teclado»
  5. Pulse el botón «P» para activar la función de salto de línea Add, y pulse «Q» para activar el eco local.
  6. Pulse Intro para volver al menú de configuración de nuevo. Para guardar esta configuración, seleccione una de las opciones «Guardar configuración». Para mostrar la terminal serie, seleccione «Salir».
  7. El XBee está inicialmente preparado para recibir y enviar datos. Usted tendrá que ponerlo en modo de comandos. Para entrar en modo comando, presione la tecla «+» 3 veces (es decir, + + +), pero no pulse Intro. El XBee debe aparecer en Aceptar.

 

Valores de Minicom para la configuración XBee

Valores de Minicom para la configuración XBee

Los comandos de terminal correctas para la primera XBee son:

  + + +
 ATMY 1
 ATWR

Y por segunda XBee

  + + +
 ATDL 1
 ATWR

El XBee debería devolver «OK» después de cada comando.

Si usted no es capaz de ver lo que está escribiendo, intente encender de nuevo el eco local: pulse Ctrl-A continuación, Z para mostrar el menú, y luego presione E.

Tenga en cuenta que el XBee automáticamente (y silenciosamente) el modo de configuración de salida si usted espera demasiado tiempo entre los comandos, así que si usted no está recibiendo bien después de un comando AT, intente introducir + + + de nuevo.

Fuente aqui