センサー(ジャイロと加速度)の値が取れるようになったので、次はモーター。
モーターへの出力はOutput.cppで行っている。
初期化のvoid initOutput()
は簡単に抜き出せたけど、ループ内の処理はかなり複雑なこと(変な姿勢にならないように調整しているらしい)をしているので半ば片っ端に抜き出した。
いくつかのブロックを抜き出してはモーターの様子を見るけど全然回らない。
まあ、プロポが無いからスロットルのデータも無いからしょうがない。
プロポのスロットルのデータはrcData[THROTTLE]
に入ってきて、センサーの姿勢データとプロポの他のレバーのデータから姿勢が破綻しないように補正して各モーターの出力を決定している。
モーターの出力はグローバル変数のmotor[0]
〜motor[4]
に書き込んで、最後にwriteMotors()
で実際に出力される。
姿勢制御の処理は複雑だしプロポが無い今の段階で全部を抜き出しても無駄だから、ループの中で徐々にスロットルを上げてみたけどモーターは回らない。
いろいろコードを追っていくけど途中でいろいろな計算をしていてmotor
の値は0のまま。
じゃあ、直接スロットルの値をmotor[0]
に入れてwriteMotors()
をコールしてみたけど、モーターは回らない。
「これはUSBからの電源だからかな?」
USBケーブルを抜いてバッテリーをつないだら、ウォーンとモーターが回ってビビった(あっという間にフルスロットル)。
しかも、バッテリーのコネクターに近い右後ろのモーターだった。
で、motor[3]
にスロットルの値を、それ以外には0
を入れてみたら、motor[3]
以外が猛然と回り出した!(motor[3]
はほとんど回らないので、もしかして逆?)
初期化しただけでは回らないので、motor
にMINCOMMAND
を入れると止まる。
いろいろ調査したところ、一番やさしく回るのはMINCOMMAND+50
だった。