2014年2月23日日曜日

Bacon.jsとArduino

最近、Arduinoで遊んでいたのですが、センサ処理がReacive Programmingというやつと相性が良さそうなので、Bacon.jsを試してみました。

前提条件

  1. Arduinoのアナログ入力0に可変抵抗を接続
  2. Arduinoのデジタル入出力3をPWMにし、LEDを接続
  3. Arduinoと中継するWebSocketサーバ
(ソース - GitHub)


アナログ入力0の値をWeb画面に出力してみます。
var server = new WebSocket("ws://localhost:3000");
analogIn = Bacon.fromEventTarget(server, "message").map(function(e) {
 return JSON.parse(e.data);
}).filter(function(m) {
 return (m.type == "ANALOG_IN");
}).filter(function(m) {
 return (m.pin == 0);
}).map(function(m) {
 return m.value;
});

analogIn.assign($("#ain"), "text");

アナログ出力0の値をPWMに出力。
var pwmAIn = analogIn.map(function(v) {
 return Math.floor(v / 1024 * 256);
}).skipDuplicates(function(o, n) {
 return (Math.abs(o - n) <= 1); 
});

var pwm = pwmAIn.filter(function(v) {
 return ((v >= 0) && (v < 256));
});

pwm.onValue(function(v) {
 var msg = {
  type  : "PWM_OUT",
  pin   : 3,
  value : v
 }
 server.send(JSON.stringify(msg));
});
可変抵抗でLEDの明るさを調整できるようになりました。

こんな書き方も。
server.pwmout = function(v) {
 var msg = {
  type  : "PWM_OUT",
  pin   : 3,
  value : v
 }
 this.send(JSON.stringify(msg));
};

pwm.assign(server, "pwmout");

Web画面からPWM出力を設定できるようにしてみます。
var pwmTIn = $("#tin").asEventStream("keyup").map(function(e) {
 return $(event.currentTarget).val();
});

var pwm = pwmAIn.merge(pwmTIn).filter(function(v) {
 return ((v >= 0) && (v < 256));
});
pwmはすでにPWM出力に接続しているのでEventStreamをmergeするだけです。

0 件のコメント:

コメントを投稿