Hercules_2022のソフトウェア開発を担当していたR.P.です。本日は、ジャパンオープン2022でメインボードがTeensy 4.0だったほうのロボットのメインプログラムの解説です。と言っても何も難しいことはしてないので内容はかなり薄味になりそう…
main.cppの中身
こんな感じです。C言語(Arduino言語と言った方が正しいかも)マジで何にも理解していないし、フォルダ構造も何もかも適当だし、挙句の果てにはgoto文使いまくってて、「お前何年ロボカップやってたんだよ」ってくらい出来は酷いですが、動いたしヨシ!ってことで許してください…
なかなかシンプルな見た目になってるんじゃないかなぁと(書いた本人は)思っています。かなりマメにコメント書いてるつもりなので、これ読んでわからないところはヘッダファイルの中身とライブラリの詳細だと思います。以下にそれぞれ詳細を記します。
使用ライブラリについて(Arduino.hの説明は省きます)
DSR1202.h
私たちはモーター制御にダイセン電子工業さんの4chモータードライバーを採用しています。こいつをUART通信で動かせるというところまではわかったのですが、どうやって制御しようかと悩んでいたところ、INPUTさんのブログにて偶然発見しました。使いやすくておすすめです。
ちなみにショートブレーキだけはライブラリを介さず直接信号を送っています。
u8g2.h
有名なライブラリなので、こいつの説明は省きます。
1つ注意点としては、私たちが使っているのは本家を改造されたものになっています。
改造者の方のブログページはこちらです。
ヘッダファイル紹介
別途書くとブログが長くなっちゃいそうなので、各自で見てください…
各種関数紹介
多分関数というよりはサブプログラムという理解のほうが僕たちのプログラムを見るうえではしっくりくると思います。return文使ってない(書き始めた時全く何も考えてない)からバグ発見のしやすさとか考慮されてないです。バグった時が最悪ですが、まあバグなく動いてくれてたから全てヨシ!ですね(そんなわけない)
setup()
名前のまんまです。tone関数とdelayでゴリ押ししている起動音周りはもっと方法があったなと反省しています。後悔はしていません()
ちなみにこの起動音、ジャイロセンサのキャリブレーション時間とほぼ同じという奇跡が起こっていて、意図せずいい感じになってます。
loop()
メインループです。
Serial_receive()
名前の通り、サブマイコンと通信して得られた各種センサのデータを得るための関数です。こいつの処理はSerial_receive.hの中でやってます。
pid()
名前の通り、PID制御をする関数です。それ以上でも以下でもないです。ここではモーターの出力にどれだけ足し引きするかの計算をやってます。pid.hの中身を見てみてください。
Motor(int direction)
モーター制御関数です。directionは方向指示値です。1は方向修正、2は前進、3は後進…みたいな感じで割り当てています。motor.hの中で動かしてます。
Move(int motor_rads, int motor_power)
これもモーター制御関数です。上記の関数と違うところはローカル変数名からも分かるように角度で制御できるところです(motor_powerはここでは無視してもらって大丈夫です)。まあ、私たちが使っているのはジョンミンモーターなので、そこまできれいに角度で制御出来てはいませんでした。コアレスモーターとかBLDCとかなら綺麗に動くのかもしれません。
作った時は「回り込みを関数化するのにちょうどよいな」程度の認識でしたが、今見返してみると「意外と汎用性の高い関数に仕上がってるな」と自分でも驚いています。
中身見たらわかると思いますが、三角関数とベクトルの考え方を使ってます。
Motor関数同様、motor.hの中に記述してます。
print_LCD()
名前の通りです。LCD表示のための関数です。工夫としては、試合用プログラムが走ってる状態のときはコマンド操作を受け付けないようにしています。また、モードを切り替えるとプログラムの実行状態が解除されるようにしています。文章だけでは「何言ってんだコイツ?」となると思いますので、これに関しては近いうちに動画でお見せできればと思います。print_LCD.hに書いてます。
マキシマムモード()について
ロボット同士がボールを取り合って押し合う状況があると思います。そういうときに押し負けないように、一定時間たったらモーター出力を増やす、これがマキシマムモードです。脳筋にもほどがありますね()
ちなみにこのモード、本来ならマウスセンサから得られた情報を基に動的にモーター出力を変更する予定だったので、実装されずに終わるはずでした。マウスセンサが間に合わなかったので苦肉の策ってやつですね。ちなみにちゃんと動作していたかは怪しいです。増やすと言っても2, 3%ほどなので目視で分かるほど劇的な変化は起っていません、多分。
おわりに
以上、ジャパンオープン2022向けロボットソフトウェアの全容でした。九州ブロックの時とかのやつも大体同じ感じです。ここまで読んでくださった方、ありがとうございました。
Comments