Cuprins:

Cum să faci un robot de baschet autonom folosind un IRobot Creați ca bază: 7 pași (cu imagini)
Cum să faci un robot de baschet autonom folosind un IRobot Creați ca bază: 7 pași (cu imagini)

Video: Cum să faci un robot de baschet autonom folosind un IRobot Creați ca bază: 7 pași (cu imagini)

Video: Cum să faci un robot de baschet autonom folosind un IRobot Creați ca bază: 7 pași (cu imagini)
Video: Au Uitat Să Oprească Camera De FILMAT! Momente Incredibile Filmate În LIVE 2024, Iulie
Anonim
Cum să faci un robot de baschet autonom folosind un IRobot Creare ca bază
Cum să faci un robot de baschet autonom folosind un IRobot Creare ca bază

Aceasta este intrarea mea pentru provocarea iRobot Create. Cea mai grea parte a întregului proces pentru mine a fost să decid ce va face robotul. Am vrut să demonstrez caracteristicile grozave ale Create-ului, adăugând în același timp un anumit stil robo. Toate ideile mele păreau fie să se încadreze în categoria plictisitoare, dar utile, fie reci și impracticabile. În cele din urmă, a câștigat mișto și nepractic și s-a născut robotul de baschet. După câteva gânduri, mi-am dat seama că ar putea fi practic. Să presupunem că folosiți hârtie portocalie și că toate coșurile de gunoi au panouri verzi …

Pasul 1: Piese Aquire

Datorită limitei de timp a concursului, majoritatea pieselor pe care le-am folosit erau „de pe raft”. Piese de robot "stoc" folosite: Creați (x1) - de la iRobot www.irobot.comXBC V.3.0 (x1) - de la Botball www.botball.orgCreate-Roomba cablu (x1) - de la Botball www.botball.orgServo (x2) - de la Botball www.botball.org Telemetru Sharp (x1) - de la Botball www.botball.org Cărămizi LEGO asortate - de la LEGO www.lego.com 6-32 șuruburi pentru mașini (x4) - de la McMaster www.mcmaster.com Piese folosite pentru robot "create": foaie de PVC extrudată cu grosime de 3/8 "- lucrurile astea sunt minunate, dar nu-mi amintesc de unde am luat-o, dar este exact așa. https://www.lynxmotion.com / Category.aspx? CategoryID = 62 Alte părți: minge portocalie "POOF" - de la WalMart Baschet care arată coș de gunoi - de la LowesGreen "panou" - PVC suplimentar vopsit verde aprins

Pasul 2: Creați partea unică

Creați partea unică
Creați partea unică

Singura parte pe care am avut-o de fabricat a fost o placă care a fost fixată la Creați și a oferit spațiu LEGO. Distanța dintre găurile de cărămidă LEGO este de 8 mm, dar am făcut o distanță dublă pentru a economisi timp. PVC-ul extrudat este o briză pentru a lucra. Poate fi tăiat cu un cuțit utilitar, dar este rigid și puternic. Ridic deseori robotul de această placă și încă nu am avut o problemă.

Pasul 1: Tăiați foaia la 3,5 "x 9,5", puteți tăia aceasta cu un cuțit utilitar. Pasul 2: găuriți găurile pentru șuruburile de creare. Șuruburile de creare fac o cutie de 2 și 5/8 "cu 8 și 5/8". Pasul 3: Forează găurile distanțate din cărămidă LEGO. Folosiți un burghiu de 3/16 "și am distanțat găurile de 16 mm. Sfat: Am așezat foaia într-un program CAD, am imprimat-o la dimensiune completă și am lipit-o pe foaie. Apoi am folosit acest lucru ca ghid pentru tăiere și foraj.

Pasul 3: Asamblarea robotului

Asamblarea robotului
Asamblarea robotului
Asamblarea robotului
Asamblarea robotului
Asamblarea robotului
Asamblarea robotului

Îmi place să construiesc lucruri cât mai simplu posibil, așa că atunci când sar de pe masă nu trebuie să reconstruiești la fel de mult!

1. Înșurubați placa nou-nouțată în partea de sus a Crearii 2. Construiți un braț pentru a apuca mingea 3. Construiți un braț pentru a ține camera 4. Construiți un suport pentru telemetru 5. Montați XBC și conectați toate cablurile

Pasul 4: Programarea robotului

