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

تحكم مؤازر متعدد Pan-Tilt: 11 خطوة (مع صور)
تحكم مؤازر متعدد Pan-Tilt: 11 خطوة (مع صور)

فيديو: تحكم مؤازر متعدد Pan-Tilt: 11 خطوة (مع صور)

فيديو: تحكم مؤازر متعدد Pan-Tilt: 11 خطوة (مع صور)
فيديو: How to make robot without micro controller using 5 DOF Rocker Joystick | diy do it yourself robot 2024, يوليو
Anonim
تحكم مؤازر متعدد عموم الإمالة
تحكم مؤازر متعدد عموم الإمالة

في هذا البرنامج التعليمي ، سوف نستكشف كيفية التحكم في العديد من الماكينات باستخدام Python على Raspberry Pi. سيكون هدفنا هو آلية PAN / TILT لوضع الكاميرا (PiCam).

هنا يمكنك أن ترى كيف سيعمل مشروعنا النهائي:

اختبار حلقة التحكم المؤازرة:

صورة
صورة

الخطوة 1: BoM - فاتورة المواد

الأجزاء الرئيسية:

  1. Raspberry Pi V3 - 32.00 دولارًا أمريكيًا
  2. 5 ميجابكسل 1080p المستشعر OV5647 وحدة فيديو كاميرا صغيرة - 13.00 دولارًا أمريكيًا
  3. TowerPro SG90 9G 180 درجة Micro Servo (2 X) - 4.00 دولارات أمريكية
  4. Mini Pan / Tilt Camera Platform Anti-Vibration Camera Mount w / 2 Servos (*) - 8.00 دولارات أمريكية
  5. المقاوم 1 كيلو أوم (2X) - اختياري
  6. متفرقات: الأجزاء المعدنية ، والأربطة ، وما إلى ذلك (في حالة إنشاء آلية الدوران / الإمالة)

(*) يمكنك شراء منصة Pan / Tilt كاملة مع الماكينات أو بناء منصة خاصة بك.

الخطوة 2: كيف يعمل PWM

لا يحتوي Raspberry Pi على خرج تناظري ، ولكن يمكننا محاكاة ذلك باستخدام نهج PWM (تعديل عرض النبض). ما سنفعله هو إنشاء إشارة رقمية بتردد ثابت ، حيث سنقوم بتغيير عرض قطار النبض ، ما سيتم "ترجمته" كمستوى جهد خرج "متوسط" كما هو موضح أدناه:

صورة
صورة

يمكننا استخدام مستوى الجهد "المتوسط" هذا للتحكم في سطوع LED على سبيل المثال:

صورة
صورة

لاحظ أن ما يهم هنا ليس التردد نفسه ، ولكن "دورة العمل" ، أي العلاقة بين الوقت الذي يكون فيه النبض "مرتفعًا" مقسومًا على فترة الموجة. على سبيل المثال ، افترض أننا سنقوم بتوليد تردد نبضي قدره 50 هرتز على أحد أجهزة Raspberry Pi GPIO الخاصة بنا. الفترة (p) ستكون معكوس التردد أو 20ms (1 / f). إذا أردنا أن يكون LED الخاص بنا "نصف" ساطع ، يجب أن يكون لدينا دورة تشغيل بنسبة 50٪ ، وهذا يعني "نبضة" ستكون "عالية" لمدة 10 مللي ثانية.

سيكون هذا المبدأ مهمًا جدًا بالنسبة لنا ، للتحكم في موضع المؤازرة لدينا ، بمجرد أن تحدد "دورة العمل" موضع المؤازرة كما هو موضح أدناه:

المؤازرة

الخطوة 3: تثبيت ملف Hw

تثبيت Hw
تثبيت Hw
تثبيت Hw
تثبيت Hw

سيتم توصيل الماكينات بمصدر خارجي 5 فولت ، مع توصيل دبوس البيانات الخاص بهم (في حالتي ، الأسلاك الصفراء الخاصة بهم) بـ Raspberry Pi GPIO على النحو التالي:

  • GPIO 17 ==> إمالة المؤازرة
  • GPIO 27 ==> بان سيرفو

لا تنس توصيل GNDs معًا ==> Raspberry Pi - الماكينات - مصدر طاقة خارجي)

يمكن أن يكون لديك كخيار ، المقاوم 1 كيلو أوم بين Raspberry Pi GPIO ودبوس إدخال بيانات الخادم. هذا من شأنه حماية RPi الخاص بك في حالة وجود مشكلة مؤازرة.

الخطوة 4: معايرة الماكينات

معايرة الماكينات
معايرة الماكينات
معايرة الماكينات
معايرة الماكينات
معايرة الماكينات
معايرة الماكينات

أول شيء يجب القيام به هو تأكيد الخصائص الرئيسية لوحدات الماكينة الخاصة بك. في حالتي ، أستخدم Power Pro SG90.

من ورقة البيانات الخاصة به ، يمكننا النظر في:

  • النطاق: 180 درجة
  • مزود الطاقة: 4.8 فولت (5VDC خارجي كمصدر طاقة USB يعمل بشكل جيد)
  • تردد العمل: 50 هرتز (الفترة: 20 مللي ثانية)
  • عرض النبض: من 1 مللي ثانية إلى 2 مللي ثانية

من الناحية النظرية ، ستكون المؤازرة على موقعها

  • الموضع الأولي (0 درجة) عند تطبيق نبضة قدرها 1 مللي ثانية على محطة البيانات الخاصة به
  • الوضع المحايد (90 درجة) عند تطبيق نبضة مقدارها 1.5 مللي ثانية على محطة البيانات الخاصة بها
  • الموضع النهائي (180 درجة) عند تطبيق نبضة مقدارها 2 مللي ثانية على محطة البيانات الخاصة به

لبرمجة موضع مؤازر باستخدام Python ، سيكون من المهم جدًا معرفة "دورة العمل" للمواضع المذكورة أعلاه ، دعنا نقوم ببعض الحسابات:

  • الموضع الأولي ==> (0 درجة) عرض النبض ==> 1 مللي ثانية ==> دورة العمل = 1 مللي ثانية / 20 مللي ثانية ==> 2.0٪
  • الوضع المحايد (90 درجة) عرض النبضة 1.5 مللي ثانية ==> دورة العمل = 1.5 مللي ثانية / 20 مللي ثانية ==> 7.5٪
  • الموضع النهائي (180 درجة) عرض النبضة 2 مللي ثانية ==> دورة العمل = 2 مللي ثانية / 20 مللي ثانية ==> 10٪

لذلك يجب أن تختلف دورة العمل في نطاق من 2 إلى 10٪.

دعونا نختبر الماكينات بشكل فردي. لذلك ، افتح محطة Raspberry الخاصة بك وقم بتشغيل محرر Python 3 shell باسم sudo (نظرًا لأنه يجب أن تكون "مستخدمًا متميزًا" للتعامل مع GPIOs):

سودو بيثون 3

على بيثون شل

>>

قم باستيراد الوحدة النمطية RPI. GPIO واسمها GPIO:

استيراد RPi. GPIO كـ GPIO

حدد مخططات الترقيم التي تريد استخدامها (BCM أو BOARD). لقد أجريت هذا الاختبار باستخدام BOARD ، لذا كانت المسامير التي استخدمتها هي المسامير المادية (GPIO 17 = Pin 11 و GPIO 27 Pin 13). كان من السهل بالنسبة لي التعرف عليها وعدم ارتكاب أخطاء أثناء الاختبار (في البرنامج النهائي سأستخدم BCM). اختر الخيار الذي تفضله:

GPIO.setmode (GPIO. BOARD)

حدد دبوس المؤازرة الذي تستخدمه:

tiltPin = 11

إذا كنت قد استخدمت مخطط BCM بدلاً من ذلك ، فيجب استبدال الأمرين الأخيرين بما يلي:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

الآن ، يجب أن نحدد أن هذا الدبوس سيكون "ناتجًا"

GPIO.setup (tiltPin ، GPIO. OUT)

وماذا سيكون التردد الذي يتم إنشاؤه على هذا الدبوس ، والذي سيكون 50 هرتز لمؤازرتنا:

الإمالة = GPIO. PWM (إمالة ، 50)

الآن ، لنبدأ في إنشاء إشارة PWM على الدبوس بدورة عمل أولية (سنحتفظ بها "0"):

إمالة = بداية (0)

الآن ، يمكنك إدخال قيم مختلفة لدورة العمل ، ومراقبة حركة المؤازرة الخاصة بك. لنبدأ بـ 2٪ ونرى ما سيحدث (نتوقع أن المؤازرة تذهب إلى "الموضع الصفري"):

tilt. ChangeDutyCycle (2)

في حالتي ، انتقلت المؤازرة إلى وضع الصفر ، لكن عندما غيرت دورة العمل إلى 3 ٪ ، لاحظت أن المؤازرة بقيت في نفس الموضع ، وبدأت في التحرك مع دورات عمل أكبر من 3 ٪. لذا ، 3٪ هو موقعي المبدئي (درجات س). حدث نفس الشيء مع 10 ٪ ، تجاوزت المؤازرة الخاصة بي هذه القيمة ، وتصدرت نهايتها عند 13 ٪. لذلك بالنسبة لهذه المؤازرة المعينة ، كانت النتيجة:

  • 0 درجة ==> دورة عمل 3٪
  • 90 درجة ==> دورة عمل 8٪
  • 180 درجة ==> دورة عمل 13٪

بعد الانتهاء من الاختبارات ، يجب عليك إيقاف PWM وتنظيف GPIOs:

إمالة = توقف ()

GPIO.cleanup ()

تعرض شاشة الطباعة الطرفية أعلاه النتيجة لكل من الماكينات الخاصة بي (التي لها نتائج مماثلة). يمكن أن يكون نطاقك مختلفًا.

الخطوة الخامسة: إنشاء برنامج نصي بايثون

إنشاء برنامج نصي بايثون
إنشاء برنامج نصي بايثون

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

كيف افعلها؟ بسيط جدا! نعلم أن نطاق دورة العمل يتراوح من 3٪ إلى 13٪ وأن هذا يعادل الزوايا التي تتراوح من 0 إلى 180 درجة. أيضًا ، نعلم أن هذه الاختلافات خطية ، لذلك يمكننا إنشاء مخطط نسبي كما هو موضح أعلاه. لذلك ، بالنظر إلى الزاوية ، يمكن أن يكون لدينا دورة عمل مراسلة:

dutycycle = زاوية / 18 + 3

احتفظ بهذه الصيغة. سنستخدمه في الكود التالي.

لنقم بإنشاء برنامج نصي بلغة Python لتنفيذ الاختبارات. في الأساس ، سوف نكرر ما فعلناه من قبل في Python Shell:

من وقت استيراد النوم

