Js-raspに入っているjs-rasp/usonic.jsは超音波距離センサーを利用して、一定距離に侵入者がいた際、警告メッセージをネットワークの他のクライアントに送信し、Raspberry PiのLEDを点灯するものです。参考としてご紹介します。
こちらは他のクライアントと連携するため、今回移植したalljoyn-jsだけでは、動作しません。他にStandard Clientや、その上に実際に連携するクライアントが必要になります(Standard Clientについては、次回に説明したいと思います)。このスクリプトは、実際に2015年のOSC京都(8月)とOSC東京(10月)に展示しました。
以下はusonic.jsの簡単な解説です(/ /内は解説)。なお、超音波距離センサー用スクリプト(/usr/local/sbin/usonic.py)は、@arkouji氏によるこちらのページを参考にしました。
var AJ = require('AllJoyn'); /AllJoynを使うときの決まり文句です/ var IO = require('IO'); /同上/ // No need to check var far = 50.0 ; /監視する範囲を定義/ // need to notify var bound = 10.0 ; /監視する範囲を定義/ // Call distcheck 10000ms interval var inter = 1 * 1000 ; /下で作成する関数の呼び出し間隔/ // GPIO 5 assigned to pin 29 var led = IO.digitalOut(IO.pin[29]); /LEDを付けたRaspberry PiのPINを出力モードに設定する/ print(IO.pin[29].info.description, ",", IO.pin[29].functions) ; // var blinky = setInterval(function(){led.toggle();}, 10); // //Force the device name AJ.store("DeviceName", "Usonic Sensor"); AJ.store("Manufacturer", "QCE"); AJ.store("Description", "Detection of Invading System via Usonic Sensor"); //Create interface for remote interaction /所属するネットワークへ、送るメッセージを定義する/ AJ.interfaceDefinition['org.example.usonic'] = { redDuty: { type:AJ.SIGNAL, description:'Somebody is entering'}, greenDuty: { type:AJ.SIGNAL, description:'Nobody is here:'}, blink: { type:AJ.SIGNAL, description:'Somebody is coming' } }; AJ.objectDefinition['/usonic'] = { interfaces:['org.example.usonic'] }; /実際にメッセージを送信するルーティン/ function sendEvent(whatEvent) { var sig = AJ.signal('/usonic', whatEvent); //This makes it as a true Event so a session is not required sig.sessionless = true; sig.timeToLive = 60; //60 seconds sig.send(); } function distcheck() { var distance = parseFloat(IO.system('/usr/local/bin/usonic.py')) ; led.level = 0 ; print("distance =", distance) ; if( distance > bound && distance < far) { print("Somebody near") ; sendEvent({blink:'org.example.usonic'}); // AJ.notification(AJ.notification.Warning, "Somebody near").send(100) ; led.level = 0 ; } else if(distance <= bound) { print("Somebody enter") ; sendEvent({redDuty:'org.example.usonic'}); // AJ.notification(AJ.notification.Emergency, "Somebody enter").send(100) ; led.level = 1 ; } else { print("Nobody near") ; sendEvent({greenDuty:'org.example.usonic'}); // AJ.notification(AJ.notification.Info, "Nobody enter").send(100) ; led.level = 0 ; } } setInterval(distcheck, inter) ;
AllSeenから提供されているalljoyn-jsは、汎用に作られているため、GPIOをシミュレーションしています。具体的には、GPIOのOn/Off/入出力をGUIで制御するようになっています(ソース中のsimioの下のモジュール)。今回は筆者がラズパイ用に、GPIOを制御するモジュールを作成して、用意しています。
本稿では解説しませんが、興味ある方は読んでみてください。一部未完成の部分もありますし、まだバグもあると思います。修正して公開してくださると、幸いです。また、他のボードに移植して公開すると、喜ぶ人が多いと思います。
AllSeen Allianceは企業を中心とした組織ですが、ソースが全てオープンになっており、個人でも開発に参加できるスタイルです。メーリングリストも公開(特にallseen-core)されていますので参加をお待ちしています。2016年2月5日には、本内容をベースにしたミートアップも実施の予定です(第2回AllJoyn Tokyo Meetup)。
次回は、Ubuntu上にStandard Clientを構築し、他Clientと連携するための手順を説明する予定です。例題をベースに、いろいろなセンサーの出力を元に、他の機器と連携するクライアントをRaspberry Pi上で書けるようになります。
Copyright © ITmedia, Inc. All Rights Reserved.