基本から行くべきだよねってことでやってみた。
作ったのはこいつ
スイッチで LED の On/Off するだけの実装です。
ラズパイの IO
これは公式に落ちているものを拝借する。
使用しているライブラリはこれなので、まずはこのレイアウトを印刷して横に置いときながら組み立てます。
実装は大きく分けて2つ。
- スイッチの入力を受け付ける実装
- LED のOnOff通電する実装
という2つを考えます。
スイッチ入力を受け付ける実装
回路図をきれいに書くツールとか持ってないので、そこんとこ宜しく
ということで、3.3V 出力(ピン番号1)から出力して、スイッチ→抵抗を挟んで GND に帰ります。
スイッチを入れたときに抵抗を挟むのは、ショート(短絡)するとラブパイぶっ壊れるかもしれんので…
で、途中から GPIO 27 に分岐してますが、これをプログラムで拾います。
LED の On/Off する実装
こっちはもっと楽
こっちは IO ポートから電流を流すか Off るかだけの制御なので、楽勝。
LED はコレ。
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()