Skip to content

第6章 スイッチ入力とポーリング

この章では、タクトスイッチの状態をPico Wへ入力し、 プログラムから繰り返し読み取ります。

第5章で使用したGP15の外付けLEDは配線したままにします。 GP14へタクトスイッチを追加し、 スイッチを押している間だけLEDを点灯させます。

プログラムが一定間隔で入力を確認する方法をポーリングと呼びます。 第7章では同じ配線を使い、割り込みによる処理と比較します。

この章でできるようになること

Section titled “この章でできるようになること”
  • デジタル入力の10を説明できる
  • タクトスイッチの端子の組を確認できる
  • GP14を内部プルアップ付きの入力として準備できる
  • value()でスイッチの状態を読み取れる
  • 離していると1、押すと0になる理由を説明できる
  • ポーリングが入力を繰り返し確認する方法であると説明できる
  • スイッチの状態に合わせてGP15のLEDを制御できる
分類使用するもの数量
制御用ボードピンヘッダー実装済みのRaspberry Pi Pico WまたはPico WH1
配線ブレッドボード1
入力部品一般的な4端子タクトスイッチ1
出力回路第5章で配線した赤色LEDと330Ω抵抗1組
配線ジャンパーワイヤー2本程度
PC接続データ通信対応Micro USBケーブル1

開始時は、第5章の外付けLED回路が動作する状態とします。

  • 配線を追加・変更するときは、Pico WからUSBケーブルを外します
  • GP14へ5Vの信号を入力しません
  • スイッチの端子の組を確認してから配線します
  • GP14と3.3V端子またはGNDを、ジャンパーワイヤーだけで直接つなぎません
  • 第5章のLEDには、引き続き330Ω抵抗を直列に使用します
  • 配線後は講師または接続表による確認を行ってからUSB接続します

GPIOを入力として使用すると、 端子の電圧を1または0として読み取れます。

入力値呼び方端子の状態
1HIGH約3.3V
0LOW約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)

主な指定を確認します。

記述意味
14GP14を使用する
Pin.INGPIOを入力として使用する
Pin.PULL_UP内部の抵抗で入力をHIGH側へ保つ

スイッチを離しているときは、内部プルアップによってGP14が1になります。 スイッチを押すとGP14とGNDがつながり、入力が0になります。

第5章のLED回路を残したまま、次の接続を追加します。

接続元接続先補足
Pico WのGP14タクトスイッチのAの組GP14は物理ピン19
タクトスイッチのBの組Pico WのGND第5章と同じ物理ピン18のGNDを共用

第5章から残す接続は次のとおりです。

接続元接続先
Pico WのGP15330Ω抵抗
330Ω抵抗LEDのアノード
LEDのカソード物理ピン18のGND

左側に4端子タクトスイッチの2組の内部接続を示す。右側にPico WのGP14からスイッチを経由してGNDへ接続する入力回路と、GP15から330Ω抵抗とLEDを経由してGNDへ接続する出力回路を示す。GP14には内部プルアップがあり、スイッチを離すと1、押すと0になる。

図6-1 GP14のスイッチ入力とGP15のLED出力

次の順番で配線します。

  1. Pico WからUSBケーブルを外します
  2. 第5章のLED回路を接続表と照合します
  3. タクトスイッチをブレッドボードの中央の溝をまたぐ向きで挿します
  4. スイッチの端子の組を確認します
  5. GP14とスイッチの一方の組を接続します
  6. スイッチの反対の組と物理ピン18のGNDを接続します
  7. GP14、GP15、GNDの物理ピン番号を再確認します
  8. 講師の確認後、USBケーブルを接続します

6-5 スイッチの入力値を確認する

Section titled “6-5 スイッチの入力値を確認する”

次のプログラムをch06_01_switch_value.pyとしてPC側へ保存し、実行します。

ch06_01_switch_value.py
from machine import Pin
import 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

プログラムは、次の処理を繰り返しています。

  1. switch.value()でGP14の入力値を読む
  2. Shellへ入力値を表示する
  3. 0.2秒待つ
  4. 先頭へ戻り、もう一度入力値を読む

このように、プログラムが一定間隔で対象の状態を確認する方法が ポーリングです。

while Trueを使用しているため、プログラムは自動では終了しません。 確認が終わったら、Thonnyの停止操作で実行を止めます。

次のプログラムをch06_02_switch_led_polling.pyとしてPC側へ保存し、実行します。

ch06_02_switch_led_polling.py
from machine import Pin
import time
SWITCH_PIN = 14
LED_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が点灯し、 離すと消灯すれば成功です。

pressed = switch.value() == 0

この行では、入力値が0と等しいかを比較しています。

入力値比較結果pressed
00 == 0True
11 == 0False

pressedTrueならLEDを点灯し、 FalseならLEDを消灯します。

time.sleep(0.02)

このプログラムは、約0.02秒ごとにスイッチを確認します。 確認間隔を短くすると反応は速くなりますが、 その分だけ確認回数が増えます。

確認間隔を長くすると、短い操作を見落とすことがあります。 ポーリングでは、必要な反応速度と他の処理とのバランスを考えて 確認間隔を決めます。

6-7 プログラム全体の動きを確認する

Section titled “6-7 プログラム全体の動きを確認する”

ポーリング開始後、GP14の入力値を読み、押されているかを判断し、押されていればGP15のLEDを点灯、離されていれば消灯する。その後0.02秒待ち、再び入力値の読み取りへ戻る流れを示す。

図6-2 スイッチ入力を確認し続けるポーリングの流れ

ポーリング版では、スイッチを操作していない間も 「読む、判断する、待つ」を繰り返します。

プログラム全体の中心はwhile Trueです。 スイッチがプログラムを直接呼び出しているわけではありません。 プログラム側から、スイッチの状態を何度も確認しています。

機械式スイッチの接点は、1回押したときでも、 ごく短い時間にオンとオフを繰り返すことがあります。 この現象をチャタリングと呼びます。

この章では、LEDを押している間だけ点灯させるため、 細かな揺れが目立たない場合があります。 一方、押した回数を数えるプログラムでは、 1回の操作を複数回と判断する原因になります。

第7章で割り込みを扱うときは、 チャタリングによる短時間の連続反応にも注意します。

スイッチでLEDを制御できたら、確認間隔を変更します。

  1. time.sleep(0.02)time.sleep(0.5)へ変更する
  2. プログラムを実行する
  3. スイッチを短く押し、反応の違いを確認する
  4. 確認後、time.sleep(0.02)へ戻す

確認間隔が長いと、押してから反応するまで遅れたり、 短い操作を見落としたりすることがあります。

  • タクトスイッチの異なる端子の組へGP14とGNDを接続できる
  • スイッチを離すと1、押すと0になることを確認できる
  • Pin.INPin.PULL_UPの役割を説明できる
  • switch.value()で入力値を読み取れる
  • スイッチを押している間だけ外付けLEDを点灯できる
  • ポーリングが入力を繰り返し確認する方法であると説明できる
  • 確認間隔を長くしたときの反応の違いを確認できる
状況主な確認箇所
入力値が常に1GP14とスイッチ、スイッチと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()で入力値を読み取ります
  • ポーリングは、プログラム側から入力を繰り返し確認する方法です
  • ポーリングの確認間隔が長いと、短い操作を見落とすことがあります
  • 機械式スイッチでは、チャタリングによる短時間の状態変化が発生します

次の第7章では、同じタクトスイッチとLEDの配線を使い、 割り込みによってスイッチ操作を検出します。 ポーリング版と割り込み版で、プログラム全体の動きを比較します。