masato-ka's diary

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

BLEモジュールRN4020をスクリプトから制御する。

この記事について

 この記事では前回に引き続き、RN4020を制御する方法について記載しています。前回まではシリアル通信から制御をおこなっていました。しかし、今回はRN4020のスクリプト機能を使って、スタンドアローンで制御する方法を紹介します。RN4020については以下の記事を参照してください。

masato-ka.hatenablog.com

下記写真のようにスマフォのアプリからBLE経由でLEDの制御が可能です。作業時間10分程度でここまでのことが実現できます。

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

RN4020のスクリプト制御

 RN4020ではシリアル制御のコマンドをRN4020上に記憶させることで外部からの制御なしにスタンドアローンで動作させることが可能となります。スクリプトの制御では予め設定されたイベント(電源ONやBLEの接続イベント、タイマーイベントなど)ごとに処理を記載してBLEデバイスとしての振る舞いを設定します。また、I/Oポートの値をキャラクタリスティックに紐づけることができます。

RN4020の初期設定

 まずはじめにRN4020をスクリプト制御する前BLEの動作モードやプライベートサービスの設定を行います。設定については前回の記事で紹介していますので参考にしてください。今回はキャラクタリスティックを1つ設定し、書き込みモードとしました。

+
- Echo On
SF,1 
-AOK
SS,00000001 
-AOK
SR,00000000 
-AOK
PZ 
-AOK
PS,123456789012345678901234567890FF
-AOK
PC,12345678901234567890123456789011,04,01
-AOK
R,1
-Reboot
-CMD

スクリプトの書き込み準備

スクリプトの書き込みを行うためには以下のコマンドを入力します。

WC //スクリプトの初期化を行う。
-AOK
WW // スクリプト書き込みモードにする。
-AOK

これで、シリアルコンソールからスクリプトを書き込む準備ができました。

スクリプトの作成

 今回は上記で設定したキャラクタリスティックに値を書き込むとLEDが光るようなサービスを指定します。以下のスクリプトを1行ずつ入力してください。

@PW_ON//(1)
|0,01,%000A//(2)
A

@CONN//(3)
SM,1,00500000//(4)

@TMR1//(5)
SM,1,00500000//(6)

@DISCON//(7)
A

上記スクリプトの入力が完了したら<ESC>キーを押してください。スクリプト入力モードから抜け出せます。

スクリプトの動作について説明します。

  • (1) 電源が入った場合に呼ばれるイベントで初期化の処理を記載します。ここではAコマンドでアドバタイズを実行しています。
  • (2) PIO1に000A のハンドラを持ったキャラクタリスティックを関連づけています。これによりキャラクタリスティックに書き込みに従ってPIO1を制御できます。
  • (3) セントラルから接続された場合に呼ばれるイベントです。
  • (4) SMコマンドでタイマーをセットしています。タイマー1を5秒ごに実行するように設定しています。
  • (5) タイマー1のイベントが発生した場合に呼び出されます。
  • (6) 再びタイマーをセットし、タイマー1イベントが繰り返し呼ばれるようにします。今回はタイマーループはからの処理ですので飛ばしても構いません。
  • (7) 切断後再度接続ができるようにアドバタイズを再開する。

上ではキャラクタリスティックに値を書き込むことでデバイスの制御をしていますが、もちろん、I/Oの値をキャラクタリスティックにわたしデータを外部に送信することも可能になっています。

例えば@TMR1イベント中で以下のように記載することでAIO0の値をキャラクタリスティックに書き込めます。 これはノティフィケーションの通知のような場合にできる記載方法です。

$VAR1 = @I,0
SHW,000B,$VAR1

また初期化時に以下のように記載すると000Eのハンドラを持つキャラクタリスティックをReadした場合にAIO2の値を読み出すことができます。

%000E = @I,2
  • スクリプトで利用できるイベントは以下のようになっています。
イベント ベントラベル
電源 ON @PW_ON
Timer1 タイムアウト @TMR1
Timer2 タイムアウト @TMR2
Timer3 タイムアウト @TMR3
接続完了 @CONN
切断完了 @DISCON
PIO4( ピン 13) の入力が Low へ変化 @PIOL
PIO4( ピン 13) の入力が High へ変化 @PIOH
高優先度アラート @ALERTH
低優先度アラート @ALERTL
アラート OFF @ALERTO

スクリプトの実行

スクリプトを実行する場合は以下のようにRN4020の動作モードをスクリプトモードにしてから再起動します。

SR,01000000 //ペリフェラルかつスクリプト実行モードにする。
R,1 

スクリプトの消去について

スクリプトモードにして再起動すると他の操作を受け付けません。再起動コマンドと初期化コマンドは受け付けるようになっているためもしスクリプトを消去したい場合は以下のコマンドを実行して初期化してください。

SF,1
R,1

2017/09/28追記:深夜の勢いで上のように書きましたが普通に上で紹介してるWCコマンド使えば消去できると思います。

実行の様子

実際に上記の動作の様子を動画にしました。撮影が下手なので分かりづらいですが、スマートフォン側からRN4020に接続し、設定したキャラクタリスティックの値を変更することでLEDが点灯または消灯する様子がわかると思います。00を書き込んだタイミングでLEDが点灯し、それ以外の値を書き込んだタイミングでLEDが消灯します。


RN4020のスクリプト動作

まとめ

 前回まではシリアルから制御していたため、必ずホストとなるコンピュータが必要になりました。しかしスクリプトを利用することでRN4020単体でもデバイスの動作を実現できることがわかりました。制御文などが十分ではないため動作としてはあまりリッチな動きができそうにありませんが、非常に単純な機能であれば使いどころはありそうです。