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

متابع خط GiggleBot باستخدام Python: 5 خطوات
متابع خط GiggleBot باستخدام Python: 5 خطوات

فيديو: متابع خط GiggleBot باستخدام Python: 5 خطوات

فيديو: متابع خط GiggleBot باستخدام Python: 5 خطوات
فيديو: متابع خط سيره 2024, شهر نوفمبر
Anonim
GiggleBot Line Follower باستخدام Python
GiggleBot Line Follower باستخدام Python
GiggleBot Line Follower باستخدام Python
GiggleBot Line Follower باستخدام Python
GiggleBot Line Follower باستخدام Python
GiggleBot Line Follower باستخدام Python

هذه المرة ، نبرمج في MicroPython Dexter Industries GiggleBot لاتباع خط أسود باستخدام مستشعر تتبع الخط المدمج.

يجب إقران GiggleBot مع BBC micro: bit حتى يتم التحكم فيه بشكل مناسب.

إذا كان هذا البرنامج التعليمي متقدمًا جدًا بالنسبة لك وكانت برمجة GiggleBot أكثر من اللازم في الوقت الحالي ، فيمكنك دائمًا الاطلاع على البرنامج التعليمي للمبتدئين الذي يوضح لك كيف يمكن برمجة الروبوت في MakeCode هنا. سيرشدك البرنامج التعليمي المرتبط إلى الأساسيات.

الخطوة 1: المكونات المطلوبة

المكونات المطلوبة
المكونات المطلوبة

مكونات الأجهزة التالية مطلوبة:

  1. بطاريات AA x3 - في حالتي ، أستخدم بطاريات قابلة لإعادة الشحن ذات جهد كهربائي منخفض بشكل عام.
  2. A Dexter Industries GiggleBot روبوت للمايكرو: بت.
  3. مايكرو بي بي سي: بت.

بالطبع ، تحتاج أيضًا إلى كبل USB صغير لبرمجة BBC micro: bit - يأتي هذا الكبل عمومًا ضمن حزمة BBC micro: bit أو يمكنك دائمًا استخدام كابل يستخدم لشحن الهواتف الذكية (Android).

احصل على GiggleBot لـ micro: bit هنا

الخطوة 2: إعداد المسارات

قم بإعداد المسارات
قم بإعداد المسارات

سيتعين عليك متابعة طباعة بعض البلاط وتصميم مساراتك الخاصة. يمكنك استخدام البلاط الخاص بنا بحيث تكون متأكدًا بنسبة 100٪ أنك تقوم بتكرار ظروفنا. أو إذا كنت تشعر بالمغامرة ، يمكنك استخدام بعض الشريط الأسود وصنع الشريط الخاص بك. إليك ملف PDF للبلاطات التي استخدمناها.

يتكون المسار أعلاه من العدد التالي من المربعات المختلفة:

  • 12 قطعة من النوع # 1.
  • 5 بلاطات من النوع # 2.
  • 3 قوالب من نوع البلاط رقم 5.
  • 3 قوالب من نوع البلاط رقم 6 - هنا ، ستنتهي ببلاط إضافي واحد.

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

الخطوة الثالثة: تهيئة البيئة

تهيئة البيئة
تهيئة البيئة

لكي تتمكن من برمجة BBC micro: bit في MicroPython ، يجب عليك إعداد محرر لها (محرر Mu) وتعيين GiggleBot MicroPython Runtime كوقت تشغيله. لذلك ، عليك اتباع التعليمات الواردة في هذه الصفحة. اعتبارًا من هذه اللحظة ، يتم استخدام الإصدار v0.4.0 من وقت التشغيل.

الخطوة 4: برمجة GiggleBot

قبل الوصول إليه ، يحتوي وقت تشغيل GiggleBot MicroPython على وقت التشغيل الكلاسيكي لـ BBC micro: bit والمكتبات الأخرى لدعم GiggleBot ومستشعرات Dexter Industries الأخرى.

