pyb различные периферийные устройства

Обзор

Как микроконтроллер он управляет портами ввода-вывода, IIC, SPI, CAN и PWM. Конечно, таймеры доступны.\ Более того, используя язык Python, их можно вызывать очень просто, не учитывая регистры.

Tables 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
Servo 2 3 3 2 4
CAN bus 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 (пиксели 30 Вт) OV7725 (пиксели 30 Вт) OV7725 (пиксели 30 Вт) OV5640 (пиксели 500 Вт) OV5640 (пиксели 500 Вт)

Примечание. Поскольку MicroPython может работать на многих платформах. Первоначально модуль pyb, pyboard, был основан на STM32, но позже были добавлены серии esp8266, esp32 и nrf. Их архитектура отличается от STM32. Таким образом, сформулирован официальный унифицированный машинный модуль, поэтому он более универсален, и pyb в конечном итоге будет исключен.

OpenMV4 H7 Plus/OpenMV4 H7/OpenMV3, основным элементом управления является STM32, обычно с использованием модуля pyb.

Последняя версия OpenMV RT1062 2024 года, основным элементом управления является IMXRT1062, который поддерживает только machine модуль и не поддерживает модуль pyb. Пожалуйста, используйте соответствующий машинный код~

Часто используемые функции

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引脚为高
p_out.low()#设置p_out引脚为低

p_in = Pin('P7', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
value = p_in.value() # get value, 0 or 1#读入p_in引脚的值

Модуль pyb нельзя использовать в OpenMV RT. Можно использовать только следующие machine модули:

from machine import Pin

p_out = Pin("P7", Pin.OUT)#设置p_out为输出引脚
p_out.high()#设置p_out引脚为高
p_out.low()#设置p_out引脚为低

p_in = Pin("P8", Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
value = p_in.value() # get value, 0 or 1#读入p_in引脚的值

Servo

Видеоурок 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)

Примечание. OpenMV4 H7 Plus P9 не может использовать PWM

OpenMV RT1062 имеет четыре контакта ШИМ P7 P8 P9 P10. Модуль pyb нельзя использовать в OpenMV RT. Можно использовать только следующие machine модули:

# 舵机控制例子
#
# 这个例子展示了如何使用OpenMV来控制舵机
#
# 伺服系统需要 50 Hz PWM,脉冲宽度为 1000us 至 2000us。

import time
from machine import PWM

# P7 和 P8 可以共享相同的 PWM  module,它们需要具有相同的频率。
p7 = PWM("P7", freq=50, duty_ns=(2000 * 1000))
p8 = PWM("P8", freq=50, duty_ns=(2000 * 1000))

# P9 和 P10 可以共享相同的 PWM  module,它们需要具有相同的频率。
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)

прерывание ввода-вывода

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)

таймер

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())

Timer 1 Channel 3 Negative -> P0\ Timer 1 Channel 2 Negative -> P1\ Timer 1 Channel 1 Negative -> P2\ Timer 2 Channel 3 Positive -> P4\ Timer 2 Channel 4 Positive -> P5\ Timer 2 Channel 1 Positive -> P6\ Timer 4 Channel 1 Negative -> P7\ Timer 4 Channel 2 Negative -> P8

OpenMV M7上增加:\ Timer 4 Channel 3 Positive -> P9

Модуль pyb нельзя использовать в OpenMV RT. Можно использовать только следующие machine модули:

from machine import LED
from machine import Timer

blue_led = LED("LED_BLUE")

# 当被调用时,我们将返回timer对象
# 注意:在回调中不允许分配内存的函数
def tick(timer):
    blue_led.toggle()

# machine模块目前仅支持-1虚拟定时器。
tim = Timer(-1, freq=1, callback=tick)  # 创建一个定时器对象—以1Hz触发

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 (Serial Clock) -> P4 (PB10)\ I2C 2 SDA (Serial Data) -> P5 (PB11)

В OpenMV3 M7/OpenMV4 H7/OpenMV4 H7 Plus добавлено:\ I2C 4 SCL (Serial Clock) -> P7 (PD13)\ I2C 4 SDA (Serial Data) -> P8 (PD12)

Машинная библиотека представляет собой протокол I2C, моделируемый программным обеспечением, поэтому можно использовать любой контакт, но все же рекомендуется использовать контакты, упомянутые выше.

В 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

Пользовательская кнопка Switch Pin SW

# OpenMV Cam 上的用户开关可通过“SW”引脚读取。 
# 该引脚通过 RC 电路在硬件中进行去抖。 
# 因此,您只需读取引脚状态即可了解开关是否被按下。

import machine

sw = machine.Pin("SW", machine.Pin.IN)
r = machine.LED("LED_RED")

while True:
    r.value(not sw.value())
    print(sw.value())

Только OpenMV RT имеет пользовательские кнопки ПО, OpenMV4 H7 / OpenMV4 H7 Plus / OpenMV3 M7 не имеют пользовательских кнопок.

results matching ""

    No results matching ""