Driver Shield

Driver Shield ohjaa kahta 3 A:n moottoria tai neljää erillistä 1,5 A:n linjaohjainta laajalla 6-36 V:n syöttöjännitteellä, mikä antaa OpenMV Cam -kameralle kestävän moottorinohjauksen etupään, jossa on käänteisjännite- ja ylijännitesuojaus.

Driver Shield

Täydellisen datalehden, valokuvat ja tilaustiedot löydät Driver Shield -tuotesivulta.

Kohokohdat

  • Kaksi 3 A:n moottoriohjainta TAI neljä 1,5 A:n linjaohjainta, 6-36 V

  • Käänteisjännite- ja transienttiylijännitesuojaus tulossa

  • 0-5 V:n ADC-tulo ±36 V:n ylijännitesuojauksella

  • 0-5 V:n digitaalinen I/O kameran synkronointilaukaisimia varten, oikosulkusuojattu

Nastat

Driver Shield -nastat

Nastaviite

Nasta

Toiminto

P0

DIR lähtöparille O1/O2

P1

DIR lähtöparille O3/O4 (vaihtoehtoinen)

P2

DIR lähtöparille O3/O4 (oletus)

P6

Tasonsiirretty AIN-takaisinluku (0–3,3 V nastassa P6)

P7

PWM lähtöparille O1/O2

P8

PWM lähtöparille O3/O4

P10

SYN — avokollektorityyppinen digitaalinen I/O riviliittimessä

PWR in

6–36 V:n laaja tulo riviliittimessä (käänteisjännitettä sietävä)

AIN in

Analoginen tulo riviliittimessä

VIN out

5,4 V jopa 600 mA:n virralla kortin omasta säätimestä

3,3 V:n kisko

Syöttää suojuksen oman elektroniikan virran

GND-kisko

Yhteinen maa

Muista

AIN on ylijännitesuojattu jopa ±36 V:iin ja toimii oletuksena 0–5 V:n jännitetulona, joka skaalataan alas 0–3,3 V:iin nastassa P6. Silloita suojuksen etupuolella oleva 4–20 mA -tilan shuntti vaihtaaksesi AIN:n 4–20 mA:n virtasilmukkatuloksi.

Muista

SYN on avokollektorityyppinen digitaalinen linja, joka on vedetty ylös 3,3 V:iin kameran puolella ja 5 V:iin SYN-liittimen puolella. Oletuksena se on tulo — suojus siirtää tason 0–5 V SYN:ssä alas 0–3,3 V:iin nastassa P10. Vaihda kortin juotoshyppyä kääntääksesi P10:n lähdöksi, jolloin taso 0–3,3 V nastassa P10 siirretään ylös 0–5 V:iin SYN:ssä.

Muista

Jokainen nasta P0, P1, P2, P6, P7, P8 ja P10 voidaan ottaa muuhun käyttöön. P0, P2, P6, P7, P8 ja P10 on oletuksena kytketty takapuolen juotoshyppyjen kautta — avaa minkä tahansa vapautettavan nastan hyppy. P1 on oletuksena irrotettu: silloita sen etupuolen hyppy ohjataksesi O3/O4:n DIR sen sijaan nastaan P1 (ja avaa P2:n takapuolen hyppy vapauttaaksesi P2:n).

Muista

Suojuksen takana on kaksi tilahyppyä — yksi kullekin H-sillalle — jotka asettavat itsenäisesti kunkin lähtöparin yhteen kolmesta tilasta. Jokaisessa hypyssä on L- ja H-merkinnät, jotka osoittavat, kumpi puoli valitsee minkäkin tilan:

  • Low (oletus) — DIR/PWM-tila: yksi DIR-nasta + yksi PWM-nasta per silta.

  • High — H-siltatila: molemmat nastat ohjaavat siltaa suoraan sirun kaksitulon totuustaulun kautta.

  • Float (ei kytkentää) — itsenäinen tila: kustakin nastasta tulee erillinen linjaohjain, joka on ohjattu yhteen lähtöön.

Jokainen DRV8876 on virtarajoitettu yhteensä 3 A:iin per siru — eli 3 A yhden sillan läpi (DIR/PWM- tai H-siltatila) tai 1,5 A per lähtö jaettuna kahden lähdön kesken (itsenäinen tila).

Käyttö

DIR/PWM-tila (oletus)

Ohjaa harjallista DC-moottoria lähtöparissa O1/O2 — aseta suunta nastassa P0 ja syötä PWM-nopeussignaali nastaan P7. Alla oleva silmukka nostaa pulssisuhteen täyteen nopeuteen ja takaisin alas, sitten kääntää suunnan ja toistaa:

from machine import Pin, PWM
import time

direction = Pin("P0", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)


def ramp(target):
    for duty in range(0, target, 1024):
        speed.duty_u16(duty)
        time.sleep_ms(10)
    for duty in range(target, -1, -1024):
        speed.duty_u16(duty)
        time.sleep_ms(10)


while True:
    direction.value(1)  # forward
    ramp(65_535)
    direction.value(0)  # reverse
    ramp(65_535)

Kaksi H-siltaa voivat myös ohjata bipolaarista askelmoottoria — pidä molemmat PWM-kanavat täydellä ohjauksella ja askella DIR-nastat neljävaiheisen sekvenssin läpi:

