Raspberry Piでボタンを使った制御に慣れてきたら、
・長押しで連続的に変化させたい
・より実用的な操作を実装したい
・PWMと組み合わせた応用を学びたい
と感じることはありませんか?
本記事では、ボタンの長押しを検知して、
LEDの明るさを連続的に変化させる方法を解説します。
今回やること
・GPIO17 → LED(PWM出力)
・GPIO18 → ボタン(入力)
ボタンを押している間、LEDの明るさが徐々に変化します。
回路構成
■ LED(GPIO17)
GPIO17 → 抵抗 → LED(+)
LED(−)→ GND
■ ボタン(GPIO18)
GPIO18 → ボタン → GND
※gpiozeroでは内部プルアップが有効なため、
ボタン側に外部抵抗は不要です。
今回は以前の記事(Raspberry Pi 5でボタン入力してLEDを制御する方法)で構築した
環境をそのまま使用しています。
Pythonコード
ファイル名:button_long_press_pwm_led.py
from gpiozero import PWMLED, Button
from time import sleep
led = PWMLED(17)
button = Button(18)
brightness = 0.0
while True:
if button.is_pressed:
brightness += 0.01
if brightness > 1:
brightness = 0
led.value = brightness
sleep(0.01)
コードを書いたら、
Ctrl + O → 保存
Ctrl + X → 終了


コード解説
button.is_pressedを使用することで、
ボタンが押されている間の状態を取得できます。
押されている間だけbrightnessの値を増やし、
LEDの明るさを連続的に変化させています。
※brightnessは0〜1の範囲で制御しています。
whileループで高速に繰り返し処理を行っているため、
ボタンを押している間、brightnessの値が連続的に増加します。
※whileループで常に処理を行うため、
CPU負荷が増える点に注意してください。
※sleepを入れることで、明るさの変化速度を調整しています。
値が小さいほど速く変化します。
動作確認
ターミナルで以下を実行します。
sudo python3 button_long_press_pwm_led.py

ボタンを押し続けると、
・LEDが徐々に明るくなる
・最大値に達すると再び暗くなる
という動作になれば成功です。
※ボタンを離すと、その時点の明るさで固定されます。
※より滑らかに変化させたい場合は、
brightnessの増加量(0.01)を小さくすると調整できます。


短押しとの違い
短押し(when_pressed)は「押した瞬間」だけ反応しますが、
長押し(is_pressed)は「押している間ずっと」反応します。
よくある失敗
・sleepがないため高速すぎる
・brightnessが1を超えている
・GPIO番号の間違い
応用
・長押しで音量調整
・モータ速度制御
・押す長さで処理を変える
関連記事
まとめ
本記事では、ボタン長押しによってLEDの明るさを連続的に変化させる方法を解説しました。
・is_pressedで状態を取得
・PWMで連続制御
・より実用的な操作が可能
こちらの記事で使用しているRaspberry Pi 5 はこちら
▶ Amazonで詳細を見る
本記事では、こちらの電子工作キットを使用しています。
▶ OSOYOO(オソヨー) Raspberry Pi 用 学ぶ電子工作キット(Amazonへのリンク)
