Sensorino
Contents
Nombre proyecto
ESTADO: PRIMERAS PRUEBAS
Miembros: User:Dario_Salvi, User:Bozo, User:Roberto Zabala
Objetivo
construir una red de sensores compatibles con el IDE de Arduino y que cuesten menos que 5 € con todo incluido.
Motivación
Hay muchas aplicaciones donde lo que queremos es simplemente un medio de enviar y recibir información sencilla sin tener pero que cablear toda el entorno. Un ejemplo es la casa, por ejemplo nos interesa saber que puertas o ventanas están abiertas, queremos apagar o encender tal luz o electrodoméstico etc.
Antecedentes
Hay muchos proyectos para redes de sensores y productos comerciales, pero ninguno hasta ahora verdaderamente barato (es decir <5€), ver Plataformas IOT.
El proyecto mas parecido al nuestro de momento es este, quitandole quizas los LEDs para ahorrar. Otro proyecto muy parecido es este.
Métodos y técnicas utilizadas
Requisitos:
- cada nodo tiene una MCU y una conexión RF
- el nodo base tiene que ser muy barato: < 5€
- se tiene que poder programar con el IDE de Arduino
- se tiene que poder alimentar con una pila de tipo botón o dos AA por un año
Estamos buscando alternativas, abajo hay una recopilación de posibilidades.
Detalles
Low power
https://www.sparkfun.com/tutorials/309 http://www.gammon.com.au/forum/?id=11497
Ideas para el Hardware
De momento nos centramos en un ATmega328 y en el chip nRF24L01 de Nordic. El coste de los dos puede llegar a ser inferior a 1 €. Placas micro compatibles Arduino (de donde poder copiar el diseño): femtoduino, Arduino mini pro
Asignación de pines según la librería de maniacbub (ver articulo original):
- PD2 -> IRQ
- PB0 -> CS
- PB5 -> SCK
- PB4 -> MISO
- PB3 -> MOSI
- PB1 -> CE
- GND -> GND
- VCC -> VCC
Alternativas son, para la MCU, el ATtiny24 o 84 aunque sus capacidades son limitadas y no hay plena compatibilidad con Arduino. El precio de un Attiny24 es de medio euro.
Pinouts: ATMega328P, nrf24l01
Ideas para el SW
Queremos la compatibilidad con Arduino, por eso nos centramos en chips AVR. Hay unas cuantas librerías para controlar el chip radio:
- mirf, licencia tipo GPL, es la oficial de Arduino playground
- RF24 de maniacbug, GPL V2
- NRF24 de Mike, GPL V2
- fork de Greg Copeland de RF24, GPL V2, mas reciente que el original
- fork de Stanley Seow de RF24, GPL V2, que incluye soporte para RaspberryPi
- fork de Arco van Geest que incluye soporte para RaspberryPi
Y unos posts sobre el tema:
- MUY BUEN POST sobre las librerías que hay hasta ahora para nRF24L01
- ejemplos de Mirf
- ejemplos de RF24
- post sobre fork de Stanley Seow
- soporte en google groups para NRF24
A esto podemos añadir:
- enrutamiento (VER Apuntes sobre enrutamiento con nrf24l01):
- SARA
- algoritmo hecho para nrf24 de maniacbug con su entrada de blog
- este otro que parece mas prototipal
- este que parece muy bueno!
- la librería de ATmel?
- algoritmo de encriptación: TEA o su version mas avanzada XTEA
- IP en Arduino con SLIP?
- compatibilidad con el stack IETF 6LoWPAN/IPv6 + RPL + CoAP? aqui
- un sistema operativo embedded? RTOS o Contiki
Del lado "servidor" o sea el colectore de todas las medidas y generador de aplicaciones domoticas se puede usar:
Avances
Reunión 14/9/2013:
Hemos testeado 4 módulos nRF24L01 con dos Arduinos, uno ha fallado, pero los otros tres se ha conectado etnre si. Hemos los cogidos de ejemplo de la librería RF24 que parece ser la mejor hecha. Hemos probado la conexion estrella y ha funcionado.
Decisiones: para la semana que viene vamos a intentar conectar un Atmega328p directamente a un modulo nRF24L01 en una placa de prototipado. Queremos producir 4 nodos e ir haciendo experimentos. Experimentos posibles:
- mejor tipo de baterías, 2 AA? 1 de moneda de 3V ?
- aguante de baterías
- alcance de la comunicación
- ir haciendo pruebas con el SW
objetivo final que hemos visualizado: una placa integrada con modulo radio y atmega, super pequeña, de bajo coste (<5€), con un kit de SW para redes de sensores. Como SW se considera incluso hacer un porting del stack 6loWPAN.
Pruebas 26/9/2013:
Hemos montado el Atmega328p en la breadboard. Para programar el ATMega desde Arduino hemos seguido este tutorial. Hay dos fases: en una cargas el bootloader en el ATmega virgen. Para ello se necesita un Arduino que envíe el firmware por los pines del SPI. RECORDAR de cargar el sketch Arduino as ISP de la carpeta de los ejemplos !
En la segunda fase puedes cargar tus sketch, en este caso se usa el puerto serie, y se puede usar un Arduino quitandole el chip O un cable USB-to-serial (FTDI chip) si lo hay.
Para ir probando la comunicación con el nRF24L01 hemos cargado un sketch para usar el chip Nordic. Hemos utilizado la librería de maniacbug aquí y el codigo de ejemplo GettingStarted.
Para cargar el sketch en el ATmega hemos utilizado un cable FTDI y NO HA FUNCIONADO, no sabemos porqué. Entonces hemos usado el Arduino SIN MCU y HA FUNCIONADO. Hemos conectado el nRF24L01 según este esquema, cuidado con hacer el mapeado entre los pines de Arduino y los del Atmeg328 (ver aquí)!
El Atmega ve el chip y es capaz de enviar paquetes pero no de recibirlos. No sabemos porqué pero sospechamos que es por tener el clock a 8MHz en lugar de 16.Hay indicios de que afecta de alguna manera. El chip puede comunicar hasta 10 Mhz en el bus SPI. En la libreria tenemos SPI.setClockDivider(SPI_CLOCK_DIV4); Entonces con un un atmega328 @ 8 Mhz, 8/4 = 2 mbs , no debería haber problema. Otra posible causa pueden ser los delays().
Pasos a seguir:
Dario: va a enviar un correo al creador de la librería RF24 preguntandole cual es la mas actualizada y si el ve algún problema en tener un Arduino a 8MHz en lugar de 16Mhz.
Roberto: se encarga de ver los sockets e intenta programar el ATMega con el cable FTDI
Todos: resolver el problema de los 8MHz. Comprar socket para los chips. Construir primer prototipo.
Pruebas del 3/10/2013
A veces el ATMega cuando envía un paquete imprime dos tipos de mensajes distintos:
Now sending 22333...failed. Failed, response timed out.
o
Now sending 23609...ok...Failed, response timed out.
La diferencia entre la primera linea y la segunda esta en este codigo (GettingStarted.pde):
// First, stop listening so we can talk. radio.stopListening(); // Take the time, and send it. This will block until complete unsigned long time = millis(); printf("Now sending %lu...",time); bool ok = radio.write( &time, sizeof(unsigned long) ); if (ok) printf("ok..."); else printf("failed.\n\r");
Pruebas hechas:
- seteado SPI_CLOCK_DIV2 en RF24.cpp de la libreria RF24 de Maniacbug: NINGUN CAMBIO
- comentado linea SPI_CLOCK_DIV en RF24.cpp: NINGUN CAMBIO
- metiendo un condensador de 10 microF entre pin 3.3v y tierra: AHORA SOLO DA Now sending 23609...ok...Failed, response timed out.
- metiendo 500 ms en lugar de 200 en esperar la respuesta: NINGUN CAMBIO
- comprobado que los delay() y millis() sean buenos: son buenos (los segundos son segundos)
Al final hemos encontrado el problema: eran unos cables mal conectados entre el Arduino (no el Atmega) y la placa nfr (culpa de Roberto). CUIDADO con las librerías (maniacbug o mirf o Mike) que tienen distintos cableados !!!
Hemos quitado el condensador y la mitad de los paquetes se perdían.
Conclusiones:
- la comunicación funciona entre los dos
- meter condensador de 10microF es suficiente para no perder paquetes
Observacion: el modulo nrf24L01 tiene un oscilador a 16MHz, en una placa integrada se podría aprovechar también para el ATMega Para compartir el cristal, los CI tienen que estar cerca, un CI excita el crstal, mientras el otro solo "lee" la salida: http://forum.arduino.cc/index.php?topic=78584.0 .
Para la próxima: ir probando con baterías distintas, diseñar el prototipo
Pruebas 26/10/2013:
Hemos probado a alimentar el ATMega con 3.3 V -> no funciona. A partir de 4.5 parece que funcione. Hemos intentado quitandole el brownout como sugiere este post(settings a 0xFF), pero nada.
Pruebas 27/10/2013:
Bozo consigue enviar datos por serial a partir de una tensión de 2.3 voltios. Con 2.1 voltios funciona pero no arranca bien.
El circuito está hecho con una fuente regulable sin condensadores y un parpadeo de led. El .hex fue generado seleccionando "atmega 328 on bread board" como tipo de placa
avrdude: Device signature = 0x1e950f avrdude: safemode: lfuse reads as E2 avrdude: safemode: hfuse reads as D8 avrdude: safemode: efuse reads as 7
Pruebas 28/10/2013:
Roberto también consigue hacerlo funcionar. No he identificado el problema del otro día. Probado con dos pilas AA a 2.8v sin ningún problema. Con la salida de 3.3v de Arduino también funciona.
El valor de los fuses utilizados son los que proponía kerry Wong sin modificar el brown-out que de momento no ha sido necesario.
low_fuses=0xE2 high_fuses=0xDA extended_fuses=0x05
Pruebas 23/11/2013:
Prueba de Dario para montar una placa integrada.
Dado que no quiere esperar los zocalos se ha soldado PIC y chip radio todo juntos, como NO hay que hacer.
Conexión de pines:
ATMEGA -> NRF24L01:
PIN 4 PD2 -> PIN 8 NRF24 (IRQ)
PIN 15 PB1 -> PIN 3 NRF24 (CE)
PIN 16 PB2 -> PIN 4 NRF24 (CSN)
PIN 17 PB3 -> PIN 6 NRF24 (MOSI)
PIN 18 PB4 -> PIN 7 NRF24 (MISO)
PIN 19 PB5 -> PIN 5 NRF24 (SCK)
además hay que tener en consideración los pines de alimentación y para programar el PIC:
ATMEGA:
PIN 1 PC6 -> Reset
PIN 2 PD0 -> TX
PIN 3 PD1 -> RX
PIN 7 VCC -> 3V
PIN 8 GND -> GND
PIN 20 AVCC -> 3V (cuidado, es necesario cuanto el pin 7 !!)
NRF24:
PIN 1 GND -> GND
PIN 2 VCC -> 3V
Pruebas hechas:
- con un sketch normal de Arduino (AnalogReadSerial) -> OK
- con sketch de ejemplo de nrf24l01 (GettingStaretd) ->