P. 1
Cómo Medir Distancias con el Sensor Ultrasónico PING

Cómo Medir Distancias con el Sensor Ultrasónico PING

|Views: 555|Likes:

More info:

Published by: Roberto Castro López on Aug 11, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

09/29/2015

pdf

text

original

Cómo Medir Distancias con el Sensor Ultrasónico PING

Raúl Alvarez

Los sensores ultrasónicos permiten medir distancias desde los 2-3 centímetros hasta los 3-6 metros (para algunos modelos populares) sin la necesidad de un contacto físico, lo cual es muy útil en una amplia variedad de aplicaciones, desde la robótica y los sistemas de alarma, hasta aplicaciones industriales y por supuesto, también en proyectos de pasatiempo para los aficionados al bricolaje electrónico. El Sensor Ultrasónico 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 comunicación bidireccional con su dispositivo de control (típicamente un microcontrolador). ¿No estás muy seguro de cómo hacer las lecturas de distancia de este sensor? En este tutorial presentamos un sistema básico 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 genérica.

Características Clave del Sensor PING

El sensor PING funciona mediante la transmisión de una ráfaga 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 duración de este pulso se puede calcular fácilmente la distancia al objetivo.

Las características más importantes del sensor PING son las siguientes:

minimizando así el conteo de componentes externos. Encuentra los detalles de este sensor en nuestra Tienda Virtual. 2 μs mínimo. 115 μs mínimo a 18. 5 μs típico Pulso eco de salida: pulso positivo TTL. Descripción 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" .• • • • • Rango: 2 cm a 3 m LED indicador de ráfaga que muestra la actividad del sensor Interfaz bidireccional por pulso. En este ejemplo también la pantalla LCD trabaja en la modalidad con cuatro líneas paralelas de datos y se ha usado la librería de conexión para LCDs genéricos provista por el compilador PICC de Hi Tech. Pantalla de Cristal Líquido (LCD) La interfaz con la pantalla LCD también se ha descrito con más detalle en el tutorial "Bus Serial I2C: Sensor de Temperatura MCP9800 con PIC16F628A y LCD" . en un único pin de E/S para comunicación con microcontroladores TTL (5V) o CMOS (3. es así que no ahondaré en el uso de este dispositivo. Diagrama del Circuito .5 ms máximo. otros lenguajes o incluso al lenguaje ensamblador.3V) Disparo de entrada: pulso TTL positivo. Microcontrolador PIC16F628A El PIC se ha programado para trabajar con su oscilador interno de 4 MHz. El código de programa para la interfaz con el sensor ultrasónico es muy sencillo. No explicaré en detalle la implementación de estos dos dispositivos ya que dicha información se la puede encontrar en el tutorial mencionado. el programa para el PIC está escrito en lenguaje C para el compilador PICC de Hi Tech. se ha usado el mismo microcontrolador y también la pantalla LCD para visualizar la distancia leída. pero es fácilmente portable a otros compiladores.

Funcionamiento del Sensor Ultrasónico de Distancia PING El sensor PING posee solamente tres terminales. . dos de las cuales son para la alimentación de voltaje (VDD y GND) y la tercera (SIG) es usada para la comunicación bidireccional con el microcontrolador.

Bajo el control de un microcontrolador. el sensor emite una corta ráfaga ultrasónica a una frecuencia de 40 KHz. es fácil implementarlo. . el cual debe enviar un pulso corto de disparo. de ahí que la longitud del pulso corresponda con la distancia al objeto. choca con un objeto y luego rebota hacia el sensor. La ráfaga viaja a través del aire. Una vez que se ha entendido el protocolo. El sensor PING provee un pulso de salida al microcontrolador. que inicia cuando la ráfaga es enviada y termina cuando el eco es detectado. Protocolo de Comunicación El sensor PING detecta objetos mediante la emisión de una ráfaga ultrasónica y luego "escucha" el eco de retorno.La comunicación con el sensor es realmente muy simple.

esta duración se debe dividir por 2 para calcular la distancia. Debido a que la duración del pulso provisto por el sensor contiene la información del tiempo que tarda la ráfaga en ir y volver desde el objetivo. de otro modo estaríamos calculando el doble de la distancia (ida + vuelta). 8. (Inicio de pulso de disparo). Terminar el pulso de disparo escribiendo un "0" lógico al pin de comunicación. Leer conteo efectivo en el temporizador en μs. 6. Calcular la distancia en función a la duración del pulso de eco de salida del sensor. Esperara hasta recibir un "0" lógico en el pin de comunicación. 7. Escribir un "0" lógico al pin de comunicación. 3.De la explicación arriba mencionada se puede resumir el siguiente algoritmo básico para la lectura del sensor: 1. Esperar hasta recibir un "1" lógico en el pin de comunicación. Configurar el pin de comunicación como entrada. 5. 9. Activar el temporizador del PIC 10. Esperar un tiempo corto para estabilizar la línea de comunicación (5 μs). (Inicio del pulso de eco de salida del sensor). (Fin del pulso de eco de salida del sensor). 4. Escribir un "1" lógico al pin de comunicación. 2. Configurar el pin de comunicación en el microcontrolador como salida. 12. 11. Retardo de tiempo (2-5 μs) para lograr el ancho de pulso de disparo del sensor. Desactivar el temporizador del PIC. . 13.

026. .Ingresa al sitio para más ejemplos similares.#include <htc. * 004. Sensor PING))). * Versión: 1./* Palabra de configuracion para el PIC16F628A. 029.h> 018.TecBolivia.//__CONFIG(UNPROTECT & UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO). * Para el uso del LCD hace uso de las librerías y código ejemplo provistos 007. 010./* Palabra de configuracion para el PIC16F628A para versiones del compilador PICC desde 027. la Version 9.h" // Librería para retardos incluida con el compilador PICC 022. 015. * Recibe la lectura de distancia del sensor PING (Parallax) 005. * Descargado de www.70 */ 024. view source print ? 001.81 en adelante */ 028. * y lo visualiza en un LCD genérico de 16x2. versión PICC 9. * 009./* ************************************************************************* ****** 002. * 014.0 (10 de Marzo de 2011) 012.Listado del Programa El código está detalladamente comentado.#include "lcd.#include "delay. * por el compilador PICC de HI-tech.h" // Librería para comunicación con el LCD incluida con el compilador PICC 021. 025. 008. 1.com . * Autor: Raul Alvarez Torrico (www. * Sensor Ultrasónico de Distancia PING (Parallax) con PIC16F6248A y LCD Ver.#include <stdlib.********************************************************************* *************/ 016. 023.h> // Necesario para la función itoa() 020.__CONFIG(CPD_OFF & CP_OFF & LVP_OFF & BOREN_ON & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO).#include <stdio.TecBolivia. 017. LCD 16x2 genérico. * Hardware: PIC16F628A.com) 013. 006. * Funciones: Software ejemplo para el sensor ultrasónico PING))) de Parallax 011.0 003.h> // Necesario para la función itoa() 019.

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

086. conteoMSB = TMR1H.. 100.* Argumentos : Ninguno. 080. 099. 092. // Pequeño retardo para no saturar la impresión en el LCD 101. conteoMSB = conteoMSB + conteoLSB. .* 107. /* Conversión de 2 bytes a 1 word (16 bits): 087. * dividir por 29 (vel.} 103. sonido = 345 m/s). 104. * dividir por 2 debido a que el pulso provisto por el sensor representa el tiempo 096.5 ms y llega a 20 ms. } 102. sonido = 1/29 cm/us. sin interrupción. // Desactivar Timer1 081. . reloj interno. // Multiplicar por 256 para recorrer 8 posiciones 090. 094. calculado de vel. conteoMSB = (conteoMSB . TMR1IF = 0.5 ms 074. se puede considerar 075. */ 076. */ 097. * Recorrer el MSB 8 posiciones a la izquierda (multipplizar por 256) 088. TMR1ON = 0. Error de timeout. * Restar primeramente el número de carga inicial del Timer (45536). Solo necesitamos la mitad. 0). //if (TMR1IF) // Si el Timer pasa los 20 ms programados. // ubicar aquí algún código de error de timeout 079. conteoMSB = conteoMSB*256. 098.. * total de ida y vuelta (eco) del ultrasonido. /* Rango de duración de pulso provisto por el sensor: 115 us a 18. // Sumar con el byte LSB 091.* INICIALIZA EL TIMER1 DEL MICROCONTROLADOR 106. 073. 109. * que se ha recibido un pulso no válido del sensor.* Descripción : Inicializa el Timer1 del microcontrolador para funcionar con 108. /* Calculo de la distancia en función al ancho del pulso: 093. sin prescalador. conteoLSB = TMR1L. // Leer máximo conteo alcanzado por el Timer MSB 084. 078. DelayMs(255). mostrar_distancia(&conteoMSB. 083. // Borrar bandera Timer1 082. * y luego sumarlo con el byte LSB */ 089. // o timeout TMR1IF de 20 ms 072.45536)/29/2.071. * Si el conteo sobrepasa los 18. 077. // Leer máximo conteo alcanzado por el Timer LSB 085./******************************************************************** *********** 105. 095.

********************************************************************* ***********/ 137.* Notas : 136.5 ms 120.5 ms y llega a 20 ms. 122. char fila) 138.* Retorna : Nada 135.} .00 Hz .* Argumentos : unsigned int * distancia puntero al word de la distancia 133. TMR1IE = 0. // que se ha recibido un pulso no válido del sensor.0 = Internal clock (FOSC/4) 126. // Rango de duración de pulso provisto por el sensor: 115 us a 18.void timer_init() 114. se puede considerar 121.Periodo = 0. lcd_puts("Distancia:").********************************************************************* ***********/ 113.TMR1 Preset = 45536 (para un conteo máximo de 20 ms 118. // bits 5-4 Bits de selección de Prescalador 124. T1CKPS1 = 0./******************************************************************** *********** 129. // Escribir " cm" 146.{ 115.void mostrar_distancia (unsigned int * distancia. //Freq = 50.{ 139. // Si el conteo sobrepasa los 18.* char fila la fila para la escritura de la temperatura 134.. // Posicionar el cursor del LCD en la fila correspondiente 142. 128.* MUESTRA LA DISTANCIA EN EL LCD 130.020000 seconds 119. // bit 1 Timer1 Clock Source Select bit.* Retorna : Nada 111. lcd_puts(buf). lcd_puts(" cm"). Error de timeout. TMR1CS = 0..* Descripción : Muestra en el LCD la distancia en centímetros 132. // Convertir word de distancia a cadena de caracteres 144.* 131. 143. char buf[3]. // Buffer temporal para conversión entero a cadena de caracteres 140. T1CKPS0 = 0.* Notas : 112. 10). lcd_goto(fila). *distancia. // Interrupción Timer1 desabilitada 116. 141.110. itoa(buf. // Timer1 Prescalador = 1 .} 127. 117. // Mandar a LCD 145. 123. // bit 4 125.

incluso con los más pequeños como el PIC10F200 de Microchip . el procedimiento para la lectura del Sensor Ultrasónico de Distancia PING))) es bastante sencillo. sistemas de seguridad e incluso sistemas industriales.Conclusión Como se ha visto. sistemas de navegación. No es difícil imaginar varias posibilidades de aplicación para este sensor en áreas como la robótica. su interfaz simple hace que sea posible su uso con virtualmente cualquier microcontrolador.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->