連載一覧
- 第1回:プロジェクト概要
- 第2回:ESP32-S3 の環境構築
- 第3回:I/O の実装(ADC / PWM / DIO)
- 第4回:通信プロトコル(JSON コマンド)
- 第4.5回:デバイス化対応
- 第5回:Python アプリの API 実装
- 第6回:デバイスとしてまとめる(設計編)
- 第7回:実装編・応用編(GUI / アプリ化 / 拡張の可能性)
はじめに
前回(第5回)では、Python から ESP32‑S3 を安全かつ直感的に扱うための ESP32IO API(Python クラス) を実装しました。
今回はその続きとして、ESP32‑S3 を 実際の「デバイス」としてまとめる工程 を紹介します。
本プロジェクトでは、入出力回路を以下の方針で作ります。
- DIO_OUT:NPN トランジスタによるシンク出力
- DIO_IN:ソース入力(NPN出力のセンサ接続を想定)
- ADC:0〜10V に対応するため、可変抵抗による分圧回路 + 保護素子
- PWM:信号線としてそのまま出力(外部負荷は別途駆動)
これらは、工場や設備で一般的に使われる 24V 系の産業信号の電圧レベルに合わせて信号をやり取りできるようにするための変更です。具体的には:
- DIO_IN にトランジスタを入れたのは、工場で一般的な NPN シンク出力(24V)の信号を ESP32 の 3.3V ロジックに変換して受けるため
- DIO_OUT を NPN シンク出力にしたのは、PLC と似た方式で外部の負荷(リレーなど)をスイッチングできるようにするため
- ADC を 0〜10V 対応にしたのは、工場で使われるアナログ信号(圧力・温度・流量など)の電圧レンジに合わせるため
つまり今回の回路は、ESP32 が 24V 系の信号電圧を扱えるようにするためのレベル変換回路 を備えた、試作レベルの小型 I/O モジュールです。
重要:ここで行っているのはあくまで「電圧レベルの変換」であり、フィールド側(24V配線)と制御側(ESP32・PC)を電気的に切り離す「絶縁」ではありません。実際のPLCや産業用I/Oモジュールの多くは、フォトカプラなどによる絶縁を標準で備えています。本記事の回路は絶縁を省いた試作構成であるため、既存の工場設備・PLCシステムなど、他の機器と電源やグラウンドを共有する環境に組み込む場合は、後述の注意点を必ず確認してください。個人の実験・学習用途であれば、通常の使い方の範囲で問題になることはありません。
この方針を前提に、ケース化・配線・電源・固定方法など、
プロトタイプとしての完成度を高めるための実践的な内容をまとめます。
デバイス化
デバイス化は大きく次の 5 ステップに分けられます。
- 外部と接続するためのコネクタを選ぶ
- 電源方式を決める(USB / 外部電源)
- 入出力回路を設計する
- 基板設計・製作をする
- 基板を収めるためのケースを製作する
この 5 つを押さえると、「製品らしいデバイス」になります。
1. 外部 I/O の接続方式
今回のデバイスでは、DIO(シンク出力/ソース入力)、ADC(0〜10V)、PWM をケース外に引き出すため 5.08mm ピッチのターミナルブロック を使用します。
2. 電源設計(USB / 外部電源)
ESP32‑S3 は USB だけで動作しますが、工場などでよく使われる一般的なリレーを駆動したり、24V 電源系に組み込んだりするには、入出力用の外部電源が必要になります。
構成
- 本体電源は USB 5V
- 入出力の電源として 3.3V~24V を ±COM へ供給
本体をPCのUSBから給電しながら、I/O側には別系統の24V電源を接続する構成です。前述の通りこの2系統の間には絶縁が入っていないため、24V側の配線に問題があった場合、USBケーブルを経由してPC本体側にも影響が及ぶ可能性があります。配線作業は電源を切った状態で行い、極性や接続先を十分確認してください。PCと絶縁した状態で運用したい場合は、USB給電の代わりに絶縁されたACアダプタなどから本体電源を取る構成に変更することもできます。
3. 入出力回路の設計
本プロジェクトでは、ESP32 を使った DIO(デジタル入出力)およびアナログ入力回路が、24V系の信号を扱えるようにすることを目標に設計しています。
産業機器との接続を前提にすると、外部信号は 12〜24V 系が一般的であり、そのまま ESP32 の 3.3V ロジックに接続することはできません。
そこで本設計では、入力・出力・アナログ入力のすべてにトランジスタや分圧回路を用いた"電圧レベル変換"の構成を採用しています。繰り返しになりますが、これは絶縁ではなく電圧変換である点にご注意ください。
■ DIO入力(ソース入力:外部シンク出力を受ける)
- NPN シンク出力(24V)の信号を ESP32 の 3.3V ロジックに変換して受けるための入力回路
外部の 24V シンク出力をそのまま ESP32 に入れると破損するため、
トランジスタで電圧レベルを変換し、あわせて過電圧に対する保護を行っています。
| 項目 | 仕様 |
|---|---|
| 入力方式 | ソース入力(外部 NPN シンク出力を受ける) |
| 許容入力電圧 | 3.3〜24V(推奨 5V 以上) |
| ESP32 側ロジック | HIGH:外部シンク出力 ON / LOW:外部シンク出力 OFF |
| 保護要素 | ベース抵抗、プルアップ抵抗、ツェナーダイオードによる過電圧保護(※ フィールド側とロジック側の電気的な絶縁は行っていません) |
| 主な目的 | 電圧レベル変換、ノイズ耐性の付加、PLC に近い論理での信号入力 |
より高いノイズ耐性や、フィールド側との電気的な絶縁が必要な用途では、トランジスタの代わりにフォトカプラ(PC817など)を使った構成に置き換えることを検討してください。
■ DIO出力(シンク出力:外部負荷を駆動)
- 外部の負荷(リレー・ランプなど)を駆動するための回路
ESP32 の 3.3V では 24V 負荷を直接駆動できないため、トランジスタを使って電流をスイッチングし、産業機器に近い出力方式にしています。
| 項目 | 仕様 |
|---|---|
| 出力方式 | シンク出力(NPN オープンコレクタ) |
| 許容負荷電圧 | 最大 24V(外部電源) |
| 許容負荷電流 | 約 100mA 以下(2SC1815 の安全動作領域)→ 一般的な24Vリレーを駆動できる電流値 |
| ESP32 → 出力論理 | HIGH:出力 ON(シンク) / LOW:出力 OFF(開放) |
| 保護要素 | ベース抵抗、トランジスタによる電流分離 |
| 主な目的 | 外部負荷(リレーなど)のスイッチング、PLC に近い論理での出力 |
リレーなどのコイル負荷を駆動する場合の注意:コイルをOFFにした瞬間、高い逆起電力(サージ電圧)が発生します。これを吸収するため、駆動するリレーやコイルの端子間に、逆方向に接続したダイオード(フライバックダイオード。1N4148やショットキーバリアダイオードなど)を追加することを強く推奨します。フライバックダイオードを入れずに繰り返しON/OFFを行うと、トランジスタなど周辺部品の劣化・故障につながる可能性があります。今回の基板設計にはこのダイオードは含まれていないため、外付けのリレーモジュール側にダイオードが内蔵されているものを使うか、配線時に追加してください。
■ アナログ入力(0〜10V → 0〜3.3V)
- 0〜10V アナログ信号を、ESP32 の 0〜3.3V ADC で読めるようにするための分圧回路
この回路は 0〜10V のアナログ信号を ESP32 の ADC(0〜3.3V)で読み取るための簡易分圧回路です。
固定抵抗と可変抵抗のみでスケーリングを行っており、試作機向けの最低限の構成になっています。
| 項目 | 仕様 |
|---|---|
| 入力方式 | 0〜10V アナログ入力 |
| ESP32 ADC レンジ | 0〜3.3V |
| レベル変換方式 | 固定抵抗+可変抵抗による分圧 |
| 主な目的 | 0〜10V 産業アナログ信号の簡易的な電圧測定(精密測定用途ではありません) |
<⚠ 注意事項(重要)>
- この方式は 分圧比の誤差・温度変化・可変抵抗の個体差の影響を受けやすく、精密測定には向きません。あくまで試作機向けの簡易入力回路です。
- 可変抵抗(RV1)は振動や経年劣化で抵抗値が変化することがあるため、長期間・現場での常設利用には向きません。定期的な再調整・点検を行うか、固定の精密抵抗+ソフトウェア側でのキャリブレーションに置き換えることを推奨します。
- 可変抵抗(RV1)の PIN1–PIN2 がほぼ短絡状態になると、分圧比が大きく変動し、ESP32 の ADC に 3.3V 以上が入力される可能性があります。この回路には、その場合に電圧を制限するクランプ保護(ツェナーダイオードやTVSダイオードなど)は入っていません。
- 調整時は、入力電圧を 0V 付近から徐々に上げ、ADC が 3.3V を超えない位置で止めるようにしてください。より安全に運用したい場合は、ADCピンとGNDの間にツェナーダイオードなどのクランプ回路を追加することを検討してください。
■ PWM出力回路(3.3V PWM出力)
- ESP32 の PWM 信号をそのまま外部ドライバや SSR に渡すための"制御信号専用"のロジック出力
24V 負荷を直接駆動するのではなく、外部の MOSFET ドライバやリレーを制御するための 3.3V 信号として扱う構成にしています。
| 項目 | 仕様 |
|---|---|
| 出力方式 | 3.3V ロジック PWM(ESP32 直出し) |
| 許容負荷電流 | 数 mA(ESP32 GPIO の仕様に準拠) |
| 主な目的 | 外部ドライバ・SSR・アクチュエータへの制御信号として利用 |
✔ 必要に応じて外部でレベル変換可能
24V PWM や大電流 PWM が必要な場合は、
MOSFET ドライバや SSR を外付けすることで対応できます。
4. 基板設計・製作
設計した入出力回路を、本プロジェクトで使用しているESP32-S3のピン配列に合わせて設計すると図のようになります。
使用ソフト : KiCad
作成したKiCadデータ : GitHub
KiCadのPCBエディターで基板設計をすると、そのデータを利用してJLCPCB などの 基板製造サービス から購入することができます。
5. ケース設計・製作
設計した基板を収めるケースはFreeCADで設計しました。
製作には3Dプリンタを使用します。
裏面にはタカチのDRP5-9Wを取り付けられる設計にしてあります。
※ESP32-S3のUSBコネクタをもう少し基板の端に寄せるべきでした…
作成したFreeCADデータ : GitHub
3Dプリント樹脂ケースは、防塵・防滴(IP等級)や難燃性など、工場環境でケースに求められる規格を満たすものではありません。屋内のデスク周りや実験環境での利用を想定した構成であり、粉塵・水気のある環境や、火気の近くでの常設利用には適していません。
まとめ(今回の記事)
- ESP32‑S3 を「デバイス」としてまとめるための工程を整理した
- 入出力回路(シンク出力 / ソース入力 / 0〜10V ADC / PWM)の設計方針を解説
- 基板設計(KiCad)とケース設計(FreeCAD)の流れを紹介
- 24V 系の信号レベルに対応するための回路構成の考え方をまとめた
今回は 設計編 として、試作レベルのデバイス化の全体像を示すところまでを扱いました。
この回路は、あくまで 絶縁を省いた試作段階の構成 です。学習や自分の環境での実験用途としては十分な内容ですが、既存の工場設備・PLCシステムなど、電源やグラウンドを共有する他の機器に組み込む場合は、以下の3点を追加で検討することを推奨します。
- 絶縁:フィールド側(24V)と制御側(ESP32・PC)の間にフォトカプラなどの絶縁素子を追加する
- フライバックダイオード:リレーなどのコイル負荷を駆動する出力に保護ダイオードを追加する
- ADC入力の過電圧保護:ツェナーやTVSダイオードによるクランプ回路を追加する、またはトリマポットを精密固定抵抗+ソフトウェア側のキャリブレーションに置き換える
これらは試作・学習段階では省略されることも多いポイントですが、実際の設備や共有電源のある環境に接続する際は、感電・機器破損などのリスクに関わる部分です。業務用途での利用を検討している場合は、電気設計に詳しい方に事前に確認することをおすすめします。
次回:実装編(基板到着後に公開)
現在基板の納入待ちのため、基板が届いたら以下の内容を中心に 実際の製作工程 を紹介します。
実装予定の内容
- 基板のはんだ付け
- ケースへの組み込み
- Python API(ESP32IO API)を使った動作確認
- DIO_OUT(シンク)が正しく動作するか
- DIO_IN(ソース入力)が正しく読めるか
- ADC(0〜10V)がノイズなく読めるか
- PWM が安定して出力されるか
- get_io_state が正しい値を返すか
実際に組み上げた状態での写真や、動作確認のログも掲載する予定です。
次回予告(第7回)
次回は、基板が到着し次第、
- 基板の実装
- ケース組み込み
- Python API を使った動作確認
- GUI / アプリ化
- 拡張の可能性(Wi-Fi化、ロギング)
をまとめた 実装編+応用編 を公開します。
📘 ESP32-S3 IO デバイス連載のまとめ記事はこちら
👉 https://qiita.com/Noritama-Lab/items/cae87dc4cd67fe438c82