Anda di halaman 1dari 10

Cmo Medir Distancias con el Sensor Ultrasnico PING

Ral Alvarez

Los sensores ultrasnicos permiten medir distancias desde los 2-3 centmetros hasta los 3-6 metros (para algunos modelos populares) sin la necesidad de un contacto fsico, lo cual es muy til en una amplia variedad de aplicaciones, desde la robtica y los sistemas de alarma, hasta aplicaciones industriales y por supuesto, tambin en proyectos de pasatiempo para los aficionados al bricolaje electrnico. El Sensor Ultrasnico de Distancia PING (o "PING)))" como lo denomina su fabricante) tiene una interfaz simple de tres terminales y utiliza una sola linea para lograr una comunicacin bidireccional con su dispositivo de control (tpicamente un microcontrolador). No ests muy seguro de cmo hacer las lecturas de distancia de este sensor? En este tutorial presentamos un sistema bsico con un microcontrolador y un programa en lenguaje C para la interfaz con el sensor PING de Parallax. El microcontrolador lee el dato de la distancia del sensor y lo visualiza en una pantalla LCD genrica.

Caractersticas Clave del Sensor PING

El sensor PING funciona mediante la transmisin de una rfaga de ultrasonido en una frecuencia muy por encima del rango auditivo humano y provee un pulso de salida, el cual corresponde con el tiempo requerido por el eco (rebote) para retornar hasta el sensor. Al medir la duracin de este pulso se puede calcular fcilmente la distancia al objetivo.

Las caractersticas ms importantes del sensor PING son las siguientes:

Rango: 2 cm a 3 m LED indicador de rfaga que muestra la actividad del sensor Interfaz bidireccional por pulso, en un nico pin de E/S para comunicacin con microcontroladores TTL (5V) o CMOS (3.3V) Disparo de entrada: pulso TTL positivo, 2 s mnimo, 5 s tpico Pulso eco de salida: pulso positivo TTL, 115 s mnimo a 18.5 ms mximo.

Encuentra los detalles de este sensor en nuestra Tienda Virtual.

Descripcin del Hardware


El hardware para este proyecto es muy similar al usado en el proyecto "Bus Serial I2C: Sensor de Temperatura MCP9800 con PIC16F628A y LCD" , se ha usado el mismo microcontrolador y tambin la pantalla LCD para visualizar la distancia leda. No explicar en detalle la implementacin de estos dos dispositivos ya que dicha informacin se la puede encontrar en el tutorial mencionado.

Microcontrolador PIC16F628A
El PIC se ha programado para trabajar con su oscilador interno de 4 MHz, minimizando as el conteo de componentes externos. El cdigo de programa para la interfaz con el sensor ultrasnico es muy sencillo; el programa para el PIC est escrito en lenguaje C para el compilador PICC de Hi Tech, pero es fcilmente portable a otros compiladores, otros lenguajes o incluso al lenguaje ensamblador.

Pantalla de Cristal Lquido (LCD)


La interfaz con la pantalla LCD tambin se ha descrito con ms detalle en el tutorial "Bus Serial I2C: Sensor de Temperatura MCP9800 con PIC16F628A y LCD" , es as que no ahondar en el uso de este dispositivo. En este ejemplo tambin la pantalla LCD trabaja en la modalidad con cuatro lneas paralelas de datos y se ha usado la librera de conexin para LCDs genricos provista por el compilador PICC de Hi Tech.

Diagrama del Circuito

Funcionamiento del Sensor Ultrasnico de Distancia PING


El sensor PING posee solamente tres terminales, dos de las cuales son para la alimentacin de voltaje (VDD y GND) y la tercera (SIG) es usada para la comunicacin bidireccional con el microcontrolador.

La comunicacin con el sensor es realmente muy simple. Una vez que se ha entendido el protocolo, es fcil implementarlo.

Protocolo de Comunicacin
El sensor PING detecta objetos mediante la emisin de una rfaga ultrasnica y luego "escucha" el eco de retorno.

Bajo el control de un microcontrolador, el cual debe enviar un pulso corto de disparo, el sensor emite una corta rfaga ultrasnica a una frecuencia de 40 KHz. La rfaga viaja a travs del aire, choca con un objeto y luego rebota hacia el sensor. El sensor PING provee un pulso de salida al microcontrolador, que inicia cuando la rfaga es enviada y termina cuando el eco es detectado, de ah que la longitud del pulso corresponda con la distancia al objeto.

De la explicacin arriba mencionada se puede resumir el siguiente algoritmo bsico para la lectura del sensor:

1.

Configurar el pin de comunicacin en el microcontrolador como salida.

2. Escribir un "0" lgico al pin de comunicacin.


3. 4. 5. Esperar un tiempo corto para estabilizar la lnea de comunicacin (5 s). Escribir un "1" lgico al pin de comunicacin. (Inicio de pulso de disparo). Retardo de tiempo (2-5 s) para lograr el ancho de pulso de disparo del sensor.

6. Terminar el pulso de disparo escribiendo un "0" lgico al pin de comunicacin.


7. 8. Configurar el pin de comunicacin como entrada. Esperar hasta recibir un "1" lgico en el pin de comunicacin. (Inicio del pulso de eco de salida del sensor). 9. Activar el temporizador del PIC

10. Esperara hasta recibir un "0" lgico en el pin de comunicacin. (Fin del pulso de eco de salida del sensor). 11. Desactivar el temporizador del PIC. 12. Leer conteo efectivo en el temporizador en s. 13. Calcular la distancia en funcin a la duracin del pulso de eco de salida del sensor.

Debido a que la duracin del pulso provisto por el sensor contiene la informacin del tiempo que tarda la rfaga en ir y volver desde el objetivo, esta duracin se debe dividir por 2 para calcular la distancia, de otro modo estaramos calculando el doble de la distancia (ida + vuelta).

Listado del Programa


El cdigo est detalladamente comentado. view source print ?

001./* ************************************************************************* ****** 002. * Sensor Ultrasnico de Distancia PING (Parallax) con PIC16F6248A y LCD Ver. 1.0 003. * 004. * Recibe la lectura de distancia del sensor PING (Parallax) 005. * y lo visualiza en un LCD genrico de 16x2. 006. * Para el uso del LCD hace uso de las libreras y cdigo ejemplo provistos 007. * por el compilador PICC de HI-tech. 008. * 009. * Hardware: PIC16F628A, Sensor PING))), LCD 16x2 genrico. 010. * Funciones: Software ejemplo para el sensor ultrasnico PING))) de Parallax 011. * Versin: 1.0 (10 de Marzo de 2011) 012. * Autor: Raul Alvarez Torrico (www.TecBolivia.com) 013. * 014. * Descargado de www.TecBolivia.com - Ingresa al sitio para ms ejemplos similares. 015.********************************************************************* *************/ 016. 017.#include <htc.h> 018.#include <stdlib.h> // Necesario para la funcin itoa() 019.#include <stdio.h> // Necesario para la funcin itoa() 020.#include "lcd.h" // Librera para comunicacin con el LCD incluida con el compilador PICC 021.#include "delay.h" // Librera para retardos incluida con el compilador PICC 022. 023./* Palabra de configuracion para el PIC16F628A, versin PICC 9.70 */ 024.//__CONFIG(UNPROTECT & UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO); 025. 026./* Palabra de configuracion para el PIC16F628A para versiones del compilador PICC desde 027. la Version 9.81 en adelante */ 028.__CONFIG(CPD_OFF & CP_OFF & LVP_OFF & BOREN_ON & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO); 029.

030./* A partir de la versin 9.81 del compilador PICC las definiciones de los bits de configuracin 031. han sido cambiadas. Todas las definiciones para el PIC16F628A estn ubicadas en el archivo: 032. (Directorio Archivos de Programa)\HI-TECH Software\PICC\9.xx\include\pic16f628a.h 033.*/ 034. 035.#define SENSOR_PIN RB5 036.#define SENSOR_PIN_DIR TRISB5 037. 038.char aux; // Variable auxiliar para depuracin 039. 040.void timer_init (); 041.void mostrar_distancia (unsigned int * distancia, char fila); 042. 043.void main(void) 044.{ 045. unsigned int conteoMSB = 0; // Variable de 16 bits para almacenamiento de conteo total 046. unsigned char conteoLSB = 0; // Variable de 8 bits para almacenamiento LSB del conteo 047. CMCON = 0x07; // Configurar Puerto A como digital I/O 048. TRISB = 0x00; // Puerto B como salida 049. /* OJO!!! Los pull-ups del Puerto B deben estar deshabilitados */ 050. 051. lcd_init(); // Funcin de inicializacion del LCD 052. timer_init(); // Funcin de inicializacion del Timer1 053. 054. SENSOR_PIN = 0; // Inicializar el valor del pin de comunicacin con el sensor 055. 056. while (1) { // Ciclo infinito 057. 058. SENSOR_PIN_DIR = 0; // Configurara SENSOR_PIN como salida 059. SENSOR_PIN = 1; // Inicia pulso de disparo 060. DelayUs(5); // Retardo de tiempo requerido s/g datasheet (mnimo 2 us) 061. SENSOR_PIN = 0; // Termina pulso de disparo 062. 063. SENSOR_PIN_DIR = 1; // Configurara SENSOR_PIN como entrada 064. TMR1H = 177; // Carga inicial del timer1 registro MSB 065. TMR1L = 224; // Carga inicial del timer1 registro LSB 066. while (!SENSOR_PIN) // Esperar el arribo del pulso de respuesta 067. ; 068. TMR1ON = 1; // Lleg pulso eco de respuesta, activar Timer1 069. 070. while (SENSOR_PIN && !TMR1IF) // Esperar conclusion de eco de respuesta

071. ; // o timeout TMR1IF de 20 ms 072. 073. /* Rango de duracin de pulso provisto por el sensor: 115 us a 18.5 ms 074. * Si el conteo sobrepasa los 18.5 ms y llega a 20 ms, se puede considerar 075. * que se ha recibido un pulso no vlido del sensor. Error de timeout. */ 076. 077. //if (TMR1IF) // Si el Timer pasa los 20 ms programados... 078. // ubicar aqu algn cdigo de error de timeout 079. 080. TMR1ON = 0; // Desactivar Timer1 081. TMR1IF = 0; // Borrar bandera Timer1 082. 083. conteoMSB = TMR1H; // Leer mximo conteo alcanzado por el Timer MSB 084. conteoLSB = TMR1L; // Leer mximo conteo alcanzado por el Timer LSB 085. 086. /* Conversin de 2 bytes a 1 word (16 bits): 087. * Recorrer el MSB 8 posiciones a la izquierda (multipplizar por 256) 088. * y luego sumarlo con el byte LSB */ 089. conteoMSB = conteoMSB*256; // Multiplicar por 256 para recorrer 8 posiciones 090. conteoMSB = conteoMSB + conteoLSB; // Sumar con el byte LSB 091. 092. /* Calculo de la distancia en funcin al ancho del pulso: 093. * Restar primeramente el nmero de carga inicial del Timer (45536), 094. * dividir por 29 (vel. sonido = 1/29 cm/us, calculado de vel. sonido = 345 m/s), 095. * dividir por 2 debido a que el pulso provisto por el sensor representa el tiempo 096. * total de ida y vuelta (eco) del ultrasonido. Solo necesitamos la mitad. */ 097. conteoMSB = (conteoMSB - 45536)/29/2; 098. mostrar_distancia(&conteoMSB, 0); 099. 100. DelayMs(255); // Pequeo retardo para no saturar la impresin en el LCD 101. } 102.} 103. 104./******************************************************************** *********** 105.* INICIALIZA EL TIMER1 DEL MICROCONTROLADOR 106.* 107.* Descripcin : Inicializa el Timer1 del microcontrolador para funcionar con 108. reloj interno, sin prescalador, sin interrupcin. 109.* Argumentos : Ninguno.

110.* Retorna : Nada 111.* Notas : 112.********************************************************************* ***********/ 113.void timer_init() 114.{ 115. TMR1IE = 0; // Interrupcin Timer1 desabilitada 116. 117. // Timer1 Prescalador = 1 - TMR1 Preset = 45536 (para un conteo mximo de 20 ms 118. //Freq = 50.00 Hz - Periodo = 0.020000 seconds 119. // Rango de duracin de pulso provisto por el sensor: 115 us a 18.5 ms 120. // Si el conteo sobrepasa los 18.5 ms y llega a 20 ms, se puede considerar 121. // que se ha recibido un pulso no vlido del sensor. Error de timeout. 122. 123. T1CKPS1 = 0; // bits 5-4 Bits de seleccin de Prescalador 124. T1CKPS0 = 0; // bit 4 125. TMR1CS = 0; // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4) 126.} 127. 128./******************************************************************** *********** 129.* MUESTRA LA DISTANCIA EN EL LCD 130.* 131.* Descripcin : Muestra en el LCD la distancia en centmetros 132.* Argumentos : unsigned int * distancia puntero al word de la distancia 133.* char fila la fila para la escritura de la temperatura 134.* Retorna : Nada 135.* Notas : 136.********************************************************************* ***********/ 137.void mostrar_distancia (unsigned int * distancia, char fila) 138.{ 139. char buf[3]; // Buffer temporal para conversin entero a cadena de caracteres 140. 141. lcd_goto(fila); // Posicionar el cursor del LCD en la fila correspondiente 142. lcd_puts("Distancia:"); 143. itoa(buf, *distancia, 10); // Convertir word de distancia a cadena de caracteres 144. lcd_puts(buf); // Mandar a LCD 145. lcd_puts(" cm"); // Escribir " cm" 146.}

Conclusin
Como se ha visto, el procedimiento para la lectura del Sensor Ultrasnico de Distancia PING))) es bastante sencillo. No es difcil imaginar varias posibilidades de aplicacin para este sensor en reas como la robtica, sistemas de navegacin, sistemas de seguridad e incluso sistemas industriales; su interfaz simple hace que sea posible su uso con virtualmente cualquier microcontrolador, incluso con los ms pequeos como el PIC10F200 de Microchip

Anda mungkin juga menyukai