بعد إعداده ، افتح البرنامج النصي التالي في محرر Mu وانقر فوق Flash. سيؤدي هذا إلى وميض GiggleBot MicroPython Runtime والبرنامج النصي الذي فتحته للتو على BBC micro: bit. يتم عرض البرنامج النصي أدناه أيضًا.

بمجرد الانتهاء من عملية الوميض ، قم بتكديس BBC micro: bit في GiggleBot بحيث تكون نيوبكسل اللوحة متجهة للأمام ، ثم ضعها على المسار وقم بتشغيلها.

لاحظ أنه في البرنامج النصي ، تم بالفعل تعيين PID والثوابت 2 الأخرى (نقطة ضبط السرعة وثوابت السرعة الدنيا).

ملاحظة: قد يحتوي البرنامج النصي التالي على مسافات بيضاء ويبدو أن هذا يرجع إلى بعض المشكلات في عرض GitHub Gists. انقر فوق الجوهر ليأخذك إلى صفحة GitHub الخاصة به حيث يمكنك نسخ الرمز ولصقه.

متابع خط GiggleBot PID - تم ضبطه مع NeoPixels

من استيراد microbit *
من استيراد gigglebot *
من استيراد utime sleep_ms ، ticks_us
ustruct الاستيراد
# تهيئة غيغابايت نيوبكسل
neo = init ()
# توقيت
update_rate = 50
# مكاسب / ثوابت (بافتراض أن جهد البطارية يبلغ حوالي 4.0 فولت)
Kp = 25.0
كي = 0.5
دينار كويتي = 35.0
نقطة الزناد = 0.3
الحد الأدنى للسرعة = 0.3
القاعدة_السرعة = 70
نقطة الضبط = 0.5
last_position = نقطة الضبط
لا يتجزأ = 0.0
run_neopixels = صحيح
center_pixel = 5 # حيث يوجد بكسل مركز الابتسامة على GB
# turquoise = tuple (map (lambda x: int (x / 5)، (64، 224، 208))) # لون لاستخدامه لرسم الخطأ مع neopixels
# turquoise = (12، 44، 41) # وهو بالضبط الفيروز المعلق أعلاه أعلاه
error_width_per_pixel = 0.5 / 3 # خطأ كحد أقصى مقسومًا على عدد الأجزاء بين كل نيوبكسل
defupper_bound_linear_speed_speed_reducer (abs_error ، نقطة الزناد ، الجزء العلوي ، الترابط ، الأصغر_قوة_المحرك ، أعلى_قوة_المحرك):
قاعدة_السرعة العالمية
إذا abs_error> = trigger_point:
# x0 = 0.0
# y0 = 0.0
# x1 = top_bound - نقطة انطلاق
# y1 = 1.0
# x = abs_error - نقطة انطلاق
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# مثل
y = (abs_error - trigger_point) / (upper_bound - trigger_point)
قوة_المحرك = السرعة_القاعدة * (أصغر_قوة_موتور + (1- ص) * (أعلى_قوة_موتور- أصغر_قوة_موتور_قوة))
عودة قوة المحرك
آخر:
إرجاع Base_speed * أعلى_قوة_موتور
تشغيل = خطأ
الخطأ السابق = 0
احيانا صحيح:
# إذا تم الضغط على الزر a ، فابدأ في المتابعة
إذا button_a.is_pressed ():
تشغيل = صحيح
# ولكن إذا تم الضغط على الزر b ، فقم بإيقاف متابع الخط
إذا button_b.is_pressed ():
تشغيل = خطأ
لا يتجزأ = 0.0
الخطأ السابق = 0.0
بكسل_من ()
قف()
sleep_ms (500)
إذا كان المدى صحيحًا:
# قراءة مجسات الخط
start_time = ticks_us ()
يمين ، يسار = read_sensor (LINE_SENSOR ، كلاهما)
# خط على اليسار عندما يكون الموضع <0.5
# على اليمين عندما يكون الموضع> 0.5
# خط في المنتصف عندما يكون الموضع = 0.5
# إنه متوسط حسابي مرجح
محاولة:
الموضع = يمين / عائم (يسار + يمين)
ماعدا ZeroDivisionError:
الموضع = 0.5
# يجب أن يكون النطاق (0 ، 1) وليس [0 ، 1]
إذا كان الموضع == 0: الموضع = 0.001
إذا كان الموضع == 1: الموضع = 0.999
# استخدم وحدة تحكم PD
خطأ = الموضع - نقطة الضبط
تكامل + = خطأ
تصحيح = Kp * خطأ + Ki * متكامل + Kd * (خطأ - خطأ سابق)
الخطأ السابق = خطأ
# حساب سرعات المحرك
Motor_speed = upper_bound_linear_speed_speed_reducer (القيمة المطلقة (خطأ) ، نقطة الضبط * نقطة التشغيل ، نقطة الضبط ، min_speed_percent ، 1.0)
leftMotorSpeed = سرعة المحرك + التصحيح
rightMotorSpeed = سرعة المحرك - التصحيح
# يضيء النيوبكسيل وفقًا للخطأ المحدد
إذا كانت run_neopixels هي عدد_الخطوات الإجمالية والعدد٪ 3 == 0:
بالنسبة إلى i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08':
الجدد = (0 ، 0 ، 0)
بالنسبة إلى i inb '\ x00 / x01 / x02 / x03':
ifabs (خطأ)> error_width_per_pixel * i:
إذا كان الخطأ <0:
# neo [center_pixel + i] = فيروزي
neo [center_pixel + i] = (12 ، 44 ، 41)
آخر:
# neo [center_pixel - i] = فيروزي
neo [center_pixel + i] = (12 ، 44 ، 41)
آخر:
النسبة المئوية = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# تضيء البكسل الحالي
إذا كان الخطأ <0:
# neo [center_pixel + i] = مجموعة (خريطة (lambda x: int (x * النسبة المئوية) ، فيروزي))
neo [center_pixel + i] = (int (64 * بالمائة / 5) ، int (224 * بالمائة / 5) ، int (208 * بالمائة / 5))
آخر:
# neo [center_pixel - i] = مجموعة (خريطة (lambda x: int (x * النسبة المئوية) ، فيروزي))
neo [center_pixel - i] = (int (64 * بالمائة / 5) ، int (224 * بالمائة / 5) ، int (208 * بالمائة / 5))
استراحة
neo.show ()
محاولة:
# قص سرعات المحرك
إذا تركت سرعة المحرك> 100:
يسار MotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
إذا كان صحيحًا ، سرعة المحرك> 100:
rightMotorSpeed = 100
يسار سرعة المحرك = يسار سرعة المحرك - يمين سرعة المحرك +100
إذا تركت
leftMotorSpeed = -100
إذا كان صحيحًا
rightMotorSpeed = -100
# شغّل المحركات
set_speed (leftMotorSpeed ، rightMotorSpeed)
قائد()
# طباعة ((خطأ ، سرعة المحرك))
إلا:
# في حالة حدوث مشكلة غير قابلة للإصلاح
يمر
# والحفاظ على تردد الحلقة
end_time = ticks_us ()
delay_diff = (end_time - start_time) / 1000
if1000.0 / update_rate - delay_diff> 0:
النوم (1000.0 / update_rate - delay_diff)

عرض rawgigglebot_tuned_line_follower.py مستضاف مع ❤ بواسطة GitHub

الخطوة 5: دعها تعمل

يوجد زرين على BBC micro: bit: الزر A والزر B:

  • يؤدي الضغط على الزر A إلى تعيين GiggleBot لمتابعة الخط (إذا كان هناك واحد).
  • يؤدي الضغط على الزر B إلى إيقاف GiggleBot وإعادة تعيين كل شيء بحيث يمكنك استخدامه مرة أخرى.

يُنصح بشدة بعدم رفع GiggleBot أثناء اتباعه لخط ما ثم إعادته إليه لأن الخطأ الذي يتم حسابه يمكن أن يتراكم ويفسد مسار الروبوت تمامًا. إذا كنت ترغب في رفعه ، اضغط على الزر B ثم عند وضعه مرة أخرى اضغط على الزر A مرة أخرى.

موصى به: