Práctico 3

Anuncio
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
Descargar