martes, 31 de julio de 2012

Alarma laser usando GPIO


tecnología punta a precio de risa


Llevo unos días probando distintas configuraciones de los GPIO de mi RaspberryPi. En términos generales estoy bastante contento, pero he tenido que darle muchas vueltas hasta dejarlo fino. En este post vamos a ver como podemos defender nuestra casa, con nuestro querido RaspberryPi y laser. Vamos al lio...

Antes de nada, si no sabes que es GPIO, mírate la web correspondiente. Si no tienes ganas de leer te diré que es el interfaz de conectores, que le proporciona al RaspberryPi cierta electrónica como la de un Arduino. Evidentemente tiene sus limitaciones. Lo que queremos conseguir queda reflejado en el siguiente gif:
Fácil ¿verdad? vamos a defender nuestro hogar con un laser que corte en cachitos a los intrusos. Hasta que consiga en Dealextreme un láser con esa potencia, lo que voy a usar es un láser de juguete que active la alarma. Esto son los componentes que voy a usar:

  • El láser: voy a reutilizar uno que compré hace años para otro invento, me viene de perlas porque tiene un soporte regulable. Si no tienes, puedes comprar uno de esos llaveros que venden en los chinos que no cuestan más de 3 euros.


  • Fotoresistencia: lo podéis comprar en una tienda de electrónica, cuesta unos pocos céntimos. Yo reutilizaré uno de un kit de Arduino para ... otro invento:

  • Espejos: para poder alargar el alcance de nuestro láser, haciéndolo rebotar por toda la casa. Por supuesto, del chino también, de la sección de maquillaje.
  • Otros: por supuesto cables y resistencias. Y el siguiente esquema:


ADVERTENCIA: vamos a jugar con voltios y un láser, asegúrate de tomar las medidas necesarias para no quedarte sin tu Raspberry y sin un ojo.


Manos a la obra

la idea es que el Raspberry alimente el láser y además lo reciba para que actúe cuando se interrumpa la continuidad del láser. Primero vamos a hacer un pequeño circuito para probar el láser, este es el mio:

Fácil fácil. Empezaremos conectando el láser (diodo láser) a la salida de 3.3V, a una resistencia 'cortita' y al pin 12, correspondiente al GPIO 18. La mejor solución que he encontrado, es usar wiringPi:
wget http://project-downloads.drogon.net/files/wiringPi.tgz
tar xfz wiringPi.tgz
cd wiringPi/wiringPi
make
sudo make install
cd ../gpio
make
sudo make install
Comprobamos:
# gpio -v
gpio version: 1.0
Copyright (c) 2012 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
Bien bien bien, ahora dejamos de apuntarnos con el láser a la pupila y lo encendemos:
gpio -g mode 18 out
gpio -g write 18 0
perfecto diría yo, apagamos:
gpio -g write 18 1
gpio unexport 18
... qué bien nos lo vamos a pasar ...
En mi caso he dejado el láser sin resistencia y lo he conectado al pin de 5V, por favor asegúrate de no hacer burradas. El esquema final para la alarma es:
Tendrás que jugar un poco con las resistencias para ajustar la fotoresistencia a la luz de la habitación y a la del láser. Vamos a probar:

Primer paso: comprobamos el estado de la fotoresistencia:
# gpio -g mode 17 in
# gpio -g read 17
0
Eso significa que el circuito esta abierto, no recibe luz del láser.
Segundo paso: apuntar con el laser a la fotoresistencia y encenderlo:
# gpio -g mode 18 out
# gpio -g write 18 0
Tercer paso: comprobamos de nuevo el estado de la fotoresistencia:
# gpio -g read 17
0
Eso significa que al llegarle la luz del láser a la fotoresistencia, esta cierra el circuito, llegándole un '0' al GPIO17.
Cuarto paso: limpiamos
gpio -g write 18 1
gpio unexportall
Muy bien muy bien, podríamos hacer un script ahora, por ejemplo:
#!/bin/bash
# alarma laser
# programado por Juanmol para http://rsppi.blogspot.com
gpio -g mode 18 out
gpio -g mode 17 in
gpio -g write 18 0
while ((1));
do
        if [ "$(gpio -g read 17)" -eq "0" ];
        then
                echo "no pasa nada, relajate";
                sleep 0.5;
        else
                echo "ALARMA!! ALARMA!!";
                sleep 10;
        fi
done
El primer sleep es para no "agobiar" al sistema. Damos permisos:
chmod +x /usr/local/bin/alarmalaser.sh
Lo ejecutamos y probamos cortar la línea de luz del láser ¿a que mola? Ahora viene lo más complicado de todo ...

poner espejitos para hacer rebotar el láser por toda la casa ... con un gato

Ahora, para mejorar la alarma, voy a intentar ir haciendo rebotar el láser por toda la casa, contra unos espejitos que me he comprado en el chino. Pero claro ... tengo un gato ...
Así que por ahora no he podido ajustar los rebotes ...

ACTUALIZACIÓN: Friky no me ha dejado poner el láser por toda la casa, pero me ha permitido hacer un minicircuito láser para enseñároslo:

este post es la leche


42 comentarios:

  1. Eres un monstruo macho... en cuanto me llegue te aseguro que haré casi todo lo que pones xDD y soy el mas novato de la tierra

    ResponderEliminar
  2. Hola amigo, acabo de encontrar tu blog mirando temas del servidor dlna. Cuando he visto tu entrada referente a la alarma láser, me ha llamado mucho la atención.

    Me gustaría dar un paso más y construirme un pequeño SAI y conectar mi raspberry a través de una tarjeta SIM por si a los cacos les da por cortar la luz.

    ResponderEliminar
  3. soy juanmol no puedo hacer login ahora. Para la bateria puedes usar una de esas externas para moviles que te dan un par de cargas extra, en dealextreme hay millones pero si no quieres esperar, tambien tienes en los chinos y en phonehouse. Para la sim, no te marees y usa un modem 3g con posibilidad de voz y el chan_mobile en Asterisk. Fasi fasi.

    ResponderEliminar
  4. Vaya, tan sencillo verdad? bueno, pero claro, lo ideal sería mantener en carga la batería siempre, verdad?

    Ahí el dilema o desconocimiento.
    1. tengo la bateria en carga continua para que cuando falle la luz, la raspberry se alimente de la bateria? sería la solución fácil, pero no se latimaría la batería enseguida?

    2. montarme un circuito que active/desactive la batería según se necesite cargar o descargar hacia la raspberry.

    ... pero vamos... que más facil no era... una simple batería de litio de unmovil. jejej que burro.

    ResponderEliminar
  5. Cual es el compilador que se usa para para introducir los códigos

    ResponderEliminar
    Respuestas
    1. no necesita compilador ... o no te entiendo muy bien ...

      Eliminar
    2. Me refiero a que en donde es donde se introduce el programa que aparece aquí arriba,

      Eliminar
    3. nada nada, va a pelo en un script en la shell.

      Eliminar
  6. Se masca la tragedia, no hay nada que se lleve peor con una alarma que un gato.
    Al fina acabarás desactivando la alarma o el gato, y espero que sea la primera.
    Yo la enfocaría mas por control de los accesos y hacer del raspberry más un mayordomo que un perro guardián.
    Salud

    ResponderEliminar
  7. Tengo una duda/idea...

    Como puedo hacer que en lugar de que me haga un aviso por ejemplo por gtalk diciendo "ALARMA ALARMA!" tal y como has hecho, suene un mp3 por los altavoces del raspberry pi?

    ResponderEliminar
    Respuestas
    1. Jejeje... Googleando un poco tengo la solución. Usamos eso en el MP3 despertador, pero de otro modo y se me olvidó. Ahora mis alarmas, a parte de en GTalk, seran habladas por el altavoz!!!

      Por ejemplo, ahora mando por gtalk "9988 transmission off", me responde por Gtalk i me reproduce por los altavoces "Acabo de parar Transmission".

      Ahi va el comando:
      mplayer -really-quiet "http://translate.google.com/translate_tts?tl=es&q=Acabo de parar Transmission"

      Eliminar
    2. combinar mplayer con tts de Google ¡¡ACIERTO!! y ya si pudieramos hacer algo como:
      mplayer -really-quiet "http://translate.google.com/translate_tts?tl=es&q=Acabo de parar Transmission" -DLNA http://a_la_tv_del_salon
      estaría genial.

      Eliminar
    3. Pero es posible eso? Es decir, puedo reproducir por DLNA al TV con ese comando? Como puedo saber cual es la direccion de mi tv?...

      He visto en algun video de una casa domótica, que un tio al entrar en su casa, no recuerdo si es al abrir la luz, (o mediante alarma laser.... ;) ) consigue que su televisor le salude, y se enciende de repente XBMC.

      Que se encienda XBMC, la mar de sencillo, pero que salude antes... eso como es, que el televisor aunque este "apagado" o en reposo, al mandar una señal DLNA se enciende? Cuanta pregunta... si señor.

      Eliminar
    4. el parametro -DLNA me lo acabo de sacar de la manga, ojalá fuese así.
      Para lo del saludo ... supongo que es algo tiene esa tele, porque si pudiesemos mandarle por DLNA el saludo, tendria que estar encendida. Por lo menos mi tv samsumg, si no esta encendida, no tiene ping. A ver que se me ocurre.

      Eliminar
    5. Te paso el video del que te hablo:
      http://www.youtube.com/watch?v=a7mIxS8hKuQ

      Al parecer al llegar en el coche activa las luces y el sistema, asi al abrir la puerta todo esta preparado. (quiza via VPN con algun comando?) Yo lo haria o bien con el Automateit pro de Android, que al detectar que estoy cerca de casa mande una señal para activar. La duda, y como activo la TV? Debe estar siempre encendida?

      Mas adelante en el video muestra como apaga o enciende la TV con una tableta. Si la apaga... luego como se enciende?

      Despues de varias demostraciones de XBMC que hace el tio muestra un servidor orgulloso de las pelas que se ha "gastao". Si supiera que estamos haciendo un sistema por 10 veces menos que el y con la mitad de espacio quiza no estaria tan orgulloso de su video! Muahahaha

      Eliminar
    6. levanta el sistema con el wifi del movil, yo tengo algo asi en pruebas. Normalmente se conecta el movil al wifi antes que yo a la puerta de casa. Lo unico complicado seria encender la tv, se me ocurre:
      - algo con CEC (ni idea)
      - un emisor de IR que mande la orden de encender, como lo hace el mando a distancia.
      - mandar la orden de encender, desde el Raspberry a la TV, usando uno de esos minimandos de los chinos, por ejemplo http://www.miniinthebox.com/es/tv-super-mini-mando-a-distancia-universal-de-llavero_p154201.html usando GPIO ...
      umm la 3ª opcion es interesantisima para combinarla con un simulador de presencia ... lo mismo este finde hago algo de esto.

      Eliminar
    7. Jajaja,... si al final el tio este temblara tirandose de los pelos porque haremos algo infinitamente mejor...

      Oye, una idea... Y con la alarma laser? O con un modulo detector de presencia? No se si X10 tiene algo de eso...

      Eliminar
    8. para detector de presencia tenia pensado una webcam con infrarojos, aunque en X10 tambien tienes volumétricos, lo que te guste más.

      Eliminar
    9. La opcion de la camara por infrarojos seria genial, pues tengo una Foscam que se ajustaria a eso!!

      Eliminar
    10. pues si ya tienes la webcam:
      motion + IR webcam
      o bien, que es lo que pretendo y estoy escribiendo un post:
      ZoneMinder + IR webcam

      Eliminar
    11. Espero tu post con "ANSIA VIVA!"

      Eliminar
  8. Aquí uno que no tiene ni idea de electrónica... ¿podrías listar las especificaciones de cada componente usado? Y ya puestos... ¿algún manualete estilo "Electrónica para dummies" recomendable?

    Genial el artículo. Me gustaría poder ponerlo en práctica, pero siento que me faltan conocimientos.

    ResponderEliminar
    Respuestas
    1. ya somos dos que no tenemos ni idea :) no hay nada más for dummies que este post

      Eliminar
    2. Jeje más idea que yo seguro. Me referia a p.ej. dado un laser y una fotoresistencia, ¿cómo calculas la resistencia que les toca? Sé que es en función del consumo que necesitan, pero me falta la teoría/la base, vamos.

      Tampoco entiendo bien los esquemas ni porqué son como son. P.ej. ¿porqué del pin de 5v sale alimentación tanto para el laser como para la fotoresistencia? ¿Porqué el circuito se cierra en el GPIO18 en el primer caso y en el GPIO17 + Ground en el segundo? ¿Y porqué lleva 2 resistencias?

      En fin, demasiadas preguntas. Voy a ver qué encuentro por la red, gracias de todos modos.

      Eliminar
  9. Buenas, a ver si me podéis echar un cable... no puedo instalar la librería y por mucho que busco soy incapaz de solucionarlo. Mi problema es que al hacer "make" dentro de la carpeta "gpio" me aparece un error "ld 1 exit status", sabéis a qué puede ser debido? o lo que es mejor, como lo puedo solucionar?¿ muchísimas gracias de antemano....

    ResponderEliminar
    Respuestas
    1. pega aquí las últimas líneas del error, así tendremos más información.

      Eliminar
  10. Buenas.
    Si tenéis problemas para reproducir con mplayer porque tarda mucho, puede ser porque esté resolviendo por IPv6, para eso se puede forzar a que utilize IPv4 con el siguiente flag.
    -prefer-ipv4
    mplayer -prefer-ipv4 "http://translate.google.com/translate_tts?tl=es&q=Prueba"

    Saludos.

    ResponderEliminar
  11. Hola,

    gracias por tu articulo, y perdoname por ser purista pero creo que tienes un error en la explicación, yo no entiendo mucho y me puedo equivocar pero en las lineas que cito...

    Primer paso: comprobamos el estado de la fotoresistencia:
    # gpio -g mode 17 in
    # gpio -g read 17
    Eso significa que el circuito esta abierto, no recibe luz del láser.
    Segundo paso: apuntar con el laser a la fotoresistencia y encenderlo:
    # gpio -g mode 18 out
    # gpio -g write 18 0
    Tercer paso: comprobamos de nuevo el estado de la fotoresistencia:
    # gpio -g read 17
    Eso significa que al llegarle la luz del láser a la fotoresistencia, esta cierra el circuito, llegándole un '0' al GPIO17.

    Es extraño recibir de gpio 17 un 0 tanto con luz en la celula fotoelectrica como sin ella, así que asumo que uno de los 2 resultados está mal escrito.

    Un saludo,
    y gracias por tu trabajo.

    ResponderEliminar
    Respuestas
    1. es raro desde luego, pero es así, al menos con la versión y con la instalación sin-conocimientos que realicé, que ahora veo que no es la más correcta. Tengo que revisar casi todos los posts que he ido escribiendo. En este caso, usar el GPIO de 5v no es lo más correcto.
      Creo que lo que falta ahí es lo que se deja entrever en el propio script. Pero vamos que voy a hacer otra versión un poco más "purista" ;)

      Eliminar
  12. ante todo felicidades por tu trabajo que aunque a veces no funcionen las cosas se agradece que alguien se tome la molestia de publicarlo para el resto que no entendemos por cierto....que tal va esa nueva versión?
    Animo y felicidades

    ResponderEliminar
    Respuestas
    1. Hola, la parte del GTalk (Hangout (Conversaciones)) ya está solucionada en http://rsppi.blogspot.com.es/2013/07/uso-de-hangouts-gtalk-para-el-envio-de.html

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

    ResponderEliminar
    Respuestas
    1. Emilio esto es del post del relé o del laser??? Si es del relé, ponlo allí y borra este, que si no después no encontramos ná-

      Eliminar
  14. Hola, estoy pensando en hacer un sistema de alarma pero con dos sensores PIR. ¿Como puedo conectar dos sensores PIR de 5V cada uno a la rsppi?

    Un saludo, Javi

    ResponderEliminar
    Respuestas
    1. pues te va a hacer falta alimentar los sensores por separado, seguro. Cuando soluciones la parte de la alimentación, "leer" la información es lo mismo que cualquier sensor, te llega una cantidad de señal, y tu la usas configurando algunos límites. Puede que el PIR venga con un relé y un potenciómetro, para que te de una señal digital.
      Yo usaría una pila de 9v y un emisor de RF para hacerme sensores inalámbricos.

      Eliminar
  15. Hola Juan Mol,
    estoy intentando montar tu sistema de láser para un proyecto, pero llevo ya unos días atascado y no encuentro solución.
    Me preguntaba si podrías echarme una mano, ya que se me echa el tiempo encima.
    Gracias de antemano.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. Hola, hace unos días estuve mirando esto con otra consulta, y según pudimos comprobar lo que ha cambiado es la forma de nombrar los gpios, que puede que sea lo que te esta fallando. Cuando usas:
      gpio -g write 24 1
      tienes que mirar en esta tabla:
      http://wiringpi.com/wp-content/uploads/2013/03/gpio1.png
      la columna BCM GPIO, que no era así cuando hice este post. Espero que sólo sea eso lo que te falla. Si no es así vuelve a preguntar, no te cortes ;)

      Eliminar
  16. El fallo es aqui:

    "Bien bien bien, ahora dejamos de apuntarnos con el láser a la pupila y lo encendemos:
    1 gpio -g mode 18 out
    2 gpio -g write 18 0 "

    Se supone que al hacer eso el láser debería encender, pero no hace nada. El láser es el típico que pulsas para que se encienda, pero he dejado los botones pulsados con fiso.

    ResponderEliminar
    Respuestas
    1. seguro que es lo que te comento, quita el laser y pon un led (la pata larga al GPIO y la corta al GND), si el led se enciende, es que no le llega suficiente intensidad al laser o as cambiado la polaridad. Si el led no se enciende, es por lo que te decía antes, estas usando el 18, pero no se corresponde con el mismo 18 de mi post, guiate por la tabla del comentario anterior.
      Si nada de esto te funciona, vuelve a preguntar ;)

      Eliminar
    2. Vale, probare eso. Luego a la tarde-noche comento si funciona, que ahora estoy en el trabajo.

      Gracias!

      Eliminar
    3. Al final lo conseguí averiguar. Y acabé a tiempo el proyecto. Gracias por la ayuda!!

      Un saludo.

      Eliminar