Creando un Servidor Raspberry Pi – XBee en python y conectando un Cliente Arduino – XBee

raspberrypi-mod-b modulo_xbee

ZigBee es un protocolo de comunicación que en palabras simples convierte el puerto serial de un dispositivo en inalámbrico. Para conectar dos dispositivos necesitaras una tarjeta XBee para cada dispositivo. XBee también tiene la potencialidad de conectar dispositivos en red mesh, es decir varios nodos conectados con un nodo central que recibe y coordina todos los mensajes, por que es interesante este protocolo? simplemente porque no es necesario que cada nodo se conecte al nodo central, si un nodo no tiene comunicación directa con el nodo central, puede pasar el mensaje a un nodo vecino y este a su vez pasarlo a otro hasta que alguno envíe el mensaje al nodo central. Suena como un protocolo ideal para Internet de las cosas, el único pero es el costo, cada tarjeta XBee tiene un costo elevado que hasta ahora nos ha hecho desistir de su uso cuando necesitamos conectar muchos sensores.

Terminando con la introducción vamos ahora al proyecto, se trata de conectar un nodo basado en un Arduino Uno + XBee Shield  + XBee con un nodo central compuesto por una Raspberry Pi + XBee Explorer + XBee. Así que manos a la obra

Materiales

Configuración de los módulos XBee

Para configurar los módulos XBee necesitaras el la aplicación X-CTU de Digi que puedes descargar desde www.digi.com en la sección Support/Diagnostic, Utilities & MIBs. Una vez instalado el software debes conectar un Modulo XBee al XBee Explorer y conectar el XBee Explorer a tu computador con un cable USB / Micro USB para configurarlo. Los pasos detallados los explicamos en un articulo de hace dos años pero que aun se mantiene vigente: Primeros pasos en XBee. La configuración consiste en crear un nodo Coordinator AT y un nodo Router AT. El nodo Coordinator sera el nodo central y el nodo Router uno de los nodos conectados en malla a la red ZigBee. Una vez que tengas los dos nodos configurados y poniendo especial cuidado en las direcciones de red y en el valor JV procedemos a crear y configurar el nodo cliente basado en Arduino.

Arduino Uno + XBee Shield

El nodo estará basado en Arduino Uno + XBee Shield, que en este caso use la XBee Shield V2.0 de Seeedstudio.com.

Lo primero es programar el Arduino. El programa será simplemente escribir un «Hola Raspberry Pi!» que enviaremos cada 5 segundos al puerto serial del Arduino, el cual será transmitido a la red ZigBee por el módulo XBee. Claramente este es un programa básico para ilustrar como es la comunicación entre el Nodo y el Servidor, la idea a futuro es conectar algún sensor y enviar esos datos en forma remota.

ArduinoXBee

Como es habitual en el IDE Arduino, compilamos y cargamos el sketch en el Arduino. Con el Arduino programado procedemos a montar el Nodo ya que no se puede programar el Arduino si el Modulo XBee esta montado  ya que es una puerta serial y el IDE al intentar enviar el sketch genera un error.

Como cualquier shield de Arduino la XBee Shield se monta utilizando los pines sobre la placa Arduino, luego debes montar el modulo XBee configurado como Router AT sobre la XBee Shield poniendo mucha atención de no colocarlo en la posición incorrecta. Cambien debes fijarte bien en la posición de dos jumpers que vienen sobre la placa, en mi caso venían mal puestos y las primeras pruebas no funcionaron (ver imagen con la posición correcta).

Xbeeshield_01

Y eso es todo lo que necesitamos hacer en el nodo.

Servidor Raspberry Pi + XBee Explorer + XBee

La programación en el servidor la realizaremos utilizando el lenguaje python, el cual para poder comunicarse con el XBee Explorer necesita que instalemos la librería python-serial. La Raspberry Pi debe estar instalada con su sistema operativo original que incluye python, pero que probablemente no tenga la librería python-serial, la cual deberemos instalar. Como ya hemos visto en tutoriales anteriores, instalar software o librerias en Linux es bastante simple, primero debes conectarte a las Raspberry Pi remotamente o desde su consola y luego ejecutar el comando:

sudo apt-get install python-serial

Si no has ejecutado sudo antes podría pedirte la contraseña del usuario pi. El resultado debería verse mas o menos así

raspberrypi_python-serial

Y la librería queda instalada! ahora a programar el servidor.

El programa servidor es muy simple, solo leerá el puerto USB en donde tendremos conectado el XBee Explorer y mostrara lo que lee por pantalla.

python-lee-puerto-serialAntes de ejecutarlo debemos montar el modulo XBee configurado como Coordinator AT sobre el XBee Explorer y conectarlo con un el cable USB – Micro USB a la Raspberry Pi utilizando el puerto USB inferior. Para ejecutar el programa necesitamos nuevamente permisos de super usuario (para leer el puerto /dev/ttyUSB0) por lo que debemos usar el comando sudo  y ejecutar:

sudo python xbee_server.py

Si todo esta bien configurado y el XBee Router AT se ha conectado correctamente con el XBee Coordinator AT, la salida debería verse así

raspberrypi_xbee_server

Como pueden ver el Arduino esta enviando correctamente el saludo «Hola Raspberry Pi!» mediante la red ZigBee que acabamos de configurar.

Que se puede realizar con esto? yo estoy ahora configurando un sensor de lluvia, la idea es que cuando se ponga a llover el Arduino envíe una notificación a la Raspberry Pi que podría tuitear o enviarme un SMS, Telegram o Whatsapp, pero eso sera para otro tutorial.

 

 

Author: José Zorrilla

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

