第6章 スイッチ入力とポーリング
この章の目的
Section titled “この章の目的”この章では、タクトスイッチの状態をPico Wへ入力し、 プログラムから繰り返し読み取ります。
第5章で使用したGP15の外付けLEDは配線したままにします。 GP14へタクトスイッチを追加し、 スイッチを押している間だけLEDを点灯させます。
プログラムが一定間隔で入力を確認する方法をポーリングと呼びます。 第7章では同じ配線を使い、割り込みによる処理と比較します。
この章でできるようになること
Section titled “この章でできるようになること”- デジタル入力の
1と0を説明できる - タクトスイッチの端子の組を確認できる
- GP14を内部プルアップ付きの入力として準備できる
value()でスイッチの状態を読み取れる- 離していると
1、押すと0になる理由を説明できる - ポーリングが入力を繰り返し確認する方法であると説明できる
- スイッチの状態に合わせてGP15のLEDを制御できる
使用するもの
Section titled “使用するもの”| 分類 | 使用するもの | 数量 |
|---|---|---|
| 制御用ボード | ピンヘッダー実装済みのRaspberry Pi Pico WまたはPico WH | 1 |
| 配線 | ブレッドボード | 1 |
| 入力部品 | 一般的な4端子タクトスイッチ | 1 |
| 出力回路 | 第5章で配線した赤色LEDと330Ω抵抗 | 1組 |
| 配線 | ジャンパーワイヤー | 2本程度 |
| PC接続 | データ通信対応Micro USBケーブル | 1 |
開始時は、第5章の外付けLED回路が動作する状態とします。
安全上の注意
Section titled “安全上の注意”- 配線を追加・変更するときは、Pico WからUSBケーブルを外します
- GP14へ5Vの信号を入力しません
- スイッチの端子の組を確認してから配線します
- GP14と3.3V端子またはGNDを、ジャンパーワイヤーだけで直接つなぎません
- 第5章のLEDには、引き続き330Ω抵抗を直列に使用します
- 配線後は講師または接続表による確認を行ってからUSB接続します
6-1 デジタル入力とは
Section titled “6-1 デジタル入力とは”GPIOを入力として使用すると、
端子の電圧を1または0として読み取れます。
| 入力値 | 呼び方 | 端子の状態 |
|---|---|---|
1 | HIGH | 約3.3V |
0 | LOW | 約0V |
この章では、タクトスイッチを次の状態として読み取ります。
| スイッチ | GP14の入力値 | プログラムでの扱い |
|---|---|---|
| 離している | 1 | 押されていない |
| 押している | 0 | 押されている |
押したときに0になることは、最初は直感と反対に感じるかもしれません。
これは、後で説明する内部プルアップを使用するためです。
6-2 タクトスイッチの端子を確認する
Section titled “6-2 タクトスイッチの端子を確認する”一般的な4端子タクトスイッチは、 同じ組の2端子が内部で常につながっています。 ボタンを押すと、2つの組の間がつながります。
| 状態 | Aの組 | Bの組 | AとBの間 |
|---|---|---|---|
| 離している | 組の中で接続 | 組の中で接続 | 接続されない |
| 押している | 組の中で接続 | 組の中で接続 | 接続される |
同じ組の端子だけをGP14とGNDへ接続すると、 ボタンを押しても状態が変わりません。 GP14とGNDは、異なる端子の組へ接続します。
タクトスイッチの形状や端子配置は製品によって異なる場合があります。 不明な場合は、製品資料またはテスターの導通確認で端子の組を確認します。
6-3 内部プルアップを使用する
Section titled “6-3 内部プルアップを使用する”入力端子をどこにも接続していない状態では、 入力値が安定しないことがあります。 この状態を浮いているまたはフローティングと呼びます。
この章では、Pico Wの内部プルアップ抵抗を使用します。
switch = Pin(14, Pin.IN, Pin.PULL_UP)主な指定を確認します。
| 記述 | 意味 |
|---|---|
14 | GP14を使用する |
Pin.IN | GPIOを入力として使用する |
Pin.PULL_UP | 内部の抵抗で入力をHIGH側へ保つ |
スイッチを離しているときは、内部プルアップによってGP14が1になります。
スイッチを押すとGP14とGNDがつながり、入力が0になります。
6-4 スイッチを配線する
Section titled “6-4 スイッチを配線する”第5章のLED回路を残したまま、次の接続を追加します。
| 接続元 | 接続先 | 補足 |
|---|---|---|
Pico WのGP14 | タクトスイッチのAの組 | GP14は物理ピン19 |
| タクトスイッチのBの組 | Pico WのGND | 第5章と同じ物理ピン18のGNDを共用 |
第5章から残す接続は次のとおりです。
| 接続元 | 接続先 |
|---|---|
Pico WのGP15 | 330Ω抵抗 |
| 330Ω抵抗 | LEDのアノード |
| LEDのカソード | 物理ピン18のGND |
図6-1 GP14のスイッチ入力とGP15のLED出力
次の順番で配線します。
- Pico WからUSBケーブルを外します
- 第5章のLED回路を接続表と照合します
- タクトスイッチをブレッドボードの中央の溝をまたぐ向きで挿します
- スイッチの端子の組を確認します
GP14とスイッチの一方の組を接続します- スイッチの反対の組と物理ピン18の
GNDを接続します - GP14、GP15、GNDの物理ピン番号を再確認します
- 講師の確認後、USBケーブルを接続します
6-5 スイッチの入力値を確認する
Section titled “6-5 スイッチの入力値を確認する”次のプログラムをch06_01_switch_value.pyとしてPC側へ保存し、実行します。
from machine import Pinimport time
SWITCH_PIN = 14
switch = Pin(SWITCH_PIN, Pin.IN, Pin.PULL_UP)
while True: value = switch.value() print("入力値:", value) time.sleep(0.2)スイッチを離した状態と押した状態で、Shellの表示を確認します。
入力値: 1入力値: 1入力値: 0入力値: 0入力値: 1プログラムは、次の処理を繰り返しています。
switch.value()でGP14の入力値を読む- Shellへ入力値を表示する
- 0.2秒待つ
- 先頭へ戻り、もう一度入力値を読む
このように、プログラムが一定間隔で対象の状態を確認する方法が ポーリングです。
while Trueを使用しているため、プログラムは自動では終了しません。
確認が終わったら、Thonnyの停止操作で実行を止めます。
6-6 スイッチでLEDを制御する
Section titled “6-6 スイッチでLEDを制御する”次のプログラムをch06_02_switch_led_polling.pyとしてPC側へ保存し、実行します。
from machine import Pinimport time
SWITCH_PIN = 14LED_PIN = 15
switch = Pin(SWITCH_PIN, Pin.IN, Pin.PULL_UP)led = Pin(LED_PIN, Pin.OUT)led.off()
while True: pressed = switch.value() == 0
if pressed: led.on() else: led.off()
time.sleep(0.02)スイッチを押している間だけ外付けLEDが点灯し、 離すと消灯すれば成功です。
入力値から状態を判断する
Section titled “入力値から状態を判断する”pressed = switch.value() == 0この行では、入力値が0と等しいかを比較しています。
| 入力値 | 比較結果 | pressed |
|---|---|---|
0 | 0 == 0 | True |
1 | 1 == 0 | False |
pressedがTrueならLEDを点灯し、
FalseならLEDを消灯します。
time.sleep(0.02)このプログラムは、約0.02秒ごとにスイッチを確認します。 確認間隔を短くすると反応は速くなりますが、 その分だけ確認回数が増えます。
確認間隔を長くすると、短い操作を見落とすことがあります。 ポーリングでは、必要な反応速度と他の処理とのバランスを考えて 確認間隔を決めます。
6-7 プログラム全体の動きを確認する
Section titled “6-7 プログラム全体の動きを確認する”図6-2 スイッチ入力を確認し続けるポーリングの流れ
ポーリング版では、スイッチを操作していない間も 「読む、判断する、待つ」を繰り返します。
プログラム全体の中心はwhile Trueです。
スイッチがプログラムを直接呼び出しているわけではありません。
プログラム側から、スイッチの状態を何度も確認しています。
6-8 チャタリング
Section titled “6-8 チャタリング”機械式スイッチの接点は、1回押したときでも、 ごく短い時間にオンとオフを繰り返すことがあります。 この現象をチャタリングと呼びます。
この章では、LEDを押している間だけ点灯させるため、 細かな揺れが目立たない場合があります。 一方、押した回数を数えるプログラムでは、 1回の操作を複数回と判断する原因になります。
第7章で割り込みを扱うときは、 チャタリングによる短時間の連続反応にも注意します。
変更してみる
Section titled “変更してみる”スイッチでLEDを制御できたら、確認間隔を変更します。
time.sleep(0.02)をtime.sleep(0.5)へ変更する- プログラムを実行する
- スイッチを短く押し、反応の違いを確認する
- 確認後、
time.sleep(0.02)へ戻す
確認間隔が長いと、押してから反応するまで遅れたり、 短い操作を見落としたりすることがあります。
- タクトスイッチの異なる端子の組へGP14とGNDを接続できる
- スイッチを離すと
1、押すと0になることを確認できる -
Pin.INとPin.PULL_UPの役割を説明できる -
switch.value()で入力値を読み取れる - スイッチを押している間だけ外付けLEDを点灯できる
- ポーリングが入力を繰り返し確認する方法であると説明できる
- 確認間隔を長くしたときの反応の違いを確認できる
よくある問題と確認方法
Section titled “よくある問題と確認方法”| 状況 | 主な確認箇所 |
|---|---|
入力値が常に1 | GP14とスイッチ、スイッチとGND、端子の組 |
入力値が常に0 | スイッチの挿す向き、GP14とGNDが同じ端子列で直結していないか |
| 押していないのに値が変わる | Pin.PULL_UPの指定、ジャンパーワイヤーの接触 |
| 内蔵LEDが反応する | Pin("LED")ではなくPin(15, Pin.OUT)を使用しているか |
| 外付けLEDが点灯しない | 第5章のGP15、330Ω抵抗、LEDの向き、GND |
| 反応が遅い | time.sleep()の値 |
| 停止後もLEDが点灯している | スイッチを離してから再実行するか、Shellからled.off()を実行 |
配線を確認するときは、先にUSBケーブルを外します。 原因が分からないまま別の電源端子へ接続しません。
- GPIOを入力として使用すると、端子の状態を
1または0で読み取れます - GP14は
Pin(14, Pin.IN, Pin.PULL_UP)で内部プルアップ付きの入力にします - この回路では、スイッチを離すと
1、押すと0になります - タクトスイッチは、異なる端子の組へGP14とGNDを接続します
value()で入力値を読み取ります- ポーリングは、プログラム側から入力を繰り返し確認する方法です
- ポーリングの確認間隔が長いと、短い操作を見落とすことがあります
- 機械式スイッチでは、チャタリングによる短時間の状態変化が発生します
- MicroPython公式「machine.Pin」(v1.26.0)
- MicroPython公式「RP2クイックリファレンス」(v1.26.0)
- Raspberry Pi公式「Raspberry Pi Pico W Datasheet」(PDF)
次の第7章では、同じタクトスイッチとLEDの配線を使い、 割り込みによってスイッチ操作を検出します。 ポーリング版と割り込み版で、プログラム全体の動きを比較します。