Tartalomjegyzék:

Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával Készítsen alapként: 7 lépés (képekkel)
Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával Készítsen alapként: 7 lépés (képekkel)

Videó: Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával Készítsen alapként: 7 lépés (képekkel)

Videó: Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával Készítsen alapként: 7 lépés (képekkel)
Videó: Lecke önálló feldolgozása 5+1 lépésben 2024, Július
Anonim
Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával
Hogyan készítsünk önálló kosárlabdázó robotot IRobot használatával

Ez a bejegyzésem az iRobot Create kihíváshoz. Az egész folyamat legnehezebb része számomra az volt, hogy eldöntöttem, mit fog tenni a robot. Bemutatni akartam a Create remek tulajdonságait, miközben robo hangulatot is adtam hozzá. Úgy tűnt, hogy minden ötletem az unalmas, de hasznos kategóriába tartozik, vagy hűvös és nem praktikus. Végül hűvös és nem praktikus nyert, és megszületett a kosárlabdázó robot. Némi gondolkodás után rájöttem, hogy ez praktikus lehet. Tegyük fel, hogy narancssárga papírt használ, és minden kukájában zöld hátlap van …

1. lépés: Aquire alkatrészek

A verseny időkorlátja miatt az általam használt alkatrészek többsége "lekerült a polcról". Használt "készlet" robotalkatrészek: Létrehozás (x1)-az iRobot webhelyéről www.irobot.comXBC V.3.0 (x1)-a Botball webhelyről www.botball.orgCreate-Roomba kábel (x1)-a Botballtól www.botball.orgServo (x2)-a Botball-tól www.botball.org Éles távolságmérő (x1)-a Botball-tól www.botball.org Válogatott LEGO kockák-a LEGO-tól www.lego.com 6-32 gépcsavar (x4)-a McMaster-től www.mcmaster.com "Létrehozott" robotalkatrészek: 3/8 "vastag extrudált PVC -lemez - ez a cucc fantasztikus, de nem emlékszem, honnan szereztem, de pont olyan, mint ez a cucc https://www.lynxmotion.com/Category.aspx? Kategória azonosító = 62 Egyéb alkatrészek: Narancssárga "POOF" labda - a WalMartból

2. lépés: Hozza létre az egyedi részt

Hozza létre az egyedi részt
Hozza létre az egyedi részt

Az egyetlen rész, amit le kellett gyártanom, egy lemez volt, amely a Létrehozáshoz csavarozott, és LEGO távolságot kínált. A LEGO tégla lyukak távolsága 8 mm, de időmegtakarítás érdekében kettős távolságot tettem. Az extrudált PVC -vel könnyű dolgozni. Használható késsel vágható, de merev és erős. Gyakran felveszem a robotot ennél a tányérnál, és még nem volt gondom.

1. lépés: Vágja le a lapot 3,5 "x 9,5" méretűre, ezt vághatja le egy késsel. 2. lépés: Fúrja ki a lyukakat a létrehozó csavarokhoz. A létrehozó csavarokból 2 és 5/8 "8 és 5/8" méretű doboz készül. 3. lépés: Fúrja ki a LEGO téglából elhelyezett lyukakat. Használjon 3/16 "-os fúrót, és a lyukakat 16 mm -re helyeztem el egymástól. Tipp: A lapot egy CAD programban fektettem le, kinyomtattam teljes méretben és ragasztottam a lapra. Ezt követően útmutatóként használtam a vágáshoz és fúrás.

3. lépés: A robot összeszerelése

A robot összeszerelése
A robot összeszerelése
A robot összeszerelése
A robot összeszerelése
A robot összeszerelése
A robot összeszerelése

Szeretem a lehető legegyszerűbben építeni a dolgokat, így amikor leugranak az asztalról, nem kell annyit újjáépíteni!

1. Csavarja fel az újonnan kialakított lemezt a Létrehozás tetejére. 2. Építsen egy kart a labda megragadásához. 3. Építsen egy kart a fényképezőgép megtartásához. 4. Készítsen tartóelemet a távolságmérőhöz.

4. lépés: A robot programozása

