Divers périphériques pyb

Vue d'ensemble

En tant que microcontrôleur monopuce, contrôler le port IO, l'IIC, le SPI, le CAN, le PWM et les timers est tout à fait supportable. De plus, utiliser le langage python est un moyen simple de les manipuler sans se soucier des registres.

Tableaux OpenMV2 M4 OpenMV3 M7 OpenMV4 H7 OpenMV4 H7 Plus OpenMV RT1062
Broche 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
Bus CAN 0 1 1 1 1
Bouton d'alimentation 0 0 0 0 1
Boutons personnalisables 0 0 0 0 1
Tolérance des broches 5V 5V 5V 5V 3.3V
Niveau des broches 3.3V 3.3V 3.3V 3.3V 3.3V
Puce STM32F427 STM32F765 STM32H743 STM32H743 IMXRT1062
RAM 256Ko 512Ko 1Mo 32Mo + 1Mo 32Mo + 1Mo
Flash 1Mo 2Mo 2Mo 32Mo + 2Mo 16Mo
Fréquence 180MHz 216MHZ 480MHZ 480MHZ 600MHZ
Élément photosensible standard OV7725 (30W pixels) OV7725 (30W pixels) OV7725 (30W pixels) OV5640 (5 millions de pixels) OV5640 (5 millions de pixels)

Remarque : comme MicroPython peut fonctionner sur de nombreuses plateformes, le module pyb, pyboard, était à l'origine basé sur STM32, mais par la suite esp8266 et esp32, ainsi que la série nrf, ont été ajoutés. Leurs architectures sont différentes de celle de STM32. C'est pourquoi l'équipe officielle a unifié le module machine, plus universel, et pyb finira par être abandonné.

Pour l'OpenMV4 H7 Plus / OpenMV4 H7 / OpenMV3, le contrôleur principal est un STM32, utilisant généralement le module pyb.

Le tout dernier OpenMV RT1062 sorti en 2024, dont le contrôleur principal est un IMXRT1062, ne prend en charge que le module machine, pas le module pyb. Veuillez utiliser le code correspondant du module machine~

Fonctions couramment utilisées

pyb.delay(50) # délai de 50 millisecondes
pyb.millis() # obtient le nombre de millisecondes écoulées depuis le démarrage

LED

from pyb import LED

led = LED(1) # LED rouge
led.toggle()
led.on()# allumer
led.off()# éteindre

LED(1) -> LED rouge\ LED(2) -> LED verte\ LED(3) -> LED bleue\ LED(4) -> LED infrarouge, deux

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

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)# définit p_out comme broche de sortie
p_out.high()# met la broche p_out au niveau haut
p_out.low()# met la broche p_out au niveau bas

p_in = Pin('P7', Pin.IN, Pin.PULL_UP)# définit p_in comme broche d'entrée, et active la résistance de tirage
value = p_in.value() # obtient la valeur, 0 ou 1# lit la valeur de la broche p_in

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

from machine import Pin

p_out = Pin("P7", Pin.OUT)# définit p_out comme broche de sortie
p_out.high()# met la broche p_out au niveau haut
p_out.low()# met la broche p_out au niveau bas

p_in = Pin("P8", Pin.IN, Pin.PULL_UP)# définit p_in comme broche d'entrée, et active la résistance de tirage
value = p_in.value() # obtient la valeur, 0 ou 1# lit la valeur de la broche p_in

Servomoteur

Tutoriel vidéo 34 - OpenMV contrôle trois servomoteurs : https://singtown.com/learn/50541/

from pyb import Servo

s1 = Servo(1) # servo en position 1 (P7)
s1.angle(45) # se déplace à 45 degrés
s1.angle(-60, 1500) # se déplace à -60 degrés en 1500ms
s1.speed(50) # pour les servos à rotation continue
  • Servo(1) -> P7 (PD12)
  • Servo(2) -> P8 (PD13)

Ajouté sur OpenMV3 M7 / OpenMV4 H7 :

  • Servo(3) -> P9 (PD14)

Remarque : la broche P9 de l'OpenMV4 H7 Plus ne peut pas utiliser le PWM

L'OpenMV RT1062 dispose de quatre broches PWM : P7 P8 P9 P10. Vous ne pouvez pas utiliser le module pyb sur OpenMV RT, seul le module machine suivant peut être utilisé :

# Exemple de contrôle de servomoteur
#
# Cet exemple montre comment utiliser OpenMV pour contrôler un servomoteur
#
# Le système de servocommande nécessite un PWM à 50 Hz, avec une largeur d'impulsion de 1000us à 2000us.

import time
from machine import PWM

# P7 et P8 peuvent partager le même module PWM, ils doivent avoir la même fréquence.
p7 = PWM("P7", freq=50, duty_ns=(2000 * 1000))
p8 = PWM("P8", freq=50, duty_ns=(2000 * 1000))

# P9 et P10 peuvent partager le même module PWM, ils doivent avoir la même fréquence.
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)

Interruption IO

from pyb import Pin, ExtInt

callback = lambda e: print("intr")
ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

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() # obtient la valeur du compteur
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())

Timer 1 Canal 3 Négatif -> P0\ Timer 1 Canal 2 Négatif -> P1\ Timer 1 Canal 1 Négatif -> P2\ Timer 2 Canal 3 Positif -> P4\ Timer 2 Canal 4 Positif -> P5\ Timer 2 Canal 1 Positif -> P6\ Timer 4 Canal 1 Négatif -> P7\ Timer 4 Canal 2 Négatif -> P8

Ajouté sur OpenMV M7 :\ Timer 4 Canal 3 Positif -> P9

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

from machine import LED
from machine import Timer

blue_led = LED("LED_BLUE")

# Lorsqu'il est appelé, nous recevrons l'objet timer en retour
# Remarque : les fonctions n'ont pas le droit d'allouer de la mémoire dans le callback
def tick(timer):
    blue_led.toggle()

# Le module machine ne prend actuellement en charge que le timer virtuel -1.
tim = Timer(-1, freq=1, callback=tick)  # crée un objet timer — déclenché à 1Hz

PWM

from pyb import Pin, Timer

p = Pin('P7') # P7 dispose de TIM4, CH1
tim = Timer(4, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

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() # lit la valeur, 0-4095

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

from machine import ADC

adc = ADC('P6')
adc.read_u16()

DAC

from pyb import Pin, DAC

dac = DAC('P6')
dac.write(120) # sortie entre 0 et 255

UART

from pyb import UART

uart = UART(3, 9600)
uart.write('hello')
uart.read(5) # lit jusqu'à 5 octets

UART 3 RX ->; P5 (PB11)\ UART 3 TX -> P4 (PB10)

Ajouté sur OpenMV3 M7 / OpenMV4 H7 / OpenMV4 H7 Plus :\ UART 1 RX -> P0 (PB15)\ UART 1 TX -> P1 (PB14)

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

from machine import UART

uart = UART(1, 9600)
uart.write('hello')
uart.read(5) # lit jusqu'à 5 octets

L'OpenMV RT1062 ne dispose que du port série 1, correspondant aux broches 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) # reçoit 5 octets sur le bus
spi.send_recv(b'hello') # envoie et reçoit 5 octets

Le module pyb ne peut pas être utilisé sur OpenMV RT, seul le module machine suivant peut être utilisé :

from machine import SPI

spi = SPI(1, baudrate=int(1000000000 / 66), polarity=0, phase=0)
spi.write(b'hello')
spi.read(5) # reçoit 5 octets sur le bus

txdata = b"12345678"
rxdata = bytearray(len(txdata))
spi.write_readinto(txdata, rxdata)  # Écrit et lit des octets simultanément.

I2C

from machine import I2C, Pin
i2c = I2C(sda=Pin('P5'),scl=Pin('P4'))

i2c.scan()
i2c.writeto(0x42, b'123')         # écrit 3 octets vers l'esclave à l'adresse 7 bits 42
i2c.readfrom(0x42, 4)             # lit 4 octets depuis l'esclave à l'adresse 7 bits 42

i2c.readfrom_mem(0x42, 8, 3)      # lit 3 octets depuis la mémoire de l'esclave 42,
                                # en commençant à l'adresse mémoire 8 de l'esclave
i2c.writeto_mem(0x42, 2, b'\x10') # écrit 1 octet dans la mémoire de l'esclave 42
                                # en commençant à l'adresse 2 de l'esclave

I2C 2 SCL (Horloge série) -> P4 (PB10)\ I2C 2 SDA (Données série) -> P5 (PB11)

Ajouté sur OpenMV3 M7 / OpenMV4 H7 / OpenMV4 H7 Plus :\ I2C 4 SCL (Horloge série) -> P7 (PD13)\ I2C 4 SDA (Données série) -> P8 (PD12)

La bibliothèque machine est un protocole I2C émulé en logiciel, donc n'importe quelle broche peut être utilisée, mais il est recommandé d'utiliser les broches mentionnées ci-dessus.

Sur OpenMV RT, vous pouvez l'appeler ainsi :

from machine import I2C, Pin
i2c = I2C(1)

i2c.scan()
i2c.writeto(0x42, b'123')         # écrit 3 octets vers l'esclave à l'adresse 7 bits 42
i2c.readfrom(0x42, 4)             # lit 4 octets depuis l'esclave à l'adresse 7 bits 42

i2c.readfrom_mem(0x42, 8, 3)      # lit 3 octets depuis la mémoire de l'esclave 42,
                                # en commençant à l'adresse mémoire 8 de l'esclave
i2c.writeto_mem(0x42, 2, b'\x10') # écrit 1 octet dans la mémoire de l'esclave 42
                                # en commençant à l'adresse 2 de l'esclave

Bouton personnalisé sur la broche Switch SW

# Le commutateur utilisateur sur l'OpenMV Cam peut être lu via la broche « SW ».
# Cette broche est anti-rebond matériellement via un circuit RC.
# Il suffit donc de lire l'état de la broche pour savoir si le commutateur est enfoncé.

import machine

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

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

Seul l'OpenMV RT dispose de boutons personnalisés SW, les OpenMV4 H7 / OpenMV4 H7 Plus / OpenMV3 M7 n'ont pas de boutons personnalisés.

results matching ""

    No results matching ""