Siguiendo con los ejemplos de código en XC8 toca el turno de usar el sensor ultrasonico HC-SR04, usare el proceso descrito en el datasheet para leer la distancia en centímetros y el valor lo mostrare en una pantalla LCD16x2, sera un ejemplo básico para leer un solo sensor, si se desea usar mas sensores probablemente en un futuro haga otra entrada hablando al respecto.
Para hacer una lectura de distancia con el HC-SR04 seguiremos los siguientes pasos:
- Enviar un pulso de 10us por el pin TRIG para indicarle al sensor que iniciara la lectura.
- El sensor enviara una trama de 8 pulsos y colocara su salida ECHO en alto, aquí es donde detectaremos este cambio e iniciaremos un conteo de tiempo.
- Este pin ECHO estará en alto hasta recibir el eco reflejado por el obstáculo, después se pondrá en estado bajo y se termina de contar el tiempo.
- Distancia en CM = tiempo medido en us / 58
- Distancia en PULGADAS = tiempo medido en us / 148
- Si el tiempo medido es mayor a 30ms entonces se asume que no hay obstáculo.
Circuito:
El circuito no es nada complejo, usaremos la LCD a 4bits así que todos los pines estarán conectados al PORTB de nuestro MCU similar a como se conecto en la publicación donde se hablo este tema, ahora bien los pines del HC-SR04 los conectaremos al PORTD, como se muestra en el siguiente esquemático.
Código:
En el código se tiene la función unsigned int HCSR04_GetDistance(void) que es la encargada de devolver la distancia en centímetros, simplemente ponemos en alto Trigger 10uS y esperamos a que Echo cambien, mientras hacemos el conteo, el retardo __delay_us(58) es lo que le tarda en viajar los ultrasonicos dos centímetros (uno de ida y uno de vuelta), el código mide centímetros completos, en caso de necesitar mas precisión es cuestión de mejorar la rutina pero eso ya es otro tema.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* Uso del sensor ultrasonico HC-SR04 | |
* | |
******************************************************************************* | |
* FileName: main.c | |
* Processor: PIC18F4620 | |
* Complier: XC8 v1.42 & MPLAB X IDE v5.00 | |
* Author: Pedro Sánchez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: Uso basico del sensor ultrasonico HC-SR04 | |
******************************************************************************* | |
* Rev. Date Comment | |
* v0.0.1 19/04/2020 - Creación del ejemplo | |
******************************************************************************/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <stdint.h> | |
#include <xc.h> | |
#include <stdbool.h> | |
#include "word_config.h" //Only here | |
#include "lcd.h" | |
#define _XTAL_FREQ 8000000 | |
/*********** P O R T D E F I N I T I O N S **********************************/ | |
#define pinTrigger LATDbits.LATD1 | |
#define pinTrigger_Tris TRISD1 | |
#define pinEcho PORTDbits.RD0 | |
#define pinEcho_Tris TRISD0 | |
/************** V A R I A B L E S *********************************************/ | |
unsigned int distance; | |
char lcdDistance[8]; | |
/************** P R O T O T Y P E S *******************************************/ | |
void MCU_Init(void); | |
unsigned int HCSR04_GetDistance(void); | |
void main(void) { | |
MCU_Init(); | |
//Definimos el puerto y los pines donde esta la LCD | |
LCD lcd = { &PORTB, 0, 1, 4, 5, 6, 7 }; // PORT, RS, EN, D4, D5, D6, D7 | |
LCD_Init(lcd); | |
LCD_Clear(); | |
LCD_Set_Cursor(0,0); | |
LCD_putrs(" MrChunckuee!!"); | |
LCD_Set_Cursor(1,0); | |
LCD_putrs(" Sensor HC-SR04"); | |
__delay_ms(2000); | |
while(1){ | |
distance = HCSR04_GetDistance(); | |
if(distance>400){ | |
LCD_Clear(); | |
LCD_Set_Cursor(0,0); | |
LCD_putrs("Sensor HC-SR04"); | |
LCD_Set_Cursor(1,0); | |
LCD_putrs("Fuera de rango"); | |
__delay_ms(1000); | |
} | |
else{ | |
itoa(lcdDistance, distance, 10); | |
LCD_Clear(); | |
LCD_Set_Cursor(0,0); | |
LCD_putrs("Sensor HC-SR04"); | |
LCD_Set_Cursor(1,0); | |
LCD_puts(lcdDistance); | |
LCD_Set_Cursor(1,4); | |
LCD_putrs("cm"); | |
__delay_ms(1000); | |
} | |
} | |
} | |
void MCU_Init(void){ | |
//Configura oscilador interno a 8MHz | |
OSCCONbits.IRCF=0b111; | |
ADCON1=0xFF; //Entradas digitales | |
//Limpiamos puertos | |
PORTA=0x00; | |
PORTB=0x00; | |
PORTC=0x00; | |
PORTD=0x00; | |
//Todos los puertos como salidas | |
TRISA=0x00; | |
TRISB=0x00; | |
TRISC=0x00; | |
TRISD=0x00; | |
pinTrigger_Tris = 0; //Output | |
pinEcho_Tris = 1; //Input | |
} | |
unsigned int HCSR04_GetDistance(void){ | |
unsigned int centimeter=0; | |
pinTrigger = 1; | |
__delay_us(10); | |
pinTrigger = 0; | |
while(pinEcho==0); //Espera flanco de subida por el pin echo | |
while(pinEcho==1){ | |
centimeter++; | |
__delay_us(58); | |
} | |
return(centimeter); | |
} |
Resultados:
Acá un par de fotos con algunas mediciones.
Donaciones:
Acá un par de fotos con algunas mediciones.
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Bibliografía:
- Cytron Technologies, "Product User’s Manual – HC-SR04 Ultrasonic Sensor", https://docs.google.com/document/d/1Y-yZnNhMYy7rwhAgyL_pfa39RsB-x2qR4vP8saG73rE
- MrChunckuee, "MPLAB X & XC8: Librería para pantalla LCD 16x2", https://mrchunckuee.blogspot.com/2017/02/mplabx-y-xc8-005.html
0 Comentarios