Përmbajtje:

Si të bëni një robot autonome basketbolli duke luajtur një IRobot Krijoni si bazë: 7 hapa (me fotografi)
Si të bëni një robot autonome basketbolli duke luajtur një IRobot Krijoni si bazë: 7 hapa (me fotografi)

Video: Si të bëni një robot autonome basketbolli duke luajtur një IRobot Krijoni si bazë: 7 hapa (me fotografi)

Video: Si të bëni një robot autonome basketbolli duke luajtur një IRobot Krijoni si bazë: 7 hapa (me fotografi)
Video: 8 Fakte qe me siguri nuk i dinit rreth FREE FIRE 2024, Korrik
Anonim
Si të bëni një robot autonome basketbolli duke luajtur duke përdorur një IRobot Krijoni si bazë
Si të bëni një robot autonome basketbolli duke luajtur duke përdorur një IRobot Krijoni si bazë

Kjo është hyrja ime për sfidën iRobot Krijo. Pjesa më e vështirë e këtij procesi për mua ishte të vendosja se çfarë do të bënte roboti. Doja të demonstroja tiparet e lezetshme të Krijo, duke shtuar edhe njëfarë dhuntie robo. Të gjitha idetë e mia duket se bien në kategorinë e mërzitshme, por të dobishme, ose të ftohta dhe jopraktike. Në fund fitoi ftohtë dhe jopraktike dhe lindi roboti që luante basketboll. Pas disa mendimesh kuptova se mund të ishte praktike. Supozoni se përdorni letër portokalli dhe se të gjitha koshat e plehrave tuaja kanë tavolina jeshile …

Hapi 1: Merrni Pjesët

Për shkak të kufirit kohor të konkursit, shumica e pjesëve që kam përdorur ishin "jashtë raftit". Pjesë të Robotit "Stock" të Përdorura: Krijo (x1)-nga iRobot www.irobot.com XBC V.3.0 (x1)-nga Botball www.botball.org Krijo kabllo Roomba (x1)-nga Botball www.botball.orgServo (x2)-nga Botball www.botball.org Shih distancë e mprehtë (x1)-nga Botball www.botball.org Tulla të ndryshme LEGO-nga LEGO www.lego.com 6-32 vida makinerie (x4)-nga McMaster www.mcmaster.com "Krijuar" Pjesë të Robotit të Përdorura: 3/8 "fletë PVC e ekstruduar e trashë - këto gjëra janë të mrekullueshme, por nuk mbaj mend nga e kam marrë, por është njësoj si kjo gjë https://www.lynxmotion.com

Hapi 2: Krijoni Pjesën Unike

Krijoni Pjesën Unike
Krijoni Pjesën Unike

Pjesa e vetme që më duhej të fabrikoja ishte një pjatë që lidhej me Krijimin dhe ofronte hapësirë LEGO. Hapësira e vrimave të tullave LEGO është 8 mm larg, por unë bëra një distancë të dyfishtë për të kursyer kohë. PVC e ekstruduar është një fllad për të punuar me të. Mund të pritet me thikë, por është e ngurtë dhe e fortë. Unë shpesh e marr robotin nga kjo pjatë dhe nuk kam pasur ende problem.

Hapi 1: Pritini fletën në 3.5 "x 9.5", ju mund ta shkurtoni këtë me një thikë shërbimi. Hapi 2: Shponi vrimat për vidhat e krijimit. Vidhat e krijuara bëjnë një kuti që është 2 dhe 5/8 "me 8 dhe 5/8". Hapi 3: Stërvitni vrimat e vendosura me tulla LEGO. Përdorni një stërvitje 3/16 "dhe i ndava vrimat 16 mm larg. Këshillë: E shtrova fletën në një program CAD, e printova në madhësi të plotë dhe e ngjita në fletë. Pastaj e përdor këtë si një udhëzues për prerjen dhe shpimi.

