Arduinoを手軽に無線化させる方法として、HC-05やHC-06のBluetoothモジュールを使う方法がある。
HC-05やHC-06は安価で手軽だが、残念な事に現在購入できるものは(知る限り)技適マークが無いため日本国内ではそのままでは使用できない。通信はBluetooth 2.0+EDR形式で通信範囲は10m程度なので使用しても事実上問題は出ないと思うが、国内で使用する場合には自分で技適を取るか、電波暗室等の外部に電波が漏れない場所で使う必要があると言うことをとりあえず述べた上で、HC05を使ったArduinoの無線通信化について紹介する。
HC-05とHC-06はいずれもBluetoothの子機として使用できるが、HC05はBluetoothの親機としても使用できる。このため、HC-05が2つあれば、あらかじめペアリングしておく事でArduino同士を無線通信化させ、ラジコン本体制御とコントローラーを作るなんて事も可能だ。
HC-05の素晴らしい所は、通信はBluetoothで行うが入出力端子はシリアルのRX/TXとなっているため、Arduinoのシリアル RX/TXに接続するだけで通常のSerial通信と変わらず使用できる点である。
シリアル通信が単に無線化するだけなので、ソフト的には通常のシリアル通信を行うだけで何も考える必要が無い。特別なBluetoothのライブラリ等も不要だ。PCのBluetoothとペアリングする場合も、PC側はBluetooth仮想COMポートとして認識されるため、PC側ソフトもCOMポート番号を変えるだけでBluetoothを意識する事は無い。
では、HC-05の設定方法について説明しよう。HC-05によってはATコマンド設定用にボタンがついているものと、ついていないものがある。本記事ではボタン有りの製品について説明しているが、無い場合もKEYと呼ばれるPinをHIGHにしておく事でATモードに入ることが出来る。
参考サイト:
http://www.instructables.com/id/AT-command-mode-of-HC-05-Bluetooth-module/step2/Pinout-and-entering-AT-mode/
http://www.instructables.com/files/orig/FOR/4FP2/HKZAVRT6/FOR4FP2HKZAVRT6.pdf
http://blog.zakkemble.co.uk/getting-bluetooth-modules-talking-to-each-other/
http://arduino.densikit.com/jikken-shitsu/bluetooth
まず、Arduinoを1台準備し、下記スケッチを書き込む。
#include <SoftwareSerial.h> SoftwareSerial btport(10, 11); void setup() { Serial.begin(9600); btport.begin(38400); Serial.println("Enter AT commands:"); } void loop() { if (btport.available()) Serial.write(btport.read()); if (Serial.available()){ btport.write(Serial.read()); } }
このスケッチはPin 10、11をHC-05のシリアルのRX/TX通信用として使い、通常シリアルとの中継をするだけのものである。HC-05はATコマンド受付モード時はBaud Rateが必ず38400となる。
HC-05の端子を接続する。
- VCC – 5V
- GND – GND
- RXD – Pin 11
- TXD – Pin 10
電源投入時、HC-05のボタンを押しっぱなしにしておく。これにより、ATコマンド受付モードとなる(LEDはゆっくり点滅する)。筆者は設定時クリップを挟んでいる。
PCでArduino IDEのシリアルモニタか他のシリアル通信ソフトで9600bps、CRLF改行コードで開く。HC-05と上手く通信できていれば、「AT」と入力すると「OK」と返ってくる。上手くいかない場合、LEDの点滅がゆっくりになっているか(ATコマンドモードになっているか)、RX/TXの接続が逆になっていないか確認しよう。
まずは子機(Slave)側設定を行う。使用するコマンドは以下の通り。
- AT+ORGL 工場出荷時状態に戻す
- AT+ROLE=0 子機モードに設定
- AT+ADDR? アドレス確認
基本はこの3つで、追加で下記設定をしておくと便利である。
- AT+NAME=XXXXX 機器名称
- AT+UART=115200,0,0 通信速度の設定(HC-05は38400、HC-06は9600がデフォルト)
- AT+CMODE=1 接続先を限定しない
HC-05は「AT+NAME?」の様に最後に「?」をつける事で現在の設定を確認できる(HC-06は出来ない)。2つのHC-05を必ずペアで使う場合、AT+CMODE=0にしておくと、特定アドレス(ペア設定したもの)のみ接続する様になる。
PCのBluetoothと接続する場合は、後はPCからBluetooth検索して通常のペアリング手順を踏めば、仮想COMポートが追加される。
ATコマンドの流れのサンプル。
Enter AT commands: >AT OK >AT+ORGL OK >AT+ROLE? +ROLE:0 >AT+ROLE=0 OK >AT+NAME? >AT+PSWD? >AT+ADDR? +ADDR:98d3:31:902092 >AT+UART? +UART:38400,0,0 >AT+UART=115200,0,0 OK >AT+UART? +UART:115200,0,0 >AT+CMODE? +CMOD:0 >AT+CMODE=1 OK
次に、親機(Master)となるHC-05の設定と子機とのペアリング設定。ペアリング設定を行う場合、子機はVCCとGNDだけ通電させておく。
- AT+ORGL 工場出荷時状態に戻す
- AT+ROLE=1 親機モードに設定
- AT+RMAAD 既存のペア情報削除(念のため)
- AT+INIT プロファイル初期化
- AT+UART=115200,0,0 子機の通信速度と合わせる
- AT+PAIR=アドレス
- AT+BIND=アドレス
- AT+LINK=アドレス 子機と接続
アドレスは「98D3:31:902092」の様な数字のコロンをカンマに変更した「98D3,31,902092」の形式で指定する。これで子機とペア設定され、以降は両機電源が入ると勝手に通信が始まる。
「AT+INQ」で周辺のデバイス検索、「AT+RNAME? アドレス」で名称を取得できる。
ATコマンドの流れのサンプル。
Enter AT commands: >AT+ORGL OK >AT+ROLE=1 OK >AT+ROLE? +ROLE:1 >AT+RMAAD OK >AT+INIT OK >AT+UART? +UART:38400,0,0 >AT+UART=115200,0,0 OK >AT+UART? +UART:115200,0,0 >AT+INQ +INQ:98D3:31:902092,0,7FFF >AT+RNAME? 98d3,31,902092 +RNAME:H-C-2010-06-01 >AT+PAIR=98d3,31,902092,5 OK >AT+BIND=98d3,31,902092 OK >AT+LINK=98d3,31,902092 OK
これでデバイスの準備は出来たので、実際に簡単な通信を行ってみる。子機側Arduinoに下記スケッチを書き込む。1秒毎に経過時間をシリアルポートに書き込む。
char strbuf[16]; unsigned long sttime; unsigned long cutime; void setup() { sttime = millis(); Serial.begin(115200); } void loop() { cutime = (millis() - sttime)/1000; int shour = cutime / 3600; int smin = (cutime%3600)/60; int ssec = cutime%60; sprintf(strbuf,"%02d:%02d:%02d\n",shour,smin,ssec); Serial.print(strbuf); delay(1000); }
親機側にシリアルポートの内容をLCDに出力するスケッチを書き込む。
#include <LCD4Bit_mod.h> LCD4Bit_mod lcd = LCD4Bit_mod(2); char input[17]; int i = 0; void setup() { lcd.init(); lcd.clear(); Serial.begin(115200); Serial.println("Ready"); } void loop() { if (Serial.available()){ input[i] = Serial.read(); if (i > 16 || input[i] == '\n') { input[i] = '\0'; lcd.clear(); lcd.cursorTo(1,0); lcd.printIn(input); i = 0; } else { i++; } } }
HC-05の各ピンをArduinoのピンに接続する。
- VCC – 5v
- GND – GND
- RXD – Pin 1(TX)
- TXD – Pin 0(RX)
これで完了。後は電源を入れると、子機側から1秒毎に経過時間の文字列が送信され、親機側のLCDにその文字列が表示される。
Arudino系はちょっとした工作や一時的に自動化を行いたい時に非常に便利で楽しいものある。もっとこの系統の製品が流行って色々なシールドやパーツ、情報が溢れる様になって欲しいものである。それと、BluetoothやWiFi、10m程度の短距離かつ一般化された通信であればもっと規制を緩くしてほしいものである。(個人向けに技適費用をもっと安くしてくれてもいいのだが・・・)
子機モジュールの設定は最後まで完了したのですが親機モジュールの設定中にある「AT+INQ]周辺デバイスの検索で子機が発券されずエラー(16)が出てきてしまいます