🚫 この単元は Pico W / Pico WH 専用です
今回からは Pico W(または Pico WH・以下まとめて「Pico W」) 専用の単元に入ります。これまでの #01〜#14 はすべて 「マイコン単体で完結する電子工作」 でしたが、Pico W には 無線通信チップ(CYW43439) が搭載されており、WiFi(2.4GHz 802.11 b/g/n)と Bluetooth Low Energy が使えます。今回は WiFi で家庭内ネットワークに接続して IP アドレスを取得 するところまでをやってみましょう。次回 #16 で 「HTTP で外のクラウドにデータを送る」 ところまで進むと、「IoT デバイス」 がついに動き始めます。
WiFi に繋がると 「PC や スマホ・クラウド・別の Pico」 とお話できるようになり、温湿度センサーの値をスマホで確認、クラウドから LED を点灯、Web ブラウザでロボットを操縦 など、「マイコンの外の世界とつながる」 一気に広がる単元です。「電子工作の世界と Web の世界が初めて繋がる瞬間」 をぜひ体感してください。
- Pico と Pico W の違い(CYW43439・LED ピンの変更・network モジュール)
- WiFi STA モード(家庭ルーターに「子機」として接続)の基本概念
- network.WLAN(STA_IF) による 4 ステップ接続フロー
- isconnected() のポーリングで接続完了を待つ書き方
- ifconfig() で IP アドレス・サブネット・ゲートウェイ・DNS を取得
- 接続後の 「内蔵 LED でフィードバック」「ボタンでトリガ」「LCD に表示」 応用例
- SSID/パスワードの セキュリティと管理方法
今回は PycoBlocks(MicroPythonモード) の 「Pico W」カテゴリ にある「Pico W で WiFi に接続」「Pico W の IP アドレス」「Pico W 内蔵 LED」 ブロックを使います。SSID とパスワードをそのまま入力するだけで、内部では network.WLAN(STA_IF) + active(True) + connect() + isconnected() ループ待機という 4 ステップが自動生成されます。

Pico と Pico W:何が違う?
Raspberry Pi Pico は 2021 年 1 月発売・550 円の超低価格マイコンで、ここまでの #01〜#14 ではすべて 「無線なし版(Pico / Pico H)」 を前提に説明してきました。Pico W は 2022 年 6 月発売の WiFi/Bluetooth 搭載版。基板の中央付近に 銀色の四角い金属シールド(=シールドの中に CYW43439 チップが入っている)が載っているのが見た目の決定的な違いです。ピン配置・電源仕様・GPIO 数(26 本)は 無印 Pico と完全互換で、これまで作った回路はそのまま Pico W に差し替えても動きます。
| 項目 | Pico / Pico H | Pico W / Pico WH |
|---|---|---|
| 発売 | 2021 年 1 月 | 2022 年 6 月 |
| 価格(参考) | 約 550〜770 円 | 約 1,100〜1,400 円 |
| 無線 | なし | WiFi 802.11 b/g/n(2.4GHz)+ Bluetooth 5.2 |
| 無線チップ | — | Infineon CYW43439(銀シールド内) |
| 内蔵 LED | Pin(25) | Pin('LED')(CYW43439 経由) |
| GPIO 数 | 26 本 | 26 本(互換) |
| ADC | 3ch(GP26/27/28) | 3ch(GP26/27/28)※ GP29 は無線で使用 |
| VSYS 電圧監視 | GP29 (ADC3) | 非対応(GP29 は無線占有) |
| 主な用途 | センサー読取・モーター制御・スタンドアロン | IoT・センサーデータ送信・遠隔操作 |
| 適した教材 | 本シリーズ #01〜#14 | 本シリーズ #15・#16(と #01〜#14 も動く) |
💡 「LED='LED' の謎」
Pin('LED', Pin.OUT)(数値ではなく文字列 'LED')で扱います。「Pin('LED')」を「Pin(25)」と書き間違えるのが Pico W の最頻出ミスです。本記事の 「Pico W 内蔵 LED」 ブロックを使えば、内部で自動的に Pin('LED') が生成されるので安心。WiFi 接続の 4 ステップ:active → connect → wait → ifconfig
WiFi の接続は 「家のルーター(=AP, アクセスポイント)」 に対して 「子機(=STA, ステーション)」 として参加するプロセスです。Pico W も家のスマホやノート PC と同じ STA モード で接続し、ルーターから IP アドレスを払い出してもらう(DHCP)流れになります。MicroPython では network モジュールでこの一連の処理を行います。

import network, utime
# ステップ1: STA モードの WLAN オブジェクトを作る
wlan = network.WLAN(network.STA_IF)
# ステップ2: 無線モジュールを電源 ON
wlan.active(True)
# ステップ3: SSID とパスワードを指定して接続開始(非同期)
wlan.connect('your-ssid', 'your-password')
# ステップ4: 接続完了するまで 0.5 秒ごとにポーリング待機
while not wlan.isconnected():
utime.sleep(0.5)
# 接続完了後: IP アドレスを取得(タプルで返る)
ip, subnet, gateway, dns = wlan.ifconfig()
print('IP:', ip)
📝 各ステップの意味
- active(True):CYW43439 の電源を ON にする(ここで約 50mA 余分に消費)
- connect(ssid, pw):指定された AP を探して接続要求を送る。即座にリターンする(非同期)
- isconnected():接続が完了したかチェック。True が返るまでループで待つ
- ifconfig():4 つの値(IP・サブネット・ゲートウェイ・DNS)をタプルで返す
⚠️ 接続が終わらない無限ループに注意
配線:Pico W 単体で OK(USB 給電のみ)
今回のステップ1・2 は 「Pico W に USB ケーブルを差すだけ」 で動きます。WiFi モジュール(CYW43439)は基板に組み込み済みなので、外付け部品は 一切不要。「電子工作」というより「ネットワーク入門」 に近い体験になります。演習で ボタン(#03 と同じ GP14 プルアップ)と LCD(#08 と同じ I2C GP0/GP1)を追加します。

ステップ1:WiFi に接続して IP アドレスを表示しよう
まずは 「WiFi に繋がる + シェルに IP を出力」 だけのシンプルな例から。「Pico W で WiFi に接続 SSID:〇〇 パスワード:〇〇」 ブロックを 1 つ置き、次に 「ip = Pico W の IP アドレス」(変数代入)、最後に 「print f'IP: {ip}'」 で出力します。SSID(電波名)とパスワードはご自宅の WiFi のものに書き換えてください。
⚠️ セキュリティの注意

from machine import Pin
import utime
import network, utime
_wlan = network.WLAN(network.STA_IF)
_wlan.active(True)
_wlan.connect('your-ssid', 'your-password')
while not _wlan.isconnected():
utime.sleep(0.5)
ip = _wlan.ifconfig()[0]
print(f'IP: {ip}')
動作確認のコツ:実行ボタンを押すと 「3〜10 秒の沈黙」 のあと、「IP: 192.168.0.42」 のような行がシェルに出力されます。「192.168.x.x」「10.x.x.x」「172.16〜31.x.x」 のいずれかになっていれば成功(家庭ルーターはほぼ全て 192.168 系を使います)。「'IP: '」表示の前にエラーが出る 場合は SSID/パスワードの打ち間違いか、5GHz 帯専用 WiFi(Pico W は 2.4GHz しか対応していない)を選んでいる可能性があります。
取得した IP アドレスの確認方法:Pico W と同じ WiFi に繋がっている PC やスマホのブラウザで http://192.168.0.42/(実際の IP に置き換え)にアクセスしても、今のところ 何も応答しません(まだ HTTP サーバを立てていないため)。次回 #16 で 「Pico W が Web サーバになる」 例を作るので、その時にこの IP が活躍します。
ステップ2:接続成功後に内蔵 LED で「ハートビート」を点滅させよう
ステップ1 は 「シェルに IP が出るまで何の反応もない」 不安な体験です。ステップ2 では 「接続が完了したことを内蔵 LED の点滅で知らせる」フィードバックを追加します。WiFi 接続後 → forever ループで内蔵 LED を 0.5 秒間隔で ON/OFF するだけ。「LED がチカチカ始まったら接続完了」とひと目で分かります。

from machine import Pin
import utime
import network, utime
_wlan = network.WLAN(network.STA_IF)
_wlan.active(True)
_wlan.connect('your-ssid', 'your-password')
while not _wlan.isconnected():
utime.sleep(0.5)
while True:
Pin('LED', Pin.OUT).value(1)
utime.sleep(0.5)
Pin('LED', Pin.OUT).value(0)
utime.sleep(0.5)
動作確認のコツ:電源 ON 直後の数秒は LED が消えたまま(接続待機中)、接続が完了した瞬間からハートビートが始まるのが体感できます。WiFi が見つからない場合は LED が点滅しないので、「接続失敗の検知」 もこのパターンでできます。実用ロボットでは 「赤=接続失敗・緑=接続中・青=アイドル」 など3 色 LED で状態を可視化 するパターンがよく使われます。
「Pin('LED') が値を保持しない」問題:上のコードは Pin('LED', Pin.OUT) を毎回作り直していますが、本来は 「ループの外で 1 回作って、ループ内では .value() だけ呼ぶ」 方が効率的です。PycoBlocks のブロックは 「読みやすさ優先」で毎回生成する書き方になっていますが、毎秒数百回の高速制御が必要な場合は手で最適化してください。
演習課題
課題3-15-1:WiFi セキュリティと IP アドレスの計算問題
WiFi 接続の セキュリティ・IP アドレス・ifconfig タプル の理解を計算で深めましょう。
問1: SSID とパスワードをソースコードに直書きすると、「GitHub に push したら全世界に WiFi パスワードが漏洩」 という事故が現実に起きます。「コードを公開しても安全」 にするためにはどうすればよいか、Python の 「secrets.py という別ファイルに分けて gitignore する」 手法を例に説明せよ。
問2: 家庭用ルーターは通常 192.168.0.0/24 または 192.168.1.0/24 のサブネットを使う。「/24」とは「最初の 24 bit がネットワーク部・残り 8 bit がホスト部」を意味する。このサブネットに同時接続できる端末は最大何台か計算せよ(IP の 0 番(ネットワークアドレス)と 255 番(ブロードキャスト)は使えないことに注意)。
問3: wlan.ifconfig() は 4 要素タプル (IP, サブネットマスク, ゲートウェイ, DNS) を返す。「ゲートウェイ」 と 「DNS」 がそれぞれ何の役割を持つか説明せよ。また、「DNS が違う値を返したらどうなるか」 簡単に述べよ。
問4: Pico W は 2.4GHz 帯 しか対応していない。最新のスマホやノート PC が使う 5GHz 帯・6GHz 帯(WiFi 6E) との違い(速度・到達距離・干渉のしやすさ)を 1 つずつ挙げて、「なぜ Pico W は 2.4GHz だけで十分か」 答えよ。
▶ 模範解答と解説を見る
# 問1: SSID/パスワードを別ファイルに分ける
# main.py:
# import secrets # secrets.py に SSID/PASS が書かれている
# wlan.connect(secrets.SSID, secrets.PASS)
#
# secrets.py:
# SSID = 'your-ssid'
# PASS = 'your-password'
#
# .gitignore:
# secrets.py # ← secrets.py は git に追加しない
#
# こうすれば main.py を GitHub に公開しても WiFi 情報は手元だけに残る。
# 配布時は secrets.py.example を用意して「自分で書き換えてね」と案内する。
# 問2: /24 サブネットの最大端末数
# 192.168.0.0/24 → ホスト部 8 bit = 2^8 = 256 通り
# - 192.168.0.0 = ネットワークアドレス(使用不可)
# - 192.168.0.255 = ブロードキャスト(使用不可)
# → 使える IP は 256 - 2 = 254 台
# 実際にはルーター自身(通常 192.168.0.1)も 1 個使うので 253 台が空き
# 問3: ゲートウェイと DNS の役割
# ゲートウェイ = 「自分のネットワーク」と「外の世界(インターネット)」の出入り口
# 家庭ルーターの IP(通常 192.168.0.1 / 192.168.1.1)
# 外の IP 宛のパケットはまずここに送られる
# DNS = ドメイン名(example.com)を IP アドレス(93.184.216.34)に変換する辞書サーバ
# 通常は ISP の DNS(プロバイダ提供)またはルーターが代行
# 偽の DNS が返した場合: 例) example.com にアクセスしたつもりが、悪意あるサイトに飛ばされる
# → DNS 偽装攻撃(フィッシングの一種)
# 問4: 2.4GHz vs 5GHz vs 6GHz
# 2.4GHz: 速度 < 5GHz、到達距離 > 5GHz(壁を回り込む)、電子レンジと干渉しやすい
# 5GHz : 速度 > 2.4GHz、到達距離 < 2.4GHz、屋外利用は規制あり
# 6GHz : WiFi 6E(最新)、超高速だが壁にとても弱い、機器が高価
# Pico W が 2.4GHz だけで十分な理由:
# - IoT で送るデータは小さい(センサー値・短い JSON)ので速度不要
# - 到達距離が長い方が屋内設置で有利
# - 2.4GHz チップは安く小型(CYW43439 で Pico W が 1,100 円で買える)
解説: 解説:WiFi は 「鍵(パスワード)の管理」 と 「IP アドレスの設計」を理解しないとセキュリティ事故・ネットワーク不通・速度低下の温床になります。「secrets.py 分離 + gitignore」 は Python プロジェクトの最重要セキュリティ作法の 1 つで、OSS の AI モデルの API キー漏洩 なども同じパターンで防げます。サブネット /24・ゲートウェイ・DNS はネットワークの基礎中の基礎で、応用情報・基本情報・CCNA などの国家試験/業界試験でも必ず出題されます。「電子工作からネットワークの世界へ」知識が広がる第一歩として、しっかり覚えておきましょう。
課題3-15-2:ボタンを押すまで WiFi に繋がないようにしよう
#03 で使ったタクトスイッチ(GP14・プルアップ) と組み合わせて、「電源 ON だけでは接続せず、ボタンを押した瞬間に初めて WiFi 接続する」ユーザートリガ型の起動シーケンスを作ります。「テスト中に何度も再起動する」場面で 「すぐに接続待ち地獄に入らない」 のが便利。実用ロボットでも 「電源 ON では待機・操作開始ボタンで接続」のパターンはよく使われます。
state 変数で「1 回だけ実行」を実装するのがポイント。「ボタンが押されたかつ state==0 のとき」だけ接続し、接続後に state=1 にすれば 「2 回目以降は無視」できます。#14 演習3 の自動ゲートと同じ FSM パターンです。
配線追加:Pico W に加えて、タクトスイッチを 3V3 + GP14(プルアップ)+ GND に繋ぎます。プルアップ回路の詳しい説明は #03 を参照。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin
import utime
state = 0
while True:
_btn14 = Pin(14, Pin.IN, Pin.PULL_UP)
if _btn14.value() == 0 and state == 0:
import network, utime
_wlan = network.WLAN(network.STA_IF)
_wlan.active(True)
_wlan.connect('your-ssid', 'your-password')
while not _wlan.isconnected():
utime.sleep(0.5)
ip = _wlan.ifconfig()[0]
print(f'Connected! IP: {ip}')
Pin('LED', Pin.OUT).value(1)
state = 1
utime.sleep(0.1)
解説: 動作確認のコツ:電源 ON 直後は 「LED 消灯・シェル無反応」の待機状態。ボタンを 1 回チョン押しすると 3〜10 秒かけて接続し、シェルに IP が出力 + 内蔵 LED が常時点灯に切り替わります。もう一度ボタンを押しても何も起こらない(state==1 なので条件不一致)のが FSM の効果。発展:
- 2 つのボタンで接続/切断:GP14 で接続、GP15 で
wlan.disconnect()+ state=0 リセット - 接続中の進捗表示:接続待機ループ内で内蔵 LED を高速点滅(200ms 周期)
- 失敗時の赤 LED:外部 LED を 3 秒待ってもダメなら赤点灯(タイムアウト処理)

課題3-15-3:LCD1602 に IP アドレスを表示しよう
#08 で使った I2C LCD1602 と組み合わせて、「PC を持っていなくても IP アドレスが確認できる」スタンドアロン WiFi デバイスを作ります。「Pico W を電源に繋いだら数秒後に LCD に IP が表示される」 という挙動で、「Web ブラウザでこの IP にアクセスして操作開始!」 のような IoT デバイスの典型的な起動 UI になります。
配線追加:Pico W に LCD1602 を I2C0(SDA=GP0・SCL=GP1)+ VBUS(5V)+ GND で接続します。WiFi(無線)と LCD(I2C)は互いに干渉しません。lcd1602.py(#08 で導入済み)が必要なので、Pico W のフラッシュに置いておいてください。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin, I2C
import utime
from lcd1602 import LCD1602
_i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = LCD1602(_i2c, 2, 16)
lcd.move_to(0, 0); lcd.putstr((str('Connecting...') + ' ' * 16)[:16])
import network, utime
_wlan = network.WLAN(network.STA_IF)
_wlan.active(True)
_wlan.connect('your-ssid', 'your-password')
while not _wlan.isconnected():
utime.sleep(0.5)
ip = _wlan.ifconfig()[0]
lcd.clear()
lcd.move_to(0, 0); lcd.putstr((str('WiFi OK') + ' ' * 16)[:16])
lcd.move_to(0, 1); lcd.putstr((str(ip) + ' ' * 16)[:16])
解説: 動作確認のコツ:電源 ON 直後の数秒は 「LCD 1 行目に 'Connecting...'」 が表示され、WiFi 接続完了後に 「1 行目: WiFi OK / 2 行目: 192.168.x.x」に切り替わります。PC を起動せず・Wi-Fi も電源も別の場所で確認できるので、「廊下の壁に Pico W を貼り付けて温度監視デバイスを作る」 ような実用展開がしやすくなります。発展:
- SSID 名も表示:
wlan.config('essid')で接続中の SSID を取得して 1 行目に出す - 電波強度(RSSI):
wlan.status('rssi')で dBm 値を取得して表示(-50 が強・-90 が弱) - 未接続時のリトライ:5 秒待っても繋がらなければ LCD に「Retry...」と出して再接続を試みる

まとめ
- Pico W は CYW43439 無線チップ搭載版。無印 Pico とは 「銀色の金属シールド」「Pin('LED') の変更」「GP29 が無線占有」 の 3 点が違う。
- WiFi 接続は 4 ステップ:
WLAN(STA_IF)→active(True)→connect()→isconnected()ループ待機。 - ifconfig() は (IP, サブネット, ゲートウェイ, DNS) の 4 要素タプル。
- Pico W は 2.4GHz 802.11 b/g/n のみ対応。5GHz・6GHz は使えない が、IoT 用途には 2.4GHz で十分。
- SSID/パスワードは secrets.py に分離して gitignore するのが基本セキュリティ作法。コードに直書きすると GitHub に push で全世界漏洩事故 が起こる。
- 内蔵 LED フィードバック・ボタントリガ起動・LCD への IP 表示 など、WiFi 接続と他のセンサー/出力デバイスを組み合わせると 実用 IoT 機器の原型 が一気に作れる。
📝 WiFi 規格の進化
次回 #16 は IoT の本番:取得した IP を活用して、HTTP GET で天気予報を取得・HTTP POST でセンサーデータをクラウドに送信・Pico W を Web サーバにしてブラウザから操作 など、「ネットワーク越しに外の世界とつながる電子工作」に踏み込みます。「電子工作 × ネットワーク」の組み合わせ技をぜひ楽しみにしてください。