【#3】判断・コード編:if文が思った通りに動かない原因を切り分ける

MicroPython

#2で「入力(ボタン)」が取れていることは確認できました。
それでも動かないとき、次に疑うのは判断(if文)とコードの流れです。

このページでは、「ボタンは反応しているのにLEDが光らない」状態を、コード側から切り分けます。


まず確認したい前提

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

  • GPIO15のLEDが、コードで確実に光る(#1)
  • GPIO19のボタンが、押すと反応している(#2)

もしどちらかが怪しければ、先に#1/#2を見直してください。(リンクは公開後に追加でOK)


完成形(ボタン → 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:  # 押されている(PULL_UPなので0が押下)
        led.value(1)
    else:
        led.value(0)

    time.sleep_ms(10)

ここまで来て動かない場合、問題はだいたいこのどれかです。

  • if文の条件が、思っている条件になっていない
  • そもそもその行まで実行が来ていない
  • ループや待ちが重くて、反応していないように見えている

ここからは、「コードがどこまで動いているか」を見える化して切り分けます。


切り分けの基本:「どこまで来ているか」を出力する

コードの判断ミスは、目で見えません。
だから、シリアル出力(print)で見える化します。

まずは完成形に、次の2つだけ足します。

  • ループが回っているか分かるprint
  • if/elseのどっちに入ったか分かるprint

切り分け用コード(printで分岐を見える化)

from machine import Pin
import time

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

while True:
    v = button.value()
    print("button=", v)

    if v == 0:  # 押されている(PULL_UPなので0が押下)
        led.value(1)
        print("-> IF: LED ON")
    else:
        led.value(0)
        print("-> ELSE: LED OFF")

    time.sleep_ms(200)  # 10msだとログが流れすぎるので、いったん遅くする

このログが出れば、少なくともループは回っていると分かります。
そして、if/elseのどちらに入っているかも確認できます。


よくある「判断がズレる」3パターン

ここからは、初心者がハマりやすい「コード側のズレ」を3つ紹介します。
どれも、printを入れると気づきやすくなります。

パターン1:PULL_UPなのに「押したら1」だと思い込んでいる

PULL_UPでは「押していない=1 / 押している=0」です。
なので、条件をこう書くと逆になります。

# NG例(押したら1だと勘違い)
if button.value() == 1:
    led.value(1)

printで button= の値を見れば、押したときに0になっているので気づけます。

パターン2:ボタンがチャタリングして「押したつもり」が一瞬で消える

ボタンは物理部品なので、押した瞬間に0/1が細かく揺れます(チャタリング)。
高速に読むと「押したのに反応しない」ように見えることがあります。

まずは切り分けとして、押したら200ms待つだけでも改善するか確認できます。

if button.value() == 0:
    led.value(1)
    time.sleep_ms(200)  # 簡易デバウンス(切り分け用)

本格的なデバウンスは別記事でもOKですが、ここでは「原因の切り分け」が目的です。

パターン3:ループの中で重い処理をしていて、反応が遅れている

ループ内で長いsleepや重い処理(表示、通信、ファイル読み書きなど)をしていると、
ボタンを押してもすぐに反応しません

「押したのに何も起きない」ではなく、押してから数秒後に反応しているだけ、ということがあります。

まずはループを軽くして、反応が戻るかを確認してください。


ここまで確認できたら

printで button=0/1 が出ていて、if/elseにも入っている。
それでもLEDが光らない場合は、コードよりも出力(配線・LED・GPIO)側に戻って疑うのが近道です。

逆に、printがまったく出ていないなら、そのコードが実行されていない可能性が高いです。
たとえば次のような点を確認してください。

  • ファイルを保存したか(保存していないと内容が反映されない)
  • 実行しているファイルが合っているか(main.py / 開いているタブなど)
  • シリアル出力を見ている画面が合っているか(ThonnyのShellなど)

ここまで切り分けできれば、原因はかなり絞れます。
焦らず、順番にいきましょう。

目次:<電子工作が動かないとき>
前:【#2】入力編 / 戻る:目次へ戻る

コメント