استيراد RPi. GPIO كـ GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (مؤازرة ، زاوية): pwm = GPIO. PWM (مؤازرة ، 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () إذا _name_ == '_main_': استيراد أجهزة النظام = int (sys.argv [1]) GPIO.setup (مؤازرة ، GPIO. OUT) setServoAngle (مؤازرة ، int (sys.argv [2])) GPIO.cleanup ()

جوهر الكود أعلاه هو وظيفة setServoAngle (مؤازرة ، زاوية). تستقبل هذه الوظيفة كوسائط ، ورقم مؤازر GPIO ، وقيمة زاوية إلى حيث يجب وضع المؤازرة. بمجرد أن يكون إدخال هذه الوظيفة هو "الزاوية" ، يجب علينا تحويلها إلى دورة عمل بالنسبة المئوية ، باستخدام الصيغة التي تم تطويرها من قبل.

عند تنفيذ البرنامج النصي ، يجب أن تدخل كمعلمات ومؤازرة GPIO وزاوية.

على سبيل المثال:

sudo python3 angleServoCtrl.py 17 45

سيضع الأمر أعلاه المؤازرة المتصلة على GPIO 17 بزاوية 45 درجة في "الارتفاع". يمكن استخدام أمر مماثل للتحكم في Pan Servo (الموضع حتى 45 درجة في "السمت"):

زاوية sudo pythonServoCtrl.py 27 45

يمكن تنزيل ملف angleServoCtrl.py من جيثب الخاص بي

الخطوة 6: آلية Pan-Tilt

آلية عموم الميل
آلية عموم الميل

ستتحرك المؤازرة "Pan" الكاميرا "أفقيًا" ("زاوية السمت") وستقوم أجهزة "Tilt" بتحريكها "عموديًا" (زاوية الارتفاع).

توضح الصورة أدناه كيفية عمل آلية التحريك / الإمالة:

صورة
صورة

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

الخطوة السابعة: آلية الدوران الشامل - البناء الميكانيكي

آلية عموم الميل - البناء الميكانيكي
آلية عموم الميل - البناء الميكانيكي
آلية عموم الميل - البناء الميكانيكي
آلية عموم الميل - البناء الميكانيكي
آلية عموم الميل - البناء الميكانيكي
آلية عموم الميل - البناء الميكانيكي

دعنا الآن نقوم بتجميع 2 الماكينات الخاصة بنا كآلية تحريك / إمالة. يمكنك فعل شيئين هنا. قم بشراء آلية منصة Pan-Tilt كما هو موضح في الخطوة الأخيرة أو قم ببناء آلية خاصة بك وفقًا لاحتياجاتك.

يمكن أن يكون أحد الأمثلة هو الذي قمت ببنائه ، فقط بربط الماكينات ببعضها البعض ، واستخدام قطع معدنية صغيرة من الألعاب القديمة كما هو موضح في الصور أعلاه.

الخطوة 8: مقلاة كهربائية / مجموعة إمالة

مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة
مقلاة كهربائية / تجميع إمالة

بمجرد تجميع آلية التحريك / الإمالة ، اتبع الصور للحصول على توصيل كهربائي كامل.

  1. قم بإيقاف تشغيل Pi الخاص بك.
  2. قم بعمل جميع التوصيلات الكهربائية.
  3. تحقق مرة أخرى.
  4. قم بتشغيل Pi الخاص بك أولاً.
  5. إذا كان كل شيء على ما يرام ، فقم بتشغيل الماكينات الخاصة بك.

لن نستكشف في هذا البرنامج التعليمي كيفية إعداد الكاميرا ، سيتم شرح ذلك في البرنامج التعليمي التالي.

الخطوة 9: نص بايثون

لنقم بإنشاء Python Script للتحكم في كلتا الماكينات في وقت واحد:

من وقت استيراد النوم

استيراد RPi. GPIO كـ GPIO GPIO.setmode (GPIO. BCM) GPIO.set warnings (False) pan = 27 tilt = 17 GPIO.setup (tilt، GPIO. OUT) # white => TILT GPIO.setup (pan، GPIO. OUT) # gray ==> PAN def setServoAngle (مؤازر ، زاوية): تأكيد الزاوية> = 30 والزاوية 90 (النقطة الوسطى) ==> 150 setServoAngle (إمالة ، int (sys.argv [2])) # 30 ==> 90 (النقطة الوسطى) ==> 150 GPIO.cleanup ()

عندما يتم تنفيذ البرنامج النصي ، يجب أن تدخل كمعلمات ، زاوية الدوران وزاوية الميل. على سبيل المثال:

sudo python3 servoCtrl.py 45120

سيضع الأمر أعلاه آلية Pan / Tilt بزاوية 45 درجة في "السمت" (زاوية الدوران) و 120 درجة في "الارتفاع" (زاوية الميل). لاحظ أنه إذا لم يتم إدخال أي معلمات ، فسيكون الإعداد الافتراضي هو كل من زوايا التحريك والإمالة حتى 90 درجة.

أدناه يمكنك رؤية بعض الاختبارات:

صورة
صورة

يمكن تنزيل ملف servoCtrl.py من GitHub الخاص بي.

الخطوة 10: اختبار تكرار الخوادم

دعنا الآن ننشئ Python Script لاختبار النطاق الكامل من الماكينات تلقائيًا:

من وقت استيراد النوم

استيراد RPi. GPIO كـ GPIO GPIO.setmode (GPIO. BCM) GPIO.set warnings (False) pan = 27 tilt = 17 GPIO.setup (tilt، GPIO. OUT) # white => TILT GPIO.setup (pan، GPIO. OUT) # gray ==> PAN def setServoAngle (مؤازر ، زاوية): تأكيد الزاوية> = 30 والزاوية <= 150 pwm = GPIO. PWM (مؤازرة ، 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () إذا _name_ == '_main_': من أجل i في النطاق (30 ، 160 ، 15): setServoAngle (pan ، i) setServoAngle (الإمالة ، i) لـ i in النطاق (150 ، 30 ، -15): setServoAngle (pan، i) setServoAngle (tilt، i) setServoAngle (pan، 100) setServoAngle (tilt، 90) GPIO.cleanup ()

سيقوم البرنامج تلقائيًا بتنفيذ حلقة من 30 إلى 150 درجة في كلا الزاويتين.

تحت النتيجة:

لقد قمت بتوصيل مرسمة الذبذبات فقط لتوضيح نظرية PWM كما هو موضح من قبل.

صورة
صورة

يمكن تنزيل الكود أعلاه ، servoTest.py من جيثب الخاص بي.

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

استنتاج
استنتاج

كما هو الحال دائمًا ، آمل أن يساعد هذا المشروع الآخرين في العثور على طريقهم إلى عالم الإلكترونيات المثير!

للحصول على التفاصيل والرمز النهائي ، يرجى زيارة مستودع GitHub الخاص بي: RPi-Pan-Tilt-Servo-Control

لمزيد من المشاريع ، يرجى زيارة مدونتي: MJRoBot.org

فيما يلي لمحة عن البرنامج التعليمي التالي:

صورة
صورة

Saludos من جنوب العالم!

نراكم في بلدي التعليمات القادمة!

شكرا لك،

مارسيلو

موصى به: