Tabla de contenido:

Pool Pi Guy - Sistema de alarma impulsado por IA y monitoreo de piscinas usando Raspberry Pi: 12 pasos (con imágenes)
Pool Pi Guy - Sistema de alarma impulsado por IA y monitoreo de piscinas usando Raspberry Pi: 12 pasos (con imágenes)

Video: Pool Pi Guy - Sistema de alarma impulsado por IA y monitoreo de piscinas usando Raspberry Pi: 12 pasos (con imágenes)

Video: Pool Pi Guy - Sistema de alarma impulsado por IA y monitoreo de piscinas usando Raspberry Pi: 12 pasos (con imágenes)
Video: Programa tu Alarma con Arduino usando Interrupciones 2024, Mes de julio
Anonim
Pool Pi Guy: sistema de alarma impulsado por IA y monitoreo de piscinas con Raspberry Pi
Pool Pi Guy: sistema de alarma impulsado por IA y monitoreo de piscinas con Raspberry Pi

Tener una piscina en casa es divertido, pero conlleva una gran responsabilidad. Mi mayor preocupación es monitorear si alguien está cerca de la piscina sin supervisión (especialmente los niños más pequeños). Mi mayor molestia es asegurarme de que la línea de agua de la piscina nunca pase por debajo de la entrada de la bomba, lo que haría que la bomba se secara y la destruyera con un costo de $$$ en reparaciones.

Recientemente descubrí cómo usar una Raspberry Pi con OpenCV y TensorFlow, junto con un sensor de nivel de agua y una válvula solenoide para resolver ambos problemas, ¡y divertirme haciéndolo!

También resulta ser un gran sistema de alarma: activado por movimiento, controlado por IA, infinitamente personalizable.

Vamos a sumergirnos.

Paso 1: Gran plan

En este instructivo, mostraremos cómo:

  1. Configurar una Raspberry Pi con OpenCV y TensorFlow
  2. Conecte una cámara web a través de un cable USB largo
  3. Escribe un algoritmo OpenCV para detectar movimiento
  4. Usa TensorFlow para la detección de objetos
  5. Configure un servidor web en la Raspberry Pi para mostrar las imágenes interesantes
  6. Integre con IFTTT para activar alertas móviles en caso de que se detecte a una persona
  7. Adjunte un relé HAT a la Raspberry Pi y conéctelo a una válvula solenoide que agregaría agua a la piscina
  8. Conecte un sensor de nivel de agua a la Raspberry Pi e interactúe con él usando el GPIO de Pi
  9. Escribe un código para pegarlo todo junto

Paso 2: lista de compras

Lista de la compra
Lista de la compra

Todos los componentes están disponibles en Amazon. Siéntase libre de experimentar e intercambiar componentes, ¡eso es la mitad de la diversión!

  1. Frambuesa pi
  2. Fuente de alimentación Raspberry Pi (no escatime aquí)
  3. Tarjeta de memoria (cuanto más grande, mejor)
  4. Estuche (este es lo suficientemente grande como para albergar tanto el Pi como el HAT)
  5. Cámara web USB (cualquier cámara web servirá, pero desea una que obtenga buenas imágenes y equilibre bien la iluminación)
  6. Cable de extensión USB (si es necesario, mida la distancia entre el Pi y el lugar donde colocaría la cámara)
  7. Placa de relés HAT (este tiene 3 relés y solo necesitamos uno, ¡pero pronto encontrarás un uso para los demás!)
  8. Solenoide
  9. Conexión de solenoide 1 y conexión 2 (eso realmente depende de a qué le coloque el solenoide, pero esto funcionó para mí)
  10. Fuente de alimentación de solenoide (cualquier CA de 24 V sería suficiente)
  11. Cable (de nuevo, casi cualquier cable de 2 hilos serviría, la corriente es mínima)
  12. Interruptor de flotador de nivel de agua (este es solo un ejemplo, verifique qué se puede conectar fácilmente a su piscina)
  13. Algunos cables de puente y conectores de cables

Paso 3: configura tu Raspberry Pi

