その2:SK StationとLoRaモジュールでセンサネットワークを作ってみました

はじめに

SK920LRモジュール(以下LoRa Cape)とBeagleBone Black(以下BBB)の組み合わせで簡単にLPWA通信を行う為のチュートリアルです。
親機にはSK Stationを利用し、子機にBBBを利用します。
BBBにGrove Capeと呼ばれる拡張ボード(Cape)を接続する事でセンサーの値を送信するところまでを説明します。

bbb-grove-lora.png

必要な機材

開発環境構築

BeagleBone Blackの環境構築

BeagleBone Blackの初期設定方法

SK Stationの環境構築

詳細はSK Stationのマニュアルを参照して下さい。ここでは設定内容のみ説明します。

  1. SK StationとPCをLANケーブルで接続
    クロスケーブルで直接接続するか、またはイーサネットハブで接続する
  2. PC側のネットワークアダプタ設定
    IP Address192.168.0.241
    Subnet Mask255.255.255.0
    Default Gateway192.168.0.1

    center
  3. PC側のブラウザでSK Station Managerを開く
    ブラウザのURL欄へ以下のアドレスを入力する
    http://192.168.0.240:9000/index.jsp
  4. 認証IDとパスワードを入力
    SK Station for 4LRに同梱のユーザー名とパスワードを入力する。

    skstation-login.PNG
    認証が成功するとSK Station Managerの画面が表示されます。

    skstation-after-login.PNG
  5. SK Stationの各通信モジュールの初期設定
    SK Station for LoRaには4つの通信モジュールが内蔵されています。今回はモジュール0のみを使います。
    「モジュール選択」の下の各モジュール名をクリックする事で各モジュールの設定を変更できます。
    1. モジュール0
      動作モード通信モジュール
      ベースチャンネル24
      ステーションIDFFFF0001
      スロットモード16スロット
      PSK11111111222222223333333344444444
      チャンネルホッピングシングル

    2. モジュール1
      動作モード待機
      ベースチャンネル28
      ステーションIDFFFF0001
      スロットモード16スロット
      PSK11111111222222223333333344444444
      チャンネルホッピングシングル

    3. モジュール2
      動作モード待機
      ベースチャンネル33
      ステーションIDFFFF0001
      スロットモード16スロット
      PSK11111111222222223333333344444444
      チャンネルホッピングシングル

    4. モジュール3
      動作モード待機
      ベースチャンネル38
      ステーションIDFFFF0001
      スロットモード16スロット
      PSK11111111222222223333333344444444
      チャンネルホッピングシングル

LoRa Capeの環境構築

LoRa CapeをBBBに接続して、コマンドの送受信ができる事を確認します。

  1. LoRa CapeとBBBを接続
    写真のようにBBBの上にLoRa Capeを重ねるように接続します。
    bbb-sk920lr.png
  2. BBBとPCをUSB接続
    ミニBタイプのUSBケーブルでBBBとPCを接続する。
  3. BBBをインターネットへ接続
    のち程説明するminicomをインストールする都合、インターネット接続可能なLANケーブルをBBBへ接続する。
  4. BBBのコンソールを開く
    TeraTermなどのターミナルエミュレータを使ってPCから192.168.7.2アドレスへSSHでアクセスする。
    BBBのデフォルトのユーザ名は"root"でパスワードは無しです。
    TeraTermはこちからダウンロードする。
  5. BBBのUART1を有効化
    デフォルトではBBBのUART1は無効化されているのでこれを有効化します。
    1. "vi /boot/uEnv.txt"でuEnv.txtを開く
      $vi /boot/uEnv.txt
    2. 以下の一行をuEnv.txtの最後に追加
      optargs=capemgr.enable_partno=BB-UART1
      bbb-eEnv-UART1.PNG
    3. uEnv.txtを保存する
    4. BBBを再起動
      "reboot"コマンドで再起動する
      $reboot
  6. minicomをインストール
    minicomはBBBで動くシリアルコンソールプログラムです。minicomを使ってUART1経由でSK920LRと通信します。
    aptを使ってminicomをインストールします。(要インターネット接続)
    $sudo apt-get update
    $sudo apt-get install minicom
  7. SK920LRと通信
    SK920LRがUART1経由で接続できている事を確認します。minicomを以下のオプションで開きます。
    $minicom -o -D /dev/ttyO1 -b 115200 -8
    シリアルコンソール画面が表示されたら、SKINFOと入力して以下の画面のような応答がある事を確認します。
    teraterm-access-skinfo.PNG

LoRa Capeの使い方 その1(シリアルコンソールから使う)

LoRa Capeの使い方を直感的に理解できるよう、シリアルコンソールからインタラクティブにコマンド入力して使う方法を説明します。

  1. 初期設定
    minicomから以下のコマンドを打ち込む事で最低限度の初期設定が完了します。
    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で設定した値と同一。

  2. ビーコン受信
    子機の初期設定が完了するとSK Stationからのビーコンの受信を開始します。ビーコンの受信をトリガとしてスロット同期が開始されます。スロット同期後に接続処理が完了します。

    teraterm-erxbcn.PNG

    イベント名意味
    ESTAT E0ESTATはスタック内で発生した、各種の状態を通知します。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は利用タイムスロットを示します。

  3. 親機へデータ送信
    親機との接続が完了すると子機から親機へデータ送信が可能になります。ここでは親機に0x1234abcdの4bytesのデータを送信する例を示します。
    SKSEND 0000000000000000 4 1234ABCD
    コマンド第1引数第2引数第3引数
    SKSEND送り先のMACアドレス。親機へ送る場合は未指定(0)も可能。送信データのバイト数送信データ(ASCII-HEX形式)

    teraterm-sksend.PNG
    SKSEND実行時のターミナル出力

    イベント名意味
    SKSEND ...(省略)親機へのデータ送信コマンド(上述)
    OK B5AESKSENDコマンドを子機が受け取った事を示します。0xB5AEは送信データのIDを示します。
    ESTAT E0ESTATはスタック内で発生した、各種の状態を通知します。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は親機から子機に対して下り送信がない事を意味します。

  4. SK Station Managerでデータ受信
    SK Station Managerで子機から送信された値を確認します。

    1. SK Station Managerで子機の接続状況を確認
      通信モジュール0にエンドデバイスが追加されている事を確認する。もしも表示されていない場合はブラウザをリロードして下さい。

      skstation-join-device.PNG

    2. エンドデイバス0の受信データを確認
      エンドデバイスの「受信データ」のリンクをクリックすると、受信データが表示されます。
      今回送信した1234abcdの4bytesが受信している事が確認できます。
      skstation-receive-data.PNG

      各コマンド、各イベントのより詳しい詳細はSK Command Referenceをご参照下さい。

LoRa Capeの使い方 その2(Bonescriptから使う)

より実践的なLoRa Capeの使い方として、BBBにGrove Capeを追加して、センサーの読み取り値をLoRa Capeで親機に送信する例をここでは説明します。

Grove Capeについて

Grove Systemは各種の組み込みシステムに簡単にセンサーを接続できるよう規格化された製品です。Raspberry PiやArduinoなどに接続して利用します。
Grove System公式Wikiサイト
このGrove SystemのセンサーをBBBに接続する拡張ボードがGrove Capeになります。
Grove Cape for BeagleBone Series
bbb-grove-cape.png
Grove CapeをBBBに接続する事で既製品のGrove Systemの各種センサーをBBBへ簡単にケーブル接続する事が可能です。
今回のチュートリアルではBBB+Grove Cape+LoRa Capeをスタッカブル接続する事でGroveセンサーの値を子機から親機へ送信する例をここでは説明します。

bbb-grove-lora.png

Cloud9 IDEについて

開発環境として、BBBに搭載されているCloud9 IDEという統合開発環境を使います。
Cloud9 IDE
Cloud9 IDEはブラウザから利用可能な開発環境で、PC側に環境をインストールする必要がなく、すぐに利用可能です。

bbb-cloud9-open.PNG

Cloud9 IDEを開く

ブラウザから以下のURLへアクセスします。
http://192.168.7.2:3000/ide.html

Bonescriptについて

BBBのCloud9にはBonescriptと呼ばれるnode.js上で動作するJavascriptのライブラリ環境がインストールされています。Bonescriptを使う事で簡単にBBBのI/O制御を含むプログラムの開発が可能です。
Bonescript

Cloud9 IDEでサンプルを実行する

Bonescriptのサンプルとして、BBBに搭載されているLEDを点滅するサンプルを実行してみます。

  1. サンプルファイルを開く
    Cloud9 IDEの左側のWorkspaceタブをクリックし、以下のファイルを選択します。

    cloud9->bone101->examples->blinkled.js

    bbb-cloud9-blinksample.PNG
  2. サンプルファイルを実行する
    Cloud9 IDEのメニューバーにある"Run"ボタンをクリックする。

    bbb-cloud9-run.png

    BBBのUSBコネクタ付近にある青色LED全てが1秒おきに点滅を繰り返します。

Bonescriptでセンサー値を読み込み

Grove Capeに接続した温度センサーの値を読み込む方法について説明します。

温度センサーを接続する

Grove Sensorの"Temperature Sensor v1.2"をGrove Capeの手前左側のコネクタJ3へ接続します。
コネクタJ3はアナログ入力対応の端子です。
Temeprature Sensor v1.2
bbb-grove-lora.png

センサー出力(アナログ値)の読み込み

Grove CapeのコネクタJ3の温度センサー出力はBBBのピン番号"P9_39"に接続されています。
"P9_39"から温度センサーの出力をanalogReadコマンドで読み出します。
以下のサンプルファイルを開き、修正します。

cloud9->bone101->examples->analog2.js

プログラムを実行する

"Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に読み出したアナログ値が表示されます。

bbb-cloud9-analog-value.PNG

デモプログラム

ここでは簡単なBonescriptを使ったデモプログラムについて説明します。
デモプログラムのサンプルコードはこちらからダウンロードできます。

デモプログラムをCloud9 IDEへアップロードする

  1. Workspaceタブでマウスの右クリック->"New Folder"を選択する
    ここでは"skwan"というフォルダを作成する。
  2. メニューバーの"File"メニュー->"Upload Local Files..."を選択する
    デモプログラムのファイル(skdemo_bbb_v1_04.js)を選択して、アップロードする。

    bbb-cloud9-upload-sample.PNG

デモプログラムを実行する

"Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に実行結果が表示されます。

bbb-cloud9-sample-run.PNG

デモプログラムの解説

デモプログラムの概要について説明します。

  1. デモプログラムの全体の流れ
    sample-code-top-flow.png
    bonescriptはnode.jsによるイベントドリブン型のプログラム環境です。
    基本的にはシリアルポートの受信イベントをトリガにしてonSerial関数がコールバックされる事で実行されます。

    1. 初期化パート
      bonescriptモジュールの読み込み、必要な変数、オブジェクトの生成を行います。
      本サンプルプログラムでは3つのGrove Sensorに対応しています。
      (1)温度センサー
      (2)ポテンショメーター
      (3)湿度センサー
      使うセンサーに応じてコメントアウトを修正して下さい。
      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

    2. シリアルポート初期化
      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,フローコントロール無しに設定しています。

    3. シリアルポート受信イベント
      // Open Serial Port
      b.serialOpen(port,opts,onSerial);

      シリアルポートにデータの受信などのイベントが発生するとonSerial関数が呼ばれます。

    4. 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つの部分に分かれています。
      1. interfaceLoop関数
        シリアルポートからの引数xからSKコマンドに関する処理を行います。
        本サンプルプログラムではSK920LRへ送ったSKコマンドに対する応答(OK)を確認します。

      2. eventLoop関数
        シリアルポートからの引数xからSKイベントに関する処理を行います。
        本サンプルプログラムではSK920LRから送られるSKイベントを確認します。

      3. appLoop関数
        interfaceLoop、eventLoopでの結果を元に、アプリケーションとしての処理を行います。
        センサーデータの読み込み、読み込んだデータの送信などを行います。
        詳細は後述します。

  2. appLoop関数の詳細
    sample-code-appLoop.png
    appLoop関数はSKAppState値を元に動くステートマシンになっています。
    SK920LRの初期化からデータ送信までの流れを説明します。

    1. SKAppState.fsm.idle
      シリアルポートがオープンされると、SKAppState.fsm_init_0へ移行します。

    2. SKAppState.fsm.init_0
      SK920LRの初期化を行います。
      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オブジェクトへ追加します。
      各レジスタの設定についてはこちらを参照して下さい。
      最初のレジスタ設定をcmd.send()で送信した後、SKAppState.fsm.init_1へ移行します。

    3. SKAppState.fsm.init_1
      送信したコマンドに対してSK920LRが"OK"と応答してくる事を確認します。
      コマンドキューにコマンドが残っていればsend()メソッドで次のコマンドを送信します。
      全てのコマンドの送信が完了した場合は、SKAppState.fsm.init_2へ移行します。

    4. SKAppState.fsm.init_2
      初期化結果が有効になるのを待つ為にビーコン受信イベント(ERXBCN)を待ちます。
      ステータスイベント(ESTAT)の戻り値がE0であれば、親機と接続が確認できます。
      ビーコンを4回受信してもE0が受信できない場合は、エラーとしてSKAppState.fsm.idleへ移行します。

    5. SKAppState.fsm.idel
      SLEEP有効時はビーコン同期スロットのみコマンドを受け付けますので、初期化後はビーコンの受信イベントを待ちます。
      ビーコン受信イベント(ERXBCN)が発生した時に、センサーデータの送信コマンド(SKSEND)を発行します。
      センサーデータの送信コマンドを発行した後にSKAppState.fsm.send_0に移行します。

    6. SKAppState.fsm.send_0
      データ送信コマンド(SKSEND)に対してSK920LRが"OK"を返すのを待ちます。
      "OK"の戻り値には送信データのIDが付随しているので、これを確認します。
      "OK"が戻ってきた場合にはSKAppState.fsm.send_1に移行します。

    7. SKAppState.fsm.send_1
      SK920LRからデータ送信に対する処理結果(ECONF)を待ちます。
      "ECONF"イベントが発生し、第一引数が0x00で、送信データのIDが一致した場合はデータ送信(SKSEND)の要求が処理された事が確認できます。
      SKAppState.fsm.send_2に移行します。

    8. SKAppState.fsm.send_2
      SK920LRからの親機からの送信完了通知(EACK)を待ちます。
      "EACK"イベントが発生し、第一引数が0x00であれば、送信データが親機に受信された事を意味します。
      データ送信シーケンスが全て完了したところで、SKAppState.fsm.idleへ戻ります。

CRONによる自動起動

サンプルプログラムをCRONで自動起動される事でBBBをヘッドレスのエンドポイントとして活用出来ます。

SSHでBBBへ接続する

teratermなどでSSHを使ってBBB(192.168.7.2)へ接続する。
参考

CRONに設定ファイルを書き込む

$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

参考リンク

サンプルプログラム

fileskdemo_bbb_v1_04_2017_0601.zip

SK Cape(LoRa Cape)

SK Capeは株式会社スカイリーネットワークスで販売しております。
SK Cape基板の情報はこちらからダウンロード出来ます。
fileSK-Cape board_20170601.zip

SK920LR(LoRa Module)

SK920LRは株式会社スカイリーネットワークスで販売しております。
SK920LR用のインターフェース変換基板の情報はこちらからダウンロード出来ます。
fileSK920LR-IF board_20180105.zip

BeagleBone Black

https://beagleboard.org/black

Grove System

http://wiki.seeed.cc/Grove_System/

Temperature Sensor V1.2

http://wiki.seeed.cc/Grove-Temperature_Sensor_V1.2/

Moisture Sensor

http://wiki.seeed.cc/Grove-Moisture_Sensor/

Slide Potentiometer

http://wiki.seeed.cc/Grove-Slide_Potentiometer/

Grove Cape

http://wiki.seeed.cc/Grove_Cape_for_BeagleBone_Series/

TeraTerm

https://ttssh2.osdn.jp/index.html.ja


添付ファイル: fileskdemo_bbb_v1_04_2017_0601.zip 1470件 [詳細] fileteraterm-sksend.PNG 1457件 [詳細] fileteraterm-erxbcn.PNG 1483件 [詳細] fileteraterm-access-skinfo.PNG 1460件 [詳細] fileskstation-receive-data.PNG 1464件 [詳細] fileskstation-login.PNG 1486件 [詳細] fileskstation-join-device.PNG 1456件 [詳細] fileskstation-IPsetting.PNG 1457件 [詳細] fileskstation-default.PNG 703件 [詳細] fileskstation-after-login.PNG 1467件 [詳細] fileSK-Cape board_20170601.zip 1442件 [詳細] fileSK920LR-IF board_20180105.zip 1452件 [詳細] fileSK920LR-IF board_20170601.zip 726件 [詳細] filesample-code-top-flow.png 1452件 [詳細] filesample-code-appLoop.png 1464件 [詳細] filebbb-sk920lr.png 1457件 [詳細] filebbb-grove-lora.png 1456件 [詳細] filebbb-grove-cape.png 1468件 [詳細] filebbb-eEnv-UART1.PNG 1455件 [詳細] filebbb-cloud9-upload-sample.PNG 1441件 [詳細] filebbb-cloud9-skwan-folder-skdemo.PNG 708件 [詳細] filebbb-cloud9-sample-run.PNG 1462件 [詳細] filebbb-cloud9-run.png 1456件 [詳細] filebbb-cloud9-open.PNG 1462件 [詳細] filebbb-cloud9-blinksample.PNG 1494件 [詳細] filebbb-cloud9-analog-value.PNG 1454件 [詳細] filebbb-cloud9-analog.PNG 1476件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-06-08 (水) 21:35:51