Fundamentos de la robótica autónoma Práctico 01 Fundamentos de la robótica autónoma Práctico 03 – Controladores. Lectura recomendada Diapositivas de teórico y las referencias que éstas incluyen. Ejercicio 1 Se desea controlar el movimiento de un pequeño carrito colocando una rueda a la derecha y otra a la izquierda movidas por motores paso a paso (no preocuparse por el equilibrio del carrito). En la figura 1 se puede ver un diagrama lateral y otro superior del carrito. Los motores paso a paso funcionan mediante un sistema de bobinas que se van excitando adecuadamente para producir el movimiento del eje. En la figura 2 se muestra la posición que toma el eje (perpendicular a la rueda) según que bobina se excite, además se muestra con línea punteada la rueda del carrito. Si se desea girar la rueda en sentido antihorario debemos excitar a las bobinas según la secuencia A,B,C,D,A y para girar la rueda en sentido horario debemos excitar según la secuencia A,D,C,B,A. Para excitar una bobina debe escribirse un 1 en el bit adecuado y para que repose debe escribirse un 0. Las bobinas se acceden en E/S sólo escritura según el siguiente diagrama: Se pide: a) Implementar los siguientes procedimientos para controlar al auto: • avanzar(vel: integer), hace que el auto avance a velocidad vel. • retroceder(vel: integer), ídem para retroceder. • girarHorario(vel: integer), ídem para girar en sentido horario el auto (visto desde arriba). • girarAntihorario(vel: integer), ídem para girar en sentido antihorario. • detener(), detiene el auto. El parámetro vel indica la cantidad de pasos por segundo que deben realizarse. Página 1 de 4 Fundamentos de la robótica autónoma Práctico 01 b) Indique que rango de valores puede tomar el parámetro vel. ¿Qué velocidad puede alcanzar el auto (m/s) si se le colocan ruedas de D centímetros de diámetro? Nota: • • se dispone de un reloj que interrumpe cada 10ms invocando a la rutina TIEMPO. Para manejar E/S en alto nivel deben utilizar las pseudo-instrucciones del tipo dato=in(DIR E/S) y out (DIR E/S, dato). Ejercicio 2 (*)1 Un módulo de Laser Range Finder (LRF) es un dispositivo que utiliza un haz láser para determinar la distancia a un objeto. Muchos robots utilizan este tipo de módulos para implementar algoritmos de evasión de obstáculos y la construcción de mapas. El módulo LRF se coloca en el eje de un motor, de manera de poder apuntarlo en distintas direcciones al modificar la posición angular del motor. El motor puede ser colocado en 16 posiciones angulares predefinidas. Las interfaces del LRF y del motor son las siguientes: • Para generar un pulso láser se debe escribir un 1 en el bit más significativo del byte de E/S de solo escritura en la dirección LRF. • El módulo LRF genera una interrupción al procesador atendida por la rutina lrfFinish() cuando finalizó de calcular la distancia, dejando este resultado en la palabra de E/S de solo lectura en la dirección DISTANCE. • Para posicionar el motor en la posición i debe escribirse un 1 en el bit i de la palabra de E/S de solo escritura en la dirección MOTOR_POSITION. • El motor coloca un 1 en el bit más significativo de la palabra de E/S solo lectura MOTOR_STATE cuando el motor alcanzó la posición indicada. Se pide: Implementar en un lenguaje de alto nivel, preferentemente C, la función getDistances() y todas las demás rutinas necesarias para el correcto funcionamiento de la misma. La función recibe como parámetro una palabra con las posiciones angulares cuyas distancias correspondientes se desean obtener y devuelve un array con las lecturas en las posiciones indicadas. Debe retornar -1 para las posiciones no consultadas. Observaciones: • Puede asumirse que el módulo LRF siempre finaliza una lectura encomendada. • Cada bit i de la palabra de posiciones se corresponde con la posición i del motor. Ejercicio 3 Los módulos de ultrasonido (MUS) utilizan un principio similar a los radares o sonares, los cuales evalúan los atributos de un objetivo mediante la interpretación del eco recibido al enviar una onda de radio o sonido respectivamente. Los MUS constan de dos elementos bien diferenciados, un emisor de ondas de sonido de alta frecuencia y un sensor que detecta el eco producido. Considerando el tiempo transcurrido desde el envío de la onda y la recepción del eco, es posible calcular la distancia al objeto con el que colisionó la onda. Muchos robots móviles utilizan este tipo de módulos para implementar algoritmos de evasión de obstáculos. La distancia a los objetos puede calcularse con la ecuación d = C × t/2, donde C es la velocidad del sonido en el aire (344m/s a 20ºC) y t es el tiempo transcurrido entre el envío de la onda y su recepción. 1 Los ejercicios * deben entregarse a través del EVA. Página 2 de 4 Fundamentos de la robótica autónoma Práctico 01 La interfaz entre el MUS y el procesador es la siguiente: • Para generar una onda se debe colocar un 1 en el bit más significativo del byte de E/S solo escritura PING. • El sensor coloca un 1 en el bit más significativo byte de E/S solo lectura ECHO cuando recibe un eco en el sensor. Se dispone de reloj que genera una interrupción al procesador atendida por la rutina timer(), la frecuencia del reloj es TIMER_FREC Hz. Se pide: a) Implementar en un lenguaje de alto nivel la rutina de atención a la interrupción timer() y todas las rutinas necesarias para obtener la distancia en mm a objetos detectados por un MUS. b) Teniendo en cuenta que la instrucción de división del procesador implementa la división entera y no se desea perder precisión el la lectura de distancia al realizar operaciones aritméticas, defina un valor adecuado para TIMER_FREC. Compilar a assembler 8086 la solución propuesta en la parte anterior y la frecuencia definida. Para el pasaje de parámetros se utiliza el stack. Observaciones: • El MUS no es capaz de detectar objetos a más de 8m. • Cuando no detecta objetos se debe retornar distancia -1. Ejercicio 4(*) El duty cycle es la porción de tiempo en que el pulso se mantiene en 1 o Vcc, y se expresa como un porcentaje dado por la siguiente ecuación: duty cycle = 100% * (pulse on time) / (pulse period) Se pide: (a) Implementar en un lenguaje de alto nivel, preferentemente C, las siguientes funciones: • onPWM(), que habilita la generación de la señal PWM. • OffPWM() • setPWM(duty, period) La señal PWM debe generarse en el bit menos significativo del puerto PWM_SIGNAL. (b) Suponiendo que se controlara un motor de CC con el PWM. Implemente la función setPower(power). (c) Proponga una interfaz de entrada/salida para un puente H e implemente el procedimiento setDirection(clockwise: boolean). Ejercicio 5 Se desea controlar la posición de un servomotor utilizando las funciones implementadas en el ejercicio anterior. El motor modifica su posición angular de manera lineal en base al tiempo que se mantiene en uno la señal. La siguiente figura muestra algunas posiciones. Se debe implementar la función setAngle(angle). Página 3 de 4 Fundamentos de la robótica autónoma Práctico 01 Ejercicio 6(*) Se desea implementar un controlador de temperatura para un calefón eléctrico. Para esto se disponen de las siguientes funciones que accede a entrada y salida: • int getTemperature(): lee la temperatura actual del agua. • void setPower(on: booelan): enciende o apaga el calentador. Se pide: a) Diagramar un controlador realimentado. b) Implementar la función setTemperature que recibe la temperarura deseada y debe mantenerla en el tiempo. Nota: se dispone de un reloj que interrumpe cada 10ms invocando a la rutina timer. Ejercicio 7 Se desa implementar un control de velocidad crucero de un automovil. Para esto se disponen de las siguientes funciones que accede a entrada y salida: • int getHall(): lee el valor del sensor hall. • void setPower(power: integer): indica un valor entre 0 y 100 a setear en la potencia del automovil. Se pide: a) Diagramar un controlador realimentado. b) Implementar la función setCruiseSpeed que recibe la velocidad deseada y debe mantenerla en el tiempo. Nota: • Se dispone de un reloj que interrumpe cada 10ms invocando a la rutina TIEMPO. • La lectura del sensor hall está conectado al dispositivo de cómputo de forma que genera una interrución por flanco ascentente que invoca a la rutina hall. Ejercicio 8 Para el problema presentado en el ejercicio 6. Diseñar un conjunto de reglas para un controlador difuso. Página 4 de 4