メンバー
KWMR
@kwmr2024
作品ページ
課題と解決方法
ロボットを自由に移動させるためには車輪の数やその種類によって駆動方法が異なる。また、人の操縦手段も4方向・8方向のスイッチや、片手・両手のアナログジョイスティックなど様々である。
右左折と前後移動だけであれば想像の範囲内であるが、回転半径の指定やその場回転などの操縦ができる機体の場合、どのようなアルゴリズムの操作感が優れているのかを検討する必要がある。
また、移動とアーム操作など同時動作させたい場合には、人の操作手段が不足し、何らかの機能を統合したり切り替えたりする必要がある。
ここでは、touchGFXを用いて、実際に動作可能な機体で、変換アルゴリズムを切り替えて検討できるコンソールを製作した。
時間の関係で2輪の片手ジョイスティック操作の実装にとどまったが、今後追加の実装を検討したい。
アピールポイント
- 裏側からの操作により、コンソール面が手で隠れず、表示が見やすい。
- 設定と動作画面をスワイプで分けられるようにした。
- アナログジョイスティックの操作ベクトルが画面上に表現され分かりやすい。
- 走行時の車輪の動きがアニメーションされモータの動作が確認できる。
- touchGFXのコンソールだけでなく、モータドライバや無線コントローラなどメカ部分を除き、基板とプログラムはカスタムメイドである。
反省と今後の課題
- 外装がないのでこのままでは実用性に乏しく見た目が悪い。
- ジョイスティック1個と2個と2輪と4輪車体を組み合わせ、操作ベクトルの変換アルゴリズムを切り替えられるようにしたかった。
- touchGFXの使い込みが不足しており細かいところにアラが目立つ。
- 送信基板(STM32G0B1)にある無線モジュールをSTM32U5G9に移植できなかった。
- コンソール画面に車体からのデータ(回転速度など)をフィードバックしたかった。
システム構成
タッチパネルですべての操作を実現したかったが、シングルタッチの仕様であったので、アナログジョイスティックを2個取り付けて操作を行うことにした。
アナログジョイスティック1個と左右2輪の操作に対して、進行方向と車輪の回転方向を示すことで、操作感の違いが分かるようにした。(構成図参照)
プログラム動作
- ジョイスティック2個のX,Y値をADC4CHで取り込む
- コンソール画面の倍率(ADCの値をスケーリングする)と不感帯(中立のゼロ調整)を使ってADCの値を正規化する
- 右手のジョイスティックを―100~100の操作ベクトルに変換する
- 操作ベクトルを左右のモータの出力値(-100%~100%)に変換する。変換式は以下の通り
- 操作ベクトル V(joy_X,joy_Y)
- 規格化定数 k
- 角度 th = atan2(joy_Y,joy_X);
- 左モータ =k * hypot(joy_X,joy_Y) * cos(th-M_PI/4.0);
- 右モータ =k * hypot(joy_X,joy_Y) * sin(th-M_PI/4.0);
※hypot()は平方和の平方根,atan2()は逆正接,M_PIは円周率
- 無線パケットの形式に変換して、コントローラ送信基板にUARTで送り、無線パケットを送信する
- 車輪の回転をアニメーションする
- 受信パケットを字句解析して、モータ出力値をPWM-Dutyに変換する
- モータードライバー(2CH)に回転方向とPWM信号を出力する
- 車輪が回転し車体が移動