✨はじめに
以前こちらの記事で、USB シリアル経由で JSON コマンドを送るだけで I/O を制御できる ESP32-S3 デバイス を紹介しました。
👉 https://qiita.com/Noritama-Lab/items/8b4ae6f8f7738d76fa5b
今回はこの USB 版をベースに従来機能を残しつつ、以下の機能を追加して
ESP32-S3 IO デバイスを “そのまま IoT デバイス” として使えるように進化 させました。
- ネットワーク越しに I/O 制御
- 複数デバイスを同時に扱える
- スマホから操作可能
- USB ケーブル不要で運用できる
まず触ってみたい方は、こちらからファームウェアをダウンロードできます。
👉 https://github.com/noritama-lab/esp32io-firmware/releases/tag/f-v1.0.4
🚀今回のアップデートで何が変わった?
ESP32-S3 IO デバイスが IoT デバイスとして使えるようになったポイントをまとめます。
✔ USB だけでなく Wi‑Fi でも制御可能に
USB 版と同じ JSON コマンドを、HTTP GET で送るだけで動作します。
http://(ESP32のIPアドレス)/api?cmd=ping
ブラウザに入力するだけで応答が返ります。
これにより、スマホ・Python・Raspberry Pi・Excel など
ネットワークにつながるあらゆる環境から I/O を制御可能 になります。
✔ mDNS 対応で固定IP不要
デバイス名でもアクセスできます。
※安定性を求める場合は固定IPの方がおすすめです。
http://ESP32_S3_IO_XXXXXX/api?cmd=ping
XXXXXX は MAC アドレス下位 3 バイトから自動生成。
✔ Web 設定ポータルを搭載
電源投入時に AP モードが起動し、スマホやPCから Wi‑Fi 設定が可能。
- SSID:
ESP32_S3_IO_XXXXXX - PASS:
esp32setup - URL:
http://192.168.4.1またはhttp://ESP32_S3_IO_XXXXXX
設定できる項目:
| 項目 | 内容 |
|---|---|
| WiFi SSID | 接続先のSSID |
| WiFi Password | パスワード |
| Wireless Radio | Enabled / AP Only |
| IP Addressing | DHCP / Static IP |
| RGB LED Mode | WiFi Status / Manual Control |
LED の状態表示例:
| LED | 状態 |
|---|---|
| 緑点灯(ゆっくり) | 接続済 |
| 青点滅 | ネットワーク検索中 |
| 赤高速点滅 | デバイスリセット |
※ BOOT 長押しで設定リセット可能。
✔ API を拡張(LED / システム情報など)
以前公開した部分はそのまま残しつつ機能を追加しています。
Wi‑Fi と USB で 同じ JSON コマンド を利用できます。
コマンドの形式:
{"cmd": "コマンド名", ...}
主なコマンド一覧:
| コマンド名 | 説明 |
|---|---|
read_di |
デジタル入力を読む |
set_do |
デジタル出力を設定 |
get_io_state |
全 I/O 状態をまとめて取得 |
read_adc |
ADC 値を取得 |
set_pwm |
PWM デューティ設定 |
set_pwm_config |
PWM 周波数・分解能設定 |
set_rgb |
内蔵RGB LEDを制御 |
set_led_mode |
LEDモード切替 |
get_status |
稼働時間・メモリ・IPなど取得 |
ping |
生存確認 |
help |
コマンド一覧取得 |
(詳細は記事の最後にある「JSON コマンド一覧」にまとめています)
📡どんな IoT 用途に使える?
Wi‑Fi 対応により、用途が一気に広がります。
✔ Node-RED と組み合わせてダッシュボード化
- DO の ON/OFF
- ADC のグラフ化
- PWM をスライダーで調整
✔ Excel から I/O を制御
HTTP GET なので、WEBSERVICE() で叩けます。
✔ Python で自動化スクリプト
USB でも Wi‑Fi でも同じ JSON を送るだけ。
✔ 教育用途にも最適
- ネットワーク越しの I/O 制御
- JSON API
- mDNS
IoT の基礎が全部詰まっています。
🛠️セットアップ手順(IoT 版)
1. ファームウェアを書き込む
ESP32-S3 用ファームウェア:
👉 https://github.com/noritama-lab/esp32io-firmware/releases/tag/f-v1.0.4
ESP32-S3-DevkitC-1 への書き込み方法:
👉 https://qiita.com/Noritama-Lab/items/d50cff13af655c5e2fd0
2. AP モードで Wi‑Fi 設定
- SSID:
ESP32_S3_IO_XXXXXX - URL:
http://192.168.4.1またはhttp://ESP32_S3_IO_XXXXXX
3. 通常アクセス
http://ESP32_S3_IO_XXXXXX.local
🐍Python から使う(USB / Wi‑Fi)
USB(シリアル)版
import serial
import json
import time
ser = serial.Serial("COMX", 115200, timeout=1)
def send(cmd):
ser.write((json.dumps(cmd) + "\n").encode())
time.sleep(0.05)
resp = ser.readline().decode().strip()
print("Response:", resp)
send({"cmd": "ping"})
send({"cmd": "set_do", "pin_id": 0, "value": 1})
send({"cmd": "read_adc", "pin_id": 0})
Wi‑Fi(HTTP)版
import requests
import json
BASE_URL = "http://ESP32_S3_IO_XXXXXX.local/api"
def send(cmd: dict):
resp = requests.get(BASE_URL, params=cmd, timeout=2)
try:
data = resp.json()
except:
data = resp.text
print("Response:", data)
send({"cmd": "ping"})
send({"cmd": "set_do", "pin_id": 0, "value": 1})
send({"cmd": "read_adc", "pin_id": 0})
🔗GitHub(ファームウェアはこちら)
✅まとめ
今回のアップデートで、USB でも Wi‑Fi でも扱える IoT デバイスが完成しました。
IoT の学習にも、プロトタイピングにも、実運用(安定性は未確認…)にも使える便利なデバイスになったと思います。
今後は、このデバイスを使ったロギングアプリや Excel 連携などに挑戦して記事にしていく予定です。
※このデバイスを Python から扱いやすくするための API をつくって記事にしました。
📘JSON コマンド一覧(詳細)
コマンドは、USB通信 と Wi-Fi通信 で共通です。
| コマンド | 説明 | 入力パラメータ | 応答 |
|---|---|---|---|
read_di |
デジタル入力ピンの値を読み取ります。 |
pin_id: 読み取るデジタル入力ピンのID(0~5)。 |
status: "ok", value: ピンのデジタル値 (0または1)。エラー時はERR_RANGE。 |
set_do |
デジタル出力ピンの値を設定します。 |
pin_id: 設定するデジタル出力ピンのID (0からDIO_OUT_COUNT-1)。value: 設定する値 (0でLOW、1でHIGH)。 |
status: "ok"。エラー時はERR_RANGE。Hardware.writeDOを呼び出します。 |
get_io_state |
すべてのIO (デジタル入力、デジタル出力、ADC、PWM) の現在の状態をまとめて取得します。 | なし |
status: "ok", dio_in: デジタル入力値の配列。dio_out: デジタル出力値の配列。adc: ADC値 (mV) の配列。pwm: PWMデューティ値の配列。 |
read_adc |
指定されたADCピンのアナログ値を読み取ります (複数回サンプリングし平均化)。 |
pin_id: 読み取るADCピンのID (0からADC_COUNT-1)。 |
status: "ok", value: 平均化されたADC値 (mV)。エラー時はERR_RANGE。 |
set_pwm |
指定されたPWMチャンネルのデューティサイクルを設定します。 |
pin_id: 設定するPWMチャンネルのID (0からPWM_COUNT-1)。duty: 設定するデューティ値 (0からgetSafeMaxDuty())。 |
status: "ok", duty: 設定されたデューティ値。エラー時はERR_RANGE。Hardware.setPwmDutyを呼び出します。 |
get_pwm_config |
現在のPWM周波数、分解能、および安全な最大デューティ値を取得します。 | なし |
status: "ok", freq: 現在の周波数。res: 現在の分解能。max_duty: 安全な最大デューティ値。 |
set_pwm_config |
すべてのPWMチャンネルの周波数と分解能を設定します。デューティ値は新しい分解能に合わせて自動的にスケーリングされます。 |
freq: 設定する周波数 (Hz、省略時はDEFAULT_PWM_FREQ)。res: 設定する分解能 (ビット、省略時はDEFAULT_PWM_RES)。 |
status: "ok"。Hardware.applyPwmConfigを呼び出します。 |
set_rgb |
内蔵RGB LEDの色と明るさを設定します。自動的にLEDモードが手動制御に切り替わります。 |
r, g, b: 赤、緑、青の成分 (0-255)。brightness: 明るさ (0-255、省略時は0)。 |
status: "ok", r, g, b, brightness: 設定された色と明るさ。AppNet.setLedStatusMode(false)とHardware.setLedColorを呼び出します。 |
led_off |
内蔵RGB LEDを消灯します。自動的にLEDモードが手動制御に切り替わります。 | なし |
status: "ok"。AppNet.setLedStatusMode(false)とHardware.setLedColor(0,0,0)を呼び出します。 |
set_led_mode |
内蔵RGB LEDの動作モードを設定します。 |
mode: "status" (WiFiステータス表示) または "manual" (手動制御)。 |
status: "ok", mode: 設定されたモード。AppNet.setLedStatusModeを呼び出します。manual設定時はLEDを消灯します。 |
get_led_state |
内蔵RGB LEDの現在の色、明るさ、および点灯状態を取得します。 | なし |
status: "ok", on: 点灯しているか (bool)。r, g, b, brightness: 現在の色と明るさ。 |
get_status |
システムの動作状況 (稼働時間、空きヒープメモリ、WiFi接続状態、IPアドレス) を取得します。 | なし |
status: "ok", uptime_ms: 稼働時間 (ミリ秒)。free_heap: 空きヒープメモリ (バイト)。wifi_connected: WiFi接続状態 (bool)。wifi_ip: WiFiのローカルIPアドレス。ap_ip: アクセスポイントのIPアドレス。 |
ping |
デバイスが応答可能かを確認します。 | なし |
status: "ok", message: "pong"。 |
help |
利用可能なすべてのAPIコマンドの一覧を返します。 | なし |
status: "ok", commands: 利用可能なコマンド名の配列。 |



