前回の続きです。LeafonyでRCカーを作ってコントロールしてみるというテーマで書いています。前回まででLeafonyでのBluetooth Low Energy(ここからはBLEと表記します。)とWeb BluetoothでのWebページ間で通信するところまで書きました。
今回はその前回までで出来たLeafony側のArduinoスケッチとWeb BluetoothでのWebページにRCカーの遠隔操縦の機能を追加していきます。RCカーなので車体の部分も大事なのですが、どちらかと言うとLeafonyを中心に書きます。
以下のようなRCカーです。完成度に関してはまずはこんな感じでということでご了承下さい。何卒よろしくお願いいたします。
Leafonyは以下のように置いています。
超音波距離センサモジュールのHC-SR04で前方との距離を測定して近づき過ぎると停止するようにしました。
コントローラ側は以下のようなページです。前後左右にコントロール出来ますがスピード調整は今回は出来ません。
スピード調整が出来ない理由も含めて順番に書いていきます。
今回のプログラムファイル一式です。
(※ご自由にお使い頂いて問題ありませんが、サンプルレベルのソースです。一切動作は保証出来ません。)
Leafonyでのコントロール
AX02A 29pin
以下のようなリーフです。上から見た画像(仕様書からの引用)です。これでモータ(ドライバ)を制御します。
今回のRCカーではLeafonyの一番上のリーフがこのAX02A 29pinリーフです。ピンヘッダは多少強引ですが、はんだ付けをして下側をニッパで短く切りました。
仕様書は今現在で以下にあります。
AX02A 29pin仕様書(JA)
ピンの機能は以下です。Arduino互換ですが、F1からの番号が上の1,6,11のホールの番号でType NameがArduino(AVR)のピンタイプです。
このあたりは、やはりArduino互換の仕様だと思います。Arduinoと同じように出来るかなと思いました。
使えるピンと使えないピン
BLEのリーフについては前回書きましたが、UARTで通信しているのでそのピンは既に使用済みです。またタイマーでMsTimer2のライブラリを利用していますがこれを利用すると、13番ピンと11番ピンでのPWMが使えません。他にもスリープ系の制御で使っているピンもあります。
結局ここではモータの制御と超音波距離センサで以下を使うことにしました。使っていないと判断出来たピンです。14,17,18,19がスケッチで指定する番号です。上の図で対応するFの番号のホールのピンにモータドライバを接続します。
モータ1A:14(A0)
モータ1B:17(A3)
モータ2A:18(A4)
モータ2B:19(A5)
補足ですが、これらのピンは基本はアナログピンでデジタルピンとしても使えるピンです。但し、これらのピンではPWMは使えないので今回は単純なオンとオフにしてスピードの調整は諦めます。
超音波センサ トリガ:4
超音波センサ エコー:12
これらのピンも超音波センサと接続します。
スケッチでの制御
以上のように問題なく接続出来れば、スケッチで制御出来ます。以下のように制御します。
ピン番号
int pin1A = 14; int pin1B = 17; int pin2A = 18; int pin2B = 19; int TRIG = 4; int ECHO = 12;
初期設定(Setup時)
pinMode(pin1A,OUTPUT); pinMode(pin1B,OUTPUT); pinMode(pin2A,OUTPUT); pinMode(pin2B,OUTPUT); digitalWrite(pin1A, LOW); digitalWrite(pin1B, LOW); digitalWrite(pin2A, LOW); digitalWrite(pin2B, LOW); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
モータのオンとオフでの動作制御
void motorFoward() { digitalWrite(pin1A, HIGH); digitalWrite(pin1B, LOW); digitalWrite(pin2A, HIGH); digitalWrite(pin2B, LOW); delay(50); } void motorBack() { digitalWrite(pin1A, LOW); digitalWrite(pin1B, HIGH); digitalWrite(pin2A, LOW); digitalWrite(pin2B, HIGH); delay(50); } void motorStop() { digitalWrite(pin1A, LOW); digitalWrite(pin1B, LOW); digitalWrite(pin2A, LOW); digitalWrite(pin2B, LOW); delay(50); } void motorRight() { digitalWrite(pin1A, LOW); digitalWrite(pin1B, HIGH); digitalWrite(pin2A, HIGH); digitalWrite(pin2B, LOW); delay(50); } void motorLeft() { digitalWrite(pin1A, HIGH); digitalWrite(pin1B, LOW); digitalWrite(pin2A, LOW); digitalWrite(pin2B, HIGH); delay(50); }
処理測定と停止です。ひとまず8cm未満になれば停止します。
void loopDist() { // 超音波の出力終了 digitalWrite(TRIG,LOW); delayMicroseconds(1); // 超音波を出力 digitalWrite(TRIG,HIGH); delayMicroseconds(11); // 超音波を出力終了 digitalWrite(TRIG,LOW); // 出力した超音波が返って来る時間を計測 int t = pulseIn(ECHO,HIGH); // 計測した時間と音速から反射物までの距離を計算 float distance = t*0.017; // 計算結果をシリアル通信で出力 //Serial.print(distance); //Serial.println(" cm"); if(distance < 8.0) { Serial.println("stop motor."); motorStop(); delay(10); } }
以上のモータの動作をWeb Bluetoothからのコマンド受信した際に実行します。受信時のコールバック関数内で以下のように決められたコマンド(文字列)を受信したらモータを駆動します。
if( rcv_data.indexOf("MTFW") == 0 ){ motorFoward(); } if( rcv_data.indexOf("MTBK") == 0 ){ motorBack(); } if( rcv_data.indexOf("MTSTP") == 0 ){ motorStop(); } if( rcv_data.indexOf("MTRT") == 0 ){ motorRight(); } if( rcv_data.indexOf("MTLF") == 0 ){ motorLeft(); }
こういった流れで制御出来ました。
Web Bluetooth側のページ
前回のページにボタンを追加してそのボタンをクリックするとスケッチ側で書いてあるようなコマンドを送信します。
HTMLの部分が以下です。
<div class="py-5 bg-dark"> <div class="text-center text-light col-sm-12"> <button type="button" class="btn btn-primary" id="button-MTFW">前進</button> </div> </div> <div class="row text-center"> <div class="col-sm"> <p><button type="button" class="btn btn-primary" id="button-MTLF">左回転</button> <button type="button" class="btn btn-primary" id="button-MTSTP">停止</button> <button type="button" class="btn btn-primary" id="button-MTRT">右回転</button></p> </div> </div> <div class="py-5 bg-dark"> <div class="text-center text-light col-sm-12"> <button type="button" class="btn btn-primary" id="button-MTBK">後退</button> </div> </div>
JavaScriptのコマンド送信部分が以下です。
buttonMTFW.addEventListener ( 'click', function () { console.log( 'MTFW' ); leafony.sendCommand( 'MTFW' ); }); buttonMTBK.addEventListener ( 'click', function () { console.log( 'MTBK' ); leafony.sendCommand( 'MTBK' ); }); buttonMTSTP.addEventListener ( 'click', function () { console.log( 'MTSTP' ); leafony.sendCommand( 'MTSTP' ); }); buttonMTRT.addEventListener ( 'click', function () { console.log( 'MTRT' ); leafony.sendCommand( 'MTRT' ); }); buttonMTLF.addEventListener ( 'click', function () { console.log( 'MTLF' ); leafony.sendCommand( 'MTLF' ); });
動作確認
RC側のバッテリーを接続して、Leafony側の電源もオンにします。
これで最初のコントローラ側のページからConnectボタンで接続後に操縦のボタンで無事に動きました。また距離センサでの制御も無事に確認出来ました。但し、机の上で走らせるには少しスピードが速いような気がします。
(※注意ですが、使っているバッテリーは3.7Vです。モータはタミヤFA130で使用電圧は3.0Vまでです。すぐには壊れませんが良くないです。乾電池タイプ2本ぐらいにするべきでした。)
車体の部品について
モータドライバ
以下の製品です。
Maker Drive
スイッチサイエンスさんで買いました。
Maker Drive – 入門用Hブリッジモータードライバ
入門用となっていて補助機能があるので大変使いやすいです。価格も低価格で複数を購入するのにもいいかと思います。
この製造元のcytronという企業ですが、どうやらマレーシアの企業のようで、教育用関連でも有効活用出来そうなRaspberry PiやArduino関連の製品も開発しているようです。また別途取り上げたいと思います。
スペーサは以下です。
M2.6スペーサセット(スペーサ4個、ネジ8個)
バッテリ関連
リチウムイオンポリマー電池400mAh
2ピンJST-PHコネクタ・ピッチ変換基板(スイッチ付き)
ミニリチウムイオン電池充電器モジュール
(※上でも書きましたが、モータの使用電圧を考えると乾電池タイプ2本ぐらいにするべきでした。)
超音波距離センサ
同様の商品が他にもいろいろありますが、これを選んだのは何と言ってもブラケット付きだからです。
タミヤ関連
ツインモーターギヤーボックス
ナロータイヤセット
ユニバーサルプレート
ボールキャスター
その他配線関連
ジャンパワイヤ
ピンヘッダ、ピンソケット
ミニユニバーサル基板
まとめ的に(所感、展望など)
Leafonyについて
Arduinoスケッチは必須です。つまり、考えた内容を実現するにはプログラミングが必要ということです。
BLEに関しては通信自体の仕様を踏まえた上でArduinoライブラリを使いこなす必要があります。また今回は使っていませんが、センサモニタを行うのであればスリープも必須です。この場合は、ピンがどのように関連してくるかも設計に必要です。
ESP32 Wi-Fi Kit A1.0も発売されたようなので、こちらではESP32でのプログラミングが必要になってきます。
モータ制御について
Leafony自体でもPWM制御は出来るのですが、タイマーを利用した場合等で利用出来るピンが限られてくる場合があります。そうするとモータ制御のPWMは別回路を用意してLeafonyからはI2Cで制御するのがいいと思います。
以下のようなモジュールがいいと思います。
DRV8830モータドライバモジュール
このようなモータ制御が出来るLeafonyのリーフがあればもちろんそれがいいと思います。
以下Qiitaの投稿ではLeafony向けセンサ基板を自作されています。
Leafony向けセンサ基板を自作する
RCカーの車体について
まずジャンパワイヤがごちゃごちゃでかっこ悪いです。あと、今の状態だと構成はよく見えると思いますが、ボディ的なものが何かあれば見た目が良くなります。
これらの内容は今後引き続き取り組んでいきたいと思います。
今回は以上です。