... un paso más cerca de la domótica ultra-low-cost ...
Buenas tardes, en mi afanosa tarea de llegar a la domótica más barata que se pueda tener, os voy a enseñar a enviar una señal, vía radiofrecuencia, desde el RaspberryPi, hacia un microcontrolador ATTiny85 (o cualquier otro). Parto del hecho que ya dominas mis otros posts:- Comunicacion por RF a 433Mhz desde Arduino hasta RaspberryPi
- Sensores inalámbricos
- Depurando código en ATTiny85
Al lío ...
Vamos a empezar con un objetivo básico: encender un led vía RF. En los siguientes posts os enseñaré a aplicar esto mismo a una instalación de luz, pero seguro que a más de uno le sirve esto que os explico ahora (hola Xesco!).
La lista de la compra, la más barata:
- Emisor y receptor de RF a 433 mhz
- Dos ATTiny85
- Led
Viendo la lista te preguntarás ¿para qué dos ATTinys? Básicamente porque no he conseguido poner en marcha el emisor de RF directamente en el RaspberryPi, así que usaré otro ATTiny controlado vía serie, como emisor. Si te sientes fuerte, aquí tienes las instrucciones para conectar el emisor al RaspberryPi directamente, yo no lo he conseguido.
Los circuitos
El emisor en el RaspberryPi, quedaría tal que así:
Aunque puede asustar un poco, realmente es muy simple. Es más, si te sientes con ganas, y no tienes dos manos izquierdas con sus 10 pulgares (yo si), puedes hacerte un circuito realmente pequeño:
La parte receptora queda así:
Este es algo más simple. No pongo el circuito para programar el ATTiny85, porque ya lo tienes aquí.
Los programas
Empecemos a teclear un poco. Este código va en el ATTiny85 EMISOR:
Cómo muy bien puedes ver, usa las librerías TinyWireS y Manchester, descárgalas desde estos enlaces:
La idea del EMISOR es que nuestro RaspberryPi le dirá vía I2C algo, y este lo transmitirá por RF.
El siguiente código va en el ATTiny85 RECEPTOR:
Volvemos a usar Manchester y como debug (no necesario), usamos TinyDebugSerial, que ya la tenías. En el código de este ATTiny85, le hemos indicado con la variable yosoy, que sólo responda a las peticiones RF que lleguen con código 100. Si recibe:
- 100 10 - se enciende
- 100 11 - se apaga
- 100 12 - parpadea
Ahora sólo nos queda el script en python, que hablará vía I2C con el ATTIny85 EMISOR, /usr/local/bin/I2C.py:
Seguramente tendrás que hacerle alguna modificación. Cuando lo tengas todo enchufado, tienes que localizar el bus al que le ha asignado la dirección. Para ello ejecuta:
i2cdetect -y 0 i2cdetect -y 1el bus que buscamos es el que tenga una dirección, el que sólo tiene -- no nos sirve. Ese valor es el que va en la variable bus, del script en python.
Para usarlo:
python /usr/local/bin/I2C.py 100 10 python /usr/local/bin/I2C.py 100 11 python /usr/local/bin/I2C.py 100 12
Interesante, tengo un colega que quiere abrir el garaje desde el teléfono, podría ser interesante el rf, Bluetooth o NFC. Gracias por la idea ;(
ResponderEliminarMuy guay! Al final conseguiste que esa antena llegara lejos?
ResponderEliminarunos 20 metros, pero seguro que consigo más. Por lo pronto para el piso me llega a todas partes.
EliminarGenial!!! pero la tuviste que soldar al emisor?
Eliminarsi te fijas en la ultima foto, le he puesto un pin macho, que es mas fijo y entra bien. Para la antena he usado un alambre de cobre muy grueso, no entra en el agujerito, asi que le he soldado un pin hembra y ya tengo mi antena de quita y pon.
EliminarMuy interesante.
ResponderEliminarHas probado esto? para controlarlo directamente desde la raspberry?
https://github.com/r10r/rcswitch-pi
¿Tienes pensado poderlo controlar via red (aunque sea local)?
Un saludo!
por red no. Creo haber probado rcswitch pero alguna libreria me fallaba, date cuenta que tienen que compartir protocolo y codificacion el attiny y el rasp.
EliminarHola mirando lo que dices que no pudiste enviar directamente desde la raspberry creo recordar que debes usar un conversor logico de 3,5 a 5 V para que la señal que pasas al emisor sea a 5 V y entonces no necesitarás el attiny del emisor, en adafruit tienes un modelo de estos conversores aunque si estas en españa el coste de envio es altisimo, pero en brikogeek venden uno muy similar.
ResponderEliminarEspero que te ayude y animo vas muy bien
buenas noches, estoy haciendo la parte del emisor, he descargado del dropbox los fichero y los he puesto en librerias, he puesto el codigo pero al cargar me da errores del manchester.cpp en varias lineas, me puedes explicar que hago mal?
ResponderEliminargraciass
pon aqui el error que te da, a ver que puede ser.
Eliminarok te pongo el error que me aparece cuando le doy a cargar en el attiny
ResponderEliminarC:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp: In function 'void MANRX_SetupReceive(uint8_t)':
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:366: error: 'TCCR2A' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:366: error: 'WGM21' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:371: error: 'TCCR2B' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:371: error: 'CS21' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:371: error: 'CS20' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:372: error: 'OCR2A' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:379: error: 'TIMSK2' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:379: error: 'OCIE2A' was not declared in this scope
C:\Users\nacho\Desktop\arduino-1.0.4\libraries\Manchester\Manchester.cpp:380: error: 'TCNT2' was not declared in this scope
esto mismo me ha salido a mi miles de veces. Creo recordar que es porque no estas usando la version correcta de manchester o la de attiny. Como comentas que as bajado las librerias que he puesto en dropbox, te diría que es que no as puesto la librería de los attiny en el lugar correcto, o no as elegido el microcontrolador exacto.
Eliminarla carpeta de manchester la puse dentro de libraries no es ahi?? la de atinny me funciona para cargar el blink y demas por lo que no creo que sea el problema.
Eliminarno se me ocurre que podria ser... a ver si me puedes tirar un cable :)
gracias por tu ayuda
campeón como vas? hace tiempo que no publicas, ¿va todo bien? espero con ansia tu siguiente post.
ResponderEliminarun saludo
Buenos dias!
ResponderEliminarcomo cargas los programas en el attiny? mediante arduinoasISP o con raspberry? me da problemas de compilacion con arduino.
He leido que se puede hacer por el CMD, con comandos o un archivo makefile
con arduino, puedes con el raspberry ... pero no tengo ni idea. Lo de hacerlo por linea de comandos es lo mismo que hacerlo con el ide de arduino, pero en vez de seleccionar las opciones, las escribes.
ResponderEliminarEstoy probando tu tutorial y no me funciona. Creo que en el esquema de conexión con la RPi tienes mal el voltaje al emisor y el pin SDA que va al ATtiny (creo que es el de la derecha de todo).
ResponderEliminarA parte de esto el código en python me esta dando errores:
>sudo python send.py 100 10
Traceback (most recent call last):
File "send.py", line 10, in
bus.write_block_data(address,identificador,estado)
IOError: [Errno 5] Input/output error
La address creo que la pongo bien. La saco como tu dices. Este es mi output:
>sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- 26 -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --