Inhoudsopgave:
- Stap 1: Onderdelen verkrijgen
- Stap 2: Maak het unieke onderdeel
- Stap 3: De robot in elkaar zetten
- Stap 4: Programmeren van de robot
- Stap 5: Coderen
- Stap 6: Was het het waard?
- Stap 7: Conclusie
Video: Hoe maak je een autonome basketbal spelende robot met behulp van een IRobot Create als basis - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:19
Dit is mijn inzending voor de iRobot Create-uitdaging. Het moeilijkste deel van dit hele proces voor mij was om te beslissen wat de robot ging doen. Ik wilde de coole functies van de Create demonstreren en tegelijkertijd wat robo-flair toevoegen. Al mijn ideeën leken te vallen in de categorie saai maar nuttig, of cool en onpraktisch. Uiteindelijk won cool en onpraktisch en werd de basketbal spelende robot geboren. Na enig nadenken realiseerde ik me dat dit praktisch zou kunnen zijn. Stel dat u oranje papier gebruikt en dat al uw vuilnisbakken groene achterborden hebben…
Stap 1: Onderdelen verkrijgen
Vanwege de tijdslimiet van de wedstrijd waren de meeste onderdelen die ik gebruikte "van de plank". Gebruikte "voorraad" robotonderdelen: maken (x1) -- van iRobot www.irobot.comXBC V.3.0 (x1) -- van Botball www.botball.orgCreate-Roomba-kabel (x1) -- van Botball www.botball.orgServo (x2) -- van Botball www.botball.org Scherpe afstandsmeter (x1) -- van Botball www.botball.org Diverse LEGO stenen -- van LEGO www.lego.com6-32 machineschroeven (x4) -- van McMaster www.mcmaster.com "Created" Robot Onderdelen Gebruikt: 3/8 "dik geëxtrudeerde PVC-plaat - dit spul is geweldig, maar ik kan me niet herinneren waar ik het vandaan heb, maar het is net als dit spul https://www.lynxmotion.com/Category.aspx?CategoryID=62Overige onderdelen:Oranje "POOF" bal -- van WalMartBasketbal lijkt op vuilnisbak -- van LowesGreen "bord" -- extra PVC felgroen geverfd
Stap 2: Maak het unieke onderdeel
Het enige onderdeel dat ik moest fabriceren was een plaat die aan de Create was vastgeschroefd en LEGO-afstand bood. De afstand tussen de gaten van de LEGO-stenen is 8 mm uit elkaar, maar ik heb een dubbele afstand gedaan om tijd te besparen. Het geëxtrudeerde PVC is een makkie om mee te werken. Het kan worden gesneden met een mes, maar is stijf en sterk. Ik pak de robot vaak op bij dit bord en ik heb nog geen probleem gehad.
Stap 1: Snijd het vel op 3,5 "x 9,5", je kunt dit snijden met een mes. Stap 2: Boor de gaten voor de gemaakte schroeven. De maakschroeven maken een doos van 2 en 5/8 "bij 8 en 5/8". Stap 3: Boor de gaten in de LEGO-stenen. Gebruik een boor van 3/16" en ik plaatste de gaten 16 mm uit elkaar. Tip: ik legde het vel in een CAD-programma, drukte het op ware grootte af en plakte het op het vel. Daarna gebruikte ik dit als richtlijn voor het snijden en boren.
Stap 3: De robot in elkaar zetten
Ik vind het leuk om dingen zo eenvoudig mogelijk te bouwen, zodat wanneer ze van de tafel springen, je niet zo veel hoeft te herbouwen!
1. Schroef de nieuw gevormde plaat op de bovenkant van de Create 2. Bouw een arm om de bal te grijpen 3. Bouw een arm om de camera vast te houden 4. Bouw een houder voor de afstandsmeter 5. Monteer de XBC en sluit alle kabels aan
Stap 4: Programmeren van de robot
Ik besloot de XBC als mijn controller te gebruiken, voornamelijk vanwege de ingebouwde kleurtracking. Omdat ik besloot om met de XBC als het brein van de operatie te werken, programmeerde ik mijn robot in Interactive C, of zoals ik het IC noem. IC is gratis te gebruiken en kan worden gedownload op www.botball.org. IC lijkt erg op C++, maar heeft verschillende ingebouwde bibliotheken. Het blijkt dat David Miller van de Universiteit van Oklahoma een bibliotheek heeft geschreven voor de Create die kan worden gedownload van zijn pagina op https://i-borg.engr.ou.edu/~dmiller/create/. Met die bronnen en de handleidingen voor de creatie was ik klaar om te programmeren. Maar de volgende grote uitdaging was: wat wilde ik dat het deed? Ik wilde een robot die oranje ballen kon oppakken en in een mandje kon scoren. Mijn doel klonk eenvoudig, en had waarschijnlijk ook simpel kunnen zijn, maar hoe meer ik me verdiepte in wat de Create kon doen, hoe meer ik wilde dat het deed. Mijn definitieve lijst zag er als volgt uit: 1. Vind oranje bal2. Neem oranje ball3 op. Zoek mandje4. Leg de bal in basketWhile1. Voorwerpen vermijden 2. Niet van iets vallen (zoals een tafel) 3. Detectie van de lading van de batterij en docking met de thuisbasis wanneer deze bijna leeg is Oh, en dit alles is volledig autonoom, wat betekent dat het allemaal voorgeprogrammeerd is.
Stap 5: Coderen
Het is misschien rommelig, maar het werkt.#use "createlib.ic"#use "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et-poort/*De create-kabel moet ook worden aangesloten. De stroomaansluiting, de 3-polige plug in poort 8 en die met het label UX in JP 28 (naast de USB-poort) met de U naar de camera*/ #define c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#definieer gevangen 27//arm servo positie om te voorkomen dat deze op tafel wordt gepakt#define shoot 150//servo bal gooien#define track_c 25//camera servo track close position#define track_f 45//camera servo track far position#define center 120//center of camera vision#define binnenbereik 30//track_y coördinaat wanneer de bal in de klauw is#definieer bal 0//kanaal van oranje bal#define ball_x (track_x(ball, 0))//x coordinate of ball#define ball_y (track_y(ball, 0))//y coordinate of ball#define slow 100//speed of slow motor#definieer snel 175//snelheid van snelle motor#definieer duidelijk 0.2//s leep om achteruit te gaan van obstakels#definieer tijd 0,5 //1,0 is een bocht van 90 graden naar rechts#definieer rust 0,05//tijd om te slapen tijdens het volgen van blobs#definieer snelheida 175//snelheid van vermijden bocht#definieer terug_s -200//snelheid naar achteruit weg van gestoten object#definieer recht 32767//rijd in een rechte lijn#definieer de achtergrondb 2//kanaal van de hoofdkleur van het bord#definieer vierkant 1//kanaal van de kleur van het bordaccent#definieer track_d 250//camerapositie voor het volgen van doel# definieer track_find 70//camerapositie voor lange tracking#definieer achteruit 2.25//slaaptijd voor een 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;//vertelt welke functie we factureren main(){ long ch; enable_servos();//servo's inschakelen init_camera();//start camera cconnect();//connect om te creëren met volledige controle start_a();//start vermijden functie start_b();//start ball_tracking functie while(1) {if(r_button()||gc_ldrop||gc_rdrop){//if opgepikt of r shoulder button kill(pida); doden (pidb); doden (pidc); uitschakelen_servo's(); Loskoppelen(); breken;} create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); doden (pidb); doden (pidc); gooien(); 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); slaap(1.0);} cconnect(); rug(); slaap(2.0); begin een(); start_b();} }}void avoid(){ while(1){//repeat forever create_sensor_update();//update alle sensorwaarden //create_drive (speeda, straight); if(gc_lbump==1){//links bump avoid_right();}//draait naar rechts om else te vermijden if(gc_rbump==1){//right bump avoid_left();}//draait naar links om else te vermijden if(gc_lfcliff==1){//left front cliff avoid_right();} else if(gc_rfcliff==1){//right front cliff avoid_left();} else if(gc_lcliff==1){//left cliff avoid_right();} else if(gc_rcliff==1){//right cliff avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//herhaal tot bal track_update(); far();// zet de camera gereed();// zet de arm while(et<255){//tot de maximale waarde gebeurt wanneer de bal wordt gevangen track_update();//update camerabeeld if(ball_x<=(center-5)){//als de bal links is track_update(); create_drive_direct(langzaam, snel);//naar links slapen (rust);} else if(ball_x>=(center+5)){//if de bal goed is track_update(); create_drive_direct(snel, langzaam);// sla rechtsaf slaap(rust);} else if(ball_x(center-5)){// als de bal gecentreerd is track_update(); create_drive_straight(fast);//go straight sleep(rest);} } grab();//grab ball beep();//make noise stop();//stop rijden have_ball=1;// noteer dat Ik heb bal } start_c();//find the basket sleep(1.0);//slaap zodat ik niets doe als ik vermoord word} ongeldig find_basket(){ kill(pidb);//kill ball tracking proces find();//put camera up track_set_minarea(1000);//het bord is groot, dus zoek alleen naar grote blobs while (have_ball){//while I have the ball track_update(); while(track_x(backb, 0)=(center_x+20)){//while niet gecentreerd track_update(); if(track_x(backb, 0)>=(center_x+20)){//als het bord links is track_update(); create_spin_CCW(100);}// sla linksaf else if(track_x(backb, 0)<=(center_x-20)){//if het bord rechts is track_update(); create_spin_CW(300-center_x);}// sla rechtsaf en vertraag als het centrum nadert } stop(); while(track_size(backb, 0)<=(6000)){//terwijl het doel kleiner is dan 6000 pixels track_update(); if(track_x(backb, 0)<=(center_x-5)){//if het doel is links track_update(); create_drive_direct(langzaam, snel);//naar links slapen (rust);} else if(track_x(backb, 0)>=(center_x+5)){//if het doel rechts is track_update(); create_drive_direct(snel, langzaam);// sla rechtsaf slaap(rust);} else if(track_x(backb, 0)(center_x-5)){// als het doel gecentreerd is track_update(); create_drive_straight(fast);//go straight sleep(rust);} } stop(); //create_drive_straight(fast);// kom een beetje dichterbij //sleep(1.0); //stop(); slaap(1.0); create_spin_CW(speeda);//spin rechts slaap (achteruit);//slaap lang genoeg voor een stop van 180 beurten(); down();// zet de camera neer om de slaap van het bord te volgen (1.0); track_set_minarea(200);//gebruik een kleinere minimale grootte, omdat we erop gericht zijn en dichterbij komen while(track_y(backb, 0)>=(center_y-140)){//terwijl het doel kleiner is dan de y coördinaat track_update(); if(track_x(backb, 0)<=(center_x-5)){//if het doel is links track_update(); back_right();//draai links slaap(rust);} else if(track_x(backb, 0)>=(center_x+5)){//if het doel is rechts track_update(); back_left();// sla rechtsaf sleep(rust);} else if(track_x(backb, 0)(center_x-5)){// als het doel gecentreerd is track_update(); back();//ga rechtdoor slapen (rust);} } stop(); piep(); throw();//shoot sleep(1.0); have_ball=0;//herinnering ik heb de bal gegooid en heb hem niet} start_b();//back to ball tracking sleep(1.0);//doe niets totdat dit proces sterft} void cconnect(){ create_connect (); create_full();//voor volledige controle van richelsensoren create_power_led(0, 255);}//green power ledvoid disconnect(){ stop();//stop bewegen create_disconnect();}void back_away(){ back(); slapen (helder); stop();}void rotary_l(){ create_spin_CCW(speeda); bedtijd); stop();}void rotary_r(){ create_spin_CW(speeda); bedtijd); 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, gevangen);}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){//arm soepel omhoog 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;//wacht tot het huidige aanmaakproces is voltooid, en neem prioriteit kill_process(pid); CREATE_FREE;//ik ben klaar stop();}void avoid_left(){ kill(pidb);//stop al het andere kill(pidc); richel();// pak de klauw op zodat deze niet vast komt te zitten op de tafel back_away();//back away rotary_l();//roteer weg van obstakel klaar();//zet de klauw terug naar beneden if(have_ball) {//if ik heb de bal start_c();}//start goal tracking else if(!have_ball){//if ik heb de bal niet start_b();}//start ball tracking}void avoid_right() { doden (pidb); doden (pidc); richel(); terugdeinzen(); roteer_r(); klaar(); 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);}
Stap 6: Was het het waard?
De kosten waren: Maken + batterij + doc = $ 260XBC-startpakket (xbc, cam, LEGO-stenen, sensoren) = $ 579 PVC + verf + schroeven = ongeveer $ 20 Totale kosten = $ 859 Ik had al de XBC-starterkit van Botball, dus de kosten voor mij waren de kosten van de Create. Ik denk dat het het waard was, en het beste deel is dat alle onderdelen die ik heb gebruikt herbruikbaar zijn, als ik mezelf ertoe kon brengen deze bot uit elkaar te halen. Deze video toont de subroutine 'vermijden', op een tafelblad. Deze video laat zien hoe de robot 5 oranje ballen in een doel scoort. Ik heb alleen geholpen om het proces te versnellen, het zou bal 5 uiteindelijk vanzelf hebben gevonden.
Stap 7: Conclusie
Het eindresultaat is een robot die helemaal alleen oranje ballen kan oppakken en scoren in een doel.
Ik vond het geweldig om aan dit project te werken. Hoe meer ik aan deze robot werkte, hoe meer ik eraan gehecht raakte. Ik praat er nu tegen alsof het een huisdier is. Ik hoop dat dit je heeft geholpen bij je volgende project. Er zijn veel mensen die ik moet bedanken, maar het zijn er te veel. Zoals Bernard van Chartres zo elegant zei: "we zijn als dwergen op de schouders van reuzen, zodat we meer kunnen zien dan zij, en dingen op grotere afstand, niet vanwege enige scherpte van onze kant, of enige fysieke onderscheid, maar omdat we hoog worden gedragen en opgevoed door hun gigantische omvang."
Aanbevolen:
Arduino-robot met afstand, richting en rotatiegraad (oost, west, noord, zuid) spraakgestuurd met behulp van Bluetooth-module en autonome robotbeweging: 6 stappen
Arduino-robot met afstand, richting en rotatiegraad (oost, west, noord, zuid) bestuurd door spraak met behulp van Bluetooth-module en autonome robotbeweging. , Links, Rechts, Oost, West, Noord, Zuid) vereiste afstand in centimeters met spraakopdracht. Robot kan ook autonoom worden verplaatst
Toegang krijgen tot een extern rootbestandssysteem met behulp van DB410 als een Ethernet-dongle: 6 stappen
Toegang krijgen tot het externe rootbestandssysteem met behulp van DB410 als een Ethernet-dongle: Doelstellingen: Installeer de toolchain en hercompileer de kernel om ondersteuning voor USB Ethernet CDC-gadgets in te voegen; Maak boot.img opnieuw van Linaro om USB Ethernet CDC op te starten; Maak een NFS-server om het rootbestandssysteem te hosten; IP-configuratie in DEVICE en HOST
Hoe een omvormer met LCD-achtergrondverlichting te repareren Met behulp van een Fujiplus FP-988D. voor $0.: 9 stappen
Hoe een omvormer met LCD-achtergrondverlichting te repareren Met behulp van een Fujiplus FP-988D. voor $ 0.: In deze instructie zal ik je helpen bij het repareren van een dode lcd-backlight-omvormer met behulp van de onderdelen die je hebt. U kunt zien of u een dode achtergrondverlichting heeft door eerst andere mogelijkheden te elimineren. Controleer de monitor op meerdere computers. Zorg ervoor dat d
Maak een webverbonden robot (voor ongeveer $ 500) (met behulp van een Arduino en netbook): 6 stappen (met afbeeldingen)
Maak een webverbonden robot (voor ongeveer $ 500) (met behulp van een Arduino en netbook): deze Instructable laat u zien hoe u uw eigen webverbonden robot kunt bouwen (met behulp van een Arduino-microcontroller en Asus eee pc). Waarom zou u een web willen Verbonden robot? Om mee te spelen natuurlijk. Rij met je robot van de andere kant van de kamer of over de tel
Hoe maak je een grootouderskalender & Plakboek (zelfs als je niet weet hoe je plakboek moet maken): 8 stappen (met afbeeldingen)
Hoe maak je een grootouderskalender & Plakboek (zelfs als je niet weet hoe je plakboek moet maken): Dit is een zeer voordelig (en zeer gewaardeerd!) kerstcadeau voor grootouders. Ik heb dit jaar 5 kalenders gemaakt voor minder dan $7 per stuk.Materialen:12 geweldige foto's van je kind, kinderen, nichten, neven, honden, katten of andere familieleden12 verschillende stukken