りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

Raspberry Pi基板上のLEDを光らせて機体を確認する + Lチカ

f:id:ibuquicallig:20191207153305p:plain

この記事ではRaspberry Piの基板上の赤色と緑色のLEDを付けたり消したりする方法ついて解説しています。

複数台のRaspberry Piが密集していたり、接続しているRaspberry PiがどれかわからなくなったときにLEDを任意のタイミングで光らせることによって判断することができるので便利です!

この記事でできること

  • Raspberry Piの基板上のLEDを光らせる。
  • triggerを設定して光るタイミングを制御する。

作業

とりあえずON/OFFしてみる

まずはコマンドラインからLEDがON/OFFできるのか試してみましょう。

/sys/class/leds/というディレクトリ内にled0/led1/というディレクトリがあります。Raspbianのバージョンによってはled1/が存在していない場合もあります。

led0/内のファイルを操作すると、緑色のLEDを操作することができます。今回はコチラをメインにあれこれしていきます。led1/のほうは赤色のLEDのほうを操作することができるのですが、コチラは電源がONになっているか確認するために(個人的には)必要なのでそのままにしておきます。

LEDを操作するためのファイルをいじるためにはそのままだと管理者権限が必要になるので、su -でrootユーザーになります。

$ su -
# cd /sys/class/leds/led0
# ls -l
-rw-rw-rw- 1 root root brightness
lrwxrwxrwx 1 root root device -> ../../../leds
-r--r--r-- 1 root root max_brightness
drwxr-xr-x 2 root root power
lrwxrwxrwx 1 root root subsystem -> ../../../../../class/leds
-rw-rw-rw- 1 root root trigger
-rw-r--r-- 1 root root uevent

今回触るファイルはbrightnesstriggerというファイルです。

以下のコマンドを実行することで、LEDを常時点灯させることができます。

# echo 1 > brightness

点灯しない場合は、echo 0 > brightnessを一度実行してから再度1で実行してみてください。brightnessが0だと常時消灯1 - 255の値だと点灯となります。それ以外の文字列などを書き込もうとするとエラーとなります。

消すときは繰り返しになりますが、以下のコマンドで常時点灯にすることができます。

echo 0 > brightness

ただ、このままだと今までSDカードのアクセス時にピカピカしていたLEDがずっと消えたままになってしまいます!元の設定に戻すために次はtriggerを設定します。

triggerを設定して光らせる

まずは中身を見てみます。

# cat trigger
[none] rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic mmc1 mmc0 rfkill-any rfkill0 rfkill1

設定することのできるトリガーの一覧が表示されます。[]で囲まれている設定が現在適用されているものです。echo 0 > brightnessすると自動的にnone(光らせない)に設定されます。

他の設定値の意味はおおむね以下のようになっています。

設定値 LEDが光るタイミング
kbd-scrolllock ScrollLock押下
kbd-numlock NumLock押下
kbd-capslock CapsLock押下
kbd-kanalock KanaLock押下(?)
kbd-shiftlock ShiftLock押下(?)
kbd-altgrlock AltGrave押下(?)
kbd-ctrllock Ctrl押下
kbd-altlock Alt押下
kbd-shiftllock 左Shift押下
kbd-shiftrlock 右シフト押下
kbd-ctrlllock 左Ctrl押下
kbd-ctrlrlock 右Ctrl押下
timer 1秒起きに点滅
oneshot 1回だけ短く点灯
heartbeat 心拍のように点滅
backlight 常時点灯
gpio GPIOピンの特定ピンを検知して点灯(?)
cpu CPU使用時
default-on 常時点灯
input キー入力時に点滅
panic カーネルパニック発生時に点滅
mmc0 SDカード書込み時に点灯
mmc1 (2番目のSDカード書込み時に点灯)
rfkill0 WiFi動作時に点滅
rfkill1 Bluetooth動作時に点滅

以下より引用し和訳。一部省略・修正・追記。 https://raspberrypi.stackexchange.com/questions/69674/are-there-other-act-led-trigger-options-besides-mmc-and-heartbeat

のようになっているようです。太字にしている箇所は使えそうだと感じる設定です。

デフォルトではmmc0がオンになっているのでSDカードの読み書き時に点滅するようになっています。

設定値を変更するには以下のコマンドを実行します。

# echo timer > trigger

とすることでtimerに設定され、LEDが1秒起きに点滅します。triggerの設定値の場合も上記以外の値(cat triggerで表示されるもの以外の値)を設定しようとするとエラーとなります。

もともとの設定に戻すにはmmc0を設定してあげます。

# echo mmc0 > trigger

これで元に戻りました。apt-get updateなど書込みが発生するコマンドを実行してみて確認してください。

これらの管理者しか書き込み権限を持っていないファイルへリダイレクトで追記するときは普通に echo 1 > brightness としても権限拒否されますので、sudo sh -c "echo 1 > brightness" とすることで回避できます。

権限を変更する

いちいち管理者権限で実行するのも面倒なので、このbrightnesstriggerファイルを普通のユーザーでも読み書きできるように設定します。

以下のコマンドを実行して権限を追加します。

# chmod 666 brightness trigger

これで普通のユーザーでもLEDを操作することができるようになります。

$ echo timer > /sys/class/leds/led0/trigger
# LEDが点滅する
$ echo mmc0 > /sys/class/leds/led0/trigger
# 元に戻す

参考

triggerで指定できる値と効果について