BL652というBLEの省電力モジュール使ってみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/209531c2-1f68-4ef3-762f-193ff1569639.png)

今回ご依頼を頂いて
BL652という超省電力のBLEモジュールを使用し、
システム開発を行ったのでその方法を記録！

## システム構想
今回は決まった間隔でBLEアドバタイズを送信するシステムを構築します。
具体的には1分間隔で10秒間BLEアドバタイズを出力するものとします。
送信するデータは、供給電圧とします。

## 購入品
1、	ＢＬ６５２ブレークアウトボードキット
https://akizukidenshi.com/catalog/g/gK-15567/

2、ＦＴ－２３２ＲＱ　ＵＳＢシリアル変換モジュール
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」をダウンロードして
解凍してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/ab13c32d-4bcd-427d-f81c-6a4da45968ef.png)

## プログラム
```vb:test.sb
//*******************************************************************************************************************************
//
// 共通変数
//
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にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/3449d92d-1be3-6ab5-2527-afbae9312dc5.png)

次に「UwTerminalX.exe」を起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/50e7301d-5e74-34ec-e05a-0ac17be683ef.png)

起動後以下の画面が表示されるので「Accept」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/5448212b-9b14-d0a4-1a08-99524e5f03b8.png)

接続した「FT-232RQ」のポート番号を選択して、「OK」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/1614f81a-f31f-0436-76d8-ebaadc8ab575.png)

とりあえず以下の画面が表示されれば成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/4a583b35-324f-1172-3821-3b13aaa14b51.png)

「XComplie + Load + Run」を選択し、プログラム「test.sb」をインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/b31f5739-64d6-7a3a-c896-ce430dcc5e34.png)

今回はスマホ（Android）で受信テストをしてみる。
アプリ「LightBlue」を使用した。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/a4545b51-7797-12e3-d87c-0c0a9e78de42.png)

きちんと企業コードは「5050」となっており、
電圧も「(16進数)33333031」（10進数では「3301mV」）と表示された。


## 最後に
BL652は、非常に省電力でスタンバイ時でも「2uA」。スリープなら「0.4uA」とかなりの
低消費モジュールだ！

私も今回はコイン電池1個で運用するシステムを構築した。
サイズも小さいので小型のシステムも容易にできるだろう。

### BL652での開発依頼お待ちしております！！