lunes, 16 de septiembre de 2013

Sensores inalambricos

Hola gente, este es el primero de una serie de post que van a tratar sobre la comunicación inalámbrica. La idea es tener sensores de todo tipo por la casa, para activar la alarma, medir temperatura y humedad, apagar la luz dando dos palmadas...
Para la comunicación inalámbrica, usaremos los módulos de 433 mhz de este post, ya que van muy bien y son los mas baratos. El mejor microcontrolador para que active los eventos, ademas del mas barato y que menos consume, es el ATtiny85. Os voy a enseñar como programarlo.
Podríamos usar un Arduino en la parte del sensor, pero nos sobra capacidad y consume mas. El attiny85 puede ser programado con un programador con su código independiente, o bien usar el entorno de desarrollo de Arduino, que nos sienta un poco mejor. He condensado varios post sobre el tema y estas son mis instrucciones. Necesitas las librerias RF 433Mhz de este post, y también las librerías de las nuevas ATtiny para Arduino, en este enlace.

Cargando el isp en Arduino Uno

Esta es la parte mas fácil, simplemente conectamos nuestro Arduino (yo usare Arduino Uno) al pc, no le conectamos absolutamente nada y cargamos el programador, el isp:

Conectar el attiny85 al Arduino

Este paso tampoco es difícil, pero es de vital importancia que no te saltes ningún paso (cable), yo me suelo olvidar de algún cable y ya me he cargado un attiny85. Este es el ATtiny85 con las conexiones:
Aquí os enseño que nos hace falta un condensador de unos 10 uF, que sólo es necesario si usamos un Arduino Uno, si usas otro Arduino no es necesario.

Cargando un programa de ejemplo

Para estar seguro de que funciona, vamos a cargar el programa de ejemplo blink en el attiny85. Primero nos fijamos en el patillaje del ATiny85:

Vamos a usar el pin 1 con numeración Arduino, que viene a ser el 6 en el ATtiny85 y el GND para conectar el led. Cargamos el programa:
En el ejemplo, usa el pin 13, simplemente cambia este número a 1, no te olvides de esto. Ahora configuramos el entorno de Arduino para usar el Arduino Uno como programador del ATiny85:

Y le damos sin miedo a cargar. Salen un par de advertencias, pero las ignoramos porque nos gusta vivir al límite. Ahora solo necesitamos alimentar el attiny85, podemos usar pilas:
o el propio Arduino:
Si has llegado hasta aquí, lo siguiente no te costara mucho ;)

Envío de una señal de ejemplo hasta el RaspberryPi

Como se trata de enviar señales inalámbricas, necesitamos que nuestros ATtiny85 tengan capacidad inalámbrica. Lo primero es cargar el programa en el ATtiny85:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {
  mySwitch.enableTransmit(1);
}

void loop() {
  mySwitch.send(123456, 32);
  delay(1000);  
}
La librería que usamos para la transmisión inalámbrica, necesita que el attiny85 trabaje a 8Mhz, así que una vez conectado al Arduino, le damos a:

Ahora desconectamos el Arduino del ATtiny85 y conectamos el emisor inalámbrico:
En el Raspberry tenemos que tener cargado el programa de este post y tener conectado el receptor. Probamos y tenemos que recibir la cadena "12345" cada segundo.
 edición 25 de Octubre:
No se si subí las librerías de Attiny para el IDE de Arduino, cosas de la edad ... aquí las tenéis.

