初めてのボタン操作実装Raspberry Pi Picoで「ボタンを押すとLEDが光る」を作ろう

MicroPython

「Lチカはできたけど、次に何をしたらいいの?」
Pico初心者が必ずぶつかるのが“ボタン入力”です。押したはずなのに反応しない、
LEDが消えない……そんな経験、ありませんか?

この記事では、そんな不安を解消するために
「ボタンを押すとLEDが光る」仕組みをやさしく丁寧に解説します。

ピコさん
ピコさん
初心者さんでも大丈夫!ボタン入力はラズパイピコの基礎なので、一緒にステップアップしてみましょう♪

完成イメージ

まずはゴールイメージをつかみましょう。ボタンを押すとLEDが点灯し、離すと消灯するシンプルな仕組みを体験します。ボタンとLEDだけでゲームの開始ボタンや確認ボタンなどの基礎が作れます。

ピコさん
ピコさん
完成形をイメージするとモチベーションが上がるね!ボタンとLEDだけでも楽しい仕掛けが作れるよ。

この記事でできること(目的とゴール)

  • ボタン入力の読み取り – PicoのGPIOをMicroPythonで入力として使う方法を学びます。
  • LEDの制御 – LEDを点灯・消灯させる基本制御を体験します。
  • 内部プルアップ抵抗の利用 – 内蔵抵抗を有効にして安定した入力検出を行います。
  • リファクタリング手法 – 初期化とメインループを分け、読みやすく拡張しやすいコードに改善します。
  • 番外:内部プルアップを使わない場合の配線とコードを比較し、仕組みを理解します。

この記事を読み終えれば、Picoでのボタン入力とLED制御の基礎をしっかり身につけられます。

ピコさん
ピコさん
やることが分かると安心だね♪ 初めてでもこのゴールなら楽しく学べるはずだよ!

準備:必要な道具・環境

実際に手を動かす前に、必要なパーツや環境を整えましょう。ここでは、初心者でも手に入れやすい部品と環境設定を紹介します。

パーツ一覧

品名役割
Raspberry Pi Pico Wマイコン本体
Micro USBケーブルPicoとの接続・電源供給
ブレッドボード配線を簡単に組める
ジャンパワイヤ(オス-オス)部品同士の接続
LED(赤・黄・緑)好きな色のLED
抵抗(220〜330Ω ×3)LED保護用。電流を制限する
タクトスイッチ(ボタン)押下入力
外付け抵抗(10kΩ)内部プルアップを使わない場合のプルアップ用
5.1kΩ〜10kΩ

動作環境(筆者の検証環境)

  • PC:MacBook Air (M1, macOS 15.5 arm64)
  • エディタ:Thonny 4.1.6(Python 3.10.11, Tk 8.6.13)
  • デバイス:Raspberry Pi Pico W(MicroPython)
  • 補足:WindowsやLinuxでも同様に動作しますが、インタプリタやドライバの設定が異なる場合があります。
ピコさん
ピコさん
必要な部品はそんなに多くないから安心してね!手元にない場合は通販でも揃えられるよ。

配線図

ボタンとLEDをどのように接続するかが、動作を安定させるポイントです。ここでは内部プルアップを使う配線例を紹介します。

図で示すように、ボタンの片端をGPIO19(BUTTON_PIN)に接続し、もう片端をGNDに接続します。LEDはGPIO15(LED_PIN)とGNDの間に接続し、LEDの直前に抵抗(220〜330Ω)を挿入します。

ボタンの配線が安定しない場合は、ジャンパワイヤの接続やボタンの向きを確認しましょう。また、静電気や短絡を防ぐため、作業前には必ず手を乾かしておき、金属部品を不用意に触れないようにします。

ピコさん
ピコさん
抵抗の向きは関係ないけど、配線ミスには注意してね!ボタンが押されないときは配線をチェックするといいよ。

内部プルアップのしくみと外付け抵抗の違い

GPIOピンは何も接続していないと電圧が不安定になり、高・低いずれでもない「フローティング状態」になります。この状態を避けるために、プルアップまたはプルダウン抵抗で基準状態を定めます。Raspberry Pi PicoのMicroPythonでは、GPIO設定時に第三引数としてPin.PULL_UPまたはPin.PULL_DOWNを指定することで、内部抵抗を有効にできます。

内部プルアップを使うメリットは、外付け抵抗が不要で配線が簡単になることです。内部プルアップは3.3VとGPIOの間に約50kΩの抵抗が接続され、入力が安定してHIGH状態になります。ボタンを押すとGNDに落ちてLOW(0)になるので、押下判定が容易です。

外付け抵抗を使う場合は、10kΩ程度の抵抗を使ってプルアップ(あるいは用途に応じてプルダウン)回路を構成します。この記事では、例として外付けプルアップ回路を扱っています。Arduinoなど内部プルダウンを持たないマイコンでは、このような外付け抵抗によるプルアップ/プルダウンが必須になるケースもあります。ただし配線が複雑になり、抵抗値によってはチャタリングや電圧ドロップが起こる場合もあります。

一方で、外付けプルアップ回路にもメリットがあります。例えば、使う抵抗値を自分で選べるので、入力感度やノイズへの強さを調整しやすくなります。また、センサーや他のマイコンと信号線を共有する場合など、回路全体の条件に合わせて柔軟に設計できるのも強みです。将来的にArduinoや他のマイコンボードでも応用しやすい考え方なので、仕組みを理解しておくと役立ちます。
外付けプルアップはどちらかというと上級者向けの内容なので、まだピンと来なくても大丈夫です。最初のうちは内部プルアップだけ使えれば十分OKです。

ピコさん
ピコさん
内部プルアップを使えば部品が少なくてすむよ!でも仕組みを理解するために外付け抵抗の方法も覚えておくと役立つね。

MicroPythonのコード

ここからは実際にMicroPythonのコードを書いて、ボタンとLEDを制御していきます。複数のステップに分け、少しずつコードを改善していくことで学びやすくします。

ステップ1:とにかく動かしてみる

まずはボタンが押されているかどうかを読み取り、LEDを点灯・消灯させる基本コードを書きます。内部プルアップを有効にして入力を安定させています。

from machine import Pin

# GPIO番号
BUTTON_PIN = 19
LED_PIN = 15

# ボタン入力(内部プルアップを有効化)
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)

# LED出力
led = Pin(LED_PIN, Pin.OUT)

while True:
    # ボタンが押されると 0(GND に落ちる)
    button_pressed = (button.value() == 0)

    if button_pressed:
        led.value(1)   # 点灯
    else:
        led.value(0)   # 消灯

このコードでは、Pin.PULL_UPを指定して内部プルアップ抵抗を有効にしています。ボタンが押されている間はbutton.value()が0になり、LEDが点灯します。簡潔ですが、ずっとループし続けるためCPU負荷が高く、コードも長くなりがちです。

ピコさん
ピコさん
まずは動くことが大事!でも、このままだと長いコードになっちゃうので次のステップで読みやすくしようね。

ステップ2:関数化とチャタリング対策

次に、コードを整理して読みやすくし、チャタリング対策を加えます。チャタリングとは、ボタンを押す瞬間に接点が細かくON/OFFを繰り返す現象です。time.sleep_ms()で短い待ち時間を設けることで、この影響を軽減します。

from machine import Pin
import time

# GPIO番号の定義(変更しやすいように先頭にまとめる)
BUTTON_PIN = 19
LED_PIN = 15

def setup():
    """GPIOの初期化をまとめる"""
    button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
    led = Pin(LED_PIN, Pin.OUT)
    return button, led

def is_button_pressed(button):
    """ボタンが押されたか判定(チャタリング対策付き)"""
    if button.value() == 0:       # 押された
        time.sleep_ms(20)         # チャタリング対策
        return button.value() == 0
    return False

def main_loop(button, led):
    """メインループ:処理をここに集約。拡張しやすい。"""
    while True:
        if is_button_pressed(button):
            led.value(1)           # 点灯
        else:
            led.value(0)           # 消灯

        # CPU負荷を減らすため軽くスリープ
        time.sleep_ms(5)

# プログラム開始
button, led = setup()
main_loop(button, led)

このステップでは、初期化とメインループを関数に分け、is_button_pressed()でチャタリング対策を施しました。time.sleep_ms(5)でCPUへの負担も抑えています。これにより、複数のボタンやLEDを扱う際にも処理が拡張しやすくなります。

ピコさん
ピコさん
関数に分けると見通しが良くなって、後から機能追加もしやすくなるよ!チャタリング対策もバッチリ。

番外:内部プルアップを使わない「外付けプルアップ回路」の作り方

内部プルアップを使わない場合は、外付けの抵抗を用意して入力ピンが常にLOWもしくはHIGHになるように電位を安定させます。例えば、10kΩの抵抗でプルアップ回路を構成すると、ボタンを押していないときは入力がHIGH、押すとLOWになります。

番外編コードは以下の通りです。ここでは、外付け抵抗でプルアップを行うため、内部プルアップを使用しません。

from machine import Pin

BUTTON_PIN = 19
LED_PIN = 15

# 内部プルアップなし。外付け抵抗でプルアップする想定
button = Pin(BUTTON_PIN, Pin.IN)
led = Pin(LED_PIN, Pin.OUT)

while True:
    # 外付けプルアップ抵抗により押していない時は1、押すと0になる
    button_pressed = (button.value() == 0)

    if button_pressed:
        led.value(1)
    else:
        led.value(0)

外付け抵抗を使う場合は、抵抗を適切な位置に接続して電流が安定するようにします。内部プルアップよりも配線が複雑になりやすいので、初めは内部プルアップを使う方法から覚えることをおすすめします。

ピコさん
ピコさん
外付け抵抗を使うと仕組みの理解が深まるよ!でも最初は内蔵プルアップで手軽に試そうね。

内部プルアップを有効にしていないうえに、外付けプルアップ抵抗も付けていないと、スイッチのON/OFFが安定しません。スイッチを離してもLEDが消えないことがあり、入力ピンの電圧がフローティング状態になっているのが原因です。

トラブルシューティング

実際に作業をしていると、ボタンを押してもLEDが光らないなどのトラブルが起こることがあります。下記のチェックリストで原因を特定し対処してみましょう。

症状原因対処
ボタンを押してもLEDが点灯しない配線ミス、ボタンが逆向き、LEDの極性が逆配線図を再確認し、ボタンとLEDの向きを正しく接続する
LEDが常に点灯してしまう内部プルアップの指定漏れ、外付け抵抗の接続が逆ボタンの宣言にPin.PULL_UPを追加するか、抵抗を正しい位置に付け直す
LEDが点滅してちらつくチャタリングの影響、スイッチの接点不良time.sleep_ms()で待ち時間を増やす、別のボタンに交換する
ボタンの読み取りが反転しているプルアップとプルダウンの混同使用している抵抗の種類(プルアップ/プルダウン)を確認し、判定ロジックを修正する
ピコさん
ピコさん
慌てないで!問題が起きたら一つずつチェックすれば必ず解決できるよ。

まとめ

今回は、Raspberry Pi Picoを使ってボタンを押すとLEDが光るシステムをMicroPythonで構築しました。内部プルアップを有効にして簡単な配線で実装し、さらにコードをリファクタリングして読みやすく拡張しやすい形に改善しました。

学んだポイントをまとめると:

  • GPIOピンを入力として設定し、内部プルアップを有効にすることで安定したボタン入力が得られること。
  • 基本のベタ書きコードから、初期化とメインループの分割やチャタリング対策を行うことで、コードの可読性と拡張性が向上すること。
  • 内部プルアップを使わない場合は外付け抵抗でプルアップ回路を組んで安定した入力ができること。

ぜひこの記事を参考にして、複数のボタンやLEDを制御する回路や、センサー入力を組み合わせた作品づくりにチャレンジしてみてください。例えば、LEDの数を増やして順番に点灯する信号機風のプログラムや、長押しで別の動作をさせる応用など、アイデアは無限大です。

ピコさん
ピコさん
今日学んだことを活かして、次はLEDを4つに増やしたり、点滅速度を変えたりして遊んでみよう!挑戦してこそ上達するよ♪

コメント