「Arduinoの基礎 - Bluetooth」の版間の差分
編集の要約なし |
|||
| 33行目: | 33行目: | ||
<br><br> | <br><br> | ||
== Bluetoothモジュール HC-06と温度センサ == | |||
このセクションでは、Arduino、BluetoothモジュールHC-06、温度センサTMP36を使用して、温度データをBluetoothで送信する。<br> | |||
<br> | |||
TMP36は、アナログ出力温度測定ICである。<br> | |||
詳細は、Arduinoの基礎 - 温度センサを参照すること。<br> | |||
<br> | |||
ここでは、HC-06のデバイス名をMYBT、ボーレートを38400[bps]に設定している。<br> | |||
HC-06の設定については、上記のセクションを参照すること。<br> | |||
<br> | |||
下図に、回路図および配線図を示す。<br> | |||
下図右では、ArduinoからのTXを分圧している抵抗器が接続されている。<br> | |||
<br> | |||
以下に、Arduinoのサンプルコードを記述する。<br> | |||
HC-06がGET:TEMPという文字を受信した時、温度データを送信している。<br> | |||
ここでは簡易的な通信のみを行っているが、クライアント側とサーバ側でデータフォーマットの取り決めをする方がよい。<br> | |||
<br> | |||
このままでは、データを受信するクライアントが無いため、<br> | |||
次のセクションでは、スマートフォンとHC-06を接続して、遠隔通信で温度データを受信する。<br> | |||
<syntaxhighlight lang="c++"> | |||
#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; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Arduino]] | [[カテゴリ:Arduino]] | ||
2020年12月4日 (金) 08:53時点における版
概要
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;
}