miércoles, 18 de septiembre de 2013

Sensores inalambricos: sensor de palmadas

... para apagar las luces a lo Hollywood ...

Buenas tardes, el primero de los sensores que os voy a enseñar, es el de palmadas. Podría haber empezado con el de temperatura, pero eso lo puede hacer cualquiera. Este post va a ser un poco más largo que para el resto de sensores, por aquello de ser el primero y esas cosas, así que vamos al lío.

La lista de la compra

Para el sensor de palmadas necesitaremos:
  • ATtiny85
  • Emisor de 433 mhz
  • Protoboard, de las chiquititas
  • Cable
  • Portapilas y pilas (o una batería)
  • Jack hembra 3.5 de audio
  • Micrófono homnidireccional
  • Resistencia de 1KΩ
Ahora mismo no tengo resistencias de 1KΩ, así que usare una de 100KΩ, por lo que mis valores son algo bajos.

Primeras pruebas

El circuito que tenemos que fabricar puede ser pequeño o tremendamente pequeño, por lo que podemos esconder los sensores donde queramos. De hecho estos son un par de mis primeros prototipos:



como veis la idea es usar un socket dip de 16 pines, para aprovechar los sockets sobrantes. El conexionado lo hacemos en la placa que lo sostiene, con lo que el circuito es diminuto y ... muy elegante. Si a eso le añadimos una pila de botón, te queda un circuito autónomo la mar de cachondo. ¿Cuál es el problema? que la pila de botón te va a dar una autonomía de algunos meses, y yo soy demasiado flojo para ir cambiando las pilas. Así que haciendo cálculos, para cambiar las pilas cada año y medio o casi dos años, voy a usar 4 pilas AA, de las del mando a distancia de la tele, con su portapilas:

con lo que como veis, es un poco absurdo esforzarte en hacer un circuito tan pequeño, cuando el tamaño real te lo da el portapilas (o bateria). Así que (aunque no le guste al Borreguero) voy a usar la mini protoboard, como soporte de los componentes.

Así además me ahorro soldar, que como veis no se me da muy bien. Son muy baratas y fáciles de encontrar.

Montando el circuito

El esquema del detector de palmadas es el siguiente:
Si os fijáis detenidamente, veréis que la patita de alimentación del emisor rf, no esta conectada a la tensión de entrada, ya que de ser así estaría continuamente consumiendo la batería y realmente sólo queremos usarlo cuando detecte las dos palmadas. Por eso lo conectamos a una de las patitas del ATtiny85 que nos quedan libres y mediante el código le daremos tensión cuando lo necesitemos, a que soy listo ¿eh? ;)

Explicación, almacenamiento de datos y demás cosas aburridas

Vamos a dejar de divertirnos un rato y vamos a pensar. La librería que estamos usando para la transmisión de rf, sólo envía números de hasta 32 bits. Cuando tengamos 100 sensores de todo tipo repartidos por la casa, nos gustará tener un histórico y poder diferenciar qué dato pertenece a qué sensor. Es por esto que vamos a usar un tipo de codificación de alto nivel llamada JASM (Juanmol se la Acaba de Sacar de la Manga), de forma que los datos se enviarán de la siguiente forma:
1XXYYYZZZZ
1XX - código identificador único del sensor
YYY - es un valor para identificar el envío y hacerlo único (ahora te explico esto).
ZZZZ - valor a medir

En este caso, mi sensor es el número 114 y va a recibir valores entre 1 y 1023, que son las escalas analógicas que es capaz de medir el ATtiny85.
Después de hacer unos dos millones de pruebas, he visto que los módulos de 433 mhz, son tela de perros, además de que la banda tiene mucho ruido. Es por eso por lo que el mismo dato lo recibía hasta 3 veces consecutivas por error. Así que pensando un poco, se me ocurrió que podría identificar numéricamente cada envío y descartar aquellos ya se hayan recibido, a que soy listo ¿eh? ;)

Preparando la base de datos y el script

Voy a almacenarlo todo en una base de datos MySQL. Usaré dos tablas, una para registrar los sensores con su descripción y otra donde irán todos los datos. Aquí tienes el archivo SQL, para usarlo:
apt-get install mysql-server apache2 phpmyadmin
wget https://www.dropbox.com/s/yjk3nic674if4vj/rf.sql -O /tmp/rf.sql
mysql -u root -p < /tmp/rf.sql
Ahora necesitamos que alguien meta ahí los datos, así que nos vamos a este post y en la parte de "En RaspberryPi" modificamos el archivo rfreceive.cpp para que ejecute un script cada vez que recibe algo por rf. Lo dejamos así --> enlace a pastebin. Y recompilamos con las instrucciones del post.

Y ya sólo nos queda el script que se ejecuta cada vez que se recibe algo, que lo he llamado /usr/local/bin/recibe_rf.sh --> enlace a pastebin.
Si te fijas, hago uso del demonio X10 que creé en este otro post.
Ahora mismo el script es bastante escueto, he dejado sólo parte del sensor de palmadas, que por cierto hay que rellenar los datos en la tabla de sensores:

Cargando el código en el ATTiny85

Volvemos a lo divertido. Usando el Arduino Uno como ISP, como ya he explicado en este post, cargamos este programa en el ATTiny85:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int vol = 0;
int volPin = 2;
int powerPin = 0;
long envio = 0;
long code = 114;
long contador = 0;
int vol2= 10;

void setup() {
  mySwitch.enableTransmit(1);
  code = code * 10000000;
  pinMode(powerPin, OUTPUT);
}

void loop() {
  for (int i=0; i <=9; i++){
    contador = i * 10000;
    vol = analogRead(volPin);
    if (vol < 8){
      delay(100);
      for (int n=0; n <=10000; n++){
        vol2 = analogRead(volPin);
        if (vol2 < 9){
          digitalWrite(powerPin, HIGH);
          envio = code + contador + 1;
          mySwitch.send(envio, 32);
          digitalWrite(powerPin, LOW);
          n = 9999;
        }
      }
      delay(1000);
    }
  }
}
¡¡OJO!! esta es la primera versión, no exenta de fallos. Por ejemplo le falta un calibración previa del ruido de la habitación, que ya tengo casi preparada. Los valores de if (vol < 8) y if (vol2 < 9) corresponden a los niveles que he registrado haciendo pruebas, con mi micrófono de chichinabo y la resistencia de 100KΩ, es un valor muy bajo, lo suyo seria recibir un valor entorno a 500.

Conclusiones finales

Este es el primer sensor, es un post largo y aburrido porque tenia que explicar paso a paso todo, desde la creación de la base de datos, modificar el código en C para que ejecute el script. Soy consciente de que este post es un muermo, los siguientes sensores serán post más cortitos y entretenidos, lo prometo.
Y aquí el vídeo con el resultado (tanto curro para esto):

33 comentarios:

  1. Hola Juanmol, entiendo que aunque sea pegando 2 gritos seguidos tambien funcionaria no? o como funciona? molaria que comentases el codigo para entender como funciona.
    mil gracias por tus tutoriales son la leche de buenos ;)

    ResponderEliminar
    Respuestas
    1. esta primera version, aparia las luces incluso con un ruido alto y continuado, es la version de prueba. Cuando lo actualice, solo funcionara con dos golpes secos seguidos, sobre el nivel de ruido de la habitacion. Lo tengo casi listo, pero me he adelantado un poco con este post,ya que me lo andabais pidiendo a gritos ;)

      Eliminar
    2. Dispongo de un circuito que es un poco más complejo y eficiente, pero ya es bastante mas "gordote", no hace uso de ningún micro, tan solo activa un relé con 2 palmadas y lo desactiva también con 2 palmadas, si lo encuentro os lo paso para que podáis ver como implementar un pequeño filtro para que sea más selectivo, un saludo!

      Eliminar
    3. http://www.transistorez.com/imagenes/activacionpalmada/activacionpalmada.jpg

      Aquí os dejo el circuito, es un preamplificador para el micro y con el archiconocido 555 creamos un pulso por cada palmada, como véis no es tan pequeño como el que está aquí pero es más efectivo y discrimina más las palmadas, aunque no es 100% efectivo cumple su cometido. Saludos!

      Eliminar
    4. pero eso esta como 10 o 12 niveles de dificultad por encima, me da hasta miedo O_O
      Ademas en ese circuito ¿donde le indicas que son dos palmadas?
      En la actualizacion del post ya vereis que calibrar el ruido y detectar una palmada sobre el nivel de este, no es para nada complicado.

      Eliminar
    5. Jajaja que no te de miedo, yo lo monté y funciona perfectamente. En ese circuito no omití la parte en la que se le "dice" cuando son dos palmadas, es un contador en el que las primeras 2 salidas no hacen nada, las 2 siguientes a través de un diodo polarizan un transistor con el cual se activa el rele y la 5 salida va a la patilla de reset. Este circuito tan solo preamplifica el sonido del micro y por medio del 555 generamos un pulso que podemos meter en cualquier micro o circuito integrado. Espero ansioso por la actualización. Un saludo

      Eliminar
  2. Hola, segun el esquema tiene una resistencia y un microfono...
    mirando las imagenes de tus prototipos tengo una pregunta, ¿donde tienes la resistencia?? y ¿donde esta el microfono? lo que aparece en la imagen se parece mucho a un transistor o algo asi....

    ResponderEliminar
    Respuestas
    1. la resistencia esta en el esquema, fijate bien, va entre los v+ y una de las patas del micro, diviendo la señal hacia la patita del attiny85.
      El microfono es esa cosa que parece un transistor, o al menos eso dice el fritzing ;)

      Eliminar
    2. perdona, ahora que lo acabo de ver, el microfono sale en el esquema, lo de las fotos es un sensor de temperatura lm35 con encapsulado como el de un transistor.

      Eliminar
    3. jejeje no te preocupes sabiendo que ese es el microfono no hay problema jejejeje sustituyo el lm35 por el micerofono y a correr ya te cuento cuando termine :)

      Eliminar
    4. por cierto ya que no soy muy entendido en electronica.... como mides el consumo para hacerte los calculos y cuales son los calculos??
      y otra duda a parte... pregunta de examen jejeje
      ¿¿se podría medir la bateria que alimente una raspberry por ejemplo cuando llegue cierto voltaje que se apague sola???
      mil gracias por contestar campeón, es un placer visitar diariamente tu web

      Eliminar
    5. para los consumos necesitas un amperimetro muy bueno que te permita medir cantidades muy pequeñas. Como no tenemos de eso, buscamos la hoja de producto del fabricante y ahi nos pone el consumo que tiene, en diferentes configuraciones.
      Como ya digo, lo que mas consume es el modulo de rf y con mucha diferencia.
      Lo de la bateria, puedes hacer muchas cosas, lo mas facil es no preocuparte, ya que cuando no le llegue suficiente chicha al rasp este se apaga. Se me ocurre que puedes ponerle un rele, como el que puse hace unos post, que este normalmente abierto y cuando el raspberry este encendido, lo conmute, de forma que al apagarlo, vuelve a abrirse.
      Yo tengo una lipo con la que he probado en varias ocasiones y dejo que el raspberry la consuma, sin proteccion ni nada. No creo que sea preocupante.

      Eliminar
    6. si esa opcion no se me ha ocurrido jejeje
      por cierto.... el micro omnidireccional es usb o de jack??
      lo conectas a las raspberry? de donde lo has comprado?
      graciass

      Eliminar
    7. es jack, lo conecto a un jack hembra, que conecto a las patitas del attiny85 que comento en el post.

      Eliminar
  3. tengo una pregunta no se si va aqui cuando terminan las descarga me envia un correo ya que mi cel no es tan smartphone jaja solo llamadas :( con la seguridad de aqui mejor prevenir se podria conectar un arduino y un modulo gsm para enviar mensajes cuando termine la descarga?? existe algun modulo para raspberry pi asi me ahorro arduino o una forma de enviar mensajes desde raspeberry pi gratis??? y por siento buen tutorial estare esperando los demas :)

    ResponderEliminar
    Respuestas
    1. esta pregunta no viene aqui, aunque gustosamente te respondo. Para enviar sms desde el raspberry necesitas un modem 3g de huawey (son los mas faciles de configurar) puse un post sobre esto. Si quieres enviarlos gratis, necesitas de alguna web que te este servicio y que ademas te permita integrarla en un script, o que tenga una api para ello, en cuyo caso, dudo de que sea gratis.
      Si encuentras una web asi, avisame.

      Eliminar
    2. jajajaja gracias si perdon no avia visto eso jejej si encuentro aviso jajajajaja

      Eliminar
    3. jajaja encontre con una de claro http://mensajes.claro.com.gt/mensaje_claro.php o pero me topo con el captcha y como enviar los patrones jajajaj

      Eliminar
  4. http://www.youtube.com/watch?v=mQJwz8xL9gQ mira este video abla sobre sms gateway jeje are mis averiguraciones enviar correos y se vuelven sms O.o

    ResponderEliminar
  5. Eres un crack!!!
    Tenia pensado hacer algo también así, pero con mensajes grabados. Es decir "Luz mesa" Persina cocina"....etc.

    Alguna cosa he visto por ahí usando el software "Festival".

    ResponderEliminar
    Respuestas
    1. Me respondo a mi mismo.
      Veo que ya tienes un post de control de voz + asterix

      Eliminar
  6. Para hacer este sensor de palmadas se necesita tener un Arduino? La verdad es que se me va de presupuesto, es para un trabajo del instituto...

    ResponderEliminar
    Respuestas
    1. hace falta para programar el attiny85. Despues lo devuelves a tu caja de cacharros electronicos.

      Eliminar
    2. hace falta para programar el attiny85. Despues lo devuelves a tu caja de cacharros electronicos.

      Eliminar
  7. Buenas! Sigo desde hace tiempo tu blog, y creo que estas navidades serán en las que monte el sistema domotico en casa. Esto me ayudo a decidirme (se negaban a que llenara la csa de cables, pero con la radiofrecuencia esta todo solucionado :) )
    Te queria pedir un favor. Sin animos de publicidad ni nada similar, podrías colgar un inventario con componentes necesarios para montar esto? lo digo por buscar tiendas/webs que donde poder comprarlo y tener una lista preparada para reyes :)

    Mil gracias.

    ResponderEliminar
    Respuestas
    1. para x10 que es lo que tengo -> http://rsppi.blogspot.com.es/2012/06/domotica-en-raspberrypi-parte-1.html
      no es el más barato pero si el mas comodo y sin necesitar mas cables, y por supuesto compatible con Raspberrypi.

      Eliminar
    2. Gracias! Pero me refería a los componentes que citabas en este articulo. Mi vaguería es suprema, y quiero encender luces con sensores de presencia, de proximidad, y ya si puede ser a remoto perfecto :) por eso me interesaba esta manera.
      Luego ya el siguiente paso para montar un sistema de alarma autonomo viene despues :) (Si, tengo muchas ideas y poco tiempo, pero puede quedar chulo)
      Mil gracias!

      Eliminar
    3. de tiempo andamos todos cortitos, llevo sin postear ...
      en este caso uso como sensor el sonico, con un jack hembra y un microfono. El resto de componentes los menciono en el post:
      - attiny85
      - Resistencia
      - cable
      - portapilas o una forma de alimentar el sensor
      - soporte, en el ejemplo uso una mini protoboard
      - emisor y receptor de rf 433mhz

      Para programar el attiny85 necesitas un arduino. A ver si saco tiempo y posteo un par de inventitos más.

      Eliminar
  8. Hola,enhorabuena por el blog. Una pregunta ¿en Sevilla dónde se puede comprar el attiny85? Las webs que he visto cobran mucho por gastos de envío. Un saludo

    ResponderEliminar
    Respuestas
    1. si lo encuentras en sevilla y a buen precio avisame!!. Yo lo compro en webs españolas, aprovecho y compro mas cosas, asi duelen menos los gastos de envio. Si quieres webs, te las digo en privado, que aun no tengo patrocinador ;)

      Eliminar
  9. Hola Juan, en espera a afianciarme un Arduino y algunos Attiny para hacer pruebas, hace días que les estoy dando vueltas a las opciones de la comunicación RF. Lo que me gustaría hacer es que en vez de procesar las palmadas, poder captar desde un micrófono inalambrico palabras que después pasar "strings" que ejecuten acciones.

    Tienes alguna idea para esto. Todo lo que hay de control de voz para la Raspberry es tu entrada de voz+asterix y el blog de mooplog replicado en un montón de sitios.

    ResponderEliminar
    Respuestas
    1. lo que tengo publicado de sonido con attiny85, mide la cantidad de señal, es decir la variacion electrica del sensor (microfono) tal y como funciona cualquier otro sensor. Es por esto, que ... no tengo ni idea de cómo reconocer palabras con attiny85 o arduino. Se que se puede usar sphinx, pero no se lleva bien con el español, ni lo he probado (en linux si lo he probado).
      El post que puse de voz+asterisk puede prescindir del asterisk, el script es el mismo, pero la grabacion viene desde otra fuente.

      Eliminar
  10. Buenisimo post, tienes uno parecido pero con un sensor pir de movimiento? Mi idea es colocar sensores de movimientos inalambricos por toda la casa y enviarlos a la raspberry para almacenar en una base de datos el historial.

    Muchas gracias

    ResponderEliminar