- GyroM5は、ドリフトRCカーのステアリングジャイロを開発ボードM5AtomMatrix / M5StickCで自作するためのオープンソースソフトウェアです。
- 本格的なPID制御アルゴリズムの採用により、ステアリングのアシスト機能を高い自由度で設定できます。
- M5AtomMatrixにファームウェアGyroM5Atom.inoをインストールしてRCユニットと接続すれば完成です。
- M5StickCにファームウェアGyroM5Stick.inoをインストールしてRCユニットと接続すれば完成です。
GyroM5搭載のタミヤ製RCカー(SU-01シャーシ)がRWDドリフト走行するデモ動画です。
GyroM5.mp4
GyroM5(v1/v2ファームウェア)は、以下のユニークな特徴を備えています。 PID制御は、汎用的なフィードバック制御アルゴリズムであり、パラメータ4個の調整により自由度の高いセッティングが可能です。
- フィードバック制御機能
車体ヨーレートを目標値に近付けるように操舵角を自動制御(PID制御)します。 - 制御パラメータ設定機能
フィードバック制御のパラメータをスマホから設定して保存できます。 - リモートゲイン調整機能
フィードバック制御のパラメータをCH3からリモート調整できます。 - エンドポイント設定機能
ステアリング角度のエンドポイントを設定して保存できます。 - スマートフォン連携機能(v2)
WiFi通信によりスマートフォン経由でジャイロ設定が可能です。 - サーボ周波数可変機能(v2)
サーボ用のPWM周波数とPID制御周期を50Hz〜400Hzの範囲で変更できます。 - 走行データ表示機能(v2)
PID制御データ(目標値、入出力)をLCD画面にグラフ表示できます。 - 走行データ保存機能(v2)
WiFi通信によりPID制御データをCSVファイルでダウンロードできます。 - 鉛直方向検出機能(v2)
起動時に鉛直方向を自動検出するので、ジャイロのシャーシ固定方向に制約がありません。 - 時刻表示機能(v2)
現在時刻をLCD画面に表示できます。
GyroM5の利用に必要なハードウェアの要件を列挙します。
- ホビー用RCカー
標準的なRCユニットを搭載して、受信機とステアリング用サーボを3線(-+S)で接続するRCカーです。 - 標準的パソコン
Arduino IDEをインストールでき、USBインターフェイスを備えるスケッチ書き込み用パソコンです。 - M5StickC
LCD解像度の低い方が"M5StickC"です。高い方の"M5StickC Plus"ではありません。 - ワイヤハーネス部品
サーボ延長ケーブルを1本、オス型ピンヘッダを1個(8ピン以上)使います。 - ハンダ付け機材
ワイヤハーネスの組み立てに使います。
M5StickCやワイヤハーネス部品は、Amazon等のネット通販で入手可能です。
GyroM5の使い方(本体準備、初期設定から通常利用の流れ)を概説します。 RCユニットとの接続方法、M5StickCの起動方法、制御パラメータの調整方法は後半を参照ください。
- 手持ちのパソコンにArduino IDE(開発環境)をインストールする
- Arduino IDEの開発ボード設定をESP32/M5StickC向けに変更する
- パソコンとM5StickC開発ボードをUSBケーブルで接続する
- ファームウェアGyroM5Stick.inoをArduino IDE経由でM5StickCへ書き込む
- GyroM5(M5StickC)をRCカーに固定(LCD画面が上向き)してRCユニットと接続する
- RCユニットの電源を入れる
- GyroM5のHOME画面が出るの水平状態、RC無操作で待つ
- GyroM5の操舵エンドポイントを設定する
- GyroM5のPID制御パラメータを設定する(初期値:KG=50、KP=50、KI=30、KD=10)
- RCカーを走らせて、必要によりPID制御パラメータを微調整する
- RCユニットの電源を入れる
- GyroM5のHOME画面が出るのを水平状態、RC無操作で待つ
- RCカーを走らせて、必要によりPID制御パラメータを微調整する
GyroM5の詳しい解説を記します。
GyroM5利用時のM5StickCの入出力ピン(GPIO端子)とRCユニット(受信機、サーボ)端子との接続方法は下記の通りです。
M5StickC | in/out | RCユニット |
---|---|---|
G26 | in | RC受信機CH1のシグナル端子 |
G36 | in | RC受信機CH3のシグナル端子 |
G0 | out | RCサーボCH1のシグナル端子 |
GND | in | RCアンプBECのマイナス端子 |
5Vin | in | RCアンプBECのプラス端子 |
ワイヤハーネス(接続ケーブル)は、CH1入出力用にRCサーボ用のコネクタ付き延長ケーブル1本を中央で切断して、8ピンヘッダ(オス)とハンダ付けすれば完成です。
ゲイン調整用にCH3入力を利用する場合、信号線(単線)のみ受信機CH3とG32を接続すれば機能します。 なおCH3をジャイロに接続しない場合、ジャイロはPID制御の静的なパラメータ表のみ参照します。
信号の電圧レベルに関しては、M5StickC側が3.3Vなのに対して、RCユニット側が通常5.0V以上と高くなる点に十分ご注意ください。 テスト環境(タミヤ製TRE-01、HobbyWing製QuicRUN-1060)では、直結で問題なく動いていますが、許容範囲内でも保証範囲外と思います。 たとえばRCユニット側の電圧レベルが6Vを超える場合、レベルコンバータを省略するとM5StickCが破損(不可逆に故障)する恐れがあります。
M5StickCのGPIO端子は、プログラムにより自由に変更できますが、G0端子を入力用に使うことは避けたほうが良いです。 G0端子は、内部的にプルアップされており、電源投入時にG0端子がLowレベルだとM5StickCが起動しないことがありました。 G0端子が出力用の場合、相手側の端子が入力用のハイインピーダンスとなるので、この問題を回避できるようです。
GyroM5は、RCユニットの電源と連動して起動、停止します。
ただしM5StickCは、電源管理に不具合が残っており、素直に起動しない場合があります。 原因は、電源管理チップAXPの不具合、内蔵バッテリの電圧低下、GPIOピンの電圧レベル等に起因するそうです。 キーワード「M5StickC 起動しない」のGoogle検索で、複数の対処方法が見つかりますので、トラブル解決の参考にしてください。
自分のテスト環境でも、起動に失敗する場合が起きましたが、M5StickCのワイヤハーネスを取り外してUSB給電すると高確率で起動します。 M5StickC関連ブログ記事に「G0と3V3を直結してUSB給電すれば起動」や「電源投入時のG0電圧に応じてリセット動作」等の記載があります。 内蔵バッテリの充電不足を除いた場合、電源投入時点のGPIOピン(おそらくはG0ピンの)電圧によりM5StickC起動の成否が決まるようです。
なおジャイロ起動に成功後、電源オフ操作は不要です。 GyroM5プログラムは、5Vin端子でBEC電圧の低下を検出すると電源をオフします。
GyroM5Stickは、5種類の画面状態を遷移します。状態遷移は、ボタン[A]、[B]操作及びタイムアウト時に発生します。
- 「HOME」が、ホーム画面となり、この状態からボタン[A]で「WIFI」へ、ボタン[B]で「ENDS」へ遷移します。
- 「WIFI」は、WiFiアクセスポイント兼WWWサーバとなり、スマートフォン等のWWWクライアントの要求に対応します。
- 「ENDS」は、ステアリングCH1のエンドポイント(ステアリング用サーボ角度の上下限値)を設定します。
- 他の状態の場合、ボタン操作が画面に表示してあるか、無操作のタイムアウトでホーム状態「HOME」へ戻ります。
画面 | 遷移 | 解説 |
---|---|---|
WAIT | RC受信機の起動 | ジャイロ起動後、RC受信機からPWM信号を受信するまで待機 |
INIT | タイムアウト | CH1ニュートラル位置、IMUバイアスのサンプリング(この間、送信機操作や車体振動がNG) |
HOME | ボタン[A],[B] | PID制御状態(RCユニット入出力、PID制御グラフなど)の表示 |
WIFI | ボタン[A] | WiFiアクセスポイント兼WWWサーバとなりスマートフォン等の要求に対応 |
ENDS | ボタン[B] | CH1エンドポイントの設定 |
WiFi機能を利用する場合、GyroM5のボタン[A]を押してください。GyroM5は、WIFIモードに入るとWiFiアクセスポイント兼WWWサーバとして機能します。 スマホからGyroM5のWiFiアクセスポイントへ接続後、LCD画面のIPアドレスまたはQRコードで指定されるURLを開くと以下の画面が表示されます。 なおWiFi接続に成功後、画面表示に失敗する場合は「モバイルデータ通信を一時的にOFF」にしてください。 モバイルデータ通信がONの場合、スマホによりインターセット接続が有効でないWiFi通信へルーティングしません。 この画面から各種パラメータの設定機能、走行データのダウンロード機能を利用できます。 パラメータの設定後、GyroM5は通常のPID制御モード「HOME」へ自動復帰します。
GyroM5チューニング時の参考情報として、制御アルゴリズムを解説します。
GyroM5は、汎用的なフィードバック制御アルゴリズムのPID制御(下図はWikipediaから引用)を利用します。
PID制御における目標値r、出力値yおよび操作量uとRCカー(Plant/Process)の関係は以下のとおりです。
- 目標値: r = ch1_in = RC受信機からのCH1入力
- 出力値: y = kg*wz = RCカーの車体ヨーレート
- 操作量: u = ch1_out = RCサーボへのCH1出力
つまりRC受信機(送信機)からのCH1入力rを車体ヨーレートyの目標値と解釈して、 両者の偏差eをゼロに近づけるフィードバック制御により、サーボへのCH1出力uを自動調整します。
- 偏差: e = r - y = ch1_in - Kg*wz
- 操作量: u = PID(e) = Kp * (e) + Ki * INT(e) + Kd * DOT(e)
INTは積分演算子、DOTは微分演算子を意味します。
フィードバック制御の結果、グリップ走行時はニュートラルステアに近い回頭性、ドリフト走行時はヨーレートの安定性を期待できます。
PID制御のパラメータ(Kg、Kp、Ki、Kd)は、走行コンディションにより調整すべきであり、LCD画面で確認&変更できます。 PID制御の整数値(大文字)は、数値を0〜100に規格化しており、PID制御の実数値(小文字)との関係は以下の通りです。
- 角速度"wz"は(ラジアン/秒)単位:
慣性センサ(IMU)計測値をセンサ感度に応じて物理量へ変換した数値です。 - 入出力"ch1"は16ビット数(0〜64k):
PWMパルス幅(0ms〜20ms=1000ms/50Hz)を示す16ビット数(0〜2^16-1)です。 - 観測ゲイン: Kg = KG/20.0
大きくするとヨーレートに敏感となり、ステアリング量に対する目標ヨーレートは小さくなります。 - 比例ゲイン: Kp = KP/50.0
大きくするとカウンタステア量が多くなりますが、大きすぎるとハンチングします。 - 積分ゲイン: Ki = KI/250.0
大きくするとカウンタステア応答が遅くなりますが、最終的な偏差を減らせます。 - 微分ゲイン: Kd = KD/5000.0
大きくするとカウンタステア応答が早くなりますが、大きすぎるとハンチングします。
テスト用RCカーの場合、設定値「KG=50、KP=60、KI=30、KD=10」程度でドリフト走行できました。 なお特別な設定値「KG=KI=KD=0、KP=50」は、制御なし「入力を出力へスルー:u=r」と同じです。
作者のようにSU-01シャーシでRWDドリフト走行を試みる人は少ないと思いますが、 参考までにテスト用RCカー、ユニット及びジャイロ搭載例の写真と諸元を記します。
項目 | 型番 |
---|---|
シャーシ | タミヤ製SU-01 |
ボディ | タミヤ製ジムニーウイリー(SJ30) |
タイヤ | TOPLINE製Mシャーシ用ドリフトタイヤ |
送信機 | タミヤ製ファインスペック2.4GHz |
受信機 | タミヤ製TRE-01 |
アンプ | タミヤ製TRE-01 |
サーボ | ヨコモ製S-007 |
バッテリ | 7.4V LiPo 1100mAh |
モータ | ノーマル370型DCモーター |
ドリフト走行に関連する注意点を列挙します。
- シャーシに関しては、ステアリング用ナックルとシャーシの干渉部分を削りステアリング角度を45度ぐらいまで増やしました。
- サーボに関しては、ファインスペック付属のTSU-03だと制御が遅れてハンチングしたので、ある程度の高速なサーボが必要です。
- モータに関しては、ノーマルだとLiPoバッテリと組み合わせないと、スピードが出たときにトルク不足でドリフト移行が難しいです。
- タイヤに関しては、駆動系が非力なので、なるべく滑りやすいタイヤが良いです。
RCカー用ジャイロ自作を通して、気付いた改良アイデアなどを列挙します。 いずれ対応したいと思いますが、趣味で開発しているので、いつ対応できるか分かりません。 ご自身で改良にチャレンジすれる際の参考になれば幸いです。
- パラメータ設定のスマホ対応(v2対応)
スマホのGUI画面からジャイロ設定(PIDゲイン等)を複数管理して変更可能とする。 - パラメータ調整の完全自動化
車体、路面やタイヤに応じたPIDゲインの最適化を強化学習などで完全自動化する。 - スロットル制御のアシスト
ドリフト走行の安定化には、ステアリングとスロットルの同時制御が必要です。 - 加速度センサの有効利用
ヨーレートと水平加速度から車体スリップ角を推定してトラクション制御を高度化する。 - ジャイロ固定方向の自動検出(v2対応)
鉛直方向を起動時に自動検出して車体ヨーレート成分を決定する。 - PWM入力方式の改良(v2対応)
PWM入力にブロック方式の関数pulseIn(...)を廃止して割り込み方式へと変更する。 - 外部電源との完全連動(v2対応)
M5StickCの内蔵バッテリーを無効化して、RCアンプBECの給電のみでオン/オフ動作させる。 - 走行データの記録分析(v2対応)
走行データをSDカード等に記録して事後分析できるようにする(M5StickCからM5Stackへ変更?)。 - サーボ周波数可変機能(v2対応)
サーボPWM周波数をパラメータで変更可能とする。
M5StickCは、WiFi/Bluetoothを備える点、外部GPIOが5本ある点、6軸IMUを備える点、割り込み処理できる点から、 ほとんどの改良案はハードウェア的には実現可能と思いますので、あとはソフトウェアつまりアイデア次第だと思います。
作者は、コロナ禍で屋内遊びをさがす中、初代グラスホッパー(笑)以来めっちゃ久しぶりにRCカーキット(小型のタミヤSU-01シャーシ)を購入しました。 購入後、RCカー系YouTubeチャンネルを見て、子ども時代に存在しなかったドリフト用RCカー(通称、ドリラジ)の動きに興味を持ちました。 ツルツルのタイヤで横滑りさせながらRCカーを走らせるアレです。 ドリフト用RCカーは、ジャンルとして確立しており、たとえばヨコモYD-2のように専用設計で完成度の高い製品が存在します。 純粋にRCカーのドリフト走行を楽しみたければ、ドリフト専用のシャーシやジャイロ製品を入手するのが最短コースです。
自分の場合、ドリラジの存在に気付いたのがRCカーキット購入後だったこと、 どんなRCカーでも上手く制御できればドリフト走行(を安定化)可能と信じていたことから、 タミヤ最安(実売価格≒4K円)のSU-01シャーシを自作ジャイロで制御してドリフト走行にチャレンジしました。 やや回り道しましたが、ほぼノーマル(舵角を増やしただけ)のSU-01シャーシでドリフト走行できました。
RCカー用ジャイロの自作は、プログラムやパラメータの変更によりRCカーの走行特性を変えられるので楽しい開発でした。 RCカー好きの人なら自作ジャイロの操縦性を楽しみつつ、プログラミングや制御アルゴリズムを習得する良い素材(STEM教育の素材)と思います。 趣味でRCカーやプログラミングを楽しむ若い人が増えて欲しいとの願いから、開発したRCカー用ジャイロGyroM5のソースコードを公開します。 この記事を参考に、部品を集めてGyroM5を再現する人、改造して「オレ専用ジャイロ」を開発する人、が出てくれば自分はハッピーです。
(^_^)
RCカー用ジャイロGyroM5の開発にあたり、参考にした資料などを列挙します。 「元気っ子さん」は、初心者に親切なラジコン屋さんで、作者がGyroM5搭載カーの試験走行、ヨコモYD-2の体験走行等でお世話になっています。
- 自動車の運動と制御
- 車両運動の安定性解析と制御への応用
- On the dynamics of automobile drifting
- Analysis and control of high sideslip manoeuvres
- Stabilization of steady-state drifting for a RWD vehicle
以上