Innehållsförteckning:

Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas: 7 steg (med bilder)
Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas: 7 steg (med bilder)

Video: Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas: 7 steg (med bilder)

Video: Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas: 7 steg (med bilder)
Video: Amanda chockar juryn och berör med sitt viktiga budskap 2024, Juli
Anonim
Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas
Hur man gör en autonom basketboll som spelar robot med hjälp av en IRobot Skapa som bas

Detta är mitt bidrag till iRobot Create -utmaningen. Den svåraste delen av hela processen för mig var att bestämma vad roboten skulle göra. Jag ville demonstrera de häftiga funktionerna i Create, samtidigt som jag lade till lite robo -stil. Alla mina idéer tycktes antingen falla i kategorin tråkigt men användbart eller coolt och opraktiskt. Till slut vann coolt och opraktiskt och den basketbollande roboten föddes. Efter lite eftertanke insåg jag att det kunde vara praktiskt. Antag att du använder orange papper och att alla dina papperskorgar har gröna bakplattor …

Steg 1: Skaffa delar

På grund av tävlingens tidsgräns var de flesta delarna jag använde "off the shelf". "Stock" Robotdelar som används: Skapa (x1)-från iRobot www.irobot.comXBC V.3.0 (x1)-från Botball www.botball.orgCreate-Roomba-kabel (x1)-från Botball www.botball.orgServo (x2)-från Botball www.botball.orgSharp avståndsmätare (x1)-från Botball www.botball.orgAssorterade LEGO-klossar-från LEGO www.lego.com6-32 maskinskruvar (x4)-från McMaster www.mcmaster.com "skapade" robotdelar som används: 3/8 "tjockt extruderat PVC -ark - det här är fantastiskt, men jag kan inte komma ihåg var jag fick det ifrån, men det är precis som det här https://www.lynxmotion.com/Category.aspx? CategoryID = 62Andra delar: Orange "POOF" boll - från WalMartBasketball målsökande papperskorg - från LowesGreen "backboard" - extra PVC målad ljusgrön

Steg 2: Skapa den unika delen

Skapa den unika delen
Skapa den unika delen

Den enda delen som jag var tvungen att tillverka var en tallrik som skruvades fast på Create och erbjöd LEGO -avstånd. Avståndet mellan LEGO tegelhålen är 8 mm från varandra, men jag gjorde ett dubbelavstånd för att spara tid. Extruderad PVC är en vind att jobba med. Den kan skäras med en verktygskniv, men är styv och stark. Jag plockar ofta upp roboten vid den här plattan och jag har inte haft några problem än.

Steg 1: Skär arket till 3,5 "x 9,5", du kan skära detta med en verktygskniv. Steg 2: Borra hålen för skruvarna. Skruvarna skapar en låda som är 2 och 5/8 "x 8 och 5/8". Steg 3: Borra hålen med LEGO -tegel på avstånd. Använd en 3/16 "borr och jag placerade hålen 16 mm från varandra. Tips: Jag lade ut arket i ett CAD -program, skrev ut det i full storlek och tejpade det på arket. Sedan använde jag detta som en guide för att klippa och borrning.

Steg 3: Montering av roboten

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

Jag tycker om att bygga saker så enkelt som möjligt, så när du hoppar från bordet behöver du inte bygga om så mycket!

1. Skruva fast den nymodiga plattan på toppen av Create 2. Bygg en arm för att ta tag i bollen 3. Bygg en arm för att hålla kameran 4. Bygg ett fäste för avståndsmätaren 5. Montera XBC och anslut alla kablar

Steg 4: Programmering av roboten

Jag bestämde mig för att använda XBC som min controller främst på grund av dess inbyggda färgspårning. Eftersom jag bestämde mig för att med XBC som hjärnan för operationen programmerade jag min robot i Interactive C, eller som jag kallar det IC. IC är gratis att använda och kan laddas ner på www.botball.org. IC liknar mycket C ++, men har flera inbyggda bibliotek. Som det visar sig har David Miller från University of Oklahoma skrivit ett bibliotek för Create som kan laddas ner från hans sida på https://i-borg.engr.ou.edu/~dmiller/create/. Med dessa resurser och manualerna för skapandet var jag redo att programmera. Men nästa stora utmaning var vad jag ville att den skulle göra? Jag ville ha en robot som kunde hämta apelsinbollar och göra dem i en korg. Mitt mål lät enkelt och förmodligen kunde ha varit enkelt, men ju mer jag kom in på vad Skapa kunde göra, desto mer ville jag att det skulle göra. Min sista lista såg ut så här: 1. Hitta orange boll2. Plocka upp orange boll 3. Hitta korg 4. Lägg bollen i korgen Medan 1. Undvika objekt 2. Faller inte av någonting (som ett bord) 3. Upptäck laddningen av batteriet och docka med hemmabasen när lågt Oh, och allt detta är helt autonomt, vilket betyder att det är förprogrammerat.

Steg 5: Kod

Det kan vara rörigt, men det fungerar.#Använd "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kameraservoport#definiera arm 3 // arm servoport#definiera et (analog (0)) // et port/*Skaparkabeln måste också anslutas. Strömuttaget, den 3 -stiftade kontakten till port 8 och den märkta UX till JP 28 (bredvid USB -porten) med U mot kameran*/ #definiera c_down 5 // kameraservo ner#definiera a_down 17 // arm servo ner#definiera håll 50 // servo håll boll#definiera fångad 27 // arm servoposition för att inte fastna på bordet#definiera skjuta 150 // servo kasta boll#definiera spår_c 25 // kameraservospår stäng position#definiera spår_f 45 // kameraservospår långt läge#definiera centrum 120 // mitten av kamerasyn#definiera intervall 30 // spår_y koordinat när bollen är i klo#definiera kul 0 // kanal för orange boll#definiera boll_x (spår_x (boll, 0)) // x bollkoordinat#definiera boll_y (spår_y (boll, 0)) // y koordinat för boll#definiera långsam 100 // hastighet för långsam motor#definiera snabb 175 // hastighet för snabb motor#definiera tydliga 0,2 // s leep för att backa bort från hinder#definiera tid 0.5 //1.0 är en 90 graders höger sväng#definiera vila 0.05 // tid att sova medan spårningsklumpar#definiera hastigheta 175 // hastighet för att undvika sväng#definiera back_s -200 // hastighet till backa bort från stötte objekt#definiera rak 32767 // kör i en rak linje#definiera backb 2 // kanal i ryggbrädans huvudfärg#definiera kvadrat 1 // kanal med ryggbrädans accentfärg#definiera spår_d 250 // kameraposition för spårning av mål# definiera spår_find 70 // kameraposition för lång spårning#definiera omvänd 2.25 // viloläge för en 180#definiera bak_f -150 // bak snabb hastighet#definiera bak_sl -125 // back långsam hastighet#definiera center_x 178 // true x center av cam#definiera center_y 146 // true y center of camint pida; // undvika processint pidb; // track processint pidc; // score processint have_ball = 0; // berättar vilken funktion vi är invoid main () {long ch; enable_servos (); // aktivera servos init_camera (); // starta kamera cconnect (); // ansluta för att skapa med full kontroll start_a (); // start undvika funktion start_b (); // starta ball_tracking -funktion medan (1) {if (r_button () || gc_ldrop || gc_rdrop) {// om plockad upp eller r skulderknapp död (pida); döda (pidb); döda (pidc); disable_servos (); koppla ifrån(); break;} create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); döda (pidb); döda (pidc); kasta(); har_boll = 0; skapa_demo (1); medan (b_knapp ()); medan (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("charge = %l / n", gc_battery_charge); sömn (1,0);} cconnect (); tillbaka(); sömn (2,0); starta ett(); start_b ();}}} void avoid () {while (1) {// repeat forever create_sensor_update (); // uppdatera alla sensorvärden // create_drive (speeda, straight); om (gc_lbump == 1) {// vänster bump avoid_right ();} // svänger höger för att undvika annat om (gc_rbump == 1) {// höger bump avoid_left ();} // svänger vänster för att undvika annat om (gc_lfcliff == 1) {// vänster främre klippan undvika_rätt ();} annars om (gc_rfcliff == 1) {// höger främre klippan undvika_länk ();} annars om (gc_lcliff == 1) {// vänster klippa undvik_rätt ();} annars om (gc_rcliff == 1) {// right cliff avoid_left ();}}} void track_ball () {kill (pidc); medan (! have_ball) {// upprepa tills få boll track_update (); far (); // ställer in kameran redo (); // ställer armen medan (et <255) {// tills maxvärdet händer när bollen fångas track_update (); // uppdaterar kamerabild om (ball_x <= (center-5)) {// om bollen lämnas track_update (); create_drive_direct (långsam, snabb); // sväng vänster sömn (vila);} annars om (ball_x> = (center+5)) {// om bollen är rätt track_update (); create_drive_direct (snabb, långsam); // sväng höger sömn (vila);} annars om (ball_x (center-5)) {// om bollen är centrerad track_update (); create_drive_straight (snabb); // gå rakt sömn (vila);}} grab (); // grab ball beep (); // make noise stop (); // sluta köra have_ball = 1; // notera att Jag har boll} start_c (); // hitta korgen sömn (1.0); // sömn så att jag inte gör någonting när jag blir dödad} void find_basket () {kill (pidb); // kill ball tracking process hitta (); // sätta upp kameran track_set_minarea (1000); // bakbordet är stort, så leta bara efter stora klossar medan (have_ball) {// medan jag har bollen track_update (); while (track_x (backb, 0) = (center_x+20)) {// medan inte centrerad track_update (); if (track_x (backb, 0)> = (center_x+20)) {// om backboard är kvar track_update (); create_spin_CCW (100);} // sväng vänster annars om (track_x (backb, 0) <= (center_x-20)) {// om bakbordet är rätt track_update (); create_spin_CW (300-center_x);} // sväng höger sakta när mitten närmar sig} stop (); medan (track_size (backb, 0) <= (6000)) {// medan målet är mindre än 6000 pixlar i storlek track_update (); if (track_x (backb, 0) <= (center_x-5)) {// om målet är kvar track_update (); create_drive_direct (långsam, snabb); // sväng vänster sömn (vila);} annars om (track_x (backb, 0)> = (center_x+5)) {// om målet är rätt track_update (); create_drive_direct (snabb, långsam); // sväng höger sömn (vila);} annars om (track_x (backb, 0) (center_x-5)) {// om målet är centrerat track_update (); create_drive_straight (snabb); // gå rakt sömn (vila);}} stop (); // create_drive_straight (snabb); // komma lite närmare //sleep(1.0); //sluta(); sömn (1,0); create_spin_CW (speeda); // snurra rätt sömn (bakåt); // sova tillräckligt länge för ett stopp på 180 varv (); ner (); // sätta ner kameran för att spåra viloläge (1.0); track_set_minarea (200); // använd en mindre minstorlek, eftersom vi är riktade mot den och kommer närmare medan (track_y (backb, 0)> = (center_y-140)) {// medan målet är mindre än y koordinat track_update (); if (track_x (backb, 0) <= (center_x-5)) {// om målet är kvar track_update (); back_right (); // sväng vänster sleep (rest);} annars if (track_x (backb, 0)> = (center_x+5)) {// om målet är rätt track_update (); back_left (); // sväng höger sömn (rest);} annars if (track_x (backb, 0) (center_x-5)) {// om målet är centrerat track_update (); tillbaka (); // gå rakt sömn (vila);}} stopp (); pip(); kasta (); // skjuta sömn (1.0); have_ball = 0; // påminnelse jag kastade bollen och har den inte} start_b (); // tillbaka till bollspårningssömn (1.0); // gör ingenting förrän den här processen dör} void cconnect () {create_connect (); create_full (); // för fullständig kontroll av avsatsgivare create_power_led (0, 255);} // green power ledvoid disconnect () {stop (); // sluta flytta create_disconnect ();} void back_away () {back (); sömn (klar); stop ();} void rotate_l () {create_spin_CCW (speeda); sovdags); stop ();} void rotate_r () {create_spin_CW (speeda); sovdags); 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 (arm, fångad);} void throw () {int a; för (a = 50; a> = 30; a- = 1) {// gör dig redo set_servo_position (arm, a);} set_servo_position (arm, skjut);} void grab () {int a; för (a = 0; a <= håll; a+= 1) {// höj armen smidigt 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 (undvik ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // vänta på att den nuvarande skapandeprocessen är klar och ta prioritet kill_process (pid); CREATE_FREE; // jag är klar stop ();} void avoid_left () {kill (pidb); // stoppa allt annat kill (pidc); avsats (); // plocka upp klo så att den inte fastnar på bordet back_away (); // back back rotate_l (); // rotera bort från hinder redo (); // lägg ner klo igen om (have_ball) {// om jag har bollen start_c ();} // starta målspårning annars om (! har_boll) {// om jag inte har bollen start_b ();} // starta bollspårning} void avoid_right () {döda (pidb); döda (pidc); avsats(); backa(); rotate_r (); redo(); if (have_ball) {start_c ();} annars 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);}

Steg 6: Var det värt det?

Kostnaderna var: Skapa + batteri + doc = $ 260XBC startpaket (xbc, cam, LEGO -klossar, sensorer) = $ 579PVC + färg + skruvar = ca $ 20 Totalkostnad = $ 859 Jag hade redan XBC -startpaket från Botball, så kostnaden för mig var kostnaden för Create. Jag tror att det var värt det, och det bästa är att alla delar jag använde är återanvändbara, om jag kunde ta mig själv att dela ut denna bot. Denna video visar undvik -rutinen, på en bordsskiva. Denna video visar roboten som gör 5 orange bollar i ett mål. Jag hjälpte bara till att påskynda processen, den hade hittat boll 5 så småningom på egen hand.

Steg 7: Slutsats

Slutresultatet är en robot som kan plocka upp och göra orange bollar i ett mål helt på egen hand.

Jag älskade att arbeta med det här projektet. Ju mer jag arbetade med den här roboten desto mer fastnade jag för den. Jag pratar nu med det som om det vore ett husdjur. Jag hoppas att detta har hjälpt dig i ditt nästa projekt. Det finns många människor som jag behöver tacka, men det är för många. Som Bernard av Chartres så elegant uttryckt: "vi är som dvärgar på jättarnas axlar, så att vi kan se mer än de, och saker på större avstånd, inte i kraft av någon skärpa från synen eller någon fysisk skillnad, men för att vi bärs högt och höjs av deras gigantiska storlek."

Rekommenderad: