0

WEB+DB Press vol.87でlittleBits/cloudBitについて書いた

数日前に発売されたWEB+DB Press vol.87で、littleBitscloudBitについて書きました。

WEB+DB PRESS Vol.87
WEB+DB PRESS Vol.87
posted with amazlet at 15.06.27
佐藤 鉄平 小林 明大 石村 真吾 坂上 卓史 上原 誠 鳥居 英 佐藤 歩 泉水 翔吾 うさみ けんた 伊藤 直也 高橋 侑久 佐藤 太一 hayajo 橋本 翔 西尾 泰和 中島 聡 はまちや2
技術評論社
売り上げランキング: 247

littleBitsは電子ブロックなんだけど、特殊なマグネットコネクタが使われているので回路が壊れるような向きには絶対接続できないようになっている。回路の知識が無くても大丈夫だし、酒飲みながら酔っ払って適当に接続してもショートしない。部品もセンサーとかモーターとか色々ある。

cloudBit

部品の中でもcloudBitというのは入出力がWebにつながっていて、HTTPで読み書きできるようになっている。IFTTTにもつながるので洗濯機の稼働が終わったことをサウンドトリガーセンサーで検知してSMSで通知するとか、色々な作例がインターネットに転がっている。

こういう風にするとWebからドアの鍵を回したりもできる。

cloudBit+door

記事では基本的なlittleBitsとcloudBitのAPIの使い方の解説と、HubotやYoと組み合わせた鍵貸し出しシステムについて書いた。
Hubotで「鍵あげる」「鍵返して」でゲストの鍵を管理し、DELTAS112(部屋名)にYoを送信すると開くというしくみ。


0

littleBits Arduino moduleをNode.jsやRubyから操作する

littleBitsArduinoモジュールをNodeから使うFirmataのラッパーを書いた。PCで動かしているNodeからlittlebitsを操作できる。

https://www.npmjs.com/package/littlebits-arduino
https://github.com/shokai/node-littlebits-arduino


littleBitsは専用のマグネットコネクタで接続する電子工作ツールキットで、このコネクタのおかげで部品が壊れるような向きには絶対接続できないようになっている。サーボモーターとLEDとスピーカーみたいな回路的に全然違う物も全部「output module」として組み換え可能になるようにモジュール化されていたりと、回路としては無駄は多いけどとてもソフトウェア的な考え方で作られていて面白い。回路わからない人でも適当につなげれば動くのはすごい。


インストール

% npm i littlebits-arduino


使い方


左側の3つが入力、右側が出力ポートになる。

d1やa0のようなポート名そのままのアクセサがあるので、読み取ったり代入したりすると操作できる。
なおarduino-firmata npmを単純にextendしただけなので、arduino-firmataのdigitalWriteやanalogRead等の関数もそのまま使える。

var LittleBitsArduino = require('littlebits-arduino');

var arduino = new LittleBitsArduino();
arduino.connect(); // use default Arduino
// arduino.connect('/dev/tty.usb-device-name');

arduino.on('connect', function(){
setInterval(function(){
var d0 = arduino.d0; // true or false
var a0 = arduino.a0; // 0~1023 analog input
var a1 = arduino.a1; // 0~1023 analog input

console.log([d0, a0, a1]);

arduino.d1 = d0; // digital output
arduino.d5 = a0/4; // 0~255 analog output
arduino.d9 = a1/4; // 0~255 analog output
}, 100);
});


Ruby用

Rubyでlittlebits操作するのはどうやるのかな、と思って検索したらlittle_bitsというgemがあって、node版ではこれのインタフェースを参考にさせてもらった。ほぼ同じ雰囲気で使える。

あと、中を見たらで自分が作ったarduino_firmata gemが使われていて、入力ポートを読むとか足りない機能があったのでプルリクしておいた。

0

cloudBitのHTTP APIをNode.jsで使う

littleBitsにはcloudBitという組み込みLinuxが入っててWiFiを積んでるブロックがある。最近日本でも発売された。