Úgy döntöttem, hogy az XBC -t vezérlőként használom, főleg a beépített színkövetés miatt. Mivel úgy döntöttem, hogy az XBC -vel a művelet agyaként programoztam a robotomat az Interaktív C -be, vagy ahogy IC -nek hívom. Az IC ingyenesen használható, és letölthető a www.botball.org webhelyről. Az IC nagyon hasonlít a C ++ -hoz, de több beépített könyvtárat tartalmaz. Mint kiderült, David Miller az Oklahomai Egyetemről egy könyvtárat írt a Create-hez, amely letölthető a https://i-borg.engr.ou.edu/~dmiller/create/ oldaláról. Ezekkel az erőforrásokkal és a létrehozáshoz szükséges kézikönyvekkel készen álltam a programozásra. De a következő nagy kihívás az volt, hogy mit akarok? Szerettem volna egy robotot, amely képes felvenni narancssárga golyókat, és kosárba dobni. Célom egyszerűnek tűnt, és valószínűleg egyszerű is lehetett volna, de minél jobban belefogtam abba, amit a Létrehozás képes, annál jobban akartam. A végső listám így nézett ki: 1. Keresse meg a narancssárga golyót2. Vegye fel a narancssárga golyót3. Keresse meg a kosarat4. Helyezze a labdát a kosárba A tárgyak elkerülése 2. Nem esik le semmiről (például egy asztalról) 3. Az akkumulátor töltöttségének észlelése és dokkolás az otthoni bázissal, ha alacsony, és mindez teljesen autonóm, vagyis előre be van programozva.

5. lépés: Kód

