ESPでhttps


マイコンからホームページの情報を読み取る必要が出て来たが,意外に苦労したので,分かったことを書いておこうと思う.近年はほとんどのホームページはhttpsになっており,httpに比べてアクセスするのが複雑になった.wifiを使いたかったので,ESP8266にmicropythonを入れてhttpsを読み取ろうと思ったが,EPS32を使ってなんとか繋ぐことに成功した.基本的な作業はdebian13で行った.

まず,EPS8266にmicropythonを入れる作業である.https://micropython.org/download/ESP8266_GENERIC/から現在の最新であるESP8266_GENERIC-20250415-v1.25.0.binを取ってきた.そして,書き込みtoolであるesptoolをaptでinstallする.ESP8266ボードをUSBに接続して,

esptool --port /dev/ttyUSB0 erase_flash
esptool --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ESP8266_GENERIC-20250415-v1.25.0.bin

のようにして,書き込みをする.

次に,micropythonの動作確認である.シリアルのターミナルを使うのだが,今回はgtktermというのを使ってみた.これをaptで入れてから,

gtkterm -p /dev/ttyUSB0 -s 115200

と立ち上げる.設定を変える必要があったら,Configuration-Portから変更できる. そして,ESP8266ボードのRSTボタンを押すと,micropythonのプロンプトがターミナルに表示される.

ここまではあっさりと進んだが,その後は試行錯誤が必要だった.このversionのmicropythonにはusslというmoduleが無いことが分かり,v1.20.0やv1.12にはusslがあることを確認したが,いくつかの原因でerrorが出てしまう.ESP32で無いと動かないと判断して,手元にあるEPS-WROOM32を使うことにした.

debianでは,ESP32に必要なesptoolのファイルが欠けているようで,

wget https://raw.githubusercontent.com/espressif/esptool/refs/heads/master/esptool/targets/stub_flasher/1/esp32.json
mv esp32.json stub_flasher_32.json
sudo cp stub_flasher_32.json /usr/lib/python3/dist-packages/esptool/targets/stub_flasher/

とする必要があった.また,esptoolで書き込む際には,BOOTボタンを押したまま,ENボタンを押して離し,BOOTボタンを離すことによって,BOOTモードに移行しておく.binをhttps://micropython.org/download/ESP32_GENERIC/から取って来るのだが,最新版はusslが無かったので,今回はv1.20.0を使った.そしてハマったのが書き込みで,アドレスを指定しないといけなくて,

esptool --port /dev/ttyUSB0 --baud 460800 write_flash 0x1000 ESP32_GENERIC-20230426-v1.20.0.bin

としたら良いということに気づくのにかなり時間がかかってしまった.micropythonのページにはチャンと書いてあるのだが,ESP8266と同じだろうと思って読み飛ばしていた.ENがリセットボタンに対応することにも注意が必要である.

やっと準備が終わったのだが,その後もネットの情報を頼りに,usocketを使ったプログラムをいじってみたが,errorが出てうまく行かず,最終的にはurequestsを使ったらアクセスすることに成功した.そのプログラムが以下のものです.

import urequests
import ussl
import network
import utime

ssid = "wifi_ssid"
passkey = "wifi_password"
timeout=30

wifi= network.WLAN(network.STA_IF)
wifi.active(True)

while True:
  wifi.connect(ssid, passkey)
  to=timeout
  while not wifi.isconnected() and to > 0:
    utime.sleep(1);to -= 1
  if wifi.isconnected():
    response = urequests.get("https://google.com/")
    print(response.text)
    response.close()
  wifi.disconnect()
  gc.collect()
  utime.sleep(60)

いろいろなトラップがあって,苦労した.他のやり方もあるかも知れないけど,今回はこれを使ってみよう.次はDACだな.こっちはそれほど苦労しないと思うけど.