最近作ったもの(2) -電子工作-

もう一つ作りました。

 

ずっと前に作った、アルディーノで制御する三輪ライントレース車をタンクタイプに改造して、AndoroidスマホとBlueTooth機器を使ってシリアル通信化しました。

 

20170614b

 

新たに購入した、タミヤのタンク基本セットとオプションのユニバーサル基板セットに2000円ぐらいかかっています。

 

BlueToothの部品は、「HC-06」になります。

 

前にも同じように、BlueToothモジュールを介してシリアル通信ができないものかとやった覚えがあるのですが、その時は失敗してます。今回は、いきなりアルディーノタンクにHC-06をのっけて実験するのは止めにして、以下のブログさんの記事を参考に前実験してみました。

 

[curious4dev ]
http://curious4dev.mydns.jp/post-1354/

 

シンプルに説明してくれているので、とてもわかり易くて助かりました。
で、下のような感じで真似をして…

 

20170614c

 

うまくいきました。うまくいったのでこちらのプログラムとライントレース用のプログラムを、組み合わせて走らせてみます。

 

取得したアスキー文字をswitch文で振り分けてあげればいいだけなので、一定速度で一定方向にただ動かすだけのシンプルなものなら、以下のコードで動きました。

 

[CMascot.h]

// スマホとブルートゥース(シリアル)通信で、やり取りするタンクプログラム[2017.06](完成版)

// Bluetooth通信ライブラリ
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11);

void setup() {
  
  // [1] アルディーノ側初期設定
  Serial.begin(9600);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);   // アナログ値出力 (0~255 まで負の値不可)
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);   // アナログ値出力 (0~255 まで負の値不可)

  // [2] HC-06 側初期設定
  BT.begin(9600);
}

void loop() {
  // ローカル変数
  char a;  // 受信した値を格納(アルディーノのswitch文では、文字型も受付るが、'A'は、65と解釈されるので文字列の数値も値が'1'は49 '0'は48と解釈される)
  
  // Bluetooth 受信処理
  if (BT.available()) {
    a = (BT.read());

    // Case文
    switch(a){

/* TestCode
      case 48:
        BT.println("0 commaned about 48");
        break;
      case 49:
        BT.println("1 commaned about 49");
        break;
      case 1:
        BT.println("1 commaned about 1");
        break;
      case 0:
        BT.println("0 commaned about 0");
        break;        
*/


      case 49:  // 前進
              
        // 左モーター制御(正転)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(9, 255);
        // 右モーター制御(正転)
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        analogWrite(6, 255);
 
        delay(10);
        BT.println("Foward Commanded!");
        break;
        
      case 50: // 後退 [moter(); 内で、左右モーターを逆転させ、かつ最大出力とする]

        // 左モーター制御(逆転)
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(9, 255);
        // 右モーター制御(逆転)
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        analogWrite(6, 255);
        
        delay(10);
        BT.println("Back Commanded!");
        break;
        
      case 51:  // 停止
      
        // 左モーター制御
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        analogWrite(9, 0);
        // 右モーター制御
        digitalWrite(4, LOW);
        digitalWrite(5, LOW);
        analogWrite(6, 0);

        delay(10);
        BT.println("Stop Commanded!");
        break;
        
      case 52:  // 前進しながら右旋回
      
        // 左モーター制御(正転)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(9, 255);
        // 右モーター制御(正転)
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        analogWrite(6, 80);
            
        delay(10);
        BT.println("Foward and Right Commanded!");
        break;
        
      case 53:  // 前進しながら左旋回

        // 左モーター制御(正転)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(9, 80);
        // 右モーター制御(正転)
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        analogWrite(6, 255);
        
        delay(10);
        BT.println("Foward and Left Commanded!");
        break;
        
      case 54:  // 信地旋回(右) [moter(); 内で、左モーターを正方向に。右モーターを逆方向にして、最大出力]

        // 左モーター制御(正転)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(9, 255);
        // 右モーター制御(逆転)
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        analogWrite(6, 255);
    
        delay(10);
        BT.println("Rapid Right Commanded!");
        break;
        
      case 55:  // 信地旋回(左) [moter(); 内で、右モーターを正方向に。左モーターを逆方向にして、最大出力]

        // 左モーター制御(逆転)
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(9, 255);
        // 右モーター制御(正転)
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        analogWrite(6, 255);
    
        delay(10);
        BT.println("Rapid Left Commanded!");
        break;

      default:
        break; 
    }

  }
}




 

あんまり複雑なことは出来ません。動作を変えるのに、都度ターミナルからコマンドを送り込まないといけないので。ですが、プロトタイプとしてはこれでも十分ではないかと思います。

コメント

タイトルとURLをコピーしました