كود البحث

الدرس 8 من 10: سيارة Raspberry Pi Pico الذكية – الدرس 8: المحرك المؤازر وتتبع الأجسام

الدرس 8 من 10: سيارة Raspberry Pi Pico الذكية – الدرس 8: المحرك المؤازر وتتبع الأجسام

هذا الدرس من دورة سيارة Raspberry Pi Pico الذكية رباعية الدفع من Robojax يستكشف وظيفة محرك السيرفو وكيفية استخدامه لإنشاء روبوت يتتبع الأجسام أو روبوت "اتبع يدك". يتجاوز المشروع التحكم البسيط في المحركات، موضحًا كيفية دمج مستشعر الموجات فوق الصوتية المُدار بمحرك سيرفو مع منطق بايثون ذكي لإنشاء سيارة تبحث بنشاط عن جسم ضمن نطاقها وتتبعه. هذا مفهوم أساسي في الروبوتات، مما يتيح لك بناء مشاريع تفاعلية مثل روبوت يتبع شخصًا، أو حيوان أليف ذكي يلعب الجلب، أو كاميرا أمنية مستقلة تتعقب الحركة. يغطي الدرس أيضًا مشروعًا ثانيًا أبسط: سيارة تقترب تلقائيًا من الأجسام وتدفعها وترتد عنها ضمن منطقة مسافة محددة.

pi_pico_4WD_follow-hand

المكونات والأجهزة

يعتمد هذا المشروع على مجموعة سيارة SunFounder Raspberry Pi Pico رباعية الدفع. المكونات الرئيسية المستخدمة في هذا الدرس هي:

  • لوحة Raspberry Pi Pico
  • هيكل سيارة ذكية رباعية الدفع مع محركات
  • محرك سيرفو (يُفضل محرك سيرفو بتروس معدنية للمتانة)
  • مستشعر المسافة بالموجات فوق الصوتية (HC-SR04)
  • لوحة تشغيل المحركات (جزء من مجموعة السيارة)
  • مصباح LED ملون (RGB) (للتغذية البصرية الراجعة)
  • مصدر طاقة (حزمة بطاريات للسيارة)
PICOBOARDWHITEANGLE2_1200x857

محرك السيرفو هو جوهر وظيفة هذا الدرس. على عكس محرك التيار المستمر القياسي الذي يدور باستمرار، صُمم محرك السيرفو للدوران إلى وضع زاوي محدد والثبات عليه، عادةً بين 0 و180 درجة. هذا يجعله مثاليًا لتوجيه مستشعر الموجات فوق الصوتية بدقة. غالبًا ما تُحدد جودة محرك السيرفو بمادة تروسه (بلاستيكية مقابل معدنية) وعزم دورانه، الذي يحدد قوته ومتانته.

كيف يعمل

يوضح المخطط أدناه كيفية عمل الكود. 

pi_pico_4WD_follow-hand_flow_chart

دليل التوصيلات

التوصيلات في هذا الدرس مباشرة، حيث أنها مبنية على مجموعة السيارة المجمعة مسبقًا. الاتصال الحرج هو محرك السيرفو، الذي يجب توصيله بدبوس GPIO محدد على لوحة Pico.

في الفيديو، يوصّل المدرب محرك السيرفو بالدبوس رقم 18 على Raspberry Pi Pico. يُثبَّت مستشعر الموجات فوق الصوتية أعلى قرن السيرفو، مما يسمح بتدويره يمينًا ويسارًا لمسح المنطقة. باقي التوصيلات للمحركات ومصباح RGB LED والطاقة يُفترض أنها موصولة مسبقًا من الدروس السابقة في الدورة.

للحصول على دليل بصري مفصل، يرجى الرجوع إلى مخطط التوصيلات أدناه.

Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction

شرح الكود

كود بايثون لهذا الدرس مبني حول مكتبة مخصصة باسم pico_4wd، والتي تبسط التفاعلات المعقدة مع الأجهزة. الأجزاء القابلة للتخصيص من قبل المستخدم موجودة في أعلى السكربت وتتحكم في سلوك السيارة.

فيما يلي المتغيرات الرئيسية التي يمكنك ضبطها لتخصيص سلوك "اتبع يدك" لروبوتك:

  • car.RADAR_REFERENCE = 25: هذه هي أقصى مسافة بالسنتيمتر التي "يراها" المستشعر. أي جسم يتجاوز هذه المسافة يتم تجاهله. يمكنك زيادتها لجعل السيارة أكثر حساسية أو تقليلها لتتطلب جسمًا أقرب.
  • car.RADAR_MAX_ANGLE = 45 و car.RADAR_MIN_ANGLE = -45: تحدد هاتان الزاويتان أقصى زاوية لليسار (45) وأقصى زاوية لليمين (-45) التي سيمسحها السيرفو. هذا ينشئ مجال رؤية بزاوية 90 درجة أمام السيارة.
  • car.RADAR_STEP_ANGLE = 10: هذه هي الزيادة (بالدرجات) التي يستخدمها السيرفو للتحرك بين نقاط المسح. خطوة أصغر (مثل 5) تعطي دقة أعلى ولكنها تستغرق وقتًا أطول لإكمال المسح الكامل. خطوة أكبر (مثل 15) تمسح بشكل أسرع ولكن بدقة أقل.
  • MOTOR_FORWARD_POWER = 40: يضبط هذا قوة المحرك (0-100) المستخدمة عندما تتحرك السيارة للأمام نحو الجسم المكتشف. اضبط هذا لتغيير سرعة مطاردة السيارة.
  • MOTOR_TURNING_POWER = 40: يضبط هذا قوة المحرك المستخدمة عندما تستدير السيارة لمواجهة الجسم. قيمة أعلى ستجعل السيارة تستدير بشكل أكثر حدة.

المنطق الرئيسي لدالة main() هو حلقة مستمرة. تستدعي أولاً car.radar_scan()، والتي تُرجع سلسلة من '1' و '0' تمثل ما إذا تم اكتشاف جسم عند كل زاوية مسح (تعني '1' أن جسمًا ما ضمن مسافة المرجع). ثم يحلل الكود هذه السلسلة للعثور على أكبر مجموعة من الأرقام '1' المتتالية، مما يشير إلى مركز الجسم المكتشف. بناءً على مكان هذا المركز في مجال المسح، تُؤمر السيارة بالانعطاف يسارًا أو يمينًا أو التحرك للأمام لمحاذاة نفسها مع الجسم وتتبعه.

عرض المشروع المباشر

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

بعد تركيب المستشعر، يتم عرض ميزة "تتبع اليد". بينما يحرك المدرب يده أمام السيارة، يقوم المستشعر المثبت على السيرفو بالمسح يسارًا ويمينًا. يعالج منطق السيارة بيانات المستشعر ويوجه العجلات للتوجيه نحو اليد المكتشفة، مما يجعلها تتبعها فعليًا عبر الأرضية. يسلط العرض الضوء على كيفية تتبع السيارة لجسم ما أثناء تحركه وضبط اتجاهها وفقًا لذلك. يتم أيضًا عرض مشروع ثانٍ، حيث تتم برمجة السيارة للاقتراب من جسم ما ودفعه إذا تم اكتشافه على مسافة تتراوح بين 10 و20 سنتيمترًا، والتراجع إذا اقترب الجسم أكثر من اللازم (أقل من 10 سنتيمترات).

الخلاصات الرئيسية

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

الفصول

  • [00:00] مقدمة إلى محرك السيرفو وتتبع الأجسام
  • [01:48] ميزات وإمكانيات عدة الدورة
  • [03:08] فهم تشغيل محرك السيرفو
  • [06:08] اختبار محرك السيرفو باستخدام كود بايثون
  • [09:59] شرح ميزة "تتبع اليد"
  • [10:49] عرض وظيفة "تتبع اليد"
  • [15:37] مشروع: دفع الأجسام والتراجع
  • [18:40] عرض مشروع دفع الأجسام
  • [19:25] الخاتمة والخطوات التالية

الصور

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand
pi_pico_4WD_follow-hand_flow_chart
pi_pico_4WD_follow-hand_flow_chart
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
Sunfounder_Pico4DW-08-Follow-hand-ultrasonic_direction
905-Lesson 8/10 Pi Pico 4WD card Python code: follow hand
اللغة: C++
# Lesson 8/10 Pi Car Pico 4WD: Follow hand
# Download and resource page https://robojax.com/RJT630

import pico_4wd as car

car.RADAR_REFERENCE = 25
car.RADAR_MAX_ANGLE = 45
car.RADAR_MIN_ANGLE = -45
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 40
MOTOR_TURNING_POWER = 40

def main():
    while True:
        radar_data = car.radar_scan()
        if isinstance(radar_data, int):
            continue
        radar_data = [str(i) for i in radar_data]
        radar_data = "".join(radar_data)
        paths = radar_data.split("1")
        length_list = []
        for path in paths:
            length_list.append(len(path))
        if max(length_list) == 0:
            car.move("stop") 
        else:
            i = length_list.index(max(length_list))
            pos = radar_data.index(paths[i])
            pos += (len(paths[i]) - 1) / 2
            delta = len(radar_data) / 3
            if pos < delta:
                car.move("right", MOTOR_TURNING_POWER)
            elif pos > 2 * delta:
                car.move("left", MOTOR_TURNING_POWER)
            else:
                #if radar_data[int(len(radar_data)/2-1)] == "0":
                #    car.move("stop")
                #else:
                car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

الموارد والمراجع

لا توجد موارد حتى الآن.

ملفات📁

لا توجد ملفات متاحة.