Práctica 4

Transcripción

Práctica 4
Práctica 4
Funcionamiento y uso del Sonar (Polaroid 6500 Ultrasonic Ranging System)
Objetivo
Analizar el funcionamiento del Sonar, las señales involucradas (diagrama de tiempo) así
como las conexiones y software necesario para comunicarse con el Handy Board.
Introducción
Una de las técnicas más usadas en robótica para detectar proximidad es la medición del
tiempo de vuelo ó TOF (time of flight) de una señal emitida. Esto lo podemos lograr con
el módulo de Polaroid, un apropiado transductor y una conexión a un microprocesador
que pueda interpretar la información proporcionada por el módulo.
A continuación se muestran las conexiones del módulo y la ubicación de las señales más
relevantes que serán utilizadas más adelante en esta práctica:
IMPORTANTE: verificar que el módulo y el transductor se encuentren
adecuadamente conectados (cable negro en laminilla interna, y cable negro con
blanco en laminilla externa).
Funcionamiento
El proceso es sencillo y para comenzar se necesita proporcionarle una señal digital a la
línea INIT, la cual creará una serie de transiciones (16 pulsos a 50 kHz) que alimentaran
al transductor. Estas transiciones excitan al transductor, el cual emite una onda radial que
viaja por el aire a la velocidad del sonido (343.2 m/s). La señal se debilita rápidamente al
llegar al extremo máximo de sensado (aproximadamente 10 metros).
Cuando la onda emitida alcanza un objeto en su camino, es reflejada de vuelta hacia el
transductor (la dirección de la onda reflejada depende de la forma, orientación y
superficie con las que cuenta el objeto alcanzado por la señal, sin embargo, el módulo de
Polaroid es capaz de detectar objetos pequeños a una distancia considerable).
Cuando la señal regresa al transductor, se genera un voltaje que se alimenta de vuelta al
módulo. Cuando el módulo detecta la señal reflejada cambia su señal de ECHO. Después
de esto lo único que queda es medir por software el tiempo utilizado desde que se genero
la señal excitadora (INIT) hasta que se obtuvo la señal reflejada (ECHO). Este tiempo
esta relacionado con la distancia y nos proporciona la distancia recorrida por la onda.
•
•
El internal blanking se realiza de forma automática en el módulo, tiene una duración
de 2.38 ms, y es utilizado para evitar que el transductor tome mediciones
equivocadas, como ruido ó resonancia de la señal emitida.
La señal BINH es utilizada en caso de que se desee eliminar el Internal Blanking.
Gracias a esto podemos obtener mediciones más cercanas, con el riesgo de obtener
mediciones equivocadas de vez en cuando.
Conexión con el Handy Board
NOTA: El Expansion Board cuenta con toda la circuiteria necesaria para conectar
el Sonar; lo único que es necesario es cablear el bus conector del sonar a los pines
correspondientes; para más información visitar:
http://www.handyboard.com/hbexp30/software.html
Si no contamos con Expansion Board, hay que realizar los siguientes pasos. Para poder
controlar el módulo del sensor necesitamos salidas digitales desde el Handy Board. En
esta práctica utilizaremos el puerto D del Handy Board (puerto D del micro 68HC11)
para mandarle señales digitales al módulo del sonar.
Utilizaremos la expansión de la fuente de voltaje para proporcionarle alimentación y
tierra al módulo del sonar. Es recomendable utilizar los diodos (6 diodos 1N5401
capacidad de 3A de corriente) para bajar el voltaje proporcionado al módulo (el voltaje
directo de la conexión es casi 8 volts, lo cual puede ser alto para el sonar) y también nos
ayuda a evitar daños en el Handy Board en caso de que se genere una corriente inversa
desde el sonar.
Por último, la señal de ECHO la conectaremos a la entrada digital 7 del Handy Board,
que funciona como entrada para sensor y como timer.
IMPORTANTE
*Verificar que no haya cables sin protección (pelones) tocándose. Utilizar cinta de
aislar en donde sea necesario.
*Al realizar las conexiones con el conector de 9 pines del módulo, es recomendable
utilizar cable delgado y la técnica de wire wrapping.
Software
Ahora entraremos en detalle con el programa que utilizaremos para utilizar el Sonar con
el Handy Board. A continuación se muestran algunos registros que serán utilizados, así
como sus respectivas direcciones de memoria y algunas funciones para acceder a
memoria:
PORTD $1008
DDRD $1009
TCTL2 $1021
TFLG1 $1023
PORTA $1000
TCNT $100E
TIC3 $1014
; Port D data register
; Data Direction register for port D
; Timer Control register 2
; main Timer interrupt Flag register 1
; Port A data register
; Timer Count Register
; Timer Input Capture register 3
int peek(int loc) - Returns the byte located at address loc.
int peekword(int loc) - Returns the 16-bit value located at address loc and loc + 1. loc
has the most significant byte, as per the 6811 16-bit addressing standard.
void poke(int loc, int byte) - Stores the 8-bit value byte at memory address loc.
void pokeword(int loc, int word) - Stores the 16-bit value word at memory addresses
loc and loc + 1.
void bit set(int loc, int mask) - Sets bits that are set in mask at memory address loc.
void bit clear(int loc, int mask) - Clears bits that are set in mask at memory address loc.
Estas funciones y registros deben ser usados con precaución ya que si le damos un
uso inapropiado podemos corromper la memoria y desconfigurar el sistema.
Comenzaremos con la rutina utilizada para la configuración inicial:
void sonar_init() {
bit_set(0x1009, 0x30);
bit_set(0x1021, 1);
bit_clear(0x1021, 2);
}
/* Definir en el registro DDRD que D4 y D5 son salidas digitales */
/* registro TCTL2 */
/* set tic3 for rising edge */
Analicemos la primera instrucción. El registro DDRD nos sirve para definir el puerto D
como salidas digitales. La máscara de 30h proporcionada nos sirve para definir como
salidas digitales al puerto D4 (conectado al pin BINH del sonar) y D5 (conectado al pin
INIT del sonar y que nos servirá para transmitir el pulso inicial).
Registro DDRD
Máscara (0x30)
X
0
X
0
SS (D5)
1
SCK (D4)
1
MOSI
0
MISO
0
X
0
X
0
Las siguientes dos instrucciones modifican el registro TCTL2, para que el timer input 3
se active cuando se detecte una señal en ese puerto (Sensor Input 7 / Puerto A0 / Timer
Input 3), el cual esta conectado a la señal de ECHO del sonar que sube a 1 lógico cuando
el pulso del sonar es recibido de vuelta.
Driver sencillo
La tarea de esta función es sencilla, tiene que hacer funcionar el sonar, elevando a "1"
lógico la señal de INIT, para luego medir el tiempo hasta que la señal de ECHO se activa.
Como se señalo anteriormente, la señal de ECHO esta conectada al timer input, por lo
cual el timer subsystem es usado automáticamente para capturar el valor del tiempo
cuando la señal de ECHO es activada (para esos son las últimas dos instrucciones de la
función de inicialización previamente mostrada). Por lo tanto, lo que hay que hacer en el
programa es grabar el tiempo inicial (cuando prendemos el INIT), limpiar el timer,
esperar que se active la señal de ECHO, y por último calcular el tiempo total, tomando en
cuenta que el nuevo valor se guardo automáticamente en el registro del timer.
int sonar_sample() {
int start_time;
/* variable donde guardaremos el tiempo inicial */
poke(0x1023, 1); /* clear tic3 flag (se logra poniendo un "1" en el registro TFLG1*/
start_time= peekword(0x100e); /* capture start time (registro TCNT)*/
bit_set(0x1008, 0x20);
/* trigger pulse (Señal Inicial desde el puerto D5) */
while (!(peek(0x1000) & 0x1)) { /* wait until receive echo */
if ((peekword(0x100e) - start_time) < 0) {
/* if too much time has elapsed, abort */
bit_clear(0x1008, 0x20);
return -1;
}
defer();
/* let others processes run while waiting */
}
bit_clear(0x1008, 0x20); /* clear pulse trigger (Apagar la señal de inicialización) */
return peekword(0x1014) - start_time; /* tic3 has time of echo */
}
Lo primero que hacemos es crear una variable para guardar el tiempo inicial. La siguiente
instrucción nos sirve para limpiar el timer que vamos a utilizar (se modifica la bandera
TIC3 dentro del registro TFLG1) y con esto, el timer se encuentra listo para capturar la
variable global de tiempo cuando reciba la señal de ECHO.
A continuación se captura el tiempo inicial, que es tomado desde el registro global de
tiempo TCNT (en la dirección 0x100e). El registro TCNT se incrementa cada 0.5
microsegundos (2,000,000 incrementos por segundo). La siguiente instrucción es un
bit_set, para disparar el pulso desde el puerto D5 del Handy Board, hacia la señal INIT
del módulo del sonar (en la dirección $1008 se realizan los cambios a las señales del
puerto D, y la convención de las señales es idéntica a la del registro DDRD mostrado
previamente).
A continuación llegamos a un ciclo donde se espera a que la señal de ECHO se active, y
también cuenta con la opción de regresar un valor erróneo (-1) si ha pasado mucho
tiempo (Recordar que el tiempo en el cual se activa la señal de ECHO es grabado de
forma automática, como si fuera una interrupción).
Dentro del ciclo nos encontramos con la instrucción defer(). Este es un comando especial
de Interactive C que es utilizado para ceder el control a otros procesos que estén
corriendo simultáneamente. De esta manera el ciclo dentro de nuestra función no utiliza
mucho tiempo de procesamiento, solo verifica que la señal de ECHO haya sido activada,
de lo contrario le puede otorgar tiempo de procesamiento a otros procesos, para después
volver a verificar el estado de la señal ECHO.
Después de salir del ciclo (ya tenemos señal de ECHO), apagamos la señal de disparo que
inicialmente prendimos con un bit_set y regresamos el calculo de tiempo, substrayendo el
tiempo inicial del tiempo capturado en el registro de Timer Input 3.
Driver con capacidad de Close-Up
Como se menciono previamente en la sección del funcionamiento del módulo, este
automáticamente inhabilita la recepción de alguna señal en los primeros 2.38
milisegundos (es a lo que llamamos Internal Blanking) después de producir la señal
inicial, para que de esta manera el sensor no detecte algún campaneo de la señal original
(residual ringing) ó alguna otra especie de ruido en el momento después de haber
transmitido el pulso. Este modo default de operación nos limita la capacidad del sensor
para detectar distancias desde 40.5 cm en adelante, cuando previamente habíamos
mencionado que podemos detectar objetos a 15cm.
Esta limitación puede ser eliminada al utilizar la señal BINH (Blanking INHibit). El
módulo recibirá señales de ECHO tan pronto como se pueda después de habilitar la señal
BINH, sin necesidad de esperar los 2.38 ms, logrando detectar objetos más cercanos.
La rutina que mostramos a continuación es muy similar a sonar_sample(), sin embargo,
aquí habilitamos la señal BINH 0.5 milisegundos después de que se generó la señal de
inicio (debe de existir un pequeño tiempo antes de habilitar el BINH, por eso definimos
los 0.5 milisegundo, que no es tanto como esperar 2.38 milisegundos).
int sonar_closeup() {
int start_time;
poke(0x1023, 1);
/* clear tic3 flag */
start_time= peekword(0x100e);
poke(0x1008, 0x20);
while ((peekword(0x100e) - start_time) < 1000);
bit_set(0x1008, 0x30);
/* turn on BINH */
while (!(peek(0x1000) & 0x01)) {
if ((peekword(0x100e) - start_time) < 0) {
/* if too much time has elapsed, abort */
bit_clear(0x1008, 0x30);
return -1;
}
defer();
}
bit_clear(0x1008, 0x30);
return peekword(0x1014) - start_time; /* 0x1014 is tic3 */
}
Rutina de Prueba
Una vez cargado el programa dentro del microcontrolador, podemos utilizar la siguiente
rutina para comprobar el funcionamiento de las dos rutinas anteriores. Hay que recalcar
que la última instrucción representa un retraso entre la generación de cada pulso. Este
retraso lo podemos bajar hasta 50 milisegundos (si es más bajo el sonar no funcionará
adecuadamente); en este ejemplo se definieron 300 milisegundos para poder observar
claramente el resultado en la pantalla LCD del Handy Board.
void sonar_display()
{
sonar_init();
/* Configuración inicial */
while (1) {
/* Al presionar cualquier tecla se interrumpe el ciclo */
int result;
result= sonar_sample(); /* llamar a la función */
if (result != -1) printf("%d\n", result); /* impresión de un número
decimal entero y cambio de linea*/
else printf("*******\n"); /* medición incorrecta */
msleep(300L);
/* delay entre muestras (300 milisegundos)*/
}
}
Ejercicio - Tiempo de Recorrido
Las rutinas que se presentaron anteriormente reportan el tiempo total pero en unidades
del registro TCNT del micro 68HC11, unidades que se incrementan 2000000 veces cada
segundo, ó lo que es lo mismo, se incrementa en 1 unidad cada 0.5 microsegundos.
El sonido viaja alrededor de 33.5 cm. por milisegundo con condiciones atmosféricas
promedio. Como la señal viaja y se regresa hay que tomar en cuenta en los cálculos para
convertir tiempo en distancia que el tiempo obtenido es del viaje redondo.
Tomemos una medición que consta de 10000 unidades, la cual representa 5 milisegundos
(de acuerdo a la relación mencionada anteriormente). Para obtener la distancia es
necesario multiplicar velocidad por tiempo, por lo tanto multiplicamos la velocidad del
sonido (en centímetros/milisegundos) por el tiempo en milisegundos que acabamos de
obtener. Esta operación nos da un resultado de 1.67 metros, que es el tiempo del viaje
redondo, por lo tanto, el objeto que fue alcanzado por el sonar se encuentra a 84 cm. de
distancia.
Realice una función adicional que nos permita visualizar en el LCD la distancia en
centímetros medida por el sensor (la distancia del sensor al obstáculo), y que nos advierta
con algún sonido cuando la distancia sea menor a 30 cm.
Preguntas
*Comente sobre las diferencias entre las funciones sonar_sample y sonar_closeup
(señales adicionales involucradas, ventajas y desventajas posibles)
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
*Redacte sus conclusiones y comente sobre la utilidad de esta práctica para el desarrollo
de su proyecto.
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
************************************************************************
Los drivers y algunas imágenes fueron tomados del siguiente enlace:
http://www.handyboard.com/software/sonar.html

Documentos relacionados