Wireless Analog Terminal Bellを作った

Wireless Analog Terminal Bell

Analog Terminal Bell の動画にInspireされて、Wireless Analog Terminal Bell を作りました。

ターミナルで作業している時に何か間違えると、分かりやすく(物理的な)ベルが鳴ってお知らせしてくれます。

youtu.be

仕組み

端末へ出力されるのをPTYを中継するrubyプログラムが監視しており、ベル文字 "\a" ( "\x07" )が出てくるとHTTPリクエストを送信します。
これを受けて、M5Stick-C (バッテリー入りESP32として使っています) がソレノイドを動かし、ベルのハンマーを叩くことで音が鳴ります。

作り方

使ったもの

卓上ベル
小型ソレノイド 5V ROB-11015
MOSFET IRLU3410PBF
M5StickC

他にダイオードと適当な抵抗(1k〜10kΩくらい?)、安定動作のための大きめの電解コンデンサが必要です。

配線

こんな感じで配線します。(見にくいですが何となく察してください)

   M5Stick-C       FET  Diode   
 +-- BATT ---------------+-- Solenoid
 |   G26  -- 1kΩ -- G    ⊼     |
470uF               D ---+-----+
 +-- GND  --------- S

ソレノイドをうまくハンマーを押し出せる位置に、両面テープで固定します。
M5Stick-Cと回路はハンマーの邪魔にならないよう、ベルの台座の下にうまく納めます。

通電は一瞬*1とは言え、ソレノイドは結構な電流を消費するので、M5Stick-Cは十分充電しておく必要があります。

コード

使用したコードは以下にあります。

Wireless Analog Terminal Bell using M5Stick-C · GitHub

SSID等を設定してM5Stick-C にプログラムを書き込み、シリアルモニタでIPアドレスを確認します。
そして、pty-proxy.rb にそのアドレスを書き込み、Terminal上で起動します。

あとはベル文字を printf \\a 等で出力すれば、ベルが鳴ってくれるはず!

pty-proxy.rb について

pty-proxy.rb はPTYへの出力を拾ってそこからBELL文字を見つけたら削除した上でHTTPリクエストを送ります。
しかし、BELL文字だからとなんでも削除して良いわけではなく、エスケープシーケンスの一部を削除してしまうと無駄にベルがなったり端末の表示が崩れるかもしれません。
特に、OSC Mode というウィンドウタイトルなどを制御するエスケープシーケンスは終端に BELL文字を使っています。
そこで、エスケープシーケンス中かどうかを判定し、そうでない場合のみベルを鳴らすようにしています。

*1:私は50ms程度の通電でうまく鳴りました