Innholdsfortegnelse:

Hvordan lage en autonom basketballball som bruker en IRobot Lag som base: 7 trinn (med bilder)
Hvordan lage en autonom basketballball som bruker en IRobot Lag som base: 7 trinn (med bilder)

Video: Hvordan lage en autonom basketballball som bruker en IRobot Lag som base: 7 trinn (med bilder)

Video: Hvordan lage en autonom basketballball som bruker en IRobot Lag som base: 7 trinn (med bilder)
Video: Humans Need Not Apply 2024, Juli
Anonim
Hvordan lage en autonom basketballball som bruker en IRobot som en base
Hvordan lage en autonom basketballball som bruker en IRobot som en base

Dette er min oppføring for iRobot Create -utfordringen. Den vanskeligste delen av hele denne prosessen for meg var å bestemme hva roboten skulle gjøre. Jeg ønsket å demonstrere de kule funksjonene i Create, samtidig som jeg la til litt robo -teft. Alle ideene mine syntes enten å falle i kategorien kjedelig, men nyttig, eller kult og upraktisk. Til slutt vant det kule og upraktiske ut og basketballspilleren ble født. Etter noen tanker innså jeg at det kunne være praktisk. Anta at du bruker oransje papir, og at alle søppeldunkene dine har grønne bakplater …

Trinn 1: Skaff deler

På grunn av konkurransens tidsbegrensning var de fleste delene jeg brukte "fra hyllen". "Lager" Robotdeler som brukes: Opprett (x1)-fra iRobot www.irobot.comXBC V.3.0 (x1)-fra Botball www.botball.orgCreate-Roomba-kabel (x1)-fra Botball www.botball.orgServo (x2)-fra Botball www.botball.orgSharp avstandsmåler (x1)-fra Botball www.botball.orgAssorterte LEGO klosser-fra LEGO www.lego.com6-32 maskinskruer (x4)-fra McMaster www.mcmaster.com "Created" Robot Parts Used: 3/8 "tykt ekstrudert PVC -ark - disse tingene er kjempebra, men jeg kan ikke huske hvor jeg fikk det fra, men det er akkurat som disse tingene https://www.lynxmotion.com/Category.aspx? CategoryID = 62Andre deler: Oransje "POOF" ball - fra WalMartBasketball målsøkt søppelbøtte - fra LowesGreen "bakplate" - ekstra PVC malt lysegrønn

Trinn 2: Lag den unike delen

Lag den unike delen
Lag den unike delen

Den eneste delen jeg måtte lage var en tallerken som boltet seg til Create og tilbød LEGO -avstand. Avstanden mellom LEGO mursteinene er 8 mm fra hverandre, men jeg gjorde en dobbel avstand for å spare tid. Ekstrudert PVC er en lek å jobbe med. Den kan kuttes med en kniv, men er stiv og sterk. Jeg plukker ofte opp roboten ved denne platen, og jeg har ikke hatt et problem ennå.

Trinn 1: Skjær arket til 3,5 "x 9,5", du kan kutte dette med en kniv. Trinn 2: Bor hullene for opprettingsskruene. Opprettingsskruene lager en boks som er 2 og 5/8 "x 8 og 5/8". Trinn 3: Bor hullene i LEGO -mursteinene. Bruk et 3/16 "bor og jeg fordelte hullene 16 mm fra hverandre. Tips: Jeg la arket ut i et CAD -program, trykket det ut i full størrelse og teipet det til arket. Så brukte jeg dette som en guide for skjæring og boring.

Trinn 3: Montering av roboten

Montering av roboten
Montering av roboten
Montering av roboten
Montering av roboten
Montering av roboten
Montering av roboten

Jeg liker å bygge ting så enkelt som mulig, på den måten trenger du ikke å bygge om så mye når de hopper av bordet!

