第7回:Raspberry Pi Pico WでWi-Fiスキャナを作ろう

つぶやき

Raspberry Pi Pico W を使って、身近にある Wi-Fiアクセスポイントをスキャンして一覧表示するプログラムです。Pico W は小さなマイコンですが、Wi-Fi機能を内蔵しているので、普通のパソコンやスマホのように「どんなWi-Fiが飛んでいるか」を調べることができます。
「家のWi-Fiが混んでる気がする」「どのチャンネルを使えばいいの?」というときにも役立ちます。


1. 今日のゴール

  • Pico WでWi-Fiをスキャンする方法を学ぶ
  • 周囲のSSID(Wi-Fiの名前)、電波強度(RSSI)、チャネルなどを一覧表示
  • 混雑の少ないチャネルを見つける

2. Wi-Fiスキャンとは?

Wi-Fiは「SSID(ネットワーク名)」と「チャネル」で区別されています。

  • SSID:例)MyHomeWiFi, Cafe_Free_WiFi
  • チャネル:周波数の帯域。2.4GHzでは1〜13chを使います。

⚡ ポイント:

  • 周囲のアクセスポイントが同じチャネルを使うと干渉して遅くなる
  • 1, 6, 11ch が基本。混雑していないチャネルを選ぶと通信が安定します

3. プログラムの準備

Pico W で MicroPython を動かすために、まずは Thonny などを準備しておきます。
今回のコードは Wi-Fiに接続しなくてもスキャンだけできます。


4. Wi-Fiスキャンのコード

以下を wifi_scan.py として Pico W に保存して実行してください。

import network
import time
import ubinascii

def mac_str(bssid: bytes) -> str:
    return ubinascii.hexlify(bssid, ":").decode().upper()

# Wi-Fiインターフェースを有効化(ステーションモード)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)

while True:
    print("\n=== Wi-Fiスキャン開始 ===")
    # スキャン実行
    aps = wlan.scan()
    # 結果を表示
    for i, ap in enumerate(aps, 1):
        ssid, bssid, channel, rssi, authmode, hidden = ap
        ssid = ssid.decode() if ssid else "<hidden>"
        print("{:>2}. SSID: {:<20} | CH: {:<2} | RSSI: {:>3} dBm | MAC: {}"
              .format(i, ssid, channel, rssi, mac_str(bssid)))
    # 15秒ごとに繰り返し
    time.sleep(15)

5. 実行してみよう

プログラムを実行すると、ターミナルに周囲のWi-Fi一覧が出ます。

例:

=== Wi-Fiスキャン開始 ===
 1. SSID: MyHomeWiFi         | CH: 6  | RSSI: -42 dBm | MAC: 1A:2B:3C:4D:5E:6F
 2. SSID: Cafe_Free_WiFi     | CH: 11 | RSSI: -68 dBm | MAC: 7F:8E:9D:AA:BB:CC
 3. SSID: <hidden>           | CH: 1  | RSSI: -80 dBm | MAC: 22:33:44:55:66:77
  • SSID:ネットワーク名。空欄なら「<hidden>」と表示(隠しSSID)
  • CH:チャネル番号
  • RSSI:電波の強さ(dBm)。0に近いほど強い。
    • -40 dBm → とても強い(ルータのすぐ近く)
    • -70 dBm → 普通(部屋の隅でも大丈夫)
    • -85 dBm → 弱い(接続が不安定)

6. 混雑しにくいチャネルを選ぼう

2.4GHz帯では隣のチャネル同士も干渉します。
そのため、基本は 1 / 6 / 11 の3つのどれかを選ぶのがおすすめ。

例えば:

  • CH6 に強い電波が2つあるなら、CH1やCH11を選んだ方が良い
  • RSSI が弱いAPなら、あまり影響しない

コメント