M5StickCでI2CモータードライブDRV8830テスト こんにちはRoboTakaoです。
今回はM5StickCでI2C接続のモータードライブ基板DRV8830(秋月)を試してみました。
構成 M5StickC
DRV8830
タミヤ ダブルギヤボックス
タミヤ トラック&ホイールセット
DCモーター 130
ニッケル水素電池 単三x4
DRV8830 M5StickCはポートが少ないのでI2C接続ができる
秋月の定番基板 を2個使用しました。
データシート(日本語) 結線 ・I2CのSDA,SCLは電源の4.8Vに2.2kΩでプルアップしました。
・A0,A1でI2Cアドレスを設定します。
今回は下記としました。
右側用DRV8830のA0,A1をHigh(Vccと接続)→ 0x60
左側用DRV8830のA0,A1をLow(GNDと接続)→ 0x68
・DRV8830のISENCEは電流制限を抵抗R1,R2で設定します。
R=200mV/Ilimit
DRV8830の定格電流が1Aなので0.2Ωとしました。
ただし後述しますが、モーターのバラツキ等で調整するのが良さそう
・バッテリーは定電圧エラーの閾値2.75V以上に常になるようしないといけません。
3V程度だと、負荷を受けた時に2.75V以下になってFAULTになる可能性があります。
失敗談 最初、バッテリーを3Vとしていたことで全く動かず。
電圧は上げましたが、なぜかモーターの回転数がやたら低かったり、うまく動きませんでした。
どうもモーターでは回るものと回らないものがあるようです。
起動時のサージ電流が抵抗で設定した電流制限にかかると電流を絞っているか
DRV8830の保護閾値の3A以上になるとFAULTに掛かって停止しているようです。
今回最初使用したDCモーターは
マブチのFA-130RA と互換のノーブランドモーターです。
しかしながらマブチのモーターでも巻線径と巻き数で数種類あるようです。
定格1.5VのFA-130RA-2270 線径0.22mm 70ターン
定格3VのFA-130RA-18100 線径0.18mm 100ターン
ターン数の違いで自己インダクタンスが異なっていて、サージの大きさに差が生まれているのではないかと思います。
(ただし、サージ電流は実測できていないのであくまで推測です。)
結局のところ左右の片側の電流制限用の抵抗を0.1Ωx3個並列にして0.033Ωに設定していい感じに動くようになりました。
Blynk コントロールは前回紹介したBlynkを使用します。
使い方の概略は
前回の投稿 を参考にしてください。
ジョイスティックの設定は画像のようにしました。
動作確認 いい感じでくるくる回ります。
VIDEO M5StickCのスケッチ #define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <M5StickC.h> #include <BlynkSimpleEsp32_BLE.h> #include <BLEDevice.h> #include <BLEServer.h> #include <Wire.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //メールで送られるAuth Token const int motorL = 0x60; const int motorR = 0x68; long Speed; long SpeedL, SpeedR; void setup() { M5.begin(); M5.Lcd.println("Blynk"); M5.Lcd.print("TANK BLE TEST"); // Debug console Serial.begin(9600); Serial.println("Waiting for connections..."); Blynk.setDeviceName("M5StickC_TANK_Blynk"); Blynk.begin(auth); Wire.begin(0, 26); //SDA, SCL writeMotorResister(motorL, 0x00, 0x00); writeMotorResister(motorR, 0x00, 0x00); } //モータドライバ I2C制御 motor driver I2C void writeMotorResister(int motor, byte vset, byte data1){ int vdata = vset << 2 | data1; Wire.beginTransmission(motor); Wire.write(0x00); Wire.write(vdata); Wire.endTransmission(true); } void loop() { Blynk.run(); } //ジョイスティックのデータ受信 BLYNK_WRITE(V0) { long s = param[0].asInt(); Serial.print("s: "); Serial.println(s); Speed = abs(s); //モータ制御 if(s >= 0){ writeMotorResister(motorR, byte(Speed), 0x01); }else{ writeMotorResister(motorR, byte(Speed), 0x02); } } BLYNK_WRITE(V1) { long s = param[0].asInt(); Serial.print("s: "); Serial.println(s); Speed = abs(s); //モータ制御 if(s >= 0){ writeMotorResister(motorL, byte(Speed), 0x01); }else{ writeMotorResister(motorL, byte(Speed), 0x02); } }