1. Skru den nyopprettede platen til toppen av Create 2. Bygg en arm for å ta tak i ballen 3. Bygg en arm for å holde kameraet 4. Bygg et feste for avstandsmåleren 5. Monter XBC og koble til alle kablene

Trinn 4: Programmering av roboten

Jeg bestemte meg for å bruke XBC som kontrolleren hovedsakelig på grunn av den innebygde fargesporingen. Fordi jeg bestemte meg for å bruke XBC som hjernen til operasjonen, programmerte jeg roboten min i Interactive C, eller som jeg kaller det IC. IC er gratis å bruke og kan lastes ned fra www.botball.org. IC er veldig lik C ++, men har flere innebygde biblioteker. Som det viser seg, har David Miller fra University of Oklahoma skrevet et bibliotek for Create som kan lastes ned fra siden hans på https://i-borg.engr.ou.edu/~dmiller/create/. Med disse ressursene og håndbøkene for opprettelsen var jeg klar til å programmere. Men den neste store utfordringen var hva jeg ville at den skulle gjøre? Jeg ville ha en robot som kunne hente oransje baller og score dem i en kurv. Målet mitt hørtes enkelt ut, og kunne sannsynligvis ha vært enkelt, men jo mer jeg kom inn på hva Create kunne gjøre, jo mer ville jeg at det skulle gjøre. Min siste liste så slik ut: 1. Finn oransje ball2. Plukk opp oransje ball3. Finn kurven 4. Legg ballen i kurven mens 1. Unngå objekter 2. Ikke falle av noe (som et bord) 3. Oppdage ladningen av batteriet og koble til hjemmebasen når lavt Oh, og alt dette er helt autonomt, noe som betyr at det hele er forhåndsprogrammert.

Trinn 5: Kode

Det kan være rotete, men det fungerer.#Bruk "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kamera servo port#definer arm 3 // arm servo port#definier et (analog (0)) // et port/*Opprett -kabelen må også plugges inn. Strømkontakten, den 3 -hullede kontakten til port 8 og den merkede UX til JP 28 (ved siden av USB -porten) med U mot kameraet*/ #definere c_down 5 // kameraservo ned#definere a_down 17 // arm servo ned#definere hold 50 // servo hold ball#definere fanget 27 // arm servoposisjon for å unngå å bli fanget på bordet#definere skyte 150 // servo kaste ball#definere spor_c 25 // kameraservospor lukke posisjon#definere spor_f 45 // kameraservospor langt posisjon#definere senter 120 // senter for kamerasyn#definere inrange 30 // spor_y koordinat når ballen er i klo#definere ball 0 // kanal med oransje ball#definer ball_x (spor_x (ball, 0)) // x koordinat for ball#definer ball_y (spor_y (ball, 0)) // y koordinat for ball#definer sakte 100 // hastighet på sakte motor#definere rask 175 // hastighet på rask motor#definere klar 0,2 // s leep for å komme tilbake fra hindringer#definere tid 0.5 //1.0 er en 90 graders høyresving#definere hvile 0.05 // tid til å sove mens du sporer blobs#definere hastigheta 175 // hastighet for å unngå sving#definere back_s -200 // hastighet til tilbake fra et støt objekt#definere rett 32767 // kjøre i en rett linje#definere backb 2 // kanal på hovedbrettets hovedfarge#definere kvadrat 1 // kanal med ryggbrett -aksentfarge#definere spor_d 250 // kameraposisjon for sporing av mål# definere spor_finne 70 // kameraposisjon for lang sporing#definere omvendt 2.25 // hviletid for en 180#definere bak_f -150 // tilbake rask hastighet#definere bak_sl -125 // tilbake langsom hastighet#definere sentrum_x 178 // sann x senter av cam#definere center_y 146 // true y center of camint pida; // unngå processint pidb; // track processint pidc; // score processint have_ball = 0; // forteller hvilken funksjon vi er ugyldige main () {long ch; enable_servos (); // aktiver servos init_camera (); // start kamera cconnect (); // koble til for å lage med full kontroll start_a (); // start unngå funksjon start_b (); // start ball_tracking -funksjon mens (1) {if (r_button () || gc_ldrop || gc_rdrop) {// hvis plukket opp eller r skulderknappdrep (pida); drepe (pidb); drepe (pidc); disable_servos (); koble fra(); break;} create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); hvis (gc_battery_charge <1200l || b_button ()) {kill (pida); drepe (pidb); drepe (pidc); kaste(); har_ball = 0; create_demo (1); mens (b_knapp ()); mens (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); sove (1.0);} cconnect (); tilbake(); søvn (2,0); start_a (); start_b ();}}} void avoid () {while (1) {// repeat forever create_sensor_update (); // oppdater alle sensorverdier // create_drive (speeda, straight); hvis (gc_lbump == 1) {// venstre støt unngå_høyre ();} // svinger til høyre for å unngå annet hvis (gc_rbump == 1) {// høyre støt unngå_ venstre ();} // svinger til venstre for å unngå annet hvis (gc_lfcliff == 1) {// venstre forreste klippe unngå_høyre ();} annet hvis (gc_rfcliff == 1) {// høyre forreste klippe unngå_lendt ();} annet hvis (gc_lcliff == 1) {// venstre klippe unngå_høyre ());} annet hvis (gc_rcliff == 1) {// høyre klippe unngår_ venstre ();}}} ugyldig sporball () {kill (pidc); mens (! have_ball) {// gjenta til få ball track_update (); langt (); // setter kameraet klart (); // setter armen mens (et <255) {// til maks verdi skjer når ballen fanges track_update (); // oppdater kamerabilde hvis (ball_x <= (center-5)) {// hvis ballen er igjen track_update (); create_drive_direct (sakte, rask); // sving til venstre søvn (hvile);} ellers hvis (ball_x> = (senter+5)) {// hvis ballen er riktig track_update (); create_drive_direct (rask, langsom); // sving til høyre (hvil);} ellers hvis (ball_x (senter-5)) {// hvis ballen er sentrert track_update (); create_drive_straight (rask); // gå rett i dvale (hvil);}} grab (); // grab ball beep (); // make noise stop (); // stop driving ha_ball = 1; // noter at Jeg har ball} start_c (); // finn kurven søvn (1.0); // sov slik at jeg ikke gjør noe når jeg blir drept} void find_basket () {kill (pidb); // kill ball tracking process finn (); // sette opp kameraet track_set_minarea (1000); // bakbordet er stort, så se bare etter store klatter mens (have_ball) {// mens jeg har ballen track_update (); while (track_x (backb, 0) = (center_x+20)) {// mens ikke sentrert track_update (); if (track_x (backb, 0)> = (center_x+20)) {// hvis bakbordet er igjen track_update (); create_spin_CCW (100);} // sving til venstre ellers hvis (track_x (backb, 0) <= (center_x-20)) {// hvis bakplaten er riktig track_update (); create_spin_CW (300-center_x);} // ta til høyre sakte når senteret nærmer seg} stop (); while (track_size (backb, 0) <= (6000)) {// mens målet er mindre enn 6000 piksler i størrelse track_update (); if (track_x (backb, 0) <= (center_x-5)) {// hvis målet er igjen track_update (); create_drive_direct (sakte, rask); // sving til venstre søvn (hvile);} ellers hvis (track_x (backb, 0)> = (center_x+5)) {// hvis målet er riktig track_update (); create_drive_direct (rask, langsom); // sving til høyre (hvil);} ellers hvis (track_x (backb, 0) (center_x-5)) {// hvis målet er sentrert track_update (); create_drive_straight (rask); // gå rett i dvale (hvile);}} stopp (); // create_drive_straight (rask); // komme litt nærmere //sleep(1.0); //Stoppe(); søvn (1,0); create_spin_CW (speeda); // spin right sleep (reverse); // sov lenge nok til et stopp på 180 svinger (); ned (); // sette kameraet ned for å spore søvn på bakbordet (1.0); track_set_minarea (200); // bruk en mindre min størrelse, siden vi er pekt på den og kommer til å komme nærmere mens (track_y (backb, 0)> = (center_y-140)) {// mens målet er mindre enn y koordinat track_update (); if (track_x (backb, 0) <= (center_x-5)) {// hvis målet er igjen track_update (); back_right (); // sving til venstre søvn (rest);} ellers hvis (track_x (backb, 0)> = (center_x+5)) {// hvis målet er riktig track_update (); back_left (); // sving til høyre (hvil);} ellers hvis (track_x (backb, 0) (center_x-5)) {// hvis målet er sentrert track_update (); tilbake (); // gå rett i dvale (hvile);}} stopp (); pip (); kaste (); // skyte søvn (1.0); have_ball = 0; // påminnelse jeg kastet ballen og har den ikke} start_b (); // tilbake til ballsporing (1.0); // ikke gjør noe før denne prosessen dør} void cconnect () {create_connect (); create_full (); // for full kontroll av avsensorer create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // stop moving move_disconnect ();} void back_away () {back (); søvn (klar); stop ();} void rotate_l () {create_spin_CCW (speeda); søvn (tid); stop ();} void rotate_r () {create_spin_CW (speeda); søvn (tid); 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 avsats () {set_servo_position (arm, fanget);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// gjør deg klar set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// heve armen jevnt 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 (unngå ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // vent på at nåværende opprettingsprosess er fullført, og ta prioritet kill_process (pid); CREATE_FREE; // jeg er ferdig stop ();} void avoid_left () {kill (pidb); // stopp alt annet kill (pidc); avsats (); // ta opp klo slik at den ikke blir fanget på bordet bakover (); // bakover roter_l (); // roter vekk fra hindringsklar (); // legg klo igjen hvis (har_ball) {// hvis jeg har ballen start_c ();}} // start målsporing ellers hvis (! har_ball) {// hvis jeg ikke har ballen start_b ();} // start ballsporing} ugyldig unngå_rett () {drepe (pidb); drepe (pidc); hylle(); gå tilbake(); rotate_r (); klar(); if (have_ball) {start_c ();} ellers 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);}

Trinn 6: Var det verdt det?

Kostnadene var: Opprett + batteri + doc = $ 260XBC startsett (xbc, kamera, LEGO -klosser, sensorer) = $ 579PVC + maling + skruer = ca $ 20 Totalkostnad = $ 859 Jeg hadde allerede XBC -startsettet fra Botball, så kostnaden for meg var kostnaden for Create. Jeg tror at det var verdt det, og det beste er at alle delene jeg brukte er gjenbrukbare, hvis jeg kunne få meg selv til å dele ut denne boten. Denne videoen viser unngå -rutinen, på en bordplate. Denne videoen viser roboten som scorer 5 oransje baller i et mål. Jeg hjalp bare til med å få fart på prosessen, den hadde funnet ballen 5 til slutt på egen hånd.

Trinn 7: Konklusjon

Det endelige resultatet er en robot som kan plukke opp og score oransje baller i et mål helt alene.

Jeg elsket å jobbe med dette prosjektet. Jo mer jeg jobbet med denne roboten, desto mer festet ble jeg til den. Jeg snakker nå til det som om det var et kjæledyr. Jeg håper at dette har hjulpet deg på ditt neste prosjekt. Det er mange mennesker jeg må takke, men det er for mange. Som Bernard av Chartres så elegant uttalte: "vi er som dverger på skuldrene til giganter, slik at vi kan se mer enn de, og ting på en større avstand, ikke i kraft av skarphet fra syne fra oss eller noen fysiske skillet, men fordi vi blir båret høyt og hevet av deres gigantiske størrelse."

Anbefalt: