#author("2022-06-08T02:01:24+09:00","","") その2:SK StationとLoRaモジュールでセンサネットワークを作ってみました #contents *はじめに [#s2691e99] SK920LRモジュール(以下LoRa Cape)とBeagleBone Black(以下BBB)の組み合わせで簡単にLPWA通信を行う為のチュートリアルです。~ 親機にはSK Stationを利用し、子機にBBBを利用します。~ BBBにGrove Capeと呼ばれる拡張ボード(Cape)を接続する事でセンサーの値を送信するところまでを説明します。~ ~ &ref(./bbb-grove-lora.png,100%);~ ~ *必要な機材 [#sa310cdd] -Windows 8.1 Pro(x64であれば、Windows7, 8/8.1無印でも可) -SK Station for 4LR -[[SK920LR(LoRa module)>#v379edf5]] -[[SK Cape(LoRa Cape)>#v645b63e]] -BeagleBone Black(Rev.C) --Micro SD(4GB以上) --mini B USB cable --Grove Cape --Grove Sensor *開発環境構築 [#df505677] **BeagleBone Blackの環境構築 [#t7821703] [[BeagleBone Blackの初期設定方法]] **SK Stationの環境構築 [#jdd2321c] 詳細はSK Stationのマニュアルを参照して下さい。ここでは設定内容のみ説明します。 +SK StationとPCをLANケーブルで接続~ クロスケーブルで直接接続するか、またはイーサネットハブで接続する +PC側のネットワークアダプタ設定 LEFT: |~IP Address|192.168.0.241| |~Subnet Mask|255.255.255.0| |~Default Gateway|192.168.0.1| ~ CENTER: &ref(./skstation-IPsetting.PNG,25%,center); +PC側のブラウザでSK Station Managerを開く~ ブラウザのURL欄へ以下のアドレスを入力する~ http://192.168.0.240:9000/index.jsp~ +認証IDとパスワードを入力~ SK Station for 4LRに同梱のユーザー名とパスワードを入力する。~ ~ CENTER: &ref(./skstation-login.PNG,50%); ~ LEFT: 認証が成功するとSK Station Managerの画面が表示されます。~ ~ CENTER: &ref(./skstation-after-login.PNG,50%); ~ +SK Stationの各通信モジュールの初期設定~ SK Station for LoRaには4つの通信モジュールが内蔵されています。今回はモジュール0のみを使います。~ 「モジュール選択」の下の各モジュール名をクリックする事で各モジュールの設定を変更できます。 ++モジュール0 |~動作モード|通信モジュール| |~ベースチャンネル|24| |~ステーションID|FFFF0001| |~スロットモード|16スロット| |~PSK|11111111222222223333333344444444| |~チャンネルホッピング|シングル| ~ ++モジュール1 |~動作モード|待機| |~ベースチャンネル|28| |~ステーションID|FFFF0001| |~スロットモード|16スロット| |~PSK|11111111222222223333333344444444| |~チャンネルホッピング|シングル| ~ ++モジュール2 |~動作モード|待機| |~ベースチャンネル|33| |~ステーションID|FFFF0001| |~スロットモード|16スロット| |~PSK|11111111222222223333333344444444| |~チャンネルホッピング|シングル| ~ ++モジュール3 |~動作モード|待機| |~ベースチャンネル|38| |~ステーションID|FFFF0001| |~スロットモード|16スロット| |~PSK|11111111222222223333333344444444| |~チャンネルホッピング|シングル| ~ **LoRa Capeの環境構築 [#e173b27e] LoRa CapeをBBBに接続して、コマンドの送受信ができる事を確認します。~ +LoRa CapeとBBBを接続~ 写真のようにBBBの上にLoRa Capeを重ねるように接続します。~ &ref(./bbb-sk920lr.png,50%); +BBBとPCをUSB接続~ ミニBタイプのUSBケーブルでBBBとPCを接続する。 +BBBをインターネットへ接続~ のち程説明するminicomをインストールする都合、インターネット接続可能なLANケーブルをBBBへ接続する。 +BBBのコンソールを開く~ TeraTermなどのターミナルエミュレータを使ってPCから192.168.7.2アドレスへSSHでアクセスする。~ BBBのデフォルトのユーザ名は"root"でパスワードは無しです。~ TeraTermはこちからダウンロードする。~ +BBBのUART1を有効化~ デフォルトではBBBのUART1は無効化されているのでこれを有効化します。~ ++"vi /boot/uEnv.txt"でuEnv.txtを開く~ $vi /boot/uEnv.txt ++以下の一行をuEnv.txtの最後に追加~ optargs=capemgr.enable_partno=BB-UART1 LEFT: &ref(./bbb-eEnv-UART1.PNG,50%); ++uEnv.txtを保存する~ ++BBBを再起動~ "reboot"コマンドで再起動する $reboot +minicomをインストール~ minicomはBBBで動くシリアルコンソールプログラムです。minicomを使ってUART1経由でSK920LRと通信します。~ aptを使ってminicomをインストールします。(要インターネット接続)~ $sudo apt-get update $sudo apt-get install minicom +SK920LRと通信~ SK920LRがUART1経由で接続できている事を確認します。minicomを以下のオプションで開きます。 $minicom -o -D /dev/ttyO1 -b 115200 -8 シリアルコンソール画面が表示されたら、SKINFOと入力して以下の画面のような応答がある事を確認します。~ LEFT: &ref(./teraterm-access-skinfo.PNG,50%); *LoRa Capeの使い方 その1(シリアルコンソールから使う)[#oc7bac7f] LoRa Capeの使い方を直感的に理解できるよう、シリアルコンソールからインタラクティブにコマンド入力して使う方法を説明します。 +初期設定~ minicomから以下のコマンドを打ち込む事で最低限度の初期設定が完了します。~ SKSREG S02 1 SKSREG S04 1 SKSREG S08 18 SKSETPSK 11111111222222223333333344444444 SKSREG S05 FFFF0001 各コマンドの意味~ ~ LEFT: |~コマンド|~意味| |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で設定した値と同一。| ~ +ビーコン受信~ 子機の初期設定が完了するとSK Stationからのビーコンの受信を開始します。ビーコンの受信をトリガとしてスロット同期が開始されます。スロット同期後に接続処理が完了します。~ ~ LEFT: &ref(./teraterm-erxbcn.PNG,50%); ~ ~ |~イベント名|~意味| |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は利用タイムスロットを示します。| ~ +親機へデータ送信~ 親機との接続が完了すると子機から親機へデータ送信が可能になります。ここでは親機に0x1234abcdの4bytesのデータを送信する例を示します。~ SKSEND 0000000000000000 4 1234ABCD |~コマンド|~第1引数|~第2引数|~第3引数| |SKSEND|送り先のMACアドレス。親機へ送る場合は未指定(0)も可能。|送信データのバイト数|送信データ(ASCII-HEX形式)| ~ |&ref(./teraterm-sksend.PNG,50%);| |CENTER:SKSEND実行時のターミナル出力| ~ |~イベント名|~意味| |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は親機から子機に対して下り送信がない事を意味します。| ~ +SK Station Managerでデータ受信~ SK Station Managerで子機から送信された値を確認します。~ ~ ++SK Station Managerで子機の接続状況を確認~ 通信モジュール0にエンドデバイスが追加されている事を確認する。もしも表示されていない場合はブラウザをリロードして下さい。~ ~ &ref(./skstation-join-device.PNG,50%); ~ ~ ++エンドデイバス0の受信データを確認~ エンドデバイスの「受信データ」のリンクをクリックすると、受信データが表示されます。~ 今回送信した1234abcdの4bytesが受信している事が確認できます。~ &ref(./skstation-receive-data.PNG,50%); ~ ~ 各コマンド、各イベントのより詳しい詳細はSK Command Referenceをご参照下さい。 *LoRa Capeの使い方 その2(Bonescriptから使う)[#y83376d3] より実践的なLoRa Capeの使い方として、BBBにGrove Capeを追加して、センサーの読み取り値をLoRa Capeで親機に送信する例をここでは説明します。~ **Grove Capeについて [#h2684a9d] Grove Systemは各種の組み込みシステムに簡単にセンサーを接続できるよう規格化された製品です。Raspberry PiやArduinoなどに接続して利用します。~ [[Grove System公式Wikiサイト>http://wiki.seeed.cc/Grove_System/]] ~ このGrove SystemのセンサーをBBBに接続する拡張ボードがGrove Capeになります。~ [[Grove Cape for BeagleBone Series>http://wiki.seeed.cc/Grove_Cape_for_BeagleBone_Series/]] ~ &ref(./bbb-grove-cape.png,50%); ~ Grove CapeをBBBに接続する事で既製品のGrove Systemの各種センサーをBBBへ簡単にケーブル接続する事が可能です。~ 今回のチュートリアルではBBB+Grove Cape+LoRa Capeをスタッカブル接続する事でGroveセンサーの値を子機から親機へ送信する例をここでは説明します。~ ~ &ref(./bbb-grove-lora.png,50%); ~ **Cloud9 IDEについて [#c6717e7f] 開発環境として、BBBに搭載されているCloud9 IDEという統合開発環境を使います。~ [[Cloud9 IDE>http://beagleboard.org/Support/bone101/#cloud9]]~ Cloud9 IDEはブラウザから利用可能な開発環境で、PC側に環境をインストールする必要がなく、すぐに利用可能です。~ ~ &ref(./bbb-cloud9-open.PNG,50%); ~ ***Cloud9 IDEを開く [#b1b68c8a] ブラウザから以下のURLへアクセスします。~ http://192.168.7.2:3000/ide.html ***Bonescriptについて [#v7dae119] BBBのCloud9にはBonescriptと呼ばれるnode.js上で動作するJavascriptのライブラリ環境がインストールされています。Bonescriptを使う事で簡単にBBBのI/O制御を含むプログラムの開発が可能です。~ [[Bonescript>http://beagleboard.org/Support/BoneScript]]~ ***Cloud9 IDEでサンプルを実行する [#w019c412] Bonescriptのサンプルとして、BBBに搭載されているLEDを点滅するサンプルを実行してみます。~ +サンプルファイルを開く~ Cloud9 IDEの左側のWorkspaceタブをクリックし、以下のファイルを選択します。~ ~ cloud9->bone101->examples->blinkled.js ~ &ref(./bbb-cloud9-blinksample.PNG,50%); ~ +サンプルファイルを実行する~ Cloud9 IDEのメニューバーにある"Run"ボタンをクリックする。~ ~ &ref(./bbb-cloud9-run.png,50%); ~ ~ BBBのUSBコネクタ付近にある青色LED全てが1秒おきに点滅を繰り返します。~ ~ **Bonescriptでセンサー値を読み込み [#m8dfd3ef] Grove Capeに接続した温度センサーの値を読み込む方法について説明します。~ ***温度センサーを接続する[#c519f460] Grove Sensorの"Temperature Sensor v1.2"をGrove Capeの手前左側のコネクタJ3へ接続します。~ コネクタJ3はアナログ入力対応の端子です。~ [[Temeprature Sensor v1.2>http://wiki.seeed.cc/Grove-Temperature_Sensor_V1.2/]] ~ &ref(./bbb-grove-lora.png,50%); ~ ~ ***センサー出力(アナログ値)の読み込み[#d92ccc9e] Grove CapeのコネクタJ3の温度センサー出力はBBBのピン番号"P9_39"に接続されています。~ "P9_39"から温度センサーの出力をanalogReadコマンドで読み出します。~ 以下のサンプルファイルを開き、修正します。~ cloud9->bone101->examples->analog2.js -inputPinを"P9_39"に変更~ -setTimeoutのインターバルを1000(1秒)に変更~ ~ &ref(./bbb-cloud9-analog.PNG,50%); ~ ~ ***プログラムを実行する [#t1b630f3] "Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に読み出したアナログ値が表示されます。~ ~ &ref(./bbb-cloud9-analog-value.PNG,50%); ~ ~ **デモプログラム [#gf252c23] ここでは簡単なBonescriptを使ったデモプログラムについて説明します。~ デモプログラムのサンプルコードは[[こちらからダウンロード>#o09546ba]]できます。~ ***デモプログラムをCloud9 IDEへアップロードする [#w6fe8540] +Workspaceタブでマウスの右クリック->"New Folder"を選択する~ ここでは"skwan"というフォルダを作成する。~ +メニューバーの"File"メニュー->"Upload Local Files..."を選択する~ デモプログラムのファイル(skdemo_bbb_v1_04.js)を選択して、アップロードする。~ ~ &ref(./bbb-cloud9-upload-sample.PNG,50%); ~ ~ ***デモプログラムを実行する [#bea3bbfb] "Run"ボタンで実行すると、Cloud9の画面下のコンソール画面に実行結果が表示されます。~ ~ &ref(./bbb-cloud9-sample-run.PNG,50%); ~ ***デモプログラムの解説 [#dd55086d] デモプログラムの概要について説明します。~ +デモプログラムの全体の流れ~ &ref(./sample-code-top-flow.png,50%);~ bonescriptはnode.jsによるイベントドリブン型のプログラム環境です。~ 基本的にはシリアルポートの受信イベントをトリガにしてonSerial関数がコールバックされる事で実行されます。~ ~ ++初期化パート~ bonescriptモジュールの読み込み、必要な変数、オブジェクトの生成を行います。~ 本サンプルプログラムでは3つのGrove Sensorに対応しています。~ (1)[[温度センサー>#t22b7073]]~ (2)[[ポテンショメーター>#ec9d5bb1]]~ (3)[[湿度センサー>#b62a03dc]]~ 使うセンサーに応じてコメントアウトを修正して下さい。~ 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); ~ シリアルポートにデータの受信などのイベントが発生するとonSerial関数が呼ばれます。~ ~ ++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つの部分に分かれています。~ +++interfaceLoop関数~ シリアルポートからの引数xからSKコマンドに関する処理を行います。~ 本サンプルプログラムではSK920LRへ送ったSKコマンドに対する応答(OK)を確認します。~ ~ +++eventLoop関数~ シリアルポートからの引数xからSKイベントに関する処理を行います。~ 本サンプルプログラムではSK920LRから送られるSKイベントを確認します。~ ~ +++appLoop関数~ interfaceLoop、eventLoopでの結果を元に、アプリケーションとしての処理を行います。~ センサーデータの読み込み、読み込んだデータの送信などを行います。~ 詳細は後述します。~ ~ +appLoop関数の詳細~ &ref(./sample-code-appLoop.png,25%);~ appLoop関数はSKAppState値を元に動くステートマシンになっています。~ SK920LRの初期化からデータ送信までの流れを説明します。~ ~ ++SKAppState.fsm.idle~ シリアルポートがオープンされると、SKAppState.fsm_init_0へ移行します。~ ~ ++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オブジェクトへ追加します。~ 各レジスタの設定については[[こちら>#oc7bac7f]]を参照して下さい。~ 最初のレジスタ設定をcmd.send()で送信した後、SKAppState.fsm.init_1へ移行します。~ ~ ++SKAppState.fsm.init_1~ 送信したコマンドに対してSK920LRが"OK"と応答してくる事を確認します。~ コマンドキューにコマンドが残っていればsend()メソッドで次のコマンドを送信します。~ 全てのコマンドの送信が完了した場合は、SKAppState.fsm.init_2へ移行します。~ ~ ++SKAppState.fsm.init_2~ 初期化結果が有効になるのを待つ為にビーコン受信イベント(ERXBCN)を待ちます。~ ステータスイベント(ESTAT)の戻り値がE0であれば、親機と接続が確認できます。~ ビーコンを4回受信してもE0が受信できない場合は、エラーとしてSKAppState.fsm.idleへ移行します。~ ~ ++SKAppState.fsm.idel~ SLEEP有効時はビーコン同期スロットのみコマンドを受け付けますので、初期化後はビーコンの受信イベントを待ちます。~ ビーコン受信イベント(ERXBCN)が発生した時に、センサーデータの送信コマンド(SKSEND)を発行します。~ センサーデータの送信コマンドを発行した後にSKAppState.fsm.send_0に移行します。~ ~ ++SKAppState.fsm.send_0~ データ送信コマンド(SKSEND)に対してSK920LRが"OK"を返すのを待ちます。~ "OK"の戻り値には送信データのIDが付随しているので、これを確認します。~ "OK"が戻ってきた場合にはSKAppState.fsm.send_1に移行します。~ ~ ++SKAppState.fsm.send_1~ SK920LRからデータ送信に対する処理結果(ECONF)を待ちます。~ "ECONF"イベントが発生し、第一引数が0x00で、送信データのIDが一致した場合はデータ送信(SKSEND)の要求が処理された事が確認できます。~ SKAppState.fsm.send_2に移行します。~ ~ ++SKAppState.fsm.send_2~ SK920LRからの親機からの送信完了通知(EACK)を待ちます。~ "EACK"イベントが発生し、第一引数が0x00であれば、送信データが親機に受信された事を意味します。~ データ送信シーケンスが全て完了したところで、SKAppState.fsm.idleへ戻ります。~ ~ *CRONによる自動起動 [#x039a7b5] サンプルプログラムをCRONで自動起動される事でBBBをヘッドレスのエンドポイントとして活用出来ます。~ **SSHでBBBへ接続する [#yc867bc9] teratermなどでSSHを使ってBBB(192.168.7.2)へ接続する。~ [[参考>BeagleBone Blackの初期設定方法#g8ac7f15]]~ **CRONに設定ファイルを書き込む [#l8ca5320] $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を終了する。~ **再起動する [#z68b118d] 再起動すると自動的にサンプルプログラムが起動する。~ $reboot *参考リンク [#g1d5b1fb] **サンプルプログラム[#o09546ba] &ref(skdemo_bbb_v1_04_2017_0601.zip); **SK Cape(LoRa Cape)[#v645b63e] SK Capeは株式会社スカイリーネットワークスで販売しております。~ SK Cape基板の情報はこちらからダウンロード出来ます。~ &ref(SK-Cape board_20170601.zip); **SK920LR(LoRa Module)[#v379edf5] SK920LRは株式会社スカイリーネットワークスで販売しております。~ SK920LR用のインターフェース変換基板の情報はこちらからダウンロード出来ます。~ &ref(SK920LR-IF board_20180105.zip); **BeagleBone Black [#bae21ecf] https://beagleboard.org/black **Grove System [#q1b34e51] http://wiki.seeed.cc/Grove_System/ ***Temperature Sensor V1.2 [#t22b7073] http://wiki.seeed.cc/Grove-Temperature_Sensor_V1.2/ ***Moisture Sensor [#b62a03dc] http://wiki.seeed.cc/Grove-Moisture_Sensor/ ***Slide Potentiometer [#ec9d5bb1] http://wiki.seeed.cc/Grove-Slide_Potentiometer/ ***Grove Cape [#l688c8d2] http://wiki.seeed.cc/Grove_Cape_for_BeagleBone_Series/ **TeraTerm [#v1147722] https://ttssh2.osdn.jp/index.html.ja