Bluetooth モジュールでRCサーボ・ESCを制御したい [第3回-ESCを使ったモータ駆動&スマホ向けコントローラアプリ試作]

2022-03-15 · Tomoki Ikegami

"サーボだけでなくESCも動かしたい"

~ 目次 ~


1. 今回やりたいこと

 前回はサーボモータの電源問題を解決したので、ラジコンのステアをサクサク動かせるようになりました。

 ステアを操作するだけではラジコンは走行できないので、今回は駆動用のモータを制御したいと思います。モータの駆動にはESCという装置を使います。

2. ESCについて

 Electronic Speed Controller の略で、ラジコンのモータの回転速度を制御するために使われる装置です。昔のラジコンではスピコン(Mechanical speed controllers1)という装置を使っていましたが、現在はこのESCを使われています。

 ESCは FET (電界効果トランジスタ) という素子を使ってスイッチングを行う2ことで、モータにかかる電圧をコントロールしています。電圧が大きくなればモータの回転速度は速くなり、小さくなればゆっくりになります。

 スピコンではモータにかかる電圧小さくするときに、抵抗器で熱としてエネルギーを捨てるのがESCとの大きな違いです。

3. ハードウェアのセットアップ

3.1. 使ったもの

 今回の実験で使ったハードウェアをリストアップしておきます。ESCが増えた以外は前回と全く同じです。操作に使ったアプリはこの記事の後半に紹介します。

 ESCにはクローララジコン用のものを使うのがおすすめです。クローラESCにはドラグブレーキがついているので便利です。

※ドラグブレーキ
 スロットルを操作していないときに、自動的にブレーキがかかる機能です。この機能のおかげで、斜面に車体をおいても勝手に下がっていくのを防いでくれます。

3.2. 作った回路

 前回作成した回路に、ESCを追加したものが下の図になります。ESCはマイナス極と信号線(PWMピン)しか配線しないので注意してください。(プラス極には配線しないこと

サーボモータ&ESC制御用回路
図:サーボモータ&ESC制御用回路

3.3. ソースコード

 こちらがArduinoマイコンに書き込んだソースコードです。文字を送信してステアとスロットルを操作する形にしました。

 ステアやスロットルの動きが滑らかになるように、VarSpeedServo.hライブラリを使って制御しています。(動きがカクカクだと安いトイラジコンと変わらなくなってしまうので)

スロットル/ステア 命令の記号
スロットル  F:前進 N:停止 B:後退
ステア    L:左 C:中心 R:右
#include<SoftwareSerial.h>  //Bluetoothの無線通信に使用
#include <VarSpeedServo.h>  //サーボモータの制御に使用
VarSpeedServo myservo;    // create servo object to control a servo
VarSpeedServo myesc;    // create servo object to control a esc


/* ステアリングの設定 */
int mov_speed_ST = 30; //ステア移動速度
int center_pos = 90; //ステア中心位置 [サーボモータの中心位置 (90°)]
int left_DR = 20; //左位置 [中心位置より反時計回りに20°回転した位置]
int right_DR = 25; //右位置 [中心位置より時計回りに25°回転した位置]
int left_max = center_pos - left_DR; //左の最大切れ角
int right_max = center_pos + right_DR; //右の最大切れ角

/* スロットルの設定 */
int mov_speed_TH = 5; //スロットル移動速度
int brake_speed = 100; //ブレーキ速度
int neutral_pos = 91; //中立位置 [スロットルの中立位置 (90) ※ESCの設定によってずれがあるので、前後に走行しないよう値を調整する。ESC側を90で中立になるよう設定してもよい。]
int forward_DR = 20; //前進位置
int backward_DR = 20; //バック位置
int forward_max = neutral_pos + forward_DR; //前進の最大位置
int backward_max = neutral_pos - backward_DR; //バックの最大位置

//速度(mov_speed_ST,mov_speed_TH)は 1~255 の範囲で与える。(0にすると最大速度で移動)
//スロットル、サーボモータの値(pos)の範囲は、 0≦ pos ≦180 で与える。
//myservo.write 関数には回転角を絶対的な位置で与える。例) 90°から 45°反時計回りに動いてほしいときは、-45ではなく、45を関数に入力する。


SoftwareSerial Bluetooth(10, 11); // Arduinoから見て10ピンがRX(受信), 11ピンがTX(送信)になる。bluetoothモジュールのTXにはArduinoのRX(10)が、bluetoothモジュールのRXにはArduinoのTX(11)が接続されていれば良い。

void setup() {
  Bluetooth.begin(9600); //シリアルポートを開いて、伝送速度を9600[bps] に設定
  Serial.begin(9600); //シリアルモニタで確認用
  myservo.attach(9); //サーボモータのPWM端子とArduinoの9番ピンを接続
  myesc.attach(6); //ESCのPWM端子とArduinoの6番ピンを接続
}

void loop() {
  if (Bluetooth.available()) {
    char input = Bluetooth.read(); //受信したテキストを変数inputに保存
    Serial.println(input); //受信したテキストをシリアルモニタに表示
    if (input == 'L') {
      myservo.write(left_max, mov_speed_ST, true); // ステアを左(Left)に切る
    } else if (input == 'C') {
      myservo.write(center_pos, mov_speed_ST, true); // ステアを中心(Center)に
    } else if (input == 'R') {
      myservo.write(right_max, mov_speed_ST, true);  //ステアを右(Right)に切る
    } else if (input == 'F') {
      myesc.write(forward_max, mov_speed_TH, true);  //前進(Forward)
    } else if (input == 'N') {
      myesc.write(neutral_pos, brake_speed, true);  //中立(Neutral)
    } else if (input == 'B') {
      myesc.write(backward_max, mov_speed_TH, true);  //後退(Backward)
    }
    else {
    }
  }
}

4. ソフトウェア(操作用アプリ)のセットアップ

4.1. アプリ開発環境

 MIT App Inventor を使って操作用のアプリを試作しました。MIT App Inventor は環境構築が不要で、Web上ですぐにアプリの作成が始められるのが魅力です。

 また、プログラムの作成もほぼマウスのドラッグアンドドロップできちゃいます(文字でずらずらプログラムを書かなくてよい)。

 私はアプリ開発の経験がほとんどなかったのですが、MIT App Inventorを使えば簡単にスマホアプリが作れるのでびっくりです(゚д゚)!

4.2. 試作したアプリ

 こちらが試作したアプリの外観と中身になります。とてもシンプルな外観です(笑)。

アプリ外観(デザイン編集タブ)
☝ アプリ外観(デザイン編集タブ)
アプリの中身(ブロック編集タブ)
☝ アプリの中身(ブロック編集タブ)

 試作したアプリ(Android)を使いたい方はこちらからダウンロードして使ってください。(怪しい機能は組み込んでいないので安心してください)

 MIT App Inventorを使ったアプリ作成の流れは、アプリの外観を画面右上の「デザイン編集」タブで決めたあと、アプリの中身動き)を「ブロック編集」決める感じになります。

 細かい操作方法はMIT App Inventor 2 日本語化プロジェクトのチュートリアルを参考にしました。

 アプリの中身に関しては、スマホのBluetoothでLEDをON/OFFするアプリ3を製作している方がいたので、そちらを参考にさせていただきました。

5. 動画

 実際に動かしてみた様子がこちらの動画になります。アプリで接続機器の選択ボタンを2回押さないと接続されないのは仕様です(笑)。

注意点
アプリを起動する前に、HC-05をペアとして設定する必要があります。Android(11)の場合、「設定>接続済みのデバイス>新しいデバイスとペアを設定する」と操作すると、使用可能なデバイスに「HC-05」が出てくるのでタップしてください。パスワードは「0000」か「1234」のどちらかです。


6. 関連記事

7. 参考資料


  1. RC Classics & Moderns「Electronic and mechanical speed controllers, motors」、(https://www.blackholesun.fr/en/41-en/rc-tech-guides/206-electronic-speed-controllers-esc-mechanical-speed-controllers-msc-motors↩︎

  2. EL PRO CUS「What is Electronic Speed Control (ESC) & Its Working」、(https://www.elprocus.com/electronic-speed-control-esc-working-applications/↩︎

  3. YouTube TexoBot Channel「How to create own Android App to control Arduino LED」、(https://www.youtube.com/watch?v=JOkfdyKGJlA↩︎