สารบัญ:

วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน: 7 ขั้นตอน (พร้อมรูปภาพ)
วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน: 7 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: สอนรับไขควงและวิธีใช้ : Build a boat for Treasure 2024, พฤศจิกายน
Anonim
วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน
วิธีสร้างหุ่นยนต์เล่นบาสเก็ตบอลแบบอิสระโดยใช้ IRobot สร้างเป็นฐาน

นี่คือผลงานของฉันสำหรับความท้าทาย iRobot Create ส่วนที่ยากที่สุดของกระบวนการทั้งหมดนี้สำหรับฉันคือการตัดสินใจว่าหุ่นยนต์จะทำอะไร ฉันต้องการแสดงให้เห็นถึงคุณสมบัติเจ๋ง ๆ ของ Create ในขณะเดียวกันก็เพิ่มไหวพริบของหุ่นยนต์ ความคิดทั้งหมดของฉันดูเหมือนจะจัดอยู่ในหมวดหมู่ที่น่าเบื่อแต่มีประโยชน์ หรือเจ๋งและทำไม่ได้ ในท้ายที่สุด เจ๋งและทำไม่ได้จริง ๆ และหุ่นยนต์เล่นบาสเก็ตบอลก็ถือกำเนิดขึ้น หลังจากคิดบางอย่างฉันก็ตระหนักว่าสามารถนำไปใช้ได้จริง สมมติว่าคุณใช้กระดาษสีส้ม และถังขยะทั้งหมดของคุณมีกระดานหลังสีเขียว…

ขั้นตอนที่ 1: รับชิ้นส่วน

เนื่องจากการแข่งขันที่จำกัด เวลาส่วนใหญ่ที่ฉันใช้จึง "นอกชั้นวาง" ชิ้นส่วนหุ่นยนต์ "สต็อก" ที่ใช้: สร้าง (x1) - จาก iRobot www.irobot.comXBC V.3.0 (x1) - จาก Botball www.botball.org สายเคเบิล Create-Roomba (x1) - จาก Botball www.botball.orgServo (x2) -- จาก Botball www.botball.orgSharp rangefinder (x1) -- จาก Botball www.botball.org ตัวต่อ LEGO แบบต่างๆ -- จาก LEGO www.lego.com6-32 machine screws (x4) -- จาก McMaster www.mcmaster.com "สร้างแล้ว" ชิ้นส่วนหุ่นยนต์ที่ใช้: แผ่นพีวีซีอัดหนา 3/8" - สิ่งนี้ยอดเยี่ยมมาก แต่ฉันจำไม่ได้ว่าฉันได้มันมาจากไหน แต่มันเหมือนกับสิ่งนี้ https://www.lynxmotion.com/Category.aspx?CategoryID=62ส่วนอื่นๆ:ลูกบอล POOF สีส้ม -- จาก WalMartBasketball ที่มองหาถังขยะ -- จาก "แป้น" LowesGreen -- พีวีซีพิเศษ ทาสีเขียวสดใส

ขั้นตอนที่ 2: สร้างส่วนที่ไม่ซ้ำ

สร้างส่วนที่ไม่ซ้ำ
สร้างส่วนที่ไม่ซ้ำ

ส่วนเดียวที่ฉันต้องประดิษฐ์คือจานที่ยึดติดกับ Create และเสนอระยะห่างของเลโก้ ช่องว่างของรูอิฐ LEGO นั้นห่างกัน 8 มม. แต่ฉันทำการเว้นวรรคสองครั้งเพื่อประหยัดเวลา พีวีซีอัดรีดนั้นใช้งานง่าย สามารถตัดด้วยมีดเอนกประสงค์ได้ แต่มีความแข็งและแข็งแรง ฉันมักจะหยิบหุ่นยนต์ขึ้นจากจานนี้และฉันก็ยังไม่มีปัญหา

ขั้นตอนที่ 1: ตัดแผ่นเป็น 3.5 "x 9.5" คุณสามารถตัดด้วยมีดยูทิลิตี้ ขั้นตอนที่ 2: เจาะรูเพื่อสร้างสกรู สกรูสร้างสร้างกล่องที่มีขนาด 2 และ 5/8 "x 8 และ 5/8" ขั้นตอนที่ 3: เจาะรูอิฐเลโก้ที่เว้นระยะ ใช้ดอกสว่านขนาด 3/16" และเว้นระยะรูห่างกัน 16 มม. เคล็ดลับ: ฉันวางแผ่นงานในโปรแกรม CAD พิมพ์ขนาดเต็มแล้วติดเทปลงบนแผ่น จากนั้นฉันก็ใช้เป็นแนวทางในการตัดและ การขุดเจาะ

ขั้นตอนที่ 3: การประกอบหุ่นยนต์

การประกอบหุ่นยนต์
การประกอบหุ่นยนต์
การประกอบหุ่นยนต์
การประกอบหุ่นยนต์
การประกอบหุ่นยนต์
การประกอบหุ่นยนต์

ฉันสนุกกับการสร้างสิ่งต่าง ๆ ให้เรียบง่ายที่สุด ด้วยวิธีนี้เมื่อพวกเขากระโดดออกจากโต๊ะคุณไม่จำเป็นต้องสร้างใหม่มากนัก!

1. ขันแผ่นแบบใหม่เข้ากับด้านบนของ Create 2. สร้างแขนเพื่อจับลูกบอล 3. สร้างแขนเพื่อจับกล้อง 4. สร้างที่ยึดสำหรับ rangefinder 5. ติดตั้ง XBC และเชื่อมต่อสายเคเบิลทั้งหมด

ขั้นตอนที่ 4: การเขียนโปรแกรมหุ่นยนต์

ฉันตัดสินใจใช้ XBC เป็นตัวควบคุมของฉันเป็นหลักเนื่องจากมีการติดตามสีในตัว เนื่องจากฉันตัดสินใจใช้ XBC เป็นสมองของการดำเนินการ ฉันจึงตั้งโปรแกรมหุ่นยนต์ของฉันใน Interactive C หรือที่ฉันเรียกว่า IC IC ใช้งานได้ฟรีและสามารถดาวน์โหลดได้ที่ www.botball.org IC นั้นคล้ายกับ C++ มาก แต่มีหลายไลบรารีในตัว ปรากฎว่า David Miller จากมหาวิทยาลัยโอคลาโฮมาได้เขียนห้องสมุดสำหรับ Create ซึ่งสามารถดาวน์โหลดได้จากหน้าเว็บของเขาที่ https://i-borg.engr.ou.edu/~dmiller/create/ ด้วยทรัพยากรเหล่านั้นและคู่มือสำหรับการสร้าง ฉันก็พร้อมที่จะตั้งโปรแกรม แต่ความท้าทายใหญ่ต่อไปคือสิ่งที่ฉันต้องการให้มันทำ? ฉันต้องการหุ่นยนต์ที่สามารถไปหยิบลูกบอลสีส้มและทำคะแนนในตะกร้าได้ เป้าหมายของฉันฟังดูง่าย และอาจจะเรียบง่าย แต่ยิ่งฉันได้ในสิ่งที่ Create สามารถทำได้ ฉันก็ยิ่งต้องการให้มันทำมากขึ้น รายการสุดท้ายของฉันมีลักษณะดังนี้:1. ค้นหาลูกบอลสีส้ม2. รับลูกบอลสีส้ม3. ค้นหาตะกร้า4. วางลูกในตะกร้าในขณะที่1. หลีกเลี่ยงวัตถุ2. ไม่ตกอะไร(เหมือนโต๊ะ)3. การตรวจจับการชาร์จแบตเตอรี่และการเชื่อมต่อกับฐานหลักเมื่อ lowOh และทั้งหมดนี้ทำงานโดยอัตโนมัติโดยสมบูรณ์ หมายความว่าทั้งหมดได้รับการตั้งโปรแกรมไว้ล่วงหน้า

ขั้นตอนที่ 5: รหัส

มันอาจจะยุ่ง แต่ใช้งานได้#use "createlib.ic"#use "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et port/*สายเคเบิล create ยังต้องเสียบปลั๊ก แจ็คไฟ ปลั๊ก 3 ง่ามเข้ากับพอร์ต 8 และอีกอันที่มีป้ายกำกับ UX ลงใน JP 28 (ถัดจากพอร์ต USB) โดยให้ U หันไปทางกล้อง*/ #define c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#define caught 27//arm servo position เพื่อไม่ให้ถูกจับบนโต๊ะ#define shoot 150//servo Throw ball#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 inrange 30//track_y พิกัดเมื่อลูกอยู่ในกรงเล็บ#กำหนดลูก 0//ช่องของลูกบอลสีส้ม#define ball_x (track_x(ball, 0))//x พิกัดของลูกบอล#define ball_y (track_y(ball, 0))//y พิกัดของลูกบอล#define ช้า 100//ความเร็วช้า มอเตอร์#กำหนดเร็ว175//ความเร็วมอเตอร์เร็ว#กำหนดชัด 0.2//วินาที กระโดดถอยหลังจากสิ่งกีดขวาง#กำหนดเวลา 0.5 //1.0 คือเลี้ยวขวา 90 องศา#กำหนดส่วนที่เหลือ 0.05//เวลาเข้านอนขณะติดตาม blobs#define speeda 175 //ความเร็วของการหลีกเลี่ยงเลี้ยว#define back_s -200//speed to ถอยห่างจากวัตถุกระแทก#กำหนดตรง 32767//ขับเป็นเส้นตรง#กำหนดแบ็ค 2//ช่องสีหลักของกระดานหลัง#กำหนดสี่เหลี่ยม 1//ช่องสีเน้นแป้นหลัง#กำหนด track_d 250//ตำแหน่งกล้องสำหรับติดตามเป้าหมาย# กำหนด track_find 70//ตำแหน่งกล้องสำหรับการติดตามระยะไกล#define reverse 2.25//sleep time for a 180#define back_f -150//back fast speed#define back_sl -125//back slow speed#define center_x 178//true x center ของ cam#define center_y 146//true y center ของ camint pida;// หลีกเลี่ยง processint pidb;// track processint pidc;//score processint have_ball = 0;// บอกฟังก์ชันที่เราหลีกเลี่ยง main(){ long ch; enable_servos();//enable servos init_camera();//start camera cconnect();//connect to create with full control start_a();//start forget function start_b();//start ball_tracking function while(1) { if(r_button()||gc_ldrop||gc_rdrop){// ถ้าหยิบขึ้นมาหรือ r ปุ่มไหล่ kill (pida); ฆ่า (pidb); ฆ่า (pidc); disable_servos(); ตัดการเชื่อมต่อ (); แตก;} create_battery_charge(); display_clear(); printf("ชาร์จ = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); ฆ่า(pidb); ฆ่า(pidc); โยน(); have_ball=0; create_demo(1); ในขณะที่(b_button()); ในขณะที่(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("ชาร์จ = %l\n", gc_battery_charge); สลีป(1.0);} cconnect(); กลับ(); สลีป(2.0); start_a(); start_b();} }}เป็นโมฆะหลีกเลี่ยง (){ ในขณะที่ (1){//ทำซ้ำตลอดไป create_sensor_update();// อัปเดตค่าเซ็นเซอร์ทั้งหมด //create_drive (speeda ตรง); if(gc_lbump==1){//left bump avoid_right();}//เลี้ยวขวาเพื่อหลีกเลี่ยงการ if(gc_rbump==1){//right bump avoid_left();}//เลี้ยวซ้ายเพื่อหลีกเลี่ยง 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 หน้าผา avoid_right();} else if(gc_rcliff==1){//right Cliff avoid_left();} }}เป็นโมฆะ track_ball(){ kill(pidc); while(!have_ball){//ทำซ้ำจนกว่าจะได้บอล track_update(); far();//set the camera ready();//set the arm while(et<255){//จนกว่าค่าสูงสุดจะเกิดขึ้นเมื่อลูกบอลถูกจับ track_update();//update ภาพจากกล้อง if(ball_x<=(center-5)){// ถ้าลูกบอลอยู่ทางซ้าย track_update(); create_drive_direct(ช้า,เร็ว);//เลี้ยวซ้าย sleep(rest);} else if(ball_x>=(center+5)){//ถ้าลูกบอลอยู่ทางขวา track_update(); create_drive_direct(เร็ว, ช้า);// เลี้ยวขวา sleep(rest);} else if(ball_x(center-5))){// ถ้าลูกบอลอยู่ตรงกลาง track_update(); create_drive_straight(เร็ว);//หลับสนิท(พักผ่อน);} } คว้า ();// คว้าลูกบอลบี๊บ ();// หยุดส่งเสียง ();// หยุดขับรถ have_ball=1;// สังเกตว่า ฉันมีลูกบอล } start_c();//find the basket sleep(1.0);//sleep เพื่อที่ฉันจะไม่ทำอะไรเมื่อถูกฆ่า}เป็นโมฆะ find_basket(){ kill(pidb);//kill ball ติดตามกระบวนการ find();//put camera up track_set_minarea(1000);// backboard มีขนาดใหญ่ ดังนั้นให้มองหา blobs ขนาดใหญ่ในขณะที่ (have_ball){// ในขณะที่ฉันมี ball track_update(); ในขณะที่(track_x(backb, 0)=(center_x+20)){//ในขณะที่ไม่อยู่กึ่งกลาง track_update(); if(track_x(backb, 0)>=(center_x+20))){//ถ้าแป้น backboard ซ้าย track_update(); create_spin_CCW(100);}//เลี้ยวซ้าย else if(track_x(backb, 0)<=(center_x-20)){//ถ้าแป้น backboard ถูกต้อง track_update(); create_spin_CW(300-center_x);}// เลี้ยวขวาช้าๆ เมื่อใกล้ถึงศูนย์กลาง } stop(); while(track_size(backb, 0)<=(6000)){//ในขณะที่เป้าหมายมีขนาดเล็กกว่า 6000 พิกเซลในขนาด track_update(); if(track_x(backb, 0)<=(center_x-5)){//ถ้าเป้าหมายถูกปล่อย track_update(); create_drive_direct(ช้า, เร็ว);//เลี้ยวซ้าย sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//ถ้าเป้าหมายถูกต้อง track_update(); create_drive_direct(เร็ว, ช้า);// เลี้ยวขวา sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// ถ้าเป้าหมายอยู่ตรงกลาง track_update(); create_drive_straight(เร็ว);//หลับไปทันที(พักผ่อน);} } หยุด (); //create_drive_straight(เร็ว);// ขยับเข้าไปใกล้อีกนิด //sleep(1.0); //หยุด(); สลีป(1.0); create_spin_CW(speeda);//spin right sleep(reverse);//นอนให้นานพอสำหรับการหยุด 180 รอบ(); down();// วางกล้องลงเพื่อติดตาม backboard sleep(1.0); track_set_minarea(200);//ใช้ขนาดต่ำสุดที่เล็กกว่า เนื่องจากเราจะชี้ไปที่มันและเข้าใกล้มากขึ้นในขณะที่(track_y(backb, 0)>=(center_y-140)){//ในขณะที่เป้าหมายน้อยกว่า y พิกัด track_update(); if(track_x(backb, 0)<=(center_x-5)){//ถ้าเป้าหมายถูกปล่อย track_update(); back_right();//turn left sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//ถ้าเป้าหมายถูกต้อง track_update(); back_left();// เลี้ยวขวา sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// ถ้าเป้าหมายอยู่กึ่งกลาง track_update(); back();//ไป นอน(พักผ่อน);} } หยุด(); เสียงบี๊บ (); โยน (); // ยิงสลีป (1.0); have_ball=0;//เตือนความจำ ฉันขว้างลูกบอลแล้วไม่มี } start_b();//กลับไปที่ ball tracking sleep(1.0);//อย่าทำอะไรจนกว่ากระบวนการนี้จะตาย}เป็นโมฆะ cconnect(){ create_connect (); create_full();//สำหรับการควบคุมเต็มรูปแบบของเซ็นเซอร์หิ้ง create_power_led(0, 255);}//ไฟเขียว ledvoid ตัดการเชื่อมต่อ(){ stop();//หยุดการเคลื่อนย้าย create_disconnect();}void back_away(){ back(); นอนหลับ(ชัดเจน); หยุด();}เป็นโมฆะrotation_l(){ create_spin_CCW(speeda); เวลานอน); หยุด();}เป็นโมฆะrotation_r(){ create_spin_CW(speeda); เวลานอน); หยุด();}เป็นโมฆะ หยุด(){ create_drive(0,ตรง);}โมฆะกลับ(){ create_drive(back_s, ตรง);}เป็นโมฆะพร้อม(){ set_servo_position(แขน, a_down);}ตรวจสอบเป็นโมฆะ(){ set_servo_position (cam, track_c);}void far(){ set_servo_position(cam, track_f);}void ledge(){ set_servo_position(arm, catch);}การขว้างเป็นโมฆะ(){ int a; for(a=50; a>=30; a-=1){//get ready set_servo_position(arm, a);} set_servo_position(arm, shoot);}เป็นโมฆะคว้า(){ int a; for(a=0; a<=hold; a+=1){// ยกแขนขึ้นอย่างราบรื่น 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(){ pida = start_process(find_basket());}เป็นโมฆะ kill(int pid){ CREATE_BUSY;//รอให้กระบวนการสร้างปัจจุบันเสร็จสิ้น และใช้ลำดับความสำคัญ kill_process(pid); CREATE_FREE;//ฉันเสร็จแล้ว stop();}void avoid_left(){ kill(pidb);//stop all else kill(pidc); หิ้ง();//หยิบกรงเล็บขึ้นมาเพื่อไม่ให้ติดโต๊ะ back_away();//ถอยกลับออกไปrotator_l();//หมุนออกจากสิ่งกีดขวางพร้อม();//วางกรงเล็บกลับลงถ้า(มี_บอล) {//ถ้าฉันมีลูกบอล start_c();}//เริ่มติดตามเป้าหมายอื่น if(!have_ball){// ถ้าฉันไม่มีลูกบอล start_b();}//start ball tracking}void avoid_right() { ฆ่า (pidb); ฆ่า(pidc); หิ้ง(); back_away(); หมุน_r(); พร้อม(); 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: มันคุ้มค่าไหม

ค่าใช้จ่ายคือ:สร้าง + แบตเตอรี่+ doc = 260 ดอลลาร์ XBC ชุดเริ่มต้น (xbc, กล้อง, อิฐเลโก้, เซ็นเซอร์) = 579 ดอลลาร์ PVC + สี + สกรู = ประมาณ 20 ดอลลาร์ ค่าใช้จ่ายทั้งหมด = 859 ดอลลาร์ฉันมีชุดเริ่มต้น XBC จาก Botball แล้ว ดังนั้นค่าใช้จ่าย สำหรับฉันคือต้นทุนของ Create ฉันคิดว่ามันคุ้มค่า และส่วนที่ดีที่สุดคือทุกส่วนที่ฉันใช้นั้นสามารถนำกลับมาใช้ใหม่ได้ ถ้าฉันสามารถนำตัวเองออกจากบอทนี้ได้ วิดีโอนี้แสดงการหลีกเลี่ยงรูทีนย่อย, บนโต๊ะ วิดีโอนี้แสดงหุ่นยนต์ทำประตูได้ 5 ลูกสีส้ม ฉันแค่ช่วยเร่งกระบวนการไปเรื่อย ๆ มันจะพบลูกบอล 5 ในที่สุดด้วยตัวมันเอง

ขั้นตอนที่ 7: บทสรุป

ผลสุดท้ายคือหุ่นยนต์ที่สามารถหยิบและยิงลูกบอลสีส้มเข้าประตูได้ด้วยตัวเอง

ฉันชอบทำงานในโครงการนี้ ยิ่งฉันทำงานกับหุ่นยนต์ตัวนี้มากเท่าไหร่ ฉันก็ยิ่งผูกพันกับมันมากขึ้นเท่านั้น ตอนนี้ฉันคุยกับมันราวกับว่ามันเป็นสัตว์เลี้ยง ฉันหวังว่าสิ่งนี้จะช่วยคุณในโครงการต่อไปของคุณ มีคนมากมายที่ฉันอยากจะขอบคุณ แต่ก็มีมากเกินไป ดังที่เบอร์นาร์ดแห่งชาตร์กล่าวไว้อย่างสง่างามว่า “เราเป็นเหมือนคนแคระบนไหล่ของยักษ์ เพื่อที่เราจะได้มองเห็นมากกว่าพวกมัน และสิ่งต่าง ๆ ในระยะไกล มิใช่เพราะความเฉียบแหลมในการมองเห็นของเรา หรือทางกายภาพใดๆ แตกต่างแต่เพราะเราถูกยกให้สูงขึ้นและเติบโตด้วยขนาดที่ใหญ่โต"

แนะนำ: