.. note:: Hola, ¡bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas. **¿Por qué unirte?** - **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo. - **Aprende y comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades. - **Previsualizaciones exclusivas**: Accede anticipadamente a anuncios de nuevos productos y adelantos. - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes. - **Promociones festivas y sorteos**: Participa en sorteos y promociones especiales. 👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo. 3.1.3 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 instalarlo en un vehículo de control remoto para simular el proceso real de retroceder el automóvil hacia el garaje. Componentes -------------- .. image:: img/list_Reversing_Alarm.png :align: center Diagrama Esquemático ------------------------ El sensor ultrasónico detecta la distancia entre sí y el obstáculo, que se mostrará en el LCD en forma de código. Al mismo tiempo, el sensor ultrasónico hace que el zumbador emita un sonido de advertencia con diferentes frecuencias según el valor de la distancia. ============ ======== ======== === T-Board Name physical 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 :width: 800 :align: center Procedimientos Experimentales --------------------------------- **Paso 1:** Construir el circuito. .. image:: img/image242.png :width: 800 :align: center **Para Usuarios de Lenguaje C** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2:** Cambiar de directorio. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.3/ **Paso 3:** Compilar. .. raw:: html .. code-block:: gcc 3.1.3_ReversingAlarm.c -lwiringPi **Paso 4:** Ejecutar. .. raw:: html .. code-block:: sudo ./a.out Al ejecutar el código, el módulo de sensor ultrasónico detectará la distancia hasta el obstáculo y luego mostrará la información sobre la distancia en la pantalla LCD1602; además, el zumbador emitirá un tono de advertencia cuya frecuencia cambia según la distancia. .. note:: * Si aparece un error de ``wiringPi.h: No such file or directory``, consulta :ref:`install_wiringpi`. * Si recibes el error ``Unable to open I2C device: No such file or directory``, consulta :ref:`i2c_config` para habilitar I2C y verificar si el cableado es correcto. * Si el código y el cableado están bien, pero el LCD aún no muestra contenido, puedes ajustar el potenciómetro en la parte posterior para aumentar el contraste. **Código** .. note:: Los siguientes códigos están incompletos. Si deseas ver el código completo, se sugiere usar el comando ``nano 3.1.1_ReversingAlarm.c``. .. code-block:: c #include #include #include #include #include #include #define Trig 4 #define Echo 5 #define Buzzer 0 int LCDAddr = 0x27; int BLEN = 1; int fd; // Función para el LCD void write_word(int data){...} void send_command(int comm){...} void send_data(int data){...} void lcdInit(){...} void clear(){...} void write(int x, int y, char data[]){...} // Función para el Ultrasonido void ultraInit(void){...} float disMeasure(void){...} // Función principal int main(void) { float dis; char result[10]; if(wiringPiSetup() == -1){ printf("setup wiringPi failed !"); return 1; } pinMode(Buzzer,OUTPUT); fd = wiringPiI2CSetup(LCDAddr); lcdInit(); ultraInit(); clear(); write(0, 0, "Ultrasonic Starting"); write(1, 1, "By Sunfounder"); while(1){ dis = disMeasure(); printf("%.2f cm \n",dis); delay(100); digitalWrite(Buzzer,LOW); if (dis > 400){ clear(); write(0, 0, "Error"); write(3, 1, "Out of range"); delay(500); } else { clear(); write(0, 0, "Distance is"); sprintf(result,"%.2f cm",dis); write(5, 1, result); if(dis>=50) {delay(500);} else if(dis<50 & dis>20) { for(int i=0;i<2;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(200); } } else if(dis<=20){ for(int i=0;i<5;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(50); } } } } return 0; } **Explicación del Código** .. code-block:: c pinMode(Buzzer,OUTPUT); fd = wiringPiI2CSetup(LCDAddr); lcdInit(); ultraInit(); En este programa, aplicamos de forma conjunta los componentes vistos anteriormente. Aquí utilizamos un zumbador, una pantalla LCD y un sensor ultrasónico. Podemos inicializarlos de la misma manera que lo hicimos antes. .. code-block:: c dis = disMeasure(); printf("%.2f cm \n",dis); digitalWrite(Buzzer,LOW); if (dis > 400){ write(0, 0, "Error"); write(3, 1, "Out of range"); } else { write(0, 0, "Distance is"); sprintf(result,"%.2f cm",dis); write(5, 1, result); } Aquí obtenemos el valor del sensor ultrasónico y calculamos la distancia. Si el valor de la distancia es mayor al rango a detectar, se imprime un mensaje de error en el LCD. Si el valor de la distancia está dentro del rango, se muestran los resultados correspondientes. .. code-block:: c sprintf(result,"%.2f cm",dis); Dado que el modo de salida de LCD solo admite el tipo de carácter, y la variable dis almacena el valor en tipo float, necesitamos usar sprintf(). Esta función convierte el valor de tipo float en un carácter y lo almacena en la variable de cadena result[]. %.2f indica que se mantendrán dos decimales. .. code-block:: c if(dis>=50) {delay(500);} else if(dis<50 & dis>20) { for(int i=0;i<2;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(200); } } else if(dis<=20){ for(int i=0;i<5;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(50); } } Esta condición de juicio se usa para controlar el sonido del zumbador. Según la distancia, se divide en tres casos, en los que se emiten diferentes frecuencias de sonido. Como el valor total de delay es 500, todos los casos pueden proporcionar un intervalo de 500 ms para el sensor ultrasónico. **Para Usuarios de Python** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Paso 2:** Cambiar de directorio. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python/ **Paso 3:** Ejecutar. .. raw:: html .. code-block:: sudo python3 3.1.3_ReversingAlarm.py Al ejecutar el código, el módulo de sensor ultrasónico detecta la distancia al obstáculo y muestra la información sobre la distancia en el LCD1602; además, el zumbador emite un tono de advertencia cuya frecuencia varía con la distancia. .. note:: * Si recibes el error ``FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'``, consulta :ref:`i2c_config` para habilitar I2C. * Si aparece ``ModuleNotFoundError: No module named 'smbus2'``, ejecuta ``sudo apt install python3-smbus2``. * Si el error ``OSError: [Errno 121] Remote I/O`` aparece, significa que el módulo está mal conectado o está dañado. * Si el código y el cableado están bien, pero el LCD aún no muestra contenido, puedes ajustar el potenciómetro en la parte posterior para aumentar el contraste. **Código** .. note:: Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, debes ir a la ruta del código fuente como ``davinci-kit-for-raspberry-pi/python``. .. 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(dirección del esclavo, luz de fondo) 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(dirección del esclavo, luz de fondo) 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 forma conjunta los componentes usados anteriormente. Aquí empleamos un zumbador, un LCD y un sensor ultrasónico, y 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 supera el rango de detección, se muestra un mensaje de error en el LCD. Si la distancia está dentro del rango de funcionamiento, se muestran los resultados correspondientes. LCD1602.write(5, 1, str(round(dis,2)) +' cm') Dado que la salida del LCD solo admite tipos de caracteres, necesitamos usar **str()** para convertir los valores numéricos en caracteres. Redondearemos el valor a dos decimales. .. code-block:: python if(dis>=50) {delay(500);} else if(dis<50 & dis>20) { for(int i=0;i<2;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(200); } } else if(dis<=20){ for(int i=0;i<5;i++){ digitalWrite(Buzzer,HIGH); delay(50); digitalWrite(Buzzer,LOW); delay(50); } } Esta condición se usa para controlar el sonido del zumbador. Según la distancia, se divide en tres casos, en los que habrá diferentes frecuencias de sonido. Dado que el valor total de delay es 500, todos los casos proporcionan un intervalo de 500 ms para que el sensor ultrasónico funcione. Imagen del Fenómeno -------------------- .. image:: img/image243.jpeg :align: center