lunes, 18 de mayo de 2015

TRANCEPTORES DE DE BAJA CARGA PARA SENSORES IoT



TRANSCEPTORES DE DE BAJA CARGA PARA SENSORES IoT

Una de las aplicaciones mas comunes de la tecnología IoT es para el desarrollo de sensores remotos autónomos, los cuales se pueden desplegar en forma de redes o grillas para tareas de monitoreo; cada uno de estos nodos necesita de un protocolo de baja carga que permita comunicar la información de forma simple y con el menor consumo de potencia posible.
En esta entrada trataremos algunos de los aspectos a considerar para elegir estos módulos y evaluaremos un modulo bastante potente para este propósito el trasceptor nRF24L01+

Sobre las redes de baja potencia con perdidas LLN
Las redes LLN (Low power and Lossy networks), son redes diseñadas para sistemas embebidos, los cuales están limitados por el suministro de potencia y típicamente están conectadas por enlaces como IEEE 802.15.4, Bluetooth, Wifi de baja potencia y RF.
Generalmente estas redes tienen 5 características que las distinguen:
a) Operan con complicado y muy pequeño vinculo de estado, es decir que a nivel de linea se les dificulta llevar un estado de la conexión.
b) En muchos casos optimizan la trama de comunicación a fin de ahorrar energía.
c) Los patrones de trafico no son siempre comunicaciones de unicast, puede incluir enlaces punto a punto y punto a multipunto.
d) Restringen los tamaños de las tramas en función del enlace físico disponible.
e) Deben ser muy cuidadosos para enrutarse ya que no pueden desperdiciar muchos recursos de red.
Estas cinco características determinas las especificaciones de los chips usados como transceptores, los cuales además condicionaran su alcance a la disponibilidad de potencia, que es el parámetro de diseño mas critico ya que la mayoría de aplicaciones para IoT están condicionadas por su capacidad de autonomía energética, la cual se obtiene de fuentes de muy baja potencia.

El módulo nRF24L01+
El nRF24L01+ es un transceptor embebido de 2.4Ghz con un protocolo de banda base integrado para el desarrollo de aplicaciones inalámbricas con un consumo mínimo de energía, configurable con comando de una sola palabra lo que simplifica el desarrollo de aplicaciones usando cualquier microcontrolador.
Es fácilmente programable a través de una interfaz SPI que actua en modo esclavo y tolera velocidades de reloj de hasta 10Mbps, con un radio de comunicación de 126 canales, velocidades de transferencia de 250kbps, 1Mbps y 2Mbps, tres modos de operación y regulador de voltaje integrado para un óptimo consumo de potencia que puede variar en los modos pasivos entre 0.9uA a 400 uA y durante los modos activos hasta 13.5mA.
El diagrama esquemático se muestra en la siguiente  figura:
 








La comunicación con el modulo se basa en las 4 lineas de la interfaz SPI: MISO que representa la salida de datos serial del modulo, MOSI que es la entrada de datos serial, SCK entrada para la señal de reloj y CSN que sirve como entrada para que la interfaz esclavo SPI sea seleccionada, las otras lineas CE, es un selector de todo el modulo y IRQ es la linea para disparar interrupciones.

Demandas energéticas del módulo nRF24L01+
Una de las ventajas de este modulo es su habilidad para el ahorro de la energía, característica vital para las aplicaciones IoT, así este puede programarse en modo pasivo o activo, la selección de estos modos se basa en el pin CE si dicho pin esta en cero lógico el módulo funciona en modo pasivo, por el contrario funcionara en modo activo.
Para el caso de los modos activos puede funcionar como receptor RX o Transmisor TX, para este ultimo modo el consumo de energía depende de la potencia de salida la cual es programable y gobernada por un amplificador embebido que soporta potencias desde -18dBm a 0 dBm, con consumos de corriente desde 7 mA a 11.3 mA; para el caso del receptor la potencia consumida dependerá de la velocidad de comunicación, así para la velocidad mínima 250Kbps se consumirán 12.6 mA y para la máxima 2Mbps serán 13.5 mA.
El modo pasivo soporta tres estados configurables que son: Power-Down el cual consume el mínimo valor de potencia del chip que es de 0.9 uA; Stanby-I con un consumo de 26 uA y Stanby-II con un consumo de 320 uA, la diferencia entre estos dos últimos modos esta en la velocidad de cambio a los modos activos, para el modo Stanby-II se mantiene un buffer para evitar reducir el reloj por lo tanto es mucho mas rápida su transición.
Con estas características es posible obtener múltiples combinaciones de operación, que nos permitan planificar el consumo energético del modulo.

