USB卓上時鐘


はじめに

旅行をしていた時に遠くのお寺から鐘の音が聞こえてきて,自宅にも時を知らせる鐘があると良いかもしれないと思い作成しました.完成したのは下の写真のような装置で,サーボモーターでハンマーを動かします.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')

ファームウェア等


[戻る]
2019-08-28 ページ作成
(2019-06 制作)
T. Nakagawa