スマホのセンサーを使って遠くにあるTesselのLEDを光らせる

Posted: / Tags: Tessel



スマートフォンがいろいろなセンサーを内蔵していることはよく知られていることかと思います。スマートフォンのセンサーデータは、ブラウザのAPIで簡単に取り出せます。

これらのセンサーを使えば、マイコンボードを買わなくても簡単にIoTのプロトタイピングが出来ます。

前回のTesselの記事では、ブラウザ上のチャットに書き込みがあったら、TesselのLEDを光らせるといった「Web→実世界」のやりとりを実装しました。

そこで今回は、スマートフォンのセンサーを使って、よりIoTっぽく「実世界→実世界」のやり取りを簡単に実装してみます。

※アイデア自体は以下の発表を参考にしています(@_sgtnさんありがとうございます!)

仕組み

スマートフォンの加速度センサーを使ってスマートフォンの揺れの度合いを見て、その度合いによって点灯時間を変化させます。

必要な機材

必要な機材は以下で、Raspberry Piのように周辺機器は必要ありません。

  • Tessel
  • MicroUSBケーブル
  • 作業用パソコン
  • スマートフォン(Android、iOSどちらでも)

実装方法

実装方法はとても簡単です。

スマホ側のコード

スマートフォンの加速度を取得して、Milkcocoaのデータストアにsend()で送ります。加速度の取得には、devicemotionというイベントを使用します。

上記のソースコードでは、動作確認のためフォーク元に書いてあった傾き具合をenchant.jsで表示するコードも含まれているので、以下に、Milkocoaに関係するコードだけ抜き出しました。

※Milkcocoaに登録していない方は、Milkcocoaで登録をして、アプリの管理画面のapp_idを控えておいてください。

accel-pub.js
// app_idの部分は、Milkcocoaに(無料)登録してアプリを作成した際に生成されるアプリ固有の文字列です。
var milkcocoa = new MilkCocoa("app_id.mlkcca.com");

window.onload = function(){
  // 700msおきにMilkcocoaにsend()
  window.setInterval(sendToMilkcocoa, 700);

  var queue = [];
  // エンキュー
  function enqueue(t) {
    if(queue.length < 3) queue.push(t);
  }

  function sendToMilkcocoa(){
    // デキュー
    var n = queue.shift();
    if(n) {
      milkcocoa.dataStore('accel').send({t : Math.floor(n)});
      // window.document.getElementById('debug').textContent = Math.floor(n);
    }
  }

  window.addEventListener('devicemotion', function(e){

    // x,y,zの加速度を取得
    var x = e.acceleration.x;
    var y = e.acceleration.y;
    var z = e.acceleration.z;

    // 変化量
    var t = (x - prev.x)*(x - prev.x)+(y - prev.y)*(y - prev.y) +(z - prev.z) *(z - prev.z);
    t = Math.sqrt(t);

    console.log(t);
    // 揺らして値を見てみた感じ、3より大きかったら揺れたと判断してよさそう
    if(t > 3) enqueue(t);

    prev.x = x;
    prev.y = y;
    prev.z = z;

  }, true);
};

基本的に、devicemotionaddEventListener()して、e.acceleration.xなどで取得するだけです。他に色々やっているのは、正しく動きを検知するための処理で、もっと正確にすることも出来ると思います。

※スマホで常駐しておきたい場合は、JavaScriptではなくネイティブアプリで書く必要があります

Tessel側のコード

on()send()で送られてきたデータを元にLEDの点灯時間を変えます。

milkcocoa-tesseltessel-ledTesselのLEDを操るモジュール)をインストールしておいてください。

$ npm i milkcocoa-tessel
$ npm i tessel-led
accel-sub.js
var tessel = require('tessel');
var MilkCocoa = require('milkcocoa-tessel');
var led = require('tessel-led');

// app_idはスマートフォン側と同じものを使います。
var milkcocoa = new MilkCocoa("app_id.mlkcca.com", {useSSL: false});

milkcocoa.dataStore('accel').on('send', function(sended){

  /* 3 < sended.value.t < 20 くらいの範囲なので
   * 適当に50倍くらいを点灯時間に設定
   * 500msを超えたら、500msにする
   */
  var duration = (duration > 500) ? 500 : sended.value.t * 50;

  // led.flash(times, duration, delay, callback);
  led[1].flash(1, duration, 0, function(){
    console.log('blink '+duration+'ms!');
  });
});

実際に動かしてみた

ちゃんと動くのか試してみました。

凄く見にくいですが、私(左で動いているもの)が動くと青いLEDが光って、止まるとLEDが消えているのがわかるかと思います。

遠隔でもちゃんと動いているのがわかるかと思います。

スマートフォンで簡単プロトタイピング

このように、スマートフォンを使うと、簡単にIoTのプロトタイピングができます。加速度の他にも、照度センサーや近接センサーもあるので、色々出来ますね。

またスマートフォンはWebのAPIでバイブレーションを操作できるので、センサーとしてだけでなくアクチュエーターとしても使えます。例えば、Tesselで取得したセンサーデータがあるしきい値を超えたら、スマートフォンを振動させるといったことができます。

スマートフォンだけでも十分プロトタイピングが出来るので、試してみることをお勧めします。