Lehet, hogy rendetlen, de működik.#Használja a "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kamera szervo port#definíció kar 3 // éles szervo port#define et (analóg (0)) // et port/*A létrehozó kábelt is be kell dugni. A tápcsatlakozó, a háromágú csatlakozó a 8 -as portba, az UX feliratú pedig a JP 28 -ba (az USB -port mellett) az U -val a kamera felé*/ #define c_down 5 // kamera szervo down#define a_down 17 // arm servo down#define hold 50 // servo hold labda#definiálja a fogott 27 // kar szervo helyzete, hogy ne kerüljön asztalra#define shoot 150 // szervo labda dobása#pálya_c meghatározása 25 // kamera szervo nyomvonal bezárása pozíció#pálya_f meghatározása 45 // kamera szervo nyomvonal távoli pozíció#középpont definiálása 120 // kamera látásközéppontja#meghatározás inrange 30 // pálya_y koordináta, amikor a labda karomban van#labda meghatározása 0 // narancssárga golyó csatornája#ball_x (track_x (labda, 0)) // x labda koordinátája#ball_y (track_y (labda, 0)) // golyó y koordinátája#lassú meghatározása 100 // lassú sebessége motor#gyors gyors meghatározása 175 // gyors motor fordulatszáma#definiál tiszta 0,2 // s ugrás az akadályok elől#idő meghatározása 0.5 //1.0 90 fokos jobbra kanyarodás#pihenés meghatározása 0.05 // alvási idő a blobok követése közben#speeda meghatározása 175 // elkerülés sebessége#definiálás vissza -s -200 // sebesség vissza az ütköző objektumtól#definiálni egyenesen 32767 // hajtani egyenesben#definiálni backb 2 // a hátlap fő színének csatornáját define track_find 70 // kamera pozíciója hosszú követéshez#define reverse 2.25 // sleep time for a 180#define back_f -150 // back fast speed#define back_sl -125 // back lassú sebesség#define center_x 178 // true x center of cam#definiálja center_y 146 // igaz y camint pida központja; // kerülje a processint pidb; // track processint pidc; // score processint have_ball = 0; // megmondja, hogy melyik függvény vagyunk számlázás main () {long ch; enable_servos (); // enable servos init_camera (); // start camera cconnect (); // connect to create with full control A start_a (); // start kerülje el a start_b () funkciót // indítsa el a ball_tracking függvényt, miközben (1) {if (r_button () || gc_ldrop || gc_rdrop) {// ha felvett vagy r vállgomb öl (pida); ölni (pidb); ölni (pidc); disable_servos (); szétkapcsolás (); break;} create_battery_charge (); display_clear (); printf ("töltés = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); ölni (pidb); ölni (pidc); dobás(); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("töltés = %l / n", gc_battery_charge); alvás (1.0);} cconnect (); vissza(); alvás (2,0); kezdj el egy(); start_b ();}}} void elkerül () {while (1) {// ismételje meg örökké create_sensor_update (); // frissítse az összes érzékelő értékét // create_drive (speeda, straight); if (gc_lbump == 1) {// bal ütés elkerülendő_jobb ();} // jobbra fordul, hogy elkerülje az egyéb dolgokat, ha (gc_rbump == 1) {// jobb ütközés elkerülendő_balra ();} // balra fordul, ha el akar kerülni gc_lfcliff == 1) {// bal első szikla elkerülendő_jobb ();} else if (gc_rfcliff == 1) {// jobb első szikla elkerülendő_bal ();} más if (gc_lcliff == 1) {// bal szikla elkerül_jobb ();} else if (gc_rcliff == 1) {// jobb szikla elkerülése_bal ();}}} void track_ball () {kill (pidc); while (! have_ball) {// ismételje meg, amíg nem kap labdát track_update (); far (); // készen áll a kamerára (); // beállítja a kart, miközben (et <255) {// amíg a maximális érték meg nem történik, amikor a labdát elkapják track_update (); // frissítse a kamera képét, ha (ball_x <= (center-5)) {// ha a labda balra maradt track_update (); create_drive_direct (lassú, gyors); // balra fordulás alvás (pihenés);} else if (ball_x> = (center+5)) {// ha a labda helyes track_update (); create_drive_direct (gyors, lassú); // jobbra fordulás alvás (pihenés);} else if (ball_x (center-5)) {// ha a labda középen track_update (); create_drive_straight (gyors); // egyenesen aludni (pihenni);}} grab (); // megragadni a labdahangot (); // zajcsillapítás (); // abbahagyni a vezetést have_ball = 1; // jegyezze meg, hogy Van labdám} start_c (); // keresse meg a kosár alvását (1.0); // aludjon úgy, hogy ne tegyek semmit, ha megölnek} void find_basket () {kill (pidb); // kill labda nyomkövetési folyamata find (); // tegye fel a kamerát track_set_minarea (1000); // a hátlap nagy, ezért csak nagy blobokat keressen, amíg (have_ball) {// amíg nálam van a track_update (); while (track_x (backb, 0) = (center_x+20)) {// miközben nincs középen track_update (); if (track_x (backb, 0)> = (center_x+20)) {// ha a palánk balra maradt track_update (); create_spin_CCW (100);} // forduljon balra különben if (track_x (backb, 0) <= (center_x-20)) {// ha a palánk helyes track_update (); create_spin_CW (300-center_x);} // forduljon jobbra lassítva a középpont közeledtével} stop (); while (track_size (backb, 0) <= (6000)) {// míg a cél kevesebb mint 6000 pixel méretű track_update (); if (track_x (backb, 0) <= (center_x-5)) {// ha a cél marad track_update (); create_drive_direct (lassú, gyors); // balra kapcsolás alvás (pihenés);} else if (track_x (backb, 0)> = (center_x+5)) {// ha a cél helyes track_update (); create_drive_direct (gyors, lassú); // jobbra fordulás alvás (pihenés);} else if (track_x (backb, 0) (center_x-5)) {// ha a cél középpontjában a track_update () áll; create_drive_straight (gyors); // egyenesen alvás (pihenés);}} stop (); // create_drive_straight (gyors); // egy kicsit közelebb // alvás (1.0); //álljon meg(); alvás (1,0); create_spin_CW (speeda); // forgasd a jobb alvást (hátramenet); // elég sokáig aludj egy 180 fordulatos megálláshoz (); le (); // tegye le a kamerát, hogy nyomon kövesse a hátsó alvó állapotot (1.0); track_set_minarea (200); // használjon kisebb miniméretet, mivel erre mutatunk, és közelebb kerülünk, miközben (track_y (backb, 0)> = (center_y-140)) {// miközben a cél kisebb, mint a y koordináta track_update (); if (track_x (backb, 0) <= (center_x-5)) {// ha a cél marad track_update (); back_right (); // balra fordul alvás (pihenés);} else if (track_x (backb, 0)> = (center_x+5)) {// ha a cél helyes track_update (); back_left (); // jobbra fordulás alvás (pihenés);} else if (track_x (backb, 0) (center_x-5)) {// ha a cél középpontjában track_update (); vissza (); // egyenesen aludni (pihenni);}} stop (); sípolás (); dob (); // lő alvás (1.0); have_ball = 0; // emlékeztető Dobtam labdát, és nincs nála} start_b (); // vissza a labdakövetési alváshoz (1.0); // ne tegyen semmit, amíg ez a folyamat meg nem hal.} void cconnect () {create_connect (); create_full (); // a párkányos érzékelők teljes vezérléséhez create_power_led (0, 255);} // zöld áramellátású ledvoid disconnect () {stop (); // stop move create create_disconnect ();} void back_away () {back (); alvás (tiszta); stop ();} void rotate_l () {create_spin_CCW (speeda); alvási idő); stop ();} void rotate_r () {create_spin_CW (speeda); alvási idő); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void ready () {set_servo_position (kar, a_down);} void check () {set_servo_position (cam, track_c);} void far () {set_servo_position (bütyök, track_f);} void párkány () {set_servo_position (kar, elkapva);} void dob () {int a; for (a = 50; a> = 30; a- = 1) {// készülj fel set_servo_position (kar, a);} set_servo_position (kar, lő);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// simán emelje fel a kart set_servo_position (kar, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (elkerül ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // várja meg, amíg az aktuális létrehozási folyamat befejeződik, és válassza a kill_process (pid) elsőbbséget; CREATE_FREE; // kész vagyok stop ();} void välttä_left () {kill (pidb); // stop all else kill (pidc); párkány (); // vegye fel a karmot, hogy ne akadjon el az asztalon back_away (); // hátrafelé rotate_l (); // forgassa el az akadálytól készen (); // tegye vissza a karmát, ha (have_ball) {// ha megvan a labda start_c ();} // indítsd el a gólkövetést if if (! have_ball) {// ha nincs labdám start_b ();} // golyókezdés követése} void välttä_jobb () {kill (pidb); ölni (pidc); szegély(); hátrálni(); rotate_r (); kész(); 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);}

6. lépés: Megérte?

A költségek a következők voltak: Létrehozás + akkumulátor + dokk = 260 dollár XBC kezdőkészlet (xbc, bütyök, LEGO kockák, érzékelők) = 579 USD. PVC + festék + csavarok = körülbelül 20 USD Összes költség = 859 USD. számomra a Létrehozás költségei voltak. Azt hiszem, megérte, és a legjobb az egészben, hogy az összes használt rész újrahasználható, ha rá tudnám venni magam erre a robotra. Ez a videó bemutatja az alrutin elkerülését, asztallapon. Ez a videó azt mutatja, hogy a robot 5 narancssárga golyót lő egy kapuba. Csak segítettem a folyamat felgyorsításában, végül magától megtalálta volna az 5 -ös labdát.

7. lépés: Következtetés

A végeredmény egy robot, amely képes narancssárga golyókat kapni és gólt szerezni a kapuban.

Szerettem ezen a projekten dolgozni. Minél többet dolgoztam ezen a roboton, annál jobban ragaszkodtam hozzá. Most úgy beszélek vele, mintha kisállat lenne. Remélem, hogy ez segített a következő projektben. Sok embernek kell köszönetet mondanom, de túl sokan vannak. Mint Bernard of Chartres oly elegánsan fogalmazott: "olyanok vagyunk, mint a törpék az óriások vállán, hogy többet láthassunk, mint ők, és a dolgokat távolabb, nem a látásélesség vagy a fizikai szempontok miatt megkülönböztetés, hanem azért, mert óriási méretük magasan hordoz bennünket."

Ajánlott: