Arduinoの基礎 - Bluetooth

提供: MochiuWiki : SUSE, EC, PCB

概要



Bluetoothモジュール HC-06

このセクションでは、Bluetoothの使用前に実施するBluetoothモジュールHC-06の設定方法について記載する。

HC-06は、Arduinoとシリアルインターフェイスで接続する。
ホストPCとHC-06の接続にはFT232RLを使用して、ATコマンドを送信することにより、デバイス名やボーレート等の設定ができる。
WindowsでHC-06の設定を行う場合は、RealTermを使用する。
LinuxでHC-06の設定を行う場合は、GNOME Bluetooth、Bluedevil(KDE)、Blueberry、Bluemanを使用する。

まず、HC-06のジャンパを3.3[V]にする。

COMポートの設定は、RealTermの[Port]タブ -[Port]プルダウンから、<数字> = \VCP0を選択する。(Linuxの場合、/dev/ttyUSB0等)
ボーレートの設定は、RealTermの[Port]タブ -[Baud]プルダウンから選択する。
ここでは、ボーレートを38400[bps]に設定しているが、既定の設定では9600[bps]である。

下図左のように、ATという文字を送信した後、HC-06からOKを受信すれば正常に接続されている。
下図右のように、HC-06のバージョンを確認する場合は、AT+VERSIONを送信する。
このように、AT+<コマンド>という形式のデータを送信することで、モジュールの設定を行うことができる。


まず、デバイス名をMYBTに設定するため、以下のコマンドを送信する。
HC-06からOKsetnameを受信すれば正常に設定されている。

AT+NAMEMYBT


次に、ボーレートを38400[bps]に変更するため、以下のコマンドを送信する。(6は38400を表す)

AT+BAUD6


これらの設定は、HC-06の再起動後に有効になる。
また、Bluetoothの既定の接続PINは1234である。


Bluetoothモジュール HC-06と温度センサ

このセクションでは、Arduino、BluetoothモジュールHC-06、温度センサTMP36を使用して、温度データをBluetoothで送信する。

TMP36は、アナログ出力温度測定ICである。
詳細は、Arduinoの基礎 - 温度センサを参照すること。

ここでは、HC-06のデバイス名をMYBT、ボーレートを38400[bps]に設定している。
HC-06の設定については、上記のセクションを参照すること。

下図に、回路図および配線図を示す。
下図右では、ArduinoからのTXを分圧している抵抗器が接続されている。


以下に、Arduinoのサンプルコードを記述する。
HC-06がGET:TEMPという文字を受信した時、温度データを送信している。
ここでは簡易的な通信のみを行っているが、クライアント側とサーバ側でデータフォーマットの取り決めをする方がよい。

このままでは、データを受信するクライアントが無いため、
次のセクションでは、スマートフォンとHC-06を接続して、遠隔通信で温度データを受信する。

 #include <SoftwareSerial.h>
 
 const int PIN_TMP36 = 1;
 SoftwareSerial bt = SoftwareSerial(2,3);
 boolean bt_found = false;
 
 void setup()
 {
    Serial.begin(9600);
    bt.begin(38400);
    delay(3000);
 
    String s = bt_sendCommand("AT");
    Serial.println("AT --> " + s);
    if( s == "OK" )
    {
       bt_found = true;
    }
    else
    {
       return;
    }
 }
 
 void loop()
 {
    if(!bt_found)
    {
       return;
    }
 
    if(bt.available() == 0)
    {
       return;
    }
 
    String r = "";
    while(bt.available() > 0)
    {
       char ch = bt.read();
       r += ch;
    }
 
    Serial.println("App Command Received: " + r);
    process_command( r );
 }
 
 float get_temperature()
 {
    int i = analogRead( PIN_TMP36 ); 
    float f = i * 5.0 / 1023.0;
 
    // TMP36 
    // C = 100V - 50
    return 100 * f - 50;
 }
 
 void process_command(String r)
 {
    if( r == "GET:TEMP" )
    {
       float temp = get_temperature();
       String s = String(temp, 1);
 
       bt.print(s);
       bt.flush();
    }
    else
    {
       Serial.println("Unknown command.");
    }
 }
 
 String bt_sendCommand(String cmd)
 {
    bt.print(cmd);
    bt.flush();
 
    Serial.println("Waiting [" + cmd + "]");
    while(bt.available() == 0)
    {
       delay(300);
    }
 
    Serial.println("OK [" + cmd + "]");
 
    String r = "";
    while(bt.available() > 0)
    {
       char ch = bt.read();
       r += ch;
    }
 
    Serial.println("Response [" + r + "]");
 
    return r;
 }



HC-06とクライアント

上記のセクションに記載したArduinoで温度データを送信するデバイス・ソフトウェアにおいて、
Bluetoothを使用してPCまたはスマートフォンと接続して、温度データを受信するPCまたはスマートフォンのソフトウェアの作成手順を記載する。

スマートフォン(Android)のソフトウェア
クライアントからサーバに接続する時、RFCOMMチャネルを作成してBluetoothSocketを作成する必要があるが、
この時に指定するUUIDは、SPP(シリアルポートプロファイル)のUUIDである"00001101-0000-1000-8000-00805f9b34fb"を指定する。
また、デバイス名はMYBTとしているため、BondedリストからBluetoothDeviceを探す際の名前も変更する。

 package com.keicode.android.testapps.bttest1c;
 
 import java.util.UUID;
 
 public interface Constants
 {
    public static final String BT_DEVICE = "MYBT";
    public static final UUID BT_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
 
    public static final String STATE_TEMP = "STATE_TEMP";
 
    public static final int MESSAGE_BT = 0;
    public static final int MESSAGE_TEMP = 2;
 }


次に、環境設定を行う。
ここでは、デバイス名はMYBTとしているが、これをあらかじめペアリングする。
以上の変更を行い、Arduinoとスマートフォンの両方を起動することで自動的にBluetooth接続して、スマートフォンの画面に温度が表示される。