masato-ka's diary

日々思ったこととか、やったことの備忘録。

1000円から始めるBLEデバイス開発、RN4020をPCから制御して使ってみる。

この記事について

 この記事では1000円代で購入出来るBLEモジュールRN4020の使い方を検証してみました。まずはシリアル通信で制御しペリフェラルとして動作させます。さらにセントラルと値をやり取りする方法についても紹介しています。

RN4020とは

RN4020はMicrochip社が製造しているBLEモジュールです。価格は1000円程度で、秋月電子通商などで購入できます。

f:id:masato-ka:20170925200254j:plain

akizukidenshi.com

また、使いやすくしたブレークアウトボード版も販売されています。(製造も秋月電子通商)今回はこちらのブレークアウトボードを利用しています。

akizukidenshi.com

RN4020はUARTインタフェースが搭載されており、シリアル通信からコマンドを入力することで、簡単にBLEデバイス(ペリフェラル動作)を実現することができます。Arduinoなどのマイコンボードなどに接続しBLEデバイスを作成することができます。また、セントラルとしても動作させることができるため、汎用的なBLEの通信モジュールとして利用することが可能です。さらにUARTインタフェースだけでなく、アナログI/O, デジタルI/Oを兼ね備えており、LEDやセンサを接続して利用することも可能です。  RN4020は専用のスクリプトを書き込むことで、BLEとI/Oを制御し、RN4020のみでBLEデバイスを構成することができます。詳細な仕様については以下のMicrosoftのデータシートを参考にしてください。また、シリアルコマンドはスクリプトのリファレンスはユーザガイドに記載されています。

  • データシート

http://ww1.microchip.com/downloads/jp/DeviceDoc/50002279A_JP.pdf

  • ユーザガイド

http://akizukidenshi.com/download/ds/microchip/70005191A_JP.pdf

RN4020をシリアル通信で制御する

 まずはじめにRN4020をUARTで制御します。今回はUSBシリアル変換を使い、PC上から制御します。マイコンなどを接続する場合も基本的に同じコマンドとなります。

接続回路

 RN4020ですが、前述のブレークアウトボードを利用する場合、シルクパターンに従って、GND, +5V, RX, TXを接続するのみです。ブレークアウトボードの場合電源が+5Vである点に注意してください。今回はUSBシリアル変換は秋月電子通商から発売されている以下のモジュールを利用しました。

akizukidenshi.com

実は上記ブレークアウトボードとこのUSBシリアル変換機のピンアサインが向かい合わせでぴったりとはまるようになっています。写真のように向かい合わせでブレットボード上に刺すとGND、電源、がお互い接続され、RXとTXはクロスに接続されるようになっています。

f:id:masato-ka:20170925200517j:plain

ですが、実際の配線は製造ロットによって変わる場合もあるので、予め確認して接続するようにしてください。接続はそれぞれのモジュールが以下の表のように対応していれば大丈夫です。お互いのRXとTXをクロスに接続することろがポイントです。

USBシリアル変換 RN4020
GND GND
+5V +5V
RX TX
TX RX

PCでの接続

 回路の接続ができたら、USBシリアル変換機とPCをUSBケーブルで接続します。WindowsであればTeraTermなどのターミナルソフトから以下のパラメータでシリアル接続します。

項目
ボーレート 115200
データビット 8bit
パリティ なし
ストップビット 1bit
フロー制御 なし
改行文字 CR

OSXの場合は以下のコマンドで接続します。

$screen /dev/tty.usbserial-A1032M5W 115200 

/dev/tty.usbserial-A1032M5Wは接続するUSBシリアル変換機ごとに変わるので予め/dev/フォルダ以下を見てそれっぽいものを確認します。

ペリフェラルとしてBLEのHeartRateサービスをアドバタイズしてみる。

ターミナルの接続が完了したら以下のようにコマンドを1行ずつ実行します。RN4020がHeartRateサービスを持ったペリフェラルとしてアドバタイズを開始するはずです。 先頭に「-」が付いている行はRN4020からの応答行です。実際には「-」は表示されていません。

+//(1)
- Echo On
SF,1//(2)
- AOK
SS,A0000000//(3)
- AOK
SR,00000000//(4)
- AOK
R,1//(5)
- Reboot
- CMD
A//(6)
  • (1) EchoをOnにしてターミナルに入力した値がエコーバックで表示されるようにする。
  • (2) デバイスの初期化を行う(デバイスの基本情報はそのまま)
  • (3) HeartRateとDeviceInformationのサービスを設定
  • (4) デバイスモードをペリフェラルに設定
  • (5) ハードウェアを再起動して設定を再読み込み
  • (6) アドバタイズ開始

 実際にBLEデバイスをLightblueなどのBLEデバイスのユーティリティアプリで見るとRN4020が見えるようになっています。  引き続き、RN4020がどういう状態になっているのか詳細を見てみましょう。まずはシリアルコンソールからLSコマンドを入力して、現在設定されているサービスとキャラクタリスクを確認してみます。そうすると以下のように返答が帰ってきます。

LS
180A
         2A25,000B,V
         2A27,000D,V
         2A26,000F,V
         2A28,0011,V
         2A29,0013,V
         2A24,0015,V
180D
         2A37,0018,V
         2A37,0019,C
         2A38,001B,V
         2A39,001D,V
END

 先頭の180Aは承認サービスとして予め定義されているDeviceInformation (180A)です。そこから一段下がってDeviceInformationのキャラクタリスティックが表示されています。また180DはHeartRateサービスとなっています。このようにSSコマンドを利用することで、承認サービスを簡単に設定することができます。

 続いてDコマンドを入力し、デバイスの詳細情報を出力します。

D
- BTA=001EC04633AB
- Name=RN33AB
- Connected=no
- Bonded=no
- Server Service=A0000000
- Features=00000000
- TxPower=4

これらの情報も別のコマンドから書き換えることができ、デバイス名やBLEとしての役割の変更(セントラル、ペリフェラルなど)を変更することが可能です。詳細はユーザマニュアルを確認してください。

キャラクタリスティクへの値の書き込み

キャラクタリスティックに値を書き込んで、接続しているセントラルにデータを送信します。今回はセントラル側としてOSX上でLightblueを使います。まず今の状態のまま、LightblueからRN4020にアクセスすると、先ほどLSコマンドで見た通りのサービスとキャラクタリスティックを確認できます。キャラクタリスティックの値はまた表示されていません。

f:id:masato-ka:20170925205434p:plain

以下のコマンドでキャラクタリスティックに値を書き込みます。2A37は心拍数の値を返すコマンドのようです。予め、Lightblue上でサブスクライブしておきます。

SUW,2A37,50

上記のコマンドはキャラクタリスティック2A37に対して0x50(80)を設定する値となります。 またはハンドラに対する書き込みだと以下のようになり結果は同じになります。

SHW,0018,50

Lightblueを見ると値が書き込まれているのがわかります。このようにキャラクタリスティックに値を書き込むとサブスクライブしているセントラルに値を通知し、またReadが許可されている場合はReadしたセントラルに値を送信します。

f:id:masato-ka:20170925205443p:plain

キャラクタリスティクからの値の読み取り

続いて、セントラルから書き込まれた値を読み出してみます。同じくHeartRateサービスの2A39が書き込み可能なキャラクタリスティックになっています。lightblueから値を書き込むと以下のようにコンソールに表示されます。

-WV,001D,50.

これは001Dのハンドラ(UUIDじゃないことに注意)に0x50が書き込まれたという表示です。

ユーザ定義のBLEサービスとキャラクタリスティックを設定する。

RN4020はDeviceInforamtionやHeartRateサービスのように承認済みサービスだけでなく、ユーザが独自に定義したサービスとキャラクタリスティックを設定することができます。以下のコマンドを実行することでユーザ定義のサービスとキャラクタリスティックを設定できます。

+
- Echo On
SF,1
- AOK
SS,00000001
- AOK
PZ //(1)
- AOK
PS,11223344556677889900AABBCCDDEEFF //(2)
- AOK
PC,010203040506070809000A0B0C0D0E0F,02,05//(3)
- AOK
R,1
- Reboot
- CMD
  • (1) ユーザ定義のサービスとキャラクタリスティックを削除
  • (2) 指定のUUIDでサービスを設定
  • (3) 指定のUUIDでキャラクタリスィックをRead Only, 5byte長として設定する。

PCコマンドでキャラクタリスティックの設定をしますが、キャラクタリスティックに許可する操作(Read, Write, Notifyなど)を2つ目の引数で設定することができます。ユーザマニュアルを読むと細かく設定できるようです。よく使いそうな値は以下の表の通りかと思います。

設定名
Notify 0x10
Write(応答あり) 0x08
Write(応答なし) 0x04
Read 0x02

例えばReadとNotifyを設定する場合は上記の例だと以下のようになります。

PC,010203040506070809000A0B0C0D0E0F,12,05

キャラクタリスティックの値の読み書きについては先ほどと同じ方法で行えます。

まとめ

 RN4020を利用することで非常に簡単にBLEのペリフェラルバイスを作成できます。Arduinoなどを使って簡単な工作ができればRN4020を接続するだけでBLE機器として利用できそうです。今回はシリアル通信からの制御を中心に紹介しました。RN4020をマイコン代わりに使い、センサやLEDを直接接続して動かすこともできます。また簡単なスクリプトを利用し、他のマイコンなどと接続せずに単独のデバイスとして動かすこともできます。これらの利用方法についてもまとめ次第紹介したいと思います。