20 thoughts

  1. A pesar de lo simple del código no he logrado la comunicación.
    Mi primer setuo fue con un PC y un notebook, un XBee como Router y el otro como Coordinador. A través de XCTU el router envía exitosamente hacia el Coordinador sin embargo los mensajes del Coordinador no aparecen en el XCTU.
    Luego, el XBee Coordinador lo conecto a Raspberry, averiguo el dev (USB0 usualmente) y ejecuto tu código…y nada, el Raspberry no se da por enterado…alguna sugerencia?

  2. Me parece interesante el desarrollo, sin embargo creo que el Arduino está demás. Una de los requisitos del iot es que sea de bajo costo y el arduino solo lo incrementa. El xbee puede ser usado como endpoint y reportar sus entradas directamente al rpi sin usar un micro.

    Saludos.

    1. Juan, si, tienes razon, la gracia de colocar un Arduino es darle mas inteligencia al nodo para que pueda tomar desiciones en forma autonoma. Con respecto a IoT y XBee, pienso lo mismo que tu, la gracia es el bajo costo, por eso XBee no ha sido la revolucion que se esperaba, son muy caros, mas que el mismo Arduino. Es mejor trabajar con nodos que usan radio frecuencia a costos menores.
      Saludos

  3. Buenas.
    Tengo un problema a ver si me puedes ayudar.
    El xbee router manda la información al coordinador ya que lo puedo ver en el ordenador con el X-CTU.

    El problema lo tengo con la RaspBerry.

    Ejecuto el comando lsusb y me aparece:
    Bus 001 Device 005: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO). El cual creo que es el Xbee.

    Ejecuto el scrip siguiente de Python

    #! /usr/bin/python
    import serial
    ser=seriaal.Serial(‘dev/ttyUSB0’,9600)
    print ‘conectando con puerto serial’
    while true:
    incoming = ser.readline().strip()
    print incoming

    Cuando lo corro me da el siguiente problema:
    serial.serialutil.SerialException: could not open port dev/ttyUSB5: [Errno 2] No such file or directory: ‘dev/ttyUSB5’

    ¿Ves algo que haga mal? Gracias de antemano.

    1. Estimado, todos los dispositivos de un sistema operativo tipo unix estan en la carpeta /dev, el error esta en que te falta en simbolo «/», es decir, realmente estas accediendo a la carpeta dev en la ruta actual, no en la raiz del sistema de archivos de la Raspberry Pi.
      Saludos

  4. Hola, muchas gracias por este tutorial es de los mejores que he encontrado!
    Tengo una pregunta, yo no cuento con la Xbee Shield V2.0 para el arduino, asi que conecte el xbee por medio de sus pines…al ejecutar el programa la raspberry no recibe nada.
    es porque no utilizo la shield?

    1. Laura, pueden ser muchas cosas, lo ideal es que pruebes si el Arduino esta transmitiendo correctamente primero y si las placas XBee estan correctamente configuradas.

      Saludos
      JZ

    1. Koyer, no, no hemos trabajado con la API2 ya que usamos otros modulos mas baratos y de codigo abierto, XBee tiene esa desventaja.
      Saludos
      JZ

  5. Hola

    puedo ver que se conecta bien, pero no veo los mensajes que envía arduino. puedo verlos desde ide (monitor serial) de la raspberry, pero no desde la terminal. ayudaaa!!!!! 🙁

    1. Hola Cristopher, verifica que estes asignado correctamente el puerto usb donde tienes conectado el XBee en la Raspberry Pi, eso es el parametro /dev/ttyUSB0 para el primer puerto, /dev/ttyUSB1 para el segundo y asi, siguiendo el formato, la Raspberry Pi tiene 4 puertos USB.
      Lo otro que puede afectar es la velocidad del puerto serial, esta debe ser la misma que la configurada en el XBee.
      Cuentanos como te va con esos parametros.
      Saludos
      JZ

  6. Hola, interesante el tutorial.
    Se puede implementar lo mismo con el modulo Core2530 (B)?. Quería conseguir varios de estos módulos ya que son mas baratos que los módulos xbee. Se podría reemplazar el Xbee Explorer por un modulo adaptador usb?.

    Gracias de antemano.

      1. hola estoy en un proyecto donde quiero graficar la señal de un sensor de presion y ahora ya puedo graficar sin los xbee pero quiero meter los xbee como podria hacerlo este es mi codigo
        import time
        import warnings
        from collections import deque
        import serial
        import numpy as np
        import matplotlib.pyplot as plt
        N = 200
        data = deque([0] * N, maxlen=N)

        plt.ion()
        fig, ax = plt.subplots()
        plt.xlabel(‘tiempo (s)’)
        plt.ylabel(‘presion (psi)’)
        plt.title(‘MONITOREO RED PRINCIPAL AIRE COMPRIMIDO’)

        ll, = ax.plot(data)

        # Abrimos la conexión con Arduino
        arduino = serial.Serial(‘COM8’, baudrate=9600, timeout=1.0)
        arduino.setDTR(False)
        time.sleep(1)
        arduino.flushInput()
        arduino.setDTR(True)
        with arduino:
        while True:
        try:
        line = arduino.readline()
        if not line:
        continue
        xx, yy = np.fromstring(line.decode(‘ascii’, errors=’replace’),
        sep=’ ‘)
        data.append(yy)
        ll.set_ydata(data)
        ax.set_ylim(min(data) – 10, max(data) + 10)
        plt.pause(0.001)
        except ValueError:
        warnings.warn(«Line {} didn’t parse, skipping».format(line))
        except KeyboardInterrupt:
        print(«Exiting»)
        break

        1. Hola Luis, un XBee se trata igual que como se trata el puerto serial del un Arduino, es como un puerto serial remoto, en teoria solo deberias modificar tu codigo con el baudrate del XBee.

          Te sugiero que cuando desees que veamos tu codigo, crees una cuenta en GitHub y asi podemos revisarlo y hasta probarlo sin problemas, esto porque el lenguaje Python utiliza el caracter de tabulacion para indicar los bloques de programa y estos se pierden en un comentario.

          Saludos
          JZ

  7. esta interesante y estoy realizando un proyecto en red de sensores para lúmenes y de distancia para un sistema de iluminación en un parque en la cual quiero crear una red zigbee ¿sera factible la red mesh (nodal) o que me sugieres? es un parque publico.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *