ロボットの中心となる MCUのピン配置( Port assign )は以下のとおりです。
◀ この記事の前に: Body MCU / Leafony STM32 のピン配置
▶ この記事の次に: リセットとプログラム書き込み(ESP32)
ピン配置
ESP32 は 周辺回路を制御する Peripheral MCUです。ESP32の仕様に基づき、ロボットに必要な機能を実現するための構成を検討しました。各ピン(ポート)には ESP32が持つ本来の機能があります。その機能とロボットに必要な構成を最適な組合せにします。
ピン並び順の一覧表
ESP32のピン番号(ピンの並び)順にした一覧表です。
各ピンの機能一覧表
ESP32のピンの機能との対比は以下のとおりです。
画像をクリックすると別ウィンドウに大きく表示します。
用途別並びの一覧表
ピンの用途(回路上の機能)別に並べ直した表は以下のとおりです。
求められる機能
Peripheral MCU に求められる機能は以下のとおりです。
- 表示( OLED )ロボットの内部状況の表示、ロボットからのメッセージ、デバッグ時など多様に使用する表示装置。有機ELディスプレイ 0.95インチ RGB 96×64ドット
- 超音波測距センサ( TOF / Time of Flight(飛行時間)の略)、反射式で距離を測定 )
- 発音・発声( DAC出力 )
- 体感( タッチセンサ )
- MCU間の情報交換( M-Link )
- 省電力の制御( 頭部ボードの電源制御 / M-Linkの切換え )
- プログラミング / デバッグ機能
検討内容
組込み系はピン配置が重要です。組込み系の MCUには CPU以外に周辺回路が入っています。その周辺回路(機能)は特定のピンと連携している場合が多く、使用したい機能を選択することはどのピンをどのように使用するかと同じ意味になります。そのため使用する機能と外部回路を考慮してピンの割り当てを決めることが必要となります。
ソフトウエア( プログラム / 機能 )とハードウエア( MCU、外部回路 )との接点になるところです。この割付けが適切だとプログラムをすっきりときれいに書くことができます。
組込み系の設計で要(かなめ)になるところですが、おもしろいところでもあります。量産設計ではプリント基板のアートワークも考慮して決めます。ピンの配置によりパターンの取り回しが変わるためです。特にノイズに影響する場合などは最適なパターンの引き回しにするためにピンの配置は大切です。
今回のピン配置を決めた流れは以下のとおりです。
1)電源系を決める
MCUの仕様で以下は電源に関するピンです。仕様により自動的に決まります。
- Pin.1: グランド
- Pin.2: 3.3V 主電源
- Pin.15: グランド
- Pin.38: グランド
2)MCU周辺系を決める
一般的にはリセットとシステムクロックがあります。ESP32は リセットのみです。システムクロックは内蔵です。以下のとおりです。
- Pin.3: リセット
3)プログラム書き込み、デバッグ系を決める
ESP32にプログラムを書き込むためには動作モードを制御する必要があります。以下のピンを他の用途に使用する場合(共用する場合)は注意を要します。詳細は「リセットとプログラム書き込み(ESP32)」をご参照ください。
- Pin.25: GPIO0
- Pin.24: GPIO2
プログラミング、デバッグ系には以下の方法があります。
- UARTを使用してUSB経由でPCに接続
- JTAGを使用してUSB経由でPCに接続
ESP32の仕様により JTAGの割り当ては以下のとおりです。
- Pin.12: JTAG-TDI
- Pin.13: JTAG-TCK
- Pin.14: JTAG-TMS
- Pin.15: JTAG-TDO
UARTは以下のとおりです。
- Pin.34: RXD0
- Pin.35: TXD0
4)機能的なピン配置を優先的に決める。
ESP32にSPIは2系統あります。HSPIとVSPIです。
MCU間の通信を高速にしたいので、MCU間の通信である M-Link に SPI(VSPI)を割付けました。
- Pin.29: SPIのSS(デバイス指定(選択))
- Pin.37: SPIのMOSI(マスタからスレーブへの通信)
- Pin.31: SPIのMISO(スレーブからマスタへの通信)
- Pin.30: SPIのSCK(クロック)
表示デバイスのOLEDも SPI通信を使用するため、HSPIを割り当てました。
但し、デフォルトのHSPI のピンは、JTAGと共用していてJTAGを使用する可能性があるため、HSPIのピンを変更しました。ESP32は他のGPIOピンに割り当てることができます。ただし、使用するピンは以下の注意がです。
- Pin.17~22(GPIO6~11): 使用できません
- Pin.4~7(GPIO34~39): 入力専用です
- GPIO0, 2, 15: 起動や動作モードに関する特殊な機能が割り当てられています。
以上を考慮して以下としました。
- Pin.9: SPIのMOSI(マスタからスレーブ(デバイス)への通信)
- Pin.8: SPIのSCK(クロック)
SPIは通信対象を選択する SS信号線が必要ですが、この SPIには OLEDのみが接続するため、選択のための SS信号線は不要です。OLEDの CSは SPI信号線の接続と切り離しを制御します。そのため SS線と CSは接続しないで CSは常に選択した回路とします。OLEDの省電力制御はプログラム的に行います。
詳細は「表示デバイス( オプション )」をご覧ください。
OLEDには出力のみで入力はありません。また、SPI以外に複数の汎用ポートが必要となります。汎用ポートの割り当ては後で行います。
超音波測距センサからの入力はパルス幅を測定します。パルス幅の計測に便利な RMT機能を持つ端子に接続します。
- Pin.5: UTOF-ECHO( 超音波測距センサからの入力 )
省電力機能を行えるようにします。スリープ状態からの復帰(ウエイクアップ)は、 Body MCUからの信号でおこないます。
ESP32の外部信号によるウエイクアップは、ESP32のウエイクアップが可能なポートになります。ESP32のスリープモードにはライトスリープ、ディープスリープ、スタンバイがありそれぞれで使用できるウェイクアップピンは異なります。
- ライトスリープ: 任意のGPIOピン
- ディープスリープ: 二つのモードによる
ディープスリープは二つのモードでウエイクアップします。以下のとおりです。
- EXT0ウェイクアップ: GPIO36、GPIO39 ロボットではここを使用
- EXT1ウェイクアップ: 複数のGPIOピンでいくつかのピンのレベル状態に基づいてスリープから復帰
ここでは GPIO36を割り当てます。
- Pin.4: P-WAKEUP( Body MCU からのウエイクアップ線 )
ピンのうち、Pin.4~7は入力のみです。入力系を優先的に割り当てます。
そのため他の機能と共用できる信号線を選びます。以下のとおりです。
- Touch1( タッチセンサ1からの入力 )
- Touch2( タッチセンサ2からの入力 )
- WAKEUP-B2( Body MCU2 のウエイクアップ信号線・オプション接続 )
- M-Hsw( M-Link の頭部ボード( Head MCU )の接続/断 制御スイッチ )
これらの信号線は起動後に使用しますので、起動時だけ使用するピンを共用することが可能です。以下がその割り当てになります。
- Pin.25: GPIO0 / Bootb → Touch1
- Pin.24: GPIO2 / 起動時の動作モードの決定 → Touch2
WAKEUP-B2 は JTAGと共用としました。JTAGはデバッグ時だけに使用すること、WAKEUP-B2は標準で Body MCU による制御のため、Pin.13に割り付けます。オプションで WAKEUP-B2を Peripheral MCUからウエイクアップする場合は、JTAG-TMSと衝突します。
この場合でも、WAKEUP-B2 信号線はジャンパスイッチで切替えができるため、デバッグ時は JTAG信号線として使用して通常の稼働時には WAKEUP-B2 として使用することができます。但し、JTAGによる WAKEUP-B2の動作確認試験は行えません。
- Pin.13: JTAG-TMS → WAKEUP-B
頭部ボードを使用する場合は、UTOFを使使用することはありません。( 頭部ボードの TOFを使用します。 )そのため、UTOF-TRIGと M-Hswは同時に使用することはありません。
- Pin.12: UTOF-TRIG → M-Hsw
5)汎用IOを決める
他の汎用IOは以下のとおりアサインしました。
- Pin.26: PS-AMP( 発音発声用回路の省電力制御 )
- Pin.27: OLED-DC( OLEDのデータ/コマンド制御 )
- Pin.28: H-EN-P( 頭部ボードの省電力制御 )または UTOF-TRIG( 超音波測距センサのトリガ信号 )
- Pin.33: M-Bsw( M-Link のBody MCU の接続/断 制御スイッチ )
- Pin.36: M-B2sw( M-Link のBody MCU2 の接続/断 制御スイッチ )
これらはすべて出力であり、Pin.4~7 にアサインすることはできません。
使用しないピンは以下の2ピンです。
- Pin.7
入力1系統が未使用です。
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- 複数のMCUをつなぐ: このロボットには複数の MCUが搭載されています。その MCU間の接続の概要です。
他のWebサイト
- SN74LVC1G3157 SPDT アナログスイッチ Datasheet
- ESP32 のGPIOピンのクセ 起動時の GPIOの状態の説明が分かりやすいです。@nanbuwks Qiita