En esta práctica se pide lo siguiente:
- Desde el Smartphone, del profesor, se enlazará a la cámara del sistema. En ese momento, estará todo en calma (sin detección de intrusos).
- Con la ayuda del sensor PIR, el sistema quedará a la espera de detectar movimiento.
- Una vez detectado el movimiento:
- La tira de leds se iluminará.
- La RPI se comunicará, por USB, con el μC ATMEGA 328P y éste realizará 5 vueltas en el motor PAP bipolar. Esta acción podrá visualizarse en el Smartphone.
- Hecho esto, se podrá enlazar con la RPI a través de la WEB y se nos ofrecerá la posibilidad de mover el servo a izquierda y derecha.
Los elementos implicados en esta práctica serán: Raspberry Pi, sensor PIR, Arduino UNO, motor bipolar PAP, controlador DRV8825, un servo y una webcam.
Lo primero que hay que tener claro aquí es que necesitaremos una fuente de alimentación externa, ya que no podemos alimentar tantos dispositivos con el Arduino ni la raspi. En mi caso he utilizado una vieja fuente de alimentación de ordenador, que puede suministrarme los 5v y los 12v que necesitamos.
El siguiente punto, es analizar los dispositivos que no hemos manejado antes: sensor PIR, motor bipolar PAP y el controlador DRV8825. Los estudiaremos en este mismo orden.
Sensor Piroeléctrico Infrarojo HC-SR501
Con bastante frecuencia necesitamos algún sistema de detectar la presencia de personas o animales en movimiento en un área dada. Es la base de cualquier sistema de detección de intrusos, pero también se usan mucho en las escaleras comunitarias o aseos públicos para encender la luz en cuanto detecta el movimiento.
Todos los seres vivos desprenden calor y lo mismo ocurre con los automóviles y cualquier otra maquinaria, y ese calor se emite en forma de radiación infrarroja que podemos detectar con los dispositivos adecuados, como los sensores PIR.
Los sensores PIR, que son elementos que detectan cambios en la radiación infrarroja que reciben y que disparan una alarma al percibirlo.
Los PIR más frecuentes son sensores de movimiento, y para ello están divididos en dos mitades de forma que detecten el cambio de radiación IR que reciben y, además, disparen la alarma cuando perciben ese cambio.
El módulo HC-SR501 tiene 3 pines de conexión +5v, OUT (3,3v) y GND, y dos resistencias variables de calibración (Ch1 y RL2).
- Ch1: Con esta resistencia podemos establecer el tiempo que se va a mantener activa la salida del sensor. Una de las principales limitaciones de este módulo es que el tiempo mínimo que se puede establecer es de más o menos 3s. Si cambiamos la resistencia por otra de 100K, podemos bajar el tiempo mínimo a más o menos 0,5 s.
- RL2: Esta resistencia variable nos permite establecer la distancia de detección que puede variar entre 3-7m.
Características:
- Sensor piroeléctrico (Pasivo) infrarrojo (También llamado PIR)
- El módulo incluye el sensor, lente, controlador PIR BISS0001, regulador y todos los componentes de apoyo para una fácil utilización
- Rango de detección: 3 m a 7 m, ajustable mediante trimmer (Sx)
- Lente fresnel de 19 zonas, ángulo < 100º
- Salida activa alta a 3.3 V
- Tiempo en estado activo de la salida configurable mediante trimmer (Tx)
- Redisparo configurable mediante jumper de soldadura
- Consumo de corriente en reposo: < 50 μA
- Voltaje de alimentación: 4.5 VDC a 20 VDC
Motor bipolar PAP 42BYGHW811
Sus características son las siguientes:
La diferencia básica (para nosotros) entre un motor bipolar y uno unipolar, es que un unipolar podemos usar un montaje Darlington para excitar una u otra mitad de la bobina; sin embargo para un motor bipolar necesitamos poder revertir el sentido de la corriente según en qué fase del movimiento nos encontremos, por lo que tenemos que recurrir a un puente en H.
Puente en H
El término "puente H" proviene de la típica representación gráfica del circuito. Un puente H se construye con 4 interruptores (mecánicos o mediante transistores). Cuando los interruptores S1 y S4 están cerrados (y S2 y S3 abiertos) se aplica una tensión positiva en el motor, haciéndolo girar en un sentido. Abriendo los interruptores S1 y S4 (y cerrando S2 y S3), el voltaje se invierte, permitiendo el giro en sentido inverso del motor.
Con la nomenclatura que estamos usando, los interruptores S1 y S2 nunca podrán estar cerrados al mismo tiempo, porque esto cortocircuitaría la fuente de tensión. Lo mismo sucede con S3 y S4.
Este es el motivo por el que utilizaremos un controlador para utilizar el motor bipolar.
Driver DRV8825
El DRV8825 es un (driver) que simplifica el manejo de motores paso a paso desde un autómata o procesador como Arduino.
Estos controladores nos permiten manejar los altos voltajes e intensidades que requieren estos motores, limitar la corriente que circula por el motor, y proporcionan las protecciones para evitar que la electrónica pueda resultar dañada.
Para su control únicamente requieren dos salidas digitales, una para indicar el sentido de giro y otra para comunicar que queremos que el motor avance un paso. Además permiten realizar microstepping, una técnica para conseguir precisiones superiores al paso nominal del motor.
Como en la mayoría de los controladores de motores el componente fundamental es un puente-H. En el caso del DRV8825, destinado a controlar motores paso a paso, se dispone de dos puentes-H (uno por canal) constituidos por transistores MOSFET.
Estros drivers disponen de reguladores de intensidad incorporados. El motivo es que los motores paso a paso de cierto tamaño y potencia, necesitan tensiones superiores a las que podrían soportar las bobinas por su corriente nominal..
Para el que el motor funcione correctamente necesitamos aplicar una tensión superior. En este ejemplo, la tensión nominal podría ser 12V. Pero si aplicáramos 12V directamente,con una resistencia de 1.5 Ohm por fase, pasarían 8A por la bobina, lo cual destruiría el motor en poco tiempo.
Por este motivo, los controladores incorporan un limitador de intensidad, que permiten alimentar el motor a tensiones nominales superiores a las que es posible por su resistencia e intensidad máxima admisible.
El limitador interrumpe la señal proporcionando una señal pulsada PWM de forma que el valor promedio de la intensidad que atraviesa la bobina es la intensidad nominal del motor. El limitador de tensión aplicaría el pulso durante el 15% del tiempo y mantendrá el motor apagado el 85% restante.
Para regular la intensidad que proporcionara el limitador y ajustarlo al valor del motor la disponemos de un potenciómetro que regula la intensidad del limitador.
Una forma de estimar la intensidad del regulador es medir la tensión entre el potenciómetro y GND y aplicar una fórmula que depende del modelo. Estas fórmulas dependen el valor Rs de las resistencias ubicadas en la placa que pueden variar en función del fabricante.
Para una Rs típica de 100 Ohm, la fórmula queda así: I_max = 2 * V_ref
No obstante, el valor obtenido mediante esta medición es sólo una aproximación y puede ser inexacto, por lo que lo emplearemos sólo como una calibración inicial, y terminaremos el ajuste fino midiendo la corriente real que proporciona el controlador al motor mediante un amperímetro.
Montaje
Una vez que conocemos la características de nuestros componentes, pasamos a realizar el montaje, que debería ser similar a este:
Los pines que utilizaremos serán los siguientes:
Arduino:
- 11: enable (naranja)
- 10: reset (morado)
- 9: step (azul)
- 8: dir (verde)
- +12v (amarillo)
- +5v (rojo)
- GND (blanco)
Raspberry:
- 12: señal servo
- 11: señal PIR
- 13: control LEDs
Preparación de la Raspberry
Como queremos que se pueda consultar vía internet, debemos crear un servidor web en la raspi. El primer paso es instalar Apache con soporte para PHP:
# apt-get update
# apt-get install apache2
# apt-get install php5 libapache2-mod-php5
El directorio donde se guardan las páginas web por defecto es /var/www. Es este directorio es donde tenemos que guardar nuestra web.
La primera parte de la página será una secuandia básica de HTML para definir dos botones, por ejemplo el izquierdo:
La segunda parte será la que gestione las peticiones PHP que se produzcan cuando se pulse cada botón y las encargadas se llamar a las funciones de Python que realizarán el movimiento del servo.
Programación Arduino
El programa de Arduino no tiene mucho misterio. Definiremos las variables que vamos a utilizar, habilitaremos los pines de salida, activaremos las señales de reset y enable, definimos una dirección y fijamos un delay que servirá para la señal de control del motor.
En la segunda parte, comprobaremos el estado del canal serial y en caso de recibir los datos que esperamos , activamos el driver para que de 5 vueltas (5 veultas x 200 pasos cada vuelta=1000 pasos).
El motivo por el que deshabilitamos el driver, es para reducir el consumo y el calor, ya que la In del motor que usamos está al límite del controlador.
En la práctica, hemos comprobado que hace falta añadir un tiempo de espera antes de deshabilitar de nuevo el driver, para que le de tiempo a dar los últimos pasos.
Programación Raspberry
En este caso vamos a necesitar tres programas distintos.
- Dos programas que accedan a un archivo donde guardaremos la posición actual del servo (una suma y otro resta grados) y le pase el dato a la instrucción PHP.
- El programa principal que controle el servo, la comunicación, la tira de LEDs y el PIR.
Los dos primero son bastante sencillo:
En este programa abrimos el archivo de texto, comparamos que no está ya en la posición máxima, incrementamos si procede, pisamos el dato en el arhivo y lo printamos. El otro programa (decremento) es similar, pero restando.
El programa principal es más extenso y podemos dividirlo en 4 partes: inicialización, interrupción del pir, movimiento del servo y finalización.
En la inicialización, definiremos el interprete, cargamos las librerias, arrancamos los GPIO y el PWM, inicializamos el servo a 90º y los LEDs apagados y calculamos las rectas para el servo.
En la segunda parte, utilizamos una interrupción por fla para detectar cuando el sensor PIR nos dice que ha detectado movimiento.
En caso detección, enviamos un mensaje a arduino, el cual debemos convertirlo a byte para que llegue correctamente y encendemos los LEDs.
En la tercera parte, comprobamos la posición actual del servo y la comparamos con la que hay en el fichero de texto, si no es igual, movemos el servo.
En la última parte del programa, nos aseguramos de que podemos interrumpir el programa correctamente y de que al final del programa, siempre se ejecute el cierre de los GPIOs.
Configuración de la webcam
Para la visualización remota de cámara web utilizaremos el programa "motion" y lo haremos con la siguiente instrucción:
sudo apt-get motion
Una vez instalado debemos realizar unas pequeñas cmodificaciones en la configuración. Para ellos tenemos que acceder el siguiente archivo:
/usr/local/etc/motion.conf
Básicos:
- width: la anchura. Esto dependerá de lo que soporte nuestra cam.
- height: la altura.
- framerate: los frames por segundo
- threshold: el número de pixels que deben cambiar para considerar movimiento
- output_normal: puede ser on, off, best, first
- off: no guarda imagenes al detectar movimiento
- first: solo guarda el primer frame
- best: solo guarda el de mayor movimiento
- on: guarda todas los frames donde se detecta movimiento
- snapshot_interval: guardará una imagen, aunque no haya movimiento, cada x segundos
- target_dir /var/motion el directorio donde motion guardará los videos y las imagenes
Específicos de nuestra aplicación:
- Servidor de straming: un pequeño servidor http que nos permitirá ver en tiempo real la webcam
- webcam_port: 8081 el puerto donde escuchará el servidor
- webcam_quality: 50 la calidad en que se mostrarán las imágenes
- webcam_maxrate: 8 el número máximo de frames que se mostrarán para los vídeos en streaming
- webcam_localhost: off restringir el uso del servidor para uso local solo
- Servidor de control: un pequeño servidor http que nos permite configurar motion en vivo
- control_port: 8080 el puerto donde escuchará el servidor
- control_localhost on: si queremos restringir el uso del servidor de control para el uso local
- control_html_output on: para que la salida sea en formato html
- control_authentication usuario: tu_pass para definir el usuario y el password
En la página oficial se puede ver más sobre el tema.
Las instrucciones que utilizaremos serán:
Configuración del router
Por último, solo nos queda abrir los puertos del router, algo que ya vimos en la práctica de servidor web de arduino.
La diferencia es que en esta practica tenemos que abrir varios puertos, además del propio 80 para la ip de la raspi, también tenemos que abrir los 8080 y 8081 para la webcam.
Códigos
Las instrucciones que utilizaremos serán:
- Iniciar el proceso: sudo motion -n
- Parar el proceso: sudo service motion stop
Configuración del router
Por último, solo nos queda abrir los puertos del router, algo que ya vimos en la práctica de servidor web de arduino.
La diferencia es que en esta practica tenemos que abrir varios puertos, además del propio 80 para la ip de la raspi, también tenemos que abrir los 8080 y 8081 para la webcam.
Códigos





No hay comentarios:
Publicar un comentario