Python × Pico 電子工作 | #15 Pico W で WiFi につなごう

🚫 この単元は Pico W / Pico WH 専用です

無線機能のない「Pico」「Pico H」では動きません。見分け方は基板上の 銀色の四角い金属シールド(CYW43439 WiFi/Bluetooth チップ) の有無。シールドがなければ無印 Pico なので、本単元はスキップして #17 統合課題(準備中)に進んでください。

今回からは 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 W で WiFi につなごう

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 HPico 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(銀シールド内)
内蔵 LEDPin(25)Pin('LED')(CYW43439 経由)
GPIO 数26 本26 本(互換)
ADC3ch(GP26/27/28)3ch(GP26/27/28)※ GP29 は無線で使用
VSYS 電圧監視GP29 (ADC3)非対応(GP29 は無線占有)
主な用途センサー読取・モーター制御・スタンドアロンIoT・センサーデータ送信・遠隔操作
適した教材本シリーズ #01〜#14本シリーズ #15・#16(と #01〜#14 も動く)

💡 「LED='LED' の謎」

Pico では内蔵 LED は GP25 に直結されていましたが、Pico W では その GP25 が CYW43439 無線チップとの通信線に使われています。そのため Pico W の内蔵 LED は 「CYW43439 経由で間接的に制御」 する設計に変更され、MicroPython 上では 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 モジュールでこの一連の処理を行います。

Pico W が STA モードでルーター経由でインターネットに接続する流れ図
Pico W の WiFi 接続(STA モード)の全体像。Pico W が 子機(STA)としてルーターに接続し、ルーター経由でインターネットにつながります。番号は active → connect → 接続待ち → IP 取得 の 4 ステップに対応します。
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)をタプルで返す

⚠️ 接続が終わらない無限ループに注意

接続にかかる時間は通常 3〜10 秒 ですが、電波状況が悪い・SSID やパスワードを間違えた・AP が見つからない場合は 無限ループ に入ってしまいます。実用アプリでは 「タイムアウト(10 秒経過したら諦める)」 や「wlan.status() で失敗理由を判定」 する対策が必要ですが、今回は基本動作の確認なので省略します。

配線:Pico W 単体で OK(USB 給電のみ)

今回のステップ1・2 は 「Pico W に USB ケーブルを差すだけ」 で動きます。WiFi モジュール(CYW43439)は基板に組み込み済みなので、外付け部品は 一切不要。「電子工作」というより「ネットワーク入門」 に近い体験になります。演習で ボタン(#03 と同じ GP14 プルアップ)と LCD(#08 と同じ I2C GP0/GP1)を追加します。

Pico W に USB ケーブルを差すだけの最小構成
配線:Pico W 単体・USB ケーブル給電のみ。CYW43439 は基板に組み込み済みなので外付け部品ゼロ。ステップ1・2 はこの構成で動きます。(実体配線図は Fritzing の部品画像をもとに作図・CC BY-SA 3.0)

ステップ1:WiFi に接続して IP アドレスを表示しよう

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

⚠️ セキュリティの注意

学校や公共の WiFi では 「キャプティブポータル」(ブラウザでログインが必要なタイプ)がPico W では繋げません。家庭用の通常 WiFi(WPA2/WPA3-PSK)を使ってください。SSID/パスワードをコードに直書きするのはセキュリティ的に良くない(誰かにコードを見せたら漏れる)ので、本格的なアプリでは secrets.py という別ファイルに分離するのが定石(演習1 で扱います)。
Pico W で WiFi に接続し IP アドレスを print するブロック
ブロック構成:Pico W で WiFi に接続(SSID + パスワード)→ ip = Pico W の IP アドレス → print f'IP: {ip}'。実行すると シェルに「IP: 192.168.x.x」のような行が出力されます。
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 がチカチカ始まったら接続完了」とひと目で分かります。

WiFi 接続後に内蔵 LED をハートビート点滅させるブロック
ブロック構成:Pico W で WiFi に接続 → ずっと繰り返す → Pico W 内蔵 LED 点灯 → 0.5 秒待つ → 内蔵 LED 消灯 → 0.5 秒待つ。緑色の 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 を参照。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

ボタンを押すと WiFi 接続するブロック
ブロック構成:state = 0 → ずっと繰り返す → もし「ボタン GP14 が押された かつ state == 0」なら WiFi 接続 → ip = IP アドレス → print → 内蔵 LED 点灯 → state = 1 → 0.1 秒待つ。1 回押せば接続、2 回目以降は無視される FSM ロジック。
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 秒待ってもダメなら赤点灯(タイムアウト処理)

タクトスイッチを Pico W に接続した実体配線図
課題3-15-2 の配線:Pico W にタクトスイッチ(3V3 + GP14 プルアップ + GND)を接続。WiFi は無線なので追加配線不要。USB 給電だけで完結する省エネ構成。

課題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 のフラッシュに置いておいてください。

▶ 模範解答と解説を見る

ブロックの組み合わせ例:

WiFi 接続後に LCD に IP を表示するブロック
ブロック構成:LCD を初期化(SDA=GP0/SCL=GP1)→ 「Connecting...」を 0 行目に表示 → Pico W で WiFi に接続 → ip = IP アドレス → LCD クリア → 「WiFi OK」を 0 行目に表示 → ip 文字列を 1 行目に表示。
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...」と出して再接続を試みる

LCD1602 を Pico W に接続した実体配線図
課題3-15-3 の配線:Pico W + LCD1602(I2C0: SDA=GP0/SCL=GP1)+ VBUS(5V)+ GND。WiFi(無線)と LCD(I2C 有線)は互いに干渉しません。lcd1602.py を Pico W のフラッシュに置いておくこと(#08 参照)。

まとめ

  • 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 規格の進化

Pico W が対応する 802.11 b/g/n(WiFi 1〜4) は 2009 年までの古い規格ですが、2.4GHz 帯の互換性 はいまだに最強です。最新のスマホ・ノート PC は WiFi 6(11ax・2019)・WiFi 6E(11ax 6GHz・2021)・WiFi 7(11be・2024) まで使えますが、IoT デバイス(センサー値を毎秒数十 byte 送るだけ)には宝の持ち腐れ。「速度より安さ・到達距離・互換性」を優先した Pico W の設計は IoT 向けの正解と言えます。

次回 #16 は IoT の本番:取得した IP を活用して、HTTP GET で天気予報を取得・HTTP POST でセンサーデータをクラウドに送信・Pico W を Web サーバにしてブラウザから操作 など、「ネットワーク越しに外の世界とつながる電子工作」に踏み込みます。「電子工作 × ネットワーク」の組み合わせ技をぜひ楽しみにしてください。

トップへ戻る