3.10. دخل GPIO¶
تمر قراءة مفتاح (أو أي إشارة رقمية) من دبوس GPIO عبر machine.Pin مرة أخرى، لكن مهيأة هذه المرة كدخل. والواجهة متناظرة مع الخرج: هيّئ الوضع، ثم إما استطلاع قيمة الدبوس في الحلقة الرئيسية أو تسجيل معالج مقاطعة يُطلَق عندما تتغير القيمة.
3.10.1. تهيئة الدخل¶
مرّر Pin.IN إلى المُنشئ، واختياريًا مقاومة سحب:
from machine import Pin
button = Pin("P0", Pin.IN, Pin.PULL_UP)
يهيّئ ذلك P0 كدخل مع تمكين مقاومة السحب لأعلى الداخلية في الـ MCU. ومع عدم توصيل أي شيء بالدبوس، يبقيه السحب لأعلى مرتفعًا؛ وإغلاق مفتاح من الدبوس إلى الأرضي يسحبه منخفضًا.
3.10.2. قراءة القيمة¶
تُرجع value() بدون وسائط الحالة الحالية -- 0 للمنخفض و 1 للمرتفع:
if button.value() == 0:
print("button pressed")
else:
print("button released")
في نمط الحلقة الرئيسية، يبدو الاستطلاع هكذا:
while True:
if button.value() == 0:
do_action()
time.sleep_ms(50)
يمنع توقف 50 ms الحلقة من العمل بكامل طاقة المعالج.
3.10.3. الدخل المعتمد على المقاطعات¶
الاستطلاع يعمل، لكن كل تكرار للحلقة الرئيسية يكلّف وقت معالج. وبالنسبة للمداخل التي تتغير نادرًا -- ضغطة زر مرة كل دقيقة، أو إشارة إنذار -- تسجّل irq() معالجًا يعمل فقط عندما يتغير الدبوس.
يعمل المعالج في سياق المقاطعة، الأمر الذي يقيّد ما يمكنه فعله:
لا تخصيص للذاكرة. قد يفشل إنشاء كائنات جديدة -- قوائم، أو سلاسل نصية، أو استثناءات، أو سلاسل منسّقة -- داخل الـ ISR لأن الكومة (heap) مقفلة. خصّص مسبقًا أي مخازن مؤقتة يحتاجها المعالج على نطاق الوحدة.
لا عمل طويل المدى. ينبغي للمعالج أن يسلّم العمل ويعود. فقضاء وقت فعلي داخل الـ ISR يؤخر كل شيء آخر (المقاطعات الأخرى، والحلقة الرئيسية، وحركة USB).
لا طباعة في ISR محكم. تخصّص
print()الذاكرة، وتحجب على الـ UART، وهي واحدة من أكثر الأشياء كلفة التي يمكن للمعالج فعلها.
النمط القياسي هو أن تقوم الـ ISR بجدولة العمل الحقيقي عبر micropython.schedule()، التي تضع دالة في الطابور لتعمل مجددًا في السياق الرئيسي عند النقطة الآمنة التالية:
import micropython
def handle_press(pin):
print("button pressed")
def on_press(pin):
micropython.schedule(handle_press, pin)
button.irq(handler=on_press, trigger=Pin.IRQ_FALLING)
الـ ISR سطر واحد: ضع دالة رد النداء في الطابور وعُد. ثم تعمل handle_press في السياق الطبيعي، حيث يكون التخصيص و print() والإدخال/الإخراج البطيء جميعها آمنة مرة أخرى.
تختار الوسيطة trigger أي حافة تُطلِق:
Pin.IRQ_FALLING-- من 1 إلى 0.Pin.IRQ_RISING-- من 0 إلى 1.Pin.IRQ_FALLING|Pin.IRQ_RISING-- كلتا الحافتين.