جميع أنواع الطرفيات في وحدة pyb
نظرة عامة
بصفتها شريحة واحدة، يمكنها التحكم بمنافذ الإدخال/الإخراج (IO)، وIIC، وSPI، وCAN، وPWM والمؤقتات، وكل ذلك يمكن التعامل معه بسهولة. علاوة على ذلك، فإن استخدام لغة بايثون يجعل التعامل مع هذه الطرفيات سهلًا للغاية دون الحاجة إلى التعامل مع السجلات (registers) مباشرة.

| الجدول | OpenMV2 M4 | OpenMV3 M7 | OpenMV4 H7 | OpenMV4 H7 Plus | OpenMV RT1062 |
|---|---|---|---|---|---|
| عدد الأطراف (Pin) | 9 | 10 | 10 | 10 | 14 |
| ADC | 1 | 1 | 1 | 1 | 1 |
| DAC | 1 | 1 | 1 | 1 | 0 |
| SPI | 1 | 1 | 1 | 1 | 1 |
| I2C | 1 | 2 | 2 | 2 | 1 |
| UART | 1 | 2 | 2 | 2 | 1 |
| السيرفو | 2 | 3 | 3 | 2 | 4 |
| ناقل CAN | 0 | 1 | 1 | 1 | 1 |
| زر التشغيل | 0 | 0 | 0 | 0 | 1 |
| أزرار قابلة للتخصيص | 0 | 0 | 0 | 0 | 1 |
| تحمل الجهد على الطرف | 5V | 5V | 5V | 5V | 3.3V |
| مستوى الجهد على الطرف | 3.3V | 3.3V | 3.3V | 3.3V | 3.3V |
| الشريحة (IC) | STM32F427 | STM32F765 | STM32H743 | STM32H743 | IMXRT1062 |
| ذاكرة RAM | 256KB | 512KB | 1MB | 32MB + 1MB | 32MB + 1MB |
| ذاكرة Flash | 1MB | 2MB | 2MB | 32MB + 2MB | 16MB |
| التردد | 180MHz | 216MHZ | 480MHZ | 480MHZ | 600MHZ |
| عنصر التصوير الضوئي القياسي | OV7725 (30W pixels) | OV7725 (30W pixels) | OV7725 (30W pixels) | OV5640 (5 million pixels) | OV5640 (5 million pixels) |
ملاحظة: نظرًا لأن MicroPython يمكن أن يعمل على منصات كثيرة. في البداية، كانت وحدة pyb الخاصة بلوحة pyboard مبنية على أساس STM32، ولكن لاحقًا تمت إضافة esp8266 وesp32، وكذلك سلسلة nrf. بنية هذه المنصات مختلفة عن STM32. لذلك، قامت الجهة الرسمية بتوحيد وحدة machine، وهي أكثر عمومية، وستُلغى وحدة pyb في نهاية المطاف.
بالنسبة لـ OpenMV4 H7 Plus / OpenMV4 H7 / OpenMV3، وحدة التحكم الرئيسية هي STM32، وعادةً ما تُستخدم وحدة pyb.
أما أحدث إصدار OpenMV RT1062 لعام 2024، فوحدة التحكم الرئيسية فيه هي IMXRT1062، ولا يدعم إلا وحدة machine، ولا يدعم وحدة pyb. يُرجى استخدام الكود المقابل لوحدة machine~
الدوال شائعة الاستخدام
pyb.delay(50) # تأخير لمدة 50 مللي ثانية
pyb.millis() # الحصول على عدد المللي ثانية المنقضية منذ بدء التشغيل
LED
from pyb import LED
led = LED(1) # LED أحمر
led.toggle()
led.on()# إضاءة
led.off()# إطفاء
LED(1) -> LED أحمر\ LED(2) -> LED أخضر\ LED(3) -> LED أزرق\ LED(4) -> LED أشعة تحت حمراء، اثنان
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import LED
import time
red_led = LED("LED_RED")
green_led = LED("LED_GREEN")
blue_led = LED("LED_BLUE")
blue_led.off()
green_led.off()
red_led.off()
while(1):
green_led.toggle()
red_led.on()
time.sleep_ms(250)
red_led.off()
time.sleep_ms(250)
منافذ الإدخال/الإخراج (IO)
from pyb import Pin
p_out = Pin('P7', Pin.OUT_PP)# ضبط p_out كطرف إخراج
p_out.high()# ضبط طرف p_out على مرتفع (high)
p_out.low()# ضبط طرف p_out على منخفض (low)
p_in = Pin('P7', Pin.IN, Pin.PULL_UP)# ضبط p_in كطرف إدخال، وتفعيل مقاومة السحب العلوي (pull-up)
value = p_in.value() # الحصول على القيمة، 0 أو 1 # قراءة قيمة طرف p_in
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import Pin
p_out = Pin("P7", Pin.OUT)# ضبط p_out كطرف إخراج
p_out.high()# ضبط طرف p_out على مرتفع (high)
p_out.low()# ضبط طرف p_out على منخفض (low)
p_in = Pin("P8", Pin.IN, Pin.PULL_UP)# ضبط p_in كطرف إدخال، وتفعيل مقاومة السحب العلوي (pull-up)
value = p_in.value() # الحصول على القيمة، 0 أو 1 # قراءة قيمة طرف p_in
السيرفو
الدرس المرئي 34 - التحكم في ثلاثة محركات سيرفو باستخدام OpenMV: https://singtown.com/learn/50541/
from pyb import Servo
s1 = Servo(1) # servo on position 1 (P7)
s1.angle(45) # move to 45 degrees
s1.angle(-60, 1500) # move to -60 degrees in 1500ms
s1.speed(50) # for continuous rotation servos
- Servo(1) -> P7 (PD12)
- Servo(2) -> P8 (PD13)
أُضيف في OpenMV3 M7 / OpenMV4 H7:
- Servo(3) -> P9 (PD14)
ملاحظة: لا يمكن استخدام PWM على الطرف P9 في OpenMV4 H7 Plus
يحتوي OpenMV RT1062 على أربعة أطراف PWM هي: P7 وP8 وP9 وP10. لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
# مثال التحكم في السيرفو
#
# يوضح هذا المثال كيفية استخدام OpenMV للتحكم في محرك سيرفو
#
# يحتاج نظام السيرفو إلى إشارة PWM بتردد 50 هرتز، بعرض نبضة يتراوح من 1000us إلى 2000us.
import time
from machine import PWM
# يمكن أن يشترك P7 وP8 في نفس وحدة PWM، ويجب أن يكون لهما نفس التردد.
p7 = PWM("P7", freq=50, duty_ns=(2000 * 1000))
p8 = PWM("P8", freq=50, duty_ns=(2000 * 1000))
# يمكن أن يشترك P9 وP10 في نفس وحدة PWM، ويجب أن يكون لهما نفس التردد.
p9 = PWM("P9", freq=50, duty_ns=(2000 * 1000))
p10 = PWM("P10", freq=50, duty_ns=(2000 * 1000))
while True:
for i in range(1000, 2000, 100):
p7.duty_ns(i * 1000)
p8.duty_ns(i * 1000)
p9.duty_ns(i * 1000)
p10.duty_ns(i * 1000)
time.sleep_ms(1000)
for i in range(2000, 1000, -100):
p7.duty_ns(i * 1000)
p8.duty_ns(i * 1000)
p9.duty_ns(i * 1000)
p10.duty_ns(i * 1000)
time.sleep_ms(1000)
المقاطعات على منافذ الإدخال/الإخراج (IO interrupt)
from pyb import Pin, ExtInt
callback = lambda e: print("intr")
ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import Pin
import time
pin0 = Pin("P0", Pin.IN, Pin.PULL_UP)
callback = lambda e: print("intr")
pin0.irq(callback, Pin.IRQ_FALLING)
while True:
time.sleep(1)
المؤقت (Timer)
from pyb import Timer
tim = Timer(4, freq=1000)
tim.counter() # get counter value
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())
القناة السالبة 3 للمؤقت 1 -> P0\ القناة السالبة 2 للمؤقت 1 -> P1\ القناة السالبة 1 للمؤقت 1 -> P2\ القناة الموجبة 3 للمؤقت 2 -> P4\ القناة الموجبة 4 للمؤقت 2 -> P5\ القناة الموجبة 1 للمؤقت 2 -> P6\ القناة السالبة 1 للمؤقت 4 -> P7\ القناة السالبة 2 للمؤقت 4 -> P8
أُضيف في OpenMV M7:\ القناة الموجبة 3 للمؤقت 4 -> P9
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import LED
from machine import Timer
blue_led = LED("LED_BLUE")
# عند استدعائها، سيتم تمرير كائن المؤقت (timer) إليها
# ملاحظة: لا يُسمح بتخصيص الذاكرة داخل دالة الاستدعاء (callback)
def tick(timer):
blue_led.toggle()
# تدعم وحدة machine حاليًا فقط المؤقت الافتراضي رقم -1.
tim = Timer(-1, freq=1, callback=tick) # إنشاء كائن مؤقت - يعمل بتردد 1 هرتز
PWM
from pyb import Pin, Timer
p = Pin('P7') # P7 has TIM4, CH1
tim = Timer(4, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import PWM
import time
p7 = PWM("P7", freq=100, duty_u16=32768)
while True:
for i in range(0, 65536, 256):
p7.duty_u16(65535 - i)
time.sleep_ms(10)
p7.duty_u16(32768)
ADC
from pyb import Pin, ADC
adc = ADC('P6')
adc.read() # read value, 0-4095
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import ADC
adc = ADC('P6')
adc.read_u16()
DAC
from pyb import Pin, DAC
dac = DAC('P6')
dac.write(120) # output between 0 and 255
UART
from pyb import UART
uart = UART(3, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes
استقبال UART 3 (RX) -> P5 (PB11)\ إرسال UART 3 (TX) -> P4 (PB10)
أُضيف في OpenMV3 M7 / OpenMV4 H7 / OpenMV4 H7 Plus:\ استقبال UART 1 (RX) -> P0 (PB15)\ إرسال UART 1 (TX) -> P1 (PB14)
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import UART
uart = UART(1, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes
يحتوي OpenMV RT1062 على منفذ تسلسلي واحد فقط (رقم 1)، ويقابل الطرفين P4 وP5. استقبال UART 1 (RX) -> P5 (PB11)\ إرسال UART 1 (TX) -> P4 (PB10)
SPI
from pyb import SPI
spi = SPI(2, SPI.MASTER, baudrate=200000, polarity=1, phase=0)
spi.send(b'hello')
spi.recv(5) # receive 5 bytes on the bus
spi.send_recv(b'hello') # send a receive 5 bytes
لا يمكن استخدام وحدة pyb على OpenMV RT، ولا يمكن استخدام إلا وحدة machine التالية:
from machine import SPI
spi = SPI(1, baudrate=int(1000000000 / 66), polarity=0, phase=0)
spi.write(b'hello')
spi.read(5) # receive 5 bytes on the bus
txdata = b"12345678"
rxdata = bytearray(len(txdata))
spi.write_readinto(txdata, rxdata) # Simultaneously write and read bytes.
I2C
from machine import I2C, Pin
i2c = I2C(sda=Pin('P5'),scl=Pin('P4'))
i2c.scan()
i2c.writeto(0x42, b'123') # write 3 bytes to slave with 7-bit address 42
i2c.readfrom(0x42, 4) # read 4 bytes from slave with 7-bit address 42
i2c.readfrom_mem(0x42, 8, 3) # read 3 bytes from memory of slave 42,
# starting at memory-address 8 in the slave
i2c.writeto_mem(0x42, 2, b'\x10') # write 1 byte to memory of slave 42
# starting at address 2 in the slave
عمود الساعة I2C 2 (SCL) -> P4 (PB10)\ خط البيانات I2C 2 (SDA) -> P5 (PB11)
أُضيف في OpenMV3 M7 / OpenMV4 H7 / OpenMV4 H7 Plus:\ عمود الساعة I2C 4 (SCL) -> P7 (PD13)\ خط البيانات I2C 4 (SDA) -> P8 (PD12)
مكتبة machine تنفذ بروتوكول I2C بمحاكاة برمجية (software-emulated)، لذلك يمكن استخدام أي أطراف، لكن يُنصح باستخدام الأطراف المذكورة أعلاه.
على OpenMV RT، يمكنك استدعاؤها كما يلي:
from machine import I2C, Pin
i2c = I2C(1)
i2c.scan()
i2c.writeto(0x42, b'123') # write 3 bytes to slave with 7-bit address 42
i2c.readfrom(0x42, 4) # read 4 bytes from slave with 7-bit address 42
i2c.readfrom_mem(0x42, 8, 3) # read 3 bytes from memory of slave 42,
# starting at memory-address 8 in the slave
i2c.writeto_mem(0x42, 2, b'\x10') # write 1 byte to memory of slave 42
# starting at address 2 in the slave
زر التبديل المخصص SW على الطرف
# يمكن قراءة مفتاح المستخدم الموجود على كاميرا OpenMV من خلال الطرف "SW".
# يتم إزالة الارتداد (debounce) عن هذا الطرف بواسطة دائرة RC في العتاد (hardware).
# لذلك، يكفي قراءة حالة الطرف لمعرفة ما إذا كان المفتاح قد تم الضغط عليه أم لا.
import machine
sw = machine.Pin("SW", machine.Pin.IN)
r = machine.LED("LED_RED")
while True:
r.value(not sw.value())
print(sw.value())
يوجد زر SW المخصص فقط في OpenMV RT، أما OpenMV4 H7 / OpenMV4 H7 Plus / OpenMV3 M7 فلا تحتوي على أزرار مخصصة.