前回は芝刈りモーターを取付けて実際に芝生を刈り取れる事が確認できました。
今回は電源回りを整理していきます。
これまでの配線
自動走行ローバーに後付けで芝刈りモーターを追加したので、走行系と芝刈り系が完全に分離しており、芝刈りモーターは単にスイッチでON/OFFするだけでした。

構想
・走行系と芝刈り系のバッテリーを共通にしたいので、小型刈払い機(草かるぞう)に元々付いていた18Vバッテリー1個で両方に供給する。
・草刈るぞうバッテリーはマキタ18Vと接点共通なのでマキタバッテリーも使用可となる!
・バッテリー電圧をPixhawkから測定する為に、抵抗で分圧してAD入力端子に入れる。
・バッテリー電流検出機構も後付けできる様にしておく。
・芝刈りモーターのON/OFFをフライトコントローラーから制御する。
あとついでに・・
・方位取得精度を上げたいので外付け磁気コンパスを取付ける。
・重心が後ろ気味なので前輪(駆動輪)がスリップしがち問題への対策。
となると必要な電圧は、芝刈りモーターに18V、走行モーターに12V、Pixhawk他に5V の計3種類となります。
でも考えたのですが走行用モーターは18VをPWMの上限67%に制限してやれば、わざわざDCDCで12Vに下げなくても良さそうですね。
但し前回使用したモータードライバーIC(TB6612FNG)は扱える最大電圧が15Vなので耐圧不足です。定格18Vバッテリーの充電直後は21V程度あるので、少なくともそれ以上の耐圧があるドライバーが必要です。 そこで秋月電子で探すとTB67H450FNGというのがあり、これだと最大定格が50Vでした。 またこのICをモジュール化したAE-TB67H450というのも売られているので、これのモジュールを使ってみましょう。
芝刈りモーターをパワーMOSでPWM制御するのも含め、前回同様のArduino NANOを使って計3個のモーターを制御するESCを作ろうと思います。
回路検討
前回のTB6612FNGとTB67H450FNGとでは制御信号の仕様が異なっています。
TB6612FNGでは動作状態を制御するIN1,IN2とは別にPWM端子があり、1CHあたりデジタル出力2本+PWM1本で制御していました(あと全体を止めるSTBYにもデジタル出力1本)。

一方TB67H450FNGではIN1,IN2に直接PWMを入力する事になります。

という事はモーター2個を制御するにはPWMが4端子必要ですね。
元々ArduinoNANOは最大6本のPWM出力が可能ですが・・・
実はモーター駆動用PWMの周波数は可聴域以上に上げていたので前回はTimer1だけ周波数を上げて、これに繋がるD9,D10端子を使っていました。
今回更に2本の端子を使うとすると、Timer0又はTimer2に接続されているD5,D6,D3,D11の内から選ぶことになりますが、Timer0はシステム内でmillis()等に使われており、Timer2はtone()等に使われているので周波数を変えてしまうと他に影響が出るのです。

こうなると周波数を変えても他に影響しないPWM端子が足りませんね。
ArduinoNANOに拘らずSTM32F103とかに変更すればいいんですけど、できれば前回のプログラムを流用したいのです。
また芝刈りモーターをパワーMOSで駆動するならゲートに3.3Vだと少し心許なく、かといってゲートドライバーを追加するのは面倒という理由もあります。
そこでArduinoNANOとTB67H450FNGの間に下の様なロジック回路を入れてみました。

ArduinoNANOから出すのはPWM値と方向信号です。TB67H450FNGではIN1,2の一方がPWMで他方がHになり、方向信号でIN1,2を切替えます。
実はこの回路で試すと大体は動作しながらも、時々モーターが回転しないことがありました。どうやら起動の瞬間に過電流検出か何かの状態に陥っている気がします。TB67H450FNG異常解除にはIN1,2両方をLにする必要があるのですが上の回路だとこれができないんですよね。
という事で苦しまぎれですが、更にANDゲートを追加しました。
起動直後はGPIOからSTBY端子をLにしておく事で異常を解除できます(と言うか過電流にならなくなる筈)。
ANDゲートは74HC08を使いたかったのですが手持ちが無かったので74LS08を使いました。実際にはこのままだと電源投入の瞬間(マイコンが動き出すまでの間)はSTBY端子がHなのでモーターが一瞬(クッと)反応しており、できればSTBY端子をプルダウンしたいところです。が、LSだと結構小さな値の抵抗になるので現状プルダウンしていません(マイコンが動き出せば直ぐにSTBY状態になるので大丈夫だとは思いますが)。