Hapi 3: Montimi i Robotit

Montimi i Robotit
Montimi i Robotit
Montimi i Robotit
Montimi i Robotit
Montimi i Robotit
Montimi i Robotit

Më pëlqen të ndërtoj gjërat sa më thjeshtë që të jetë e mundur, në atë mënyrë kur ato hidhen nga tryeza nuk keni nevojë të rindërtoni aq shumë!

1. Vidhosni pjatën e modës së re në krye të Krijoni 2. Ndërtoni një krah për të kapur topin 3. Ndërtoni një krah për të mbajtur kamerën 4. Ndërtoni një montim për distancuesin e distancës 5. Montoni XBC dhe lidhni të gjitha kabllot

Hapi 4: Programimi i Robotit

Vendosa të përdor XBC si kontrolluesin tim kryesisht për shkak të gjurmimit të tij të ngjyrave. Sepse vendosa që me XBC si trurin e operacionit të programoja robotin tim në Interactive C, ose siç e quaj unë IC. IC është falas për t’u përdorur dhe mund të shkarkohet në www.botball.org. IC është shumë e ngjashme me C ++, por ka disa biblioteka të ndërtuara. Siç doli, David Miller nga Universiteti i Oklahoma ka shkruar një bibliotekë për Krijo e cila mund të shkarkohet nga faqja e tij në https://i-borg.engr.ou.edu/~dmiller/create/. Me ato burime dhe manualet për krijimin isha gati të programoja. Por sfida tjetër e madhe ishte ajo që doja të bënte? Doja një robot që mund të shkonte të merrte topa portokalli dhe t'i shënonte në një shportë. Qëllimi im dukej i thjeshtë, dhe ndoshta mund të ketë qenë i thjeshtë, por sa më shumë që hyja në atë që Krijimi mund të bënte, aq më shumë doja që ajo të bënte. Lista ime përfundimtare dukej kështu: 1. Gjeni top portokalli2. Merr topin portokalli3. Gjeni shportën 4. Vendos topin në kosh Ndërsa 1. Shmangia e objekteve2. Duke mos rënë nga asgjë (si një tryezë) 3. Zbulimi i ngarkesës së baterisë dhe lidhja me bazën e shtëpisë kur është e ulët, dhe e gjithë kjo është plotësisht autonome, që do të thotë se e gjitha është e para -programuar.

Hapi 5: Kodi

Mund të jetë e çrregullt, por funksionon.#Përdor "createlib.ic" #use "xbccamlib.ic" #define cam 0 // port servo kamera#përcakto krahun 3 // port servo krahu#përcakto et (analoge (0)) // et et port/*Kablloja e krijimit gjithashtu duhet të lidhet. Foleja e rrymës, priza me 3 priza në portën 8 dhe ajo e etiketuar UX në JP 28 (pranë portës USB) me U drejt kamerës*/ #përcaktoni c_down 5 // servo poshtë kamerës#përcaktoni a_down 17 // krah servo poshtë#përcaktoni mbajtjen 50 // servo mbani topin#përcaktoni kapur 27 // pozicionin servo të krahut për të mos u kapur në tryezë#përcaktoni xhirimin 150 // servo hedh topin#përcakto pista_c 25 // kamera servo gjurmë pozicioni i mbyllur#përcakto pista_f 45 // kamera servo gjurmë pozicioni larg#përcakto qendrën 120 // qendra e shikimit të kamerës#përcakto inrange 30 // pista_y koordinon kur topi është në kthetër#përcakto topin 0 // kanali i topit portokalli#përcakto topin_x (pista_x (topi, 0)) // x koordinata e topit#përcakto topin_y (pista_y (topi, 0)) // y koordinata e topit#përcakto ngadalë 100 // shpejtësia e ngadalshme motori#përcakto shpejt 175 // shpejtësia e motorit të shpejtë#përcakto qartë 0.2 // s kërcim për tu kthyer nga pengesat#përcakto kohën 0.5 //1.0 është një kthesë 90 shkallë djathtas#përcakto pushimin 0.05 // koha për të fjetur gjatë përcjelljes së pikave#përcakto shpejtësinë 175/ shpejtësia e shmangies së kthesës#përcakto prapa -200 // shpejtësia në kthehu nga objekti i përplasur#përcakto drejt 32767 // drejto në vijë të drejtë#përcakto pjesën e pasme 2 // kanali i ngjyrës kryesore të tabelës#përcakto katrorin 1 // kanali i ngjyrës së theksit të tabelës#përcakto pista_d 250 // pozicioni i kamerës për përcjelljen e objektivit# përcakto track_find 70 // pozicioni i kamerës për gjurmim të gjatë#përcakto anasjelltas 2.25 // koha e gjumit për 180#përcakto back_f -150 // shpejtësia e shpejtë mbrapa#përcakto back_sl -125 // shpejtësia e ngadaltë mbrapa#përcakto center_x 178 // qendra x e vërtetë e cam#përcakto qendrën_y 146 // qendra e vërtetë y e camint pida; // shmang procesint pidb; // gjurmoni processint pidc; // shënoni processint have_ball = 0; // tregon se cili funksion jemi të pavlefshëm main () {ch e gjatë ch; enable_servos (); // aktivizoni servos init_camera (); // filloni lidhjen e kamerës (); // lidheni për të krijuar me kontrollin e plotë start_a (); // filloni të shmangni funksionin start_b (); // filloni funksionin e gjurmimit të topit ndërsa (1) {if (r_button () || gc_ldrop || gc_rdrop) {// nëse merret ose r butoni i shpatullës vret (pida); vras (pidb); vras (pidc); disable_servos (); shkëput (); pushim;} create_battery_charge (); display_clear (); printf ("ngarkimi = %l / n", gc_battery_charge); nëse (gc_battery_charge <1200l || b_button ()) {vras (pida); vras (pidb); vras (pidc); hedh (); kanë_ball = 0; krijo_demo (1); ndërsa (b_button ()); ndërsa (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("ngarkimi = %l / n", gc_battery_charge); gjumi (1.0);} lidhni (); mbrapa (); gjumë (2.0); start_a (); start_b ();}}} void shmang () {ndërsa (1) {// përsëris përgjithmonë create_sensor_update (); // përditëso të gjitha vlerat e sensorit // create_drive (speeda, straight); if (gc_lbump == 1) {// përplasje majtas shmang_djathtas ();} // kthehet djathtas për të shmangur ndryshe nëse (gc_rbump == 1) {// përplasje djathtas shmang_majtas ();} // kthehet majtas për të shmangur ndryshe nëse (gc_lfcliff == 1) {// shkëmbi i majtë i përparmë shmang_djathtas ();} tjetër nëse (gc_rfcliff == 1) {// shkëmbi i djathtë i përparmë shmang_majtën ();} përndryshe nëse (gc_lcliff == 1) {// shkëmbi i majtë shmang_djathtas ();} tjetër nëse (gc_rcliff == 1) {// shkëmbi i djathtë shmang_majtën ();}}}} void track_ball () {vras (pidc); ndërsa (! have_ball) {// përsëris derisa të marr topin_ditësim (); larg (); // vendos kamerën gati (); // vendos krahun ndërsa (et <255) {// derisa vlera maksimale të ndodhë kur topi kapet track_update (); // përditësoni foton e kamerës nëse (top_x <= (qendra-5)) {// nëse topi lihet track_update (); create_drive_direct (i ngadalshëm, i shpejtë); // kthejeni gjumin majtas (pushim);} tjetër nëse (top_x> = (qendra+5)) {// nëse topi është i duhuri track_update (); create_drive_direct (shpejt, ngadalë); // kthejeni gjumin djathtas (pushim);} tjetër nëse (topi_x (qendra-5)) {// nëse topi është i përqëndruar në track_update (); krijo_drive_straight (shpejt); // shko në gjumë të drejtë (pushim);}} kap (); // kap një tingull topi (); // bëj zhurmë të ndaluar (); // ndalo vozitjen have_ball = 1; // shëno që Unë kam top} start_c (); // gjej gjumin e shportës (1.0); // fle në mënyrë që të mos bëj asgjë kur të vritem} void find_basket () {kill (pidb); // vras procesin e përcjelljes së topit gjeni (); // vendosni kamerën në track_set_minarea (1000); // tabela e pasme është e madhe, kështu që kërkoni vetëm blloqe të mëdha ndërsa (have_ball) {// ndërsa unë kam topin track_update (); ndërsa (track_x (backb, 0) = (center_x+20)) {// ndërsa nuk është në qendër track_update (); if (track_x (backb, 0)> = (center_x+20)) {// nëse tabela e pasme është lënë track_update (); create_spin_CCW (100);} // kthehu majtas tjetër nëse (track_x (backb, 0) <= (center_x-20)) {// nëse tabela është e drejtë track_update (); create_spin_CW (300-center_x);} // kthehu djathtas duke ngadalësuar ndërsa qendra afrohet} ndalesë (); ndërsa (madhësia e pista (backb, 0) <= (6000)) {// ndërsa objektivi është më pak se 6000 piksele në madhësi track_update (); if (track_x (backb, 0) <= (center_x-5)) {// nëse objektivi është lënë track_update (); create_drive_direct (i ngadalshëm, i shpejtë); // kthejeni gjumin majtas (pushim);} tjetër nëse (track_x (backb, 0)> = (center_x+5)) {// nëse objektivi është track_update e duhur (); create_drive_direct (shpejt, ngadalë); // kthejeni gjumin djathtas (pushim);} përndryshe nëse (track_x (backb, 0) (center_x-5)) {// nëse objektivi është i përqëndruar në track_update (); create_drive_straight (fast); // shkoni në gjumë të drejtë (pushim);}} stop (); // krijo_drive_straight (shpejt); // afrohu pak më shumë //gjum (1.0.0); // ndal (); gjumë (1.0); create_spin_CW (speeda); // rrotulloni gjumin e djathtë (e kundërt); // flini mjaft gjatë për një ndalesë me 180 kthesa (); poshtë (); // ulni kamerën për të gjurmuar gjumin në tabelë (1.0); track_set_minarea (200); // përdorni një madhësi më të vogël min, pasi ne jemi drejtuar drejt tij dhe do të afrohemi ndërsa (track_y (backb, 0)> = (center_y-140)) {// ndërsa objektivi është më i vogël se y koordinoni track_update (); if (track_x (backb, 0) <= (center_x-5)) {// nëse objektivi është lënë track_update (); back_right (); // ktheni gjumin e majtë (pushim);} tjetër nëse (track_x (backb, 0)> = (center_x+5)) {// nëse objektivi është track_update e duhur (); back_left (); // kthejeni gjumin djathtas (pushim);} tjetër nëse (track_x (backb, 0) (center_x-5)) {// nëse objektivi është i përqëndruar në track_update (); mbrapa (); // shkoni në gjumë të drejtë (pushim);}} ndaleni (); biep (); hedh (); // gjuaj gjumë (1.0); have_ball = 0; // kujtesë Unë hodha topin dhe nuk e kam atë} start_b (); // kthehuni te gjumi i përcjelljes së topit (1.0); // mos bëni asgjë derisa ky proces të vdesë} void lidhja () {create_connect (); create_full (); // për kontrollin e plotë të sensorëve të parvazit create_power_led (0, 255);} // green power ledvoid shkëputje () {stop (); // ndalo lëvizjen create_disconnect ();} void back_away () {prapa (); gjumë (i qartë); stop ();} void rotate_l () {create_spin_CCW (speeda); Koha per te fjetur); stop ();} void rotate_r () {create_spin_CW (speeda); Koha per te fjetur); stop ();} ndalim i pavlefshëm () {create_drive (0, drejt);} mbrapa zbrazëti () {create_drive (back_s, straight);} i pavlefshëm gati () {set_servo_position (krah, a_down);} kontroll i pavlefshëm () {set_servo_position (kamera, pista_c);} zbrazëtira larg () {set_servo_position (kamera, pista_f);} parvaz i pavlefshëm () {set_servo_pozicion (krah, kapur);} hedhje zbraztësie () {int a; për (a = 50; a> = 30; a- = 1) {// bëhuni gati set_servo_position (krahu, a);} set_servo_position (krahu, gjuaj);} void grab () {int a; për (a = 0; a <= mbaj; a+= 1) {// ngre krahun pa probleme set_servo_position (krahu, a);}} zbraz poshtë () {set_servo_position (kamera, track_d);} pavlefshme find () {set_servo_position (cam, track_find);} fillimi i pavlefshëm () {pida = start_process (shmang ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // prisni që procesi i krijimit aktual të përfundojë dhe merrni përparësi kill_process (pid); CREATE_FREE; // kam mbaruar stop ();} void shmang_majtas () {vras (pidb); // ndal çdo gjë tjetër vras (pidc); parvaz (); // kap kthetrën në mënyrë që të mos kapet në tryezë mbrapa_away (); // kthehu mbrapa rrotullo_l (); // rrotullohu larg pengesës gati (); // vendos kthetrën përsëri nëse (ka_ball) {// nëse e kam topin start_c ();} // fillo përcjelljen e objektivave, nëse tjetër (nëse kam!) {vras (pidb); vras (pidc); parvaz (); tërhiqem(); rrotullo_r (); gati (); if (have_ball) {start_c ();} tjetër nëse (! have_ball) {start_b ();}} void back_left () {create_drive_direct (back_f, back_sl);} void back_right () {create_drive_direct (back_sl, back_f);}

Hapi 6: A ia vlente?

Kostot ishin: Krijoni + bateri + dokument = 260 dollarë pajisje startuese XBC (xbc, kamerë, tulla LEGO, sensorë) = 579 dollarë PVC + bojë + vida = rreth 20 dollarë Kosto totale = 859 dollarë për mua ishte kostoja e Krijimit. Unë mendoj se ia vlente, dhe pjesa më e mirë është se të gjitha pjesët që kam përdorur janë të ripërdorshme, nëse do të mund ta ndaja këtë bot. Kjo video tregon shmangien e nën -rutinës, në krye të tryezës. Kjo video tregon robotin duke shënuar 5 topa portokalli në një gol. Unë vetëm ndihmova për të shpejtuar procesin së bashku, do të kishte gjetur topin 5 përfundimisht më vete.

Hapi 7: Përfundimi

Rezultati përfundimtar është një robot që mund të mbledhë dhe shënojë topa portokalli në një gol të vetëm.

Më pëlqeu të punoja në këtë projekt. Sa më shumë kam punuar në këtë robot aq më shumë jam lidhur me të. Tani flas me të sikur të ishte një kafshë shtëpiake. Shpresoj se kjo ju ka ndihmuar në projektin tuaj të ardhshëm. Ka shumë njerëz që duhet t’i falënderoj, por ka shumë. Ashtu si Bernardi i Chartres deklaroi në mënyrë kaq elegante: "ne jemi si xhuxhët mbi supet e gjigantëve, në mënyrë që të shohim më shumë se ata, dhe gjërat në një distancë më të madhe, jo për shkak të ndonjë mprehtësie në shikim nga ana jonë, ose ndonjë fizike dallim, por sepse ne jemi mbajtur lart dhe rritur nga madhësia e tyre gjigante ".

Recommended: