Este es un proyecto realizado por Jon Zorriketa y Adrián Caballero para la asignatura Análisis y Desarrollo de Estructuras de Software para SoPC (ADE) del máster SIEAV.
El objetivo de este proyecto es controlar un motor desde el teléfono móvil utilizando un sistema de servidor-cliente UDP. Además, al contar con un sensor de distancia, se ofrece cierto nivel de seguridad para ayudar a evitar riesgos. Esto se consigue ya que, si el sensor detecta algún elemento a una distancia considerada peligrosa, el motor se detiene. Dependiendo de la distancia a la que se detecta el obstáculo, el motor se puede volver a arrancar o no. En el caso en el que se considere demasiado peligroso que se vuelva a arrancar el motor, se da un aviso de manera sonora y se procede a sacar una foto de lo que se está detectando.
Para poder realizar este proyecto se necesitan los siguientes componentes HW:
-
Motor
- IN1: GPIO 5
- IN2: GPIO 6
- IN3: GPIO 13
- IN4: GPIO 19
-
Driver motor
- TRIG: GPIO 23
- ECHO: GPIO 24
-
Zumbador
- Buzzer: GPIO 4
-
Cámara
Para ejecutar este proyecto , es necesario tener instaladas las siguientes herramientas y librerías:
-
Sistema Operativo
- Raspbian (o cualquier distribución basada en Debian para Raspberry Pi)
-
Herramientas de Desarrollo
build-essential
: Herramientas de compilación para C y C++.
sudo apt install build-essential
-
Librerías de Red
- Las cabeceras estándar de desarrollo para sockets (
sys/socket.h
,netinet/in.h
) están incluidas conbuild-essential
.
- Las cabeceras estándar de desarrollo para sockets (
-
Librería de hilos
pthread
: Incluida en las cabeceras estándar de desarrollo.
-
pigpio
- Librería para controlar los pines GPIO en la Raspberry Pi.
sudo apt install pigpio
Nota: Puede haber problemas con el demonio
pigpio
. Si no se necesita el demonio, es posible eliminarlo con el siguiente comando:sudo systemctl stop pigpiod sudo systemctl disable pigpiod
-
libcamera
- Librería para controlar la cámara de la Raspberry Pi.
sudo apt install libcamera-apps
El programa se encuentra en la carpeta codigo y consta de diferentes funciones:
- Setup(): Esta función configura (indica si son de entrada o de salida) e inicializa los GPIO.
- set_step(int a, int b, int c, int d): Escribe el valor de las variables a, b, c y d a los GPIOs asignados para el motor.
- motor_control(): Función encargada de gestionar la acción del motor. Comprueba dos flags: keep_running y manual_override.
- sensor_monitor(): Función que obtiene la distancia medida por el sensor, y en función de la distancia a la que se mide el objeto, para el motor o no.
- main(): Función que gestiona el servidor UDP y las acciones del motor en función de los comandos que se reciben desde el móvil.
Como se ha comentado en el apartado de software, el programa consta de diferentes funciones y la interconexión entre estas es lo que permite un correcto funcionamiento del programa. El servidor UDP recibe lo que se envía de manera remota; si no es una entrada válida (al principio un start o stop), imprime un mensaje comunicando que el comando introducido no es válido. Si el comando introducido es un start, se arranca el motor. Si se detecta el comando stop, el motor se detiene.
El sensor de distancia está midiendo la distancia en todo momento. Estas distancias son las que se comprueban y, en función de estas mediciones, se para el motor o se deja que continúe funcionando.
-
Si el sensor de distancia detecta un elemento entre 80 y 40 cm mientras el motor está en funcionamiento, el motor se detiene y se imprime el siguiente mensaje (poner el mensaje concreto que ahora mismo no se recuerda). Si se manda el comando yes, el motor vuelve a funcionar; mientras que si se manda el comando no, el motor sigue parado.
-
Si el sensor de distancia detecta un elemento a menos de 40 cm mientras el motor está en funcionamiento, el motor se para de inmediato, imprime el siguiente mensaje (poner el mensaje) y se saca una foto para poder ver qué es lo que se ha detectado.
-
Si el sensor de distancia detecta un elemento entre 80 y 40 cm mientras el motor no está en funcionamiento, se imprime un mensaje por pantalla indicando que se debe proceder con cuidado.
-
Si el sensor de distancia detecta un elemento a menos de 40 cm mientras el motor no está en funcionamiento, se imprime un mensaje por pantalla indicando que no es posible arrancar el motor, ya que hay algo demasiado cerca.
Si se está pensando en usar el código de este repositorio, los pasos a seguir para poder hacerlo de una manera adecuada son los siguientes:
-
Para la obtención de este código, se debe crear una carpeta en el sistema local y clonar este repositorio en la carpeta. Una vez clonado el repositorio, se debe entrar en la carpeta creada y compilar el siguiente código:
gcc motor_sensor_solo_pwm_camara_solo.c -o motor_sensor_solo_pwm_camara_solo -lpigpio -lpthread
-
Para poder interactuar a través del móvil con el motor, es necesario conectar tanto la Raspberry Pi como el móvil a la misma red WIFI. Una vez que ambos estén en la misma red, se debe comprobar la IP de la Raspberry Pi. Para ello, se usa el comando ifconfig y se revisa la IP de la interfaz de red wlan0.
Se debe descargar una aplicación llamada UDP server en el móvil (https://play.google.com/store/apps/details?id=com.jamstudios.udp_sender). Esta aplicación actuará como cliente. Una vez instalada, se accede a la aplicación y se configura la IP remota con la que se desea comunicar (esta IP es la que se ve en la interfaz de red wlan0 de la Raspberry Pi) y los puertos (el puerto remoto tiene que ser 6000, el local el que se prefiera).
-
Una vez que la aplicación esté configurada, se debe iniciar y ejecutar el archivo compilado:
sudo ./motor_sensor_solo_pwm_camara_solo
Ya debería estar recibiendo los mensajes desde el cliente del móvil.
Si se tiene algún problema o consulta, se puede contactar a través de los siguientes correos electrónicos: