UnityとAndroidを連携させBluetoothでArudinoと通信してみた(5)

やっとArduinoパートまで進めました。

 

ここは、参考サイトには無い項目なので自力で作ってみました。(´・∀・` )

 

スクリプトを書き出してみました。こんな風になります。

 

// スマホとブルートゥース(シリアル)通信で、やり取りするプログラム
// スマホのUnityアプリに配置してあるスライダーからのRGB値を受信してRGB_REDの色を変更する


// Bluetooth通信ライブラリ
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11);  // RX:10,TX:11 それぞれブレッドボードのBT機器の逆にRXはTXへ、TXはRXへ

// char配列->int変換用
#include <stdlib.h>


// バッファ
char buffer[4]={0};  // 初期化 4byte(3+\n)

// RGB値
int R = 0, G = 0, B = 0;

void setup() {
  
  // [1] アルディーノ側初期設定
  Serial.begin(9600);

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

  Serial.println("setup passed");

  
}

void loop() {

  int byteRead = 0;
  int rgb_value;


  // Bluetooth 受信処理
  if (BT.available()) {

       byteRead = BT.available(); // バッファに溜まっている文字数を取得

       /*
       Serial.println("Reading To Buffer...");
       Serial.println(byteRead);
       Serial.println();
       */
       delay(100);  // 上のシリアルモニターへの処理(負荷)がなくなると、RGB_LEDがうまく点灯しなくなるので、代わりに遅延をかけている。
       
      for(int i=0; i<3; i++){
        buffer[i]= (BT.read());
        buffer[i+1] = '\0';
      }
      //Serial.println(buffer);
  }

  rgb_value = atoi(buffer);   // int型に変換

  if(0<=rgb_value && rgb_value<256){
    // R値
    analogWrite(5,rgb_value);
  }else if(256<=rgb_value && rgb_value<512){
    // G値
    analogWrite(6,rgb_value - 256); // ゲタは外しておく
  }else if(512<=rgb_value && rgb_value<768){
    // B値
    analogWrite(7,rgb_value - 512); // ゲタは外しておく
  }else{
    // error
    //Serial.println("無効値を受信");
  }

  
}

 

Arduinoのリファレンスにあるソフトウェアシリアルのread()関数の戻り値は、char型で受けているので、このスクリプトも文字の終端1byteを加えた4byteのバッファを用意して受け取っています(終端文字を挿入しては上書きするといったおかしなこともしてますが)。バッファに値が入ったら、もう一度int型に変換し直します。RGB値にゲタを履かせてずらして飛ばせば戻すのも切り分けも平易に出来るのでこう言う風にしました。

 

これで準備が整ったので、後は、Arduinoにこのスクリプトを流し込んで、スマホに書き込んだアプリを起動すれば、すでにペアリング済みのBluetooth機器を選択するダイアログが出てくるので、HC-06(実験ではHC-06を使用)を選択すれば、コネクションを確立します。コネクションを確立後、Unityのロゴが出てスライダー画面が出てくるので、スライドするとArduino側に接続されたRGB_LEDが指定のRGB値で点灯するようになります。

 

余談
Arduinoの電源にモバイルバッテリーが使えたらいいなぁとかねてから思ってて、ダイソーで買った300円バッテリーをつなげてみたらやっぱり使えませんでした。5Vの出力あるのになんでかな~とかしばらく考えてましたが、よくよく考えたらArduinoの入力電源はUNOもNANOも7V~12Vだということをすっかり失念してました。そりゃムリだよね。ところで、このダイソーの300円バッテリーせめて他の用途で使えないかなぁと思って、色々調べてみたら(参考サイト http://d.hatena.ne.jp/wakwak_koba/20170603)のような記事をみつけました。なるほど、以前ラジオの電源にしようと使ったらリセットがかかって何度も再起動した原因はこれか~と、納得しました。本当にこのモバイルバッテリーは、充電以外なんの用途にも使えないんですねぇ。残念。

コメント

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