はじめてのBluetooth Mesh [Mesh 評価キット Level モデル編]
ビル/工場の管理やスマートホームなどに Bluetooth® Low Energy (以下、BLE) を使うことをご検討されているお客様、インフィニオン テクノロジーズ社の製品をご検討いただくお客様を対象として、Bluetooth Meshテクノロジーの評価キットについてご説明します。
今回は、 CYBT-423028-EVAL評価ボードを使用して、Levelモデルを構築する手順を説明します。
Levelモデルのデバイスアプリケーション
Bluetooth Meshのデバイスの開発や評価を行うために、デバイスのサンプルアプリケーションが、インフィニオン テクノロジーズ社から提供されています。サンプルアプリケーションは、meshモデル仕様書に規定されているモデルのうち、いくつかのモデルが準備されています。
- モデル例
mesh_level_server
mesh_onoff_server
mesh_light_server
mesh_sensor_serve
今回は、Levelモデル(level server)のアプリケーション作成方法を説明します。開発ツールおよびデバイスは、以下を使用します。
- 開発ツール:WICED Studio 6.2.1
- デバイス:CYBT-423028-EVAL (CYW20719の評価ボード)
今回作成するアプリケーションは、 UARTにてセンサデータを受け取り、それをLevel情報(status)として、Windows PCに通知するアプリケーションとなります。
- 接続構成
評価ボードは、Arduino headersを持ち、センサなどの外部デバイスとの接続に適しているボードを使用します。
また、Level用センサは、下記のようにMCUで温度センサ情報を取得する構成を使用します。
外部デバイス(level用センサ)とのUART通信の仕様を、以下とした場合のサンプルコードをご紹介します。
- インターフェイス仕様
同期方式 調歩同期方式
伝送速度 9600BPS
キャラクタ長 8bit
パリティビット なし
ストップビット 1bit
フロー制御 なし - 電文仕様
各データは、ASCIIコードとして、開始コード(‘S’)+ センサデータ4文字 + 終了コード(CR+LF)の形式とする。
センサデータは、16bitの値を、16進数表記の文字とする。
例) 0x1234のデータの場合、「S1234¥r¥n」となる。
16進数で、A~Fを表現する場合、全て大文字とする。
作成方法
開発ツールのインストール
- サンプルアプリケーションは、デバイス開発ツールの「WICED Studio」に同梱されているため、このツールをインストールする必要があります。
- 開発ツールのサポートプラットフォームに、今回使用する20719の評価ボード(CYBT-423028-EVAL)を追加します。
ビルド
- 開発ツールアプリを起動して、Make Targetビューにて、既存サンプルターゲットの「snip.mesh.mesh_level_server-CYW920719Q40EVB_01 download」を選択します。
- 右クリックのメニューから「New」を選択して、Create Make Target ダイアログを表示します。
- Target nameを「snip.mesh.mesh_level_server-CYBT_423028_EVAL download」に編集して、OKボタンを押下します。
(上記で選択した既存サンプルの環境が継承されます。Target nameの先頭に、’Copy of’の語句が追加されているので、削除するようにしてください。)
- Make Targetビューにて、「snip.mesh.mesh_level_server-CYBT_423028_EVAL download」を選択します。右クリックのメニューから「Build Target」を選択して、ビルドを行います。
ソースコードの修正
- ソースコードは、Project Explorerビューにて、対象ファイルをダブルクリックすることで、表示/編集することができます。
- UART通信の受信処理内容とLevel情報への反映
mesh_level_server.c
ファイルの最後に、以下のコード(関数2つ)を追加します。
#include "stdlib.h"
#include "wiced_hal_puart.h"
#define MY_SENSER_DATALEN (8)
#define RXSTS_WAIT_STX (0)
#define RXSTS_RECEIVE (1)
#define RXSTS_FIND_ETX (2)
uint16_t str4tobin(char *str, int len);
void my_uart_test(void)
{
static uint8_t rcvsts = RXSTS_WAIT_STX;
static uint8_t rcvlen = 0;
static uint8_t senser_data[MY_SENSER_DATALEN];
uint8_t i;
uint8_t readbyte;
uint16_t val;
for(i = 0; i < MY_SENSER_DATALEN; i++){
if(wiced_hal_puart_read(&readbyte) == FALSE){
break;
}
switch(rcvsts){
case RXSTS_WAIT_STX:
if(readbyte == 'S'){
rcvsts = RXSTS_RECEIVE;
rcvlen = 0;
}
break;
case RXSTS_RECEIVE:
if((readbyte == '\r') || (readbyte == '\n')){
rcvsts = RXSTS_FIND_ETX;
senser_data[rcvlen] = '\0';
}else{
senser_data[rcvlen] = readbyte;
rcvlen++;
if(rcvlen > MY_SENSER_DATALEN){
rcvsts = RXSTS_WAIT_STX;
}
}
break;
default:
break;
}
}
if(rcvsts == RXSTS_FIND_ETX){
val = str4tobin(&senser_data[0], rcvlen);
app_state.present_level = val;
rcvsts = RXSTS_WAIT_STX;
WICED_BT_TRACE("--- my_uart_test: val=%04x, rx=%s ---\n", val, senser_data);
}
return;
}
uint16_t str4tobin(char *str, int len)
{
uint8_t i;
uint16_t val;
uint8_t flag;
val = 0;
if(len > 4){
return(val);
}
for(i = 0; i < len; i++){
flag = str[i] & 0x60;
if(flag == 0x40){
// case A-F
val = (val << 4) | ((str[i] & 0x0f) + 9);
}else{
// case 0-9
val = (val << 4) | (str[i] & 0x0f);
}
}
return(val);
}
- UART通信の受信処理の呼出し
mesh_application.c
mesh_app_timer関数の最後に、以下のコード(関数コール)を追加します。
注意点:level用センサからのセンサデータ送信間隔は、1秒以上であることを前提として、このコールタイミングを利用しています。
// App timer event handler
void mesh_app_timer(uint32_t arg)
{
(省略)
#ifdef _DEB_PRINT_MESH_STATS
// dump mesh statistics on every _DEB_PRINT_MESH_STATS
if (!(dev_ctx.app_timer_count % _DEB_PRINT_MESH_STATS))
{
_deb_print_mesh_stats();
}
#endif
// add
WICED_BT_TRACE("--- mesh_app_timer ---\n");
my_uart_test();
}
- UART通信のポート変更
mesh_application.c
mesh_application_start関数にて、以下のポート変更を行います。(デバック用トレースログ出力を、PUARTからHCI_UARTに変更して、PUARTは、Level用センサとの通信向けに初期化する)
void mesh_application_start()
{
#ifndef _DEB_ENABLE_HCI_TRACE
//For the 24 MHz board set the UART type as WICED_ROUTE_DEBUG_TO_PUART
// For BCM920706V2_EVAL board make sure SW5.2 and SW5.4 are ON and all other SW5 are off
#if 0 // change
wiced_set_debug_uart( WICED_ROUTE_DEBUG_TO_PUART );
#else
wiced_set_debug_uart( WICED_ROUTE_DEBUG_TO_HCI_UART );
#endif
#if ( defined(CYW20706A2) || defined(CYW20735B0) || defined(CYW20719B0) || defined(CYW43012C0) )
wiced_hal_puart_select_uart_pads( WICED_PUART_RXD, WICED_PUART_TXD, 0, 0);
#endif
#ifndef CYW20706A2
#if 0 // change
wiced_hal_puart_set_baudrate(921600);
#else
wiced_hal_puart_init();
wiced_hal_puart_set_baudrate(9600);
#endif
動作確認
評価ボードのSW設定
- Level用センサを接続する「PUART」ポートは、DIPSWにより、HOST(USB経由)/Arduinoコネクタの切替えができます。SW5を以下の設定にします。
SW5-1:ON (CTS is HOST)
SW5-2:ON (RTS is HOST)
SW5-3:OFF (RXD is Arduino)
SW5-4:OFF (TXD is Arduino)
Levelセンサとの接続信号
- Level用センサと、以下の信号(3本)を接続します。
センサの送信データ(TXD)を、評価ボードのArduinoコネクタ J7-8 (P4_PUART_RX)
センサの受信データ(RXD)を、評価ボードのArduinoコネクタ J7-7 (P33_PUART_TX)
センサのGNDを、評価ボードのArduinoコネクタ J4-4 (GND)
評価ボードへのアプリケーション書き込み
- 評価ボードを付属のUSBケーブルを使用して、PCに接続します。
- アプリケーションのビルドを行うと、自動的にアプリケーションの書き込みまで実施されます。(デバイスを自動検出して)
Windows PCからの制御確認
- 評価ボードに接続したLevel用センサを、電源ONして起動させます。
- Windows PC側のセットアップについては、Mesh 評価キット Windows アプリケーション編を参照して、ヘルパーアプリケーション「MeshClient」を使ってデバイスと接続します。
- 接続後、MeshClientにて、「Level get」を行うと、センサデータの値が、traceログに表示されます。
担当エンジニアからの一言
今回は、評価ボードを使って、Levelモデルのデバイス構築を説明しました。
次回は、Meshデバイスを制御する、Windowsアプリケーションを説明します。
その他すべての名称は、それぞれの所有者に帰属します。