class Signal -- ควบคุมและรับรู้ดีไวซ์ I/O ภายนอก

คลาส Signal เป็นส่วนขยายง่าย ๆ ของคลาส Pin ต่างจาก Pin ที่อยู่ได้เพียงในสถานะ "สัมบูรณ์" 0 และ 1 Signal สามารถอยู่ในสถานะ "asserted" (เปิด) หรือ "deasserted" (ปิด) ขณะที่กลับสัญญาณ (active-low) หรือไม่ก็ได้ กล่าวอีกนัย มันเพิ่มการรองรับการกลับเชิงตรรกะให้กับฟังก์ชัน Pin แม้ดูเหมือนเพิ่มเล็กน้อย แต่นี่คือสิ่งที่จำเป็นพอดีในการรองรับดีไวซ์ดิจิตอลธรรมดาหลายรูปแบบในแบบที่พกพาได้ข้ามบอร์ดต่าง ๆ ซึ่งเป็นหนึ่งในเป้าหมายสำคัญของ MicroPython ไม่ว่าผู้ใช้จะมี LED active-high หรือ active-low รีเลย์แบบ normally open หรือ normally closed คุณสามารถพัฒนาแอปพลิเคชันเดียวที่ทำงานได้กับทั้งหมด และบันทึกความแตกต่างของฮาร์ดแวร์ไว้ในไม่กี่บรรทัดในไฟล์คอนฟิก

ตัวอย่าง:

from machine import Pin, Signal

# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)

# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)

# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)

# Now lighting up them looks the same
led1.value(1)
led2.value(1)

# Even better:
led1.on()
led2.on()

ต่อไปนี้เป็นแนวทางว่าเมื่อใดควรใช้ Signal เทียบกับ Pin:

  • ใช้ Signal: หากต้องการควบคุมดีไวซ์เปิด/ปิดแบบง่าย (รวมถึง PWM ซอฟต์แวร์!) เช่น LED, อินดิเคเตอร์หลายส่วน, รีเลย์, บัซเซอร์ หรืออ่านเซนเซอร์ไบนารีธรรมดา เช่น ปุ่มกด normally open หรือ normally closed, pulled high หรือ low, Reed switch, ตัวตรวจจับความชื้น/เปลวไฟ ฯลฯ โดยสรุปหากมีดีไวซ์/เซนเซอร์จริงที่ต้องการเข้าถึง GPIO ควรใช้ Signal

  • ใช้ Pin: หากกำลังใช้งานโปรโตคอลระดับสูงหรือบัสเพื่อสื่อสารกับดีไวซ์ที่ซับซ้อนกว่า

การแยกระหว่าง Pin และ Signal มาจากกรณีการใช้งานข้างต้นและสถาปัตยกรรมของ MicroPython: Pin มีค่าใช้จ่ายต่ำที่สุดซึ่งสำคัญเมื่อใช้โปรโตคอล bit-banging แต่ Signal เพิ่มความยืดหยุ่นบน Pin ในราคาค่าใช้จ่ายเล็กน้อย (น้อยกว่าการจัดการความแตกต่าง active-high กับ active-low ใน Python เองมาก) นอกจากนี้ Pin เป็นออบเจกต์ระดับต่ำที่ต้องใช้งานสำหรับแต่ละบอร์ดที่รองรับ ในขณะที่ Signal เป็นออบเจกต์ระดับสูงที่ได้มาฟรีเมื่อ Pin ถูกใช้งานแล้ว

หากสงสัย ลองใช้ Signal ดู! อีกครั้ง มันถูกเสนอมาเพื่อช่วยนักพัฒนาจากความจำเป็นในการจัดการความแตกต่างที่น่าเบื่ออย่าง active-low กับ active-high และให้ผู้ใช้อื่นสามารถแชร์และเพลิดเพลินกับแอปพลิเคชันของคุณ แทนที่จะหงุดหงิดที่มันไม่ทำงานเพราะ LED หรือรีเลย์ของพวกเขาต่อสายต่างกันเล็กน้อย

คอนสตรักเตอร์

class machine.Signal(pin_obj: Pin, *, invert: bool = False)
class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)

สร้างออบเจกต์ Signal มีสองวิธีในการสร้าง:

  • ครอบออบเจกต์ Pin ที่มีอยู่ -- ใช้ได้ทั่วไป ทำงานได้บนทุกบอร์ด

  • ส่งอาร์กิวเมนต์คอนสตรักเตอร์ Pin โดยตรง -- อาร์กิวเมนต์ตำแหน่งและคีย์เวิร์ดเดียวกับที่ Pin รับจะถูกส่งต่อไปยัง Pin ที่สร้างภายใน มีบนหลายบอร์ดแต่ไม่ทั้งหมด

อาร์กิวเมนต์:

  • pin_obj -- อินสแตนซ์ Pin ที่มีอยู่ที่ต้องการครอบ

  • pin_args / pin_kwargs -- อาร์กิวเมนต์ที่ส่งต่อไปยังคอนสตรักเตอร์ Pin เมื่อสร้าง pin พื้นฐานแบบ inline

  • invert -- หาก True สัญญาณจะถูกกลับ (active low)

เมธอด

value(x: Any = None, /) int | None

เมธอดนี้ใช้ตั้งค่าและดึงค่าของสัญญาณ ขึ้นอยู่กับว่ามีการส่งอาร์กิวเมนต์ x หรือไม่

หากละอาร์กิวเมนต์ไว้ เมธอดนี้จะดึงระดับสัญญาณ โดย 1 หมายถึงสัญญาณ asserted (ทำงาน) และ 0 หมายถึงสัญญาณไม่ทำงาน

หากส่งอาร์กิวเมนต์ เมธอดนี้จะตั้งระดับสัญญาณ อาร์กิวเมนต์ x สามารถเป็นอะไรก็ได้ที่แปลงเป็นบูลีน หากแปลงเป็น True สัญญาณจะทำงาน มิฉะนั้นสัญญาณจะไม่ทำงาน

ความสัมพันธ์ระหว่างสัญญาณที่ทำงานกับระดับลอจิกจริงบนพินพื้นฐานขึ้นอยู่กับว่าสัญญาณถูกกลับ (active-low) หรือไม่ สำหรับสัญญาณที่ไม่กลับ สถานะทำงานสอดคล้องกับลอจิก 1 และไม่ทำงานสอดคล้องกับลอจิก 0 สำหรับสัญญาณกลับ/active-low สถานะทำงานสอดคล้องกับลอจิก 0 ขณะที่ไม่ทำงานสอดคล้องกับลอจิก 1

on() None

เปิดใช้งานสัญญาณ

off() None

ปิดใช้งานสัญญาณ