技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Raspberry Pi 4 で LED + スイッチ点灯

基本から行くべきだよねってことでやってみた。
作ったのはこいつ

f:id:white-azalea:20210106201344j:plainf:id:white-azalea:20210106201333j:plain

スイッチで LED の On/Off するだけの実装です。

ラズパイの IO

これは公式に落ちているものを拝借する。

gpiozero.readthedocs.io

f:id:white-azalea:20210106202109p:plain

使用しているライブラリはこれなので、まずはこのレイアウトを印刷して横に置いときながら組み立てます。
実装は大きく分けて2つ。

  1. スイッチの入力を受け付ける実装
  2. LED のOnOff通電する実装

という2つを考えます。

スイッチ入力を受け付ける実装

回路図をきれいに書くツールとか持ってないので、そこんとこ宜しく

f:id:white-azalea:20210106204137p:plain

ということで、3.3V 出力(ピン番号1)から出力して、スイッチ→抵抗を挟んで GND に帰ります。
スイッチを入れたときに抵抗を挟むのは、ショート(短絡)するとラブパイぶっ壊れるかもしれんので…

で、途中から GPIO 27 に分岐してますが、これをプログラムで拾います。

LED の On/Off する実装

こっちはもっと楽

f:id:white-azalea:20210106205231p:plain

こっちは IO ポートから電流を流すか Off るかだけの制御なので、楽勝。
LED はコレ。

akizukidenshi.com

GPIO はデフォ 3.3V で、330Ω 抵抗なら 0.01A = 10mA 以下になると思われ。

コード実装: スイッチ押してる間だけ光る

といってもさして難しい事はしていません。

# GPIO と sleep 関数の読み込み
import RPi.GPIO as GPIO
from time import sleep

SWITCH_INPUT = 27  # スイッチ入力で使用するポート番号の指定
LED_OUT = 25             # LED 向け出力で利用するポート番号の指定

# GPIO の初期化
# GPIO.BOARD: 物理ピン番号(左上からの連番)
# GPIO.BCM: 役割ピン番号(broadcomが命名しているもの)今回はこっち採用
GPIO.setmode(GPIO.BCM)

# LED_OUT はあくまでアウトプット利用
GPIO.setup(LED_OUT, GPIO.OUT)

# Switch_input は入力用に IN 指定
GPIO.setup(SWITCH_INPUT, GPIO.IN)

try:
    # 無限ループ
    while True:

        # スイッチが High になったらLEDに給電
        if GPIO.input(SWITCH_INPUT) == GPIO.HIGH:
            GPIO.output(LED_OUT, GPIO.HIGH)

        # スイッチ押してない場合は、LED に給電しない
        else:
            GPIO.output(LED_OUT, GPIO.LOW)

        sleep(0.01)  # ループに休憩入れる(入れないとCPUがビジー状態になりえる)

except KeyboardInterrupt:
    # Ctrl+C で終了したときの処理。要するに終了命令やね
    pass

# 終了前にデバイス開放(しないと色々問題になる)
GPIO.cleanup()

コードよりコメント書くほうが疲れたわ(汗
わかりやすい感じですね

コード実装: スイッチの Toggle 実装

今度は、スイッチを押されたタイミングをイベントで拾う方法。
写真はこれで撮った

import RPi.GPIO as GPIO
from time import sleep

SWITCH_INPUT = 27
LED_OUT = 25


# LED の状態設定
isLedStateOn = False

# イベントコールバック
def switch_callback(channel):
    global ledState
    if channel == SWITCH_INPUT:
        isLedStateOn = not isLedStateOn
        if isLedStateOn:
            GPIO.output(LED_OUT, GPIO.HIGH)
        else:
            GPIO.output(LED_OUT, GPIO.LOW)


GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_OUT, GPIO.OUT, initial = GPIO.LOW)

# プルアップダウンの組み込み抵抗を設定できる。
# これを入れると、スイッチ側の抵抗と GND が不要になる(別に取らなくても良いといえば良い)
GPIO.setup(SWITCH_INPUT, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

# SWITCH_INPUT の入力が入った(GPIO.RISING Low -> High となった)ら、switch_callback を呼ぶべし。
# なお、物理的にはスイッチ変動の瞬間に On/Off が前後するので、一度イベントを検出したら、200ms は待機する
GPIO.add_event_detect(SWITCH_INPUT, GPIO.RISING, callback=switch_callback, bouncetime = 200) 

# イベント式に変わったので、ループ処理はあくまで終了まで待機する扱い
try:
    while True:
        sleep(0.01)
except KeyboardInterrupt:
    pass

GPIO.cleanup()