3.16. التحكم في المؤازر¶
المؤازر للهواية (RC) هو محرك مسنّن صغير في علبة محكمة الإغلاق مزوّد بتحكم بالموضع ذي حلقة مغلقة مدمج فيه. يقع داخل العلبة محرك تيار مستمر، وعلبة تروس تخفيضية، ومقاومة متغيرة موصولة بعمود الخرج، ولوحة سواقة صغيرة تقارن قراءة المقاومة المتغيرة بقيمة مرجعية واردة من الخارج. تدير السواقة المحرك في الاتجاه الذي يقلل الخطأ، وتتوقف عندما يتطابق الموضع. ولا يكون أي من ذلك مرئياً من جانب الكاميرا -- فأنت تخبر المؤازر فقط إلى أين يذهب.
3.16.1. إشارة PWM¶
يأخذ المؤازر قيمته المرجعية على هيئة إشارة PWM بمعدل إطار ثابت قدره 50 Hz، حيث يختار عرض النبضة الموضع:
تقود نبضة بطول 1.0 ms العمود إلى أحد طرفي مداه.
تثبّت نبضة بطول 1.5 ms العمود عند المركز.
تقود نبضة بطول 2.0 ms العمود إلى الطرف الآخر.
وأي قيمة بينهما تُسقَط على موضع وسطي.
يبلغ طول إطار PWM للمؤازر 20 ms؛ ويختار عرض النبضة (1.0 -- 2.0 ms) الموضع.¶
على عكس مصابيح LED والمحركات، لا يحسب المؤازر متوسط إشارة PWM. فعرض النبضة نفسه هو الأمر: إذ يقيس المنطق الداخلي للمؤازر كل نبضة، ويضبط هدفه تبعاً لها، ويدير المحرك حتى يتطابق الخرج. ودورة التشغيل كنسبة (بين 5 % و10 % عبر كامل المدى) عرضية -- فالمهم هو عرض النبضة المطلق، وهو ما يحتاج البرنامج إلى التحكم فيه.
3.16.2. التوصيل¶
تستخدم مؤازرات الهواية موصلاً من ثلاثة أسلاك:
الطاقة (أحمر عادةً): تغذية المؤازر الخاصة، وتكون عادةً من 4.8 V إلى 6 V. لا تزوّد المؤازر بالطاقة من قضيب 3.3 V في الكاميرا -- فهو لا يستطيع تأمين تيار التوقف، وسينخفض جهد القضيب.
الأرضي (أسود أو بني عادةً): مسار العودة لطاقة المؤازر، موصول بأرضي الكاميرا بحيث يكون للإشارة أيضاً مرجع مشترك.
الإشارة (أبيض أو أصفر أو برتقالي عادةً): خط PWM من GPIO الكاميرا.
3.16.3. البرنامج¶
يمكن أن يعمل duty_u16()، لكنه يضبط دورة التشغيل كنسبة من الدورة -- وهذا غير ملائم لإشارة يكون المهم فيها هو عرض النبضة المطلق وتكون الدورة فيها ثابتة. أما duty_ns() فيضبط عرض النبضة مباشرةً بالنانوثانية:
from machine import PWM, Pin
servo = PWM(Pin("P7"), freq=50, duty_ns=1_500_000) # centre
الحامل بتردد 50 Hz (دورة بطول 20 ms)؛ ووقت الارتفاع في كل دورة هو 1500 µs بالضبط. وتجعل دالة مساعدة صغيرة إسقاطَ الموضع على النبضة صريحاً:
def set_position(angle):
# angle: 0..180 degrees mapped to 1.0..2.0 ms
pulse_us = 1000 + (angle * 1000) // 180
servo.duty_ns(pulse_us * 1000)
set_position(0) # full one way
set_position(90) # centre
set_position(180) # full the other way
مسح بطيء عبر المدى:
import time
for angle in range(0, 181, 5):
set_position(angle)
time.sleep_ms(20)
for angle in range(180, -1, -5):
set_position(angle)
time.sleep_ms(20)
إن المدى 1.0 -- 2.0 ms هو المعياري، لكن كثيراً من المؤازرات تقبل مدى أوسع (غالباً من 500 µs إلى 2500 µs) للمدى الكامل. تسرد ورقة بيانات المؤازر حدود عرض النبضة الدقيقة؛ والأرقام خارج هذا المدى قد تصدم المحرك بمصدّاته الميكانيكية.
بالنسبة لمؤازر ذي مدى غير معياري، ارفع الحدود إلى ثوابت وعمِّم الإسقاط ببارامترات:
PULSE_MIN_US = 500 # full one way (from the data sheet)
PULSE_MAX_US = 2500 # full the other way
def set_position(angle):
span_us = PULSE_MAX_US - PULSE_MIN_US
pulse_us = PULSE_MIN_US + (angle * span_us) // 180
servo.duty_ns(pulse_us * 1000)