ESP32でMicroPython:ソフトウェアエンジニア向け「爆速」IoT開発ガイド

Python tutorial - IT technology blog
Python tutorial - IT technology blog

5分で完了:ESP32で最初のコードを動かす

以前は、組み込み開発といえば複雑なC++の構文やデバッグが困難なメモリリーク(memory leak)を連想してしまい、敬遠していました。MicroPythonがその常識を完全に変えました。今では、数行の簡潔なPythonコードだけでLEDの制御やセンサー値の読み取りが可能です。

まずは、以下の基本キットを準備しましょう:

  • ESP32ボード: DevKit V1がおすすめです(価格は約500円〜800円程度)。
  • Micro-USBケーブル: データ転送対応のもの(data cable)。
  • Thonny IDE: 非常に軽量で、インストール後すぐにMicroPythonを使用できるツールです。

ステップ1:ファームウェアの書き込み – チップに「魂」を吹き込む

Thonnyを開き、Tools > Options > InterpreterからMicroPython (ESP32)を選択します。次に、Install or update MicroPythonをクリックします。ここで適切なCOMポートとmicropython.orgからダウンロードしたファームウェアファイル(.bin)を選択します。このプロセスは通常30秒もかかりません。

ヒント: もしThonnyがボードを認識しない場合は、書き込み(flash)開始時にESP32のBOOTボタンを長押ししてみてください。

ステップ2:真の「Hello World」を書く

画面に文字を表示する代わりに、ハードウェアの世界ではLEDを点滅させることで挨拶をします。以下のコードをThonnyにコピーしてください:

from machine import Pin
import time

# GPIO 2番ピンは通常, ESP32のオンボードLEDに接続されています
led = Pin(2, Pin.OUT)

while True:
    led.value(1)  # LED点灯
    time.sleep(0.5)
    led.value(0)  # LED消灯
    time.sleep(0.5)

F5キーを押して結果を確認しましょう。ボード上の小さなLEDが規則的に点滅し始めます。これで正式にハードウェアを制御できたことになります!

MicroPython vs Arduino (C++): なぜ移行すべきなのか?

以前、ArduinoでHTTPライブラリを設定するだけで午前中を丸々潰したことがありました。MicroPythonなら、同じ作業がわずか10行のコードで済みます。その差は開発スピードにあります。

最大のメリットは**REPL (Read-Eval-Print Loop)**です。ターミナルウィンドウに直接コマンドを入力すると、ボードが即座に実行します。コンパイル(compile)を待つ必要も、プログラム全体を書き込み直す必要もありません。その結果、プロトタイピングのプロセスは従来の方法より3倍速くなります。

デュアルコア240MHz、520KB RAMというスペックを持つESP32は、スマートホームプロジェクトや軽量な産業用ゲートウェイ向けのPythonランタイムを動かすのに十分な性能を持っています。

実践プロジェクト:温度監視Webサーバー

より実用的なアプリケーションにアップグレードしましょう:DHT11センサーからデータを読み取り、ESP32自身が立ち上げたWebインターフェースに表示させます。

ハードウェアの接続

  • DHT11 VCCをESP32の3.3Vピンに接続。
  • DHT11 GNDをGNDピンに接続。
  • DHT11 DATAをGPIO 4番ピンに接続。

Webサーバー構築スクリプト

import network
import socket
import dht
from machine import Pin

# WiFi設定
ssid = 'あなたのWiFi名'
password = 'あなたのWiFiパスワード'

# ネットワーク接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

while not wlan.isconnected():
    pass

print('あなたのIPアドレス:', wlan.ifconfig()[0])
sensor = dht.DHT11(Pin(4))

def get_html(temp, hum):
    return f"""HTTP/1.1 200 OK\nContent-Type: text/html\n\n
    <html><body><h1>ESP32 Monitor</h1>
    <p>温度: {temp}C</p><p>湿度: {hum}%</p>
    </body></html>"""

# Socketの初期化
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
    conn, addr = s.accept()
    sensor.measure()
    response = get_html(sensor.temperature(), sensor.humidity())
    conn.send(response)
    conn.close()

スクリプトを実行し、スマホのブラウザを開いてThonnyに表示されたIPアドレスにアクセスしてください。室温のデータがリアルタイムで更新されるのが確認できるはずです。これで基本的なスマートホームシステムの完成です!

チップの破損やフリーズを防ぐための「3つの重要ポイント」

何度もボードを壊したり原因不明のエラーに遭遇したりした結果、得られた3つの貴重な教訓を紹介します:

  1. 手動でのメモリ解放: MicroPythonにはガベージコレクタ(Garbage Collector)がありますが、メモリが限られているため、大きなJSON文字列や長いHTMLを処理した後は明示的にgc.collect()を呼び出すのが賢明です。
  2. ループを「空回し」させない: while True: passのようなコードは絶対に避けてください。必ずtime.sleep_ms(10)などを追加しましょう。これによりCPUに休息を与え、チップの温度を5〜10度下げることができ、バッテリーの節約にも繋がります。
  3. 例外処理 (Exception Handling): IoTデバイスはネットワークが頻繁に切断されます。接続コードは必ずtry...exceptブロックで囲んでください。そうしないと、一度WiFiが切れただけでデバイス全体がフリーズし、手動での再起動が必要になってしまいます。

応用:MQTTでプロフェッショナルなシステムへ

Webサーバーは単純な用途には向いていますが、数百台のデバイスを管理したい場合は**MQTT**が必要です。これはESP32がHome AssistantやAWS IoTなどのプラットフォームと通信するための標準プロトコルです。

倉庫監視プロジェクトでの私の経験では、umqtt.simpleライブラリを使用しました。クライアントが直接ESP32にアクセスするのではなく、ボードが能動的にブローカー(Mosquittoなど)にデータを送信するようにします。この方法により、システムのセキュリティが高まり、多くの人が同時にデータを閲覧しても負荷がかかりにくくなります。

ハードウェア開発は決して怖くありません。MicroPythonなら、どんな失敗もリセットボタン一つでやり直せます。今日から始めてみましょう!

Share: