جدول المحتويات:

كيفية صنع روبوت يلعب كرة السلة باستخدام IRobot أنشئ كقاعدة: 7 خطوات (بالصور)
كيفية صنع روبوت يلعب كرة السلة باستخدام IRobot أنشئ كقاعدة: 7 خطوات (بالصور)

فيديو: كيفية صنع روبوت يلعب كرة السلة باستخدام IRobot أنشئ كقاعدة: 7 خطوات (بالصور)

فيديو: كيفية صنع روبوت يلعب كرة السلة باستخدام IRobot أنشئ كقاعدة: 7 خطوات (بالصور)
فيديو: Deutsch lernen C1 - Deutsch lernen mit Dialogen (6) 2024, شهر نوفمبر
Anonim
كيف تصنع روبوت كرة سلة مستقل باستخدام IRobot أنشئ كقاعدة
كيف تصنع روبوت كرة سلة مستقل باستخدام IRobot أنشئ كقاعدة

هذا هو دخولي في تحدي إنشاء iRobot. كان أصعب جزء في هذه العملية برمتها بالنسبة لي هو تحديد ما سيفعله الروبوت. أردت أن أوضح الميزات الرائعة للإنشاء ، مع إضافة بعض الذوق الآلي. بدت جميع أفكاري إما أنها تقع في فئة مملة ولكنها مفيدة ، أو رائعة وغير عملية. في النهاية انتصر رائع وغير عملي وولد روبوت يلعب كرة السلة. بعد بعض التفكير ، أدركت أنه يمكن أن يكون عمليًا. لنفترض أنك تستخدم ورقًا برتقاليًا ، وأن جميع علب المهملات بها ألواح خلفية خضراء …

الخطوة 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.org Sharp rangefinder (x1) - من Botball www.botball.org طوب LEGO المتنوع - من LEGO www.lego.com6-32 براغي آلة (x4) - من McMaster www.mcmaster.com "Created" Robot Parts Used: 3/8 "لوح PVC مقذوف سميك - هذه الأشياء رائعة ، لكن لا أتذكر من أين حصلت عليها ، ولكنها مثل هذه الأشياء تمامًا https://www.lynxmotion.com / Category.aspx؟ CategoryID = 62 أجزاء أخرى: كرة برتقالية "POOF" - من سلة مهملات WalMartBasketball تبدو مرمية - من LowesGreen "backboard" - طلاء PVC إضافي باللون الأخضر الفاتح

الخطوة 2: إنشاء الجزء الفريد

قم بإنشاء الجزء الفريد
قم بإنشاء الجزء الفريد

كان الجزء الوحيد الذي كان عليّ تصنيعه هو اللوحة التي تم تثبيتها في Create وعرضت تباعد LEGO. المسافة بين ثقوب LEGO القرميدية هي 8 مم ، لكنني قمت بعمل تباعد مزدوج لتوفير الوقت. يعتبر PVC المبثوق سهل العمل معه. يمكن قطعها بسكين ، لكنها صلبة وقوية. غالبًا ما ألتقط الروبوت من هذه اللوحة ولم أواجه مشكلة بعد.

الخطوة 1: قص الورقة إلى 3.5 بوصة × 9.5 بوصة ، يمكنك قص هذا بسكين متعدد الاستخدامات. الخطوة 2: حفر الثقوب لإنشاء مسامير. تصنع براغي الإنشاء صندوقًا بحجم 2 و 5/8 "× 8 و 5/8". الخطوة 3: حفر ثقوب LEGO متباعدة. استخدم مثقاب مقاس 3/16 بوصة وقمت بتباعد الثقوب بمقدار 16 مم. نصيحة: لقد وضعت الورقة في برنامج CAD ، وطبعتها بالحجم الكامل ولصقتها على الورقة. ثم استخدمت هذا كدليل للقطع و حفر.

الخطوة الثالثة: تجميع الروبوت

تجميع الروبوت
تجميع الروبوت
تجميع الروبوت
تجميع الروبوت
تجميع الروبوت
تجميع الروبوت

أنا أستمتع ببناء الأشياء ببساطة قدر الإمكان ، وبهذه الطريقة عندما يقفزون من الطاولة ، لن تضطر إلى إعادة البناء بنفس القدر!

1. اربط اللوح المصمم حديثًا إلى الجزء العلوي من Create 2. قم ببناء ذراع للاستيلاء على الكرة 3. قم ببناء ذراع لتثبيت الكاميرا 4. قم ببناء حامل لجهاز تحديد المدى 5. قم بتركيب XBC وتوصيل جميع الكابلات

