前回は車体を組み上げました。
今回は電装品を選定し、搭載していきます。「最低限走れるようにする」というところまでになると思います。
基本的な考え方
高度な環境認識をさせるために小型のPC(Jetson Nano)、モータやセンサの駆動用にArduinoを組み合わせた構成とし、今回は主にArduino側にセンサ等を取り付けていきます。
電子工作の界隈でミニカーを手作りする場合によくあるのは、Arduino等のマイコンを使うパターンで、実際僕も何度かやったことがあります。
マイコンの良いところは、GPIOピンでデジタル、アナログ、PWM(アナログと一緒か?)、I2C等のシリアル通信・・・と一通りの入出力が簡単にできることです。
大抵は開発環境がセットで提供されているということもあり、基本的なセンサ、アクチュエータ(またはそれらのドライバ)を繋ぐことで簡単に 環境認識→判断→行動 のサイクルを回すことができます。
一方で自律移動界隈で使われるような高度なセンサや、デエプラーニング(僕はこれがなんなのかよく知りませんが)といったマシンパワーを要求する処理は扱えないというのが泣き所で、その点は普通のパソコン(ラズパイ等のSBC:シングルボードコンピュータ含む)に軍配が挙がるところだと思います。
- マシンパワーと拡張性に優れたパソコン
- 簡易でハードウェアI/Fとして優れたマイコン
といったところでしょうか。
そこでよくあるパターンであり、倒立振子ロボットでも利用した、パソコンとマイコンを組み合わせた電装系を組み立てることにします。
要件
今回は「自律走行」のローバーを使いますので、求められる仕様も相応のものになります。特に、物体検出や路面分類をするとなるとかなりのマシンパワーが必要です。
具体的には重要である順に、以下を要件としました。優先順位は、正直どれも大事すぎて選べないという気もしますが・・・
パソコン
- 買える値段であること
- マイコンや直結のセンサとのI/Fを十分持つこと
- 使用者が多く情報が手に入りやすいこと
- 自律走行界隈でよく使われている系(想定はUbuntu-ROS系)が動くこと
- 環境認識に十分なマシンパワーを持つか、持ち得る拡張性を持つこと
- USBシリアル通信機能があること(パソコンと連接のために)
- 自由に使える割り込みピンが4本以上あること(対向二輪のエンコーダ2つを間違いなく使えるようにするため)
- I2C、アナログ入力等によるセンサ接続性が高いこと
- 配線が楽なこと
センサ等
- ホイールオドメトリが取得可能であること
- 車体の姿勢角等が取得可能であること
- 動作モードがひと目でわかること
以上を元に主要部品を選んでいきました。
処理系部品の再選定
倒立振子ロボットでは、パソコンとしてUPBoard、マイコンとしてESP32を使っていました。
ktd-prototype.hatenablog.com
一方で、
UPBoardは
ESP32は
- (理由はわからないけど)I2Cが使えず、センサの選択肢に若干難があった
- Arduinoシールドが使えないため全部手で配線する必要があり面倒
という難点がありました。
そこで今回はお金はかかってしまいますが、これらの難点に対処するために以下の品を選定しました。
NVIDIA Jetson Nano
akizukidenshi.com
Arduino MEGA
akizukidenshi.com
Jetson Nanoはこの手の用途では定番なのかなと思います。普通にやるならRaspberryPiが良いかも知れませんが、画像認識等をやり始めるとマシンパワーに少々不安があるので。
Jetson Nanoでもスペック不足な可能性はありますが、当面はこれで事足りると思いますし、XavierNXが出た場合ボードだけ換装してアップグレードできるという期待もあります。
これ以上となると大型のゲーミングノートになってしまい、あまり現実的ではありません。Jetson系の上位機種までの拡張性が担保され(多分)、ユーザも多いという観点でこの辺が妥当かなと思います。
ArduinoMEGAは何度か使ったことがあり安心感があるというのが一番の理由です。
モータエンコーダ用の割り込みピンは2,3,18,19,20,21が使用可能で、20,21はI2Cと干渉するとしても4本が残ります。
モータドライバ等はシールドが使えるでしょうから、幾分配線の手間が省けそうと期待しています。
センサやモータードライバは以下のような汎用シールド上に実装していくことになるので、場所が足りなくなるのではというのが懸念点でしょうか・・・
www.switch-science.com
その他の部品(最低限動くようにするために)
電源
メイン電源としては、手元にある4セルのラジコン用リポバッテリを使います。電圧は最大16Vで、後述のモータの定格電圧を超えてしまいますので、制御側で出力制限をすることで対応します。
消費電力の検討時に考えたのは最低でも128Wh必要ではないか?ということでした。
手元にあるバッテリが14.8V×4.2Ah≒62Whの容量を持ちますので、電装品用に1個、車体駆動用に1個積むことで、まあ大体要求仕様通り、という感じにしていきます。
Jetson Nanoはハイパフォーマンスモードで使う場合、DCジャックから5V-4Aを給電する必要がありますので、DCDCコンバータで降圧して使用します。
大電流出力に対応するコンバータは中々良いものが無く、以前はTDKラムダ製のものを使っていましたが、少々値が張る上に、ピンソケットに刺さらないため基板に直接実装する必要があり、再利用がし辛い点が難点です(ハンダ吸い取って基板から外そうと思ったんですが、僕の腕では無理でした)
eleshop.jp
今回は価格重視で、Amazonで見つけたドローン向け電圧制御ボード(BECと呼ばれる部品)を使用します。
Arduino Megaの電源はJetson NanoからUSB経由で給電します。
動力
モータとモータドライバは、以前も少し触れましたが、下記を使用します。
純粋なトルクや回転速度に限れば、「10kgの車重において5cmの段差を克服すること」という仕様は満たすかと思います(実際は他の要因もあって難しいのですが・・・)
- モータ:ServoCity エンコーダ付きギヤードモータ
- モータドライバ:VNH5019デュアルモータシールド
モータドライバは、倒立振子ロボットでも使用していたpololuのVNH5019という大電流のDCモータドライバを2個搭載しArduinoシールドにしたものを使用します(それの互換品?をAmazonで購入)
センサ類
物体認識や路面分類のための高級な電装品は後で実装することにして、とりあえずIMUとモータードライバだけは載せておきます。
厳密にはIMUは当分不要ですが、あるに越したことはないだろうというのと、おそらくArduino側に付けるので、後から追加実装するのも大変そうだな、という観点で今のうちに載せておきます。
IMUは倒立振子ロボットではMPU-9250のボードを使っていました。DMP:Digital Motion ProcessorがArduinoでは使用不可とのことで、加速度とジャイロの値から相補フィルタによりオイラー角を出力して使っていましたが、今回は直接クォータニオンを出力可能な以下の品を使ってみることにします。
www.switch-science.com
地上を走るだけであればジンバルロックなど気にする必要は無い気がしますが、ものは試しということで。高価なのが難点です。
ホイールエンコーダは上述のモータに元々搭載されています。
インジケータLED
バッテリ電圧、動作モード等をひと目でわかるようにするため、以下のフルカラーLEDを2個搭載しました。
今の所、色で動作モード(3〜4種類)、点滅でバッテリ電圧アラートとする予定です。複雑になっても良いのであれば、色の組み合わせと点滅パターンでかなりの情報量を持たせられますが・・・判別が付かなさそうですね。
akizukidenshi.com
配線
配線図を作りたいところなのですが、丁度良い図の作成ツールを見つけて使い方をマスターするだけでかなりの時間が溶けてしまうので、要点だけ説明しようと思います・・・
電源の配線
配線と言うほどのものでもありませんが、バッテリ等はVT60コネクタを用いて接続するようにしました。
モータドライバへの給電等は予め実装されているネジ留め式ターミナルブロック経由となり緩みやすいため、付近に3Dプリンタでステーを配置し、そこに線材をタイラップで固定することでターミナルブロックに車体振動が伝わって緩むことを防止しています。
モータへの給電はすぐに切断できるよう、ミサイルスイッチ経由としました。
これだと車体振動によって意図せず切断される可能性がありますので、近いうちに普通の押しボタンスイッチとし、非常停止ボタンを別途用意しようと思っています。
モータドライバの配線
シールドになっていますので、基本的にはArduino Megaに取り付けるだけです。
ただ、シールド上で言う所のモータ#1用入力A(M1INA:GPIOピン#2に割当)が、後述のエンコーダ用割り込みピンと干渉しますので、予めシールド側のピンを無効化しておきます(切断するか、折り曲げてArduinoに刺さらないようにする)
代わりに、シールドに用意されている汎用ピン(下図)のうち、M1INAピンをArduinoのGPIO#13に接続しました。また後述しますが、モータ駆動用のバッテリ電圧監視のため、バッテリ電圧を同汎用ピンのうちVOUTから引き出して使用します。
エンコーダの配線
Arduino Megaの割り込み対応ピンに左右モータのA相、B相を配線します。
- 左モータ:
- A相:GPIOピン#2
- B相:GPIOピン#3
- 右モータ:
- A相:GPIOピン#18
- B相:GPIOピン#19
電源はArduinoの5V、GNDは共通です。
なんか特殊なやり方で全てのピンを割り込み対応させられるんでしたっけ・・・?
servo cityのモータに取り付けられたエンコーダは、コネクタにポピュラーなJST-XH4ピンが使われていましたので、近藤科学のサーボモータで使っていたケーブルで引き出し、JST-XHの4ピン用コネクタ(メス)で基板に引き込みました。
XH接続ケーブル 400mm | 近藤科学
XHコネクタ ベース付ポスト トップ型 4P B4B−XH−A(LF)(SN): パーツ一般 秋月電子通商-電子部品・ネット通販
IMUの配線
ロバスト性には若干劣りますが、使用ピンが少なく、後で他のセンサの増設が容易なI2C接続を行います。
特に気をつけるべき点もなく、SDA、SCL、3.3V、GNDに配線します。
インジケータLEDの配線
こちらはGPIOで動きますので極論どこに配線しても良いのですが、実装位置の都合上、GPIOピン#52から直列で2個のフルカラーLEDを繋ぎました。
その他
Arduinoのアナログ入力ピンA2、A3に、バッテリ2個の電圧をそれぞれ入力し電圧を監視させるようにしました。(A0、A1はモータドライバの電流センサで使用済み)
Arduino Megaのアナログ入力は5V以下である必要がありますので、比較的精度が良さそうだった金属皮膜抵抗を使用して、1/4の分圧を取得してアナログ入力に流し込むようにしました。
小型 金属皮膜抵抗 1/4W10kΩ (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販
小型 金属皮膜抵抗 1/4W30kΩ (100本入): パーツ一般 秋月電子通商-電子部品・ネット通販
完成図
まだタイラップを切ったり余長を最適化したりする前なのと、そもそも配線が下手なので恥ずかしいですが、一応このように完成しました。
Jetson Nanoに給電するためのBECだけ、スペースの都合上別の基板に置く必要があったため、GND共通化と電圧モニタのための線が伸びていてなにやら脆そうな構造になっています。。。
次回はソフトの説明になるかと思います。↓次回記事
ktd-prototype.hatenablog.com