from machine import Pin, PWM
import time

dir12 = Pin("P0", Pin.OUT)
dir34 = Pin("P2", Pin.OUT)
PWM(Pin("P7"), freq=20_000, duty_u16=65_535)  # full drive on O1/O2
PWM(Pin("P8"), freq=20_000, duty_u16=65_535)  # full drive on O3/O4

SEQUENCE = [(1, 1), (0, 1), (0, 0), (1, 0)]


def step(forward=True):
    for a, b in SEQUENCE if forward else reversed(SEQUENCE):
        dir12.value(a)
        dir34.value(b)
        time.sleep_ms(5)


while True:
    for _ in range(50):  # ~1 revolution forward (200 phases)
        step()
    for _ in range(50):  # ~1 revolution backward
        step(forward=False)

H-siltatila

Kun tilahyppy on asetettu asentoon high, molemmat sillan nastat ohjaavat H-siltaa suoraan. O1/O2:lle totuustaulu on:

  • (P0, P7) = (L, L) → vapaakierto (lähdöt Hi-Z)

  • (P0, P7) = (L, H) → eteenpäin (O1 = H, O2 = L)

  • (P0, P7) = (H, L) → taaksepäin (O1 = L, O2 = H)

  • (P0, P7) = (H, H) → jarrutus (molemmat lähdöt matalalla)

(O3/O4 noudattaa samaa taulua nastoilla P1/P2 ja P8.) Alla oleva silmukka kierrättää moottorin tilojen eteenpäin → jarrutus → taaksepäin → vapaakierto kautta lähtöparissa O1/O2:

from machine import Pin
import time

p0 = Pin("P0", Pin.OUT)
p7 = Pin("P7", Pin.OUT)


def drive(a, b):
    p0.value(a)
    p7.value(b)


while True:
    drive(0, 1)         # forward
    time.sleep(1)
    drive(1, 1)         # brake
    time.sleep_ms(500)
    drive(1, 0)         # reverse
    time.sleep(1)
    drive(0, 0)         # coast
    time.sleep_ms(500)

Kumpikin nasta voidaan vaihtaa machine.PWM -kanavaksi suhteellista ohjausta varten — esim. (P0=0, P7=PWM) antaa eteenpäin/vapaakierron PWM-pulssisuhteella, (P0=1, P7=PWM) antaa taaksepäin/jarrutuksen suhteella (100 % duty). Alla oleva silmukka nostaa pulssisuhdetta ja laskee sen takaisin, kun P0 pidetään arvossa 0 (eteenpäin/vapaakierto):

from machine import Pin, PWM
import time

p0 = Pin("P0", Pin.OUT, value=0)
p7 = PWM(Pin("P7"), freq=20_000, duty_u16=0)

while True:
    for duty in range(0, 65_536, 1024):
        p7.duty_u16(duty)
        time.sleep_ms(10)
    for duty in range(65_535, -1, -1024):
        p7.duty_u16(duty)
        time.sleep_ms(10)

Itsenäinen tila

Kun tilahyppy on kelluvana, kustakin nastasta tulee erillinen linjaohjain, joka on ohjattu yhteen lähtöön — hyödyllinen solenoideille, releille tai mille tahansa päälle/pois-kuormalle, joka ei tarvitse H-siltaa. Kytkentä on P7 → O1, P0 → O2, P8 → O3 ja P1 (tai P2) → O4:

from machine import Pin
import time

outputs = [
    Pin("P7", Pin.OUT),  # O1
    Pin("P0", Pin.OUT),  # O2
    Pin("P8", Pin.OUT),  # O3
    Pin("P2", Pin.OUT),  # O4
]

while True:
    for o in outputs:    # walk a single high pulse across O1–O4
        o.value(1)
        time.sleep_ms(200)
        o.value(0)

Mitä tahansa neljästä nastasta voidaan myös PWM-ohjata machine.PWM -kanavan kautta suhteellista ohjausta varten — esimerkiksi häivytä kukin lähtö vuorollaan ylös ja alas:

from machine import Pin, PWM
import time

outputs = [
    PWM(Pin("P7"), freq=1_000, duty_u16=0),  # O1
    PWM(Pin("P0"), freq=1_000, duty_u16=0),  # O2
    PWM(Pin("P8"), freq=1_000, duty_u16=0),  # O3
    PWM(Pin("P2"), freq=1_000, duty_u16=0),  # O4
]

while True:
    for o in outputs:
        for duty in range(0, 65_536, 1024):
            o.duty_u16(duty)
            time.sleep_ms(5)
        for duty in range(65_535, -1, -1024):
            o.duty_u16(duty)
            time.sleep_ms(5)

Muu I/O

Lue AIN-riviliittimen tulo tasonsiirretyn P6-nastan kautta:

from machine import ADC
import time

ain = ADC("P6")

while True:
    v = ain.read_u16() * 3.3 / 65535
    print("AIN:", v * (5.0 / 3.3), "V")
    time.sleep_ms(100)

Reagoi laskevaan reunaan SYN-linjalla — esimerkiksi synkronoidaksesi kameran toisen laitteen kanssa, joka vetää SYN:n alas:

from machine import Pin

def on_sync(pin):
    print("SYN falling edge")

syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)