芝刈りモーター制御
芝刈りモーターは逆転する必要がないのでパワーMOS-FET 1個でPWM制御します。
実際にはほぼフル回転で使うのでPWM周波数にはこだわらずD11端子を490Hzのまま使っています。サーボ信号入力が1000~1400msは停止、1600~2000mSで回転とし、回転開始/停止時はArduinoNANOのプログラムで等加減速制御としました。

芝刈りモーターを起動するとArduinoがリブートしてしまう問題発生
RC送信機から芝刈りモーターをONにするとArduinoがリブートする現象が発生したので
ゲート抵抗を1KΩとしました。1KΩは結構大きい気がしますが当初の100Ωだと効果が無かったのです。本当は100Ωと1KΩの間の丁度良さそうなところを調べるべきでしょうけど、1KΩでもゲート容量をざっと1000pFとするとCR時間は1μSなので、PWM周波数490Hzの周期は約2mSもあり影響は少ないと思います。
という事で現状の回路図
今の所こんな回路図です。
バッテリー電圧検出は18KΩと3KΩで分圧。電流検出回路はまだ実装していません。

基板の写真・・・
最後に追加したAND回路はユニバーサル基板を空中配線しています。
左下のスペースに電流検出回路を取り付ける予定(今は太線で直結状態)。

バッテリーはAmazonで¥999で売っていたマキタ18V用コネクタ(ソケットと呼ぶのかな?)で接続します。

ついでに磁気コンパスを外付けしたい
前回走らせたとき、Missionplannerに表示される車体アイコンが走行方向に対して微妙に角度がずれた状態で直進しているのが気になりました(ドリフトしながら直進している様に見える)。 また特定の場所にくると次のウェイポイントに向かう角度が定まらず時間がかかったり止まってしまったり。。。
コンパスをキャリブレーションしてもまだ怪しい感じなので外付けコンパスを追加してなるべく地面やモーターから遠い位置に取り付けたいと思います。
使った磁気コンパスはQMC5883LというAliexpressで300円程で買った基板で、かつての定番HMC5883Lに似ているけど微妙に違うセンサーです(HMC5883Lは廃版になっているらしい)。
QMC5883LモジュールはI2CでPixhawkに接続するだけでMissiponplannerを開いたら認識されていました。 設定画面でこちらのセンサーの優先順位を上げてキャリブレーションをやり直したのですが、暫く使っていると磁気コンパスの不一致的なエラーが出てきたので内臓コンパスは止めました。

もう一つついでに全体の重心を前に移動。
これまで時々車輪が空回りしていました。たぶん重心が後ろ気味だった為に前輪(駆動輪)の荷重が小さかったのが原因と考えて、少しでも前に荷重をかける為にGPSアンテナとその支柱を前に移動しました。
外付け磁気コンパスはGPSアンテナから離したかったので車体後部に載せますが、軽くするため塩ビパイプで支柱を作りました。
これでスリップによるスタックはほぼなくなりましたね!!

という事で現状のブロック図

では実際に芝生を刈ってみます。
一気にやるのは不安なので2分割した経路をつくって・・・

動作前の庭の状態は1週間程前に手作業で刈っており、奥の方はまた雑草が伸び始めています(手前側は何度か試走したので刈れている)。

刈り込みの様子を動画で・・・
刈り込み終了後

向きを変える時にしばらく考え込むとか、刈り込みラインとラインの間に少し残るとか、まだ問題はありますが何とか動き始めました。
何より猛暑の中を自分で歩き回らなくて済むのがいいです。
この後は・・・
現時点で最低限の自動刈り込みは出来たのですが、実行する為にPC側でMissionplannerを動かしたりRC送信機でスタートを掛けたり(ヤバくなったら止める目的もあるけど)と色々手間がかかります。
安全性も含めてもうちょっと簡単に稼働できる様にしたいのですが、それにはArdupilotだけだと厳しくなってきたのでコンパニオンコンピューターを積み、そっちで色々プログラムしたいです。
と言っても経路は固定なのでROS2を動かすほどでもなく、ラズパイ上のpythonで制御するのがいいかなと思っています。
これにはRaspberry pi ZERO2Wあたりが小型で積みやすいのですが、今なぜかどこも品薄なんですよね。秋月電子では11月入荷予定となっているしAliexpressだと1万円以上の値段で売られています。 という事で手持ちにあったRaspberry pi3でやってみて、ZERO2Wが手に入る様になったらその時点で考えようと思います。































































