M5StickC でスマートな電池を作製 M5Stick-Cell
ついに購入しました!M5StickCを。
M5StickCは大人気のM5Stackの小型版です。M5Stackは持っていなかったのですがM5StickCのカワイイ色やサイズそして何と言っても2千円以下の家計に優しい価格にやられて速攻購入した次第です。
ここではM5StickCを用いて製作した実にスマートな電池 M5Stick-Cell を紹介いたします。
目次
M5Stick-Cell 構成
I2CモータドライバDRV8830を用いて電圧出力します。BlynkというスマホアプリでBluetoothを介してM5StickCと通信して出力電圧をコントロールできる電池をを実現します。
部品
- M5StickC
- I2Cモータードライバ・モジュール DRV8830
M5StickCar組み立て
ユニバーサル基板を程度なサイズにカットしてM5StickCとつなぐコネクタとモータドライバを搭載しました。
M5StickC
設計環境にArduino IDEを使用いたしました。設定方法は以下の公式サイトを参照ください。
小型でカワイイですがカラーLCDディスプレイ、マイク、赤外線LED、BLEやWiFi機能など盛りだくさんです。しっかりしたパッケージにコンパクトに収まっているので非常に扱いやすいです。詳細は以下の通りです。
https://github.com/m5stack/M5StickC
Blynk設定
スマホとM5StickCはスマホアプリのBlynkを用いてBluetooth通信させます。Blynkアプリのバージョンは2.27.6です。
新規プロジェクトを作成します。HARDWRE MODELはESP32 Dev Boardを選択。CONNECTION TYPEはBluetoothを選択。AUTH TOKENはArduinoコード生成時に使用します(アカウント登録したメールに送信されます)。
ウィジェットとしてBluetoothとジョイスティックを配置します。
ジョイスティックの設定はx軸とy軸の出力をMERGEしてヴァーチャルピンV0に出力させ、それぞれ値は-20~20としました。
I2Cモータードライバ DRV8830
DRV8830はI2C入力によって、モータ供給電圧(スピード)と供給電圧方向(回転方向)を制御するものです。つまり正負の電圧を生成できるということです。
I2Cアドレス設定
本モジュールは基板上のジャンパA1, A0のステートによって以下の表のようにアドレスを指定することができます。
表のアドレス末尾xは読み込み時には1、書き込み時は0をしてします。ここでは書き込みのみ使用します。両方Openのアドレス:0x64としました。
書き込みI2Cデータ
アドレス0x00に8bitの情報を書き込みます。
各ビットの設定は以下の通り。上位6ビットで電圧を設定し、下位2ビットで正負を指定できます。
Arduino IDEプログラム
以下のBlynkのArduino用ライブラリを使用してプログラムしました。バージョンは0.6.1。
https://github.com/blynkkk/blynk-library
ライブラリのコード例のESP32_BT.ino を参考にプログラムしました。
ここではBluetoothを使用してM5stickCと通信します。WiFiでもよかったのですが現状まだBlynkが正式にM5stickCをサポートしていないため、Blynk WiFiライブラリとM5stickCライブラリとの併用ができませんでした。Bluetoothは大丈夫でした。
Blynkのジョイスティックの値0~20の数値を受けて0~1.6Vの電圧を出力します。ジョイスティックが上部にあるときは正、下部にあるときは負の電圧となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleEsp32_BT.h> #include <M5StickC.h> BlynkTimer timer; // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "BlynkアプリのYourAuthTokenを入力"; const int DRV8830 = 0x64; long Vol; float volDis = 0.0; double vbat = 0.0; int p = 0; int pblack = 0; //モータドライバ I2C制御 motor driver I2C //Reference //http://makers-with-myson.blog.so-net.ne.jp/2014-05-15 void writeMotorResister(byte vset, byte data1){ int vdata = vset << 2 | data1; Wire.beginTransmission(DRV8830); Wire.write(0x00); Wire.write(vdata); Wire.endTransmission(true); } //ヴァーチャルピンV0データ受信 BLYNK_WRITE(V0) { long x = param[0].asInt(); long y = param[1].asInt(); Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); Vol = sqrt(x*x+y*y); if(Vol > 20){ Vol = 20; } volDis = (float)Vol/20.0 * 1.6; Serial.print(" Vol: "); Serial.println(Vol); M5.Lcd.fillRect(45, 30, 135, 50, BLACK); M5.Lcd.setCursor(60, 30, 1); M5.Lcd.setTextFont(4); if(y>0){ writeMotorResister(byte(Vol), 0x01); M5.Lcd.printf("+%.1f V\r\n",volDis); }else if(y<0){ writeMotorResister(byte(Vol), 0x02); M5.Lcd.printf("-%.1f V\r\n",volDis); }else{ writeMotorResister(0x00, 0x00); M5.Lcd.println(" 0.0 V\r\n"); } } void myTimerEvent() { vbat = M5.Axp.GetVbatData() * 1.1 / 1000; p = (int)(vbat/4.2*100); pblack = map((100-p),0, 100, 0,50); //バッテリ残量[%] M5.Lcd.setCursor(6, 0, 2); M5.Lcd.setTextFont(2); M5.Lcd.printf("%3d%%\r\n",p); //バッテリ残量表示 M5.Lcd.fillRect(18, 23, 9, 6, GREEN); M5.Lcd.fillRect(8, 29, 30, 44, GREEN); if(pblack <= 6){ M5.Lcd.fillRect(18, 23, 9, pblack, BLACK); }else{ M5.Lcd.fillRect(18, 23, 9, 6, BLACK); M5.Lcd.fillRect(8, 29, 30, pblack - 6, BLACK); } } void setup() { Serial.begin(115200); Wire.begin(0, 26, 10000); //SDA, SCL M5.begin(); M5.Axp.ScreenBreath(8); M5.Lcd.setRotation(1); M5.Lcd.fillScreen(TFT_BLACK); //バッテリ残量表示枠 M5.Lcd.drawLine(7, 28, 7, 73, WHITE); M5.Lcd.drawLine(7, 73, 38, 73, WHITE); M5.Lcd.drawLine(38, 73, 38, 28, WHITE); M5.Lcd.drawLine(38, 28, 27, 28, WHITE); M5.Lcd.drawLine(27, 28, 27, 22, WHITE); M5.Lcd.drawLine(27, 22, 17, 22, WHITE); M5.Lcd.drawLine(17, 22, 17, 28, WHITE); M5.Lcd.drawLine(17, 28, 7, 28, WHITE); Blynk.setDeviceName("Blynk"); Blynk.begin(auth); timer.setInterval(1000L, myTimerEvent); } void loop() { Blynk.run(); timer.run(); } |
ディスプレイ表示
LCDにはM5stickC本体のバッテリ残量と出力電圧を表示しています。
バッテリ残量は内部のバッテリ電圧を読んで4.2Vを100%、0Vを0%とする簡単で乱暴な表示です。ちょっと使用されている電源ICのAXP192の仕様をみきれておらず。。。(だって漢字だらけなんだもん)。 まぁおいおい改善しますw
電池残量に応じて電池のグラフィックも変化します。電池残量はBlynkのタイマー割り込みで1秒ごとに計測して表示しています。
M5stickCライブラリによるディスプレイ表示に関する関数は以下の通りです。
https://github.com/m5stack/m5-docs/blob/master/docs/en/api/lcd_m5stickc.md
Blynk Bluetooth接続
BlynkプロジェクトのBluetoothウェジットをクリックして設定します。
“Connect Bluetooth device”をクリックして “Blynk”が表示されたらOKをクリックして接続する。
動作
M5StickCでスマートなる電池 M5Stick-Cell#Blynk #M5StickC #M5stack #ESP32 pic.twitter.com/9FvAMsCn8U
— HomeMadeGarbage (@H0meMadeGarbage) 2019年6月17日
スマートな電池ができました♪極性を変えれるのでモータ動くおもちゃだとスピード制御に加えて逆走もできちゃいます。
いやーM5stickCマジで買ってよかった。中身見えないから扱いにくかったりカスタマイズしにくいのではないかと思ったけど全然逆。超使いやすいし故に色々アイディア浮かぶの。
うれしい!今後のヘビーユーズ必至。
追記 (19/6/20)
本体バッテリ残量表示を修正
バッテリ残量表示は4.2Vを100%、0Vを0%とする乱暴な表示だったのですが、73%(3.07V)で落ちたので3.0~4.2Vで残量表示に変更しました。電源IC仕様書にも充電ターゲット4.2V、トリクル充電ターゲット3.0Vと記載ありました。
但し、トリクル充電とは何かは理解していません。テヘペロ
— HomeMadeGarbage (@H0meMadeGarbage) 2019年6月19日
ミニ四駆に載せてみた
スマート電池 M5Stick-Cell
何がいいって配色よ#ミニ四駆 #M5StickC #Blynk pic.twitter.com/fxxa20F600— HomeMadeGarbage (@H0meMadeGarbage) 2019年6月19日
出力を±3.0Vまで拡げました。
めっちゃすぐ電池なくなる。。。
記載ありませんが、BlinkのEnergyを購入する必要ありますしたか?
購入はしていません。無料のEnergy内で実施しています。
すみません無料のやり方教えて下さい。bluetoothは0ですがjoystickは400とか出ていて必ずバッテリー買うよう誘導されます。
初期で2000くらいのEnergyが付与されるはずですが、
他のプロジェクト等でウィジットを使って消費しているのであればdeleteするしかないかと
思います。
ご確認ください。