■micropythonOS上のpythonコードでUART、MQTTを扱うことについて、
AIに質問した。
Q:所定のボタンを押すと画面が処理メニューボタンの群に変わり、処理メニューボタンのなかのQRコード待ちボタンを押すとQRコードリーダからのデータを待つ。受けたデータに応じて所定の処理を行い、結果をMQTTでPublishする。
A:
素晴らしいシステム構成ですね!「ボタンによる画面遷移 ➔ QRコード入力待ち(UART) ➔ データ処理 ➔ MQTT送信」という一連のワークフローは、MicroPythonOSとLVGL、そしてMicroPythonの得意分野です。
この処理を実現するためのプログラムの全体構造と、画面遷移・UART・MQTTを連携させる具体的な実装コードのテンプレートを作成しました。
------------------------------
## 🧱 システムの全体構造(3つの状態)
プログラムを分かりやすく保つため、画面(状態)を以下の3つに分けて管理します。
[ 1. 初期画面 ] ──(所定のボタンを押す)──► [ 2. 処理メニュー画面 ]
│
(QRコード待ちボタンを押す)
▼
[ 3. QRコード待ち状態 ] ◄──(MQTT送信完了)─── [データ受信・処理]
------------------------------
## 💻 実装コードテンプレート
PCから転送して実行するメインプログラムの例です。MicroPython標準の umqtt.simple ライブラリと machine.UART、そして lvgl を組み合わせます。
import lvgl as lvfrom machine import UARTfrom umqtt.simple import MQTTClientimport jsonimport time
# ==========================================
# 1. 各種初期設定 (環境に合わせて変更してください)
# ==========================================
# MQTT設定MQTT_BROKER = "111.222.333.444" # サーバーのIPMQTT_TOPIC = "device/qr_result"mqtt_client = MQTTClient("esp32_qr_node", MQTT_BROKER)
# UART設定 (QRコードリーダー接続用)# ポート、ピン番号、ボーレートはハードウェアに合わせて調整uart = UART(1, baudrate=9600, tx=17, rx=18)
# 状態管理フラグis_waiting_qr = False
# ==========================================
# 2. バックグラウンド処理(QRコード監視・MQTT送信)
# ==========================================
def check_qr_reader():
"""定期的に呼び出され、QRデータがあれば処理してMQTT送信する関数"""
global is_waiting_qr
if not is_waiting_qr:
return
if uart.any():
raw_data = uart.readline()
try:
# データの受信と整形
qr_text = raw_data.decode('utf-8').strip()
if qr_text:
print(f"QRコード受信: {qr_text}")
update_status_label("Data processing...")
# --- ここでデータに応じた所定の処理を行う ---
payload = {
"status": "success",
"data": qr_text,
"timestamp": time.time()
}
# MQTTで結果をPublish
mqtt_client.publish(MQTT_TOPIC, json.dumps(payload))
print("MQTT Publish 完了")
# 処理が終わったら待ち状態を解除し、メニューに戻す
is_waiting_qr = False
show_menu_screen()
except Exception as e:
print("エラー発生:", e)
# LVGLのタイマー機能を使って、20msごとにQRコードの受信を監視qr_timer = lv.timer_create(lambda t: check_qr_reader(), 20, None)
# ==========================================
# 3. 画面描画と遷移の処理 (LVGL)
# ==========================================
def clear_screen():
"""画面上の古い要素を削除するヘルパー関数"""
scr = lv.scr_act()
scr.clean()
def show_init_screen():
"""1. 初期画面を表示"""
clear_screen()
# 開始ボタン
btn = lv.btn(lv.scr_act())
btn.align(lv.ALIGN.CENTER, 0, 0)
btn.set_size(160, 60)
# ボタンが押されたらメニュー画面へ
btn.add_event_cb(lambda e: show_menu_screen() if e.get_code() == lv.EVENT.CLICKED else None, lv.EVENT.CLICKED, None)
lbl = lv.label(btn)
lbl.set_text("START SYSTEM")
lbl.center()
def show_menu_screen():
"""2. 処理メニュー画面を表示(ボタンの群)"""
clear_screen()
# 例としてメニューボタンを2つ縦に並べる
# ボタン1: QRコード待ち
btn_qr = lv.btn(lv.scr_act())
btn_qr.align(lv.ALIGN.CENTER, 0, -40)
btn_qr.set_size(180, 50)
btn_qr.add_event_cb(lambda e: start_qr_waiting() if e.get_code() == lv.EVENT.CLICKED else None, lv.EVENT.CLICKED, None)
lbl_qr = lv.label(btn_qr)
lbl_qr.set_text("Read QR Code")
lbl_qr.center()
# ボタン2: その他の処理メニュー(拡張用)
btn_other = lv.btn(lv.scr_act())
btn_other.align(lv.ALIGN.CENTER, 0, 40)
btn_other.set_size(180, 50)
lbl_other = lv.label(btn_other)
lbl_other.set_text("Other Menu")
lbl_other.center()
status_label = Nonedef start_qr_waiting():
"""3. QRコード待ち状態の画面に切り替え"""
global is_waiting_qr, status_label
clear_screen()
# 読み取り中メッセージの表示
status_label = lv.label(lv.scr_act())
status_label.set_text("Please Scan QR Code...")
status_label.align(lv.ALIGN.CENTER, 0, -20)
# キャンセルボタン
btn_cancel = lv.btn(lv.scr_act())
btn_cancel.align(lv.ALIGN.CENTER, 0, 50)
btn_cancel.set_size(120, 40)
def cancel_action(e):
global is_waiting_qr
is_waiting_qr = False # 待ち状態解除
show_menu_screen() # メニューに戻る
btn_cancel.add_event_cb(lambda e: cancel_action(e) if e.get_code() == lv.EVENT.CLICKED else None, lv.EVENT.CLICKED, None)
lbl_cancel = lv.label(btn_cancel)
lbl_cancel.set_text("Cancel")
lbl_cancel.center()
# QRコードの監視フラグをONにする
is_waiting_qr = True
def update_status_label(text):
"""状態テキストを更新するヘルパー"""
global status_label
if status_label:
status_label.set_text(text)
# ==========================================
# 4. システムの起動
# ==========================================try:
print("MQTTサーバーに接続中...")
mqtt_client.connect()
print("MQTT接続成功")except Exception as e:
print("MQTT接続失敗 (オフラインモードで続行します):", e)
# 最初の画面を表示
show_init_screen()
------------------------------
## 💡 実装のポイント解説
1. lv.timer_create による疑似マルチタスク
MicroPythonで while True の中で time.sleep() を使ってシリアルを待ち受けると、画面のタッチ操作(LVGL)が完全にフリーズしてしまいます。そのため、LVGLが提供するバックグラウンドタイマーを使い、「画面を描画しつつ、20ミリ秒ごとに一瞬だけUARTポートを覗きに行く」 という処理の仕方をしています。
2. is_waiting_qr フラグでの制御
「QRコード待ちボタン」が押された時だけフラグを True にし、それ以外の画面(初期画面やメニュー画面など)にいる時は、リーダーにQRコードが不意にかざされても無視(またはバッファをクリア)するようにしています。
3. scr.clean() によるスマートな画面遷移
ボタン群を消して新しい画面にする際、LVGLでは現在のアクティブな画面(lv.scr_act())の中身を .clean() で一度きれいに削除し、新しくボタンやラベルを配置し直すのが一番メモリ消費が少なく簡単な遷移方法です。
このコードを実行する前に、MQTTブローカー(サーバー)や、MicroPythonのWi-Fi接続設定はすでに完了していますでしょうか?
もし「ボード起動時に自動でWi-FiとMQTTに接続する設定方法」や、「MQTTで送るJSONデータ構造の具体的な設計」についてサポートが必要であれば、いつでもお申し付けください!
Q:MQTTではJSONではなく、単純な文字列を送るだけである。モジュールumqtt.simpleはOSのない普通のモジュールでよいのか?それともmaicropythonOS専用なのか?
A:
結論から言うと、umqtt.simple はMicroPythonOS専用ではなく、OSのない環境でも広く使われている「MicroPython公式の標準(汎用)モジュール」です。 [1, 2]
そのため、OSの有無に関わらず、インターネット(Wi-Fi)にさえ繋がっていれば、全く同じコードで動作します。また、JSONではなく単純な文字列(プレーンテキスト)を送信することも、何の問題もなく可能です。 [3]
詳しい仕様と、シンプルな文字列を送信する場合の変更点について解説します。
------------------------------
## 1. umqtt.simple の位置づけ
*
* MicroPythonの開発チームが公式にメンテナンスしているライブラリ群(micropython-lib)の一部です。
* マイコンの非常に限られたメモリで動作するように限界まで軽量化されています。
* MicroPythonOSは、この一般的な公式モジュールをそのままシステム内部に組み込んで利用しています。 [1, 2, 4]
*
## 2. 単純な文字列を送る場合のコード変更
前回のコードではデータをJSON形式に変換(json.dumps)していましたが、ただの文字列を送りたい場合は、その文字列をバイト列(bytes)に変換するだけで送信できます。
## 変更前(JSON形式):
payload = {"status": "success", "data": qr_text}
mqtt_client.publish(MQTT_TOPIC, json.dumps(payload)) # JSON文字列を送信
## 変更後(単純な文字列形式):
publish() メソッドには文字列をそのまま渡すか、あるいは明示的に .encode('utf-8') を使ってバイト列に変換して渡します。
# QRコードリーダーから受け取った文字列(例: "123456789")をそのまま送信する場合
mqtt_client.publish(MQTT_TOPIC, qr_text)
# または、明示的にエンコードして送信(こちらの方がより確実です)
mqtt_client.publish(MQTT_TOPIC, qr_text.encode('utf-8'))
------------------------------
## 💡 運用のTips:通信が不安定な場合の選択肢
もし、工場や屋外など「Wi-Fiがたまに切れるかもしれない環境」で運用する場合、umqtt.simple は接続が切れた後の自動再接続機能を持っていません。 [2]
その場合は、同じく公式の umqtt.robust というモジュールを代わりに使う(from umqtt.robust import MQTTClient)ことで、ネットワークエラーが発生した際にバックグラウンドで自動的に再接続を試みてくれるようになるため、システムの信頼性が向上します。コードの書き方は simple と完全に共通です。 [2, 4]
これで実装のイメージは固まりましたでしょうか?
*
* 実際にボードにコードを書き込んでテスト通信を行ってみたい
* データを送信する先の MQTTブローカー(サーバー)の設定方法を知りたい
*
など、次のステップに進む際はお気軽にお知らせください!
[1] [https://mpython.readthedocs.io](https://mpython.readthedocs.io/en/v2.2.1/library/mPython/umqtt.simple.html)
[2] [https://github.com](https://github.com/micropython/micropython-lib/blob/master/micropython/umqtt.robust/README.rst)
[3] [https://github.com](https://github.com/agners/micropython-ha-mqtt-device)
[4] [https://uiflow-micropython.readthedocs.io](https://uiflow-micropython.readthedocs.io/en/2.2.6/software/umqtt.html)
Q:MQTTブローカーは既に設置済みである。ボードはRaspberryPi-iPICO2Wを適用する。このときGPIBの空きは何本あるか?
A:
Raspberry Pi Pico 2 W を使用する場合、ユーザーが自由に使える外部のGPIOピン(空きピン)は全部で 26本あります。 [1, 2]
今回の「タッチパネル画面(LVGL操作)+ UART(QR百リーダー)」のシステムを構築する場合、ここからシステム専用にピンが消費されます。空きの内訳と残り本数は以下のようになります。
## 🔌 ピンの消費内訳(シミュレーション)
1. ベースの利用可能ピン: 26本(GP0〜GP22、および GP26〜GP28)
* ※Pico 2 WのWi-Fi/Bluetooth通信処理(内部接続)用として、一部のピン(GP23〜GP25、GP29)が基板内で最初から固定消費されています。 [1, 3, 4]
2. UART接続(QRコードリーダー)で消費: 2本
* TXとRXで2本使用します(例: GP0 と GP1、または GP4 と GP5 など自由なペアを選択可能)。 [5]
3. SPI接続(タッチパネル液晶)で消費: 約 6〜8本
* お使いの液晶ディスプレイ(SPI通信仕様)の構成によりますが、一般的な構成では以下のピンを消費します。
* SPI通信用: 3本(CLK, MOSI, MISO)
* 制御・タッチ用: 3〜5本(CS, DC, RST, Touch-CS, IRQ など)
## 📊 最終的な「完全フリーな空きピン」の残り本数
液晶のピンアサインを多めに見積もって合計10本(UART 2本 + 液晶 8本)をシステム用として固定した場合:
*
* 26本 − 10本 = 残り「約 16本」
*
センサーの追加、インジケーター用LEDの制御、ブザーの鳴動、あるいは物理ボタンの追加などを行うには十分すぎるほどの空き(16本前後)が残ります。
------------------------------
## ⚠ Raspberry Pi Pico 2 W を選ぶ際の「超重要」な注意点
現在、今回実現したいシステムに対してPico 2 W(および通常のPico W)を適用するにあたり、2つだけ大きなハードルがあります。
1. MicroPythonOSが「RP2350」に完全対応しているか
[MicroPythonOS](https://github.com/MicroPythonOS/MicroPythonOS) は主に「ESP32 / ESP32-S3」をターゲットに開発されています。Pico 2 Wに搭載されている新しいチップ「RP2350」用のファームウェアや、LVGLのディスプレイドライバの自動構成(Web Installer)が対応しているか事前に確認が必要です。もし非対応の場合、OSなしの「通常のMicroPython」環境でLVGL画面を自前で立ち上げるコードを書く必要があります。
2. ディスプレイの配線(はんだ付け)の手間
ESP32系の「タッチパネル付き開発ボード」であれば画面が最初から一体化していますが、Pico 2 Wの場合は「Pico 2 W本体」と「別売りのタッチパネル液晶モジュール」をジャンパ線や基板ではんだ付けして繋ぐ必要があります。
ハードウェアの選定において、以下のどちらの方向性が理想に近いでしょうか?
*
* 多少の手間(画面の配線やファームウェアの自作)がかかっても、性能の高い Pico 2 W で進めたい
* はんだ付けや画面の接続トラブルを避けたいので、画面一体型のボード(ESP32-S3搭載ボードなど)で手軽に進めたい
*
ご希望に合わせて、Pico 2 Wに液晶を繋ぐ場合の具体的なピンアサインや、代替ボードの提案を行います。
[1] [https://pip.raspberrypi.com](https://pip.raspberrypi.com/documents/RP-008304-DS)
[2] [https://docs.sunfounder.com](https://docs.sunfounder.com/projects/pico-2w-kit/ja/latest/introduction_to_pico_2w.html)
[3] [https://www.nextpcb.com](https://www.nextpcb.com/blog/raspberry-pi-pico-pinout)
[4] [https://pip.raspberrypi.com](https://pip.raspberrypi.com/documents/RP-008304-DS)
[5] [https://www.etechnophiles.com](https://www.etechnophiles.com/raspberry-pi-pico-pinout-specifications-datasheet-in-detail/)
Q:PICO2Wをやめて、ESP32を採用する。Wifi接続可能なESP32の動作速度とRAMが多いもので推奨はどれか?それは現在日本の技適を取得しているか?
A:
画面(LVGL)を扱い、Wi-Fi通信を行う用途であれば、現在最も推奨されるのは 「ESP32-S3」チップを搭載し、外部拡張メモリ(PSRAM)が8MB載っているモデル です。
通常のESP32よりも動作速度(クロック)が向上し、グラフィック処理用の命令セットを持つため、MicroPythonOSの滑らかな画面遷移には必須のスペックとなります。
日本国内での利用に不可欠な 技適(技術基準適合証明)についても、正規の流通品(日本のショップや公式ストア等)であれば取得済み です。 [1]
おすすめの具体的なボードと、技適に関する重要な注意点をまとめました。
------------------------------
## 🚀 推奨チップ・スペック
*
* チップ: ESP32-S3(Xtensa 32ビット LX7 デュアルコア、最大240MHz) [2]
* メモリ(重要): Flash 16MB / PSRAM 8MB(型番に「N16R8」と付く構成がベストです)
* ※内蔵RAMの512KBだけでは、LVGLの画面描画とWi-Fi通信、さらにプログラムの実行を同時に行うとすぐにメモリが枯渇します。必ず外付けの PSRAMが8MB 追加されているものを選んでください。 [1]
*
------------------------------
## 📱 推奨される「画面一体型」開発ボード(技適クリア済)
MicroPythonOS公式のインストーラーが最初から対応しており、はんだ付けなしで画面が動くおすすめのボードです。
------------------------------
[Waveshare ESP32-S3-Touch-LCD-2](https://www.google.com/search?q=Waveshare+ESP32-S3+2%22+Capacitive+Touch+Display+Development+Board,+240+x+320+Pixels,+IPS+Panel,+32-bit+LX7+Dual+Core+Processor,+Up+to+240MHz+Frequency,&ibp=oshop&pvorigin=29&prds=productid:17115009908087967117,imageDocid:1237255552746101528,pvt:hg,pvo:29,headlineOfferDocid:17115009908087967117)
* 特徴: MicroPythonOSが公式にターゲットとして動作検証・テストを行っている2インチのタッチパネル液晶付きボードです。
* 技適について: 基板上に、日本国内の技適を取得している正規の無線モジュール(ESP32-S3-WROOM-1 など)が実装されており、日本国内で安心してWi-Fi/Bluetooth通信を行えます。
* 拡張性: 小型ながらUARTやI2Cなどのピンが外部コネクタとして引き出せるため、今回の「QRコードリーダー」との接続も簡単に行えます。
------------------------------
[Waveshare ESP32-S3 4.3インチ 静電容量式タッチLCD開発ボード B](https://www.google.com/search?q=ESP32-S3+4.3%E3%82%A4%E3%83%B3%E3%83%81+%E9%9D%99%E9%9B%BB%E5%AE%B9%E9%87%8F%E5%BC%8F%E3%82%BF%E3%83%83%E3%83%81LCD%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89+%E3%82%BF%E3%82%A4%E3%83%97B+%E3%82%B1%E3%83%BC%E3%82%B9%E4%BB%98%E3%81%8D+800%C3%97480+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+IPS+%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4+2.4GHz+WiFi%E3%81%A8BLE+5%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%80%8132%E3%83%93%E3%83%83%E3%83%88LX7%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%B3%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5&ibp=oshop&pvorigin=29&prds=catalogid:4777629920029723028,productid:3627144874389398014,imageDocid:4603653118506045076,gpcid:16409480905819346892,pvt:hg,pvo:29,headlineOfferDocid:13458397330456378933)
* 特徴: 画面を大きくして、より視認性の高い処理メニュー画面を作りたい場合に最適です(4.3インチ、800×480解像度)。
* スペック: もちろん ESP32-S3-N16R8(16MB Flash / 8MB PSRAM)を搭載しており、技適付きモジュールが採用されています。 [1, 3, 4]
------------------------------
## ⚠ 技適(技術基準適合証明)に関する購入時の注意点
ESP32-S3のコアモジュール自体は日本の技適を正式に通過していますが、「どこから購入するか」によって法律上の問題が発生するリスクがあります。 [1]
1. 製造時期や流通ルートによる「マーク刻印」の有無
海外の格安ECサイト(AliExpressなど)から直接購入した場合、中身のチップが同じでも、基板上の金属シールドに「技適マーク(郵便マークのようなロゴ)」や「R番号」が物理的に印刷されていない古い在庫が届くケースがあります。法律上、マークの刻印がないものは国内で電波を発信(Wi-Fi接続)できません。 [1, 5, 6]
2. 安全な購入方法
[秋月電子通商](https://akizukidenshi.com/) や [スイッチサイエンス](https://www.switch-science.com/) などの日本の大手電子部品ショップ、またはAmazon等で日本の代理店(Waveshare公式など)が出荷しているものを購入すれば、確実に技適マーク付きの製品を手に入れることができます。 [1]
購入される際は、商品画像や説明欄に「技適マーク付き」「国内正規品」の記載があるか、またはレビュー等で確認することをおすすめします。 [5, 6]
これでハードウェアの方向性が「画面一体型の高性能ESP32-S3(技適対応)」に定まりましたね!
*
* 推奨した Waveshareの2インチ、または4.3インチボードのいずれかで進めますか?
* それとも、画面サイズや形状に関して他に希望する仕様(例:ケースに入っているもの、防水など)はありますでしょうか?
*
[1] [https://note.com](https://note.com/njrecalls/n/ncea0f9bffe19)
[2] [https://jisaku.com](https://jisaku.com/posts/esp32-s3-projects-2026)
[3] [https://www.amazon.co.jp](https://www.amazon.co.jp/WaveShare-ESP32-S3-Touch-LCD-2-Waveshare-ESP32-S3/dp/B0DTTL56ZR)
[4] [https://www.amazon.co.jp](https://www.amazon.co.jp/Wonrabai-ESP32-S3-Touch-LCD-2-8-ESP32-S3-2-8%E3%82%A4%E3%83%B3%E3%83%81%E9%9D%99%E9%9B%BB%E5%AE%B9%E9%87%8F%E5%BC%8F%E3%82%BF%E3%83%83%E3%83%81%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E4%BB%98%E3%81%8D-240%C3%97320%E3%80%815%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%BF%E3%83%83%E3%83%81IPS%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%80%8132%E3%83%93%E3%83%83%E3%83%88LX7%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%B3%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%80%81GPIO%E3%80%81UART%E3%80%81I2C%E3%81%A7%E6%8B%A1%E5%BC%B5%E6%80%A7%E3%82%92%E5%90%91%E4%B8%8A%E3%80%812030%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E4%BB%98%E3%81%8D/dp/B0D9H81WTN)
[5] [https://lang-ship.com](https://lang-ship.com/blog/work/esp32-s3-devkit/)
[6] [https://lang-ship.com](https://lang-ship.com/blog/work/esp32-s3-devkit/)
Q:ESP32-S3を使う場合、空きとなるGPIBのピン数は何本か?
A:
ESP32-S3チップ単体としては最大45本のGPIOピンを持っていますが、先ほど推奨したような「タッチパネル画面一体型の開発ボード」を使用する場合、実際にユーザーが外部拡張に使えるピン(空きピン)の数はボードの設計によって大きく異なります。
画面の駆動方式(SPI接続か、RGB平行接続か)や画面サイズによってピンの消費量が劇的に変わるため、具体的な2つのケースに分けて解説します。
------------------------------
## 📱 ケース1:Waveshare ESP32-S3-Touch-LCD-2(2インチ型)の場合
*
* 外部へ引き出されている総GPIOピン数: 22本
* 画面(SPI接続)やタッチパネル(I2C)、SDカードスロットなどは基板内部で配線が完了しているため、それらにピンを奪われる心配はありません。 [1, 2]
* ここから今回のシステムで消費するピン: 2本
* UART接続のQRコードリーダー(TX / RX)で2本消費します。
* 自由に使える最終的な「空きピン」: 20本
*
💡 結論:
非常に多くの空きピン(20本)が残るため、センサーの追加、インジケーターLED、リレー、スイッチの追加など、一般的な電子工作でピン不足に悩まされることはまずありません。
------------------------------
## 🖥️ ケース2:Waveshare ESP32-S3-Touch-LCD-4.3(4.3インチ大型)の場合
*
* 外部へ引き出されているピン数: 極少(実質4〜6本の専用コネクタのみ)
* 注意点: 4.3インチクラスの大型・高解像度(800×480など)液晶は、高速に描画するために「RGBインターフェース」という方式でESP32-S3と接続されています。この方式は一画面で20本以上のGPIOピンを占有するため、マイコンの空きピンがほぼ全て画面に使い果たされてしまいます。 [3, 4, 5]
* 外部拡張の仕組み:
* このボードではピン不足を補うため、基板上に「IO拡張チップ(CH422G)」が搭載されています。
* 外部センサー等を繋ぐために、PH2.0規格の専用コネクタ(I2C用、ADCアナログ用、RS485用など)が最初から数個用意されています。 [4, 5, 6]
* 今回のシステムで消費するピン: 0〜2本
* 基板上の拡張コネクタ(またはRS485通信など)をUARTに転用するか、最初から用意されている通信ポートを利用します。
*
💡 結論:
「自由に一本ずつ制御できる汎用ピン」はほぼ残っていません。ただし、あらかじめ基板に用意されている専用コネクタ(I2Cや各種インターフェース)を経由して周辺機器を拡張する形になります。
------------------------------
## 🛠️ どちらを選ぶべき?
*
* 「QRコードリーダー以外にも、LEDやスイッチ、自作の回路をたくさんピンに繋ぎたい」
👉 拡張ピンが20本綺麗に残る [2インチ型(Touch-LCD-2)](https://docs.waveshare.com/ESP32-S3-Touch-LCD-2) がおすすめです。
* 「基本はQRコードリーダーと画面操作だけで完結する。とにかく画面が大きくて見やすいメニューを作りたい」
👉 拡張性は制限されますが、視認性が抜群な [4.3インチ型](https://docs.waveshare.com/ESP32-S3-Touch-LCD-4.3) が適しています。
*
今回のシステムでは、QRコードリーダーのほかに「物理的なLEDランプ、警報ブザー、外部のセンサー」などをGPIOピンに直接繋ぐ予定はありますでしょうか?
もしあるようでしたら、ピンに余裕のある 2インチ型 をベースに進めるのが安全です。
[1] [https://docs.waveshare.com](https://docs.waveshare.com/ESP32-S3-Touch-LCD-2)
[2] [https://circuitpython.org](https://circuitpython.org/board/waveshare_esp32_s3_touch_lcd_2/)
[3] [https://components.espressif.com](https://components.espressif.com/components/bobscott45/waveshare_esp32_s3_touch_lcd_4_3/versions/1.0.3/readme)
[4] [https://m.media-amazon.com](https://m.media-amazon.com/images/I/B1Xu-YN3N5L.pdf?ref=dp_product_quick_view)
[5] [https://manuals.plus](https://manuals.plus/m/06620ecee539063e210dbfc4c7c47fa2a7bef542a3979aef02c5db5e0932378b)
[6] [https://docs.waveshare.com](https://docs.waveshare.com/ESP32-S3-Touch-LCD-4.3/FAQ)
Q:画面一体型ならば2インチを採用する。もし画面一体型でなく、ESP32-S3基板のGPIOとSPI接続のiLi9341を自分で接続する場、ESP32-S3基板はなにを採用すればよいか?
A:
画面一体型ではなく、ご自身で ILI9341(SPI接続・タッチパネル付等) を配線して接続する場合、採用すべきベース基板はエスプレッシフ(Espressif)社が設計しているリファレンスボードの互換品(あるいは正規品)です。
MicroPythonOSやLVGLを動かすためのスペック(16MB Flash / 8MB PSRAM)を満たし、かつ日本の技適をクリアしている最適なボードは以下の通りです。
------------------------------
## 👑 採用すべきおすすめの基板
------------------------------
[ESP32 S3 N16R8 DevKitC-1 モジュール ESP32 S3 開発ボード デュアルコア LX7 16MB フラッシュ + 8MB PSRAM WiFi Bluetooth 5.0 USB-C 外部アンテナサポート Arduino IDE対応 IoT用](https://www.google.com/search?q=ESP32+S3+N16R8+DevKitC-1+%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB+ESP32+S3+%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89+%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%B3%E3%82%A2+LX7+16MB+%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5+%2B+8MB+PSRAM+WiFi+Bluetooth+5.0+USB-C+%E5%A4%96%E9%83%A8%E3%82%A2%E3%83%B3%E3%83%86%E3%83%8A%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88+Arduino+IDE%E5%AF%BE%E5%BF%9C+IoT%E7%94%A8&ibp=oshop&pvorigin=29&prds=productid:6506375832452016269,imageDocid:2100795553953734769,pvt:hg,pvo:29,headlineOfferDocid:6506375832452016269)
ESP32-S3-DevKitC-1 N16R8 または N8R8
* 理由: エスプレッシフ公式の標準開発ボード(DevKitC-1)の形状で、ピンヘッダが左右に広く引き出されているため、ブレッドボードへの接続や手配線(はんだ付け)が最も簡単です。
* スペック: 必ず型番の末尾が 「N16R8」(Flash 16MB / PSRAM 8MB) または 「N8R8」(Flash 8MB / PSRAM 8MB) のものを選んでください(※R8の「8」がPSRAM 8MBを意味します)。
* 技適について: この基板に載っている金属シールド付きの無線モジュール「ESP32-S3-WROOM-1」は、日本の技適(TELEC認証)を正式に通過しています。秋月電子通商 やスイッチサイエンス、千石電商、またはAmazonの国内正規代理店 から購入すれば、技適マーク付きの個体が確実に手に入ります。 [1, 2, 3]
------------------------------
## 🔌 ILI9341 とのピン接続(配線)イメージ
自分で配線する場合、ESP32-S3のGPIOピンを自由に割り当てられますが、以下のような標準的なピンアサイン(配線)で接続するのが一般的です。 [4]
| ILI9341(液晶側)のピン | ESP32-S3 基板側の接続例 | 役割 |
|---|---|---|
| VCC / LED | 5V または 3.3V | 電源・バックライト(液晶の仕様による) |
| GND | GND | グランド |
| CS | GPIO 10 (任意) | 液晶のチップセレクト |
| RESET | GPIO 11 (任意) | 液晶のリセットシミュレート |
| DC (A0) | GPIO 12 (任意) | データ / コマンド切り替え |
| SDI (MOSI) | GPIO 13 (SPI-MOSI) | SPIデータ送信 |
| SCK | GPIO 12 (SPI-CLK) | SPIクロック |
| SDO (MISO) | GPIO 14 (SPI-MISO) | SPIデータ受信(不要な場合もある) |
| T_CLK / T_MOSI / T_MISO / T_CS | (別のGPIOピンへ接続) | タッチパネル機能を使う場合のSPI配線 |
※今回のシステムでは、これらに加えてさらに QRコードリーダー用のUART(TX / RX)として追加で2本 のGPIOピンを使用します。
------------------------------
## ⚠ 自分で配線して MicroPythonOS を動かす際の注意点
画面一体型ボード(Waveshare製など)であれば、OSのインストーラーが「どのピンに画面が繋がっているか」を自動で設定してくれますが、バラの基板とILI9341を自作で配線する場合、MicroPythonOSの設定ファイル(あるいはLVGLの初期化スクリプト)を書き換えて、自分が配線したピン番号(GPIO番号)をOS側に教えてあげる設定作業が必要になります。
ハードウェアとしての空きピン(GPIO)は30本以上残るためピン不足の心配はありませんが、ソフトウェア側の初期設定(ディスプレイドライバの設定)の難易度は一体型ボードよりも少し高くなります。
自作配線で進める場合、
*
* ブレッドボードとジャンパ線で試作実験を行いますか?
* それとも、最初から基板にはんだ付けして組み上げる予定ですか?
*
もし設定などで不安な点があれば、MicroPythonでILI9341を動かすための初期化のコード(ドライバ設定の書き方)についても詳しくご案内できます。
[1] [https://akizukidenshi.com](https://akizukidenshi.com/catalog/g/g131148/)
[2] [https://robot-jp.com](https://robot-jp.com/wiki/index.php/ESP32-S3-1_N16R8)
[3] [https://www.sengoku.co.jp](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-6L6R)
[4] [https://forum.arduino.cc](https://forum.arduino.cc/t/need-help-connecting-ili9341-touchscreen-to-my-esp32-s3-devkitc-1u-n8r8/1410868)
Q:自分が配線したピン番号(GPIO番号)をOS側に教えてあげる設定作業について教えて
A:
MicroPythonOSに自作の配線ピン(GPIO)を認識させる設定作業は、OSの内部ファイル(ボード定義スクリプト)を編集または新規作成することで行います。 [1]
MicroPythonOSはAndroidに影響を受けているため、ハードウェア固有のピン配置は lib/mpos/board/ ディレクトリ配下にあるボード用プログラムで一括管理されています。 [1, 2]
具体的な手順と構成方法は以下の通りです。
------------------------------
## 📁 1. ボード定義ファイルの作成
PCからThonnyなどの開発環境を使い、ボード内(フラッシュメモリ内)の以下のパスに新しいPythonファイル(例: custom_ili9341.py)を作成します。
*
* 配置パス: /flash/lib/mpos/board/custom_ili9341.py [1]
*
## 💻 2. 設定ファイルの記述例(SPI & ILI9341 用)
このファイル内に、使用するディスプレイのドライバ名や、自分が実際に配線したGPIOピンの番号を正確に記述します。
# /flash/lib/mpos/board/custom_ili9341.pyimport machineimport i2cimport lcd_busimport lvgl as lvimport drivers.display.ili9341 as ili9341 # ILI9341用のドライバをインポート# (タッチパネルも使う場合は XPT2046 などのドライバも必要になります)
# ==========================================
# 🛠️ 自分が配線したGPIOピン番号の設定
# ==========================================
# SPIバス設定(ESP32-S3の標準的なSPI2バス等を使用)SPI_BUS = 2SPI_FREQ = 40000000 # 40MHz(ILI9341の標準速度)
# 液晶制御ピン(ここを実際の配線に合わせる!)LCD_SCLK = 12 # クロックLCD_MOSI = 13 # データ送信 (SDI)LCD_MISO = 14 # データ受信 (SDO)LCD_CS = 10 # チップセレクトLCD_DC = 12 # データ/コマンド選択 (A0)LCD_RST = 11 # リセット
def init():
"""MicroPythonOSの起動時に自動で呼ばれる初期化関数"""
print("カスタムILI9341ボードの初期化を開始します...")
# 1. SPIバスの初期化
spi = machine.SPI(SPI_BUS, baudrate=SPI_FREQ, sck=machine.Pin(LCD_SCLK), mosi=machine.Pin(LCD_MOSI), miso=machine.Pin(LCD_MISO))
# 2. ディスプレイドライバの設定
# MicroPythonOS内のLVGLバッファへピン情報を引き渡します
disp_drv = ili9341.ILI9341(
spi=spi,
cs=machine.Pin(LCD_CS),
dc=machine.Pin(LCD_DC),
rst=machine.Pin(LCD_RST),
width=240, # ILI9341の解像度
height=320,
rot=lv.DIR.BOTTOM # 画面の向き(上下逆ならTOP等に変更)
)
print("液晶画面の初期化が完了しました。")
------------------------------
## ⚙️ 3. OSに「このボード定義を使え」と指示する
ファイルを作成しただけではOSは認識しません。MicroPythonOSの環境変数、またはメインの設定ファイル(通常は /flash/mpos.config や boot.py 付近にあるボード選択項目)にて、作成したボード名を指定します。
# 設定ファイル等での指定イメージBOARD_TYPE = "custom_ili9341"
これを行うことで、OSが起動した直後に自動的に指定したピンアサインが適用され、LVGLのUI画面が自作のILI9341液晶に正しく描画されるようになります。
------------------------------
## 💡 タッチパネル(XPT2046など)も配線している場合
ILI9341液晶モジュールの多くには、タッチパネル用のIC(XPT2046 など)が一緒に載っています。もし画面タッチ操作も有効にしたい場合は、上記のファイル内にさらにタッチ用のCSピンや割り込み(IRQ)ピン、及びタッチ用のドライバ初期化コードを追加で記述してあげる必要があります。 [3]
今回は「画面表示ボタンの群を操作する」システムのためタッチ機能が必須になるかと思いますが、お手元のILI9341モジュールのタッチパネルICの型番(XPT2046など)は分かりますでしょうか?
もし分かれば、タッチパネル用のピン定義も加えた完全な初期化コードの書き方を補足します。
[1] [https://github.com](https://github.com/MicroPythonOS/MicroPythonOS/blob/main/internal_filesystem/lib/mpos/board/waveshare_esp32_s3_touch_lcd_2.py)
[2] [https://www.thebootloader.net](https://www.thebootloader.net/episodes/2026/ep030/)
[3] [https://forum.makerforums.info](https://forum.makerforums.info/t/how-tf-do-i-learn-good-coding/94724?page=2)
Q:部品の調達のしやすさを調べ直してからもう一度質問する。ありがとう。
A:
どういたしまして!部品の調達性や、はんだ付けの手間、技適モジュールの入手性などを一度じっくり比較検討されるのは、素晴らしいアプローチだと思います。
いつでも準備が整いましたら、
* 「この部品(液晶・ボード)を見つけたけれど、配線や設定はどうなる?」
* 「やっぱり画面一体型の方が良さそうだから、具体的な購入先やモデルを絞り込みたい」
など、次のステップに合わせていつでもお気軽にご相談ください。システムの完成に向けて、またいつでもサポートいたします。開発頑張ってください!