連載
» 2016年02月05日 09時00分 公開

Raspberry PiにAllJoynを移植して、IoTを自作する(10/10 ページ)

[橋本 尚(The Linux Foundation),MONOist]
前のページへ 1|2|3|4|5|6|7|8|9|10       

4.7.2 超音波センサーとの連携

 Js-raspに入っているjs-rasp/usonic.jsは超音波距離センサーを利用して、一定距離に侵入者がいた際、警告メッセージをネットワークの他のクライアントに送信し、Raspberry PiのLEDを点灯するものです。参考としてご紹介します。

photophoto 侵入検知のLED点灯
Nexusの画面 Nexusの画面

 こちらは他のクライアントと連携するため、今回移植した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) ;
usonic.js

4.7.3 raspbianの下のコードについて。

 AllSeenから提供されているalljoyn-jsは、汎用に作られているため、GPIOをシミュレーションしています。具体的には、GPIOのOn/Off/入出力をGUIで制御するようになっています(ソース中のsimioの下のモジュール)。今回は筆者がラズパイ用に、GPIOを制御するモジュールを作成して、用意しています。

 本稿では解説しませんが、興味ある方は読んでみてください。一部未完成の部分もありますし、まだバグもあると思います。修正して公開してくださると、幸いです。また、他のボードに移植して公開すると、喜ぶ人が多いと思います。

4.8 最後に

 AllSeen Allianceは企業を中心とした組織ですが、ソースが全てオープンになっており、個人でも開発に参加できるスタイルです。メーリングリストも公開(特にallseen-core)されていますので参加をお待ちしています。2016年2月5日には、本内容をベースにしたミートアップも実施の予定です(第2回AllJoyn Tokyo Meetup)

 次回は、Ubuntu上にStandard Clientを構築し、他Clientと連携するための手順を説明する予定です。例題をベースに、いろいろなセンサーの出力を元に、他の機器と連携するクライアントをRaspberry Pi上で書けるようになります。

前のページへ 1|2|3|4|5|6|7|8|9|10       

Copyright © ITmedia, Inc. All Rights Reserved.