49 comentarios:

  1. Interesante. Algo así tengo pensado hacer en casa... Te seguiré de cerca!

    ResponderEliminar
  2. Interesante e impresionante, yo también tenía pensado algo, usando arduinos mano y algún relé, pero esto le dá dos vueltas a mi idea.

    Muy buen blog, sigue así.

    ResponderEliminar
  3. Sencillamente perfecto, como dice Jordi yo tambien te sigo desde hace mucho y me gusta mucho tu pagina, esta idea tuya es la bomba para poder evitar cables desde cualquier sitio, espero con ansia tu proximo post.
    Felicidades sigue asi.

    ResponderEliminar
  4. Excelente. Primero mi felicitación por el blog. Creo que es toda una referencia para todos los que disfrutamos con los arduinos y la raspberry.

    Yo estoy entretenido con una domótica a medida. Todavía tengo operativos unos X10 a través de línea de teléfono (y GSM sustitutivo). Luego compré varios juegos de switchs RF tipo schuko de 16A en la banda de 433 MHz (los hay parecidos en Bricor, Leroy Merlin, etc.), son baratos, por menos de 50 € compré dos juegos de 4 con sus dos mandos. Son del tipo DIP de 10 contactos. Total 8 equipos por menos de lo que cuesta uno de las tecnologías modernas (por ejemplo zwave).

    Los tengo funcionando con la librería RemoteSwitch (https://bitbucket.org/fuzzillogic/433mhzforarduino/wiki/Home ), ya que con ella funcionaron y aunque había probado esta RCswitch (y lo he vuelto a hacer) no consigo que funcionen.

    Mi experiencia con estos pequeños es muy buena: el emisor a 433 MHz se puede alimentar hasta 12v y el alcance es considerable. Yo lo he probado a 40 metros con todo tipo de obstáculos, muros, forjados, muebles...

    Ahora, siguiendo tu anterior post monté varios sensores en un arduino (más bien un muestrario: una LDR, una NTC, un LM335 y varios DS18B20) para probar a transmitir varios sensores a la RPi. Envío el nº de sensor junto con el valor:
    valor=nSensor*100000+valor
    y recupero:
    nSensor=valor/100000
    valor=valor-nSensor*100000
    Hasta aquí sin problemas. Si acaso que la RPi se queda muy "frita" (un 70% CPU) al dejarle el programa de lectura corriendo permanentemente.

    Y ahora las preguntas:
    - ¿Cómo vas a identificar cada sensor? Programado o con algún DIP. Se
    - ¿Tienes pensado poner receptor para que cada sensor emita su mensaje cuando sea requerido o estará permanentemente emitiendo? ¿En ese caso, cada cuanto? Tengo un Oregon Scientific THGR810 (protocolo V3) que lo hace cada 60 segundos.
    - Nunca he manejado un Attiny85. ¿Podrá manejar varios sensores de diverso pelaje?

    - En otro orden de cosas, ¿tienes previsto emitir con la RPi?

    Bueno, no me extiendo más que ya me he pasado, sólo decir que estoy impaciente por ver como sigue esta aventura de los 433MHz.

    ResponderEliminar
    Respuestas
    1. Viendo lo que te gustan los emisores de 433Mhz te paso también un link de mi autoría, como comunicar otro tipo de micros (PIC) con Arduino, en concreto un PIC de bajo coste con 4 conversores analógico-digital y transmitiendo el valor analógico de 4 sensores simulados, que te aproveche :)

      http://www.transistorez.com/modules.php?name=News&file=article&sid=3

      Eliminar
    2. tiempo tiempo, en el siguiente post explico todo.
      En el Raspberry solo voy a poner el receptor ... por ahora.

      Eliminar
    3. x Iván:
      Muchas gracias por tu aportación. Le aplica aquello de que lo bueno, si breve, dos veces bueno.
      Sin duda es la belleza de lo sencillo.

      x Juan:
      ¡¡¡Qué nervios !!!

      Eliminar
    4. Sencillo y en este caso económico, con un portapilas, un micro de baja gama de poco más de 1€, unos sensores también de 1€ y tan solo un emisor y un receptor también muy económicos se tiene funcionando

      Eliminar
  5. Hola Juanmol, estoy en ello lo tengo preparado pero falta la libreria del attiny85 para agregarlo al IDE, el enlace lleva a rcswitch pero ahi no estan las librerias de este, puedes por favor ponerlos?? graciass es que he descargado del post donde dices pero no aparecen igual a los tuyos salen los 85 pero con nombres distintos.

    graciass

    ResponderEliminar
    Respuestas
    1. si te salen algunos attiny85 y parecidos, esta bien, si no se llaman igual, seguramente es porque han actualizado las librerías ¿te sale algún attiny85?

      Eliminar
    2. Hola campeón, no no me sale ningun attiny85 :( estoy mirando a ver si encuentro los mismos que los tuyos pero no los encuentro.....
      podrias subir los tuyos???? pleaseeeeee ;)
      graciass

      Eliminar
    3. la verdad es que no sabría decirte en que enlace lo puse. Los he vuelto a subir, lo tienes al final del post. Espero que sea lo que buscas.

      Eliminar
    4. Hola Juanmol, esas son las que te comentaba que encontré pero que tienen un nombre distinto a las tuyas, por lo que no se cual opcion elegir ya que hay varios, lo he comparado con las capturas de pantalla que tienes y no hay similitud.... cual pillarias tu? es que a la hora de cargar el programa en el attiny no te deja, da error de compilación y no deja subirlo

      Eliminar
    5. que raro. Tienes que elegir (si te sale):
      ATtiny85 (internal 8MHz clock)
      mira a ver si te va. Te aviso que a veces el arduino se queda un poco tonto, lo tienes todo bien y te salen fallos raros. Por eso tiene un boton de reset, pulsalo un par de veces y lo vuelves a intentar.

      Eliminar
    6. lo acabo de mirar, pero no aparece nada de 8mhz, aparece attiny85 y entre parentesis (arduino ISP) pero no como los tuyos, y cargué los cores que has puesto pero son los mismos que tenia yo, tengo hasta la misma version de arduino que tu jejeje pero no he conseguido los mismos attiny85

      Eliminar
    7. ?¿?¿? en la lista de boards te sale lo de arduino isp?

      Eliminar
    8. lo he comprobado y nada, mira me sale el listado igual que la imagen de esta pagina http://www.hobbytronics.co.uk/arduino-attiny

      Eliminar
    9. Este comentario ha sido eliminado por el autor.

      Eliminar
    10. Este comentario ha sido eliminado por el autor.

      Eliminar
  6. Hola Juanmol
    Primero de todo, muchas gracias por tus post, son geniales y me han sido de mucha ayuda. Te comento, he estado probando esto, con exactamente los mismos componentes que utilizas tu, y con Arduino va perfectamente. El problema es al cargar el codigo de RF al Attiny. Consigo cargar el ejemplo de blink sin problemas y hacerlo funcionar en ATTiny, pero con el código de RF, al cargarlo en el ATTiny da error de compilación. Me temo que es algo relacionado con la libreria RCSwitch y como el ATTiny85 la interpreta. ¿Hay que hacer algún cambio para que la libreria funcione con ATTiny?

    Gracias!

    ResponderEliminar
    Respuestas
    1. Ya he he encontrado el problema! se debia a que el IDE de Arduino no podia compilar códigos de más de 4 KB para ATtiny. La solución:

      https://github.com/damellis/attiny/issues/7

      Eliminar
    2. gracias! seguro que lo uso en los próximos inventitos.

      Eliminar
  7. Sebas(sbssk8@gmail.com)
    Hola buenas, que placas arduino se pueden usar como isp para programar el µC attiny85?
    Ya que yo tengo un arduino mega 2560 y no se si se pude usar...
    un saludo

    ResponderEliminar
  8. Sebas(sbssk8@gmail.com)

    Retiro lo dicho...
    Mañana pruebo y comento

    ResponderEliminar
  9. Buenas, los enlaces a las librerias etc no estan disponible, ¿Podrias resubirlo?

    Saludos y gracias

    ResponderEliminar
  10. Hola Juanmol, mira tengo igual el sistema que ne las imagenes, pero no me carga nada en el attiny al cargar sale esto avrdude: stk500_getsync(): not in sync: resp=0x00, no se si es normal o no pero no me carga ni el blink.
    Me puede ayudar?

    ResponderEliminar
    Respuestas
    1. eso sale miles de veces, no desesperes ;)
      tienes que comprobar los cables (evidentemente) y si todo es correcto y tienes el condensador conectado (en caso de ser arduino uno) lo que tienes que hacer es darle un par de veces al boton reset del arduino y vuelves a subir el código.
      A mi eso me sale 1 de cada 5 subidas, reset y solucionado.

      Eliminar
  11. avrdude: stk500_recv(): programmer is not responding
    A mi me da este error... que podria ser..?
    Un saludo y felicitaciones por el gran blog!

    ResponderEliminar
    Respuestas
    1. revisa el cableado! ¿estas dandole los 5v al attiny85? Ese mensaje me sale cuando programo desde el Arduino Uno y se me olvida poner el condensador.

      Eliminar
    2. lo tengo puesto pero aun asi me sale... es un condensador de 10mf y el voltaje esta bien....

      Eliminar
    3. y si le das un par de veces al reset? Asegurate de que el condensador hace buen contacto, el mio lo tengo que retorcer un poco para que no me salga eso.

      Eliminar
    4. si, he intentado lo del reset pero no funciona, el condensador hace buen contacto, lo conecté con pinzas por si acaso

      Eliminar
    5. Supongo que con arduino MEGA tambien se necesita el condensador pues... Y debe ser eso
      El lunes me acercaré a la capital a por un condensador de 10uF un saludo!
      Por cierto, anónimo que publicó el 8 de noviembre de 2013 13:10, necesitas el condensador de 10microFaradios, no de 10miliFaradios
      Un saludo!

      Eliminar
    6. buena observacion, muchas gracias.
      Creo que lo del condensador es solo para el arduino uno, tengo un nano y con ese no lo he necesitado. Ya me contaras.

      Eliminar
    7. El nano usa un atmega32u4 como el leonardo, estos chips tienen el autoreset desactivado al venir con compatibilidad USB pero los demás no..
      Me gustaria saber que voltaje tiene que tener el condensador... he comprado uno de 25 pero no estoy segiro si es el que toca...
      Un saludo

      Eliminar
    8. Con un condensador de 25 V y 10µF funciona!
      Gracias por todo!

      Eliminar
    9. hola que tal soy el mismo de antes , al ver el comentario de que con el nano te funcionaba sin condensador me he ido corriendo y he comprado un arduino leonardo, he hecho todos los paso SIN el condensador y me sale lo mismo.... ya no se que hacer... tengo un arduino uno y leonardo y no consigo programar ninguno de los 4 attiny que compré :( por favor me puedes ayudar te envio fotos videos lo que quieras??? el desesperao

      Eliminar
    10. Hola "el mismo de antes" primero pregunta tonta ... la profesión me obliga ... ¿pones el attiny al derecho? Cuelga las fotos del conexionado en alguna web, que se vea bien bien donde pones cada pin, y unas capturas de pantalla de la configuracion del ide de arduino, seguro que es una chorrada que hemos pasado por alto.

      Eliminar
    11. no lo cuelgo pero te lo puedo enviar por mail, si quieres te evio fotos o video como quieras...

      Eliminar
    12. a ver si con las fotos y las capturas nos apañamos, mandalas a rsppi.blog@gmail.com

      Eliminar
  12. mil gracias Juanmol por fin he conseguido hacerlo funcionar, dado que nunca he tocado un arduino el paso mas tonto es el que no entendí....
    gracias por abrirme los ojos.

    ResponderEliminar
    Respuestas
    1. nada hombre, para eso estamos. Acuerdate de avisarme si haces algo interesante con los ATTinys

      Eliminar
    2. por supuesto!! ni lo dudes, lo primero que voy a intentar es controlar los enchufes rf desde este y tambien un sensor pir en otro attiny para que avise por rf a la raspberry y tambien sensores de puertas

      Eliminar
  13. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  14. Buenas tardes grupo! Gracias por el post, muy interesante.

    Escribo porque googleando he encontrado algunos articulos pero no me quedan claros del todo. Alguno de ustedes ha programado los Attiny directamente desde la Raspberry pi?

    Para los que no tenemos arduino sería interesante!

    Un saludo.

    ResponderEliminar
  15. Hola, estoy intentandro transmitir desde el ATtiny85, pero no o consigo, no hay manera. SI uso el Arduino como emisor, no hay problema, la RPi me muestra lo transmitido, pero usando el ATtiny85, pues nada, no hya forma, incluso he intentado tx desde diferentes pins (PB0, PB1 como en tu ejemplo, PB2, PB3... ) pero nada... Supongo que el ATTiny85 esta bien programado, ya que pongo un led en el pin de salida y me parpadea la secuencia... ¿ Alguna idea de que problema tengo cuando uso el ATtiny85 como tx ? Muchas gracias.

    ResponderEliminar
    Respuestas
    1. mírate el otro post que puse de "depurando código en attiny85" y te aseguras que de verdad de la buena esté enviando lo que tiene que enviar.

      Eliminar
  16. Buenas noches, llevo ya una temporada peleando con este tema y soy incapaz de subir ningun codigo a los attiny que tenga librerias, me da errores de todo tipo.
    Llego a cargar blink y creo que llegué a cargar el bootloader de 8Mhz para utilizar librerias de rf aunq me dio el aviso:avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85

    Pero de aqui no paso. si intentocargar el que pones de ejemplo para mandar algo a rsbpi me da error compilando:
    c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)
    RCswitch\RCSwitch.cpp.o: In function `RCSwitch::receiveProtocol1(unsigned int)':
    C:\Program Files (x86)\Arduino\libraries\RCswitch/RCSwitch.cpp:645: relocation truncated to fit: R_AVR_13_PCREL against symbol `__udivmodhi4' defined in .text.libgcc section in c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_udivmodhi4.o)
    C:\Program Files (x86)\Arduino\libraries\RCswitch/RCSwitch.cpp:646: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsi3' defined in .text.libgcc section in c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_mulsi3.o)

    Me podrías echar una mano?

    Muchas gracias.

    ResponderEliminar
  17. buen día amigo, como identificas los sensores?

    muy buen post!!

    saludos.

    ResponderEliminar