Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in Sensores digitales | 0 comments

Sensor de distancia ultrasonico

Sensor de distancia ultrasonico

Sensor ultrasónico HC-SR04

Ejemplo para el senor ultrasonico HC-SR04 HeTPro.

HC-SR04

Vista frontal Sensor HC-SR04

 

DESCRIPCIÓN

En este tutorial se pretende que el usuario sea capaz de hacer funcionar el módulo ultrasónico HC-SR04 con un Microcontrolador ATmega168 el cual será programado en C (GCC), con el AVR Studio 4. El proyecto incluye una etapa de sensado y además una etapa de salida de datos o despliegue de la información, acción que se realizara con una LCD. Si se requiere más información acerca de la LCD hacemos referencia a nuestro tutorial de la LCD y al manual de referencia del AVR Studio en donde viene un ejemplo con una LCD.

Tutorial de Hetpro para la pantalla LCD

Tutorial del manual de referencia del AVR Studio/WinAVR

 

DIAGRAMA ESQUEMÁTICO

diagrama esquematico

Diagrama Esquemàtico

 

 

MATERIALES

  1. Sensor ultrasónico HC-SR04 (Ver en tienda virtual)
  2. Pantalla LCD 16×2 (Ver en tienda virtual)
  3. Microcontrolador ATmega168 (Ver en tienda virtual)
  4. Programador USBasp V3.0 (Ver en tienda virtual)
  5. Protoboard (Ver en tienda virtual)

 

FOTOS

HC-SR04

USBasp v3.0 COMPRAR

 

HC-SR04

LCD 16×2 COMPRAR

 

HC-SR04

HC-SRC04

 

HC-SR04

HC-SR04

 

HC-SR04

HC-SR04

 

 

 

INTRODUCCIÓN

DESCRIPCIÓN DEL SENSOR

El sensor de distancia ultrasónico HC–SR04 tiene la capacidad de sensar la distancia por medio de la diferencia en tiempo entre la transmisión y recepción de una serie de pulsos que el modulo envía y captura. Este sensor es capaz de sensar fielmente distancias de entre 2cm y 400cm de manera no invasiva o sin contacto. El funcionamiento básico del sensor es el siguiente:

  1. El módulo recibe un pulso de entrada para de por lo menos 10 uS de duración.
  2. Una vez recibido el pulso de entrada en el trigger, el módulo envía ocho pulsos a una frecuencia de 40 KHz y espera a que regresen esos pulsos para sensarlos.
  3. Cuando el módulo lee todos los pulsos este convierte la diferencia de tiempo en un pulso de salida que tiene un ancho de pulso determinado, el cual está en función del tiempo en que los pulsos fueron transmitidos y recibidos los cuales están en función de la distancia.
  4. Para calcular la distancia solo se usa la siguiente expresión: Distancia=(Ancho del pulso * 170)

  CARACTERISTICAS DEL SENSOR

  1. Fuente de alimentación :5V DC
  2. Angulo efectivo: <15°
  3. Distancia efectiva de medición : 2cm – 500 cm/1″ – 16ft
  4. Resolución : 0.3 cm

Hoja de datos del HC-SR04

Principales usos

  1. Robotica
  2. Ingenieria automotriz
  3. Industria y procesos de producción
  4. Arte y desarrollos independientes
  5. Calibración
  6. Deteccion de personas

A continuación tenemos el programa en lenguaje C, fue desarrollado en AVR Studio y compilado con WinAVR. Para este tutorial se utilizo el ATmega168.

 

PROGRAMA EN C

#include <avr/io.h>					 //Librerias necesarias
#include <util/delay.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>
#define Enable_On PORTC|=_BV(PC2)    //Definiciones para la LCD, para mas info
#define Enable_Off PORTC&=~_BV(PC2)  //referirse a la hoja de datos del modulo
#define RS_On PORTC|=_BV(PC0)        //HD44780 de la LCD
#define RS_Off PORTC&=~_BV(PC0)
#define RW_On PORTC|=_BV(PC1)
#define RW_Off PORTC&=~_BV(PC1)
#define Data PORTD
#define DelayL _delay_ms(1);
#define START_CLK 0x0A               //Inicializar el reloj con 1:8 de preescalador / Modo CTC
#define START_CLK_N 0x02             //Inicializar el reloj con 1:8 de preescalador
#define STOP_CLK 0x08                //Parar el timer
int i=0;                             //Variable para los ciclos for
char str[4];                         //String o cadena de caracteres de maximo 4
long int range;                      //Variable donde guardara el dato leido del ultrasonico
int chars;                           //Numero de caracteres a mostrar en el LCD
void LCD_PORT_init (void){           //Función para inicializar puertos del LCD
DDRC=0x07;
DDRD=0xFF;
PORTC=0x00;
PORTD=0x00;
}
void LCD_Driver_init (void){         //Función para inicializar el LCD
Data=0x0F;
Enable_On;
DelayL;
Enable_Off;
Data=0x00;
RS_On;
DelayL;
}
void LCD_write(char text[4], int chars_lcd){ //Función para escribir en el LCD
RS_On;
for (i=0;i<chars_lcd; i++){
Data=text[i];
Enable_On;
DelayL;
Enable_Off;
DelayL;
}
i=0;
Data=0x00;
RS_Off;
}
void LCD_clear(void){               //Función para limpiar la pantalla del LCD
Data=0x01;
Enable_On;
DelayL;
Enable_Off;
}
int LCD_chars(int chars_numb){     //Funcion para calcular los caracteres a mostrar
int number=3;                      //en el LCD segun el dato leido del ultrasonico
if(chars_numb<=99) number=2;
if(chars_numb<=9) number=1;
return number;
}
void TIMER_init(void){             //Funcion para inicializar el timer
DDRB = 0x20;                       //Pin de trigger del ultrasonico activado como salida
TCCR1A = 0x00;                     //Activar modo CTC
TCCR1B = 0x08;                     //Limpiar el dato de OC1A/OC1B
}
void US_trigger(void){             //Funcion para mandar el pulso al trigger del ultrasonico
PORTB = ( 1<<PORTB5 );
_delay_us(10);
PORTB = ( 0<<PORTB5 );
}
unsigned int US_echo(void){        //Funcion para leer el dato del ultrasonico
unsigned int range;
while(!(PINB&0x01));               //Esperar a que en el PB0 entre un nivel alto (inicio de medicion)
TCNT1 = 0x00;                      //Limpiar el timer, dejarlo en cero
TCCR1B = START_CLK_N;              //Inicializar el reloj con 1:8 de preescalador
while((PINB&0x01));                //Esperar a que en el PB0 entre un nivel bajo (final de medicion)
TCCR1B = STOP_CLK;                 //Parar el timer
range = TCNT1/58;                  //Leer el valor del registro y dividirlo entre 58 para obtener
return(range);                     //la medicion en cm.
}
int main (void){          		   //Inicio del programa
LCD_PORT_init();      			   //Inicializar los puertos para el LCD
LCD_Driver_init();      		   //Inicializar el LCD
LCD_clear();            		   //Limpiar cualquier dato que este mostrando el LCD
TIMER_init();  			           //Inicializar el timer
while(1){
US_trigger();           		   //Mandar el pulso al trigger para que el ultrasonico se active
range = US_echo();  			   //Leer el valor medido por el ultrasonico, segun el ancho del pulso
ltoa (range,str,10);    		   //Cambiar el numero de entrero a un string
chars=LCD_chars(range);			   //Calcular cuantos caracteres se necesitan en el LCD
LCD_write(str,chars);              //Escribir en el LCD el valor del ultrasonico
_delay_ms(10);
LCD_clear();                       //Limpiar la pantalla del LCD
}
}

 

VIDEO

 

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *