ししかわです。
社員研修の一環で、マイクロマウスを自作して大会に出場します。
M5Mouseの回路の中身について説明しています。 今回はマウスの頭脳であるマイコン(M5StackとSTM32)周辺の回路の説明です。
概要
マイコン周辺回路の回路ブロック図を示します。今まで紹介してきた「壁センサ回路」「モータドライバ回路」「IMU回路」との繋がりも描かれています。
M5StackとSTM32の役割分担
M5MouseはESP32(M5Stack)とSTM32(マウスモジュール)の2つのマイコンを持つのが大きな特徴です。次のように役割分担をさせます。
- M5Stack
- ユーザインタフェース
- マイクロマウス迷路の経路探索
- マウスモジュール(STM32)
- センサやモータの駆動
- センサ値の統合と自己位置推定
車に例えるなら本体はマウスモジュールで、運転席とカーナビの部分がM5Stack側に切り出されているかっこうになります。M5Stackは基本的にマウスの座標を升目でのみ処理します。一方、与えられた座標に基づいてどう走るかの計算や、まっすぐ走ったり壁との衝突を防ぐ制御はマウスモジュールが自律的に担います。
M5StackとSTM32の通信
アーキテクチャ設計で書いたとおり、M5Stackとマウスモジュール間はI2C通信で必要な情報をやりとりします。
- M5Stackからマウスモジュール…最大速度等のパラメータ設定、走行経路の情報、走行指令、etc.
- マウスモジュールからM5Stack…マウスの現在位置、壁の有無などのフィードバック情報、etc.
ここで考慮すべきなのが通信速度です。STM32とESP32が定めるI2Cの通信速度は最大400kbpsです。秒間100回(10ms毎)情報をやりとりするとしても、コマンド等含めて1回辺り500byte程度しか情報を授受できない計算になります。例えば16×16マスの迷路の構造は、内側の壁の有無をそれぞれ1ビットで表現するとしたら16*15*2=480bit=60byteになります。速度や加速度をdoubleで表現するなら1つあたり64bit=8byteになります。各サイクルで必要十分な情報のみ授受できるよう適切に設計する必要があります。詳しくはソフトウェア設計のときに説明する予定です。
詳細
STM32周辺の回路図
STM32の周辺回路については先輩方のマウスブログの記事を踏襲しました。
マイクロマウス研修(のり)[2]STM32F446データシート | アールティ 移動型ロボットブログ
さらに上記記事の引用元であるGetting started with STM32F4xxxx MCU hardware developmentは、最初に通して読んでから設計すると設計が捗ります。特に電源周辺の部品配置(電圧を安定させるために接続するパススルーコンデンサなど)は、基本的にこのドキュメントに従って決めていきます。
STM32のチップ選定
STM32には様々な種類があります。STM32F2、STM32F4など、高いCPUクロックを持つハイパフォーマンスな製品から、STM32L0やSTM32L1などの低消費電力を謳う製品まで、用途に応じて使い分けられます。
今回は初めての開発なので「大は小を兼ねる」でいきます。つまり「なるべく高スペックであること」「マイクロマウスの機能を実装するために十分なピン数を備えること」という条件で使用するチップを検討しました。消費電力については、M5Mouseの場合モーターが支配的な要因になるのでSTM32自身の消費電力は気にしないことにします。さらに「他のマウスでの使用実績があること」という条件も加味して、STM32F405RGT6を選定しました。
STM32のピンアサイン
STM32F405RGT6は様々な機能を持ちますが、ICのピン毎に割当可能な機能が決まっています。ピンアサインを効率よく、またミスなく進めるために次のように行いました。
- データシートを参照する
- データシートの「3. Pinouts and pin description」にICのピンとピン番号の対応図や、各ピン番号毎に割り当てられる機能一覧があります。
- STM32CubeMXを使う
- 実際にSTM32CubeMXを使って割当てを行いながら回路図に追記していきます。ピンの機能や他のピンとの干渉をソフトウェア側で自動チェックしてくれるので便利です。
最終的に、使用するピンは画像のようになりました。
STM32のブートモード
STM32は起動時のBOOT0、BOOT1ピンの電圧を変えることでブートモードを選択できます。ブートモードによってどのメモリからプログラムを起動するかが異なります(Getting startedガイドの4.4「Boot mode selection」参照)。
Main Flash memoryは書き込んだプログラムが起動するモード、System memoryはブートローダが起動、Flashへの書き込みに使います。
「Embedded SRAM」は見慣れなかったので社内チャットで質問したり調べたりしてみました。
- SRAMからプログラムを起動するモード
- 起動シーケンスとしてはSRAMにプログラムをコピー→(電源を落とさずに)bootピンをHighにしてブートモード切り替え→ソフトウェアリセット、で起動する。
- 従来より、ROMからRAMにプログラムを移して動作させるのは組み込み開発ではよくある手法
- ただしパイプライン処理やCPUクロック向上の恩恵で、FlashROMでも十分高速に動作する
今回はSRAMブートは使わないことにしたため、BOOT1ピンはLowに固定します。
アナログ用電源
STM32はADC等のアナログ機能で使う電源が別系統で使えます(VDDA、VSSA)。M5Mouseは壁センサ回路でアナログ用電源を使っています。アナログ用電源は、通常の電源とは分けて配線します。
- 容量の異なるパスコンを3つ並べます(C15、C16、C17)
- 周波数が異なるフィルタを併用することでノイズを抑制します
- フェライトビーズを介して通常の電源と接続します(FB1)
- グラウンドも分けて配線します(GNDとGNDA)
- 後のレイアウト設計でも基板上でGNDとGNDAのベタパターンは分離します
- GNDとGNDAは0Ωの抵抗を介して一点接続します。
その他のSTM32周辺回路
- SWD接続用の端子を出しています。環境構築で説明したようにST-LINK/V2を介したプログラム書き込みとデバッグを行います。
- クロックは低速、高速の2種類があり、それぞれIC内部の発振回路から取得するか、外部の部品から取得するかを選べます。今回は精度を高めるために外部の部品を接続します。低速として32.768kHz、高速として8MHzの水晶振動子を接続します(Getting startedガイドの6「Clocks」参照)。
- 前述のブートモード切り替え用ボタンとインジケータLEDが2つ
- 電源基板との接続。バッテリ電圧、5V、3VおよびI2CのSDA/SCLのピンで接続します。
M5Stack周辺回路
M5Stack周辺回路です。といってもM5Stack本体ではなく、基板とM5Stackを接続するための回路なのでシンプルです。J2(画像中央)がM5Stack本体と接続するピン、J7(画像右)がSTM32が載る基板と接続するためのピンです。M5Stackのピンアサインはあらかじめ決まっているためそれに従います(画像左)。
ここで1つ致命的な間違いをしました。画像のピンアサイン一覧はM5Stackのピンソケット横のシールから転記したものですが、この回路図はピンヘッダなのでピンアサインは全て反転させないといけません。このことに気づいたのは基板を発注した直後。急いで回路図と基板のデータを差し替えて対応してもらいました…(上の画像は修正済みのものです)。
実際に部品を当ててみれば間違いは一目瞭然ですが、設計をしていると不思議と気づかないですね。このような間違いを防ぐために、例えば自己レビューで回路図を実寸で印刷して、他の基板と重ねて見たりすると良いかもしれません。
以上、回路図について説明してきました。次回からはこの回路図を基板のレイアウトに落とし込んでいきます。