ロボットが動かないRCAP2021 9日前!!!
おはようございます.とみっくすです
RocoCup Asia pasificまであと9日となりました.1桁台!!!
嘘でしょ…
早すぎます。
9日前ということでここ最近の私が何をしたのかをまとめてみようと思います。
ロボットが動かない!!どうして!!!
6週間前くらい??前まで動いていたロボットが動きませんでした。なぜなのか。よくわからないままなんとかしないとと思いながらもずっと何もできていませんでした。
理由はもちろん半導体不足です。
マイコンボードが壊れているのだと推察し、とりあえずマイコンボードを直して動かさなければという発想になったのですが修理する部品がない。マイコンがない!!!どうしよう!!!!まさか世間で騒がれている半導体不足という噂はこんな身近にあるとは思っていませんでした
こちらはDigikeyのスクリーンショットです。
STM32F446REをメインマイコンに採用していた私のロボットですがマイコンが手に入りません。まさかの納期が50年後とでたりして、ほとんど手に入らない状況です。
どうしようと悩んでいた矢先、家で3つのSTM32を見つけました。
これでなんとかロボットが作れそうだと思いとりあえず基板設計を開始することに、なんとか希望が見えてきた瞬間でした。
こちらが設計した基板です。Elecrowで発注して無事届きました。
家にあったマイコンを半田付けして無事!!!成功!!!とはいきませんでした。
どうやらコンパイラが壊れています。というよりはバージョンがアップデートされて今までの環境と互換性がなくなっていました。
PlatformIOというIDEで動かしていたのですが、なんかバージョンごとの環境を落としこれるAPIがあるのをコミュニティで発見したのでAPIを叩いてJSONを読み解いて、いい感じに取得したらいけました。
すっごくつらかった。これを解明するのに1ヶ月くらい費やしました。
せっかくなのでまとめておきました。LGTMください。
とりあえず、なんとかなってよかったです。過去に書いていたプログラムのリファクタリングを開始!!!
でなんだかんだすぎていき、無事移植完了
いい感じに実装できました。
いい実装ができたと思います。メンテナンスのしやすさも確保されていて自己評価で100点笑
横からXHコネクタを引き出せる設計にしたのがよかったですね。
あとはI2Cの波形を見ながらプルアップ抵抗の選定をしました。
波形を見れるように基板をデザインしたのもポイント高いのでは
この記事がとても有用なのでI2Cでミスをしたくない方は見るのをお勧めします。あと公式NXPの出しているI2Cのドキュメントを見るのおお勧めします。
ちなみにこのテストの仕方ですが、プローブのインピーダンスについて考慮されていないのは良くないですね。ちゃんとそこまで考えてカッチリしたかったです。
まあ、まあぎりぎり。良いとは言えませんが、これは測定方法に問題がありそうです。ちゃんと波形を見ているのは成長だと思います。放射ノイズに影響が出ませんようにお願いします神様仏様
基板内でなるべく配線は太くしました。これインピーダンス的にどうなんでしょうか。太くしたらC(容量)が増えてインピーダンス増えそうですよね。R(抵抗)は単純に基板内なので減らせていると思います。ビアはどうなんでしょうか。抵抗値が高そう(憶測)
とはいえ、時定数をまずは測りましょうって話なのですが。
モータードライバも作り直しました。
やはりロボットデザインってビジュアルもそうですけれど、リペア性能も一つの評価軸だと思うんです。今回のロボットはリペア性能を意識しました。
こちらがモータードライバです。
ロボットの背面からネジで固定することで、もし壊れたとしてもロボットをひっくり返して取り出せるようにしました。あと配線量を減らせるようにも努力しています。
いい感じ!!!
ちなみに、オムニホイールのサイドホイールに使っているウレタンゴムですが、シートを買ってきて1個ずつ切って使っています。
左下の電源基板はYuseiがオシロスコープで波形を見ながらちゃんとエレクトロニクスしてくれて、ノイズのないいい電源ができました。こいつがなければ他の電源では代用できないいい設計になっています。
PWM分解能を上げました。
前までLAP駆動でモーターを制御していたのですがmbedフレームワーク上だとタイマーの設定上分解能が制限されていました。500KHzで駆動しようとすると0か100か見たいな感じになって全く制御と言える感じではありませんでした。
しかたなくモーターの制御ができる範囲でいい感じの周波数を探し、落ち着いていたのが20KHzです。コアレスモーターを駆動する上ではあり得ない数値だと思います。実際は時定数から周波数を決定しますが、maxonのコアレスモーターは電気的時定数が低いため電圧を加えてから電流が流れて応答するまでの時間が短いです。なので周波数は高くする必要があります。
maxonが出しているモーターコントローラーは60KHzほどで駆動しているそうです。
PWM周波数が低い状態でLAP駆動をすると単純に正転逆転の繰り返しを高速で行うのも応答性が良すぎる故に本当に正転逆転を繰り返しているような熱を持ちます。実際SM駆動よりも大きな電流が流れますし、低速回転時でさわれないレベルに熱上昇をしていたため対策しなくてはいけないとなっていました。(ロボカップ世界大会2019時点で)
今回はHALドライバでPWMの周波数や精度を決定しているタイマー操作することで対応しました。
20KHz駆動で10段階しか回転スピードを選べなかったのが無段階偏重ができるようになり、制御性能が爆上がりです。
こちらの動画をご覧ください
注目していただきたいのは低速回転です。無段階で滑らかに動いているのがわかると思います。
これがいかにゲーム内で機能するのかはわかりませんが、しかしLAP駆動に高い周波数を用いることができるようになり、高い制御性能を得たと同時に省エネ化ができました。嬉しいですね。
ネタ枠
モーターってでかいブザーなんですよ。
前述した通り、LAP駆動では正転逆転を繰り返すことでモーターをコントロールしています。周波数を下げるとこのいわゆる振動のような現象を目視できるレベルになるわけでして、
それを利用してモーターを振動させてみました。1000Hzとかです.
確かArduinoはデフォルトでPWMの周波数が500Hzくらいでしたね。何も考えずにArduinoでとりあえずコアレスモーターをLAP駆動で回す行為は避けたいですね。
あと9日です。私はかなり低レイヤーの部分でしか進捗を上げれていません。
ラックオブプログレス!!!!!
というわけで、皆さんいい大会にしましょう!!!あと9日ですが共に頑張りましょう!!
#ロボカップ
#ロボカップアジアパシフィック