MicroPython(ESP32)でWifi接続する

MicroPython(ESP32)でWifi接続する
目次


はじめに【MicroPython+ESP32でWifiに接続する】

ESP32を選択する理由として「wifi接続できる」ことは大きいと思います。今回はMicroPythonを使用してWifi接続を行ってみます。

事前準備:MicroPythonのセットアップ

まずはMicroPythonをESP32にセットアップましょう。こちらの記事 でセットアップ方法を紹介しています。

Wifi接続の設定

main.pyの作成

  • 公式サイト の「ネットワーキング」にサンプルがあります。
  • [SSID][PASSWORD]は環境に合わせて書き換えてください。
import network
import time

SSID = "abcdefg"
PASSWORD = "******"

#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)

#True:ネットワークの有効化。 引数なしで状態の取得
wlan.active(True)

#接続状態になるまで1秒おきに再試行。
if not wlan.isconnected():
    wlan.connect(SSID, PASSWORD)
    while wlan.status() != network.STAT_GOT_IP:
        print('waiting...')
        time.sleep(1)

#接続ができたらIPアドレスを表示して終了。
status = wlan.ifconfig()
print(f'IP address {status[0]}')

動作確認

実行するとシェルにIPアドレスを表示します。

wifi-connect実行結果

複数の接続先を登録して接続する方法

Wifiの接続先が複数の場合もあります(テスト中は家のWifi、 実行時は外部のWifiなど)。

  • ssid_lstにSSIDとパスワードを登録する。優先順位が高い順に。
  • wlan.scan()で接続可能なアクセスポイントを検索
  • ssid_lstと照会して、接続可能なところに接続
import network
import time

#接続先SSIDのリストを作る。優先度順。
ssid_lst=[["WIFI-A", "aabbccdd"],
          ["WIFI-B", "bbccddaa"], 
          ["WIFI-C", "ddaabbcc"]]

#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)
#ネットワークの有効化。
wlan.active(True)

#lstにwlan.scan()の戻り値(タプル型)を代入
lst = wlan.scan()
#接続先のリストを作成
ap_lst = set() #空の集合

#ap_lst集合に接続できるアクセスポイントを格納
#.decode()はbytearray型をstring型に変換する。
for l in lst:
    ap_lst.add(l[0].decode())

if not wlan.isconnected():
    #優先順位順に接続先を確認する。
    for l in range(len(ssid_lst)):
        if ssid_lst[l][0] in ap_lst:
            ssid = ssid_lst[l][0]
            password = ssid_lst[l][1]
            wlan.connect(ssid, password)
            while wlan.status() != network.STAT_GOT_IP:
                print(ssid, ':waiting...')
                time.sleep(1)

#接続ができたらIPアドレスを表示して終了。
status = wlan.ifconfig()
print(f'IP address {status[0]}')

問題点

上記のコードは接続が切断された場合、再接続が失敗します (wlan.scan()が失敗する)。まだいい方法が見つからないので、 今後の課題として修正していきます。

補足:アクセスポイントのSSIDを調べる

アクセスポイントのSSIDがわからない場合、以下のコードで調べることができます。

wifi-scan.py
import network

#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)
#ネットワークの有効化。
wlan.active(True)

#lstにwlan.scan()の戻り値(タプル型)を代入
lst = wlan.scan()

#lstの内容を表示
for l in lst :
    print(l)

実行結果

(b'WIFI-A', b'F\xd5\xf2*\xd8\xf8', 6, -33, 3, False)
(b'WIFI-B', b'\x80"\xa7\x00\x8e\x19', 1, -50, 4, False)
(b'WIFI-Y', b'\x902K\xea(\x96', 1, -92, 4, False)
(b'WIFI-Z', b'\x00:\x9dk^\x8d', 7, -95, 4, False)

1番目のステータス(WIFI-x)がSSIDです。

おわりに

wifi接続ができればAmbient などを使ってデータ収集が可能になりますね。(Ambientへの接続はこちらの記事 でやってます)。