BASIC Kit2 + 単品リーフ

BASIC Kit2 が発売になりました。
Kit2 には新しいMCUボードとしてSTM32リーフが含まれています。
今回はKIt2にいくつかのリーフを追加して、Leafonyだけでビーコンを送受信する実験をしてみました。

 

== ご注意 ==

BASIC Kit2に入っているSTM32リーフには、すぐに動かせるプログラムが書き込まれています。書き込みをおこなうと消えてしまいますのでご注意ください。( 後から再度、書き込むこともできます。)

 

[ PR ] 当社ではリーフの単品販売をしています。ぜひ、ご活用ください。

 

STM32 MCUリーフ

 

BASIC Kit2( ケース外観 )
ケースもリニューアルしました

目 次

Leafony だけでビーコンのスケルトンモデルを作る

左側(ペリフェラル)を傾けると、右側(セントラル)のLCDに傾きを表示します。

概 要

 

IoTではビーコンを使用してデータ収集をおこなうことがあります。そのときの送受信の ひな形(スケルトンモデル)として参考になればうれしいです。

 

動 作

 

ペリフェラル側( ケースに入った方 )は加速度センサで傾きを検出します。その傾きをアドバタイザ通信で送信します。

セントラル側( LCDが付いている方 )は

アドバタイザ通信で送られてきた傾きのデータを受信します。そのデータをLCDに表示します。

ペリフェラルを傾けると、その傾きがセントラルのLCDでリアルタイムに表示します。

ペリフェラル側の組み立て

 
 赤い丸の中が加速度センサ
 アドバタイズ(送信)時に青矢印のLEDが点滅

 

AP01 AVR MCU
いわゆるCPU基板

AI01 4-Sensors
センサ

AC02 BLE Sugar
BLE モジュール

AZ01 USB
開発時にPCと接続

AV01 CR2032
コイン型電池ケース

AZ64,65
ケース

コネクタの組立・分解方法
こちらをクリック!
BASIC Kit そのままのリーフ構成なので、Kitの場合はそのままご利用できます。


下記も必要です。

・ネジ M2 2個
・コネクタカバー

・CR2032コイン型電池

セントラル側の組み立て

 

 LCD にペリフェラルの傾きを表示

 ラベルは実験のときにすぐに分かるように。

AP03 STM32 MCU
いわゆるCPU基板

AI04 LCD
キャラクタLCD

AC02 BLE Sugar
BLE モジュール

AZ01 USB
開発時にPCと接続

AV03 AA BAT
単3電池ケース

コネクタの組立・分解方法
こちらをクリック!
リーフ(ボード)間を接続するコネクタの組立方法と分解方法です。

 

下記が必要です。

・ネジ M2 2個
・コネクタカバー

・端3電池

リーフ(ハードウエア)とプログラムの関係

OS(Arduino)を中心に

 

OS(基本ソフトウエア)にArduinoを使っています。OSから上側がソフトウエア、下側がハードウエアです。

 

ソフトウエア

 

アプリケーションはシステムの特徴(機能)を決めているプログラム部分です。

OSとアプリケーションの間には、ハードウエアに対応するプログラム(ドライバ)が入ります。プログラム上ではライブラリという形で追加されます。

 

ハードウエア

 

OSと接する部分はMCUです。
MCUには複数のピンが出ていて、プリント基板内の各回路につながります。

具体的な機能を実現している各ICやセンサには、そのIC等を使いやすくするためのライブラリが作られていることが多いです。ライブラリを使用することにより、アプリケーションが作りやすくなっています。

プログラムを作る前に

プログラムを作る前に、ハードウエアを確認する必要があります。

 

何が必要か

 

組み込みシステムではハードウエアとのやりとりが必要になりますので、どのような機能があるのか、その機能を使うにはどうしたら良いのかを調べます。

 

具体的には下記の通りです。

・使う機能(例:加速度センサ)
・その機能の使い方(I2C通信)
・どのポートに割付られているか

 

ポート番号はMCUにより違う

 

MCUが異なるとプログラム中で記述するポート番号が異なります。
今回はペリフェラル側(アドバタイザ側)がAVR、セントラル側(スキャナ側)がSTM32です。異なるので注意が必要です。MCUを含むリーフを変更した場合は注意しましょう。

 ポートの割り付け表

・1列目 / F1~F29: リーフォニーのコネクタ(バス)の番号

・2列目: コネクタの各ピンの役割(Arduinoで記述するときの共通名称)
・3列目 / AVR: AP01 AVR MCUに搭載しているMCUのポート番号
・4列目 / STM32: AP03 STM32 MCU に搭載しているMCUのポート番号
・5列目 / USB: AZ01 USB で使用しているピンとその役割

・6列目 / BLE: AC02 BLE Sugar で使用しているピンとその役割
・7列目 / Sens.: AI01 4-Sensors で使用しているピンとその役割

ビーコンのしくみ

ちょっとだけ伝える

 

センサのデータなどを伝えるの時に便利です。Bluetoothの中でも省電力で使用できるBLEを使用します。

コイン型電池でも長期間使用できるので、IoTで各種センサのデータを送信するときに適しています。

詳しくは他の情報源で

 

この記事では必要最小限と思われる内容をお伝えしています。詳しく知りたい方や正確性を求める場合は、他のホームページや書籍などもご覧ください。下記は一例です。

開発視点の超簡単BLE入門

ビーコンのしくみ

 

Bluetoothの中でもちょっと特別な使用方法です。下記が特徴です。

・送信しっぱなし
・データは最大31バイト
・送信側が省電力化できる

送信側

 

ペリフェラルと呼びます。本来はセントラル側に「自分はここにいるよ」というアドバタイザ通信にデータを載せます。ビーコンでは接続しません。送りっぱなしです。

受信側

 

セントラルと呼びます。自分の周囲で発信しているアドバタイザ通信すべてを受信します。

その中から必要なものだけ受け取り、内部のデータを使用します。

注意点

 

簡単にデータを送れますが、暗号化していないのでデータは丸見えです。
今回は特に機密性が高くありませんからそのままです。

BLEリーフを使う

BLEモジュールでBLE通信をおこないます。BLEモジュールを操作する場合は、BLEライブラリ(TBGLib)を使用します。BLEモジュールはシリアル通信を使用しします。

 

初期化する

MCUが起動して最初に実行する処理がSetupです。ここでBLEモジュールとBLEオブジェクトの準備をおこないます。

 

MCUによりシリアル通信が異なる

・AVRの場合

デバッグ(プログラム書き込みも)でUSBリーフを使用するためMCUのハードウエア・シリアル通信を使用するため、BLE通信用にはソフトウエア・シリアル通信を使用します。
そのため、ソフトウエア・シリアル通信用のライブラリを使用します。

・STM32の場合

複数のハードウエア・シリアルがあるため、BLE通信用にもハードウエア・シリアル通信を使用します。

コマンド

 

BLEモジュールの設定をおこなったり送信をおこなう場合は、BLEライブラリのコマンドを使用します。

 

コールバック関数

 

BLEモジュールの状態が変わった、受信したなど、BLEモジュール側に何らかの変化があった時は、あらかじめ登録してあるプログラムが呼び出されて実行されます。この呼び出されるプログラムがコールバック関数です。

 

コールバック関数は利用者側で書きます。関数名も自由につけることができます。(関数の引数は、その型や並びは決められています。)

 

初期化(setup)の中でBLEオブジェクトであらかじめ決められた関数名に、利用者が作成したプログラム(コールバック関数)を結びつけます。

BLEアドバタイザ通信の内容( パケットのなかみ )

BLE通信を使う本来の目的は情報(データ)を伝えることです。

ここではそのデータのなかみ(パケット)を知り、それを活用してデータの載せ方を考えます。

 

ここでは必要最低限度の説明です。BLE通信は多様な内容で多彩なアプリケーションに使用することができます。今回はごく一部だけ使用しています。

 

