Სარჩევი:

როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც საფუძველი: 7 ნაბიჯი (სურათებით)
როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც საფუძველი: 7 ნაბიჯი (სურათებით)

ვიდეო: როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც საფუძველი: 7 ნაბიჯი (სურათებით)

ვიდეო: როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც საფუძველი: 7 ნაბიჯი (სურათებით)
ვიდეო: როგორ გავაკეთოთ კალათბურთის საკმაოდ კარგი მოედანი 2024, ივლისი
Anonim
როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც ბაზა
როგორ გავაკეთოთ ავტონომიური კალათბურთი რობოტი IRobot– ის გამოყენებით შექმენით როგორც ბაზა

ეს არის ჩემი ჩანაწერი iRobot შექმნა გამოწვევისთვის. ამ პროცესის ყველაზე რთული ნაწილი იყო ჩემთვის იმის გადაწყვეტა, თუ რას აპირებდა რობოტი. მინდოდა წარმომედგინა შემოქმედების მაგარი თვისებები, ამასთანავე შემემატებინა რაღაც რობო. როგორც ჩანს, ჩემი ყველა იდეა მიეკუთვნება მოსაწყენი, მაგრამ სასარგებლო, ან მაგარი და არაპრაქტიკულს. ბოლოს მაგარი და არაპრაქტიკული მოიგო და დაიბადა კალათბურთის მოთამაშე რობოტი. გარკვეული ფიქრის შემდეგ მივხვდი, რომ ეს შეიძლება იყოს პრაქტიკული. დავუშვათ, რომ თქვენ იყენებთ ნარინჯისფერ ქაღალდს და რომ ყველა თქვენს ნაგვის ურნას აქვს მწვანე დაფები…

ნაბიჯი 1: შეიძინეთ ნაწილები

კონკურსის დროის ლიმიტის გამო, ნაწილების უმეტესობა, რომელიც მე გამოვიყენე, იყო "თაროდან გასული". "საფონდო" რობოტის ნაწილები მეორადი: შექმნა (x1)-iRobot– დან www.irobot.com– დან XBC V.3.0 (x1)-ბოტბოლიდან www.botball.org შექმენით რუმბას კაბელი (x1)-ბოტბოლიდან www.botball.orgServo (x2)-Botball– დან www.botball.org მკვეთრი დიაპაზონი (x1)-Botball– დან www.botball.org ასორტირებული LEGO აგური-LEGO– დან www.lego.com– დან 6-32 მანქანა ხრახნები (x4)-McMaster– დან www.mcmaster.com "შექმნილია" რობოტის ნაწილები მეორადი: 3/8 "სქელი ექსტრუდირებული PVC ფურცელი - ეს პერსონალი გასაოცარია, მაგრამ არ მახსოვს საიდან მივიღე, მაგრამ ეს ზუსტად ისეთია, როგორიც არის ეს

ნაბიჯი 2: შექმენით უნიკალური ნაწილი

შექმენით უნიკალური ნაწილი
შექმენით უნიკალური ნაწილი

ერთადერთი ნაწილი, რომლის დამზადებაც მომიწია, იყო ფირფიტა, რომელიც მიმაგრებულია Creat- ში და გვთავაზობს LEGO ინტერვალს. LEGO აგურის ხვრელებს შორის მანძილი 8 მმ -ია, მაგრამ მე გავაკეთე ორმაგი ინტერვალი დროის დაზოგვის მიზნით. ექსტრუდირებული PVC არის ნიავი სამუშაოდ. მისი გაჭრა შესაძლებელია სასარგებლო დანით, მაგრამ ხისტი და ძლიერია. მე ხშირად ვიღებ რობოტს ამ თეფშით და პრობლემა ჯერ არ მქონია.

ნაბიჯი 1: გაჭერით ფურცელი 3.5 "x 9.5" - ზე, შეგიძლიათ გაჭრათ სასარგებლო დანით. ნაბიჯი 2: საბურღი ხვრელები შექმნის ხრახნები. ხრახნები ქმნიან ყუთს, რომელიც არის 2 და 5/8 "8 და 5/8". ნაბიჯი 3: გაბურღეთ LEGO აგურის შუალედში არსებული ხვრელები. გამოიყენეთ 3/16 "საბურღი და მე გავხსენი ხვრელები 16 მმ -იანი დაშორებით. რჩევა: მე დავდე ფურცელი CAD პროგრამაში, დავბეჭდე იგი სრული ზომით და ჩავწერე ფურცელზე. შემდეგ გამოვიყენე ეს როგორც სახელმძღვანელო ჭრისა და ბურღვა.

ნაბიჯი 3: რობოტის აწყობა

რობოტის აწყობა
რობოტის აწყობა
რობოტის აწყობა
რობოტის აწყობა
რობოტის აწყობა
რობოტის აწყობა

მე მსიამოვნებს ნივთების აგება რაც შეიძლება მარტივად, ისე, რომ როდესაც ისინი გადმოხტება მაგიდიდან თქვენ არ გჭირდებათ იმდენი აღორძინება!

1. დააწებეთ ახლად მოპარული ფირფიტა შექმნის თავზე 2. ააწყვეთ ხელი ბურთის დასაჭერად 3. ააშენეთ ხელი კამერის დასაჭერად 4. ააშენეთ მთა დისტანციის მაძიებლისთვის 5. დაამონტაჟეთ XBC და შეაერთეთ ყველა კაბელი

ნაბიჯი 4: რობოტის დაპროგრამება

მე გადავწყვიტე გამოვიყენო XBC, როგორც ჩემი კონტროლერი, ძირითადად იმის გამო, რომ იგი იყო ინტეგრირებული ფერადი თვალთვალისთვის. იმის გამო, რომ მე გადავწყვიტე XBC– ით, როგორც ოპერაციის ტვინი, მე დავპროგრამე ჩემი რობოტი ინტერაქტიული C– ში, ან როგორც მე მას IC– ს ვუწოდებ. IC უფასოა და მისი ჩამოტვირთვა შესაძლებელია www.botball.org– ზე. IC ძალიან ჰგავს C ++ - ს, მაგრამ აქვს რამდენიმე ჩაშენებული ბიბლიოთეკა. როგორც ირკვევა, დევიდ მილერმა ოკლაჰომას უნივერსიტეტიდან დაწერა ბიბლიოთეკა შემოქმედებისთვის, რომლის გადმოწერა შესაძლებელია მისი გვერდიდან https://i-borg.engr.ou.edu/~dmiller/create/. იმ რესურსებით და შექმნის სახელმძღვანელოებით მე მზად ვიყავი პროგრამირებისთვის. მაგრამ შემდეგი დიდი გამოწვევა იყო რისი გაკეთება მინდოდა? მე მინდოდა რობოტი, რომელსაც შეეძლო წასულიყო ნარინჯისფერი ბურთები აეღო და კალათში გაეტანა. ჩემი მიზანი მარტივად ჟღერდა და ალბათ შეიძლებოდა ყოფილიყო მარტივიც, მაგრამ რაც უფრო მეტს მივხვდი, რისი გაკეთებაც შეეძლო, მით უფრო მინდოდა ამის გაკეთება. ჩემი საბოლოო სია ასე გამოიყურებოდა: 1. იპოვეთ ფორთოხლის ბურთი 2. აიღეთ ფორთოხლის ბურთი 3. იპოვეთ კალათა 4. ჩადეთ ბურთი კალათაში საგნების თავიდან აცილება 2. არაფრის დაცემა (მაგიდის მსგავსად) 3. დაბალი ბატარეის დადგენა და სახლის ბაზასთან მიერთება დაბალ ტემპერატურაზე და ეს ყველაფერი სრულიად ავტონომიურია, რაც იმას ნიშნავს, რომ ეს ყველაფერი წინასწარ არის დაპროგრამებული.

ნაბიჯი 5: კოდი

ის შეიძლება არეული იყოს, მაგრამ ის მუშაობს. // et port/*შესაქმნელი კაბელი ასევე უნდა იყოს ჩართული. დენის ჯეკი, 3 დანამატიანი პორტი 8 -ში და ერთი წარწერით UX JP 28 (USB პორტის გვერდით) U კამერისკენ*/ #განსაზღვრეთ c_down 5 // კამერა servo down#განსაზღვრეთ a_down 17 // arm servo down#განსაზღვრეთ გამართვა 50 // servo hold ball#განსაზღვრეთ დაჭერილი 27 // arm servo position რომ არ დაიჭიროთ მაგიდაზე#განსაზღვრეთ გადაღება 150 // servo სროლა ბურთი#განსაზღვრეთ სიმღერა_გ 25 // კამერა servo სიმღერა დახურვის პოზიცია#განსაზღვრეთ სიმღერა_f 45 // კამერა servo სიმღერა შორს პოზიცია#განსაზღვრეთ ცენტრი 120 // კამერის ხედვის ცენტრი#განსაზღვრეთ inrange 30 // track_y კოორდინაცია როდესაც ბურთი კლანჭშია#განსაზღვრეთ ბურთი 0 // ნარინჯისფერი ბურთის არხი#განსაზღვრეთ ბურთი_ x (სიმღერა_ x (ბურთი, 0)) // x ბურთის კოორდინატი#განსაზღვრეთ ბურთი ძრავა#განსაზღვრეთ სწრაფად 175 // სწრაფი ძრავის სიჩქარე#განსაზღვრეთ გამჭვირვალე 0.2 // წ ნახტომი უკან დაბრკოლებებისგან#განსაზღვრეთ დრო 0.5 //1.0 არის 90 გრადუსიანი მარჯვნივ შემობრუნება#განსაზღვრეთ დანარჩენი 0.05 // დრო ძილის დროს თვალყურის დევნება#განსაზღვრეთ სიჩქარე 175 უკან დახეული ობიექტისგან#განსაზღვრეთ პირდაპირ 32767 // მართეთ სწორი ხაზი#განსაზღვრეთ ზურგი 2 // არხის backboard ძირითადი ფერი#განსაზღვრეთ კვადრატი 1 // არხი backboard აქცენტი ფერი#განსაზღვრა track_d 250 // კამერის პოზიცია თვალთვალის მიზანი# განსაზღვრეთ track_find 70 // კამერის პოზიცია გრძელი თვალთვალისთვის#განსაზღვრეთ საპირისპირო 2.25 // ძილის დრო 180#განსაზღვრეთ back_f -150 // უკან სწრაფი სიჩქარე#განსაზღვრეთ back_sl -125 // უკან ნელი სიჩქარე#განსაზღვრეთ center_x 178 // ჭეშმარიტი x ცენტრი cam#განსაზღვრეთ center_y 146 // camint pida– ს ჭეშმარიტი y ცენტრი; // თავიდან აიცილეთ processint pidb; // თვალყური ადევნეთ პროცესს pidc; // დააწკაპუნეთ processint pidc; // score processint have_ball = 0; // გვეუბნება რომელი ფუნქციაა ჩვენ გამოუყენებელი main () {long ch; enable_servos (); // servos init_camera (); // კამერის დაკავშირების დაწყება (); // დაკავშირება შესაქმნელად სრული კონტროლით start_a (); // ფუნქციის თავიდან აცილება start_b (); // ბურთის გაყვანის ფუნქციის დაწყება (1) {if (r_button () || gc_ldrop || gc_rdrop) {// თუ აიღეთ ან r მხრის ღილაკი კლავს (პიდა); მოკვლა (pidb); მოკვლა (პიდკ); გამორთვა_სერვო (); გათიშვა (); შესვენება;} create_battery_charge (); display_clear (); printf ("დატენვა = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); მოკვლა (pidb); მოკვლა (პიდკ); ჩააგდოს (); აქვს_ბურთი = 0; შექმნა_დემო (1); ხოლო (b_button ()); ხოლო (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("დატენვა = %l / n", gc_battery_charge); ძილი (1.0);} დაკავშირება (); უკან (); ძილი (2.0); დაწყება_ა (); start_b ();}}} void თავიდან აცილება () {while (1) {// სამუდამოდ გამეორება create_sensor_update (); // განახლება ყველა სენსორის მნიშვნელობა // create_drive (speeda, straight); თუ (gc_lbump == 1) {// მარცხენა მუწუკი აცილდება_მარჯვენეს ();} // უხვევს მარჯვნივ, რათა თავიდან აიცილოს სხვაგან თუ (gc_rbump == 1) {// მარჯვენა მუწუკი აცილდება_მარცხნივ ();} // უხვევს მარცხნივ, რათა თავიდან აიცილოს სხვაგან თუ (gc_lfcliff == 1) {// მარცხენა წინა კლდე აცილდება_მარჯვიდან ();} სხვა შემთხვევაში თუ (gc_rfcliff == 1) {// მარჯვენა წინა კლდე აცილებს_მარცხნივ ();} სხვა შემთხვევაში თუ (gc_lcliff == 1) {// მარცხენა კლდე არიდებს_მარჯვეს ();} სხვაგვარად თუ (gc_rcliff == 1) {// მარჯვენა კლდე აცილდება_მარცხნივ ();}}}} ბათილდება track_ball () {კლავს (pidc); while (! have_ball) {// გაიმეორეთ სანამ არ მიიღებთ ბურთის track_update (); შორს (); // აყენებს კამერას მზადაა (); // აყენებს მკლავს სანამ (et <255) {// სანამ მაქსიმალური მნიშვნელობა არ მოხდება როდესაც ბურთი იჭერს track_update (); // განაახლეთ კამერის სურათი თუ (ball_x <= (ცენტრი -5)) {// თუ ბურთი დარჩა track_update (); create_drive_direct (ნელი, სწრაფი); // გადაუხვიეთ ძილს მარცხნივ (დასვენება);} სხვა შემთხვევაში (ball_x> = (ცენტრი+5)) {// თუ ბურთი სწორია track_update (); create_drive_direct (სწრაფი, ნელი); // გადაუხვიეთ მარჯვნივ ძილს (დასვენება);} სხვა შემთხვევაში (ball_x (ცენტრი -5)) {// თუ ბურთი ორიენტირებულია track_update (); create_drive_straight (სწრაფი); // წადი პირდაპირ ძილი (დასვენება);}} აითვისე (); // აიღე ბურთის სიგნალი (); // ხმაური შეაჩერე (); // შეწყვიტე მართვა have_ball = 1; // გააკეთე შენიშვნა, რომ მე მაქვს ბურთი} start_c (); // მოვძებნო კალათის ძილი (1.0); // ძილი ისე, რომ მე არაფერს ვაკეთებ როცა მოვკალი} void find_basket () {kill (pidb); // მოკვლა ბურთზე თვალთვალის პროცესი იპოვე (); // დააყენე კამერა track_set_minarea (1000); // უკანა დაფა არის დიდი, ამიტომ ეძებე მხოლოდ დიდი ბუშტუკები სანამ (აქვს_ბურთი) {// სანამ მე მაქვს ბურთი track_update (); while (track_x (backb, 0) = (center_x+20)) {// ხოლო არ არის ორიენტირებული track_update (); if (track_x (backb, 0)> = (center_x+20)) {// თუ დაფა დარჩა track_update (); create_spin_CCW (100);} // მოუხვიე მარცხნივ სხვაგან (track_x (backb, 0) <= (center_x-20)) {// თუ დაფა სწორია track_update (); create_spin_CW (300-center_x);} // მოუხვიეთ მარჯვნივ შენელება ცენტრის მოახლოებასთან ერთად} გაჩერება (); while (track_size (backb, 0) <= (6000)) {// ხოლო სამიზნე 6000 პიქსელზე ნაკლებია ზომის track_update (); if (track_x (backb, 0) <= (center_x-5)) {// თუ სამიზნე დარჩა track_update (); create_drive_direct (ნელი, სწრაფი); // გადაუხვიეთ მარცხნივ ძილი (დასვენება);} სხვა შემთხვევაში თუ (track_x (backb, 0)> = (center_x+5)) {// თუ სამიზნე არის სწორი track_update (); create_drive_direct (სწრაფი, ნელი); // გადაუხვიეთ ძილს მარჯვნივ (დასვენება);} სხვა შემთხვევაში თუ (track_x (backb, 0) (center_x-5)) {// თუ სამიზნე ორიენტირებულია track_update (); create_drive_straight (სწრაფი); // პირდაპირ ძილი (დასვენება);}} გაჩერება (); // create_drive_straight (სწრაფად); // ცოტათი უფრო ახლოს // ძილი (1.0.0); // გაჩერება (); ძილი (1.0); create_spin_CW (speeda); // ტრიალი მარჯვენა ძილი (საპირისპირო); // ძილი საკმარისად დიდხანს 180 შემობრუნებისთვის (); ქვემოთ (); // კამერის დაყენება უკანა ძილის დასადგენად (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 (); // გადაუხვიე ძილი მარცხნივ (დასვენება);} სხვა შემთხვევაში თუ (track_x (backb, 0)> = (center_x+5)) {// თუ სამიზნე არის სწორი track_update (); back_left (); // გადაუხვიეთ მარჯვნივ ძილი (დასვენება);} სხვა შემთხვევაში (track_x (backb, 0) (center_x-5)) {// თუ სამიზნე ორიენტირებულია track_update (); უკან (); // პირდაპირ ძილი (დასვენება);}} გაჩერება (); სიგნალი (); სროლა (); // სროლა ძილი (1.0); have_ball = 0; // შეხსენება მე გადავაგდე ბურთი და არ მაქვს} start_b (); // უკან ბურთის თვალთვალის ძილი (1.0); // ნუ გააკეთებ არაფერს სანამ ეს პროცესი არ მოკვდება} void cconnect () {create_connect (); create_full (); // სენსორების სენსორების სრული კონტროლისთვის create_power_led (0, 255);} // green power ledvoid გათიშვა () {გაჩერება (); // შეწყვეტა შექმნა_გამორკვევის ();} ბათილად უკან_ გაქცევა () {უკან (); ძილი (სუფთა); stop ();} void rotate_l () {create_spin_CCW (speeda); ძილი (დრო); შეჩერება ();} void rotate_r () {create_spin_CW (speeda); ძილი (დრო); შეჩერება ();} ბათილად გაჩერება () {შექმნა_მოძრაობა (0, პირდაპირ);} ბათილი უკან () {შექმნა_მოძრაობა (უკან_ისკენ, პირდაპირ);} ბათილად მზად () {set_servo_position (მკლავი, ქვევით);} ბათილად შემოწმება () {set_servo_position (კამერა, სიმღერა_გ);} სიცარიელე შორს () {set_servo_position (კამერა, სიმღერა_ფ);} ბათილი რაფა () {set_servo_position (მკლავი, დაჭერილი);} ბათილად ჩაგდება () {int a; for (a = 50; a> = 30; a- = 1) {// მოემზადეთ set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= გამართვა; a+= 1) {// ხელი ასწიეთ შეუფერხებლად set_servo_position (arm, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (კამერა, track_find);} void start_a () {pida = start_process (თავიდან აცილება ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // დაელოდეთ მიმდინარე პროცესის დასრულებას და მიიღეთ პრიორიტეტული kill_process (pid); CREATE_FREE; // მე დავამთავრე გაჩერება ();} void აცილება_ლეფტი () {მოკვლა (pidb); // სხვა ყველაფრის შეჩერება მოკვლა (pidc); რაფა (); // აიღე ბრჭყალი ისე, რომ იგი არ დაიჭიროს მაგიდაზე უკან_ ((უკან)/// უკან გადაადგილება rotate_l (); // ბრუნვა დაბრკოლებისგან მზადაა (); // დააბრუნე კლანჭი ქვემოთ თუ (აქვს_ბურთი) {// თუ მე მაქვს ბურთი start_c ();} // დავიწყო მიზნის თვალთვალი სხვა შემთხვევაში {მოკვლა (pidb); მოკვლა (პიდკ); რაფა (); back_away (); rotate_r (); მზად (); if (have_ball) {start_c ();} სხვა შემთხვევაში (! 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: ღირდა თუ არა?

ხარჯები იყო: შექმნა + ბატარეა + დოკუმენტი = $ 260 XBC დამწყებ ნაკრები (xbc, კამერა, LEGO აგური, სენსორები) = $ 579 PVC + საღებავი + ხრახნები = დაახლოებით $ 20 მთლიანი ღირებულება = $ 859 მე უკვე მქონდა XBC შემქმნელის ნაკრები Botball– დან, ასე რომ ღირებულება ჩემთვის იყო ღირებულების შექმნა. მე ვფიქრობ, რომ ეს ღირდა და საუკეთესო ნაწილი ის არის, რომ ყველა ის ნაწილი, რაც მე გამოვიყენე, მეორადია, თუ შემეძლო ამ ბოტის გაყოფა. ეს ვიდეო გვიჩვენებს ქვეგანყოფილების თავიდან აცილებას, მაგიდის თავზე. ამ ვიდეოში ჩანს რობოტი, რომელმაც 5 ფორთოხლის ბურთი გაიტანა გოლში. მე მხოლოდ პროცესის დაჩქარებას ვეხმარებოდი, ის საბოლოოდ იპოვა ბურთი 5 თავისით.

ნაბიჯი 7: დასკვნა

საბოლოო შედეგი არის რობოტი, რომელსაც შეუძლია დამოუკიდებლად აიღოს და გაიტანოს ფორთოხლის ბურთები კარში.

მე მომეწონა ამ პროექტზე მუშაობა. რაც უფრო მეტს ვმუშაობდი ამ რობოტზე, მით უფრო მეტად ვუერთდებოდი მას. ახლა მას ისე ვესაუბრები, თითქოს შინაური ცხოველი იყოს. ვიმედოვნებ, რომ ეს დაგეხმარა თქვენს მომავალ პროექტში. ბევრი ადამიანია, რომელსაც მადლობა უნდა გადავუხადო, მაგრამ ძალიან ბევრია. როგორც ბერნარდ შარტრეელმა ასე ელეგანტურად თქვა: ჩვენ ვგავართ ჯუჯებს გიგანტების მხრებზე, რათა მათზე მეტს ვხედავთ და საგნებს უფრო დიდი მანძილით, არა ჩვენი მხედველობის სიმკვეთრის ან რაიმე ფიზიკური განსხვავება, არამედ იმიტომ, რომ ჩვენ გვყავს მაღალი და გაზრდილი მათი გიგანტური ზომით.”

გირჩევთ: