Bluetooth モジュールでRCサーボ・ESCを制御したい [第1回-RCサーボの制御]

2022-02-27 · Tomoki Ikegami

"まずは無線でRCサーボを動かしてみる"

~ 目次 ~


1. 最終的にやりたいこと

 最終的には、ラジコンのコントローラを作ることを目指しています。そのためには無線通信でRC装置を動かせるようになる必要があります。

 今回はその基礎として、PCをコントローラ、マイコン+Bluetoothモジュール をRC受信機と考えて実験を行いたいと思います。

2. 実験準備

2.1. システムの概要

 下の図は使用する装置、ぞれぞれの装置の役割を整理したものです。

システムの概要
図:システムの概要

 PCから無線通信(Bluetooth)でArduinoへ信号を送り、ArduinoでサーボモータやESCの制御を行いたいと思います。

 BluetoothモジュールはHC-05と呼ばれるものを使用しました。Amazonに1000円くらいで売っています。

 ※ HC-05は技適マークがついていないので、屋内で実験目的として使用する程度にしたほうがよいです。

 ArduinoとHC-05を使用してLEDを点灯させる回路を作っている記事1,2がいくつかあったので、そちらを参考にして回路を作成しました。

2.2. 回路図

 まずはRCサーボのみを無線通信で制御する回路をつくりました(下図参照)。マイコンへの5V電源(モバイルバッテリー)は省略しています。

 この回路では、サーボ用の電源を3.3[V]にしていますが、実際のRCでは6[V]で動かしていることが多いです。(ハイボルテージといって7.4[V]で動かす場合もあります)

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

 Bluetoothモジュールの動作用とサーボ駆動用の電源を別にしたかったので、このような(不思議な)回路になっています。しかしこれではトルクが足りません(笑)。とりあえず今回はこれでいきたいと思います。

※ Bluetoothモジュールとサーボモータで5V電源を共有すると、サーボモータが動いたときに通信が途切れてしまいました。

2.3. ソースコード

 こちらがArduinoマイコンに書き込んだソースコードです。

 サーボモータの制御には、VarSpeedServo.h3というライブラリを使いました。このライブラリは、サーボモータの回転速度も変更できるのがすごく便利です。

#include <SoftwareSerial.h>  //Bluetoothの無線通信に使用
#include <VarSpeedServo.h>  //サーボモータの制御に使用
VarSpeedServo myservo;    // create servo object to control a servo

int mov_speed = 100; //速度
int center_pos = 90; //ステア中心位置 [サーボモータの中心位置 (90°)]
int left_pos = 90 - 45; //左位置 [中心位置より反時計回りに45°回転した位置]
int right_pos = 90 + 45; //右位置 [中心位置より時計回りに45°回転した位置]

//速度v(mov_speed)は 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] に設定
  myservo.attach(9); //サーボモータのPWM端子とArduinoの9番ピンを接続
}

void loop() {
  if (Bluetooth.available()) {
    int input = Bluetooth.read();
    if (input == 4) {
      myservo.write(left_pos, mov_speed, true); // ステアを左に切る
    } else if (input == 5) {
      myservo.write(center_pos, mov_speed, true); // ステアを中心に
    } else if (input == 6) {
      myservo.write(right_pos, mov_speed, true);  //ステアを右に切る
    }else{
      }
  }
}

 PCから4が送られてきたらステアを左に、5が送られてきたらステアを中心に、6が送られてきたらステアを右に切るという単純なプログラムです。

3. 動作実験結果

 先ほどの回路を組み立てて実験した様子がこちらの動画になります。

 電圧が足りず前輪が接地した状態ではハンドルが切れていませんが、動かすことは出来ました!

 サーボ用には別の方法で電源供給する必要がありそうです。BEC4とかを使って電源供給すると良いかも…

4. 関連記事

5. 参考文献


  1. Love on Technology「WindowsとArduinoとBluetoothモジュール(HC-05/HC-06)の接続方法」、(https://wireless-network.net/arduino-win-bt/↩︎

  2. マーティーの工房日誌「Bluetooth Module HC-05でAndroidからRGB LED Controll」、(https://martyworkshopdiary.blogspot.com/2018/05/bluetooth-module-hc-05androidrgb-led.html↩︎

  3. GitHub「NETLab Toolkit Group>VarSpeedServo」、(https://github.com/netlabtoolkit/VarSpeedServo↩︎

  4. KK HOBBY「HOME>レギュレータ」、(https://www.kkhobby.com/SHOP/AP077.html↩︎