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