lunes, 11 de noviembre de 2013

Comunicación inalámbrica desde RaspberryPi a ATTiny85 (con trampa)

... 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:

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 1
el 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

Y esto es todo, que no es poco. Hemos conseguido emitir desde el RaspberryPi e interactuar con un led por RF. Si es que somos unos cráses.

17 comentarios:

  1. 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 ;(

    ResponderEliminar
  2. Muy guay! Al final conseguiste que esa antena llegara lejos?

    ResponderEliminar
    Respuestas
    1. unos 20 metros, pero seguro que consigo más. Por lo pronto para el piso me llega a todas partes.

      Eliminar
    2. Genial!!! pero la tuviste que soldar al emisor?

      Eliminar
    3. si 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.

      Eliminar
  3. Muy interesante.
    Has 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!

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
  4. Hola 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.
    Espero que te ayude y animo vas muy bien

    ResponderEliminar
  5. 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?
    graciass

    ResponderEliminar
    Respuestas
    1. pon aqui el error que te da, a ver que puede ser.

      Eliminar
  6. ok te pongo el error que me aparece cuando le doy a cargar en el attiny
    C:\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

    ResponderEliminar
    Respuestas
    1. 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.

      Eliminar
    2. la 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.
      no se me ocurre que podria ser... a ver si me puedes tirar un cable :)
      gracias por tu ayuda

      Eliminar
  7. campeón como vas? hace tiempo que no publicas, ¿va todo bien? espero con ansia tu siguiente post.
    un saludo

    ResponderEliminar
  8. Buenos dias!
    como 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

    ResponderEliminar
  9. 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.

    ResponderEliminar
  10. Estoy 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).

    A 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: -- -- -- -- -- -- -- --

    ResponderEliminar