Configura tu Raspberry Pi
Configura tu Raspberry Pi

Raspberry Pi es una gran computadora. Cuesta solo $ 35, se ejecuta de manera constante y tiene una gran cantidad de software y hardware compatible. Configurarlo es bastante fácil:

  1. Formatea tu tarjeta SD. Esto requiere un cuidado especial: Raspberry Pi solo puede arrancar desde una tarjeta SD formateada FAT. Siga estas instrucciones.
  2. Conecte la Raspberry Pi a un teclado y mouse USB, además de una pantalla HDMI, y siga las instrucciones del tutorial de Raspberry Pi NOOBS. Asegúrese de configurar WiFi y habilitar el acceso SSH. No olvide configurar una contraseña para la cuenta pi predeterminada.
  3. En la red de su hogar, configure una IP estática para la Raspberry Pi; haría mucho más fácil SSH.
  4. Asegúrese de tener un cliente ssh instalado en su computadora de escritorio / portátil. Para una PC, recomendaría Putty, que puede instalar desde aquí.
  5. Desenganche el USB y HDMI de la Raspberry Pi, reinícielo y ssh en él; si todo funcionó, debería ver algo como esto:

Linux raspberrypi 4.14.98-v7 + # 1200 SMP Mar 12 de febrero 20:27:48 GMT 2019 armv7l

Los programas incluidos con el sistema Debian GNU / Linux son software libre; los términos de distribución exactos para cada programa se describen en los archivos individuales en / usr / share / doc / * / copyright. Debian GNU / Linux viene SIN ABSOLUTAMENTE NINGUNA GARANTÍA, en la medida en que lo permita la ley aplicable. Último inicio de sesión: lun 13 de mayo 10:41:40 2019 desde 104.36.248.13 pi @ raspberrypi: ~ $

Paso 4: Configurar OpenCV

Configurar OpenCV
Configurar OpenCV

OpenCV es una asombrosa colección de funciones de manipulación de imágenes para visión por computadora. Nos permitirá leer imágenes de la Webcam, manipularlas para encontrar áreas de movimiento, guardarlas y más. La instalación en la Raspberry Pi no es difícil, pero requiere cierto cuidado.

Comience instalando virtaulenvwrapper: usaremos python para hacer toda nuestra programación, y virtualenv nos ayudaría a mantener las dependencias separadas para OpenCV y TensorFlow vs. Flask o GPIO:

pi @ raspberrypi: ~ $ sudo pip install virtualenvwrapper

Ahora puede ejecutar "mkvirtualenv" para crear un nuevo entorno, "workon" para trabajar en él y más.

Entonces, creemos un entorno para nuestra manipulación de imágenes, con python 3 como intérprete predeterminado (es 2019, no hay razón para seguir con la versión anterior de python 2):

pi @ raspberrypi: ~ $ mkvirtualenv cv -p python3

… (Cv) pi @ raspberrypi: ~

Ahora estamos listos para instalar OpenCV. En su mayoría, seguiremos el excelente tutorial en Learn OpenCV. Siga específicamente sus pasos 1 y 2:

sudo apt -y updatesudo apt -y upgrade ## Instalar dependencias sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm sudo apt-get -y install git gfortran sudo apt-get -y install libjpeg8-dev libjasper- dev libpng12-dev sudo apt-get -y install libtiff5-dev sudo apt-get -y install libtiff-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get - y instale libxine2-dev libv4l-dev cd / usr / include / linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0. 10-dev sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default sudo apt-get -y install libatlas-base-dev sudo apt-get -y install libmp3lame-dev libtheora-dev sudo apt-get -y instalar libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y install libavresample-dev sudo apt-get -y install x264 v4l-utils sudo apt-get -y instalar libprotobuf -dev protobuf-compiler sudo apt-get -y install libgoogle-glog-dev libgflags-dev sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get install libqtgui4 sudo apt-get install libqt4- prueba

Ahora podemos instalar OpenCV con enlaces de python dentro del cv virtualenv (todavía estás en él, ¿verdad?) Usando

pip instalar opencv-contrib-python

¡Y eso es! Tenemos OpenCV instalado en nuestra Raspberry Pi, listo para capturar fotos y videos, manipularlos y ser genial.

Verifique eso abriendo un intérprete de Python e importando opencv y verifique que no haya errores:

(cv) pi @ raspberrypi: ~ $ python

Python 3.5.3 (predeterminado, 27 de septiembre de 2018, 17:25:39) [GCC 6.3.0 20170516] en Linux Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información. >>> importar cv2 >>>

Paso 5: Configura TensorFlow

Configurar TensorFlow
Configurar TensorFlow

TensorFlow es un marco de aprendizaje automático / IA desarrollado y mantenido por Google. Tiene un amplio soporte para modelos de aprendizaje profundo para una variedad de tareas, incluida la detección de objetos en imágenes, y ahora es bastante simple de instalar en Raspberry Pi. El rendimiento de sus modelos ligeros en el diminuto Pi es de alrededor de 1 fotograma por segundo, lo que es perfectamente adecuado para una aplicación como la nuestra.

Básicamente, seguiremos el excelente tutorial de Edje Electronics, con modificaciones posibles gracias a distribuciones más recientes de TensorFlow:

pi @ raspberrypi: ~ $ trabajo en cv

(cv) pi @ raspberrypi: ~ $ pip install tensorflow (cv) pi @ raspberrypi: ~ $ sudo apt-get install libxml2-dev libxslt-dev (cv) pi @ raspberrypi: ~ $ pip install pillow lxml jupyter matplotlib cython (cv)) pi @ raspberrypi: ~ $ sudo apt-get install python-tk

Ahora necesitamos compilar el protobuf de Google. Simplemente siga las instrucciones del paso 4 del mismo excelente tutorial.

Finalmente, clone y configure las definiciones del modelo de TensorFlow: siga el paso 5 en el tutorial de Edje Electronics

Siéntase libre de seguir su ejemplo en el paso 6 también, es una gran introducción a la detección de objetos en la Raspberry Pi.

Paso 6: Detección de movimiento usando OpenCV

Comencemos probando que OpenCV puede interactuar con nuestra cámara web: ssh en la Raspberry Pi, muévete al cv virtualenv (workon cv), abre un intérprete de Python (solo escribe python) e ingresa los siguientes comandos de Python:

importar cv2

cap = cv2. VideoCapture (0) cap.set (cv2. CAP_PROP_FRAME_WIDTH, 1920) cap.set (cv2. CAP_PROP_FRAME_HEIGHT, 1080) ret, frame = cap.read () print ('Tamaño del marco de lectura: {} x {}'.format (frame.shape [1], frame.shape [0])

Con un poco de suerte, verá que OpenCV pudo leer un cuadro HD de la cámara.

Puede usar cv2.imwrite (ruta, marco) para escribir ese marco en el disco y volver a ejecutarlo para darle una mirada real.

La estrategia para detectar movimiento es bastante sencilla:

  1. Trabaje en fotogramas de menor resolución: aquí no es necesario operar en Full HD
  2. Además, difumine las imágenes para garantizar el menor ruido posible.
  3. Mantenga un promedio móvil de los últimos N fotogramas. Para esta aplicación, donde la velocidad de fotogramas es de alrededor de 1 FPS (solo porque TensorFlow toma algo de tiempo por fotograma), encontré que N = 60 arroja buenos resultados. Y dado que una implementación cuidadosa no requiere más CPU con más fotogramas, está bien (se necesita más memoria, pero eso es insignificante cuando trabajamos con fotogramas de menor resolución)
  4. Reste la imagen actual del promedio corriente (solo tenga cuidado al escribir; debe permitir valores positivos y negativos [-255.. 255], por lo que el marco debe convertirse a int)
  5. Puede realizar la resta en una conversión de escala de grises del fotograma (y el promedio), o hacerlo por separado para cada uno de los canales RGB y luego combinar los resultados (que es la estrategia que elegí, haciéndola sensible a los cambios de color)
  6. Utilice un umbral en el delta y elimine el ruido por erosión y dilatación.
  7. Por último, busque los contornos de las áreas con un delta: estas áreas son donde se ha producido el movimiento y la imagen actual es diferente del promedio de las imágenes anteriores. Además, podemos encontrar cuadros delimitadores para estos contornos si es necesario.

He encapsulado el código para hacer esto en la clase de python DeltaFinder que puede encontrar en mi github aquí

Paso 7: Detecta objetos con TensorFlow

Si ha seguido el procedimiento de instalación de TensorFlow, ya ha probado que tiene TensorFlow instalado y funcionando.

Con el fin de detectar personas en una escena exterior general, los modelos que están entrenados previamente en el conjunto de datos COCO funcionan bastante bien, que es exactamente el modelo que hemos descargado al final de la instalación de TensorFlow. ¡Solo necesitamos usarlo para inferencia!

Nuevamente, he encapsulado la carga del modelo y la inferencia en la clase de python TFClassify para facilitar las cosas, que puede encontrar aquí.

Paso 8: Configure un servidor web en Raspberry Pi

Configurar un servidor web en Raspberry Pi
Configurar un servidor web en Raspberry Pi

La forma más fácil de acceder a los resultados de la detección de objetos es un navegador web, así que configuremos un servidor web en la Raspberry Pi. Luego podemos configurarlo para que sirva imágenes de un directorio determinado.

Hay varias opciones para un marco de servidor web. Elegí Flask. Es extremadamente configurable y fácil de ampliar con Python. Dado que la "escala" que necesitamos es trivial, fue más que suficiente.

Sugiero instalarlo en un nuevo virtualenv, entonces:

pi @ raspberrypi: ~ $ mkvirtualenv servidor web

(servidor web) pi @ raspberrypi: ~ $ pip install Flask

Tenga en cuenta que con una configuración de red normal solo será accesible cuando su navegador esté en la misma LAN inalámbrica que su Raspberry Pi. Puede crear una configuración de asignación de puertos / NAT en su enrutador de Internet para permitir el acceso externo, pero no lo recomiendo. El código que escribí no intenta proporcionar la seguridad que necesitaría al permitir el acceso general a Internet a su Raspberry Pi.

Pruebe su instalación siguiendo la guía de inicio rápido de Flask

Paso 9: Notificaciones móviles de Raspberry Pi usando IFTTT

Notificaciones móviles de Raspberry Pi usando IFTTT
Notificaciones móviles de Raspberry Pi usando IFTTT

Realmente quiero recibir notificaciones móviles cuando ocurran eventos. En este caso, cuando se detecta una persona y cuando el nivel del agua baja. La forma más sencilla que encontré para hacer eso, sin tener que escribir una aplicación móvil personalizada, es usando IFTTT. IFTTT significa "If This Then That" y permite que muchos tipos de eventos desencadenen muchos tipos de acciones. En nuestro caso, estamos interesados en el disparador de webhook de IFTTT Maker. Esto nos permite activar una acción IFTTT al realizar una solicitud HTTP POST al servidor IFTTT con una clave especial asignada a nuestra cuenta, junto con datos que especifican lo que sucedió. La acción que tomamos puede ser tan simple como crear una notificación en nuestro dispositivo móvil usando la aplicación móvil IFTTT, o algo más complejo que eso.

Así es como se hace:

  1. Cree una cuenta IFTTT en ifttt.com
  2. Mientras está conectado, vaya a la página de configuración del servicio Webhook e ingrese la URL en su navegador (algo así como https://maker.ifttt.com/use/. Esa página web le mostrará su clave y la URL que debe usar para activar acciones.
  3. Cree un subprograma IFTTT que generará una notificación móvil cuando se active el Webhook con los detalles del evento:

    1. Haga clic en "Mis subprogramas" y luego en "Nuevo subprograma".
    2. Haga clic en "+ esto" y elija "webhooks". Haga clic en "Recibir una solicitud web" para continuar con los detalles.
    3. Dale un nombre a tu evento, p. Ej. "PoolEvent" y haga clic en "Crear activador"
    4. Haga clic en "+ eso" y elija "notificaciones". Luego, elija "Enviar una notificación enriquecida desde la aplicación IFTTT"
    5. Para "título", elija algo como "PoolPi"
    6. Para el "mensaje", escriba "Pool Pi detectado:" y haga clic en "agregar ingrediente".. "Valor1".
    7. Vuelva a la URL que copió en el paso 2. Se mostrará la URL que se utilizará para invocar su subprograma recién creado. Copie esa URL, reemplazando el marcador de posición {evento} con el nombre del evento (en nuestro ejemplo PoolEvent)
  4. Descargue, instale e inicie sesión en la aplicación IFTTT para su dispositivo móvil
  5. Ejecute este script de Python en su Raspberry Pi para ver cómo funciona (tenga en cuenta que puede tardar unos segundos o minutos en activarse en su dispositivo móvil):

solicitudes de importación

request.post ('https://maker.ifttt.com/trigger/PoolEvent/with/key/', json = {"value1": "Notificaciones de saludo"})

Paso 10: agregue un HAT de relé a la Raspberry Pi y conéctelo a una válvula solenoide

Agregue un HAT de relé a la Raspberry Pi y conéctelo a una válvula solenoide
Agregue un HAT de relé a la Raspberry Pi y conéctelo a una válvula solenoide
Agregue un relé HAT a la Raspberry Pi y conéctelo a una válvula solenoide
Agregue un relé HAT a la Raspberry Pi y conéctelo a una válvula solenoide
Agregue un HAT de relé a la Raspberry Pi y conéctelo a una válvula solenoide
Agregue un HAT de relé a la Raspberry Pi y conéctelo a una válvula solenoide

Antes de continuar con este paso, APAGUE su Raspberry Pi: ssh y escriba "sudo shutdown now", luego desconéctelo de la alimentación

Nuestro objetivo es encender y apagar la fuente de alimentación de una válvula solenoide, una válvula que puede abrir o cerrar el suministro de agua en función de la alimentación de 24 V CA que recibe de una fuente de alimentación. Los relés son los componentes eléctricos que pueden abrir o cerrar un circuito en base a una señal digital que puede proporcionar nuestra Raspberry Pi. Lo que hacemos aquí es conectar un relé a estos pines de señal digital de la Raspberry Pi y hacer que cierre el circuito entre la fuente de alimentación de 24 V CA y la válvula solenoide.

Los pines de la Raspberry Pi que pueden actuar como entrada o salida digital se llaman GPIO - Entrada / Salida de Propósito General y son la fila de 40 pines en el costado del Pi. Con el Pi apagado e inserte el relé HAT firmemente en él. El HAT que elegí tiene 3 relés y usaremos solo uno de ellos. Imagina todo lo que puedes hacer con los otros dos:)

Ahora vuelva a encender la Raspberry Pi. El LED rojo de "encendido" en el relé HAT debe encenderse, lo que indica que está recibiendo energía del Pi a través del GPIO. Probemos que podemos controlarlo: ssh en la Pi nuevamente, ingrese python y escriba:

importar gpiozero

dev = gpiozero. DigitalOutputDevice (26, valor_inicial = Verdadero) dev.off ()

Debería escuchar un "clic" audible, que indica que el relé está activado, y ver un LED encenderse mostrando que el primer relé está en la posición de conectado. Ahora puedes escribir

dev.on ()

Lo que convertiría el relé en la posición "apagado" (extraño, lo sé …) y saldría () de Python.

Ahora, utilizando cables de puente y el cable más largo, conecte el relé entre la fuente de alimentación de 24 V y la válvula solenoide. Vea el diagrama. Finalmente, conecte la válvula solenoide a un grifo usando los adaptadores y prepárese para probarlo todo repitiendo los comandos anteriores: deben abrir y cerrar el agua.

Conecte una manguera a la válvula solenoide y coloque el otro extremo en la piscina. Ahora tiene un sistema de llenado de piscinas controlado por computadora, y es hora de conectar un sensor para indicarle cuándo debe funcionar.

Paso 11: conecte un sensor de nivel de agua

Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua
Conecte un sensor de nivel de agua

Un sensor de nivel de agua es simplemente un flotador que conecta un circuito eléctrico cuando el flotador está abajo y lo rompe cuando flota hacia arriba. Si lo inserta en la piscina a la altura correcta, el flotador estará arriba cuando el nivel del agua sea el adecuado, pero bajará cuando no haya suficiente agua.

Para que la Raspberry Pi sepa el estado del sensor de nivel de agua, necesitamos que la Pi detecte un circuito abierto o cerrado. Afortunadamente eso es muy simple: los mismos conectores GPIO que usamos como salida digital para controlar los relés pueden actuar como entradas (de ahí la I en GPIO). Específicamente, si conectamos un cable del sensor a + 3.3V en el conector GPIO y el otro cable del sensor a un pin que configuramos como entrada desplegable (lo que significa que normalmente estará en el nivel de voltaje GND), ese pin medirá un voltaje digital "alto" o "encendido" solo cuando el sensor de nivel de agua cierra el circuito, cuando el nivel de agua es bajo. Usé el pin 16 de GPIO como entrada, que marqué en la imagen de arriba.

El código de Python para configurar el pin como entrada y probar su estado actual es:

importar gpiozero

level_input = gpiozero. Button (16) water_low = level_input.is_pressed

Un desafío potencial es que cuando el sensor simplemente cambia de estado, oscilaría rápidamente entre los estados de encendido y apagado. La solución a eso se conoce como "antirrebote" y busca un cambio de estado consistente antes de tomar medidas. La biblioteca GPIOZERO tiene código para hacer eso, pero por alguna razón ese código no me funcionó bien. Escribí un bucle simple para activar alertas IFTTT cuando se detecta un cambio de estado consistente, que puede encontrar en mi repositorio aquí.

Paso 12: escriba el código para unirlo todo

Escriba el código para unirlo todo
Escriba el código para unirlo todo

Eso es todo. Nuestra configuración está completa. Puede escribir su propio código para unir las cosas en un sistema completo, o usar el código que proporciono. Para hacer eso, simplemente cree la estructura del directorio y clone el repositorio, así:

mkdir poolpi

cd poolpi git clon

A continuación, edite los archivos denominados ifttt_url.txt en los directorios motion_alert y water_level para tener la URL de su propio enlace web IFTTT con su clave secreta. Puede usar dos web hooks diferentes para diferentes acciones.

Finalmente, queremos que este código se ejecute automáticamente. La forma más sencilla de lograrlo es a través del servicio crontab de Linux. Podemos agregar algunas líneas crontab para dos tareas principales:

  1. Ejecute nuestros tres programas: el detector de objetos, el sensor de nivel de agua y el servidor web en cada reinicio
  2. Limpie el directorio de salida, elimine imágenes antiguas y archivos de video antiguos (elegí eliminar archivos de más de 1 día e imágenes de más de 7 días; no dude en experimentar)

Para hacer eso, escriba crontab -e que abrirá su editor de texto nano. Agregue las siguientes líneas al final del archivo:

0 1 * * * buscar / home / pi / poolpi / output -type f -name "*.avi" -mtime +1 -delete

0 2 * * * find / home / pi / poolpi / output -type f -name "*.jpg" -mtime +7 -delete @reboot python3 /home/pi/poolpi/motion_alert/webserv/webserv.py @reboot python3 /home/pi/poolpi/motion_alert/motion_obj_alert.py @reboot python3 /home/pi/poolpi/water_level/test_water_level.py

Finalmente, reinicia tu Raspberry Pi. Ahora está listo para mantener su piscina llena y segura.

Juega con la configuración, el código y no olvides destacar mi repositorio de github y comentar el instructable si lo encuentras útil. Siempre busco aprender más.

¡Feliz fabricación!

Desafío de IoT
Desafío de IoT
Desafío de IoT
Desafío de IoT

Finalista en el desafío de IoT

Recomendado: