第2章 BLEデバイスの作成 - masato-ka/bel-key-security-app GitHub Wiki
本章ではBLEデバイスの組み立てと設定を行います。本章を通してRN4020の基本を身につけましょう。
2.1 回路を組み立てる
まず最初にハードウェアとなるBLEデバイスの組み立てを行っています。
2.1.1 必要な部品
必要なパーツリストは以下の通りです。
部品 | 数量 |
---|---|
RN4020(秋月ボード) | 1 |
XBee 2.52ピッチ変換基盤 | 1 |
USBシリアル変換 | 1 |
ホール素子(SK8552G) | 1 |
トランジスタ(2SC1813) | 1 |
抵抗(1kΩ) | 1 |
ブザー(UDB-05LFPN) | 1 |
ブレットボード | 1 |
配線材 | 適量 |
2.1.2 配線
以下の写真のように配線を行っていきます。配線に不安がある方は声をかけてください。
- 図 2-1
実体配線図は以下のようになっています
- 図 2-2
2.1.3 USBシリアル変換との接続
USBシリアル変換と秋月RN4020との接続は以下のようのように接続して下さい。ピン名は基板に印字しているため参考にして下さい。
USBシリアル変換 | 秋月RN4020 |
---|---|
5V | 5V |
GND | GND |
Tx | Rx |
Rx | Tx |
図2-1の写真を確認して下さい。以上で回路の組み立ては完了です。
2.2 RN4020の初期設定
続いて、RN4020の初期設定を行って行きます。ここでは、RN4020とPCを接続し、デバイスの名前を変更します。
2.2.1 RN4020とPCの接続
まずはじめにRN4020とPCを接続しましょう。2.1で作成したボードとPCをマイクロUSBケーブルで接続して、ターミナルからログインします。screenコマンドの場合は以下のコマンドになります。
$screen /dev/tty.usebxxxxxxx 115200
TeraTermなどターミナルソフトを利用する場合はCOMポート接続を選択して、以下の設定を参考にして下さい。
項目 | 値 |
---|---|
ボーレート | 115200 |
データビット | 8bit |
パリティ | なし |
ストップビット | 1bit |
フロー制御 | なし |
改行文字 | CR |
注意
PCと接続する場合PC側にUSBシリアルドライバがインストールされている必要があります。
USBシリアルドライバはチップメーカ毎に違います。今回はFTDI社のドライバをインストールします。
2.2.2 RN4020の設定を行う。
続いて、RN4020の初期設定を行います。まずはターミナルに入力したコマンドが表示されるようにEcho機能をONにします。ターミナルにログインしたら以下のコマンドを入力しEnterキーを押下して下さい。
+
そうすると以下のような返答があります。これでEchoがONになりキーボードから入力した文字列が表示されるようになります。(RN4020から入力文字がEchoバックされます。)
- Echo on
注意
本ドキュメントではシリアル通信からのデバイスの応答を区別する為、先頭に「-」を付与しています。
実際には「-」はつかずに出力されます。
次にD
コマンドを使い設定を確認します。
D
- BTA=001EC04633AB
- Name=RN33AB
- Connected=no
- Bonded=no
- Server Service=A0000000
- Features=00000000
- TxPower=4
他の参加者との混同を避ける為、Nameを変更します。以下のコマンドを実行して、任意のデバイス名を設定してください。
SN, [任意のデバイス名]
- AOK
参考
デバイス名は20文字以下の英数字で設定してください。
最後にデバイスを再起動して、設定を反映します。CMDが表示されたら完了です。
R,1
-Reboot
-CMD
再びDコマンドで設定が正しく変更されていることを確認してください。以上で初期設定は完了です。
2.3 I/Oの確認
RN4020のI/OポートはアナログI/O(AIO)とデジタルI/O(PIO)の2種類のポートがあります。それぞれシリアルインタフェースから制御するためのコマンドが用意されており、RN4020にスイッチやLED、アナログ出力のセンサを取り付けて値を読み出すことが可能です。今回のハンズオンではデジタルI/Oの入出力を利用します。
参考
I/Oポートは外部からの入力信号を受け取ったり、外部へ信号を出力する機能をもったインターフェースです。
RN4020ではデジタルI/OポートとアナログI/Oポートがあります。デジタルI/Oポートは入出力の信号を1(3.3V)または0(0V)として取り扱います。入力信号の場合は1.8V以上の値を1として、それ以外を2として取り扱います。
アナログI/Oポートでは外部らかの入力信号の電圧値をデジタル値に読み替え(AD変換と言います)連続した値として扱います。
2.3.1 デジタルI/Oについて
デジタルI/OはPIO1,PIO2,PIO3,PIO7の4ポートあります。欠番になっているピンも存在しているのですが、基本的にシリアルのフロー制御など他の用途に使われているため使用しません。もちろんI/Oとしても利用することは可能だと思いますが、ユーザガイド上に方法が記載されていません。
ピンアサイン
モジュール自体のピンアサインはユーザガイドをみてください。ここでは秋月電子通商のブレークアウトボードでのピンアサインを紹介します。以下図の通りのピンアサインになっています。紹介したPIO7は今回利用するボードでは利用できません。従ってデジタルI/OはPIO1からPIO3までの3ピンのみ利用可能です。またPIO1はボード上のLED制御ピンと兼用になっています。
2.3.2 デジタルI/Oの制御
シリアルコマンドでデジタルI/Oを制御する方法を説明します。パターンさえ覚えてしまえが簡単に利用できます。
デジタルアウトプットコマンド
デジタルアウトプットのコマンドは|Oです。以下のように使います。
|O,07,05
最初の引数はピン番号の制御ですが、16進数で指定しています。ここではPIO1,PIO2,PIO3を指定しています。2つ目の引数は出力指定です。こちらも16進数指定でPIO1,PIO3をHighに指定し、PIO2をLowに指定しています。ブレークアウトボードの場合、ボード上のLEDが消灯するはずです。(Highで消灯、Lowで点灯)各PINとレジスタの関係は以下の表のようになっています。複数指定する場合は足し算してください。
ピン番号 | レジスタ値 |
---|---|
PIO1 | 0x01 |
PIO2 | 0x02 |
PIO3 | 0x04 |
PIO7 | 0x08 |
デジタルインプット
デジタルインプットは同様に上記のレジスタの表に従って以下のように指定します。
|I,01,
-01
これはPIO0の値を読み取り結果が同じくレジスタの形式で帰ってきます。(-はRN4020からの応答を表す)PIO1の値が1になっています。(LEDからの入力電圧があるため)
2.3.3 アナログI/Oについて(補足)
今回のハンズオンでは扱いませんが、アナログI/Oの制御方法について触れておきます。 RN4020のアナログI/0はAIO0からAIO2までの3ポートあります。入出力電圧のレンジは0Vから1.3Vと低電圧となっています。1mV単位の指定ができ値のレンジは(0x0000〜0x0514)となります。
2.3.4 アナログI/Oの制御
アウトプットコマンド
アナログアウトプットのコマンドは@Oです。以下のように使います。
@O,2,0014
最初の引数がポート番号を指し、今回はAIO2を指定しています。さらに0014は出力値を16進数で表しています。20mVがAIO2に出力されるはずです。他のピンについても同様に指定できます。
インプットコマンド
アナログインプットは@Iです。以下のように使います。
@I,2
- 0000
最初の引数はアウトプットと同じくポートを表しています。結果としてAIO2のポートの電圧値(ここでは0)が結果として帰ってきます。
2.4 サービスとキャラクタリスティックの設定
ここではRN4020にサービスとキャラクタリスティックを設定して行きます。本デバイスでは鍵の開閉センサとブザーがあります。セキュリティサービスとそのキャラクタリスティックとして開閉キャラクタリスティックとアラートキャラクタリスティックを作成します。 以下のコマンドで設定しましょう。
PZ
-AOK
PS,123456789012345678901234567890FF
-AOK
PC,12345678901234567890123456789011,12,01
-AOK
PC,12345678901234567890123456789022,04,01
PZ
を使い一度サービスとキャラクタリスティックを初期化します。次にPS
コマンドでサービスを設定します。またPC
コマンドでキャラクタリスティックを設定します。PC
コマンドでキャラクタリスティックの設定をしますが、キャラクタリスティックに許可する操作(Read, Write, Notifyなど)を2つ目の引数で設定することができます。ユーザマニュアルを読むと細かく設定できるようです。よく使いそうな値は以下の表の通りかと思います。
設定名 | 値 |
---|---|
Notify | 0x10 |
Write(応答あり) | 0x08 |
Write(応答なし) | 0x04 |
Read | 0x02 |
次にプライベートなサービスキャラクタリスティックが利用できるようにデバイスの設定を変更します。以下のコマンドでデバイスのサービス設定を変更してください。
SS,00000001
-AOK
その後設定を反映するために再起動します。
R,1
-Reboot
-CMD
再起動後、以下のコマンドで設定が反映されていることを確認します。
LS
-123456789012345678901234567890FF
- 12345678901234567890123456789011,000B,02,01
- 12345678901234567890123456789011,000C,10,02
- 12345678901234567890123456789022,000E,04,01
-END
LSコマンドを実行することで、現在設定されているサービスとキャラクタリスティックのが一覧として表示されます。この時、キャラクタリスティックUUIDの次に表示されているハンドル名を記録しておきます。ここでは000Bと000Eです。000CはNotifyケーションにタイルすハンドルですが今回は使用しません。スクリプトから制御する場合はReadと同じ000Bを利用します。
以上で必要な設定が完了しました。
2.5 スクリプトの実装
続いてRN4020のスクリプトを作成して行きます。RN4020はこれまで実行してきたコマンドを利用して、マイコンなど他のMCUから制御して利用します。これをコマンドモードと呼びます。しかし、スクリプトを作成することでRN4020をスタンドアロンで利用することができます。これをスクリプトモードと呼びます。今回のハンズオンではこのスクリプトモードを利用してデバイスの制御を行います。
2.5.1 スクリプトの仕様
2.5.2 スクリプト入力モードへの切り替え
スクリプトを作成するためにはRN4020をスクリプト入力モードにする必要があります。スクリプト入力モードに切り替え後、他のコマンドと同じようにシリアルターミナルからスクリプトの入力を行なって行きます。以下のコマンドで切り替えを行います。
WC
-AOK
WW
-AOK
WC
コマンドでスクリプトをクリアし、その後WW
でスクリプト入力モードにします。
2.5.3 スクリプトの入力
次に以下のスクリプトを一行ずつ入力して行きます。スクリプトの全体は以下のようになっています。//
以降はコメントとなるため、入力しないでください。
@PW_ON // 電源投入時にこのブロックが実行される。
|O,04,00 //PIO3に0を出力(ブザーをクリア)
|O,04,%000E //PIO3とキャラクタリスティックの紐付け(末尾22)
A //アドバアタイズの開始
@CONN//セントラルから接続時にこのイベントを実行する。
SM,1,000F4240//タイマー1をセットして1000000usec(1sec)を設定
@TMR1//1秒後にタイマー1のイベントが発生する。
$VAR1 = |I,02//PIO2の入力値を変数$VAR1に代入
SHW,000B,$VAR1//$VAR1の値をキャラクタリスティックに設定(末尾11)
SM,1,000F4240//再びタイマー1を1secに設定
@DISCON//セントラルからの切断時に実行
A//アドバタイズの開始
キーボードのESCキーを入力して、スクリプト入力モードから抜けます。
2.5.4 スクリプトの実行
サービスの設定をスクリプト実行モードに切り替えて再起動をすることでスクリプトが実行されます。以下のコマンドを入力してください。
SR,01000000
R,1
スクリプトの実行状態を抜けるには以下の様にコマンドを実行します。
SR,00000000
R,1
また工場出荷時状態に戻すには以下のコマンドを実行します。
SF,1
R,1
再起動後、BLEデバイスがアドバタイズを開始します。LightblueなどのBLE用ツールアプリで動作を確認してみましょう。BLEデバイスに接続後、基板上のLEDが消灯します。次にキャラクタリスティックを見てみましょう。末尾11のキャラクタリスティックではReadとNotifyが可能になっているはずです。ホール素子に磁石を近づけてReadまたはNotifyにしてみましょう。値が変わるはずです。次に、末尾22のキャラクタリスティックに0x04の値を指定します。ブザーがなりはじめます。0x00を書き込むとブザーが停止します。それぞれ期待した動作にならない場合はこれまでの設定や回路を見直してみましょう。
これでBLEデバイスが完成しました。続いてWEB Bluetooth APIを使ったWEBブラウザアプリケーションを作成して行きます。