はじめに
LinuxでIoTデバイス開発をしていると、「LEDをこのパターンで点灯/消灯したい」という場合があります。
この記事ではその方法を記載します。
点灯/消灯
まず、対象のデバイスにどのようなLEDが定義されているかを確認しましょう。
下記コマンドを実行すると、以下のようにいくつかのディレクトリが表示されます。
$ ls /sys/class/leds/
alfa:blue:lan alfa:blue:wan alfa:blue:wps
alfa:blue:usb alfa:blue:wlan ath9k-phy0
このボードの場合は6つ表示されているので、6個のLEDが使用可能ということになります。
例としてLANを表すalfa:blue:lanを使用して説明していきます。
LANLEDという名前で定義しておきます。
LANLED="alfa:blue:lan"
以下のように記載することで、点灯できます。
echo "none" > "/sys/class/leds/$LANLED/trigger"
echo 255 > "/sys/class/leds/$LANLED/brightness"
同様に、下記で消灯です。
echo "none" > "/sys/class/leds/$LANLED/trigger"
echo 0 > "/sys/class/leds/$LANLED/brightness"
brightnessに書き込む値は、一般的には 0 が消灯で 1 以上が点灯です。
中間の明るさを表現できるLEDもありますが、私はあまりお目にかかったことはありません。
点滅
LEDを点滅させて欲しいという要求は割と多いものの、そのためだけにdaemonを起動するのはなるべく避けたいです。
IoTデバイスはリソースが限られるからです。
幸いなことにLinuxにはdaemonを用いずとも点滅させることができる仕組みがあります。
まず、下記コマンドでtriggerファイルに"timer"と書き込みます。
するとdelay_onとdelay_offというファイルが生えてきますので、これに対して点灯時間と消灯時間をmsec単位で書き込みます。
例えば1000msec点灯して500msec消灯するのを繰り返す場合は以下のように書き込みます。
echo "timer" > "/sys/class/leds/$LANLED/trigger"
echo 1000 > "/sys/class/leds/$LANLED/delay_on"
echo 500 > "/sys/class/leds/$LANLED/delay_off"
シェルで使う場合
OpenWrtの/lib/functions/leds.shに便利な関数が定義されているので、これを借用するのも手です。
led_set_attr() {
[ -f "/sys/class/leds/$1/$2" ] && echo "$3" > "/sys/class/leds/$1/$2"
}
led_timer() {
led_set_attr $1 "trigger" "timer"
led_set_attr $1 "delay_on" "$2"
led_set_attr $1 "delay_off" "$3"
}
led_on() {
led_set_attr $1 "trigger" "none"
led_set_attr $1 "brightness" 255
}
led_off() {
led_set_attr $1 "trigger" "none"
led_set_attr $1 "brightness" 0
}
例えば1000msec点灯して500msec消灯するのを繰り返す場合は以下のように書くだけでできます。
led_timer $LANLED 1000 500