El sensor HC-SR04 es un sensor de distancia de bajo costo, su uso es muy frecuente en la robótica, utiliza transductores de ultrasonido para detectar objetos. La siguiente librería a desarrollar es para el uso con microcontroladores PIC del sensor ultrasónico HCSR04. Su funcionamiento consiste en emitir un sonido ultrasónico por uno de sus transductores, y esperar que el sonido rebote de algún objeto presente, el eco es captador por el segundo transductor. La distancia es proporcional al tiempo que demora en llegar el eco.
Declaración De Pines
El sensor ultrasónico cuenta con 4 pines, 2 de los cuales son para la alimentación del dispositivo.
Por defecto, en la librería se encuentran los pines declarados de la siguiente manera, el pin ECHO se conecta a una entrada digital mientras que el TRIGGER a una salida.
//Declaracion de pines de la librería --- Cambiar al gusto si es necesario #define ECHO PORTBbits.RB7 #define TRIGGER LATBbits.LB6
Nota: En el programa principal deben configurarse los pines del puerto B o el utilizado como salidas o entradas digitales según el caso de cada bit. ES MUY IMPORTANTE REALIZARLO PARA QUE EL SENSOR PUEDA INICIAR A MEDIR LA DISTANCIA.
Funciones
Esta librería cuenta con 4 funciones principales, las cuales se centran en medir la distancia, y son las siguientes:
- DIST_cm(); Medir distancia en centímetros
- DIST_m(); Medir distancia en metros
- DIST_in(); Medir distancia en pulgadas
- DIST_ft(); Medir distancia en pies
Es recomendable utilizar un display LCD para poder conocer el dato de distancia que arroja la librería. En este caso, la separación de dígitos es algo que se le deja al usuario.
Para utilizar alguna función basta con declarar una variable de tipo float en el programa principal y asignarle el valor de la función. Por ejemplo:
x = DIST_cm();
En el código de la librería se menciona en donde debe colocarse el punto decimal para mostrarla en una LCD.
Conexiones (Miuva 18 / PIC 18F46k22)
Las conexiones mencionadas en la librería pueden observarse en la siguiente ilustración, pero pueden cambiarse según lo requiera el usuario.
Código de ejemplo (Miuva 18 / PIC 18F46k22)
//Pines de la LCD #define RS LATDbits.LATD5 #define EN LATDbits.LATD4 #define D4 LATDbits.LATD0 #define D5 LATDbits.LATD1 #define D6 LATDbits.LATD2 #define D7 LATDbits.LATD3 //Declarar frecuencia del oscilador #define _XTAL_FREQ 48000000 //Incluir librerias #include <xc.h> #include "Ultrasonico.h" #include "lcd.h" //Configuración de los fusibles #pragma config PLLDIV = 2, CPUDIV = OSC1_PLL2, USBDIV = 2 #pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF #pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF #pragma config WDT = OFF #pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF #pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF //Prototipo de funcion void EnviarNumero(int numero); //Variables globales int u = 0, d = 0, c = 0; int um = 0; int x1 = 0; float x = 0.0; //Funcion principal void main(void) { TRISD = 0x00; //Los pines del puerto D son salidas digitales para la LCD ULTRA_Init(); ADCON1 = 0b00001111; //Todos los puertos son digitales TRISB = 0b10000000; //Configuración de pines del puerto B Lcd_Init(); Lcd_Clear(); __delay_ms(50); while(1){ x = DIST_cm(); //Medir distancia en centimetros //x = DIST_m(); //Medir distancia en metros //x = DIST_in(); //Medir distancia en pulgadas //x = DIST_ft(); //Medir distancia en pies __delay_ms(100); Lcd_Set_Cursor(1,1); um = distancia / 1000.0; x1 = distancia % 1000; c = x1 / 100.0; x1 = x1 % 100; d = x1 / 10.0; u = x1 % 10; EnviarNumero(um); //Lcd_Write_Char('.'); //El punto decimal para el caso de la distancia en metros EnviarNumero(c); //Lcd_Write_Char('.'); //El punto decimal para el caso de la distancia en pies EnviarNumero(d); Lcd_Write_Char('.'); //El punto decimal para el caso de la distancia en centimetros y en pulgadas EnviarNumero(u); Lcd_Write_String(" cm"); //Para la distancia en centimetros //Lcd_Write_String(" m"); //Para la distancia en metros //Lcd_Write_String(" in"); //Para la distancia en pulgadas //Lcd_Write_String(" ft"); //Para la distancia en pies Lcd_Set_Cursor(2,1); Lcd_Write_String("INTESC"); } return; } void EnviarNumero(int numero){ numero += 48; Lcd_Write_Char(numero); }