スキップしてメイン コンテンツに移動

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(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




コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...