Lógica de programación del módulo nRF24L01+
La programación del modulo se basa en 11 comando con una extensión de 1 byte enviados por la interfaz SPI, sobre 26 registros de tamaño variable, los comandos para la programación del módulo son los siguientes:
R_REGISTER: Comando=000AAAAA Datos= 1 a 5 bytes: Comando de lectura y registro status, AAAAA=dirección del registro
W_REGISTER: Comando=001AAAAA Datos= 1 a 5 bytes: Comando de escritura y registro status, AAAAA=dirección del registro
R_RX_PAYLOAD: Comando=01100001 Datos= 1 a 32 bytes: Lee la carga del RX, la carga se borra una vez leido (inicia con byte 0)
W_TX_PAYLOAD: Comando=10100000 Datos= 1 a 32 bytes: escribe la carga del TX, la carga se borra una vez leido (inicia con byte 0)
FLUSH_TX: Comando=11100001 Datos= 0 bytes: Limpia el buffer FIFO del TX
FLUSH_RX: Comando=11100010 Datos= 0 bytes: Limpia el buffer FIFO del RX, nunca ejecutarse durante una transmisión de ack
REUSE_TX_PL: Comando=11100011 Datos= 0 bytes: Reusar la ultima carga enviada, se mantiene activo hasta usar FLUSH_TX o W_TX_PAYLOAD
R_RX_PL_WID: Comando=11100011 Datos= 1 bytes: Lee el ancho de la carga del RX.
W_ACK_PAYLOAD: Comando=10101PPP Datos= 1 a 32 bytes: Escribe la carga junto con el ACK PPP=# de payload pendientes 000 a 101
W_TX_PAYLOAD_NOACK: Comando=10110000 Datos= 1 a 32 bytes: Usado en modo TX, desactiva el AUTOACK en un paquete especifico.
NOP: Comando=11111111 Datos= 0 bytes: No operación, usado para lecturas solamente del registro STATUS
Por cada comando enviado el módulo automáticamente responde con el valor del registro de estado, los diagramas de tiempo de las operaciones de escritura y lectura del módulo se muestran en los siguientes gráficos:
El módulo se puede programar con los microcontroladores Arduino, PIC, HC12 o un FPGA, a fin de dejar una secuencia que pueda aplicarse a cualquier arquitectura los pasos de programación se describirán de la manera mas general posible para mayores detalles se recomienda consultar la hoja técnica del fabricante y deben tomarse en cuenta las siguientes consideraciones:
- El modulo nRF24L01+ funcionara como esclavo para cualquier tipo de configuración
- Cada nuevo comando debe iniciar con una transición descendente de la linea CSN.
- Los comandos serializados y los datos se envían en el siguiente formato:
- Palabra de comando: MSBit a LSBit <un solo byte>
- Palabra de datos: LSByte a MSByte donde el MSBit de cada byte va primero.
- Las ejecuciones de escritura de registro solo se pueden efectuar en los modos pasivos.

