Zigbee: protocolo de comunicaciones inalámbricas basado en el estándar 802.15.4

22 08 2012

ZigBee es un protocolo de comunicaciones inalámbricas basado en el estándar 802.15.4, está pensado para comunicaciones a baja velocidad entre dos o varios dispositivos, se pueden formar redes con miles de dispositivos comunicandose entre sí, por lo que es ideal para muchas aplicaciones.

ZigBee es desarrollado por la ZigBee Alliance, formada por cientos de compañias que quieren solventar la necesidad de un estándar para comunicaciones a baja velocidad, con un bajo coste de implementación y donde los dispositivos que forman parte de una red pueden requerir un bajo consumo, llegando a estar funcionando durante años con un par de pilas.

Se basa en el estándar de comunicaciones 802.15.4 que define el hardware y software de las capas physical (Phy) y media access control (MAC). Cada capa es responsable de una serie de funciones necesarias para la comunicación, ZigBee añade capas sobre las dos capas anteriores del 802.15.4, una capa no sabe nada sobre la capa que está por encima de ella y cada capa que añadimos añade una serie de funciones a la base de las inferiores.

Cualquier dispositivo de un fabricante que soporte este estándar de comunicaciones y pase la certificación correspondiente, podrá comunicarse con otro dispositivo de otro fabricante distinto. Un dispositivo ZigBee estaría formado por una radio según el estándar 802.15.4 conectada a un microcontrolador con la pila (stack) de ZigBee, donde se implementan las capas por encima de las del 802.15.4. Esta pila está diseñada para poder ser implementada en microcontroladores de 8 bits.

Características de las redes/dispositivos ZigBee serían las siguientes:

  • Velocidad de transmisión entre 25-250 kbps.
  • Protocolo asíncrono, half duplex y estandarizado, permitiendo a productos de distintos fabricantes trabajar juntos.
  • Se pueden formar redes que contengan desde dos dispositivos hasta cientos de ellos.
  • Los dispositivos de estas redes pueden funcionar en un modo de bajo consumo, lo que supone años de duración de sus baterías.
  • Opera en la frecuencia de 2.4 GHz (16 canales) y también en las frecuencias de 868 MHz y 915 MHz.
  • Es un protocolo fiable, la red se organiza y se repara de forma automática y se rutean los paquetes de manera dinámica.
  • Es un protocolo seguro ya que se puede implementar encriptación y autentificación.

Se puede decir que ZigBee ocupa el vacío que hay por debajo de Bluetooth, para comunicaciones de datos que no requieren altas velocidades.

Una comparativa con Wifi y Bluetooth:

Los campos de aplicación de ZigBee son muchos, todos en los que se requiera transmitir comandos o recoger lectura de sensores, etc.. y no interese o no sea práctico usar cables.

Campos de aplicación pueden ser:

  • Agricultura: redes de sensores de bajo consumo en el campo para medir y recoger distintos parámetros.
  • Domótica, automatización de edificios y hogares, control industrial.
  • Atención sanitaria: recoger información de sensores en los pacientes, un ejemplo puede ser la ropa inteligente.
  • Control remoto de electrónica de consumo, como el mando de la televisión, luces, etc.

Podemos encontrar más sobre los distintos campos de aplicación de esta tecnología y sus estandares aquí.

La Alianza ZigBee también define unos llamados perfiles de aplicación, que especifican como los dispositivos ZigBee deben funcionar/comunicarse dentro de un determinado campo/mercado. Por ejemplo el perfil de domótica describiría como un sensor de temperatura debe mandar sus lecturas a un termostato, y como éste controlaría por ejemplo un radiador. De esta forma se pueden integrar dispositivos de distintos fabricantes para unas tareas determinadas.

En las redes ZigBee encontramos tres tipos de dispositivos:

  • Coordinator: en toda red sea de doscientos o de dos dispositivos, debe haber un coordinador, sólo puede haber uno por red y entre sus tareas están las de formar y gestionar la red.
  • Router: son dispositivos de la red que tienen la capacidad de enviar, recibir y enrutar información. Pueden actuar como mensajeros entre dispositivos que están muy alejados para establecer una comunicación directamente, los dispositivos ZigBee no están pensados para comunicaciones de largas distancias, sino para trabajar en redes de sensores y cubrir esas largas distancias pasando la información entre los distintos nodos.
  • End device: estos serían los dispositivos de bajo consumo. El coordinador y los routers deben estar siempre encendidos ya que pueden actuar como mensajeros entre otros dispositivos, por lo que lo normal puede ser conectarlos a la red eléctrica. Los end devices pueden enviar y recibir información pero no pueden actuar como mensajeros entre otros dos dispositivos de la red, lo normal es que el end device esté en un modo de bajo consumo y se despierte cuando quiere enviar o recibir información, alargando la duración de sus baterías durante mucho tiempo. Como los end device pueden estar dormidos en un modo de bajo consumo, necesitan estar asociados a un coordinador o a un router, que guarden los mensajes que han sido enviados para ellos mientras estaban dormidos y se los hagan llegar cuando despierten.

