前回解説した
すぐにできる!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本以上の電源(電池ボックス)に繋ぐことをお勧めします。
前進の速度を上げて後進速度を下げる場合はどうすれば良いのでしょうか
モーターの回転速度は0~255の範囲で調整ができます。
なので、私が書いたコードの場合では
【前進のコードの箇所】
下記の場所を200⇒255にするなど上げていただければ早くなります。
analogWrite(enA, 200);
analogWrite(enB, 200);
【後進のコードの箇所】
下記の場所を200⇒100など下げてもらえれば遅くなります。
analogWrite(enA, 200);
analogWrite(enB, 200);