パケットの階層化

 

パケットは通信の規格や処理などにより階層化されています。もちろん、データとしては連続的なものです。

 

BLEパケット

・プリアンブル
通信のタイミング(ビット毎)をはかります。

・アクセスアドレス
アドバタイズ通信では図中の通りです。

PDUペイロード

通信のデータ本体です。

 

アドバタイザデータ

アドバタイザ用のデータです。その内側はさらに3つに分かれています。

AD1:フラグ( 種類 )

AD2:デバイス名
AD3:利用者データ

 

 

アドバタイザデータの中身

 

AD1, AD2, AD3、三つの構造は共通して下記の構成です。

・フィールド長

・ADタイプ

・ADデータ

 

フィールド長は、ADタイプとADデータの長さ(オクテット長)です。

 

AD1

AD1のフラグはこの通信がアドバタイジングであることを示すフラグです。

AD2

アドバタイジング(送信)しているデバイス(本機)のデバイス名です。プログラム46行目で設定します。

 

AD3

セントラル側に伝えたい情報(データ)です。詳細はプログラムの解説でお伝えします。

 

アプリケーションを作る場合は、このAD3の部分を用途にあった内容に設計することになります。

開発環境を準備する

Arduino の開発環境を準備します。

 

AVRの開発環境

 

下記をご参照ください。

 

AVR MCU の Arduino IDE 設定
Arduino IDEでLeafonyにプログラムを書き込む

 

こちらもチェック

STM32の開発環境

 

下記をご参照ください。

 

STM32 MCU の Arduino IDE 設定
Arduino IDEでLeafonyにプログラムを書き込む

 

ライブラリのインストール方法

ターゲット( Leafony )との接続はUSBリーフとPCを接続。書き込み時もそのまま書き込みできます。

 

右はターゲットとの接続設定の内容です。

 

ポートNo.は状況により変わります。

 

クリックして拡大

ターゲット( Leafony )との接続はUSBリーフとPCを接続。

書き込み時はMCU(STM32リーフ)の書き込みスライドスイッチは、書き込み側にします。(赤いLEDが点灯)

書き込み前にリセットスイッチを押してリセットします。書き込み後はそのままプログラムは起動します。

 

右はターゲットとの接続設定の内容です。ポートNo.は状況により変わります。

クリックして拡大

プログラムを作る / ペリフェラル側

機能

 

・加速度センサで傾きを検知
・検知した傾きをBLE通信で送信
・BLE通信はアドバタイザ
 ( 送信しっぱなし )

主な処理

 

・タイマ割り込み

・加速度センサからのデータ取得

・BLEでのアドバタイジング

MCUは AVR

 

・リーフ:AP01 AVR MCU

・MCU:ATmega328P

・電圧 / 周波数:3.3V / 8MHz

・Flash memory:32 KB
・SRAM:2KB

 メモリサイズが小さいので要注意

使用するライブラリ

 

名称 インクルードファイル 取得先 備考
タイマ割り込みライブラリ MsTimer2.h

https://github.com/PaulStoffregen/MsTimer2

 
I2C通信 Wire.h Arduino IDEインストール時に併せて導入 参考 加速度センサ用
ソフトウエアシリアル通信 SoftwareSerial.h Arduino IDEインストール時に併せて導入 参考  
加速度センサライブラリ Adafruit_LIS3DH.h https://github.com/adafruit/Adafruit_LIS3DH/tree/1.1.2 推奨バージョン 1.1.2
Bluetoothライブラリ TBGLib.h https://github.com/Leafony/TBGLib  

プログラム  こちらです。

・ファイル名: avr_advertiser.ino

・文字コードは、UTF-8です。

・コメントは日本語化しています。

※ BLEに関連する部分のみ抜粋

 

BLEに関連する部分のみです。タイマ処理や加速度センサに関する箇所はページ下部に記載しています。

 

BLE関連の初期化

 

準備は下記の通りです。

・ライブラリの読み込み

・デバイス名の定義

・端子の定義

・オブジェクトの生成

 

BLEはオブジェクトを生成

 

BLEモジュールはオブジェクト(プログラム上でモジュールをイメージ化したもの)として扱います。

 

123行でBLEモジュールのオブジェクトを生成しています。送受信はシリアル通信でおこないます。そのシリアル通信もオブジェクトであつかいます。

 

シリアル通信オブジェクトをハードウエアシリアルの型で渡しているところに注意してください。(ソフトウエアシリアルでも型としてはハードウエアシリアルとなります。)


BLEモジュールの初期化

 

ここからプログラム本体(実行するコード)です。


setup() 内で下記をおこないます。

・ポート(端子)の初期設定

・BLEモオブジェクトの初期設定

・アドレスの取得(おまけ)

 

端子の初期化、BLEオブジェクトの初期化はそれぞれ別のルーチンにしてあります。

 

 

BLEオブジェクトの初期設定

 

おこなうことは下記の通りです。

・コールバック関数の登録

・BLE用シリアル通信の開始

・アドバスタイズのパラメータ設定

 

 

コールバック関数の登録

 

アドバタイズ(送信)ではコールバックは使用しません。通信時のLED点滅やアドレス取得時の表示などの付加機能(おまけ)で使用しています。

 

BLEオブジェクトの操作や送信をおこないたい場合は、オブジェクトのコマンドを使用します。

 

BLEオブジェクトの状態が変わったことを知りたい、BLE通信で受信したなどBLE側で起きたことを発端に処理をおこなうために、コールバック関数を使用します。

 

コールバックという名前の通り、オブジェクト側で何か起きると呼ばれる関数です。

 

何がおきた(イベントという)ら、どういう(名前)関数が呼ばれるかはあらかじめ決まっています。

自分が対象としたいイベントに対応する関数名を探します。

 

(例)202行

オブジェクトがビジー状態になったら知らせてくれるコールバック関数が onBysyです。

 

ここに自分で書いた関数を登録します。(正しくは関数のメモリ上での位置になりますので、コールバック関数ポインタの登録です。)

 

関数で受け渡しをおこなう「引数」はあらかじめ決めれていますので、その確認も必要です。

アドバタイザの核心部分

 

おこなうことは下記の通りです。

・送信データの組み立て

・送信データの登録

・アドバスタイズ(送信)

 

送信データの組み立て

 

送信データを8bit( 1オクテット *1 )の配列で宣言して初期値を入れます。

今回はトライアル(実験)なので送信データの初期値を設定するところをわかりやすく表記しています。シンプルに必要なオクテット数分の配列でも問題ありません。

 

*1:オクテット( octet )
8ibit の情報量。むかし1byteの情報量が複数ありました。通信は異なるシステムをつなぐのではっきりと8bitであるオクテットを好まれました。

 

AD1( データの種類 )

この通信はアドバタイジングです。

2バイト目のADタイプはアドバイザパケットを示すBGLIB_GAP_AD_TYPE_FLAGSです。

 

AD2( ローカル名 )

この通信を発信しているデバイス名を示します。

2バイト目のADタイプはローカル名を示すBGLIB_GAP_AD_TYPE_LOCALNAME_COMPLETEです。

 

AD3( データ本体 )

利用者がデータを載せる部分です。

2バイト目のADタイプはデータタイプです。3バイト目以降にどようなデータが入っているかを示します。

0xff( Manufacture Specific )は企業ごとのIDと任意のデータであることを示しています。

企業ごとのIDは、Bluetooth SIGが企業に発行した識別子です。ここでは会社IDを使用しませんので0xffffとしています。これは会社IDが割り当てられる前に内部テストや相互運用テストなどで使用する特別なiDです。もちろん、最終製品に使用できません。

 

データ型の変換

 

加速度センサから取得したデータは float型です。

アドバタイザに載せるデータはint型としましたので、センサデータの有効桁を小数点以下第2位とした場合、100倍にすると整数になります。

 

MCUによりデータの型で使用するバイト数が異なります。そのため、そこを配慮してデータ型を考慮したデータ型の変換が必要となります。

 

具体的な送信方法

 

次の2段階です。

1)パケット(送信データ)を登録

2)送信

いずれもBLEオブジェクトのコマンドを使用します。

 

パケットの登録

構成した送信データ adv_data(ポインタ)とサイズ(ここでは25バイトで固定)が引数です。

 

送信

引数1は、BLEオブジェクトを識別するためのもの(ハンドル)

引数2は、ディスカバリモードです。ここではユーザーが定義した内容であることを示しますので、LE_GAP_USER_DATAです。

引数3 は、接続方式で、ビーコンでは接続しませんので、LE_GAP_SCANNABLE_NON_CONNECTABLE です。

プログラムを作る / セントラル側

機能

 

・ペリフェラルからのデータを受信
・取得したデータをLCD表示

 

主な処理

 

・BLEのスキャニング

・アドバタイジング・パケットからデータを取得

・取得したデータをLCD表示

MCUは STM32

 

・リーフ:AP03 STM32 MCU

・MCU:STM32L452REI6

・電圧 / 周波数:3.3V / 80MHz

・Flash memory:512 KB
・SRAM:160KB

使用するライブラリ

 

名称 インクルードファイル 取得先 備考
I2C通信 Wire.h Arduino IDEインストール時に併せて導入 参考 LCD用
LCDライブラリ ST7032.h https://github.com/tomozh/arduino_ST7032  
Bluetoothライブラリ TBGLib.h https://github.com/Leafony/TBGLib  
プログラム  こちらです。

・ファイル名: stm32_scanner.ino

・文字コードは、UTF-8です。

・コメントは日本語化しています。

※ BLEに関連する部分のみ抜粋

 

BLEに関連する部分のみです。LCD表示に関する箇所はページ下部に記載しています。

 

BLE関連の初期化

準備はペリフェラル側とほぼ同じです。

 

デバイス名の用途

 

ここのデバイス名はペリフェラルからのパケットを選別する目的です。

アプリケーションの場合は別途処理にて対応します。

 

BLEはオブジェクトを生成

 

ペリフェラル側とほぼ同じです。

MCUが異なるので端子(ポート)の定義が異なることに注意が必要です。

STM32は複数のシリアル通信(UART)を持つので、ハードウエアシリアルを使用します。

BLEモジュールの初期化

 

ここからプログラム本体(実行するコード)です。ペリフェラル側ではポートの初期設定、BLEオブジェクトの初期設定を別のルーチンにしてsetup()から呼び出していましたが、こちらではすべてsetup()に記述しています。

 

コールバック関数の登録

 

アドバタイズのスキャン(受信)でコールバックを使用します。受信したときはコールバック関数で処理をおこないます。

 

ここではmy_evt_le_gap_scan_response()に受信時の処理を記述しています。この関数名をBLEオブジェクトのble_evt_le_gap_scan_responseプロパティに結びつけます。

 

ディスカバリモードは 2( le_gap_general_discoverable )で「一般的な検出手順のを使用して検出」を設定しています。

受信状況と受信データ

 

セントラル側の役割はスキャナです。ビーコンではペリフェラルが送信したアドバタイジング・パケットを受信してそこからデータを受け取ることです。

 

いつビーコンが飛び込んでくるのか(=いつ処理するのか)はわかりません。
そのため、受信は受信があったときに呼び出されるコールバック関数で対応します。コールバック関数は下記の通りです。

 

 void my_evt_le_gap_scan_response
      ( const struct ble_msg_le_gap_scan_response_evt_t *msg )

 

この関数名は任意(自由)です。初期化のときにBLEオブジェクトの下記のプロパティに結びつけています。(厳密には上記の関数のポインタ(メモリ上の位置)を設定)212行目


 ble112.ble_evt_le_gap_scan_response

 

コールバック関数 my_evt_le_gap_scan_response()は引数として *msgをとります。msgは受信状況と受信したデータです。データそのものを受け取るのでなくポインタとして受け取ります。msgは構造体変数で下記の構造です。右に図にしたものを示します。

 

 struct ble_msg_le_gap_scan_response_evt_t {
   int8 rssi;
   uint8 packet_type;
   bd_addr sender;
   uint8 address_type;
   uint8 bond;
   uint8array data;
 } __attribute__((packed));

 

 typedef struct bd_addr_t {
   uint8 addr[ 6 ];
 } bd_addr;
 typedef bd_addr hwaddr;

 

 typedef struct {
   uint8 len;
   uint8 data[];
 } uint8array;

 

 

受信処理の核心部分

 

おこなうことは下記の通りです。

・受信パケットの受け取り

・アドバタイズ・データAD2から
 送信元デバイス名を取得

・対象とするデバイスの判断

・受信データの取得

・データのLCD表示

 

受信状況と受信データ

 

このコールバック関数はスキャン(周りからの受信)結果があった場合に呼び出されます。

 

受信状況と受信したデータはmsgという引数を介して受け取ります。

msgはble_msg_le_gap_scan_response_evt_tという構造の構造体変数です。この構造体から必要な値を切り出します。

 

msgはポインタ(変数のアドレス)渡しのため、その構造体のメンバにアクセスするためには->演算子を使用します。

 

受信対象の選別

 

スキャンでは周りにあるパケットをすべて受信します。その中から対象となるパケットを選択して処理対象とします。

今回はAD2に含まれる送信側のデバイス名を使用して選別しています。特定の文字列(デバイス名)の一致を条件としていますので、対象は1つに限られます。複数を対象とした場合には、デバイス名の一部(共通部分)を比較して相違部分で個体選別する必要があります。または、別途個体選別できる様な識別子を追加する必要があります。

 

受信パケットの長さに注意

 

受信パケットの長さはかなり幅があります。大きな(長い)データをそのまま持ち込むと、記憶領域を無駄に使用したり配列を突き抜けてしまい暴走の原因になりますので必要以上に長いパケットは破棄するか、取り扱うデータ長の上限を決めることが望ましいです。

 

処理の核心部分

 

287行目以降が、対象となるパケットの処理部分となります。ここでは下記をおこなっています。

・受信パケットから個々のデータの
 取得とデータ型の変換

・LCD表示

 

アプリケーションでは、この部分にそのアプリケーション固有の処理が入ります。

ここはコールバック関数内なので、アプリケーション固有の処理はメインループに記述して、この関数内では受信データの保存とメインループへの受信があったことを伝える(フラグなど)だけにして短時間で処理を終えるようにする場合もあります。

 

データ型に注意

 

今回はデータを2バイトのint型としてパケットに載せました。通信ではオクテット数を厳密に規定しています。

プログラムでは処理系により同じint型でもバイト数が異なります。AVRでは2バイト、STM32では4バイトです。パケットを組み立てるとき、分解するとき(パース)にはその差に注意が必要です。

ハードウエアを知る

 

ここは飛ばしも大丈夫

 

Leafonyを使用しますので、ここは飛ばしても動きますが、概要を知っておくとより理解が深まります。

 

ブロックダイアグラム

 

回路を設計するときは、回路図を書く前に機能ごとにブロック(箱)で表したブロックダイアグラムという図を書きます。

 

Leafonyはそれぞれのリーフ(ボード)が機能ごとに分かれているので、リーフをひとつの機能ブロックとして見ることができます。右の図はリーフをブロックダイアグラム的に配置してみたものです。

欲しい機能のリーフと、その組合せを考えればブロックダイアグラムと回路図は完了です。これがLeafonyの良いところです。ハードウエア設計と試作の時間を大幅に短縮することが可能です。

ペリフェラル側

 

 

リーフ 使 途 詳細情報(購入可) 仕様書 回路図
AI01

4-Sensors

AC02 BLE Sugar
AP01 AVR MCU
AZ01 USB
AV01 CR2032

 

Leafony バス

 

Leafony バスは複数のリーフの間をコネクタを介して相互に接続する共通の経路部の名称です。

 

複数のボードで構成するボードシステムはバスを規格化しているところに特徴があります。バスの各ピン(経路)を理解するといろいろな応用がしやすくなります。

 

 

AVR MCUピン対応表

STM32 MCUピン対応表

セントラル側

 

 

リーフ 使 途 詳細情報(購入可) 仕様書 回路図
AI04

LCD

AC02 BLE Sugar
AP03 STM32 MCU
AZ01 USB
AV03 AA BAT

関連するプログラム解説( タイマ割り込み、加速度センサ、LCD表示 )

タイマ割り込み

 

※ タイマ割り込みに関連する部分のみ抜粋

 

ペリフェラル側です。

2秒ごとに傾きを検知するために、タイマ割り込みを使用します。

タイマ割り込みはあらかじめ設定した時間が経過すると、あらかじめ登録したプログラムが呼び出されるしくみです。

 

どこで処理をおこなうか

 

組み込み型では少ないリソース(MCU処理速度、メモリ量、入出力ポートの数、周辺機能など)をやりくりします。

 

プログラムも同じです。特に制御系など定期的に処理をおこなう場合や、入出力が多い場合は、時間に追われて処理が追いつかないことがないようにする必要があります。

 

右の事例ではタイマ割り込みではフラグの設定のみで、処理本体はメインループでおこなっています。割り込み側では処理を軽くすることが多いです。

 

初期設定

 

初期設定で下記をおこないます。

・割り込み間隔の設定

・割り込み処理(プログラム)の登録

・タイマの開始

 

ここでは割り込み間隔は125mseです。それを16回数えて2秒間隔を創っています。

 

割り込み独特の記述

 

割り込みは他のプログラムを処理している時に突発的に発生するため、そこへの配慮が必要になります。ここでは下記の2点です。

 

フラグ(変数)を volatileにする。

変数はMCUのメモリ(RAM)に置かれますが、場合によってはMCUのレジスタに置いて使用する場合があります。

連続して処理がおこなわれる場合は問題ないのですが、割り込みの様に突発的に発生する処理ではレジスタに置かれた値は不確かなので、RAMにある変数の値を使用するように明示するための宣言です。

 

初期設定中は割り込み禁止

割り込み中に他の割り込みが入ったり、二重に割り込みが入ると問題が発生する場合があります。もちろん、その様な状況が発生する場合も珍しくないため、その配慮をしながら設計します。

ここでは割り込み初期設定の期間中に割り込みを禁止しています。

 

 noInterrupts(); 割り込みの禁止
 (この間は割り込みが発生しない)
 interrupts(); 割り込みの許可

加速度センサ

 

※ 加速度センサに関連する部分のみ抜粋

 

ペリフェラル側です。

初期設定して、値が欲しいときに読み出すだけです。

 

加速度センサの値の置き場所

 

加速度センサの値を保持する変数( axisX_g, axisY_g, axisZ_g )は、プログラム全体からアクセスできるグローバル変数にしています。

もちろん、センサ値の取得 → LCD表示の処理部分のみで使用していますので、局所的なローカル変数にしても問題はありません。

このアプリケーションは加速度(傾き)に注目しているので、その主役をいうことを明示したいのでグローバル変数としました。

 

自分以外の方がプログラムを読むときに、アプリケーションや関数の目的や意図が伝わる工夫も大切かなと思います。

 

LCD表示

 

※ LCD表示に関連する部分のみ抜粋

 

ペリフェラル側です。

初期設定して、表示したい内容を書き込むだけです。

 

LCDリーフには省電力を目的とした、LCDの電源ON/OFF用の拡張IOが載っています。LCDの使用に先立ち、拡張用IOを介してLCDの電源をONにします。

開発時のヒント


通信を含む実験やアプリケーションは、ちょっと工夫が必要です。

通信するには「相手」が必要だからです。また、個々のデバイスやシステムの動作とともにちゃんと通信できていることを確認するために手段も必要となります。今回は下記の順序で確認しながら進めました。

 

 1)セントラル側(スキャナ)を作る。

 2)周りに飛び交っているBluetooth通信を受信できることを確認する。

 3)ペリフェラル側(アドバタイザ)を作る。

 4)ペリフェラルでアドバタイジングパケットを発信する。

 5)セントラル側で4)で発信したパケットを受信できることを確認する。

 

セントラル側の実験

 

周囲には結構多くのBluetooth通信が飛び交ってます。飛び交っていないかなと心配なときは、スマートフォンやPCのBluetoothをONにしておけば大丈夫です。

 

上記2)の実験では、その周囲に飛び交っているBluetooth通信を受信できるようにします。

 

プログラムでは対象となるデバイスからの受信だけを処理対象としています。そのため、すべてを受信して表示できるようにします。

右リストの287行目と対になる325行目をコメントアウトして無効化します。

 

DEBUG用にするとシリアル出力で通信内容がArduino IDEのモニタに表示します。

 

受信したパケットの中からペリフェラル側で送信した内容を特定して、受信データの内容が送信した内容と一致していることを確認します。

USB接続用のシリアル通信に注意

 

190行目に1秒間の待ち時間を入れています。これがないとUSB接続のない単独使用時に動かなくなります。

MCUとBLEリーフのTX/RXに注意

 

MCUとBLE間はシリアル通信(UART)で接続します。接続は右記の通りです。送信したものを受信する。ということです。TXとTX、RXとRXと接続しているわけではありません。

 

制作意図と元のプログラム

BASIC Kit2 が発売になりました。Kit2を使用したサンプルを作ってみよう!

 

・・・というこで、作るのなら少しでも役に立ちそうなものがいいなと、この記事になりました。BLEビーコンは多くのサンプルがありますが、ここでは送受信ともにLeafonyにすることにしました。

他のサンプルとともに理解を深められるように、Leafonyサイトで公開されているプログラムを使用しました。元のプログラムは右記の通りです。分かりやすさと、他にも転用できるスケルトンを意識してなるべくシンプルに使用しないコードは削減しました。

 

実際のアプリケーションをイメージして、ペリフェラル側のMCUは AVR、コイン型電池です。セントラル側は各種機能を搭載することが多いのでSTM32、単3電池を使用しています。

BLEリーフは多くの機能を提供しています。ここでは使用している機能だけピンポイントで説明しています。基本的な内容やここに書いていない多くの機能などの情報は次項をごらんください。

参考になる情報

サルでもわかるBLE入門
BLEの基本から分かりやすく丁寧に説明しています。

 

開発視点の超簡単BLE入門
開発視点のためプログラムを作る前に見ておくと理解が進みます。

Bluetooth SIG
Bluetoothの家元です。
(日本)https://www.bluetooth.com/ja-jp/

 

BLEリーフの概要
今回の主役、BLEリーフに関する情報です。

・仕様書(PDF)

BLEモジュールのデータシート(PDF/英語版)

最後までご覧いただきありがとうございました!

IoTでよく使用するビーコン通信を詳説しました。必要最小限のコードと説明にしようとしたのですが結構長くなってしまいました。文章が多く読みづらくなり申し訳ござませんでした。注意しながら書きましたが、記述に誤りや表現が不適切な部分がありましたらご容赦ください。また、ご指摘をいただければ幸いです。

 

通信を含むプログラムは複数のデバイスやシステムを対象とする必要があります。また、通信内容がちゃんとしていないと正しく受け取れなかったり、誤った内容を伝えることになります。人間関係に似ているなと思います。ちゃんと伝えたつもりでも伝わっていなかった、思った通りに理解されていなかったなどなど。デバッグしながら自分自身のことを振り返ってしまいました。ちゃんと伝えることの難しさと大切さを教えてもらいました。

ページの終了