micro:bitでモータードライバを動かしてみた

スポンサーリンク

「DC Motor + Stepper FeatherWing Add-on For All Feather Boards」(以下、FeatherWing モータードライバ)を入手したので、動作確認も兼ねてmicro:bitで動かした記録です。

目次 (クリックで展開)

結果

画像じゃ伝わらないけど、micro:bitから2つのモーターを自由に制御できた。

このFeatherWingモータードライバは、とても小さくていいけど、小さ過ぎてモーターが動かないときには途方にくれた。各ICの出力を確認するにも、こんなに小さいICだとどうやって確認すればいいのやら。。。結局、地道に見直して無事動作。まー経験も積んだし、今後はすんなり動かせそう(?)。

材料

仕様と制御方法

FeatherWing モータードライバ

名称:DC Motor + Stepper FeatherWing Add-on For All Feather Boards
4つのDCモーターを扱えるモータードライバ
使用チップ: PCA9685、TB6612 * 2
制御方式:I2C
I2Cアドレス: 0x60 0x70 いずれもPCA9685に接続されている。I2Cアドレスは変更可能

PCA9685

16-channel PWM controller
PCA9685のPWM出力ピンはTB6612に接続されている。そのため、PCA9685を制御すればモーターの挙動も変えられる。
PCA9685のPWM出力ピンとTB6612の関係は次のとおり

メーカーページより

TB6612

2チャネルモータドライバ

絶対最大定格:
出力電流(IOUT, 1ch当たり):1.2A(平均)、2A(ピーク)
許容範囲:
モーター側電源電圧(VM):2.5V〜13.5V 標準5V
IC側電源電圧(Vcc):2.7V〜5.5V 標準3V

TB6612の制御方法は次のとおり

データシートより

CWは出力軸側から見て時計方向。Clock Wiseの略。
CCWは出力軸側から見て反時計方向。Counter Clock Wiseの略。

モーター(geek servo)

モーターの仕様 (クリックで展開)

仕様:
-タイプ:ギアモーター
-色:赤
-動作電圧:3.3V〜6V
-定格電圧:4.8V
-定格電流:200ma
-ストール電流:700ma
-スライド電流:450ma
-最大トルク:500g.cm
-最大速度:70rpm(3V)
amazon.co.jpより

接続方法

micro:bitの3V,GND,SCL,SDAを使う。モータードライバの接続方法は画像のとおり。

f:id:sato_susumu:20201009013746j:plainf:id:sato_susumu:20201009013743j:plain

まずは、I2Cの接続を確認。
96(=0x60)と112(=0x70)が認識できればOK。
確認方法はこちら参照。

プログラム MakeCode用プログラム(python)

必要な拡張機能

拡張機能 pca9685を追加する必要がある。

拡張機能はMakeCode上で検索すれば見つかる。

PWMの制御のみ行えればいいので、resetとset pin pulse rangeというブロックのみを使用する。

set pin pulse rangeのパラメータは次のとおり。

setPinPulseRange(pinNum, onStep, offStep, chipAddress)
NOTE: Direct Pin control is done using index's 0-15 NOT 1-16 like the LED and Servo helpers above.

Options:
chipAddress - Address of the PCA9685 in decimal
pinNum - Pin number to change the duty cycle of, accepts 0-15
onStep - When during the frame to turn on the pin, accepts 0-4095
offStep - When during the frame to turn off the pin, accepts 0-4095

プログラム

プログラム (クリックで展開)

i2c_address = 96

m1_in1_pin = 10
m1_in2_pin = 9
m1_pwm_pin = 8

m2_in1_pin = 11
m2_in2_pin = 12
m2_pwm_pin = 13

low = 0
high = 4095
PCA9685.reset(i2c_address)

def on_forever():
    set_speed(4095)
    cw()
    basic.pause(1000)

    stop()
    basic.pause(1000)

    set_speed(1000)
    ccw()
    basic.pause(1000)

    short_brake()
    basic.pause(1000)
basic.forever(on_forever)

def set_speed(speed : number):
    PCA9685.set_pin_pulse_range(m1_pwm_pin, 0, speed, i2c_address)
    PCA9685.set_pin_pulse_range(m2_pwm_pin, 0, speed, i2c_address)

def cw():
    PCA9685.set_pin_pulse_range(m1_in1_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m1_in2_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in1_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in2_pin, 0, low, i2c_address)

def ccw():
    PCA9685.set_pin_pulse_range(m1_in1_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m1_in2_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in1_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in2_pin, 0, high, i2c_address)

def stop():
    PCA9685.set_pin_pulse_range(m1_in1_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m1_in2_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in1_pin, 0, low, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in2_pin, 0, low, i2c_address)

def short_brake():
    PCA9685.set_pin_pulse_range(m1_in1_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m1_in2_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in1_pin, 0, high, i2c_address)
    PCA9685.set_pin_pulse_range(m2_in2_pin, 0, high, i2c_address)

途中で遭遇した問題

モーターが一瞬しか動かない

プログラムミスによるPCA9685のPWM制御ミス
モーター用電源の供給不足 → 電源の見直しで解決。モーターは起動時の流入電流がとてもとても多い。

micro:bitにUSBケーブルをつないでも、オレンジLEDが点灯しない

3VやGNDピンの配線ミス

FeatherWingモータードライバの緑LEDが点灯しない

モーター電源の配線ミス。
保護回路の動作? → 電源の変更で解決

リンク

FeatherWing モータードライバ

商品ページ(スイッチ・サイエンス)

メーカーのページ

PCA9685

データシート

上級者向け講習会課題 1 - RTC-Library-FUKUSHIMA
PCA9685の使い方が詳しく解説してくれている

PWM/サーボシールド(PCA9685)を動かしてみます(1/2)
Mode1,Mode2の使い方を詳しく書いてくれている

TB6612

データシート(日本語)

TB6612FNG 使用上の注意点

MakeCode 拡張機能 pca9685

ソースコード