IoTで除夜の鐘を作った話

正確には、除夜の鐘"っぽいもの"ですね。

http://www.bonno.xyz/ が完成した物です。

ぜひ、Twitterで #煩悩 付けて、今年やり残したこととかをつぶやいてください。

経緯

会社でラボスペースってのがありまして、週1でそこでIoTとか新しい技術について話をしています。 そこで、年末に向けて何かやりたいねー、という話が出て、除夜の鐘とか作ったら面白いんじゃね?となり、作ってみた感じです。

本題

物理的な部分は、鐘を目覚ましのベル部分、撞木をドライバーで作りました。

撞木を動かすのにサーボモータを利用して、それをArduinoで制御、それをmac book経由で遠隔操作する流れです。 (ホントは、raspberry piでやりたかったのですが、時間がなかったのでmacでやってたのをそのまま使っています。)

Arduino

Arduinoの方は単純で、シリアル通信を受け取ったら、サーボモータを回転→逆回転させます。

#include <Servo.h>
Servo myservo;  // create servo object to control a servo
int dir = 0; // -1: back, 0: stay, 1: ahead
int val = 0;
void setup() {
  pinMode(8, OUTPUT);
  myservo.attach(9);  // attaches the servo on pin 5 to the servo object 
  Serial.begin(9600); // some servos doesn't work without Serial
}
void loop() {
  int inputchar = Serial.read();
  if (inputchar != -1 ){
    Serial.write(inputchar);
    dir = 1;
  }
  if (dir == 1) {
    val += 4;
  } else if (dir == -1) {
    val -= 4;
  }
  if (val < 1) {
    dir = 0;
  }
  if (val >= 130) {
    dir = -1;
  }
  String valString = String(val);
  Serial.print(val);
  myservo.write(val);
  delay(16);
}

スケッチの書き方があまりよろしくない気はしています。とりあえず動いたからいいかなーと。

mac book上のArduino制御プログラム

こちらは、websocketによるイベントを受信すると、Arduinoにシリアル書き込みを実行します。

const client = require('socket.io-client');
const socket = client.connect('http://www.bonno.xyz');
// Serial setting
var SerialPort = require("serialport").SerialPort;
var serialPort = new SerialPort("/dev/cu.usbmodem14221", {
  baudrate: 14221
});
serialPort.on('open', function () {
  console.log('serial open');
});
socket.on('kane-wo-tsuke', function() {
  serialPort.write("1\n", function(err, results) {
    console.log('err ' + err);
    console.log('results ' + results);
  });
  
  setTimeout(function() {
    socket.emit('kane-wo-tsuita');
    console.log('kane-wo-tsuita emitted');
  }, 700);
});

websocketとシリアルポートの準備をしておき、websocket経由でkane-wo-tsukeを受信すると、"1\n"をシリアルポートに書き込む感じ。

サーボモータが行って返ってくるのに数百msecかかるので、それが大体終わったぐらいで、kane-wo-tsuitaをwebsocketサーバに送信します。 (実際には、それ以上にustreamが遅延しているので、意味ないですが。。。)

組み立て

100均でいろいろ買ってきました。

f:id:suzaku114:20151229120209j:plain

鐘を吊ったりするのにやぐらが要るだろうと思ったので、割り箸と結束バンド(タイラップ?)で作りました。

f:id:suzaku114:20151229141821j:plain

目覚まし時計のベルがいい感じの(?)音だったので、これを鐘にしました。

f:id:suzaku114:20151229141958j:plain

やぐらの土台として割り箸をボンドで立てました。 また、鐘の中心にいい感じに穴があったので、割り箸を突っ込み、結束バンドで落ちないようにして、ボンドで固めました。

f:id:suzaku114:20151229143455j:plain

撞木をドライバーにすると、想像以上に音が出かかったので、ビニールテープで裏から押さえました。 自宅でやってるので、近所迷惑にならないか、ビクビクしながらやってます。。

f:id:suzaku114:20151230153153j:plain

ドライバーに、「ケーブルまとめるねじねじするやつ」を2つ付け、それぞれからビニール紐を伸ばし、サーボモータに付けました。 これが、割り箸でやると軽すぎて上手く当たらなかったり、1本の紐で吊るとくるくる回っちゃったりで、無駄に時間がかかりました。 ティッシュ箱2つ分の高さがいい感じだったので、その上にサーボモータを置いています。

f:id:suzaku114:20151230160009j:plain

そんなこんなで除夜の鐘が出来ました。

サーバサイド

サーバサイドはGitHubに全部上げちゃってるので、見て頂ければと。 後で、詰まった所とかは細々書く予定。 Heroku上で動いています。

github.com

その他環境周り

mac bookでは、ブラウザ上でustreamの配信を行っており、

マイク:ECM-PCV80U カメラ:UCAM-DLE300T

を使っています。

あと、実際に動かしてみると、動いている感が全く無かったので、時計を置いて動いてる感を出しています。

余談

ページ見てもらえば分かる通り、デザインとライティングの能力の無さを再確認しました。 誰か助けて。。。