旅行をしていた時に遠くのお寺から鐘の音が聞こえてきて,自宅にも時を知らせる鐘があると良いかもしれないと思い作成しました.完成したのは下の写真のような装置で,サーボモーターでハンマーを動かします.USBで常時稼働のLinuxサーバーに接続してcronで1時間ごとに鐘を撞きます.
まず一番重要なのは小さい鐘の入手ですが,金壽堂というところの小梵鐘をネットオークションで入手しました.こちらの会社の風鈴を以前から使っていてとても音色が良かったのでこれを選びました.ただし思っていたよりもやや場所をとるのでもう少し小さいものにすればよかったと思います.鐘を収める鐘楼も作りたかったのですが大きくなりすぎるので諦めました.鐘を鳴らすしくみは,サーボモーター(MG90S)で木槌を振って鳴らすことにしました.もっとシンプルにソレノイドで直接鐘を撞く方法も考えましたがストロークがかなり短いのでやめました.AVRの8bit PWMでサーボモーターを駆動すると角度の分解能が低くて,音の大きさの調整が少し面倒でした.
AVRのATTiny2313とV-USBを使い,PCとの通信とサーボモーターの制御を行っています.電源はUSBからの給電で,サーボモーターは未使用時はFETで電源をオフにします.
コントローラーのケースと,木槌をサーボモーターに固定する部品は3Dプリンターで作成しました.
USBはHIDデバイスとしたのでLinuxの場合ドライバ等は不要で'/bin/echo -n -e "\x00\x16\x14\x15\x7a\x84\x1e\x35\x0c" > /dev/hidraw0'のように実行すれば鐘を撞けます.ここで16進数の部分がPCから送る信号で,(1)木槌を振りかぶり,(2)鐘を撞き,(3)スタンバイ位置に戻す,という3つの状態についてサーボモーターの角度とその時間を指定するプロトコルになっています.以下のようなPythonスクリプトで調整を行いました.#!/usr/bin/python3 import ctypes import hid NEUTRAL = 21 SCALE = 1.0 / (16.0e6 / 1024) angle1 = NEUTRAL + 1 angle2 = NEUTRAL - 1 angle3 = NEUTRAL time1 = int(0.5 / SCALE) time2 = int(0.2 / SCALE) time3 = int(2.0 / SCALE) // 256 dev = hid.Device(vid=0x16c0, pid=0x05df) req = ctypes.create_string_buffer(9) req[0] = 0x00 req[1] = angle1 req[2] = angle2 req[3] = angle3 req[4] = time3 req[5] = time1 % 256 req[6] = time1 // 256 req[7] = time2 % 256 req[8] = time2 // 256 dev.send_feature_report(req) rep = dev.get_feature_report(0, 9) print('/bin/echo -n -e "' + ''.join(['\\x%02x' % int(x[0]) for x in req]) + '" > /dev/hidraw0')