Am decis să folosesc XBC ca controler, în principal datorită urmăririi culorilor. Deoarece am decis să folosesc XBC ca creierul operației, mi-am programat robotul în Interactive C sau așa cum îl numesc IC. IC este gratuit și poate fi descărcat de pe www.botball.org. IC este foarte asemănător cu C ++, dar are mai multe biblioteci încorporate. După cum se dovedește, David Miller de la Universitatea din Oklahoma a scris o bibliotecă pentru Create, care poate fi descărcată de pe pagina sa de la https://i-borg.engr.ou.edu/~dmiller/create/. Cu aceste resurse și manualele pentru crearea am fost gata să programez. Dar următoarea mare provocare a fost ce am vrut să facă? Îmi doream un robot care să meargă să ridice bile portocalii și să le înscrie într-un coș. Scopul meu a sunat simplu și probabil că ar fi putut fi simplu, dar cu cât am intrat mai mult în ceea ce ar putea face Creați, cu atât am vrut mai mult. Lista mea finală arăta astfel: 1. Găsiți mingea portocalie2. Ridică mingea portocalie3. Localizați coșul 4. Pune mingea în coș În timp ce1. Evitarea obiectelor2. A nu cădea de pe nimic (ca o masă) 3. Detectarea încărcării bateriei și andocarea cu baza de bază atunci când este lowOh și toate acestea sunt complet autonome, ceea ce înseamnă că este preprogramat.

Pasul 5: Cod

Poate fi dezordonat, dar funcționează. # Folosiți "createlib.ic" #use "xbccamlib.ic" #define cam 0 // port servo camera # define arm 3 // arm servo port # define et (analog (0)) // et port / * Cablul de creație trebuie, de asemenea, să fie conectat. Mufa de alimentare, mufa cu 3 puncte în portul 8 și cea etichetată UX în JP 28 (lângă portul USB) cu U către cameră * / #define c_down 5 // camera servo down # define a_down 17 // arm servo down # define hold 50 // servo hold ball # define caught 27 // arm servo position to keep from getting caught on table # define shoot 150 // servo aruncă mingea # define track_c 25 // camera servo track close position # define track_f 45 // camera servo track poziție îndepărtată # define center 120 // center of camera vision # define inrange 30 // track_y coordinate when ball is in claw # define ball 0 // canalul mingii portocalii # define ball_x (track_x (mingea, 0)) // x coordonata mingii # define mingea_y (track_y (mingea, 0)) // y coordonata mingii # define lent 100 // viteza lent motor # define fast 175 // viteza motorului rapid # define clear 0.2 // s leep to back away from obstacles # define time 0.5 //1.0 is a 90 degree turn right # define rest 0,05 // time to sleep while tracking blobs # define speeda 175 // speed of avoid turn # define back_s -200 // speed to înapoi la obiectul defect # definiți drept 32767 // conduceți în linie dreaptă # definiți backb 2 // canalul culorii principale a panoului # definiți pătratul 1 // canalul culorii accentului panoului # definiți track_d 250 // poziția camerei pentru urmărirea obiectivului # define track_find 70 // poziția camerei pentru urmărire lungă # define reverse 2.25 // sleep time for a 180 # define back_f -150 // back fast speed # define back_sl -125 // back slow speed # define center_x 178 // true x center of cam # define center_y 146 // true y center of camint pida; // avoid processint pidb; // track processint pidc; // score processint have_ball = 0; // spune ce funcție suntem 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 ridicat sau r buton umăr kill (pida); ucide (pidb); ucide (pidc); disable_servos (); Deconectat(); pauză;} create_battery_charge (); display_clear (); printf ("charge =% l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); ucide (pidb); ucide (pidc); arunca(); have_ball = 0; create_demo (1); while (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 (); înapoi(); somn (2.0); începe o(); start_b ();}}} void avoid () {while (1) {// repet pentru totdeauna create_sensor_update (); // actualizați toate valorile senzorilor // create_drive (speeda, straight); if (gc_lbump == 1) {// left bump avoid_right ();} // virează la dreapta pentru a evita else if (gc_rbump == 1) {// right bump evite_left ();} // virează la stânga pentru a evita else if (gc_lfcliff == 1) {// stâncă stâncă față evite_right ();} else if (gc_rfcliff == 1) {// stâncă frontală dreaptă evite_left ();} else if (gc_lcliff == 1) {// stâncă stângă evite_right ();} else if (gc_rcliff == 1) {// stâncă dreaptă evite_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// repetați până obțineți mingea track_update (); far (); // setează camera gata (); // setează brațul în timp ce (et <255) {// până când valoarea maximă se întâmplă când mingea este prinsă track_update (); // actualizează imaginea camerei dacă (ball_x <= (centru-5)) {// dacă mingea este lăsată track_update (); create_drive_direct (lent, rapid); // virează la stânga somn (odihnă);} else if (ball_x> = (centru + 5)) {// dacă mingea este corect track_update (); create_drive_direct (rapid, lent); // virează la dreapta somn (odihnă);} else if (ball_x (centru-5)) {// dacă mingea este centrată track_update (); create_drive_straight (rapid); // merge direct la somn (odihnă);}} grab (); // apuca mingea beep (); // face zgomot stop (); // oprește conducerea have_ball = 1; // notează că Am mingea} start_c (); // găsesc coșul somn (1.0); // dorm astfel încât să nu fac nimic când sunt ucis} void find_basket () {ucide (pidb); // ucide procesul de urmărire a mingii find (); // pune camera în sus track_set_minarea (1000); // tabloul este mare, așa căută doar blob-uri mari în timp ce (have_ball) {// cât timp am mingea track_update (); while (track_x (backb, 0) = (center_x + 20)) {// while not centered track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// if the backboard is left track_update (); create_spin_CCW (100);} // virează la stânga else if (track_x (backb, 0) <= (center_x-20)) {// if the backboard is right track_update (); create_spin_CW (300-center_x);} // virați la dreapta încetinind pe măsură ce centrul se apropie} stop (); while (track_size (backb, 0) <= (6000)) {// în timp ce ținta are o dimensiune mai mică de 6000 pixeli track_update (); if (track_x (backb, 0) <= (center_x-5)) {// if target is left track_update (); create_drive_direct (lent, rapid); // virează la stânga sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// if target is right track_update (); create_drive_direct (rapid, lent); // virează la dreapta sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// dacă ținta este centrată track_update (); create_drive_straight (rapid); // merge direct la somn (odihnă);}} stop (); // create_drive_straight (rapid); // apropiați-vă puțin //sleep(1.0); //Stop(); somn (1,0); create_spin_CW (speeda); // spin dreapta sleep (invers); // sleep suficient timp pentru o oprire de 180 de ture (); jos (); // pune camera în jos pentru a urmări somnul din spate (1.0); track_set_minarea (200); // utilizați o dimensiune min mai mică, deoarece suntem îndreptați spre ea și ne vom apropia în timp ce (track_y (backb, 0)> = (center_y-140)) {// în timp ce ținta este mai mică decât y coordona track_update (); if (track_x (backb, 0) <= (center_x-5)) {// if target is left track_update (); back_right (); // virează la stânga sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// if target is right track_update (); back_left (); // virare dreapta sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// if target is centered track_update (); back (); // go straight sleep (rest);}} stop (); beep (); throw (); // shoot sleep (1.0); have_ball = 0; // memento Am aruncat mingea și nu o am} start_b (); // înapoi la mingea de urmărire a mingii (1.0); // nu face nimic până când acest proces nu moare} void cconnect () {create_connect (); create_full (); // pentru controlul complet al senzorilor de margine create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // stop moving create_disconnect ();} void back_away () {back (); somn (senin); stop ();} void rotate_l () {create_spin_CCW (speeda); ora de dormit); stop ();} void rotate_r () {create_spin_CW (speeda); ora de dormit); 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ț, prins);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// get ready set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a + = 1) {// ridicați ușor brațul 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 (avoid ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // așteptați finalizarea procesului actual de creare și luați prioritate kill_process (pid); CREATE_FREE; // am terminat stop ();} void avoid_left () {kill (pidb); // stop orice altceva kill (pidc); ledge (); // ridica gheara astfel încât să nu fie prinsă pe masă back_away (); // back away rotate_l (); // rotit departe de obstacol gata (); // pune gheara înapoi dacă (have_ball) {// dacă am mingea start_c ();} // începe urmărirea golului altfel dacă (! have_ball) {// dacă nu am mingea start_b ();} // începe urmărirea mingii} void avoid_right () {ucide (pidb); ucide (pidc); bordură(); indeparteaza-te(); rotate_r (); gata(); 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);}

Pasul 6: A meritat?

Costurile au fost: Creați + baterie + doc = kit de pornire 260 $ XBC (xbc, camă, cărămizi LEGO, senzori) = 579 USD PVC + vopsea + șuruburi = aproximativ 20 USD Cost total = 859 USD Aveam deja kitul de pornire XBC de la Botball, deci costul Pentru mine a fost costul Create. Cred că a meritat, iar cea mai bună parte este că toate părțile pe care le-am folosit sunt reutilizabile, dacă aș putea să mă despart de acest bot. Acest videoclip arată evitarea sub rutinei, pe o masă. Acest videoclip arată robotul marcând 5 mingi portocalii într-un gol. Am asistat doar la accelerarea procesului, ar fi găsit mingea 5 în cele din urmă pe cont propriu.

Pasul 7: Concluzie

Rezultatul final este un robot care poate ridica și înscrie mingi portocalii într-un gol, singur.

Mi-a plăcut să lucrez la acest proiect. Cu cât am lucrat mai mult la acest robot, cu atât am devenit mai atașat de el. Acum îi vorbesc de parcă ar fi un animal de companie. Sper că acest lucru te-a ajutat la următorul tău proiect. Sunt mulți oameni cărora trebuie să le mulțumesc, dar sunt prea mulți. Așa cum a declarat Bernard de Chartres atât de elegant: „suntem ca niște pitici pe umerii uriașilor, astfel încât să putem vedea mai mult decât ei și lucruri la o distanță mai mare, nu în virtutea vreunei clarități la vedere din partea noastră sau a oricărui fizic distincție, ci pentru că suntem duși sus și ridicați de dimensiunea lor uriașă."

Recomandat: