Taula de continguts:

Com fer un robot de bàsquet autònom amb un IRobot per crear com a base: 7 passos (amb imatges)
Com fer un robot de bàsquet autònom amb un IRobot per crear com a base: 7 passos (amb imatges)

Vídeo: Com fer un robot de bàsquet autònom amb un IRobot per crear com a base: 7 passos (amb imatges)

Vídeo: Com fer un robot de bàsquet autònom amb un IRobot per crear com a base: 7 passos (amb imatges)
Vídeo: Humans Need Not Apply 2024, Desembre
Anonim
Com fer un robot de bàsquet autònom amb un IRobot Crea com a base
Com fer un robot de bàsquet autònom amb un IRobot Crea com a base

Aquesta és la meva entrada per al desafiament iRobot Create. El més difícil de tot aquest procés per a mi va ser decidir què faria el robot. Volia demostrar les funcions interessants del Create, alhora que afegia un toc de robo. Totes les meves idees semblaven caure en la categoria d’avorrides, però útils, o fresques i poc pràctiques. Al final va guanyar-se fresc i poc pràctic i va néixer el robot que jugava a bàsquet. Després d'algunes reflexions, em vaig adonar que podia ser pràctic. Suposem que utilitzeu paper taronja i que totes les papereres tenen panells verds …

Pas 1: Aquire Parts

A causa del límit de temps del concurs, la majoria de les peces que vaig fer servir eren "fora del prestatge". "Robot" Parts utilitzades: crear (x1) - d'iRobot www.irobot.comXBC V.3.0 (x1) - de Botball www.botball.orgCreate-Roomba cable (x1) - de Botball www.botball.orgServo (x2) - de Botball www.botball.org Telemetre Sharp (x1) - de Botball www.botball.org Maons LEGO variats - de LEGO www.lego.com 6-32 cargols de màquina (x4) - de McMaster www.mcmaster.com "Creat" Parts del robot usades: làmina de PVC extruït de 3/8 "de gruix - aquestes coses són increïbles, però no recordo d'on les he extret, però és com aquestes coses https://www.lynxmotion.com / Category.aspx? CategoryID = 62 Altres parts: bola taronja "POOF" - de WalMart Bàsquet que mira paperera - del "tauler" LowesGreen - PVC extra pintat de color verd brillant

Pas 2: creeu la part única

Creeu la part única
Creeu la part única

L'única part que vaig haver de fabricar era una placa que es fixava al Crea i oferia espaiat LEGO. L'espaiat dels forats de maó LEGO està separat per 8 mm, però he fet una doble separació per estalviar temps. El PVC extruït és molt fàcil de treballar. Es pot tallar amb un ganivet utilitari, però és rígid i resistent. Sovint agafo el robot per aquesta placa i encara no he tingut cap problema.

Pas 1: talleu el full a 3,5 "x 9,5", podeu tallar-lo amb un ganivet utilitari. Pas 2: Traieu els forats dels cargols de creació. Els cargols de creació formen una caixa de 2 i 5/8 "per 8 i 5/8". Pas 3: foradeu els forats separats de maó de LEGO. Utilitzeu una broca de 3/16 "i he separat els forats de 16 mm. Consell: Vaig disposar el full en un programa CAD, el vaig imprimir a mida completa i el vaig gravar al full. Després el vaig fer servir com a guia per tallar i perforació.

Pas 3: Muntatge del robot

Muntatge del robot
Muntatge del robot
Muntatge del robot
Muntatge del robot
Muntatge del robot
Muntatge del robot

M’agrada construir coses de la manera més senzilla possible, d’aquesta manera, quan surten de la taula, no s’ha de reconstruir tant.

1. Cargoleu la placa recentment acabada a la part superior de la Creació 2. Construïu un braç per agafar la pilota 3. Construïu un braç per subjectar la càmera 4. Construïu un suport per al telemetre 5. Munteu el XBC i connecteu tots els cables

Pas 4: Programació del robot

Vaig decidir utilitzar l'XBC com a controlador principalment pel seu seguiment de colors integrat. Com que vaig decidir amb l'XBC com a cervell de l'operació vaig programar el meu robot en Interactive C, o com ho dic IC. IC és d’ús gratuït i es pot descarregar a www.botball.org. IC és molt similar a C ++, però té diverses biblioteques integrades. Resulta que David Miller de la Universitat d’Oklahoma ha escrit una biblioteca per al Create que es pot descarregar des de la seva pàgina a https://i-borg.engr.ou.edu/~dmiller/create/. Amb aquests recursos i els manuals per a la creació, estava preparat per programar. Però el següent gran repte era què volia que fes? Volia un robot que pogués agafar boles taronges i marcar-les en una cistella. El meu objectiu semblava senzill i, probablement, podria haver estat senzill, però com més em dedicava a què podia fer el Create, més volia que fes. La meva llista final tenia aquest aspecte: 1. Cerca bola taronja2. Recollir bola taronja3. Localitza cistella4. Posa la pilota a la cistella Mentre que1. Evitar objectes2. No caure de res (com una taula) 3. Detectar la càrrega de la bateria i acoblar-lo amb la base de casa quan està baix d’Oh, i tot això és completament autònom, és a dir, que està tot preprogramat.

Pas 5: Codi

Pot ser desordenat, però funciona. # Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // port servo camera # define arm 3 // arm servo port # define et (analog (0)) // et port / * El cable de creació també s'ha d'endollar. El connector d'alimentació, el connector de tres puntes al port 8 i el marcat com a UX al JP 28 (al costat del port USB) amb la U cap a la càmera * / #define c_down 5 // servo camera down # define a_down 17 // arm servo down # define hold 50 // servo hold ball # define caught 27 // arm servo position to keep at caught on table # define shoot 150 // servo llançar bola # define track_c 25 // càmera servo track posició propera # define track_f 45 // càmera servo track posició extrema # define centre 120 // centre de la visió de la càmera # define inrange 30 // track_y coordinate when ball is in claw # define ball 0 // canal de bola taronja # defineix ball_x (track_x (bola, 0)) // x coordenada de bola # define bola_y (track_y (bola, 0)) // y coordenada de bola # defineix lent 100 // velocitat de lent motor # define fast 175 // speed of fast motor # define clear 0,2 // s lleuger per retrocedir dels obstacles # definir el temps 0,5 //1,0 és un gir a la dreta de 90 graus # definir el descans 0,05 // temps per dormir mentre es mantenen les bombolles # definir la velocitat 175 // la velocitat d’evitar el gir # definir el back_s -200 // la velocitat a enrere de l'objecte topat # defineix 32767 recte // condueix en línia recta # defineix backb 2 // canal del color principal del tauler # defineix quadrat 1 // canal del color de l'accent del tauler # defineix track_d 250 // posició de la càmera per a l'objectiu de seguiment # defineix track_find 70 // posició de la càmera per a un seguiment llarg # define invers 2.25 // temps de repòs per un 180 # defineix back_f -150 // torna velocitat ràpida # defineix back_sl -125 // torna lent velocitat # defineix centre_x 178 // true x centre de la càmera # define center_y 146 // true y centre of camint pida; // evite processint pidb; // track processint pidc; // score processint have_ball = 0; // indica a quina funció estem invoid main () {long ch; enable_servos (); // enable servos init_camera (); // start camera cconnect (); // connect to create with full control start_a (); // start avoid function start_b (); // start ball_tracking function while (1) {if (r_button () || gc_ldrop || gc_rdrop) {// if recollit o r botó d'espatlla kill (pida); matar (pidb); matar (pidc); disable_servos (); desconnectar (); trencar;} create_battery_charge (); display_clear (); printf ("charge =% l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); matar (pidb); matar (pidc); llançar(); have_ball = 0; create_demo (1); mentre que (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("charge =% l / n", gc_battery_charge); sleep (1.0);} cconnect (); esquena(); dormir (2,0); start_a (); start_b ();}}} void avoid () {while (1) {// repetir per sempre create_sensor_update (); // actualitzar tots els valors del sensor // create_drive (speeda, straight); if (gc_lbump == 1) {// left bump evite_right ();} // gira a la dreta per evitar else if (gc_rbump == 1) {// right bump evite_left ();} // gira a l'esquerra per evitar else if (gc_lfcliff == 1) {// penya-segat esquerre esquerre evite_right ();} else if (gc_rfcliff == 1) {// penya-segat frontal dret evite_left ();} else if (gc_lcliff == 1) {// penya-segat left_right ();} else if (gc_rcliff == 1) {// penya-segat dret evite_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// repeteix fins a obtenir la pilota track_update (); far (); // prepara la càmera (); // posa el braç mentre (et <255) {// fins que passa el valor màxim quan es captura la pilota track_update (); // actualitza la imatge de la càmera si (ball_x <= (centre-5)) {// si la pilota es deixa track_update (); create_drive_direct (lent, ràpid); // gireu a l'esquerra (repòs);} else if (ball_x> = (centre + 5)) {// si la pilota és correcta track_update (); create_drive_direct (ràpid, lent); // girar a la dreta per dormir (descansar);} else if (ball_x (centre-5)) {// si la pilota està centrada track_update (); create_drive_straight (fast); // dormir directament (descansar);}} agafar (); // agafar bip de bola (); // fer soroll stop (); // deixar de conduir have_ball = 1; // anotar que Tinc bola} start_c (); // trobo la cistella dorm (1.0); // dorm perquè no facin res quan em maten} void find_basket () {kill (pidb); // mata el procés de seguiment de la bola find (); // posa la càmera track_set_minarea (1000); // el tauler és gran, així que només busqueu taques grans mentre que (have_ball) {// mentre tinc la pilota track_update (); while (track_x (backb, 0) = (center_x + 20)) {// mentre no està centrat track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// if the backboard left left track_update (); create_spin_CCW (100);} // gireu a l’esquerra else if (track_x (backb, 0) <= (center_x-20)) {// if the backboard is right track_update (); create_spin_CW (300-center_x);} // gireu a la dreta alentir-vos a mesura que s'apropa el centre} stop (); while (track_size (backb, 0) <= (6000)) {// mentre l'objectiu té menys de 6000 píxels de mida track_update (); if (track_x (backb, 0) <= (center_x-5)) {// if the target is left track_update (); create_drive_direct (lent, ràpid); // gireu a l'esquerra (repòs);} else if (track_x (backb, 0)> = (center_x + 5)) {// si l'objectiu és correcte track_update (); create_drive_direct (ràpid, lent); // gireu a la dreta (repòs);} else if (track_x (backb, 0) (center_x-5)) {// si l'objectiu està centrat track_update (); create_drive_straight (fast); // dormir directament (descansar);}} stop (); // create_drive_straight (fast); // apropar-se una mica //sleep(1.0); //Atura(); dormir (1,0); create_spin_CW (speeda); // gireu a dormir a la dreta (inversa); // dormiu prou per fer una parada de 180 girs (); down (); // posa la càmera cap avall per rastrejar el son del tauler (1.0); track_set_minarea (200); // utilitzeu una mida mínima més petita, ja que hi anem apuntant i ens aproparem mentre (track_y (backb, 0)> = (center_y-140)) {// mentre l'objectiu és inferior al y coordinar track_update (); if (track_x (backb, 0) <= (center_x-5)) {// if the target is left track_update (); back_right (); // gireu a l'esquerra sleep (descans);} else if (track_x (backb, 0)> = (center_x + 5)) {// if the target is right track_update (); back_left (); // gireu a la dreta per dormir (descans);} else if (track_x (backb, 0) (center_x-5)) {// si l'objectiu està centrat track_update (); back (); // anar directament a dormir (descansar);}} stop (); beep (); throw (); // disparar son (1.0); have_ball = 0; // recordatori Vaig llançar la pilota i no la tinc} start_b (); // torna a dormir el seguiment de la pilota (1.0); // no feu res fins que aquest procés no mori} void cconnect () {create_connect (); create_full (); // per controlar completament els sensors de cornisa create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // stop moving create_disconnect ();} void back_away () {back (); dormir (clar); stop ();} void rotate_l () {create_spin_CCW (speeda); dormir (temps); stop ();} void rotate_r () {create_spin_CW (speeda); dormir (temps); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void ready () {set_servo_position (arm, a_down);} void check () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (braç, atrapat);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// prepara't set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a + = 1) {// aixecar el braç sense problemes set_servo_position (arm, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (evite ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // espereu que finalitzi el procés de creació actual i tingueu prioritat process_ kill_ (pid); CREATE_FREE; // he acabat stop ();} void avoid_left () {kill (pidb); // stop all else kill (pidc); ledge (); // recollir la urpa perquè no quedi atrapat a la taula back_away (); // enrere girar_l (); // girar fora de l'obstacle llest (); // tornar a posar la garra si (tenir_bola) } {matar (pidb); matar (pidc); cornisa (); retrocedir(); girar_r (); llest (); 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);}

Pas 6: valia la pena?

Els costos eren: Crear + bateria + doc = kit d’inici XBC de 260 $ (xbc, lleva, maons LEGO, sensors) = $ 579 PVC + pintura + cargols = aproximadament $ 20 Cost total = $ 859 Ja tenia el kit d’inici XBC de Botball, de manera que el cost per a mi va ser el cost del Create. Crec que valia la pena i la millor part és que totes les parts que he fet servir són reutilitzables, si pogués separar-me d’aquest robot. Aquest vídeo mostra la rutina d’evitar, sobre una taula. En aquest vídeo es mostra el robot marcant 5 pilotes taronja en una porteria. Només he ajudat a accelerar el procés, hauria trobat la bola 5 per si sola.

Pas 7: Conclusió

El resultat final és un robot que pot recollir i anotar pilotes taronja en un gol tot sol.

Em va encantar treballar en aquest projecte. Com més treballava en aquest robot, més m’hi enganxava. Ara hi parlo com si fos una mascota. Espero que això us hagi ajudat en el vostre proper projecte. Hi ha molta gent que he d’agrair, però n’hi ha massa. Com Bernat de Chartres va afirmar amb tanta elegància: "som com nanos a les espatlles dels gegants, de manera que podem veure més que ells i coses a una distància més gran, no en virtut de cap nitidesa a la vista per part nostra o distinció, sinó perquè ens porten alts i elevats per la seva mida gegant ".

Recomanat: