جميع أنواع الطرفيات في وحدة 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 فلا تحتوي على أزرار مخصصة.

results matching ""

    No results matching ""