Node-REDからRaspberry PiのステータスLEDを操作する

# Raspberry PiのステータスLEDについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/1382d5c5-abca-8908-55fd-bdebc0f8f1a9.png)

Raspberry Pi の基板上には、電源LED(Zeroにはない)の他に緑色のSTATUS "ACT" LEDが搭載されており、GPIOで制御することができます。

参考: [Schematics https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md ](https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/README.md)

Raspbianデフォルトでは、mmc0(microSD)アクセス時に点灯するように設定されていて、ファイルアクセス時に点滅します。この設定は、sysfsに定義されている　```/sys/class/leds/led0``` に値を設定することで、設定変更できます。

設定できる値は、

```
none 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 cpu0 cpu1 cpu2 cpu3 default-on input panic [mmc0] mmc1 rfkill0 rfkill1 
```
であり、現在の値は```[]```で囲まれています。(デフォルトが```mmc0```です）
gpioを設定することで、GPIOポートから操作できるようになります。その際のポート番号は、```/sys/class/leds/led0/gpio```に設定したものになります。

# Node-REDから設定する

Node-REDで操作する場合、piユーザはroot権限を持ちますが、piユーザのままで ```/sys/class/leds/led0``` に書き込むことはできませんので、sudo して```tee```コマンドを使うことになります。GPIO 20(38ピン)に設定する場合は、以下のようなFlowになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/1366784c-6519-5172-d12b-95d6a96871ab.png)

```
[{"id":"5fc1cf3a.d659e","type":"exec","z":"d62ca71d.243728","command":"echo gpio  | sudo tee /sys/class/leds/led0/trigger","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":540,"y":80,"wires":[[],[],[]]},{"id":"11f2cb85.50b1f4","type":"inject","z":"d62ca71d.243728","name":"ボードLEDをGPIO20に","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":220,"y":80,"wires":[["5fc1cf3a.d659e","96405c80.8979a"]]},{"id":"74210ad3.0b1e24","type":"exec","z":"d62ca71d.243728","command":"echo 20 | sudo tee /sys/class/leds/led0/gpio","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":530,"y":160,"wires":[[],[],[]]},{"id":"96405c80.8979a","type":"delay","z":"d62ca71d.243728","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":270,"y":160,"wires":[["74210ad3.0b1e24"]]}]
```

（Node-REDの起動時に自動設定する場合は、以下のようにinjectノードの「Node-RED起動の0.1秒後以下を行う」にチェックを入れてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/f9825372-ffd4-5e7f-b34d-22c2a5be011d.png)

これで、rpi-gpioノード
[node-red-node-pi-gpio](https://flows.nodered.org/node/node-red-node-pi-gpio)を使ってLEDをON/OFFできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/e7a73cc5-9ca7-a6bc-3420-21a32a7743b4.png)

GPIO20を使う場合、rpi-gpio outノードの設定は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/899d04f0-60e0-9101-0dc7-bfff3111b265.png)

LEDとGPIOポートの割り当ては、設定Flowの下側のexecノードの```echo 20```の部分で変更できます。LEDに割り当てたポートは、GPIOで操作できなくなりますので注意してください。

# その他
rpi-gpioノードを使わず、直接```/sys/class/leds/led0/gpio```に値を書き込んでLEDを制御することもできます。

Raspberry Pi 2/3/4では、電源LED(赤色)も操作することができます。ステータスLEDと同様に ```/sys/class/leds/led1```へ設定しますが、設定を変更することでボードの稼働状態がわからなくなりますので、電源LEDは極力操作しないほうがいいのではないかと思います。