5分でできる!BluetoothでArduino遠隔操作ラジコンカー製作 (DCモーター制御) スケッチコード付き

[`evernote` not found]
LINEで送る
Pocket

前回解説した
すぐにできる!Arduinoで赤外線ラジコンカー製作 (DCモーター制御) スケッチコード付き
Bluetooth版になります。
しかも、
①前回のキットにBluetoothモジュールを接続(四本のワイヤ接続するだけ!)
②本ページのコードをArduinoに上書きするだけ
なんと、5分もかかりません。

材料:
1. 前回使用キットそのまま
2. HC-06 (Bluetoothモジュール)×1 ※技適なしのモジュールになります。ご使用方法についてはご注意ください
3. ジャンパワイヤ×4

製作方法:
① 下記のように接続します。HC-06とArduinoのTX, RXを互いに逆に接続することに注意!

HC-06 Arduino UNO R3
 VCC  ⇒  5V
 GND  ⇒  GND
 TXD  ⇒  RX
 RXD  ⇒  TX

 

②下記スケッチコードをArduinoに書き込む(書き込む際は必ずHC-06を停止させてください、VCC抜くだけでOK)
何度もモーターの回転についてのコードがでてきますが、分かりやすくするためにわざと重複して書いてます。
分かる方はリファクタリングして短くまとめてください。

③PCもしくはスマホで操作
【PCの場合】:bluetoothペアリング後にArduino IDEのツール⇒シリアルポートでHC-06を選択
シリアルモニタを立ち上げて、そこに”test”と入力すると、”Hello, Wind Abaft”と返ってくれば成功です。
同じようにシリアルモニタに下記を打つとその対応のままラジコンが動作します。
f: 前進
r: 右折
l: 左折
b: 後進
R(大文字のR):右回転
L(大文字のL): 左回転
s: 停止

【スマホの場合】:HC-06はiPhoneに対応していないのでAndroidスマホでのみ操作が可能(頑張ればiPhoneもいけるかもしれない)
アプリArduino bluetooth controllerをgoogle Playからインストール(無料)
アプリの各ボタンに上記7種類の文字をあてはめるだけ!あとはペアリングするだけでコントロールが可能
例. →マークに”r”を当てはめる

#include <IRremote.h>
// Author Fumiyoshi.Yotsugi @ Wind Abaft Co.,Ltd.

char val;
int RECV_PIN = 12; //IR受信データピンを12に設定
int ledpin=13;

IRrecv irrecv(RECV_PIN);
decode_results results;

// モーターコントローラー(L298N)とArduino UNO R3の接続
// motor A
int enA = 5;
int in1 = 2;
int in2 = 4;
// motor B
int enB = 10;
int in3 = 7;
int in4 = 8;


void setup()

{
irrecv.enableIRIn();
Serial.begin(9600);
pinMode(ledpin,OUTPUT);

// モーターコントロールピンをoutputにセット
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
val=Serial.read();
performCommand();
if(val=='test')
{
digitalWrite(ledpin,HIGH);
delay(500);
digitalWrite(ledpin,LOW);
delay(500);
Serial.println("Hello, Wind Abaft!");
}

if (irrecv.decode(&results)) {
irrecv.resume();

if (results.value == 0x00FF629D){ // ↑ボタンを押すと前進

  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enB, 200);

}else if(results.value == 0x00FF22DD){ // ←ボタンを押すと左折する 

 // motor Aを前進させてmotor Bは止める
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FF6897){ // ボタン1を押すと左回転 

 // motor Aは前進、motor Bは後進
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FFC23D){ // →ボタンを押して右折する 

// motor Aは止めてmotor Bは前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF9867){ // ボタン2を押すと右回転 

// motor A後進、motor B前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

} else if(results.value == 0x00FFA857){ // ↓ボタン押すと後進(バック)

// motor A後進、motor B後進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF02FD){ // OKボタン押すと停止(ストップ) 

// motor A停止、motor B停止 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}
}
}

void performCommand() {
if (Serial.available()) {
val = Serial.read();
}
if (val == 'f') { // 前進
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
  Serial.println("Forward");
} else if (val == 'b') { // 後進
 digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
} else if (val == 'r') { // 右折
 digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
} else if (val == 'l') { // 左折
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
} else if (val == 's') { // 停止
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
}
 else if (val == 'R') { // 右回転
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
}
 else if (val == 'L') { // 左回転
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
}
}

【追記】
006Pの9V角型電池1個でArduinoとBluetooth(HC-06)に電源供給していると
電流不足からか、たまに不安定になることもあったので、アルカリ電池4本以上の電源を繋いだところ安定しました。
長い時間遊ぶ場合はアルカリ電池4本以上の電源(電池ボックス)に繋ぐことをお勧めします。

[`evernote` not found]
LINEで送る
Pocket

5分でできる!BluetoothでArduino遠隔操作ラジコンカー製作 (DCモーター制御) スケッチコード付き」への2件のフィードバック

  • 2019年7月20日 1:17 午後
    Permalink

    前進の速度を上げて後進速度を下げる場合はどうすれば良いのでしょうか

    返信
    • 2019年8月23日 2:59 午後
      Permalink

      モーターの回転速度は0~255の範囲で調整ができます。
      なので、私が書いたコードの場合では

      【前進のコードの箇所】
      下記の場所を200⇒255にするなど上げていただければ早くなります。
      analogWrite(enA, 200);
      analogWrite(enB, 200);

      【後進のコードの箇所】
      下記の場所を200⇒100など下げてもらえれば遅くなります。
      analogWrite(enA, 200);
      analogWrite(enB, 200);

      返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA