Edisonのボタン押下をイベントで取得してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

センサーでボタンと連動しようとすると、弊社中村の記事で書いたようなサンプルが出てくることが多いと思います。

[Edison]ボタンでLEDを点灯させる[mraa] | Developers.IO

setInterval(function(){
    var buttonValue = button.read();
    if(buttonValue === 0) {
     console.log("off");
     led.write(0);
    } else {
     console.log("on");
     led.write(1);
    }
},1000);

せっかくnode.jsなのだからsetIntervalで回すのではなくイベント駆動でできないかなと、
探していたところ以下のライブラリでイベント駆動でできそうです。

Cylon.js - JavaScript framework for robotics, physical computing, and the Internet of Things using Node.js

今回のサンプルは、上記のライブラリを用いてLEDをイベント駆動で光らせると言った内容になります。

実装

D2にボタンモジュールをつなぎます

IMAG0389

光らせるLEDはボードに付いているのを用います。

今回のサンプルはXDKで作成しました。

package.json

{
  "name": "hoge",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cylon": "^0.21.2",
    "cylon-firmata": "^0.18.0",
    "cylon-intel-iot": "^0.4.0"
  }
}

main.js

var Cylon = require('cylon');
var turnOn = true;
Cylon
  .robot()
  .connection('edison', { adaptor: 'intel-iot' })
  .device('led', { driver: 'led', pin: 13, connection: 'edison' })
  .device('touch', { driver: 'button', pin: 2, connection: 'edison' })
  .on('ready', function(my) {
    my.touch.on('push', function() {
        if(!turnOn){
            my.led.turnOn();
            console.log('push on');
        }else{
            my.led.turnOff();
            console.log('push off');
        }
        turnOn = !turnOn;
    });
  });
Cylon.start();

setIntervalではなく、touchのイベントでLEDを点滅させていることがわかるかと思います。

実行

今回npmモジュールを追加しているので、パッケージのインストールを行わせる必要があります。

XDK内のハンマーのアイコンを押下することでパッケージのインストールが行われます。

Intel®_XDK_IoT_Edition

その後、プログラムを動かすことで、スイッチ押下でLEDの状態が変わることが確認できるかと思います。

まとめ

Cylonを用いることでボタンモジュールの押下をイベントで取得することができました。

他にもイベントがありそうなので、調べてみたいと思います。

参考サイト

Cylon.js - Tutorials