الخطوة الرابعة: برمجة الروبوت

قررت استخدام XBC كوحدة تحكم خاصة بي بشكل أساسي بسبب تتبع الألوان المدمج. لأنني قررت مع XBC كعقل العملية ، قمت ببرمجة الروبوت الخاص بي في Interactive C ، أو كما أسميها IC. IC مجاني للاستخدام ويمكن تنزيله من www.botball.org. IC مشابه جدًا لـ C ++ ، ولكنه يحتوي على العديد من المكتبات المضمنة. كما اتضح ، كتب David Miller من جامعة أوكلاهوما مكتبة للإنشاء يمكن تنزيلها من صفحته على https://i-borg.engr.ou.edu/~dmiller/create/. بهذه الموارد والأدلة الخاصة بالإنشاء ، كنت جاهزًا للبرمجة. لكن التحدي الكبير التالي كان ما الذي أريده أن يفعله؟ أردت روبوتًا يمكنه الذهاب والتقاط كرات برتقالية وتسجيلها في سلة. بدا هدفي بسيطًا ، وربما كان من الممكن أن يكون بسيطًا ، ولكن كلما دخلت في ما يمكن أن يفعله التطبيق ، كلما أردت أن يفعله أكثر. بدت قائمتي النهائية على النحو التالي: 1. ابحث عن الكرة البرتقالية 2. إلتقط الكرة البرتقالية 3. حدد موقع السلة 4. ضع الكرة في السلة بينما 1. تجنب الأشياء 2. عدم السقوط من أي شيء (مثل الطاولة) 3. الكشف عن شحن البطارية والتوصيل بالقاعدة المنزلية عندما يكون منخفضًا ، وكل هذا مستقل تمامًا ، مما يعني أنه كل شيء مبرمج مسبقًا.

الخطوة 5: الكود

قد يكون الأمر فوضويًا ، لكنه يعمل. # استخدم "createlib.ic" #use "xbccamlib.ic" #define cam 0 // منفذ مؤازرة الكاميرا # حدد arm 3 // arm servo port # حدد et (تناظري (0)) // et port / * يجب أيضًا توصيل كبل الإنشاء. مقبس الطاقة والمقبس ذو الثلاثة شعب في المنفذ 8 والآخر المسمى UX في JP 28 (بجوار منفذ USB) مع وضع U باتجاه الكاميرا * / #define c_down 5 // camera servo down # حدد a_down 17 // arm servo down # حدد Hold 50 // servo Hold ball # حدد وضع المؤازرة 27 / arm servo لمنع الوقوع في المنضدة # حدد shoot 150 // servo رمي الكرة # حدد track_c 25 / / مسار مؤازرة الكاميرا ، الموضع القريب # حدد track_f 45 // معزز الكاميرا المسار البعيد الموضع # حدد المركز 120 // مركز رؤية الكاميرا # حدد النطاق 30 // track_y الإحداثيات عندما تكون الكرة في المخلب # حدد الكرة 0 // قناة الكرة البرتقالية # حدد ball_x (track_x (كرة ، 0)) // x إحداثيات الكرة # حدد ball_y (track_y (كرة ، 0)) // y إحداثيات الكرة # حدد 100 بطيئة // سرعة بطيئة المحرك # حدد السرعة 175 // سرعة المحرك السريع # حدد واضح 0.2 // ثانية leep to back بعيدًا عن العوائق # تحديد الوقت 0.5 //1.0 عبارة عن انعطاف يمين 90 درجة # تحديد الراحة 0.05 // وقت النوم أثناء تتبع النقط # حدد speeda 175 // سرعة تجنب الانعطاف # حدد back_s -200 // speed to التراجع عن الكائن المتصادم # حدد مستقيم 32767 // محرك في خط مستقيم # حدد backb 2 // قناة اللون الرئيسي للوحة الخلفية # حدد المربع 1 // قناة لون اللكنة الخلفية # حدد track_d 250 // موضع الكاميرا لتتبع الهدف # حدد track_find 70 // موضع الكاميرا للتتبع الطويل # حدد عكس 2.25 // وقت السكون لـ 180 # حدد back_f -150 // سرعة الرجوع السريع # حدد back_sl -125 // سرعة بطيئة للخلف # حدد center_x 178 // صحيح x مركز of cam # حدد center_y 146 // true y center of camint pida ؛ // تجنب العملية pidb ؛ // track processint pidc ؛ // Score processint have_ball = 0 ؛ // يخبرنا بالوظيفة التي نلجأ إليها main () {long ch ؛ enable_servos () ؛ // تمكين servos init_camera () ؛ // بدء تشغيل الكاميرا cconnect () ؛ // الاتصال لإنشاء مع تحكم كامل start_a () ؛ // بدء تجنب الوظيفة start_b () ؛ // بدء وظيفة ball_tracking أثناء (1) {if (r_button () || gc_ldrop || gc_rdrop) {// إذا تم التقاطها أو قتل زر الكتف (pida) ؛ قتل (pidb) ؛ قتل (pidc) ؛ تعطيل_الخدمات () ، قطع الاتصال()؛ استراحة ؛} create_battery_charge () ، display_clear () ، printf ("charge =٪ l / n"، gc_battery_charge) ؛ if (gc_battery_charge <1200l || b_button ()) {kill (pida) ؛ قتل (pidb) ؛ قتل (pidc) ؛ يرمي()؛ have_ball = 0 ؛ create_demo (1) ، بينما (b_button ()) ؛ while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge ()؛ display_clear () ، printf ("charge =٪ l / n"، gc_battery_charge) ؛ النوم (1.0) ؛} cconnect () ؛ الى الخلف()؛ النوم (2.0) ؛ بدء()؛ start_b ()؛}}} تجنب الفراغ () {while (1) {// كرر إلى الأبد create_sensor_update ()؛ // تحديث جميع قيم المستشعر // create_drive (speeda، straight)؛ if (gc_lbump == 1) {// left bump trouble_right () ؛} // انعطف يمينًا لتجنب وإلا إذا (gc_rbump == 1) {// right bump trouble_left ()؛} // يستدير لليسار لتجنب أي شيء آخر إذا (gc_lfcliff == 1) {// left front cliff trouble_right ()؛} else if (gc_rfcliff == 1) {// right front cliff trouble_left ()؛} else if (gc_lcliff == 1) {// left cliff escape_right ()؛} else if (gc_rcliff == 1) {// right cliff escape_left ()؛}}} void track_ball () {kill (pidc)؛ while (! have_ball) {// كرر حتى الحصول على الكرة track_update () ؛ far () ؛ // يضبط الكاميرا جاهزة () ؛ // يضبط الذراع بينما (وآخرون <255) {// حتى تحدث القيمة القصوى عند التقاط الكرة track_update () ؛ // تحديث صورة الكاميرا إذا (ball_x <= (center-5)) {// إذا تركت الكرة track_update () ؛ create_drive_direct (بطيء ، سريع) ؛ // انعطف يسارًا (راحة) ؛} وإلا إذا (ball_x> = (center + 5)) {// إذا كانت الكرة صحيحة track_update () ؛ create_drive_direct (سريع ، بطيء) ؛ // انعطف إلى اليمين أثناء النوم (راحة) ؛} وإلا إذا (ball_x (center-5)) {// إذا كانت الكرة في المنتصف track_update () ؛ create_drive_straight (fast)؛ // go straight sleep (rest)؛}} grab ()؛ // grab ball beep ()؛ // make Noise stop ()؛ // stop driving have_ball = 1؛ // دون ملاحظة ذلك I have ball} start_c ()؛ // اعثر على سلة النوم (1.0)؛ // sleep حتى لا أفعل أي شيء عندما أتعرض للقتل} void find_basket () {kill (pidb)؛ // kill ball tracking process find ()؛ // put camera up track_set_minarea (1000)؛ // اللوحة الخلفية كبيرة ، لذا ابحث فقط عن النقاط الكبيرة أثناء (have_ball) {// بينما لدي الكرة 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)؛} // انعطف يمينًا مع اقتراب المركز} stop () ؛ 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)) {// إذا كان الهدف هو right track_update () ؛ create_drive_direct (fast، slow)؛ // turn right 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) ؛ // تدور النوم الصحيح (عكسيًا) ؛ // نوم طويل بما يكفي لتوقف 180 دورة () ؛ down () ؛ // ضع الكاميرا لأسفل لتتبع نوم اللوحة الخلفية (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)؛} وإلا إذا (track_x (backb، 0)> = (center_x + 5)) {// إذا كان الهدف حق track_update () ؛ back_left ()؛ // turn right sleep (rest)؛} وإلا إذا (track_x (backb، 0) (center_x-5)) {// إذا كان الهدف في المنتصف track_update () ؛ back () ؛ // اذهب إلى النوم المستقيم (الراحة) ؛}} توقف () ؛ زمارة()؛ رمي () ؛ // تصوير النوم (1.0) ؛ have_ball = 0؛ // reminder لقد رميت الكرة ولم أملكها} start_b ()؛ // العودة إلى وضع تتبع الكرة في وضع السكون (1.0)؛ // لا تفعل أي شيء حتى تموت هذه العملية} void cconnect () {create_connect () ؛ create_full ()؛ // للتحكم الكامل في مستشعرات الرف create_power_led (0، 255)؛} // الطاقة الخضراء ledvoid disconnect () {stop ()؛ // stop move create_disconnect ()؛} void back_away () {back () ؛ النوم (واضح) ؛ stop () ؛} void rotate_l () {create_spin_CCW (speeda) ، وقت النوم)؛ stop () ؛} void rotate_r () {create_spin_CW (speeda) ، وقت النوم)؛ 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 edge () {set_servo_position (arm، caught)؛} void throw () {int a؛ لـ (a = 50؛ a> = 30؛ a- = 1) {// الاستعداد set_servo_position (arm، a)؛} set_servo_position (arm، shoot)؛} void grab () {int a؛ لـ (a = 0؛ a <= hold؛ a + = 1) {// ارفع الذراع بسلاسة set_servo_position (arm، a)؛}} void down () {set_servo_position (cam، track_d)؛} العثور على باطل () {set_servo_position (cam، track_find)؛} void start_a () {pida = start_process (تجنب ())؛} void start_b () {pidb = start_process (track_ball ())؛} void start_c () {pidc = start_process (find_basket ()) ؛} قتل الفراغ (int pid) {CREATE_BUSY؛ // انتظر حتى تنتهي عملية الإنشاء الحالية ، وخذ أولوية kill_process (pid) ؛ CREATE_FREE؛ // لقد انتهيت من التوقف ()؛} void escape_left () {kill (pidb)؛ // stop everything else kill (pidc) ؛ الحافة () ؛ // التقط المخلب حتى لا يعلق على الطاولة back_away () ؛ // تراجع rotate_l () ؛ // استدر بعيدًا عن العائق الجاهز () ؛ / / ضع المخلب مرة أخرى لأسفل إذا (have_ball) {// if I have the ball start_c ()؛} // بدء تتبع الهدف وإلا إذا (! have_ball) {// إذا لم يكن لدي الكرة start_b ()؛} // بدء تتبع الكرة} voidoid_right () {kill (pidb) ؛ قتل (pidc) ؛ حافة () ؛ إرجع بعيدا()؛ rotate_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: هل كان الأمر يستحق ذلك؟

كانت التكاليف: Create + battery + doc = $ 260XBC kit (xbc، cam، LEGO bricks، sensor) = 579 دولارًا أمريكيًا + طلاء + مسامير = حوالي 20 دولارًا أمريكيًا التكلفة الإجمالية = 859 دولارًا أمريكيًا كان لدي بالفعل مجموعة بداية XBC من Botball ، وبالتالي فإن التكلفة بالنسبة لي كانت تكلفة الإنشاء ، وأعتقد أنه كان يستحق ذلك ، وأفضل جزء هو أن جميع الأجزاء التي استخدمتها قابلة لإعادة الاستخدام ، إذا كان بإمكاني إقناع نفسي بفصل هذا الروبوت. يعرض هذا الفيديو الروتين الفرعي للتجنب ، على سطح الطاولة. يُظهر هذا الفيديو الروبوت يسجل 5 كرات برتقالية في مرمى. لقد ساعدت فقط في تسريع العملية ، فقد وجدت الكرة 5 في النهاية بمفردها.

الخطوة 7: الخاتمة

والنتيجة النهائية هي روبوت يمكنه التقاط وتسجيل الكرات البرتقالية في مرمى كل ذلك بمفرده.

أحببت العمل في هذا المشروع. كلما عملت على هذا الروبوت ، أصبحت أكثر ارتباطًا به. أتحدث إليه الآن كما لو كان حيوانًا أليفًا. آمل أن يكون هذا قد ساعدك في مشروعك القادم. هناك الكثير من الأشخاص الذين يجب أن أشكرهم ، لكن هناك الكثير منهم. كما قال برنارد من شارتر بأسلوب أنيق: "نحن مثل الأقزام على أكتاف العمالقة ، حتى نتمكن من رؤية أكثر منهم ، والأشياء على مسافة أكبر ، وليس بفضل أي حدة في البصر من جانبنا ، أو أي شيء مادي. تميزنا ، ولكن لأننا نرتفع ونرتفع بحجمها العملاق ".

موصى به: