.. note:: ¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirse?** - **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Avances exclusivos**: Accede anticipadamente a nuevos anuncios de productos y adelantos exclusivos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones y sorteos festivos**: Participa en sorteos y promociones navideñas. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. .. _4.1.9_py: 4.1.9 Alarma de Reversa ======================================= Introducción ----------------- En este proyecto, utilizaremos una pantalla LCD, un zumbador y sensores ultrasónicos para crear un sistema de asistencia de reversa. Podemos colocarlo en un vehículo a control remoto para simular el proceso real de reversa en un garaje. Componentes Necesarios ------------------------------ En este proyecto, necesitamos los siguientes componentes. .. image:: ../img/list_Reversing_Alarm.png :align: center Es muy conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ELEMENTOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado en los enlaces a continuación. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_buzzer` - \- * - :ref:`cpn_transistor` - |link_transistor_buy| * - :ref:`cpn_ultrasonic_sensor` - |link_ultrasonic_buy| * - :ref:`cpn_i2c_lcd` - |link_i2clcd1602_buy| Diagrama Esquemático ------------------------ El sensor ultrasónico detecta la distancia entre él y el obstáculo que se mostrará en la pantalla LCD en forma de código. Al mismo tiempo, el sensor ultrasónico permite que el zumbador emita un sonido de advertencia de frecuencia diferente según el valor de la distancia. ============== =============== ======== === Nombre T-Board cableado físico wiringPi BCM GPIO23 Pin 16 4 23 GPIO24 Pin 18 5 24 GPIO17 Pin 11 0 17 SDA1 Pin 3 SCL1 Pin 5 ============== =============== ======== === .. image:: ../img/Schematic_three_one3.png :align: center Procedimientos Experimentales ---------------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/image242.png :width: 700 :align: center **Paso 2:** Cambia de directorio. .. raw:: html .. code-block:: cd ~/raphael-kit/python/ **Paso 3:** Ejecuta. .. raw:: html .. code-block:: sudo python3 4.1.9_ReversingAlarm.py Mientras el código se ejecuta, el módulo del sensor ultrasónico detecta la distancia al obstáculo y luego muestra la información sobre la distancia en el LCD1602; además, el zumbador emite un tono de advertencia cuya frecuencia cambia con la distancia. .. note:: * Si obtienes el error ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, necesitas referirte a :ref:`i2c_config` para habilitar el I2C. * Si obtienes el error ``ModuleNotFoundError: No module named 'smbus2'``, por favor ejecuta ``sudo apt install python3-smbus2``. * Si aparece el error ``OSError: [Errno 121] Remote I/O error``, significa que el módulo está mal cableado o el módulo está roto. * Si el código y el cableado están bien, pero el LCD aún no muestra contenido, puedes girar el potenciómetro en la parte trasera para aumentar el contraste. **Código** .. note:: Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto. .. raw:: html .. code-block:: python import LCD1602 import time import RPi.GPIO as GPIO TRIG = 16 ECHO = 18 BUZZER = 11 def lcdsetup(): LCD1602.init(0x27, 1) # init(slave address, background light) LCD1602.clear() LCD1602.write(0, 0, 'Ultrasonic Starting') LCD1602.write(1, 1, 'By SunFounder') time.sleep(2) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) GPIO.setup(BUZZER, GPIO.OUT, initial=GPIO.LOW) lcdsetup() def distance(): GPIO.output(TRIG, 0) time.sleep(0.000002) GPIO.output(TRIG, 1) time.sleep(0.00001) GPIO.output(TRIG, 0) while GPIO.input(ECHO) == 0: a = 0 time1 = time.time() while GPIO.input(ECHO) == 1: a = 1 time2 = time.time() during = time2 - time1 return during * 340 / 2 * 100 def destroy(): GPIO.output(BUZZER, GPIO.LOW) GPIO.cleanup() LCD1602.clear() def loop(): while True: dis = distance() print (dis, 'cm') print ('') GPIO.output(BUZZER, GPIO.LOW) if (dis > 400): LCD1602.clear() LCD1602.write(0, 0, 'Error') LCD1602.write(3, 1, 'Out of range') time.sleep(0.5) else: LCD1602.clear() LCD1602.write(0, 0, 'Distance is') LCD1602.write(5, 1, str(round(dis,2)) +' cm') if(dis>=50): time.sleep(0.5) elif(dis<50 and dis>20): for i in range(0,2,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.2) elif(dis<=20): for i in range(0,5,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.05) if __name__ == "__main__": setup() try: loop() except KeyboardInterrupt: destroy() **Explicación del Código** .. code-block:: python def lcdsetup(): LCD1602.init(0x27, 1) # init(slave address, background light) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) GPIO.setup(BUZZER, GPIO.OUT, initial=GPIO.LOW) lcdsetup() En este programa, aplicamos de manera sintética los componentes utilizados anteriormente. Aquí usamos zumbadores, LCD y ultrasonido. Podemos inicializarlos de la misma manera que hicimos antes. .. code-block:: python dis = distance() print (dis, 'cm') print ('') GPIO.output(BUZZER, GPIO.LOW) if (dis > 400): LCD1602.clear() LCD1602.write(0, 0, 'Error') LCD1602.write(3, 1, 'Out of range') time.sleep(0.5) else: LCD1602.clear() LCD1602.write(0, 0, 'Distance is') LCD1602.write(5, 1, str(round(dis,2)) +' cm') Aquí obtenemos los valores del sensor ultrasónico y calculamos la distancia. Si el valor de la distancia es mayor que el rango de detección, se imprime un mensaje de error en el LCD. Y si la distancia está dentro del rango de trabajo, se mostrarán los resultados correspondientes. .. code-block:: python LCD1602.write(5, 1, str(round(dis,2)) +' cm') Dado que la salida del LCD solo soporta tipos de caracteres, necesitamos usar **str()** para convertir los valores numéricos a caracteres. Vamos a redondearlo a dos decimales. .. code-block:: python if(dis>=50): time.sleep(0.5) elif(dis<50 and dis>20): for i in range(0,2,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.2) elif(dis<=20): for i in range(0,5,1): GPIO.output(BUZZER, GPIO.HIGH) time.sleep(0.05) GPIO.output(BUZZER, GPIO.LOW) time.sleep(0.05) Esta condición de juicio se utiliza para controlar el sonido del zumbador. Según la diferencia en la distancia, se puede dividir en tres casos, en los cuales habrá diferentes frecuencias de sonido. Dado que el valor total de retardo es de 500 ms, todos ellos pueden proporcionar un intervalo de 500 ms para que el sensor ultrasónico funcione. Imagen del Fenómeno ----------------------- .. image:: ../img/image243.jpeg :align: center