Paso 1: Establecer las características del transceptor, rol, velocidad y potencia de transmisión:
W_REGISTER CONFIG DATO       Comando/registro: 00100000, dato 0000100R
Si R = 0; Rol de Transmisor TX, si R = 1 Rol de Receptor TX
W_REGISTER RF_SETUP DATO  Comando/registro: 00100110, dato 00L0HPW0
Potencia PW:  00=-18dBm, 01=-12dBm, 10=-6dBm, 11=0dBm
Velocidad LH: 00= 1Mbps, 01= 2Mbps, 1x= 250Kbps
Paso 2: Establecer el tamaño de la carga, numero de reintentos y tiempo entre cada reintento:
W_REGISTER RX_PW_P[P] DATO  Comando/registro: 00101011, dato 000CCCCC
P: indica el conducto pipe de 0 a 5 normalmente se usa 0 y 1
CCCCC: tamaño de la carga en bytes de 1 a 32 bytes
Esta configuración solo aplica si se operara el modulo como receptor
W_REGISTER SETUP_RETR DATO Comando/registro: 00100100, dato RRRR####
Retardo entre retransmisiones RRRR: 250uS[(bit7:4)+1] de 250 uS a 4 mS
Numero de retransmisiones ####: de 0 retransmisiones a 15 retransmisiones
Si se alcanza el máximo de retransmisiones el modulo se congelara, para rehabilitarlo es necesario limpiar el bit 4 del registro de estado, escribiendo un 1 lógico en dicho bit.
Modulo como receptor
Paso 3: Activar la escucha del modulo, para que se prepare a recibir datos desde otro modulo, con esto se pone el modulo en modo activo por lo que el consumo de energia se incrementa:
W_REGISTER CONFIG DATO  Comando/registro: 00100000, dato 00001011
Con los bits menos significativos salimos del modo Power Down y ponemos el modulo en el rol de receptor.
W_REGISTER STATUS DATO  Comando/registro: 00100111, dato 0RTM1110
R: Limpiamos la bandera de dato recibido, escribiendo 1 en el bit
T: Limpiamos la bandera de dato enviado para el recibo del ACK, escribiendo 1 en el bit
M: Limpiamos la bandera de máximo numero de retransmisiones.
Paso 4: Verificar que hay datos disponibles
NOP Comando/registro: 11111111
Con este comando leemos el registro de estado para verificar el bit 6 RX_DR, si este bit esta en 1 indica que un nuevo dato ha sido recibido, mientras se activa la bandera se puede hacer un bucle para que este verificando esta acción
Paso 5: Leemos el buffer de datos recibidos
R_RX_PAYLOAD  DATO       Comando/registro: 01100001, dato
Con este comando se lee el buffer de datos que va desde 1 a 32 bytes con el comando se recibe el primer dato si se desea leer mas datos se puede usar el comando NOP para los siguientes bytes, el buffer se borra cuando este se lee.
Una vez se completa el paso 5 si se requiere recibir mas datos se repite el paso 3, se pueden usar las interrupciones para reducir el consumo de energía.
Modulo como transmisor
Paso 3: Activar el envio del módulo, con esto se pone el modulo en modo activo por lo que el consumo de energia se incrementa:
W_REGISTER CONFIG DATO  Comando/registro: 00100000, dato 00001010
Con los bits menos significativos salimos del modo Power Down y ponemos el modulo en el rol de receptor.
W_REGISTER STATUS DATO  Comando/registro: 00100111, dato 0RTM1110
R: Limpiamos la bandera de dato recibido, escribiendo 1 en el bit
T: Limpiamos la bandera de dato enviado para el recibo del ACK, escribiendo 1 en el bit
M: Limpiamos la bandera de maximo numero de retransmisiones.
Paso 4: Desarrollar un retraso de 150 uS para estabilizar el transmisor
Paso 5: Cargar el buffer de transmisión
W_TX_PAYLOAD  DATO       Comando/registro: 10100000, dato
Con este comando se escribe en el buffer de datos a transmitir que va desde 1 a 32 bytes despues del comando se envian los datos a transmitir hasta completar los 32 bytes si la carga es menor se deben de rellenar con cero.
Paso 6: Verificamos el registro de estado de la transmisión, para garantizar que esta se ha completado sin problemas
R_REGISTER OBSERVE_TX     Comando/registro: 00001000, dato
Con este comando se puede observar el contador de paquetes perdidos y retransmitidos si el dato recibido es F en cualquiera de los nibbles significa que no fue posible transmitir el dato aun usando el numero de reintentos configurados, si este es el caso debe activarse también el bit 4 del registro de estado indicando que se alcanzo el máximo numero de retransmisiones realizadas.
Si se desea repetir el proceso se puede hacer un bucle hasta el paso 3.

Existen muchas mas opciones de operación del modulo, para la lógica de programación del módulo descrita se dejan muchas de las opciones de configuración con sus valores por defecto, solamente modificando las relativas a las acciones configuradas; para configuraciones mas especializadas es necesario consultar el manual técnico del módulo.
La diversidad de opciones de configuración, el bajo consumo y su facilidad de programación desde cualquier plataforma con una interfaz SPI, hacen de este chip una excelente opción para la implementación de redes de baja carga en cualquier solución con módulos IoT.

No hay comentarios.:

Publicar un comentario