メインコンテンツへスキップ

LEDを消す方法

1. 即席でLEDを消す方法(コマンド)

raspi-gpio コマンドで消灯

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-gpiogpioset でLOW+入力モードに戻す

  • 今後はプログラム終了時にGPIOを解放する処理を入れる

  • 強制終了された場合は手動で消すしかない


このあと、もし使ってるライブラリが wiringPi ではなく pigpio や libgpiod なら、それに合わせた消灯コードも出せるけど、今使ってるのはどれ?
それによって「プログラム修正版」の書き方が少し変わる。