HC-6を使ってarduinoでbluetooth通信をする

# 初めに
arduinoでワイヤレス通信を行うには様々な方法があります。
wi-fi赤外線bluetoothなどなど。
この記事では、ブルートゥース通信を行うモジュールを紹介・説明します。
arduinoなど全てのマイコンで可能ですが、主にarduinoを中心に説明します。
# モジュール
モジュールはHC-6を使用する。
HC-6はブルートゥースで通信しますが、親機としての機能は備えていません、
のでHC-6同士で通信することはできません。
Bluetoothはシリアル通信と同じように使うことができる。
それはBluetoothシリアル通信と呼ぶそうです。
# 配線
![image](https://lh3.googleusercontent.com/pw/AIL4fc-jW4zwFO1QgEIDEyX5fctS1ObyaBq9qtMIi0ROFn9yUIe8Pzjfr4vjLGzH8SMpEQmXQZ8Up50dc61tDFWvqbxX53v7XdVehvg3-6TCw6aCdXNl4ZxzkocqaFOaSIy1s-LEXwPP467R59wXbg0BA29Zp2oqD-O1Gx_npIMR1AlGATsXc1AlpnWYWMnLJ5FbHLITujBLBlvGusVhFJoDpmTiYAI1S0SdAQh4q3rT7HUA8LnUZaOWGATwttx_5PmJY1reh1yuDkEdadcqSndFVQDyfVpATaJwyPxZV3_se-H3O-KVGdASbMfEh29at-3xVghT6P_WUbSct2XglKaHGk5qf4lBoBoX54IEedoBEVN5Ny4SFvlrmx5TDClVwyJfD18-WyMvLvT0q7-nHISIRft4jiqw-IANcfFLyLyhOv93yXsgBn_FF0BZ_1jGZ-qpcxi9wzyYWUHQkAoW6w6hyfprP3E0KuwU4SwRNS8kR8uThv6d35ft9ihOZx7gvpHYnHkP4_jiCSGNNvB4Q1sk0dQlOeN0wK4Oj6IxHbFhiAtg7RMqR78dL6wolTAzXEGSeIIYV3EEN1lSNf1cHao63q8pTyTGYObE38Uuf8F0d4JfOmFZEwF_FafmZcFDhinR7ZER7qou9pmj1hIxhm-DvGt-51s-P1pRchSBpA2TKNznN-Xy0qBk_tiKtOVaQQIJ0eV4W_9l85WdzykwmKFdOV_4sVyk0hOOqI5E0TimSMZjexpWvDa2eL-H3qgSu3ugEvRNfTEFteIxeP5Q5gcSwXFfCtS1q67uJw42c06NvsBBr_w_IyYK1vpE3ZayPd11_VitSJsoJKLLD52xbil9qvxfD7glAMMuRiaoWxLp3HA81r1LN1aVuxp7kYRFIc7tG9GJlH7gtE2tDf8Sqexfmp9rctydf4yvR9slEMfC6g6SP6gXeYMFdMTnnn1wZkIJwqqKotB_8z1jT0xUVhOzAO1CbbE_0e__LPhe8xQZBVrBauyE1504Pr26FFpqdaVkn_t8=w861-h1239-s-no?authuser=0)
HC-5はHC-6に親機の機能を持たせたもの。
FritzingにはHC-6がなかったので、HC-5が使われているが、
HC-5はステートとキーが存在するだけで、配線も同じなので、配線図ではHC-5を使用している。
# HC-6
さて配線はできただろうか。
HC-6とbluetoothシリアル通信を行うには、HC-6とbluetoothが搭載された端末がbluetoothで接続されていなければならない。
windowsの場合、設定 -> Bluetoothとデバイス -> デバイスの追加 -> Bluetooth -> HC-6で接続ができる
接続するとき、パスワードが要求される、パスワードは1234がデフォルトで設定されている。
それを入力すれば接続できる。
# スケッチ(コード)
プログラムは読者の手助けとなるプログラムを書く。
```c++
#include<SoftwareSerial.h> //必須
SoftwareSerial Bluetooth(7,8); //RX | TX
void setup() {
  Bluetooth.begin(9600); //bluetoothシリアルポートを開き、データレートを9600bpsrdに設定する。
  Serial.begin(9600);
}

void loop() {
  if(Bluetooth.available()){　//データを受信した
    Recv_data = Bluetooth.read();  //受信したデータを読み取る (int)
    Serial.println(Recv_data);  //データをarduinoのシリアルポートに出力する
    Bluetooth.write(Recv_data);  //データを接続先のシリアルポートに出力する
  }
}
```
シンプルなプログラムだ
受け取ったデータを出力してる
受け取るデータはint型だが、Stringでも受け取ることができる。
だた私はそれができなかったので、説明しない、いやできない

しかしこれでは簡素的すぎる。
ではデータを受け取るときプログラムが一時停止するプログラムも書くことにしよう。
```c++
#include<SoftwareSerial.h> //必須
SoftwareSerial Bluetooth(7,8); //RX | TX
void setup() {
  Bluetooth.begin(9600); //bluetoothシリアルポートを開き、データレートを9600bpsrdに設定する。
  Serial.begin(9600);
}

void loop() {
  Serial.print("一つ目のデータ : ");
  Serial.print(Recv());　//データを受け取るまで停止
  Serial.print(", 二つ目のデータ : ");
  Serial.print(Recv());  //データを受け取るまで停止
  Serial.println();
}
int Recv(){  //データを受け取る　returnは受け取ったデータ
  int Recv_data = 2525;//受信データを保存する変数
  while(free){ //データを受け取るまで繰り返す
    if(Bluetooth.available() ){
      Recv_data = Bluetooth.read();  //データを代入
      if(Recv_data < 10){  //データが1の位だったら抜け出す
        break;
      }
      else if(Recv_data < 100){ //データが10の位だったら一度Recv_subを呼び出す
        Recv_sub();
        break;
      }
      else if(Recv_data < 1000){ //データが100の位だったら二度Recv_subを呼び出す
        Recv_sub();
        Recv_sub();
        break;
      }
    }
  }
  return Recv_data; 
}
int Recv_sub(){ //なぜか存在してる
  int Recv_data = 2525;
  int Delete_data;
  while(free){
    if(Bluetooth.available() ){
      Recv_data = Bluetooth.read();
      break;
    }
  }
  return Recv_data;
}
```
Recv_sub()の存在は不思議でたまらないだろう
私も不思議だ
ただもしRecv_sub()のようにデータを返すと
次呼び出すRecv関数が0を返すのだ。
とにかく理由はわからないが、バグが起きる
Recv_sub()はそのバグを回避するためにある

一度Recv_sub()でデータを受信してみるといい
なぜか10の位や100の位を受信したとき、次呼び出すRecv関数が10の位の時は0 100の位の時は
その次呼び出すRecv関数も0を返してしまう。
# データの送信方法
スケッチを試すには、データを送信するソフトウェアが必要です。
試すだけなら、Microsoft StoreのBluetooth Serial Terminalがお勧めだ。
ただし、このターミナルは使い勝手はあまりよくない。
自分なりにデータを送れるソフトをお探しなら、
自作してみるのもいいだろう。

いつかそれに関する記事を書くかもしれない...
# 最後に
HC-6で簡単にbluetooth通信が可能に。
すごすぎる！