Sensor Ultrasónico, Pic C Compiler

En esta sección aprenderás a programar un sensor ultrasónico capaz de medir distancia con un microcontrolador PIC. El objetivo es emitir una señal de radio ultrasónica y medir el tiempo que tarda la señal en volver al sensor ultrasónico.

Características del Sensor HC-SR04

  • Voltaje: DC 5V
  • Corriente: 15mA
  • Frecuencia: 40Hz
  • Rango Max: 4m
  • Rango Min: 2cm
  • Trigger Input Signal: 10µS TTL pulse
  • Echo Output Signal Input TTL
  • Dimensiones: 45 * 20 * 15mm

Entrada y salida de señales de control para el sensor ultrasónico

Se envía una señal de 10us de ancho de pulso al pin trigger del sensor.

El pin de Echo retorna una señal de salida con un ancho de pulso proporcional al tiempo que tarda en percibir el objeto.

Formula para calcular la distancia

Para calcular la distancia al objeto se multiplica la velocidad del sonido por el tiempo que tarda enviar recibir la señal y se divide entre 2 para obtener solo el tiempo de ida.

Circuito de conexión 

Programación

Código archivo .h

En el archivo .h se coloca la instrucción para utilizar el oscilador interno a 4MHz.

#use delay(internal=4000000)

Código archivo .c

Primero se asignan los pines de echo y trigger conectados al microcontrolador.

#define trig pin_d1 
#define echo pin_d0 

Se activa la instrucción de temporizador que permitirá contar el tiempo que tarda en recibir la señal.

setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);

Se define la variable entera de 32 bits para guardar el valor que registre el temporizador.

int32 tiempo=0; // timer 1 es de 16 bits =65535u decimal

Se envía la señal de pulso con un ancho de pulso de 10us al pin de trigger del sensor ultrasónico.

output_bit(trig,1);
delay_us(10);
output_bit(trig,0); 

Se realiza el conteo del tiempo que tarda en recibir la señal de salida del pin echo del sensor al pin del microcontrolador.

while(!input(echo)) 
{}
set_timer1(0);
while(input(echo))
{}

La siguiente instrucción guarda el dato del temporizador en la variable «tiempo». 

tiempo=get_timer1();

Finalmente se hace la conversión de tiempo a distancia.

distancia=(tiempo*0.0172);

Si se utiliza el oscilador interno de 4Mhz el tiempo de desbordamiento del timer1 se establece en 65.535ms por lo que seria el valor máximo que se podría medir. El tiempo de desbordamiento se obtiene en un valor de 16 bits es decir:

Si, 65.535ms = 16 bits     ó    65.535ms = 65535 decimal

Y si convertimos el tiempo de desbordamiento en microsegundos (us) se puede considerar que el tiempo de desbordamiento es igual a los 16 bits en decimal.

65535us = 65535 decimal

Código completo

#FUSES NOMCLR

#define LCD_RS_PIN PIN_B6
#define LCD_RW_PIN PIN_B5
#define LCD_ENABLE_PIN PIN_B4
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B2
#define LCD_DATA6 PIN_B1
#define LCD_DATA7 PIN_B0
#include "lcd.c" 

#define trig pin_d1 
#define echo pin_d0 

void main()
{
   lcd_init();
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   int32 tiempo=0; // timer 1 es de 16 bits = 65535 decimal
   float distancia=0;
   while(TRUE)
   {
   
      lcd_gotoxy(1,1); printf(LCD_PUTC,"\fDistancia");
      lcd_gotoxy(1,2); printf(LCD_PUTC,"%f cm",distancia);
      
      output_bit(trig,1);
      delay_us(10);
      output_bit(trig,0); 
      
      while(!input(echo)) 
      {}
      set_timer1(0);
      while(input(echo))
      {}
      tiempo=get_timer1();
      distancia=(tiempo*0.0172);
      delay_ms(100);
   }

}
Scroll al inicio