その2:SK StationとLoRaモジュールでセンサネットワークを作ってみました
SK920LRモジュール(以下LoRa Cape)とBeagleBone Black(以下BBB)の組み合わせで簡単にLPWA通信を行う為のチュートリアルです。
親機にはSK Stationを利用し、子機にBBBを利用します。
BBBにGrove Capeと呼ばれる拡張ボード(Cape)を接続する事でセンサーの値を送信するところまでを説明します。
詳細はSK Stationのマニュアルを参照して下さい。ここでは設定内容のみ説明します。
IP Address | 192.168.0.241 |
---|---|
Subnet Mask | 255.255.255.0 |
Default Gateway | 192.168.0.1 |
動作モード | 通信モジュール |
---|---|
ベースチャンネル | 24 |
ステーションID | FFFF0001 |
スロットモード | 16スロット |
PSK | 11111111222222223333333344444444 |
チャンネルホッピング | シングル |
動作モード | 待機 |
---|---|
ベースチャンネル | 28 |
ステーションID | FFFF0001 |
スロットモード | 16スロット |
PSK | 11111111222222223333333344444444 |
チャンネルホッピング | シングル |
動作モード | 待機 |
---|---|
ベースチャンネル | 33 |
ステーションID | FFFF0001 |
スロットモード | 16スロット |
PSK | 11111111222222223333333344444444 |
チャンネルホッピング | シングル |
動作モード | 待機 |
---|---|
ベースチャンネル | 38 |
ステーションID | FFFF0001 |
スロットモード | 16スロット |
PSK | 11111111222222223333333344444444 |
チャンネルホッピング | シングル |
LoRa CapeをBBBに接続して、コマンドの送受信ができる事を確認します。
$vi /boot/uEnv.txt
optargs=capemgr.enable_partno=BB-UART1
$reboot
$sudo apt-get update $sudo apt-get install minicom
$minicom -o -D /dev/ttyO1 -b 115200 -8シリアルコンソール画面が表示されたら、SKINFOと入力して以下の画面のような応答がある事を確認します。
LoRa Capeの使い方を直感的に理解できるよう、シリアルコンソールからインタラクティブにコマンド入力して使う方法を説明します。
SKSREG S02 1 SKSREG S04 1 SKSREG S08 18 SKSETPSK 11111111222222223333333344444444 SKSREG S05 FFFF0001各コマンドの意味
コマンド | 意味 |
---|---|
SKSREG S02 1 | 子機の動作種別をエンドデバイスに設定 |
SKSREG S04 1 | 今回はインタラクティブな使い方をするので子機が割り当てスロット以外はSleepする設定を無効化。 |
SKSREG S08 18 | 子機のベースチャンネルをch24に設定。SK Stationの通信モジュール0で設定した値と同一 |
SKSETPSK 11..(省略)..44 | 接続用のPre-shared key(128bits)を設定。SK Stationで設定した値と同一 |
SKSREG S05 FFFF0001 | ステーションIDを設定。SK Stationで設定した値と同一。 |
イベント名 | 意味 |
---|---|
ESTAT E0 | ESTATはスタック内で発生した、各種の状態を通知します。0xE0は指定されたステーションIDからビーコンを受信し、スロット同期が開始された事を意味します。 |
ERXBCN 94 00 00 FFFF0001 B2 | ビーコンを受信した事を意味します。0xFFFF0001は親機のStation IDを意味し、0xB2はビーコン受信のRSSI値を示します。 |
ECONF 00 00:00:00:00:00:00:00:00 0025 | ビーコンを受信すると子機は接続要求を親機へ送信します。ECONFはその送信要求の結果を示します。最初の0x00は上り送信要求が成功した事を意味します。 |
EACK 01 | 子機の接続要求に対し親機がACKを返した事を意味します。0x01は親機から子機に対して接続要求が成功した事を通知する下り送信があった事を意味します。 |
EJOIN 00 0002 00 | 親機との接続が完了した事を意味します。最初の0x00は接続が成功した事を意味し、0x0002は利用タイムスロットを示します。 |
SKSEND 0000000000000000 4 1234ABCD
コマンド | 第1引数 | 第2引数 | 第3引数 |
---|---|---|---|
SKSEND | 送り先のMACアドレス。親機へ送る場合は未指定(0)も可能。 | 送信データのバイト数 | 送信データ(ASCII-HEX形式) |
イベント名 | 意味 |
---|---|
SKSEND ...(省略) | 親機へのデータ送信コマンド(上述) |
OK B5AE | SKSENDコマンドを子機が受け取った事を示します。0xB5AEは送信データのIDを示します。 |
ESTAT E0 | ESTATはスタック内で発生した、各種の状態を通知します。0xE0は指定されたステーションIDからビーコンを受信し、スロット同期が開始された事を意味します。 |
ERXBCN 94 00 00 FFFF0001 B2 | ビーコンを受信した事を意味します。0xFFFF0001は親機のStation IDを意味し、0xB2はビーコン受信のRSSI値を示します。 |
ECONF 00 00:00:00:00:00:00:00:00 B5AE | 子機から親機への上り送信(SKSEND)が物理層へのデータ送信要求が成功した事を示します。0xB5AEはSKSENDコマンドの送信データIDを示します。 |
EACK 00 | 子機のデータ送信(SKSEND)要求に対し親機がACKを返した事を意味します。0x00は親機から子機に対して下り送信がない事を意味します。 |
より実践的なLoRa Capeの使い方として、BBBにGrove Capeを追加して、センサーの読み取り値をLoRa Capeで親機に送信する例をここでは説明します。
Grove Systemは各種の組み込みシステムに簡単にセンサーを接続できるよう規格化された製品です。Raspberry PiやArduinoなどに接続して利用します。
Grove System公式Wikiサイト
このGrove SystemのセンサーをBBBに接続する拡張ボードがGrove Capeになります。
Grove Cape for BeagleBone Series
Grove CapeをBBBに接続する事で既製品のGrove Systemの各種センサーをBBBへ簡単にケーブル接続する事が可能です。
今回のチュートリアルではBBB+Grove Cape+LoRa Capeをスタッカブル接続する事でGroveセンサーの値を子機から親機へ送信する例をここでは説明します。
開発環境として、BBBに搭載されているCloud9 IDEという統合開発環境を使います。
Cloud9 IDE
Cloud9 IDEはブラウザから利用可能な開発環境で、PC側に環境をインストールする必要がなく、すぐに利用可能です。
ブラウザから以下のURLへアクセスします。
http://192.168.7.2:3000/ide.html
BBBのCloud9にはBonescriptと呼ばれるnode.js上で動作するJavascriptのライブラリ環境がインストールされています。Bonescriptを使う事で簡単にBBBのI/O制御を含むプログラムの開発が可能です。
Bonescript
Bonescriptのサンプルとして、BBBに搭載されているLEDを点滅するサンプルを実行してみます。
cloud9->bone101->examples->blinkled.js
Grove Capeに接続した温度センサーの値を読み込む方法について説明します。
Grove Sensorの"Temperature Sensor v1.2"をGrove Capeの手前左側のコネクタJ3へ接続します。
コネクタJ3はアナログ入力対応の端子です。
Temeprature Sensor v1.2
Grove CapeのコネクタJ3の温度センサー出力はBBBのピン番号"P9_39"に接続されています。
"P9_39"から温度センサーの出力をanalogReadコマンドで読み出します。
以下のサンプルファイルを開き、修正します。
cloud9->bone101->examples->analog2.js
"Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に読み出したアナログ値が表示されます。
ここでは簡単なBonescriptを使ったデモプログラムについて説明します。
デモプログラムのサンプルコードはこちらからダウンロードできます。
"Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に実行結果が表示されます。
デモプログラムの概要について説明します。
var sd = new SKSensor( b, SKSensor.GroveCape.J3, SKSensor.Type.temperature ); // Sensor Object //var sd = new SKSensor( b, SKSensor.GroveCape.J3, SKSensor.Type.slider ); // Sensor Object //var sd = new SKSensor( b, SKSensor.GroveCape.J3, SKSensor.Type.moisture ); // Sensor Object
var port = '/dev/ttyO1'; var opts = { baudrate : 115200, dataBits : 8, parity : 'none', stopBits : 1, flowControl : false, parser: b.serialParsers.readline("\n") };ここではUART1を115200bps,8bit,パリティ無し,ストップビット1,フローコントロール無しに設定しています。
// Open Serial Port b.serialOpen(port,opts,onSerial);
/** * Serial Interface Callback loop(Main Loop) **/ function onSerial(x) { console.log( "current state : " + s.state ); interfaceLoop(x,c); // Process Serial Command data eventLoop(x,e); // Process Event appLoop(e,s,c, sd); // Process Application }onSerial関数は大きく3つの部分に分かれています。
cmd.add("SKSREG S02 1"); cmd.add("SKSREG S04 0"); cmd.add("SKSREG S08 1d"); cmd.add("SKSETPSK 11111111222222223333333344444444"); cmd.add("SKSREG S05 FFFF0001");必要なレジスタ設定をcmdオブジェクトへ追加します。
サンプルプログラムをCRONで自動起動される事でBBBをヘッドレスのエンドポイントとして活用出来ます。
teratermなどでSSHを使ってBBB(192.168.7.2)へ接続する。
参考
$cd /etc/cron.d $vi boneboot
bonboot内に以下のように設定する。
m h dom mon dow user command NODE_PATH=/usr/local/lib/node_modules @reboot root sleep 120 && /usr/bin/nodejs /var/lib/cloud9/skwan/skdemo_bbb_v1_04.js 2>&1 | logger -p info -t skdemo
ファイルを保存してviを終了する。
再起動すると自動的にサンプルプログラムが起動する。
$reboot
skdemo_bbb_v1_04_2017_0601.zip
SK Capeは株式会社スカイリーネットワークスで販売しております。
SK Cape基板の情報はこちらからダウンロード出来ます。
SK-Cape board_20170601.zip
SK920LRは株式会社スカイリーネットワークスで販売しております。
SK920LR用のインターフェース変換基板の情報はこちらからダウンロード出来ます。
SK920LR-IF board_20180105.zip
http://wiki.seeed.cc/Grove_System/
http://wiki.seeed.cc/Grove-Temperature_Sensor_V1.2/
http://wiki.seeed.cc/Grove-Moisture_Sensor/
http://wiki.seeed.cc/Grove-Slide_Potentiometer/
http://wiki.seeed.cc/Grove_Cape_for_BeagleBone_Series/