スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。
1.回路
GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。
【ソースコード】
# スイッチで LED を ON/OFF する簡単な例
# GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯
# GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用
#
# ※ 配線例
# LED のアノード → 1 kΩ 抵抗 → GPIO15
# LED のカソード → GND
# スイッチ片側 → GPIO16
# スイッチ反対側 → GND
#
# ★ 動作
# スイッチを押す(GPIO16 が LOW) → LED 点灯
# スイッチを離す(GPIO16 が HIGH) → LED 消灯
from machine import Pin # GPIO 制御ライブラリ
import utime # 時間関連(今回は使用しないが拡張用に読み込み)
led = Pin(15, Pin.OUT) # GPIO15 を出力モードに設定(LED 用)
sw = Pin(16, Pin.IN, Pin.PULL_UP) # GPIO16 を入力モード+内部プルアップ有効
while True:
if sw.value() == 1: # プルアップなので押していないときは 1
led.value(0) # LED を消灯
else: # 押したときは 0 になる
led.value(1) # LED を点灯
【実行結果】
🔁 チャタリングとは?
スイッチを押したときや離したときに、電気的に不安定な接点が何度もON/OFFを繰り返してしまう現象です。
これにより、1回押しただけなのにマイコン側では何度も押されたように誤認識してしまうことがあります。
🖼️ 図解:チャタリングの波形
スイッチを押したときの理想的な信号(プルアップ構成)
🧠 なぜ起きる?
物理的なスイッチは「カチッ」と入るように見えても、中の金属接点が一瞬で安定するわけではなく、ミリ秒単位でバネが跳ね返ったり接触したりを繰り返します。
これが電気的には ON/OFF の連続となって現れます。
💡 ソフトウェアでの対処法(例)
・10ms ごとにスイッチの状態を読み取る
・3回連続で同じ状態なら「チャタリングが収まった」と判断
・状態が変化した場合のみ処理を実行
→ これにより、スイッチ1回につき1回の動作に制限できます。
チャタリング処理をいれたソースコード
# ==============================================================
# Raspberry Pi Pico / MicroPython
# スイッチのチャタリング対策付き LED 制御
# --------------------------------------------------------------
# ■ ハード配線
# LED のアノード → 1 kΩ 抵抗 → GPIO15
# LED のカソード → GND
# スイッチ一方 → GPIO16
# スイッチ他方 → GND
#
# ■ 動作
# スイッチ押下 (LOW)→ LED 点灯
# スイッチリリース(HIGH)→ LED 消灯
#
# ■ チャタリング対策
# ・1 ms ごとにスイッチをサンプリング
# ・3 回連続で同じレベルになったら“確定値”とみなす
# ==============================================================
from machine import Pin
import time
# GPIO16をスイッチ入力用に設定(プルアップ有効)
switch = Pin(16, Pin.IN, Pin.PULL_UP)
# GPIO15をLED出力用に設定
led = Pin(15, Pin.OUT)
# スイッチの確定値、過去3回分の状態を保持
last_state = True # 前回確定値(初期はHIGH=押されていない)
sw1 = True # 現在のスイッチ状態
sw2 = True # 1回前のスイッチ状態
sw3 = True # 2回前のスイッチ状態
# 状態チェック用カウンタ(1ms × 10回 = 10ms周期で状態更新)
count = 0
# 現在の確定状態
now = True
while True:
time.sleep_ms(1) # 1ms間隔で状態をチェック
if count == 9: # 10回目(約10ms経過)で状態更新
count = 0
# 過去の状態をシフト
sw3 = sw2
sw2 = sw1
sw1 = bool(switch.value()) # 0/1 を True/False に変換
# 3回連続の値が同じなら確定値とする(チャタリング対策)
if sw3 == sw2 == sw1:
now = sw1
# 状態が前回と異なればLEDの状態を変更
if now != last_state:
if not now: # スイッチが押された(LOW)
led.on() # LED点灯
else: # スイッチが離された(HIGH)
led.off() # LED消灯
last_state = now
else:
count += 1
コメント
コメントを投稿