LEDを消す方法
1. 即席でLEDを消す方法(コマンド)
① raspi-gpio
pinctrl コマンドで消灯
wiringPiや低レベルGPIOを使った場合でも、OS標準のraspi-gpio
で強制的にピン状態を変えられる。
# 例: GPIO17(物理ピン11)をLOWにして消灯
sudo pinctrl set 17 dl
# その後、入力に戻して解放
sudo pinctrl set 17 ip
dl
= drive low, ip
= input mode
「LOWにしたまま」より「入力に戻す」方が安全
② gpioset
(libgpiod系)で消灯
Bookworm(2023年秋以降のRaspberry Pi OS)など新しい環境はlibgpiodが標準。
# 例: GPIO17をLOWにしてすぐ解放
sudo gpioset gpiochip0 17=0 -m exit
-m exit を付けないとLOWのまま保持されるので注意。
③ Pythonワンライナーで消灯
もしPython3が入っていれば、すぐ消せる。
python3 - <<'EOF'
import RPi.GPIO as GPIO
pin = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
GPIO.cleanup()
EOF
2. そもそも点きっぱなしにならないようにする方法(プログラム修正)
基本方針
終了処理で必ず消灯GPIOピンを入力モードに戻す or ライブラリの終了関数を呼ぶCtrl+CやSIGTERMを捕まえて終了処理を走らせる
C言語 + wiringPi の例
#include <wiringPi.h>
#include <signal.h>
#include <stdlib.h>
#define LED 0 // wiringPiのピン番号(例: GPIO17)
void cleanup(int sig) {
digitalWrite(LED, LOW); // 消灯
pinMode(LED, INPUT); // 入力に戻す
exit(0);
}
int main(void) {
wiringPiSetup();
pinMode(LED, OUTPUT);
signal(SIGINT, cleanup); // Ctrl+C
signal(SIGTERM, cleanup); // kill コマンド
while (1) {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
}
これならターミナル閉じた場合でも、kill(SIGTERM)やCtrl+C(SIGINT)が入った瞬間に消灯して終了できる。
3. 強制終了(SIGKILL)対策はできない
kill -9(SIGKILL)はプログラムに処理させる余地がないので、その場合は上の即席コマンドで消灯するしかない。
✅ まとめ
今すぐ消すならraspi-gpioやgpiosetでLOW+入力モードに戻す今後はプログラム終了時にGPIOを解放する処理を入れる強制終了された場合は手動で消すしかない
このあと、もし使ってるライブラリが wiringPi ではなく pigpio や libgpiod なら、それに合わせた消灯コードも出せるけど、今使ってるのはどれ?それによって「プログラム修正版」の書き方が少し変わる。