led デバイスノードは奥が深い
FreeBSD Advent Calendar 2023 一日目の記事で最後に Raspberry Pi Zero W のオンボードの LED を点滅させてみました。
オンボードの LED は /dev/led/ACT デバイスノードに対して
# echo 1 > /dev/led/ACT (点灯)
# echo 0 > /dev/led/ACT (消灯)
という形で使用しました。
しかしこの led デバイスノードは実は奥が深く、もっと複雑な指定をすることが可能です。led デバイスノードは Raspberry Pi 以外の環境でも使えたりします。以下の説明は led デバイスノードが見えていれば他の環境でも同様ですのでデバイスノードが生えてたら試してみてください。
詳しい使い方は man 4 led に書いてありますが、かいつまんで紹介してみます。
具体的な点滅指定法
例えば、
# echo f1 > /dev/led/ACT
と指定すると、1/10 = 0.1 秒でLEDが点滅するようになります。
この f1 を f2 とすると 2/10 = 0.2 秒、f5とすると 5/10 = 0.5 秒というふうに数字の分だけ点滅間隔が長くなります。
無限に繰り返されるので、停止する場合は
echo 0 > /dev/led/ACT
とすれば消灯します。
さらに複雑なパターンの点滅は、文字列で指定します。
echo s(A-Ja-jのアルファベット)
というふうに s から始まる文字列を指定すると、1/10 秒単位で点灯と消灯のパターンを複雑に指定することができます。
大文字 A-J はそれぞれ 1/10 秒間〜 10/10=1 秒間の点灯を指示します。小文字は逆に消灯です。
なので、
echo sCaJe > /dev/led/ACT
と指定すると
C=3/10秒点灯 a=1/10秒消灯 J=10/10秒点灯 e=5/10秒消灯
を繰り返します。
モールス信号出力
さらに
echo 'm(モールス符号)' > /dev/led/ACT
で、モールス符号形式を指定することで、LEDでモールス信号を出力することができます。モールス信号は、いにしえの無線や船舶の信号灯などで使用された例の「トンツー」通信です。
"." が短い点滅、 " _ " が長い点滅("."の三倍)で、この2つの符号の組み合わせでアルファベット(A = ._ B= _...)等を表現します。和文モールスもありますが led(4)では対応していません。
これを使えば文字列をモールス信号化できるわけですが、そのためには文字列をモールス符号に変換する必要があります。無線ガチ勢のように符号を覚えている人は楽勝でしょうが、私のように一個も覚えてないような人間にはむずかしいです。
ところが、FreeBSD には標準で /usr/bin/morse という英文をモールス符号に変換してくれるコマンドが存在します。-l オプションを渡せば led デバイスノードが解釈できる m〜 形式の文字列を作成できます。
# echo "Merry Christmas" | morse -l
m-- . .-. .-. -.--
-.-. .... .-. .. ... - -- .- ...
実際にコマンドでモールス信号をLEDに出力する動画です。Raspberry Pi Zero 2 W をシリアルコンソール接続でコマンド実行しています。
モールス信号わかるならエラーメッセージをモールス信号にすれば画面無しでトラブル状況がわかるなんで使い方ができるかもしれません。
と、まぁここまでやってなんですが、モールス良くわからん勢なので、ちゃんと読める信号が出ているのかよくわからんです...。