Hola a todos !
Para ésta se tenía que hacer que el robot recogiera una víctima (en consenso todos los grupos decidimos elegir unas fichas amarilla que hay en el laboratorio).
Primero que nada debemos mencionar que gran parte del carro fué remodelada. Se cambiaron las siguientes cosas:
- Ahora cada ruega funciona con dos engranajes, que van a lograr que el carro vaya mucho más rapido. Para lograr ésto se configuran de la siguiente forma: uno grande que esta pegado al motor para mover a otro pequeño, que está en el eje de las ruedas, de ese modo por cada vuelta que de el movimiento se traduce en varias vueltas de la rueda. En el siguiente link se puede ver mas información sobre esto: http://es.wikipedia.org/wiki/Engranaje
Img 1. Sistema de engranajes para las ruedas.
- Se agrego un compartimiento para las víctimas. Éste consiste de una puerta que sube y baja mediante un servo motor. Además fueron agregadas dos piezas que sirven de parachoques y ayudan a ingresar a las víctimas, pues funcionan a modo de embudo.
Img 2. Compuerta (color amarillo) controlada por el servomotor (a la derecha, azul). Parachoques con funcionalidad de embudo.
A continuación una explicación detallada de cómo sujetamos el servomotor de la compuerta:
Img 3. Piezas necesarias para construir el soporte del servo motor.
- Se mejoró la estructura para que fuera más rígida.
- La base donde se encuentra el sensor infrarrojo fué mejorada y cambió para que se pudieran agregar dos más hacia los lados para detectar la distancia hasta las paredes del laberinto y así poder calibrar su avance. También serán útiles para detectar posibles caminos hacia los lados.
Img 4. "Torreta" con los 3 sensores de distancia infrarojos Sharp.
Luego de esto se calibró la cámara y se programó al GBA para que reconociera el color de la víctima. Para ellos se ingresa en Vision->Color Model y se seleccionan los 3 "tipos de color" (canales) que se quieren reconocer. En nuestro caso configuramos el tercero para reconocer el color deseado: azul.
En cuanto al código que se uso, este hace lo siguiente además de si ve un obstáculo girar hacia la izquierda. Cuando detecte un blob de cierto tamaño del color de la víctima procede a llamar a agarrar_bloque().
Acá se hace lo siguiente:
1) Se paran los motores
2) Abre el servo
3) Hace un ciclo que va a ir alineando el carro con respecto a lo víctima. Para ello mueve una rueda más rápido que otra dependiendo si el objeto esta más de un lado u otro
4) Finalmente se sale del ciclo cuando lo deja de ver y simplemente es que lo tiene cerca por lo que se lo deja siguiendo cierto tiempo
5) Se cierra el servo de modo de empujar más para adentro a la víctima
6) Coloca el servo a 90 grados del suelo
He aquí el código:
#use "xbccamlib.ic"
void rotate_bot(float turns)
{
float half_width, radius, pi, ticks_per_robot_rev;
float ticks_per_wheel_rev, robot_rev_circum, wheel_circum;
long ticks_to_turn;
//put in pre-defined values
half_width=100.; radius=50.; pi=3.1416; ticks_per_wheel_rev=2000.;
//calculate circumferences and ticks
wheel_circum=pi*radius*2.0;
robot_rev_circum=half_width*pi*2.0;
ticks_per_robot_rev=
ticks_per_wheel_rev*robot_rev_circum/wheel_circum;
ticks_to_turn=(long)(turns*ticks_per_robot_rev);
mrp(0,RUEDAD,ticks_to_turn); //move left motor forward
mrp(2,RUEDAI,-ticks_to_turn); //move right motor backwards
bmd(0); bmd(2); //wait for both motors to complete moves
}
//Esquiva cuando consigue algo
void girar(float grados){
rotate_bot(grados);
}
#define RUEDAD 380
#define RUEDAI 345
void main()
{
init_camera();
enable_servos();
set_servo_position(0,180);
sleep(1.0);
mav(0,RUEDAD);
mav(2,RUEDAI);
while(1){
track_update();
if (analog(0) > 120){
ao();
girar(0.05);
mav(0,RUEDAD);
mav(2,RUEDAI);
}
else if(track_count(2) > 0 && track_size(2,0)>500){
printf("ENCONTRE UN BLOQUE\n");
agarrar_bloque();
mav(0,RUEDAD);
mav(2,RUEDAI);
}
}
}
void agarrar_bloque()
{
ao();
set_servo_position(0,60);//abrir
sleep(1.0);
while(track_size(2,0)>500) {
track_update();
mav(2, RUEDAI-100+(track_x(2,0)-176));
mav(0, RUEDAD-100+(3*(176-track_x(2,0)))/2);
//mav(2, RUEDAI+2*(track_x(2,0)-176));//mav(0, RUEDAD);
printf("%d\n", track_x(2,0));
sleep(0.1);
}
mav(0,RUEDAD);
mav(2,RUEDAI);
sleep(4.0);
set_servo_position(0,210);//empujar
sleep(1.0);
set_servo_position(0,180);//acomodar
sleep(1.0);
printf("Y LO AGARRE\n");
}
Seguiremos publicando el progreso!
No hay comentarios:
Publicar un comentario