今回ご依頼を頂いて
BL652という超省電力のBLEモジュールを使用し、
システム開発を行ったのでその方法を記録!
システム構想
今回は決まった間隔でBLEアドバタイズを送信するシステムを構築します。
具体的には1分間隔で10秒間BLEアドバタイズを出力するものとします。
送信するデータは、供給電圧とします。
購入品
1、 BL652ブレークアウトボードキット
https://akizukidenshi.com/catalog/g/gK-15567/
2、FT-232RQ USBシリアル変換モジュール
https://akizukidenshi.com/catalog/g/gM-11007/
※BL652のプログラム書き込み用に使用します。
開発環境構築
BL652ではSmartBASICという言語を使用します。
この言語はVBと似た言語で、ソースはメモ帳で作成しても構いません。
しかし、BL652に書き込む際は、「UwTerminalX」というソフトが必要です。
https://github.com/LairdCP/UwTerminalX/releases
現時点(23/5/7)ではV1.13aが最新のようです。「UwTerminalXa_Windows.zip」をダウンロードして
解凍してください。
プログラム
//*******************************************************************************************************************************
//
// 共通変数
//
DIM rc // 関数の戻り値用
DIM advRpt$ : advRpt$ =""
DIM deviceName$ : deviceName$ = "KUROGARA" // デバイス名
//*******************************************************************************************************************************
//*******************************************************************************************************************************
// アドバタイズタイムアウトのイベントハンドラ
FUNCTION HndlrBlrAdvTimOut()
PRINT "\nAdvert stopped via timeout!"
ENDFUNC 1
//*******************************************************************************************************************************
//*******************************************************************************************************************************
// データを成形して送信する
// 企業コードと電源電圧のデータ成形
SUB SendBleAdvert()
IF BleAdvertStop()==0 THEN //アドバタイズを終了
ENDIF
// 初期化
DIM nFlagsAD: nFlagsAD = 0 // 0=Flags=0x04(LE Limited Discoverable Mode + BR/EDR Not Supported)
DIM nAdvAppearance : nAdvAppearance = 0 // Appearance: 0=省略, 1=表示
DIM nMaxDevName : nMaxDevName = 10 // デバイスの表示バイト数
IF BleAdvRptInit(advRpt$, nFlagsAD, nAdvAppearance, nMaxDevName) == 0 THEN
PRINT "Advert report initialised\n"
ENDIF
DIM nTag : nTag = 0xFF // データ格納先を「Manufacture Specific Data」に設定
//電池残量(Vdd電圧)取得
DIM mv
DIM batlel$
mv=ReadPwrSupplyMv()
print "\n\nSupply voltage is ";mv;"mV\n"
SPRINT #batlel$,mv
DIM Tmp$ : Tmp$ = batlel$ // 送信データ成形
DIM stData$ : stData$="\50\50"+Tmp$ // 企業コードと足し込む
// 送信データのセット
IF BleAdvRptAppendAD(advRpt$, nTag, stData$) == 0 THEN
PRINT "AD with data '";stData$;"' was appended to the advert report\n"
ENDIF
DIM scnRpt$ : scnRpt$ =""
// 確定させる
PRINT BleAdvRptsCommit(advRpt$, scnRpt$)
PRINT "\nadvRpt="; advRpt$; "\n"
// アドバタイズ開始
DIM nAdvType: nAdvType = 3 // 3=ADV_NONCONN_IND=アクティブスキャン拒否, 接続拒否
DIM addr$ : addr$ ="" // nAdvTypeが1の時のみ使用 それ以外は空白
DIM nAdvInterval: nAdvInterval = 1000 // アドバタイズ周期: 1000msec 1sec
DIM nAdvTimeout: nAdvTimeout = 10000 // アドバタイズタイムアウト: 10sec
DIM nFilterPolicy: nFilterPolicy = 0 // 0=ホワイトリスト無効
IF BleAdvertStart(nAdvType, addr$, nAdvInterval, nAdvTimeout, nFilterPolicy) == 0 THEN
PRINT "Adverts Started\n"
PRINT "If you search for bluetooth devices on your device, you should see '"; deviceName$; "'\n"
ELSE
PRINT "\nAdvertisement not successful\n"
ENDIF
ENDSUB
//*******************************************************************************************************************************
// 指定時間後にアドバタイズを送信する
FUNCTION HandlerTimer1()
SendBleAdvert() //送信フラグ
ENDFUNC 1
//*******************************************************************************************************************************
//*******************************************************************************************************************************
// メイン
//*******************************************************************************************************************************
// ここから処理開始
//*******************************************************************************************************************************
// GAP serviceの初期設定
DIM nameWritable, nAppearance, nMinConnInterval, nMaxConnInterval, nSupervisionTimeout, nSlaveLatency
nameWritable = 0 // nameWritable 非ゼロの場合、相手機器に機器名の書き込みが許可されます。
nAppearance = 512 // デバイスの種類(512: 一般タグ)
nMinConnInterval = 500000 // min_conn_interval マイクロ秒 設定:500ms
nMaxConnInterval = 1000000 // max_conn_interval マイクロ秒 設定:1s
nSupervisionTimeout = 4000000 // supervision timeout マイクロ秒 設定:4s
nSlaveLatency = 0 // slave latency
rc = BleGapSvcInit(deviceName$, nameWritable, nAppearance, nMinConnInterval, nMaxConnInterval, nSupervisionTimeout, nSlaveLatency)
PRINT "--- New DevName : "; BleGetDeviceName$(); "\n"
SendBleAdvert() //送信フラグ
// イベントとイベント処理ルーチンの紐づけ
// ONEVENT イベント名 CALL イベントルーチン名
ONEVENT EVBLE_ADV_TIMEOUT CALL HndlrBlrAdvTimOut // アドバタイズタイムアウト
ONEVENT EVTMR1 CALL HandlerTimer1 // タイマーイベント設定 今回は使用しない
//start a 60000 millisecond (60 second) recurring timer
TimerStart(1,60000,1)
// イベント待ち
WAITEVENT
動作確認
まずは以下の通りに「BL652ブレークアウトボード」と「FT-232RQ」を接続します。
※USB変換モジュールのDIPスイッチはNO1、2どちらもOFFにしてください。
接続した「FT-232RQ」のポート番号を選択して、「OK」をクリック
「XComplie + Load + Run」を選択し、プログラム「test.sb」をインストールする。
今回はスマホ(Android)で受信テストをしてみる。
アプリ「LightBlue」を使用した。
きちんと企業コードは「5050」となっており、
電圧も「(16進数)33333031」(10進数では「3301mV」)と表示された。
最後に
BL652は、非常に省電力でスタンバイ時でも「2uA」。スリープなら「0.4uA」とかなりの
低消費モジュールだ!
私も今回はコイン電池1個で運用するシステムを構築した。
サイズも小さいので小型のシステムも容易にできるだろう。