【#2】入力編:ボタンが反応しているかを確認する

MicroPython

#1でLEDがちゃんと光ることは確認できました。
それでも「ボタンを押しても何も起きない」場合、次に疑うのは入力です。

このページでは、「ボタンが本当に反応しているか」を切り分けます。


まず確認したい前提

ここでは、すでに次のことができている前提で進めます。

  • GPIO15につないだLEDが、コードで確実に光る
  • LEDは「確認用インジケータ」として使える

もしここが怪しければ、先に#1 出力編を見直してください。


完成形をもう一度見る(ボタン → LED)

まずは「本来やりたい形」を確認します。
ボタンを押したらLEDが光る、という最終形です。

from machine import Pin
import time

led = Pin(15, Pin.OUT)
button = Pin(19, Pin.IN, Pin.PULL_UP)

while True:
    if button.value() == 0:   # 押されている
        led.value(1)
    else:
        led.value(0)

    time.sleep_ms(10)

このコードが動かない場合、
「ボタン入力が取れていない」可能性が高いです。


まずは「ボタンの状態」をそのままLEDで見る

いきなり if 文を疑う前に、
ボタンの状態を、そのままLEDに出してみます

これが、入力切り分けの基本です。

切り分け用コード(入力 → LED直結)

from machine import Pin
import time

led = Pin(15, Pin.OUT)
button = Pin(19, Pin.IN, Pin.PULL_UP)

while True:
    led.value(1 if button.value() == 0 else 0)  # 押したらLED ON(PULL_UPなので0/1を変換)
    time.sleep_ms(10)

※PULL_UPのときは「押していない=1 / 押している=0」なので、
上のコードでは押したときにLEDが光るように変換しています。


この状態で確認すること

  • ボタンを押していないとき、LEDはどうなるか
  • ボタンを押したとき、LEDはどう変わるか

ここで重要なのが、PULL_UPです。


PULL_UP を使うと、値はこうなる

今回の配線では、ボタン入力に Pin.PULL_UP を使っています。

  • ボタンを押していない → 1
  • ボタンを押している → 0

直感と逆なので、ここで混乱する人がとても多いです。

でも、これは間違いではありません。
仕様どおりの正常な動きです。


よくある「ボタンが反応しない」原因

  • PULL_UP を指定していない
  • 押したときの値を 1 だと思い込んでいる(※1
  • GND がボタンまで届いていない
  • ブレッドボードでボタンの向きが90度ずれている(※2

※1
筆者も最初ここで混乱しました。
「押したら1」ではなく、PULL_UPだと押したら0になります。
混乱を防ぐなら、0/1を直書きせず、定数(名前つき)にしてしまうのも手です。
詳しい例は、こちらの記事に載せています:ボタンの短押し・長押し・ダブルクリック判定(MicroPython)

(ソースコード抜粋)

※2
正しい向きであれば、 SWのon/offの切り替えで電流が流れる/流れないが切り替わりますが、90度向きが違うと、下図のケースだと常に電流が流れることになりSWの役割が果たせません。

特に最後の「ボタンの向き」は、初心者が必ず一度はハマります。


ここまで確認できたら

ボタンを押すとLEDの状態が変わるなら、
入力(ボタン)は問題ありません

それでも最終形が動かない場合、
次に疑うのは コードの判断・ロジックです。

次のページでは、
if文や条件分岐が思った通りに動かない原因を切り分けます。

焦らず、一段ずつ進めていきましょう。

目次:<電子工作が動かないとき>
前:【#1】出力編 / 次:【#3】判断・コード編

コメント