Cómo hacer un baloncesto autónoma jugar robot utilizando un iRobot Create como base (5 / 7 paso)

Paso 5: código

Puede ser desordenado, pero funciona.

#use "createlib.ic"
#use "xbccamlib.ic"

#define cam 0 / / puerto de servo de cámara
#define brazo 3 / / Puerto servo del brazo
#define et (analog(0)) Puerto //et

/ * Crear cable también tiene que estar enchufada. La toma de corriente,
los 3 frentes enchufe en el puerto de 8 y la una etiqueta U X en JP 28
(al lado del puerto USB) con la U hacia la cámara * /

#define c_down 5 / / servos de la cámara hacia abajo
#define a_down 17 / / servo del brazo hacia abajo
#define mantenga 50 / / servo retención bola
#define atrapados 27 / / posición del servo para evitar quedar atrapado en la tabla del brazo
#define disparar 150 / / servo lanzar bola
#define track_c 25 / / pista de servo cámara cerrar posición
#define track_f 45 / / servo cámara pista posición lejana

#define centro 120 / / centro de la visión de la cámara
#define inrange 30 / / track_y coordinar cuando es bola en garra
#define bola 0 / / canal de bola naranja
#define ball_x (track_x(ball,0)) //x coordenadas de bola
#define ball_y (track_y(ball,0)) //y coordenadas de bola

#define lento 100 / velocidad del motor lento
#define rápida 175 / velocidad del motor rápido

#define clara 0.2//sleep hacia atrás sin obstáculos
#define tiempo 0.5 //1.0 es girar la derecha 90 grados
#define resto 0.05//time a dormir mientras gotas de seguimiento

#define speeda 175 / velocidad de evitar girar
#define back_s -200 / velocidad a la parte posterior del objeto beta
#define 32767 recta / / conducir en línea recta

#define backb 2 / canal de color principal tablero
#define cuadrado 1 / canal de color de acento del tablero
#define track_d 250 / posición de la cámara para el seguimiento de objetivo
#define track_find 70 / / seguimiento de la posición de la cámara por mucho tiempo
#define 2.25//sleep inversa tiempo para un 180
#define back_f -150 / / espalda alta velocidad
#define back_sl -125/espalda despacio
#define center_x 178 / / true x centro de cam
#define center_y 146 / / true y centro de la leva

int pida; //avoid proceso
pidb int; //track proceso
int pidc; //score proceso
int have_ball = 0; //tells función que estamos en

void main() {}
ch largo;
enable_servos (); //enable servos
init_camera (); //start cámara
Conecte (); //connect con control completo
start_a (); //start evitar la función
start_b (); //start ball_tracking función
{while(1)}
Si ((r_button) || gc_ldrop|| gc_rdrop) {//if recogido o botón del hombro de r
Kill(pida);
Kill(pidb);
Kill(PIDC);
disable_servos();
Disconnect();
Break;}
create_battery_charge();
display_clear();
printf ("costo = %l\n", gc_battery_charge);
if(gc_battery_charge<1200l|| {b_button())}
Kill(pida);
Kill(pidb);
Kill(PIDC);
Throw();
have_ball = 0;
create_demo(1);
while(b_button());
mientras que (gc_battery_charge < 2800l & &! b_button()) {}
create_battery_charge();
display_clear();
printf ("costo = %l\n", gc_battery_charge);
Sleep(1.0);}
Cconnect();
Back();
Sleep(2.0);
start_a();
start_b();}
}

}

void avoid() {}

while(1) {//repeat para siempre

create_sensor_update (); //update todos los valores del sensor
create_drive (speeda, recta);
if(gc_lbump==1) {//left de golpe
avoid_right();} gira a la derecha para evitar
if(gc_rbump==1) else {//right bump
avoid_left();} gira a la izquierda para evitar
if(gc_lfcliff==1) else {//left frente acantilado
avoid_right();}
if(gc_rfcliff==1) else {//right frente acantilado
avoid_left();}
if(gc_lcliff==1) else {//left acantilado
avoid_right();}
if(gc_rcliff==1) else {//right acantilado
avoid_left();}
}
}

void track_ball() {}

Kill(PIDC);

while(!have_ball) {//repeat hasta obtener bola

track_update();
lejos (); //sets la cámara
listo (); //sets el brazo

while(et<255) {//until valor máximo ocurre cuando la bola es atrapada

track_update (); imagen de cámara //update

Si (ball_x < =(center-5)) {//if la bola queda
track_update();
create_drive_direct (lento, rápido); //turn izquierda
Sleep(REST);}

else if (ball_x > =(center+5)) {//if la bola es
track_update();
create_drive_direct(Fast,Slow); / / girar a la derecha
Sleep(REST);}

else if (ball_x <(center+5) & & ball_x >(center-5)) {/ / si la bola es centrada
track_update();
create_drive_straight (rápida), //go recta
Sleep(REST);}
}
Grab (); //grab bola
BEEP (); //make ruido
STOP (); //stop de conducción
have_ball = 1; //make una nota que tengo bola
}
start_c (); //find la cesta
sueño (1.0); //sleep por lo que no estoy haciendo nada cuando sale maté
}

void find_basket() {}

Kill (pidb); //kill bola de seguimiento
buscar (); //put cámara para arriba
track_set_minarea (1000); //the tablero es grande, tan sólo buscan grandes blobs

mientras (have_ball) {//while tengo la bola

track_update();
while(track_x(backb,0) < =(center_x-20) || track_x(backb,0) > =(center_x+20)) {//while no centrada
track_update();

if(track_x(backb,0) > =(center_x+20)) {//if el tablero quedo
track_update();
create_spin_CCW(100);} Gire a la izquierda

otra cosa if(track_x(backb,0) < =(center_x-20)) {//if del tablero es correcta
track_update();
create_spin_CW(300-center_x);} Gire a la derecha de frenar como los enfoques del centro
}
STOP();

while(track_size(backb,0) < =(6000)) {//while el objetivo es de menos de 6000 píxeles de tamaño
track_update();
if(track_x(backb,0) < =(center_x-5)) {//if el objetivo quedo
track_update();
create_drive_direct (lento, rápido); //turn izquierda
Sleep(REST);}

if(track_x(backb,0) otro > =(center_x+5)) {//if el destino es justo
track_update();
create_drive_direct(Fast,Slow); / / girar a la derecha
Sleep(REST);}

if(track_x(backb,0) otra cosa <(center+5) & & track_x(backb,0) >(center_x-5)) {/ / si el objetivo se centra
track_update();
create_drive_straight (rápida), //go recta
Sleep(REST);}
}
STOP();
create_drive_straight(Fast); / / obtener un poco más cerca
Sleep(1.0);
STOP();
Sleep(1.0);
create_spin_CW (speeda); derecho de //spin
sueño (inversa); //sleep tiempo que suficiente para un 180 vuelta
STOP();
hacia abajo (); //put cámara hasta tablero de pista
Sleep(1.0);
track_set_minarea (200); //use un tamaño más pequeño de min, ya que somos acentuados en él y va a estar más cerca de

while(track_y(backb,0) > =(center_y-140)) {//while el objetivo es menor que la coordenada y
track_update();
if(track_x(backb,0) < =(center_x-5)) {//if el objetivo quedo
track_update();
back_right (); //turn izquierda
Sleep(REST);}

if(track_x(backb,0) otro > =(center_x+5)) {//if el destino es justo
track_update();
back_left(); / / girar a la derecha
Sleep(REST);}

if(track_x(backb,0) otra cosa <(center+5) & & track_x(backb,0) >(center_x-5)) {/ / si el objetivo se centra
track_update();
espalda (); //go recta
Sleep(REST);}

}
STOP();
BEEP();
tiro (); //shoot
Sleep(1.0);
have_ball = 0; //reminder I lanzó la bola y no lo tiene
}
start_b (); //back para seguimiento de la bola
sueño (1.0); //don't hacer nada hasta que este proceso muera
}

void cconnect() {}
create_connect();
create_full (); //for control completo de sensores de borde
create_power_led(0,255);} led verde de alimentación

{} void disconnect()
STOP (); //stop en movimiento
create_disconnect();}

void back_away() {}
Back();
Sleep(Clear);
STOP();}

void rotate_l() {}
create_spin_CCW(speeda);
Sleep(Time);
STOP();}

void rotate_r() {}
create_spin_CW(speeda);
Sleep(Time);
STOP();}

void stop() {}
create_drive(0,straight);}

{} void back()
create_drive(back_s,straight);}

{} void ready()
set_servo_position (brazo, a_down);}

{} void check()
set_servo_position (cam, track_c);}

void far() {}
set_servo_position (cam, track_f);}

void ledge() {}
set_servo_position (brazo, cogido);}

{} void throw()
int a;
para (a = 50; a > = 30;-= 1) {//get listo
set_servo_position(ARM, a);}
set_servo_position (brazo, disparar);}

void grab() {}
int a;
para (a = 0; a < = espera; una += 1) {//raise el brazo suavemente
set_servo_position(ARM, a) ;}}

{} void down()
set_servo_position (cam, track_d);}

find() vacío {}
set_servo_position (cam, track_find);}

void start_a() {}
Pida = start_process(avoid());}

void start_b() {}
pidb = start_process(track_ball());}

void start_c() {}
PIDC = start_process(find_basket());}

void kill(int pid) {}
CREATE_BUSY; //wait para corriente crear proceso, terminar y tener prioridad
kill_process(PID);
CREATE_FREE; //i'm hecho
STOP();}

void avoid_left() {}
Kill (pidb); //stop todo lo demás
Kill(PIDC);
cornisa (); //pick a garra para no quedar atrapado en la tabla
back_away (); //back a
rotate_l (); //rotate del obstáculo
listo (); //put la garra hacia abajo
if(have_ball) {//if tengo la bola
start_c();} iniciar seguimiento objetivo
if(!have_ball) else {//if no tengo la bola
start_b();} iniciar el seguimiento de la bola
}

void avoid_right() {}
Kill(pidb);
Kill(PIDC);
ledge();
back_away();
rotate_r();
Ready();
{if(have_ball)}
start_c();}
else {} if(!have_ball)
start_b();}
}

void back_left() {}
create_drive_direct(back_f,back_sl);}

void back_right() {}
create_drive_direct(back_sl,back_f);}

Artículos Relacionados

K-9 2.0. Perro Robot controlada y Autónoma de WiFi.

K-9 2.0. Perro Robot controlada y Autónoma de WiFi.

NOTA:En el paso 22, he publicado una actualización, explicando algunos recientes cambios y mejoras que he hecho, principalmente al sistema eléctrico de K-9 y sensor de matriz que puede encontrar útiles.CaracterísticasAcrílico diseño y resistente made
Miniquad autónoma (software)

Miniquad autónoma (software)

Ahora que han convertido su miniquad para ejecutar del Ardupilot mini siguiendo mi anterior instructivo, es el momento de configurar el software. En realidad, incluso si han construido un Ardupilot o Pixhawk base multicopter completamente separada de
¿R/C autónoma Tonka camiones con seguimiento de cabeza de FPV (Tonka Cumbre construir)

¿R/C autónoma Tonka camiones con seguimiento de cabeza de FPV (Tonka Cumbre construir)

recuerda en el día, jugando con su gran camión Tonka, correr a través de todo, sentir que fue un impresionante camión que podría ir a cualquier parte? O ¿vives en un área urbana relativamente y le encantaría ir cubriendo pero no puede porque es demas
Loro autónoma AR Drone 2.0 vuelo

Loro autónoma AR Drone 2.0 vuelo

Este instructivo le dará una forma muy sencilla y rápida (< 15 minutos) para tener un loro de AR Drone 2.0 volar autónomamente con código escrito por ti! La mejor parte de este proyecto es sólo requiere el drone y una laptop (mac o windows). Sin modi
Autónoma / voz controlada - 3D exploración plataforma de impresión 3D

Autónoma / voz controlada - 3D exploración plataforma de impresión 3D

La idea detrás de la voz controlada / autónoma plataforma exploración 3D permitir una digitalización captura 3D para trabajar tan suave como sea posible con el mínimo esfuerzo para la persona como realiza una exploración como para la persona cómo est
Swarmscapers: Robots de impresión 3D móvil autónoma

Swarmscapers: Robots de impresión 3D móvil autónoma

Swarmscapers es un mes 2 proyecto de larga investigación realizada en el estudio de Máquinas de arquitectura creativa , impartido por Jason Kelly Johnson y Michael Shiloh en el California College of the Arts en el Laboratorio de Arte Digital. Es una
Tanque de Arduino autónoma (A.A.T)

Tanque de Arduino autónoma (A.A.T)

Hola a todos, este es mi primer robot. Soy estudiante de primer año 15 año de edad. He estado interesado en robots desde el 6to grado y estado tratando de construir uno desde entonces. He decidido llamarlo A.A.T porque es un tanque de arduino autónom
Autónoma centinela Paintball

Autónoma centinela Paintball

hacer tu propio, personalizado centinela autónomo.Un subcampeón ganador y finalista del concurso de microcontrolador.Este instructable es obsoleto. Para la versión más reciente del tutorial, consulte el sitio web . ¡ Saludos!Este centinela arma autón
Autónoma estación meteorológica con ESP8266

Autónoma estación meteorológica con ESP8266

Hola amigosHoy les vamos a mostrar como realizar una pequeña estación meteorológica con nuestro ESP8266 NodeMCU, nuestra estación va a reportar temperatura, humedad y punto de rocío a la comunidad global de wunderground con esto contribuiremos a gene
Hacer un barco autónomo con una Raspberry Pi (WiP)

Hacer un barco autónomo con una Raspberry Pi (WiP)

la ola de entusiasmo por el Raspberry Pi ha llevado a muchas personas se preguntan en las posibilidades, y maravillarse con la simplicidad. La tarjeta de crédito tamaño SBC es perfecto para casi cualquier cosa. Tal vez incluso para cruzar el océano A
PROTECTOR de la tierra: Clasificadora de Material autónoma

PROTECTOR de la tierra: Clasificadora de Material autónoma

Arduino este proyecto era parte de un concurso de la Asociación de ingenieros mecánicos (ASME) para crear un clasificador Material autónoma. El clasificador fue ordenar cuatro botellas de vidrio, cuatro botellas de plástico, cuatro latas y cuatro lat
3D impreso Sumobot [autónoma RC, Multiplayer Bluetooth]

3D impreso Sumobot [autónoma RC, Multiplayer Bluetooth]

Finalmente la impresión 3D ya está disponible en nuestro país ahora tiempo para hacer buen uso de ello...Parte autónoma voz controla funciones [MODE]Hoy he actualizado este instructable para tener funciones autónomas en el mismo camino de voz funcion
Marte - Rover múltiples funciones autónoma (FPV)

Marte - Rover múltiples funciones autónoma (FPV)

Arduino es un microcontrolador muy versátil, y he visto muchas aplicaciones diferentes. Pero quería ver cuánto podría hacer con uno solito. Tenía una idea muy básica de cómo utilizar arduino cuando comencé este proyecto. Empecé los fundamentos y cons
Autónoma de Arduino de coches con Sensor de proximidad infrarrojo

Autónoma de Arduino de coches con Sensor de proximidad infrarrojo

Este Instructable muestra cómo modificar un coche RC preloved para que puede ser controlado por un Arduino. Entonces el Instructable le mostrará cómo hacer el RC funciona que un código simple figura 8 desde allí el Instructable le mostrará cómo agreg