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均でいろいろ買ってきました。
鐘を吊ったりするのにやぐらが要るだろうと思ったので、割り箸と結束バンド(タイラップ?)で作りました。
目覚まし時計のベルがいい感じの(?)音だったので、これを鐘にしました。
やぐらの土台として割り箸をボンドで立てました。 また、鐘の中心にいい感じに穴があったので、割り箸を突っ込み、結束バンドで落ちないようにして、ボンドで固めました。
撞木をドライバーにすると、想像以上に音が出かかったので、ビニールテープで裏から押さえました。 自宅でやってるので、近所迷惑にならないか、ビクビクしながらやってます。。
ドライバーに、「ケーブルまとめるねじねじするやつ」を2つ付け、それぞれからビニール紐を伸ばし、サーボモータに付けました。 これが、割り箸でやると軽すぎて上手く当たらなかったり、1本の紐で吊るとくるくる回っちゃったりで、無駄に時間がかかりました。 ティッシュ箱2つ分の高さがいい感じだったので、その上にサーボモータを置いています。
そんなこんなで除夜の鐘が出来ました。
サーバサイド
サーバサイドはGitHubに全部上げちゃってるので、見て頂ければと。 後で、詰まった所とかは細々書く予定。 Heroku上で動いています。
その他環境周り
mac bookでは、ブラウザ上でustreamの配信を行っており、
マイク:ECM-PCV80U カメラ:UCAM-DLE300T
を使っています。
あと、実際に動かしてみると、動いている感が全く無かったので、時計を置いて動いてる感を出しています。
余談
ページ見てもらえば分かる通り、デザインとライティングの能力の無さを再確認しました。 誰か助けて。。。