En una red ZigBee debe haber un coordinador (sólo uno) y todos los routers y end devices que queramos, la red más sencilla sería un coordinador más un router o end device.

Muchos son los fabricantes de dispositivos electrónicos que nos ofrecen radios y módulos ZigBee. La combianción de una radio 802.15.4 y un microcontrolador que implemente el stack ZigBee es lo que se llama un módulo ZigBee. En ese mismo microcontrolador suele quedar memoria suficiente para implementar una pequeña aplicación/programa, pero para ello necesitaremos herramientas sofware y hardware del fabricante que nos permitan hacer y descargar los programas en ese microcontrolador del módulo, herramientas que probablemente no sean nada baratas.

Para comenzar lo más sencillo suele ser comprar un módulo ZigBee, y en lugar de utilizar el microcontrolador del propio módulo para que corra nuestro programa de aplicación, utilizar otro microcontrolador externo donde programar nuestra aplicación y usar el módulo ZigBee sólo para que realice la comunicación, el microcontrolador externo se comunica con el interno para enviar y recibir datos a través del módulo.

Antes de empezar con los módulos y tras la breve introducción de la idea que me he hecho de ZigBee después de leer (espero no haberme equivocado mucho..), enlazo bibliografía sobre el tema:

Espero poder ir desarrollando proyectos de electrónica con ZigBee en este blog, para ir aprendiendo sobre el tema, ya que las aplicaciones son muchas y puede ser algo muy útil y entretenido.

Para empezar con ZigBee me he decidido por comprar unos módulos de Digi: XBee Series 2, no confundir con la Serie 1 que son módulos 802.15.4 pero no implementan ZigBee ni permiten montar redes de varios dispositivos.

En la foto se pueden ver varios módulos ZigBee de Digi International, podemos comprarlos de dos tipos: los módulos normales S2 y los módulos PRO S2B. La diferencia es que los módulos PRO tienen mayor alcance, mayor consumo y cuestan más dinero, también los S2B traen un segundo microcontrolador interno (además del que implementa el stack de ZigBee). Se ve como los módulos pueden llevar varios tipos de antena, para empezar a probar lo mejor es cogerse los módulos S2 con la antena de cable como se ve en la imagen de debajo.

Estos módulos tienen una serie de patillas para ser soldados a un circuito impreso, la separación de estas patillas no es de paso estándar (2.54 mm) de protoboard, por lo que no los podrémos pinchar directamente en una protoboard o soldar en una placa de topos, necesitaremos un adaptador. La separación entre las patas es de 2 mm.

El módulo está  diseñado a partir de un chip de Ember con una radio y un microcontrolador, el microcontrolador interno saca al exterior sus pines a través de las patillas del módulo, en su datasheet se puede encontrar la descripción detallada de cada una de ellas.

El microcontrolador interno del módulo se comunica con el exterior mediante una UART, esta UART la podemos utilizar para cambiar el firmware del módulo a través de un bootloader que lleva ya grabado, o para conectar el microcontrolador interno con la UART de un microcontrolador externo para que éste envie y reciba datos a través del módulo XBee.

Como se puede ver en la imagen una primera forma de utilizar estos módulos es usando un microcontrolador externo que se comunique con el módulo XBee a través de su puerto serie. El módulo XBee funciona a 3.3V, por lo que si nuestro microcontrolador externo funciona a 5V nos tocará hacer una adaptación de niveles entre las líneas de comunicación del microcontrolador externo y del módulo XBee.

Si miramos el datasheet vemos como muchos de los pines del módulos XBee se pueden configurar como entradas o salidas digitales, o como entradas analógicas. Lo que nos permite utilizar el módulo para leer directamente un sensor o activar algún dispositivo sin la necesidad de tener que añadir un microcontrolador externo al proyecto, lo que reduce el consumo y el coste. Por ejemplo podemos usar el módulo para leer un sensor de temperatura y mandar la información, alimentando todo con dos pilas y sin hardware adicional. Según vaya avanzando espero ir poniendo por aquí estas cosas, ya que el tema de ZigBee es amplio, de momento el objetivo de la entrada de este post es establecer una comunicación entre dos módulos XBee para probarlos.

Para poder integrar los módulos en nuestros proyectos sin necesidad de hacer un pcb necesitamos hardware adicional:

XBee Explorer USB.

Esta placa nos va a permitir comunicar el pc con el módulo XBee, es un chip FTDI que hace de puente entre el USB del PC y la UART del microcontrolador. Esta placa hay que comprarla ya que se va a utilizar para actualizar, descargar firmware y configurar los módulos XBee que vayamos a utilizar en nuestros proyectos. También la vamos a utilizar para dotar a nuestro PC de conexión ZigBee y conectarlo a la red de dispositivos para enviar y recibir datos, conectamos un módulo a la placa conectada al puerto USB del PC. Para cambiar el firmware y configurar los módulos utilizamos el X-CTU, un programa de Digi que explico más abajo.

Breakout board.

Si queremos pinchar el módulos XBee en una placa de prototipos para hacer pruebas debemos comprar un placa que adapte el paso de los pines del módulo al paso de los pines de la protoboard. Además de los conectores correspondientes que debemos soldar a la placa adaptadora y un intercambiador de niveles de tensión si el microcontrolador externo va a funcionar a 5V. Enlazo los componentes necesarios:

XBee Explorer Regulated.

Si disponemos de una placa como vinciDuino podemos pinchar directamente el módulo XBee a nuestra placa con el microcontrolador externo, esta placa tiene un regulador de tensión de 3.3V para alimentar el módulo XBee, y un diodo para hacer una adaptación de niveles. Para conectar la placa a vinciDuino necesitaremos comprar el conector que se ve en la parte inferior de la imagen: conector. Los leds que se ven en la placa (la XBee Explorer USB también los tiene, nos indica cuando el módulo recibe o envia datos (DIN y DOUT) y la intensidad de la señal en el último paquete recibido (RSSI).

Los módulos XBee se pueden encontrar también en Sparkfun:

Las características de estos módulos según su datasheet son:

  • Alcance en interiores: 40 m.
  • Alcance en exteriores: 120 m.
  • Potencia de transmisión: 2 mW.
  • Sensibilidad del receptor: -96 dBm
  • Consumo de corriente en transmisión: 40 mA @ 3.3V
  • Consumo de corriente en recepción: 40 mA @ 3.3V
  • Consumo de corriente durmiendo: < 1uA

Una vez que tenemos nuestros módulos y el hardware adicional listo lo siguiente es probarlos:

Para poder utilizar los módulos lo primero es configurarlos, para ello tenemos que bajar el X-CTU de la página de Digi, con el podemos cambiar el firmware de los módulos XBee, también lo podemos usar como terminal serie para mandar y recibir datos por el módulo desde el PC.

Bajamos e instalamos el programa, diciendo que si a las actualizaciones si nos preguntan. Conectamos la placa XBee Explorer USB con uno de los módulos XBee al puerto USB y abrimos el programa X-CTU.

Dejamos todos los parámetros de la comunicación serie como vienen por defecto, seleccionamos el puerto donde está conectado el módulo al PC (en mi caso aparece sólo uno) y le damos a Test/Query para probar el módulo. Si todo está bien nos devolverá algo como esto:

Un cuadro de diálogo donde podemos ver el tipo de módulo que hemos pinchado en la XBee Explorer USB, la versión del programa interno del microcontrolador que lleva grabada y su número de serie. Este número de serie de los módulos es único, es decir no hay dos módulos ZigBee con el mismo número de serie igual.

En la parte de debajo podemos ver el número de cada módulo, los primeros 32 bits 0013A200 se corresponde con un número asignado para el fabricante, todos los módulos XBee tendrán el mismo, y los 32 bits siguientes 40813E2A son individuales para cada módulo, no habrá dos módulos con estos números iguales. Ya que este número se puede usar para identificar a un módulo dentro de la red y comunicarse con él.

Vamos a hacer el ejemplo más simple, coger estos dos módulos XBee y configurar uno como Coordinator y otro como Router para establecer una comunicación entre ellos. Los módulos llevan un microcontrolador que corre un programa, dependiendo de que tipo de dispositivo vaya a ser el módulo (coordinator, router o end device) y de su modo de comunicación por su puerto serie con el mundo exterior, hay que grabar un programa u otro en él mediante el X-CTU.

Para ello nos vamos a la pestaña de Module Configuration:

Y le damos al botón Read para leer el firmware (programa del microcontrolador) que lleva grabado el módulo:

Nos aparecen una serie de parámetros de configuración y unas listas desplegables, donde podemos seleccionar distintos programas para grabar en los módulos en función del tipo de dispositivo que queremos que sean en la red. Con las 3 listas desplegables Modem XBee, Function Set y Version seleccionamos el porgrama a descargar en el módulo.

Modem XBee se refiere al tipo de módulo que hemos comprado, en nuestro caso seleccionamos XB24-ZB para los módulos de la serie dos, si tuviesemos pinchado un módulo PRO tendríamos que seleccionar (o nos saldría) XBP24-ZB. En la siguiente lista Function Set tenemos varias opciones:

Podemos ver como podemos decidir si grabar un programa para que el módulo funcione como un coordinator, router o end device, y dentro de cada una de estás 3 opciones podemos elegir otras más , como que lea un sensor, o active una de sus salidas. La decisión más importante es decidir si vamos a configurar los módulos como AT o como API.

Con la opción de AT o API decidimos como nos vamos a comunicar con el puerto serie (la UART) del microcontrolador interno del módulo:

  • Si seleccionamos la opción de AT lo que el módulo reciba por el pin DIN de su UART, lo manda por la comunicación inalámbrica, es decir si le escribimos 10100000 el módulo transmitiría 10100000, así de simple. Y de igual forma lo que el módulo recibe se lo transmite al microcontrolador como le llega por el pin DOUT. Si mandamos a DIN del módulo los caracteres +++, el módulo entra en modo comandos, y nos permite configurar distintas opciones del módulo a través de su puerto serie.
  • Si seleccionamos API la comunicación con el módulo es más compleja, ya no entra y sale lo que mandamos al módulo por el puerto serie, sino que nos comunicamos con el módulo XBee mediante frames, es decir los datos tienen que ir estrucutrados según un orden establecido, con bytes de start, de longitud, de tipo de datos, de checksum, etc… Con esta opción de comunicación con el módulo tenemos muchas más posibilidades de comunicación que de la otra forma, podemos mandar comandos a otros módulos para configurarlos de manera remota, saber quien es el remitente del mensaje, saber si los paquetes han llegado, etc..

Para probar los módulos lo más simple, configurar un módulo XBee como Coordinator AT y el otro como Router AT, lo primero es apuntar la dirección de 64 bits única de los módulos, el módulo con dirección 0013A2004081372A va a ser el coordinator, y el módulo con dirección 0013A200407E6FCF va a ser el router.

Primero configuramos el coordinator, pinchamos el módulo en la placa XBee Explorer USB conectada al pc y nos vamos a la pestaña anterior de Function Set y seleccionamos ZigBee Coordinator AT, en modem XB24-ZB y en versión la última. Con esto decimos a X-CTU que vamos a grabar un programa en el módulo para que éste funcione como coordinator en modo AT, lo siguien es seleccionar los parámetros de la comunicación.

Lo primero es establecer el PAN ID, el número de identificación de nuestra red, todos los módulos que se comuniquen dentro de una red deben de tener el mismo número, establecemos como PAN ID por ejemplo el número 555.

Lo siguiente es establecer la Destination Address High y Low, es decir el número de 64 bits de nuestro router que hemos anotado antes.

Estableciendo estas direcciones le decimos a nuestro coordinator a que módulo de la red le va a mandar la información que reciba por su puerto serie, entrando en comandos AT con +++ podemos cambiar la dirección de destino y enviar información a otro módulo distinto al inicial. Una vez que hemos puesto las direcciones le damos a Write para que se descargue el programa correspondiente en el módulo XBee.

Ahora desconectamos la placa del puerto USB, cerramos el programa y pinchamos el módulos que va a funcionar como router y abrimos el programa para configurarlo, igual que antes nos vamos a la pestaña de modem configuration, seleccionamos el modo de funcionamiento y metemos el PAN ID y la dirección de 64 bits del coordinator, una vez hecho le damos a write.

Ya tenemos los módulos listos para ser usados, quitamos el router de la placa USB, cerramos el programa. Pinchamos el módulo del coordinator en la placa USB y lo conectamos al PC y abrimos en programa y nos vamos a terminal dejando todas las opciones de la configuración serie por defecto como están.

Ahora tenemos un módulo XBee conectado al PC y emitiendo y recibiendo datos, los carácteres que tecleemos aparecen en azul en el terminal, y son los que estamos enviando a la dirección de destino que hemos configurado en el coordinator, si tecleamos +++ podemos ver como entramos en modo de comandos, y si entramos y tecleamos  por ejemplo atid el módulo nos devuelve la ID de la red que hemos configurado. Todos los parámetros que hemos configurado en el X-CTU anteriormente (PAN ID y las direcciones de destino) se pueden configurar a través del terminal serie, del modo comandos se sale de manera automática después de un tiempo (10 s por defecto) sin teclear nada.

En un lado de la comunicación tenemos un coordinador conectado a un terminal serie de un pc, desde donde podemos enviar y recibir datos. Podríamos conectar el router a otro terminal serie del PC y comunicar ambos terminales mediante ZigBee, pero sólo tengo una XBee Explorer USB (abusan bastante del precio por esta placa). Por lo que usando una de las otras placas para los módulos vamos a conectar el router a un microcontrolador, como se ve en la imagen.

Hay que conectar el pin RX de la UART del microcontrolador con el pin DOUT del módulo XBee, y el pin TX de la UART del microcontrolador con el pin DIN de l módulo XBee, la placa donde pinchamos la XBee ya lleva un regulador para dar 3.3V al módulo y un diodo para adaptar el nivel de tensión de los 5V del microcontrolador a los 3.3V del módulo en la línea DIN.

Los parámetros de la UART del microcontrolador los debemos configurar como los que hemos dejado por defecto en el módulo: 9600, 8, 1…

Una vez que configuramos la UART del microcontrolador, lo que escribamos en el terminal del PC le llega al microcontrolador, y los caracteres que mandemos por la UART del microcontrolador aparecerán en el terminal del PC. Los caracteres que escribimos en el terminal aparecen en azul y los que recibimos en rojo.

Para realizar la prueba grabamos un programita sencillo en el microcontrolador, que encienda el led L de la placa de vinciDuino cuanto pulsemo ‘e’ en el pc y lo apague cuando pulsemos la letra ‘a’, cada vez que lo encienda o lo apague el microcontrolador le mandará al pc “LED1″ o “LED0″. Adjunto el video de del funcionamiento donde se pueden ver también los leds indicadores de las placas  y el código de la prueba al final.

Las aplicaciones de ZigBee son muchas y el tema de las redes de objetos inteligentes conectados bastante interesante, espero poder ir desarrollando proyectos de estos temas en el blog según voy aprendiendo sobre este estándar.

Código de la prueba en vinciDuino.

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#define BAUD 9600
#define MYUBRR ((F_CPU/(BAUD*16UL))-1)

#define LEDRX PORTB0
#define LEDTX PORTD5	
#define LEDL PORTC7

void inicializar_micro(void);
void USART_Transmit( unsigned char data );
unsigned char USART_Receive( void );

int main(void)
{
	unsigned char dato = 0;

	inicializar_micro();

	PORTD |= (1<<LEDTX);
	PORTB |= (1<<LEDRX);
	PORTC &= ~(1<<LEDL);

    while(1)
    {
		dato = USART_Receive();

		if(dato == 'e')
		{
			PORTC |= (1<<LEDL);
			USART_Transmit(' ');
			USART_Transmit('L');
			USART_Transmit('1');
			USART_Transmit(13); 		
		}

		if(dato == 'a')
		{
			PORTC &= ~(1<<LEDL);
			USART_Transmit(' '); 
			USART_Transmit('L'); 
			USART_Transmit('0');
			USART_Transmit(13);    
		}   
    }
}

void inicializar_micro(void)
{
       //Configurar entradas y salidas.	
       DDRB = 0x01; //0000 0001
       PORTB = 0x00;
       DDRD = 0x20; //0010 0000
       PORTD = 0x00;
       DDRC = 0x80; //1000 0000
       PORTC = 0x00;

       //Habilitar el regulador interno de 3.3 V.
       UHWCON |= (1<<UVREGE); 

       //Inicializar usart.
       UBRR1H = (MYUBRR>>8);
       UBRR1L = MYUBRR;
       // Enable receiver and transmitter 
       UCSR1B = (1<<RXEN1)|(1<<TXEN1);
       // Set frame format: 8data, 1stop bit 
       UCSR1C = (3<<UCSZ10)|(1<<UCSZ11);

}

void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSR1A & (1<<UDRE1)) );
    /* Put data into buffer, sends the data */
    UDR1 = data;
}

unsigned char USART_Receive( void )
{
    /* Wait for data to be received */
    while ( !(UCSR1A & (1<<RXC1)) );
    /* Get and return received data from buffer */
    return UDR1;
}






Fuente: http://webdelcire.com/wordpress/



Acciones

Information

One response

26 08 2012
Zigbee: protocolo de comunicaciones inalámbricas basado en el … | Domot1ca

[…] is the original post: Zigbee: protocolo de comunicaciones inalámbricas basado en el … debe-mandar, esta-forma, por-ejemplo, pueden-integrar, ste-controlar, […]

Me gusta




A %d blogueros les gusta esto: