今回は、マイコン学習の王道「LED点滅(Lチカ)」に挑戦します。LEDがチカチカ光ると、それだけで「Pico Wが外部を制御している」という実感が湧きやすいですね。
この記事では、基本的な点滅の実装だけでなく、LEDの背景構造、発展的な使い方、トラブル対策なども含めて解説します。
Pico WのオンボードLED構造と注意点
まず、Pico W のオンボードLEDについて少し知っておくと、つまずきにくくなります。
- Raspberry Pi Pico(無印)では、基板上のLEDは GPIO25(GP25) に直接接続されています。
- しかし Pico W(無線機能付きモデル)では、LEDは RP2040 側ではなく、Wi-Fi チップ(Infineon CYW43439)内部の線に接続されており、GPIO25 に直結していない構造になっています。したがって、GPIO25 に書き込んでも LED は点灯しません。
- MicroPython の Pico W 向けビルドでは、この構造を吸収するため、LED を扱いやすくする抽象化が導入されています。具体的には、
Pin("LED")という識別子を使うことで、Wi-Fi チップ経由で LED を制御できるようになっています。 - つまり、Pico W 用の MicroPython を使うなら、
Pin("LED")という指定を使うのが正解、ということになります。無印 Pico と併用する場合には、モデルによって GPIO25 指定と LED 指定を切り替えることになります。
この仕組みを理解しておくと、後で「LEDが光らない」問題が起きたときに原因を特定しやすくなります。
machine.Pin を使った GPIO 操作
MicroPython で GPIO を操作するために、machine.Pin クラスを使います。使い方を丁寧に見ていきましょう。
from machine import Pin
# 出力用ピンを定義
led = Pin('LED', Pin.OUT)Pin("LED", Pin.OUT)→ ピン “LED” を 出力モード(OUT) として初期化led.value(1)→ 出力を HIGH に(LED 点灯)led.value(0)→ 出力を LOW に(LED 消灯)
また、MicroPython には on() / off() メソッドもサポートしています。
led.on() # 点灯
led.off() # 消灯これで、GPIO を通じて LED をシンプルに制御する準備ができました。
点灯・消灯のサンプルコード
まずは、単純に「一定時間点灯 → 消灯」するサンプルを見ておきましょう。
from machine import Pin
import utime
led = Pin('LED', Pin.OUT)
# 点灯
led.value(1)
utime.sleep(2)
# 消灯
led.value(0)このコードを Pico W 上で実行すると、LED が 2 秒間点灯し、その後消灯します。非常にシンプルですが、「LED が確かに制御可能であることを確かめる」には十分です。
点滅(Lチカ)基本プログラム
次はいよいよ点滅(Lチカ)です。点灯と消灯を繰り返す書き方の基本形を示します。
from machine import Pin
import utime
led = Pin('LED', Pin.OUT)
while True:
led.value(1) # 点灯
utime.sleep(1) # 1秒待つ
led.value(0) # 消灯
utime.sleep(1) # 1秒待つこのコードを動かすと、LED は 1 秒ごとに点灯・消灯を繰り返します。
- 点滅速度を変えたいときは、
utime.sleep()の秒数を変えれば OK utime.sleep_ms()(ミリ秒単位)やutime.sleep_us()(マイクロ秒単位)を使えば、より細かい制御が可能led.toggle()メソッド(LED の状態を反転)をサポートしている環境では、led.toggle()を使ってコードを簡潔に記述することも可能です
たとえば、以下のように書くこともできます:
while True:
led.toggle()
utime.sleep_ms(500)上記だと 0.5 秒ごとに点滅します。
応用アイデア:可変速度、外付けLED
Lチカを一歩進めて、ちょっとした応用例も見てみましょう。
可変速度点滅
ユーザー入力(たとえばボタン、シリアル入力、スライダー)で「点滅間隔」を変えられるようにすると、インタラクティブな動きを作ることができます。
from machine import Pin
import utime
led = Pin("LED", Pin.OUT)
interval = 0.5 # 初期値(秒)
while True:
led.value(1)
utime.sleep(interval)
led.value(0)
utime.sleep(interval)
# ここに、ボタン押下チェックなどで interval を変えるロジックを入れてもよい外付けLED を使う場合
オンボード LED だけでなく、外部に LED をつなぐ場合もよくあります。
- LED のアノード(長い脚)を抵抗を経由して GPIO に、カソード(短い脚)を GND に接続
- 通常、330Ω程度の抵抗を直列に入れて過電流を防ぐ
- 外部 LED の場合は、GPIO 出力能力(最大電流など)に注意
外部LEDを制御するコードは、基本は同じ Pin(x, Pin.OUT) を使えば動きます。
トラブルシューティング:LEDが光らないときのチェックリスト
点滅プログラムを実行したのに LED が光らない、という悩みは意外と多くあります。以下のチェックポイントを順に確認するとよいでしょう。
| チェック項目 | 内容 |
|---|---|
| モデル確認 | 使用しているのが Pico(無線なし)か Pico W(無線付き)かを確認 |
| 正しいファームウェア | Pico W 用の MicroPython ビルドが必要。無線なし版では LED 指定が効かない可能性あり |
Pin("LED") 指定の使用 | Pico W では Pin(25) ではなく Pin("LED") を使うこと |
| LED のハード故障 | 基板不良やはんだ付けなどの物理問題 |
| 接続ミス(外部 LED 利用時) | 抵抗の接続、GND 接続、極性など |
| ループ・待機時間の調整 | 待機時間が短すぎて視覚的に点灯が認識できない、など |
| 他のサンプル動作確認 | 別の簡単なスクリプトで LED on/off 動作を試す |
GPIO の基礎
LED 制御を理解するために、GPIO(General Purpose Input/Output)の基本を改めて整理しておきます。
- 入力(Input)モード:外部信号(スイッチ、センサー)を読む
- 出力(Output)モード:LED、モーター、リレーなどを動かす
- GPIO 出力の HIGH/LOW は、マイコン上では電圧制御(通常 0V または 3.3V)が行われる
- 複数ピンに負荷をかけると、電流制限やドライブ能力を超える可能性があるので注意(ピンあたりの最大電流など)
- GPIO ピンにはプルアップ/プルダウン抵抗を内蔵できるものもあり、入力時の信号を安定させる役割を持つ
これらを押さえておくと、LED 制御だけでなくセンサーやモーター制御など、他の応用にも応用できます。
ループ制御と時間制御の応用
LED 点滅で使う while True:(無限ループ)と utime.sleep()(待機時間)という構造は、センサー監視、周期処理、タイミング制御など、あらゆるマイコン制御で使われる基本パターンです。
例えば:
- 一定周期でセンサー値を読み取る
- 一定時間ごとに処理を行う(例:10 秒ごとに通信)
- 遅延を入れつつ、他の処理を併行する(例:非ブロッキング処理、割り込み利用など)
このループ+待機時間という形式を応用すると、マイコンで「制御系・監視系」のプログラム全体を構成する力が身につきます。
まとめ
この記事で、以下を取り上げました。
- Pico W の LED 構造と注意点:GPIO25 直結ではなく、Wi-Fi チップ経由で制御されている
- machine.Pin による GPIO 操作:Pin(“LED”, Pin.OUT)、value(), on(), off() など
- 点灯・消灯の基本から点滅(Lチカ) のプログラム
- 応用例:可変速度、PWM 制御、外付け LED 制御
- トラブル対策ポイント:LED が光らないときのチェックリスト
- GPIO 基礎:入力/出力、電流制限、プル抵抗など
- ループと時間制御:マイコン制御の根幹となる構造
参考リンク・関連情報


✅ 次回(第3回)は「ボタン入力で LED を制御してみよう」です。Pin.IN(入力モード)の使い方とプルアップ/プルダウン抵抗の役割と設定を学びましょう!



コメント