蒼天遊々な旅

LIFE IS TRAVEL

電子工作⑥ ラジコンカー制作への道 Bluetooth制御組み込み


赤外線通信を組み込んでいたラジコンカー試験機に、新たに購入したBluetoothの基盤『HC-05』を組み込んでみた。
Bluetoothユニットの通信をテストするときはスタータキットのロボットカーから拝借していたのだが、ロボットカーはそのままの状態で残していたかったのとBluetoothユニットが複数あればいろいろ出来そうだったのでとりあえず3枚セットで販売されていた安物を購入した。
以前の赤外線通信プログラムをBluetoothから送られてくる信号に合わせて改良。
スマホ側のアプリ『Arduino Bluetooth controller』のボタン設定をプログラムの合わせて設定してみたら、無事につながった。

おおー。スマホでモーターが動いたぞ。
でも、なんか挙動が気に入らない。
前進ボタンを押して動作中に違うボタンを押しても切り替わらず、前進終了後に後で押したボタンが有効になるような動きをする。
ボタンを押してダイレクトに動きが変化するような感じにしたいんだけどなぁ。
プログラムコードをいろいろ勉強していく上で、ついでにブログにプログラムをそれっぽく記載する為の記法をしらべてみた。
はてなブログって独自のはてな記法というコードを打つと、色々とブログの表記のデザインをカスタマイズできるみたい。
プログラミング系のブログにはてなブログが使われているのもこういうところで親和性が高いからなのかなぁ。

/*
~使い方説明~
・各方向ボタンを押すとその方向に動く。
・dtime時間分動作後停止する。
シリアルモニタで表示をしているのはプログラムが動いているかを確認する為。
*/

//モータードライバーL298との接続を定義
const int in1 = 3;        // in1ピンを3に
const int in2 = 4;        // in2ピンを4に
const int in3 = 5;        // in3ピンを5に
const int in4 = 6;        // in4ピンを6に
const int ENA = 9;        // ENA ピンを9に
const int ENB = 10;       // ENBピンを10
//PWM制御の出力を設定
const int speed = 100;    // 低速スピード設定
const int speed2 = 200;   // 高速スピード設定
//遅れ時間設定
const int dtime = 1500;   //遅れ時間設定1
const int dtime2 = 1000;  //遅れ時間設定2
//シリアル通信ポート設定(シリアル通信の入力はRX=0ピンの為)
int data = 0;

void setup() {
  pinMode(in1, OUTPUT);  // デジタルピンを出力に設定
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  Serial.begin(9600);  //シリアル通信開始、転送速度は9600ビット/秒
}

void loop() {
  if (Serial.available() > 0) {  //0以上の情報が入力されたら動作させる。
    data = Serial.read();         //シリアル通信で受け取ったデータを読み込む
    if (data == '1') {            // ↑ボタンを押すと前進 HIGH,LOWは1,0でもいい
      Serial.println("1 前進");  //シリアルモニタ表示
      digitalWrite(in1, 1);
      digitalWrite(in2, 0);
      digitalWrite(in3, 1);
      digitalWrite(in4, 0);
      analogWrite(ENA, speed);
      analogWrite(ENB, speed);
      delay(dtime);
      digitalWrite(in1, 0);
      digitalWrite(in2, 0);
      digitalWrite(in3, 0);
      digitalWrite(in4, 0);

    } else if (data == '4') {     // ←ボタンを押すと左折する
      Serial.println("4 左折");  //シリアルモニタ表示
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      analogWrite(ENA, speed);
      analogWrite(ENB, speed);
      delay(dtime);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);

    } else if (data == '2') {     // →ボタンを押して右折する
      Serial.println("2 右折");  //シリアルモニタ表示
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);

      analogWrite(ENA, speed);
      analogWrite(ENB, speed);
      delay(dtime);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);

    } else if (data == '3') {     // ↓ボタン押すと後進(バック)
      Serial.println("3 後進");  //シリアルモニタ表示
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(ENA, speed);
      analogWrite(ENB, speed);
      delay(dtime);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);

    } else if (data == '5') {       // □ボタン押すと右旋回
      Serial.println("5 右旋回");  //シリアルモニタ表示
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(ENA, speed2);
      analogWrite(ENB, speed2);
      delay(dtime);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);

    } else if (data == '6') {       // ×ボタン押すと左旋回
      Serial.println("6 左旋回");  //シリアルモニタ表示
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(ENA, speed2);
      analogWrite(ENB, speed2);
      delay(dtime);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);

    } else if (data == '0') {     // 〇ボタン押すと停止(ストップ)
      Serial.println("0 停止");  //シリアルモニタ表示
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
    }
  }
}

プログラミング内容はしょぼいかもしれないけれど、ここは記録として残しておく。

ikazuti-d.hatenablog.com
ikazuti-d.hatenablog.com