前回はLEDの光らせ方を学びました。
今回はスイッチを使った入力制御について学んでゆきます。

デジタル入力とは
「デジタル」とは、0(オフ)と1(オン)という2つの状態しか使わない信号のことです。
たとえば電気の世界では、こうなります:
状態 | 説明 | 電圧の目安(Pico Wの場合) |
---|---|---|
1(HIGH) | 電気が来ている | 約 3.3V |
0(LOW) | 電気が来ていない | 約 0V |
デジタル入力とは、外部のスイッチやセンサなどからの信号を、マイコンが読み取る機能です。
スイッチをGPIOピンに接続すると、マイコンは以下のように反応します:
スイッチの状態 | マイコンの読み取り値 | 処理の例 |
---|---|---|
押していない | 0 (LOW) | 何もしない |
押した | 1 (HIGH) | LEDを光らせる |
マイコンはこの**「押された(1)」「押されていない(0)」**という信号をもとに、LEDを光らせたりモーターを動かしたりします。
スイッチの接続
スイッチを押したときに、HIGH(3.3V)がマイコンに入力されるように配線します。
下の図のようにスイッチをつないでみましょう。

スイッチを3.3Vとマイコンの入力ピンの間に繋ぐだけで良さそうですが、実際には上記の図のように10kΩ程度の抵抗が必要になります。
これをプルダウン抵抗といいます。
この抵抗が無いと、スイッチを押していない間、マイコンの端子がどこにも接続されていない状態になります。
それを防ぐためにこの抵抗が必要となります。
上記の回路はボタンを押したときにHIGHになる繋ぎかたの為、アクティブHIGHのつなぎ方といいます。
一方でスイッチを押したときにLowになるつなぎ方はアクティブLOWといい、以下のような回路図になります。

この際に使用される抵抗をプルアップ抵抗といいます。
プログラム上の設定
Raspberry Pi Pico Wでは、Pin
クラスを使ってピンを入力モードに設定します。
from machine import Pin
button = Pin(14, Pin.IN) # GPIO14を入力モードで使用
実際に読取りを検出するには以下の構文を使います。
if button.value() == 1:
print("ボタンが押されました")
Raspberry Pi Pico Wでは内部でプルアップ抵抗、プルダウン抵抗を設定する事も出来ます。
button = Pin(14, Pin.IN, Pin.PULL_DOWN)
button = Pin(14, Pin.IN, Pin.PULL_UP)
例題:
それではボタンが押されるとボタンが押されましたとシリアルモニタに表示されるプログラムと回路を作ってみましょう。
from machine import Pin
import time
# GPIO14を入力モードで設定
button = Pin(14, Pin.IN)
while True:
if button.value() == 1: # ボタンが押されるとHIGHになる
print("ボタンが押されました")
time.sleep(0.3) # 表示の連打を防ぐためのディレイ

課題3
スイッチを押している間、LEDが点灯する回路を作成せよ。
LEDとスイッチはそれぞれ2つ以上使う事。

解答例はこちら
from machine import Pin
import time
# 2つのLEDとスイッチをそれぞれ定義
led1 = Pin(15, Pin.OUT)
led2 = Pin(12, Pin.OUT)
button1 = Pin(14, Pin.IN, Pin.PULL_DOWN)
button2 = Pin(13, Pin.IN, Pin.PULL_DOWN)
while True:
if button1.value() == 1:
led1.value(1)
else:
led1.value(0)
if button2.value() == 1:
led2.value(1)
else:
led2.value(0)
time.sleep(0.01)
課題4
ボタンを押したときに1秒だけLEDが光る回路を作成せよ。
ボタンを長押ししても1回と判断し、1秒間点灯。

ヒント
スイッチの状態を監視する中で、前回と今回のスイッチの状態を比較し、LOWからHIGHになった時だけ反応させます。
解答例はこちら
from machine import Pin
import time
# ピンの設定
led = Pin(15, Pin.OUT) # GPIO15 に接続したLED
button = Pin(14, Pin.IN) # GPIO14 に接続したスイッチ(外部プルダウン想定)
prev = 0 # 前回のスイッチ状態(初期は未押下)
while True:
current = button.value() # 今のボタンの状態を取得
# 0 → 1 に変化した瞬間(=押した瞬間)を検出
if prev == 0 and current == 1:
led.value(1) # LED点灯
time.sleep(1) # 1秒だけ待つ
led.value(0) # LED消灯
prev = current # 今の状態を次回の比較用に保存
time.sleep(0.01) # CPU負荷とチャタリング防止のため少し待つ
課題5
2つのボタンを使って、LEDを制御せよ。
- ボタンA(GPIO14)を押すたびにLEDのON/OFFを切り替える(トグル動作)
- ボタンB(GPIO13)を押すと強制的にLEDをOFFにする
LEDの状態は記憶され、トグルによってON/OFFを切り替えられるようにしてください。

解答例はこちら
from machine import Pin
import time
# LEDとボタンの設定
led = Pin(15, Pin.OUT)
button_toggle = Pin(14, Pin.IN, Pin.PULL_DOWN)
button_reset = Pin(13, Pin.IN, Pin.PULL_DOWN)
# 状態管理用の変数
led_state = 0
prev_toggle = 0
prev_reset = 0
while True:
# 現在のボタン状態を取得
current_toggle = button_toggle.value()
current_reset = button_reset.value()
# トグルボタンが「押された瞬間(立ち上がり)」を検出
if prev_toggle == 0 and current_toggle == 1:
led_state = 1 - led_state # ON→OFF、OFF→ON を切り替える
# リセットボタンが押された瞬間を検出
if prev_reset == 0 and current_reset == 1:
led_state = 0 # 強制OFF
# LEDの状態に応じて出力
led.value(led_state)
# 状態を記録
prev_toggle = current_toggle
prev_reset = current_reset
time.sleep(0.01) # デバウンスと負荷軽減
次回はこちら