Arduino ではモジュール HC-05 (master/slave) により Bluetooth で他のデバイスとコミュニケーションを行うことが可能です。 Arduinoをスマートフォンやパソコン、他のマイコンなどの他の機器と接続してデータをやり取りすることができます。Bluetooth通信は、例えばロボットを遠隔操作したり、パソコンやスマートフォンにデータを表示したり保存したりするために使用できます。
前提となる条件。 Arduinoシリアル通信
材料
- パソコン
- Arduino UNO x2
- USBケーブル
- BluetoothモジュールHC-05 ZS-040 x2(または1x HC- ZS-040 x2)
- BluetoothモジュールHC-05 ZS-040 x2(または1x HC- ZS-040 x2)
- USBケーブル
- Dupont cables M/F
USBケーブル
パソコン
モジュール HC-05 overview
BluetoothモジュールHC-05は6ピンを持っています。 電源用2個、接続確立用2個、設定モード用1個、接続状態を知るためのもう1個。
- VCC電源です。 通常はArduinoの5V端子に接続します。
- GND グラウンド。 通常、ArduinoのGND端子に接続します
- RX 受信端子。 通常、Arduino
- TX 送信ピンの送信ピン(TX)にフックされます。 通常はArduinoの受信ピン(RX)に接続します
- モジュール接続時の状態はHIGHです
- Key ou ENをHIGH (3.3V) に設定しないと設定モードにならず、切断しないと通信モードにはなりません。
HC-05の特徴は、スレーブモジュール(HC-06と同等)としても、マスターモジュール(単独で他の機器とペアリングできる)としても使用できる点です。
Schematics for configuration
WARNING :
- Arduino Unoの2、3ピンを使用することにしました。 マイコンによっては、シリアル通信に対応していないピンがあります。 特に、Arduino Mega、Micro、Leonardo。
- Bluetoothモジュールは3.3Vロジックを使用しているため、Arduinoからの5V電圧を下げるために分圧器を追加することをお勧めします。 (ピン3とRxの間に抵抗1k、RxとGNDの間に2kオーム)
モジュールHC-05の設定
モジュールHC-05の設定は、動作確認、正しい接続、名前などのパラメータ変更(複数のモジュールを使用している場合に便利)、PINコードや通信速度(ボーレート)に興味深いものがあります。 特に、マスターモジュールとして使用する場合は、注意が必要です。 HC-05の電源を入れる前に、KEY/ENピンをHIGHに設定してください。
シリアルモニターを開き、エンドラインオプションの「New line」とボーレート9600を選択します。
なお、HC-05はボーレート38400bpsで設定モードに入ります。
設定コード
以下のコードで、シリアルモニターとATコマンドを使ってパラメータの変更と確認が可能です。
#include <SoftwareSerial.h>#define rxPin 2#define txPin 3#define baudrate 38400String msg;SoftwareSerial hc05(rxPin ,txPin);void setup(){ pinMode(rxPin,INPUT); pinMode(txPin,OUTPUT); Serial.begin(9600); Serial.println("ENTER AT Commands:"); hc05.begin(baudrate);}void loop(){ readSerialPort(); if(msg!="") hc05.println(msg); if (hc05.available()>0){ Serial.write(hc05.read()); }}void readSerialPort(){ msg=""; while (Serial.available()) { delay(10); if (Serial.available() >0) { char c = Serial.read(); //gets one byte from serial buffer msg += c; //makes the string readString } }}
AT Commands
モジュールHC-06と比較して、HC-05はマスターモジュールとして使用でき、ATコマンドを使用して保存したパラメータを確認することもできます。
一般的には、コマンドAT+<command>? を入力すると保存したパラメータ(ex: AT+PSWD?はモジュールPINコードを表示)が表示されるようになります。 AT+<command>=<Param> と入力すると、パラメータ値を設定できます(例: AT+PWSD=0000 でPINコードを0000に変更)
ATコマンドの一部を紹介します:
- 通信テストをするには、Arduino IDEのシリアルモニタにATと入力してください。
- モジュール名を変更するには、AT+NAME=<Param>と入力します。
- PINコードを変更するには、AT+PSWD=<Param>を入力します。
- AT+ROLE=<Param>でモジュールの役割をスレーブかマスターか選択します(デフォルト0、例:マスターとして役割を変更するにはAT+ROLE=1、スレーブとしてAT+ROLE=0を入力します)。
- ボーレートを変更するには、AT+UART=<Param1>,<Param2>,<Param3>にParam1、2、3シリアル通信パラメータ: ボーレート、ストップビット、パリティビット(デフォルトでは、9600、0、0に設定されています。 例:ボーレートを115200に変更するには、AT+UART=115200,0,0と入力します)
BluetoothモジュールHC-05用の他のATコマンドは、リンク先で見つけることができます。
CAUTION: モジュールHC-05はバージョンが異なり、設定手順も異なる可能性があります。 使用する前に、必ずモジュールラベルとファームウェアのバージョンを確認してください。 このチュートリアルでは、ZS-040というラベルのついたモジュールHC-05とファームウェアバージョン2.0-20100601を使用しました。
N.B.: モジュールが応答しない場合、配線、ケーブルの導電性、ボーレートをチェックしてください。
スレーブ設定
モジュールをスレーブに設定するには、AT+NAME=HC05-Slaveと名前を変え、通信パラメータと必要なPINコードを選択することができます。 マスターとスレーブの通信パラメータが同じであることを確認する必要があります。
- AT returns OK
- AT+NAME=HC05-Slave
- AT+UART=9600,0,0
- AT+ROLE=0
- AT+ADDR でモジュールアドレス(例: +ADDR:98d3:32:21450e)
スレーブモジュールには、HC-06モジュール
Master Configuration
モジュールをマスターとして設定するには、ロールの変更とスレーブモジュールと同じ通信パラメータを設定することが必要です。
- AT returns OK
- AT+NAME=HC05-Master
- AT+UART=9600,0,0
- AT+ROLE=1
- マスターモジュールでスレーブモジュールのアドレスがないと起動できない。 AT+BIND=98d3,32,21450e (replace dots “:” by coma “,”)
Schematics for communication
通信モードでは、キー/ENピンは接続されていません。
通信コード
両方のモジュールが設定できたら、モジュールと接続したArduinoボードに次のコードを書き込んで下さい。 各モジュールの電源を入れ、通信モードにします。
HC-06 モジュールと同じライブラリ SoftwareSerial.h を使用します。
- SoftwareSerial hc05(Rx,Tx) シリアルポートのピンを定義する
- hc05.begin() ボーレート(お使いのモジュールと同じ値にします)
- hc05.begin() ボーレートの定義(お使いのモジュールと同じにして下さい)
- hc05.begin() ボーレートを定義する(お使いのモジュールと同じにして下さい)
- hc05.begin() ボーレートを定義する(お使いのモジュールと同じにして下さい)
- hc05.begin() ボーレート(お使いのモジュールと同じにして下さい)を定義する(お使いのモジュールと同じにして下さい)を記述します。available() でデータがモジュールのバッファで利用可能かどうかをテストします
- hc05.read() で一度に1バイトずつデータを読みます
- hc05.print() でASCIIフォームの文字列を送信します
- hc05.print() で1バイトずつデータを送信します。write() で1バイトずつデータを送信
マスターコード
#include <SoftwareSerial.h>SoftwareSerial ArduinoSlave(2,3);String answer;String msg;void setup(){Serial.begin(9600);Serial.println("ENTER Commands:");ArduinoSlave.begin(9600);}void loop(){//Read command from monitorreadSerialPort();//Read answer from slavewhile (ArduinoSlave.available()) {delay(10); if (ArduinoSlave.available() >0) {char c = ArduinoSlave.read(); //gets one byte from serial bufferanswer += c; //makes the string readString}}//Send data to slaveif(msg!=""){Serial.print("Master sent : ");Serial.println(msg);ArduinoSlave.print(msg);msg="";}//Send answer to monitorif(answer!=""){Serial.print("Slave recieved : ");Serial.println(answer);answer="";}}void readSerialPort(){while (Serial.available()) {delay(10); if (Serial.available() >0) {char c = Serial.read(); //gets one byte from serial buffermsg += c; //makes the string readString}}Serial.flush();}
スレーブコード
#include <SoftwareSerial.h>SoftwareSerial ArduinoMaster(2,3);String msg;void setup(){Serial.begin(9600);ArduinoMaster.begin(9600); }void loop(){readSerialPort();// Send answer to masterif(msg!=""){Serial.print("Master sent : " );Serial.println(msg);ArduinoMaster.print(msg);msg=""; }}void readSerialPort(){while (ArduinoMaster.available()) {delay(10); if (ArduinoMaster.available() >0) {char c = ArduinoMaster.read(); //gets one byte from serial buffermsg += c; //makes the string readString}}ArduinoMaster.flush();}
両方のシリアルモニタを開いて、マスターボードのモニタでコマンドを入力すると、次のような結果になるはずです。 マスターボードがコマンドを送信し、スレーブボードがそれを受信して送り返す。
Bluetoothモジュールの設定やペアリングに問題がある場合は、遠慮なくお問い合わせいただくか、コメント欄にご記入ください。