Amazon.co.jp | littleBits Cloud Starter Bundle | ホビー 通販


回路

こんな感じで左から
電源→sound trigger→dimmer→cloudBit→LEDやサーボ
のように接続すると、音に反応してcloudBitがwebhookを送ってくれる。また、こっちからHTTP POSTするとcloudBitから出力できて、LEDやサーボを動かしたりもできる。ようするにwebから使えるアナログ入出力ブロックだ。

sound triggerとcloudBitの間にdimmerを挟むと音の反応しきい値が調整しやすい。



tokenとdevice_id取得

littleBits Cloud Controlで新規プロジェクト登録して、tokenとdevice_idを取得する。

export LB_TOKEN=a1b2cdefghjiklasdf
export LB_DEVICE=98d76reb


出力


POSTするとcloudBitから電圧を0〜100で指定して出力できる。一定時間経つと出力は0に戻る。
request = require 'request'

little_out = (percent, duration, callback = ->) ->
request
method: 'POST'
url: "https://api-http.littlebitscloud.cc/devices/#{process.env.LB_DEVICE}/output"
headers:
Authorization: "Bearer #{process.env.LB_TOKEN}"
Accept: 'application/vnd.littlebits.v2+json'
postData:
percent: percent
duration_ms: duration
, callback

# 出力90で3000ミリ秒
little_out 90, 3000, (err, res, body) ->
console.error err
console.log body

littlebits-cloud-httpというnpmがあるけど勝手に標準出力になんか出してきたり、APIがなんか変だし実装も妙にまわりくどかったのでrequestでやった。


webhook設定


curl -i -XPOST \
-H "Authorization: Bearer $LB_TOKEN" \
-H "Accept: application/vnd.littlebits.v2+json" \
-d subscriber_id=http://example.com/littlebits \
-d publisher_id=$LB_DEVICE \
-d publisher_events=amplitude:delta:ignite \
https://api-http.littlebitscloud.cc/subscriptions
http://example.com/littlebitsにwebhookしてくる。subscriber_idに他のcloudBitのdevice_idを指定すると直接通信させる事もできるらしい。

amplitude:delta:igniteは電圧が上がった時に反応する。
BitCloud API Documentation

amplitude –––– when there is any voltage (catch-all, default)
amplitude:delta:sustain –––– when high voltage is constant (eg button being held)
amplitude:delta:ignite –––– when there is significant voltage jump (eg button press)
amplitude:delta:release –––– when there is significant voltage drop (eg button release)
amplitude:delta:nap –––– when low voltage is constant (eg idle bitSnap system)
amplitude:level:active –––– generic, when there is high voltage (eg during a sustain or maybe just ignited)
amplitude:level:idle –––– generic, when there is low voltage (eg during a long nap or maybe just released)



webhook受信


express = require 'express'
bodyParser = require 'body-parser'

router = express()
router.use bodyParser.json()

http = require('http').Server(router)

router.post '/littlebits', (req, res) ->
res.end 'ok'
console.log req.body
percent = req.body.payload.percent
console.log "percent: #{percent}"

http.listen 3000

1秒もかからずwebhookが来る。POSTのbodyはjsonで、こんな感じ
{ type: 'amplitude',
timestamp: 1429543559474,
user_id: 58158,
bit_id: '98d76reb',
payload: { percent: 85, delta: 'ignite' } }


hubotで受信して、部屋のわいわい感をチャットに流すとかできる。


webhook解除


DELETEで解除する
curl -i -XDELETE \
-H "Authorization: Bearer $LB_TOKEN" \
-H "Accept: application/vnd.littlebits.v2+json" \
-d subscriber_id=http://example.com/littlebits \
-d publisher_id=$LB_DEVICE \
https://api-http.littlebitscloud.cc/subscriptions


全デバイスの設定確認
curl -i -XGET \
-H "Authorization: Bearer $LB_TOKEN" \
-H "Accept: application/vnd.littlebits.v2+json" \
https://api-http.littlebitscloud.cc/devices