Driver Shield

Driver Shieldは、6~36 Vの広い電源範囲から3 Aのモーター2個、または独立した1.5 Aのラインドライバー4個を駆動でき、逆電圧保護とサージ保護を備えた堅牢なモーター制御フロントエンドをOpenMV Camに提供します。

Driver Shield

完全なデータシート、写真、注文方法については、Driver Shield製品ページ を参照してください。

主な特長

  • 3 Aデュアルモータードライバー、または1.5 Aクアッドラインドライバー、6~36 V対応

  • 入力側に逆電圧保護および過渡サージ保護

  • ±36 Vの過電圧保護付き0~5 V ADC入力

  • カメラ同期トリガー用の0~5 Vデジタル I/O、短絡保護付き

ピン配置

Driver Shieldのピン配置

ピンリファレンス

ピン

機能

P0

出力ペアO1/O2のDIR

P1

出力ペアO3/O4のDIR(代替)

P2

出力ペアO3/O4のDIR(デフォルト)

P6

レベルシフトされたAINリードバック(P6上で0~3.3 V)

P7

出力ペアO1/O2のPWM

P8

出力ペアO3/O4のPWM

P10

SYN — ターミナルブロック上のオープンドレインデジタル I/O

PWR入力

ターミナルブロック上の6~36 V広入力(逆電圧耐性あり)

AIN入力

ターミナルブロック上のアナログ入力

VIN出力

オンボードレギュレータから最大600 mAで5.4 V

3.3Vレール

シールドのオンボード回路に電源を供給

GNDレール

共通グラウンド

注釈

AINは±36 Vまでの過電圧保護を備えており、デフォルトでは0~5 Vの電圧入力で、P6上では0~3.3 Vにスケールダウンされます。シールド前面の4~20 mAモードシャントをブリッジすると、AINを4~20 mAの電流ループ入力に切り替えられます。

注釈

SYNはオープンドレインのデジタルラインで、カメラ側で3.3 V、SYNターミナル側で5 Vにプルアップされています。デフォルトでは入力で、シールドがSYN上の0~5 VをP10上の0~3.3 Vにレベルシフトします。オンボードのはんだジャンパーを変更すると、P10を出力に切り替え、P10上の0~3.3 VをSYN上の0~5 Vにレベルシフトできます。

注釈

P0、P1、P2、P6、P7、P8、P10はそれぞれ無関係な用途に転用できます。P0、P2、P6、P7、P8、P10はデフォルトで裏面のはんだジャンパーを通じて接続されています。解放したいピンのジャンパーを開放してください。P1はデフォルトで未接続です。前面のジャンパーをブリッジすると、O3/O4のDIRをP1に代わりにルーティングできます(同時にP2を解放するためP2の裏面ジャンパーを開放してください)。

注釈

シールド裏面の2つのモードジャンパー(Hブリッジごとに1つ)で、各出力ペアを3つのモードのいずれかに独立して設定します。各ジャンパーにはLとHのマーキングがあり、どちらの側がどの状態を選択するかを示しています。

  • Low(デフォルト) — DIR/PWMモード:ブリッジごとにDIRピン1本とPWMピン1本。

  • High — Hブリッジモード:両方のピンがチップの2入力真理値表を介してブリッジを直接駆動します。

  • Float(未接続) — 独立モード:各ピンが1つの出力にルーティングされる単独のラインドライバーになります。

各DRV8876はチップあたり合計3 Aに電流制限されています。つまり、1つのブリッジを通じて3 A(DIR/PWMまたはHブリッジモード)、または2つの出力に分割して1出力あたり1.5 A(独立モード)です。

使い方

DIR/PWMモード(デフォルト)

出力ペアO1/O2上でブラシ付きDCモーターを駆動します。P0で方向を設定し、P7にPWM速度信号を印加します。以下のループは、デューティサイクルを全速まで上げてから下げ、その後方向を反転して繰り返します:

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)

2つのHブリッジはバイポーラステッパーも駆動できます。両方のPWMチャンネルを全駆動に保ち、DIRピンを4相シーケンスで進めます:

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ブリッジモード

モードジャンパーをHighに設定すると、両方のブリッジピンがHブリッジを直接駆動します。O1/O2の真理値表は次のとおりです。

  • (P0, P7) = (L, L) → コースト(出力Hi-Z)

  • (P0, P7) = (L, H) → 正転(O1 = H、O2 = L)

  • (P0, P7) = (H, L) → 逆転(O1 = L、O2 = H)

  • (P0, P7) = (H, H) → ブレーキ(両出力ともLow)

(O3/O4はP1/P2およびP8で同じ表に従います。)以下のループは、出力ペア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)

いずれのピンも比例駆動のために machine.PWM チャンネルに置き換えられます。例えば (P0=0, P7=PWM) はPWMデューティで正転/コースト、(P0=1, P7=PWM)(100 % duty) で逆転/ブレーキになります。以下のループは、P0を0に保ったまま(正転/コースト)デューティを上げてから下げます:

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)

独立モード

モードジャンパーをFloatにすると、各ピンが1つの出力にルーティングされる単独のラインドライバーになります。これはソレノイド、リレー、またはHブリッジを必要としないオン/オフ負荷に便利です。マッピングはP7 → O1、P0 → O2、P8 → O3、P1(または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)

4本のピンはいずれも比例駆動のために machine.PWM 経由でPWMすることもできます。例えば、各出力を順番にフェードイン/フェードアウトさせます:

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)

その他のI/O

レベルシフトされたP6ピンを通じて、AINターミナルブロック入力を読み取ります:

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)

SYNラインの立ち下がりエッジに反応します。例えば、SYNをLowに引っ張る別のデバイスとカメラを同期させる場合です:

from machine import Pin

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

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