MEDICION DE DISTANCIA USANDO DOS SENSORES Y MUESTRA DE RESULTADOS EN LCD

Dependencies:   mbed HCSR04 TextLCD

MEDICIÓN DE DISTANCIAS USANDO 2 TIPOS DE SENSORES:

DESCRIPCIÓN:

Se desea utilizar dos tipos de sensores de diferentes características para lograr medir la distancia desde un punto definido; los valores medidos se mostrarán en una pantalla de de 20X4 (caracteresxlíneas) vía I2C; además se han establecido 4 rangos de distancia distintos para cada uno de ellos se encenderá un color de led diferente en el microcontrolador, de tal manera que a medida que se acerca el objeto varían de la siguiente manera:

De 0 a 4 color rojo; se mostrará intervalo y distancia en pantalla De 4 a 20 naranja; se mostrará intervalo y distancia en pantalla De 20 a 40 azul; se mostrará intervalo y distancia en pantalla Mayor a 40 Verde; se mostrará intervalo y distancia en pantalla

En caso de que exista un desperfecto en alguno de los sensores (Ej: no llegue la señal ninguna o lectura errónea) a modo de alarma se encienden los 4 leds al mismo tiempo. Además se declara mensaje de inicialización en pantalla al comienzo del proceso.

Materiales y Dispositivos a emplear.

- Un sensor ultrasónico tipo HCSR04 o similar - Un sensor infrarrojo o IR tipo ME-634 o similar - Un microcontrolador STM32F4 - Una pantalla 2004 con su respectivo controlador

Breve descripción de funcionamiento de los los sensores

Sensores ultrasónicos: Emite un sonido y mide el tiempo que la señal tarda en regresar. Estos se reflejan en un objeto, el sensor recibe el eco producido y lo convierte en señales eléctricas, las cuales son elaboradas en el aparato de valoración. Estos sensores trabajan solamente donde tenemos presencia de aire (no pueden trabajar en el vacío, necesitan medio de propagación), y pueden detectar objetos con diferentes formas, diferentes colores, superficies y de diferentes materiales. Los materiales pueden ser sólidos, líquidos o polvorientos, sin embargo han de ser deflectores de sonido. Los sensores trabajan según el tiempo de retorno del eco, es decir, se valora la distancia temporal entre el impulso de emisión y el impulso del eco.

Sensor Infrarrojo: Se basa en que los rayos infrarrojos pasan al interior del fototransistor donde se encuentra un material piroeléctrico, que es el que reacciona a la presencia de los rayos infrarrojos. Por lo general, estos dispositivos están integrados en configuraciones de diverso tipo. En nuestro caso es una configuarción de sensores activo, la cual está basado en la combinación de un emisor y un receptor situados próximos entre sí. El emisor es un diodo de LED infrarrojo, mientras que el receptor es el fototransistor.

Algunos, como el Sensor Infrarrojo de distancia SHARP GP2Y0A21 da una salida en voltaje analógico permite detectar objetos en un rango de 10 a 80cm. (no se encontró en el mercado)

Otros como el ME-634 (usado en esta práctica) solo devuelven un 0 o 1 lógico como salida; es decir no nos permite determinar la distancia; pero si establecer la existencia de algún elemento frente al sensor dentro del rango seteado; por esto se lo conoce como detector de obstáculos o detector de bandas negras. Por defecto envía un 1 lógico, al encontrar algún obstáculo envía un 0 lógico.

Terminales y Conexiones.

Sensor Infrarrojo Vcc....3,3V a 5V; GND...Ground ; OUT...Digital Output(0 and 1) ==>Din en STM32

Sensor Ultrasónico: Vcc............5; Trigger...Din; Echo........Dout==>Din en STM32; Ground...GND

Diagrama

https://os.mbed.com/media/uploads/ramirezcar/conexiones_total__1.jpg

Notas:

- Se toma la distancia mínima como 4 en vista a que este el valor mínimo que mide nuestro sensor ultrasónico y se hizo corresponder esta distancia con la activación del sensor infrarrojo a fin de cubrir todo el rango.

- El sensor infrarrojo utilizado no tiene un rango amplio (más bien de unos cuantos cms), en la primera prueba se utilizó uno que podía detectar de 0-4,5cm aprox para la segunda se consiguió uno de una poco más de 0-7cm aprox; sin embargo se decidió setearlo en 4 por lo anterior.

-En vista a que solo tenemos una salida digital del sensor ultrasónico; 1 cuando esta desactivado (no hay obstaculo) y 0 cuando se activa (hay obstaculo) no se puede expresar valor de lectura si no solo se indica el rango de 0 a 4.

Prueba 1 https://os.mbed.com/media/uploads/ramirezcar/inicializando_proceso.jpg https://os.mbed.com/media/uploads/ramirezcar/dist_entre_4_y_20_led_naranja_on.jpg https://os.mbed.com/media/uploads/ramirezcar/dist_entre_20_y_40_led_azul_on.jpg https://os.mbed.com/media/uploads/ramirezcar/dist_mayor_a_40_led_verde_on.jpg https://os.mbed.com/media/uploads/ramirezcar/error_4_leds_on.jpg

Prueba 2 https://os.mbed.com/media/uploads/ramirezcar/distancia_menor_a_4_infrarrojo_activado.jpghttps://os.mbed.com/media/uploads/ramirezcar/distancia_menor_a_4_led_rojo_on.jpg https://os.mbed.com/media/uploads/ramirezcar/dsitancia_entre_4_y_20.jpg https://os.mbed.com/media/uploads/ramirezcar/distancia_entre_20_y_40.jpg https://os.mbed.com/media/uploads/ramirezcar/distancia_mayor_a_40.jpg

Committer:
ramirezcar
Date:
Thu Feb 13 01:26:18 2020 +0000
Revision:
2:8181dbf88b24
Parent:
1:79299edab09b
medicion de distancia con visualizacion en pantalla

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ramirezcar 0:7b1293e58047 1 #include "mbed.h"
ramirezcar 1:79299edab09b 2 #include "HCSR04.h"
ramirezcar 2:8181dbf88b24 3 #include "mbed.h"
ramirezcar 2:8181dbf88b24 4 #include "TextLCD.h"
ramirezcar 2:8181dbf88b24 5 #define DEFAULT 0//no
ramirezcar 2:8181dbf88b24 6 #define ADAFRUIT 0//no
ramirezcar 2:8181dbf88b24 7 #define DFROBOT 0
ramirezcar 2:8181dbf88b24 8 #define LCM1602 0
ramirezcar 2:8181dbf88b24 9 #define YWROBOT 0
ramirezcar 2:8181dbf88b24 10 #define GYLCD 0//no
ramirezcar 2:8181dbf88b24 11 #define MJKDZ 0//no
ramirezcar 2:8181dbf88b24 12 #define SYDZ 1
ramirezcar 2:8181dbf88b24 13 #define WIDEHK 0//no
ramirezcar 2:8181dbf88b24 14 #define LCDPLUG 0//no
ramirezcar 0:7b1293e58047 15
ramirezcar 2:8181dbf88b24 16 Serial pc(PA_2,PA_3); // tx, rx
ramirezcar 2:8181dbf88b24 17 I2C i2c_lcd(PB_9, PB_8); // SDA, SCL
ramirezcar 2:8181dbf88b24 18 TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD20x4);
ramirezcar 2:8181dbf88b24 19 //Serial pc(PA_2,PA_3);// Puertos de comunicación serial a PC
ramirezcar 1:79299edab09b 20 DigitalOut Verde(PD_12); // Verde==> Distancia RECOMENDADA (<40)
ramirezcar 1:79299edab09b 21 DigitalOut Azul(PD_15);// Azul ==> Distancia MENOR A RECOMENDADA (entre 20 y 40)
ramirezcar 1:79299edab09b 22 DigitalOut Naranja(PD_13);//Naranja> Distancia PELIGROSA (entre 4 y 20)
ramirezcar 1:79299edab09b 23 HCSR04 ultra(PB_4,PB_5);// Sensor Ultrasónico (Trigger y Echo)
ramirezcar 1:79299edab09b 24 DigitalOut Rojo(PD_14);// Respuesta Sensor infrarojo==> CHOQUE INMINENTE (menor a 4)
ramirezcar 1:79299edab09b 25 DigitalIn Infra(PD_6);// Señal Sensor infrarojo
ramirezcar 2:8181dbf88b24 26 char *array[] = { // Defino Matriz de caracteres a mostrar
ramirezcar 2:8181dbf88b24 27 "Entre 4 y 20",
ramirezcar 2:8181dbf88b24 28 "Entre 20 y 40",
ramirezcar 2:8181dbf88b24 29 "Mayor a 40",
ramirezcar 2:8181dbf88b24 30 "Menor igual a 4"
ramirezcar 2:8181dbf88b24 31 };
ramirezcar 2:8181dbf88b24 32 int d; // Variable que almacenará la distancia
ramirezcar 0:7b1293e58047 33
ramirezcar 2:8181dbf88b24 34 void setup(){
ramirezcar 2:8181dbf88b24 35 lcd.setBacklight(TextLCD::LightOn); // Retroiluminación de pantalla
ramirezcar 2:8181dbf88b24 36 lcd.setCursor(TextLCD::CurOff_BlkOn);//Seteo cursor
ramirezcar 2:8181dbf88b24 37 lcd.setUDC(0, (char *) udc_0);
ramirezcar 2:8181dbf88b24 38 lcd.putc(0);
ramirezcar 2:8181dbf88b24 39 lcd.setUDC(1, (char *) udc_1);
ramirezcar 2:8181dbf88b24 40 lcd.putc(1);
ramirezcar 2:8181dbf88b24 41 lcd.cls();//limpia pantalla
ramirezcar 2:8181dbf88b24 42 int col = 0;//definición columna
ramirezcar 2:8181dbf88b24 43 int row = 0;//definición fila
ramirezcar 2:8181dbf88b24 44 lcd.locate(col,row);//Ubiación del cursor
ramirezcar 2:8181dbf88b24 45 lcd.printf("Inicializando...");// mensaje de Inicialización de pantalla
ramirezcar 2:8181dbf88b24 46 wait(2);//Espere 2 segundos
ramirezcar 2:8181dbf88b24 47 //Secuencia de Incilización
ramirezcar 2:8181dbf88b24 48 row++;
ramirezcar 2:8181dbf88b24 49 lcd.locate(col,row);
ramirezcar 2:8181dbf88b24 50 lcd.printf("Inicializando...");
ramirezcar 2:8181dbf88b24 51 wait(2);
ramirezcar 2:8181dbf88b24 52 row++;
ramirezcar 2:8181dbf88b24 53 lcd.locate(col,row);
ramirezcar 2:8181dbf88b24 54 lcd.printf("Inicializando...");
ramirezcar 2:8181dbf88b24 55 wait(2);
ramirezcar 2:8181dbf88b24 56 row++;
ramirezcar 2:8181dbf88b24 57 lcd.locate(col,row);
ramirezcar 2:8181dbf88b24 58 lcd.printf("Inicializando...");
ramirezcar 2:8181dbf88b24 59 }
ramirezcar 2:8181dbf88b24 60 //Secuencia para mostrar distancia según su rango
ramirezcar 2:8181dbf88b24 61 void mostrar(char *str, int distancia){
ramirezcar 2:8181dbf88b24 62 lcd.setBacklight(TextLCD::LightOn);
ramirezcar 2:8181dbf88b24 63 lcd.cls();
ramirezcar 2:8181dbf88b24 64 lcd.locate(0, 0);
ramirezcar 2:8181dbf88b24 65 lcd.printf(str);
ramirezcar 2:8181dbf88b24 66 lcd.locate(0, 1);
ramirezcar 2:8181dbf88b24 67 lcd.printf("Distancia: %d",distancia);
ramirezcar 2:8181dbf88b24 68 }
ramirezcar 2:8181dbf88b24 69 //Determinación de selector
ramirezcar 2:8181dbf88b24 70 char determinarSelector(){
ramirezcar 2:8181dbf88b24 71 char selector;
ramirezcar 2:8181dbf88b24 72 if(Infra == 0){//sensor infarojo detecta obstaculo
ramirezcar 1:79299edab09b 73 d = 4;
ramirezcar 1:79299edab09b 74 selector = 'd';
ramirezcar 1:79299edab09b 75 }
ramirezcar 2:8181dbf88b24 76 else if(Infra == 1){ //no detecta obstaculo
ramirezcar 1:79299edab09b 77 d =ultra.distance(1);
ramirezcar 2:8181dbf88b24 78 if(d>4 && d<=20){//distamcia entre 4 y 20
ramirezcar 1:79299edab09b 79 selector = 'a';
ramirezcar 1:79299edab09b 80 }
ramirezcar 2:8181dbf88b24 81 else if(d>20 && d<= 40){//entre 20 y 40
ramirezcar 1:79299edab09b 82 selector = 'b';
ramirezcar 1:79299edab09b 83 }
ramirezcar 2:8181dbf88b24 84 else if(d > 40){//distacia mayor a 40
ramirezcar 1:79299edab09b 85 selector = 'c';
ramirezcar 1:79299edab09b 86 }
ramirezcar 2:8181dbf88b24 87 }
ramirezcar 2:8181dbf88b24 88 return selector;
ramirezcar 2:8181dbf88b24 89 }
ramirezcar 2:8181dbf88b24 90 //rutina principal
ramirezcar 2:8181dbf88b24 91 int main(){
ramirezcar 2:8181dbf88b24 92 setup();
ramirezcar 2:8181dbf88b24 93 pc.baud(115200); // Velocidad de Transmisión
ramirezcar 2:8181dbf88b24 94 pc.printf("Inicio\n");//Mensaje de Incio de lectura de diastanciaen en pantalla PC
ramirezcar 2:8181dbf88b24 95 while(1){ // Para que se ejecute siempre
ramirezcar 2:8181dbf88b24 96 char selector = determinarSelector();
ramirezcar 1:79299edab09b 97 switch(selector){
ramirezcar 2:8181dbf88b24 98 case 'a' : //distancia entre 4 y 20
ramirezcar 1:79299edab09b 99 Naranja = 1;
ramirezcar 1:79299edab09b 100 Azul = 0;
ramirezcar 1:79299edab09b 101 Verde = 0;
ramirezcar 1:79299edab09b 102 Rojo = 0;
ramirezcar 2:8181dbf88b24 103 mostrar(array[0], d);
ramirezcar 1:79299edab09b 104 break;
ramirezcar 2:8181dbf88b24 105 case 'b' ://dist. entre 20 y 40
ramirezcar 1:79299edab09b 106 Azul = 1;
ramirezcar 1:79299edab09b 107 Naranja = 0;
ramirezcar 1:79299edab09b 108 Verde = 0;
ramirezcar 1:79299edab09b 109 Rojo = 0;
ramirezcar 2:8181dbf88b24 110 mostrar(array[1], d);
ramirezcar 1:79299edab09b 111 break;
ramirezcar 2:8181dbf88b24 112 case 'c' :// dist. > 40
ramirezcar 1:79299edab09b 113 Verde = 1;
ramirezcar 1:79299edab09b 114 Azul = 0;
ramirezcar 1:79299edab09b 115 Naranja = 0;
ramirezcar 1:79299edab09b 116 Rojo = 0;
ramirezcar 2:8181dbf88b24 117 mostrar(array[2], d);
ramirezcar 1:79299edab09b 118 break;
ramirezcar 2:8181dbf88b24 119 case 'd' :// entre 0 y 4
ramirezcar 1:79299edab09b 120 Verde = 0;
ramirezcar 1:79299edab09b 121 Azul = 0;
ramirezcar 1:79299edab09b 122 Naranja = 0;
ramirezcar 1:79299edab09b 123 Rojo = 1;
ramirezcar 2:8181dbf88b24 124 mostrar(array[3], d);
ramirezcar 1:79299edab09b 125 break;
ramirezcar 2:8181dbf88b24 126 default :// Si no cae en ningún rango anterior; señal de alrma mal funcionamiento sensores (endendido de 4 leds al mismo tiempo).
ramirezcar 1:79299edab09b 127 Verde = 1;
ramirezcar 1:79299edab09b 128 Azul = 1;
ramirezcar 1:79299edab09b 129 Naranja = 1;
ramirezcar 1:79299edab09b 130 Rojo = 1;
ramirezcar 1:79299edab09b 131 break;
ramirezcar 1:79299edab09b 132 }
ramirezcar 2:8181dbf88b24 133 wait(5); //Espere 5 seg
ramirezcar 0:7b1293e58047 134 }
ramirezcar 1:79299edab09b 135
ramirezcar 0:7b1293e58047 136 }
ramirezcar 1:79299edab09b 137