フライトシムのモーションシミュレータ化~4~

前回FlightSimulatorXからデータを取出して座席の傾きを計算しArduinoに送るところまで来ました。引き続きArduino側でのスケッチを書いていきます。

PCからArduinoに送るデータフォーマット

PCからArduinoへはシンプルに下のフォーマットでデータを送ります。

ピッチ,バンク\n

第一フィールドが座席のピッチ、第二フィールドがバンク角で、それぞれ’度’単位の角度を10倍した整数で表します。10倍しているのは小数以下一桁までを整数で表し、少しでもArduino側の計算負荷を減らす目的です。

Arduino内での処理

Arduinoのスケッチではシリアルポートを定期的にチェックし、1行分のデータが来たらピッチとバンク角を取出します。そしてこの値を元にリニアアクチュエータの目標とする長さを左右それぞれ算出します。

また加速度センサーの値も定期的にチェックします。加速度センサーは座席裏側に取付けてあるので座席の傾きを示しており、この値から現在のリニアアクチュエータの長さを推定します。

あとはモータードライバーに対し、目標長と現在長の差が無くなる方向に動かす信号を送ればアクチュエータが動作して座席が目標角度になるという算段です。

実際にはアクチュエータが停止状態から動き出す時はPWMで徐々に加速し、目標に近づくと徐々に減速する事でなるべくスムーズな動作を目指しています。

なお当初、加速度センサーは座席の背板付近に取付けていました。しかしこれでは重力加速度による傾き検出以外に本当の加減速も検出してしまいます(軸から遠いので特に上下には大きく動く)。今回は傾きの情報だけ欲しいのでなるべく軸の近い場所に移動しました。

動かしてみる。

まだモニターもペダルもコントローラーも取り付けていませんが、とりあえず動作させてみます。
PC側でFSXを起動し、DOS窓から先日作ったデータ抽出プログラムを起動し、リダイレクトで仮想COMポートに送ります。

動画で・・・

最低限のところが動いた感じですが、なかなか楽しいです。
ペダルやコントローラを取付けていきます。

フライトシムのモーションシミュレータ化~3~

引き続きソフトを作っています。

SimConnectから得られる値について

モーションシミュレータではシミュレータ世界で体が受けるであろうGの方向を実世界の重力の方向に合わせる様に制御しようと思います。例えば離陸のために加速する時は後ろ向きにGが掛かるので座席を上向きに傾ける事で体にそれっぽい力が加わります。しかし以前の投稿で体にかかるGの方向がSimConnectから上手く取れない話を書きました。

SimConnectから得られる変数に「ACCELERATION BODY X(同様にY,Z)」と「ACCELERATION WORLD X(同様にY,Z)」という変数があります。
ドキュメントに詳しい説明が見当たりませんが、名前からするとこれらが体にかかる加速度およびワールド座標での加速度かと思います。しかしこれらの変数を表示させても妙に小さな値ですし思った様な変化をしていません。

下の4つのグラフは出来るだけ水平を保って右旋回を続けた時の変化です。
一番上のグラフは機体のピッチ、ロール、ヘディングを表します。単位はラジアンでヘディングの0(又は2π)は北を示しており、ノコギリ状のグラフになっているのは右方向に2回転した事を示します。

2番目のグラフは各方向への速度(単位はFeet/s)を示します。東西がvX、南北がvZなのでこの二つが90度位相がずれたサインカーブをほぼ描いており回転している事が判ります。

そして3番目のグラフが加速度を示すと思われる変数「ACCELERATION WORLD X(及びY,Z)」の値ですが、何を示しているのかよく分かりません。

そこで4番目のグラフに速度から算出した加速度をプロットしてみました。横軸が1秒ステップなので2番目のグラフの値を元に、それぞれ一つ前からの差を計算すればFeet/S2(フィート/毎秒毎秒)になるはずです。これだと最大120feet/S2で速度を90度ずらしたそれっぽい波形になっています。

・・・という事で速度の変化から計算した加速度を用いる事にします。
なお、この加速度に重力は含まれていないのでY軸方向に32.174feet/S2(=1G)足した上で機体座標に変換して座席の姿勢を決める事にします。

SimConnectの座標

SimConnectが出す値を調べた結果、各座標は下の様に表しているみたいです(座標変換するとき何度もこんがらがるので覚書き)。

MotionSim4-2

SimConnectの座標

以上で求めた座席の傾きをUSBのCOMポートに書き出し、後はArduinoでの処理となります。

フライトシムのモーションシミュレータ化~2~

フライトシミュレータのモーションシミュレータ化、まだくじけずに続けています。

アクチュエータ連結部のガタ減らし

リニアアクチュエータの連結部分の上側が特にガタが大きいので対策しました。この部分もキャスターの車輪を外したものを流用していて、元々の車輪の軸がΦ8でした。しかしリニアアクチュエータの取り付け穴はΦ6です。アクチュエータの穴を広げるか細い軸を用いる必要がありますが穴を広げると強度が落ちそうなので細軸を採用し、M6の半ねじボルト(のねじを切っていない部分)で連結しています。
Φ8の穴にΦ6の軸なので遊びが多くてガタつきます。何かいい方法はないかと物色していたらモノタロウでこんなものを発見。バイクのパーツを取付ける部品らしいです。

MositonSim3-1

キタコ ツバ付カラー

内径がΦ6.2、外形がΦ8.2。これを軸受けに挟み込んでみます。

MotionSim3-2

こんな感じ。外形Φ8.2はちょっと固いけど押し込めば入りました。

これで少しガタが減りました。まぁそもそもキャスター自体のガタもあり、こちらは改善できないんですが。

モータードライバー

そしてラダーペダルやフライトヨーク、PCモニターの取付け方法も考えねばなりませんが、これらは置いといて電気的なところを進めます。

モータードライバーは瞬間最大で4.5A流せるTB6643KQを用います。リニアアクチュエータは定格4Aという事になっていますが、実測すると(私が座った状態で)1Aちょっとしか流れてなかったので余裕だと思います。

MotionSim3-3

TB6643KQ。秋月電子で購入。

これを用いてドライバー基板を作っていきます。

MotionSim3-4

基板を削って・・・

MotionSim3-5

実装しました。

MotionSim3-6

放熱を兼ねて金属部分にねじ止めします。

フィードバック系

今回使用するリニアアクチュエータはDCモータに電流を流すだけの制御です。端まで行くとストップする仕組みは内蔵していますが、RCサーボやステッピングモータの様にオープンループで制御する訳にはいかず、何らかの方法で動作量を検出してフィードバックしなければなりません。 大体こういう時はボリューム(可変抵抗)を使いますが、今回の構造でボリュームを取付けるのは結構面倒に思えます。そこでこれを使ってみることにしました。

MotionSim-6

GY-521(6軸ジャイロMPU6050搭載)

だいぶ前にAliExpressで140円くらいで買ったジャイロ3軸+加速度3軸のセンサーです。座席に貼付けて加速度から傾きを検出しようという魂胆です(ジャイロは使いません)。

このセンサー、マイコンとはI2Cで接続します。センサー自体は3.3V系なので電源には降圧レギュレータが入っていて5V電源を接続できますが信号は3.3Vのままです。マイコンにはArduinoを使おうと考えていますがUNOだと5V系です。ProMiniなら3.3V版を保有していますが今回の用途はPCと常に通信するためFT232RL等のUSBシリアル変換回路を外付けする必要があり面倒です。

ところでArduinoのI2Cの使い方を調べていると5V系Arduinoを3.3VのI2Cデバイスに接続する場合はレベル変換回路を入れろとあちこちに書いてあります。でも本当にレベル変換が必要なのでしょうか?
I2Cはバス全体をプルアップしておき、各デバイスはオープンドレインでLに落とすことにより通信を行います。ならば3.3Vでプルアップしておけば少なくともデバイスを壊す事はない様に思えます。問題は5V系Arduinoが3.3VをHと認識してくれるかどうかですが、ATmea328Pのマニュアルを見ると入力のVIHは0.6VCCとなってるのでVCC=5Vの場合は3V以上ならHと認識してくれる筈です。H=3.3Vで通信すると0.3Vしか余裕が無いのは気持ち悪いですが実力はもう少し余裕があるでしょうし、実用上はイケるんではないでしょうか(今のところイケてます)。
実際の回路ではGY-521モジュール内で4.7KΩを経由して3.3V電源に接続されています。一方ArduinoUNOもデフォルトでは20K~60KΩで5V電源に接続されている様です。Arduinoのプルアップは切り離しもできる様ですが仮にそのまま動作させた場合、Arduino側を最悪値の20KΩで考えると・・・「3.3V—4.7KΩ—バス—20KΩ—5V」という接続にないります。この時バスには3.7Vが加わる事になりますがMPU6050の入力最大定格はVDD+0.5V(=3.8V)となっており、これもギリギリですが規格内です(それに実際に定格を大きく超えようとするとデバイス内の保護ダイオードが順方向になって電流が流れるので20Kのプルアップではそれ以上電圧を上げる事ができなくなり助かるはずという目論みもあります)。
・・・という事で5V系のUNOを使ってレベル変換無しでやってみようと思います(真似してトラブっても責任負えませんけどね)。

取付け

という事でArduino UNOとセンサーを取り付けたところです。まだブレッドボードなので、うまく行く様ならしっかりした基板に変更しようと思います。

MotionSim-8

Arduiono他一式、仮止めの図。

MotionSim-9

念のための非常停止スイッチ。どこに固定しましょう?

簡単なプログラムでモーターの制御とセンサーの読み出しが確認できたのであとは実際にPCから指定した角度に座席が動くプログラムを作っていきます。

フライトシムのモーションシミュレータ化

先日こういう投稿をしました→フライトシムからデータを取出しアクチュエータを動かす。
その後、釣り糸は緩むはユニバーサルジョイント替わりの熱収縮チューブは折れ曲がるはでこんな状態です。

SimConnectServe2

釣り糸が伸びてサオ立ち状態。

これは置いとくとして、人間が乗れるモーションシミュレータの検討は続けております。
検索してみると世の中では車のワイパーモーターや電動自転車用モーターを使用した例が多く見つかります。やはりこれぐらいのパワーは要るのでしょう。しかし機械工作のハードルが高くなります。

リニアアクチュエータ

で、こんなものを使ってみます。AliExpressにはストロークや駆動力が異なる物が何種類も掲載されていますが、どれもモーターは同程度でギヤ比だけ変えている様です。なので駆動力が大きいものは速度が遅くなります。

MotionSim1-1

リニアアクチュエータ

購入したのはストローク300mm、駆動力600N、速度19mm/S、12V印加で4A流の品。速度が遅いのが気になります。350Nくらいの品だと25mm/Sというのもあり、迷いましたがまずは確実に動作する方を購入しました。

概略構想

こういう形を計画しています。↓

製作(土台部分)

土台を作ります。

MosionSim1-2

角材で作った土台

座席を支えるのは車輪を取り外したキャスターです。荷重120Kg仕様のキャスターですが本来とは違う向きに力が加わるので様子を見ながら使ってみます。

座席部分

座席です。最終的にはもうちょっとマトモな形にしたいのですが・・・。

アクチュエータとのリンク

リニアアクチュエータを支えるのもキャスターです。
上側・・・

MotionSim1-4

リニアアクチュエータと座席とのリンク

下側・・・

MotionSim1-5

リニアアクチュエータと土台とのリンク

 動作テスト

動作テストのため簡単なコントローラーを作って・・・

とりあえずのコントローラー

とりあえずのコントローラー

動かしてみます。
やっぱりちょっと遅いですね。

ではいよいよ人間が乗ってみます。崩壊するかもしれないのでバイク用のヘルメットを被ってトライしました。恐々・・・
座席のホールドが悪いので傾けるとずり落ちそうです。なんか笑える映像になりました。

この後

色々と不安な点もありますが、この延長でモニターやラダーペダルを取付けて進めていこうと思います。

フライトシムからデータを取出しアクチュエータを動かす。

フライトシミュレータでいつか実現したいものに、フォースフィードバックとモーションシミュレータがあります。
OpenStickのフォースフィードバック対応については私の技術力と英語力では苦戦している事を何度か書きました。
一方、モーションシミュレータはというと敷居が高そうで今まであまり検討しませんでした。置き場所も問題ですし。

でも今回急にやりたくなったんですよね。いきなり人間が乗れるものを作るのは大変なので、まずはシミュレータからデータを取出してラジコンサーボを動かしてみるというところから始めました。

使用するシミュレータはマイクロソフトのFlightSimulatorXです。ここからデータを取出すには、世の中ではFSUIPCという追加ソフトで取出すパターンが多い様です。これはこれで気になりますが、まずは今あるものを使ってみてから考えるという事で今回はFlightSimulatorXに標準で入っているSimConnectを使用してみます。(たぶんFSUIPCも内部でSimConnectを使っているのだと思います)。

SimConnect

SimConnectはFlightSimulatorXに標準で付いているSDK(ソフトウェア開発キット)の一部で、シミュレータ内の各種数値を読み書きする事で計器やコントローラ等を制御できるツールです。FlightSimulatorXのDVDにSDKのインストーラが含まれており、これをインストールしました(もしかするとFSXと共にインストール済なのに上書きインストールをしたのかもしれませんが今となっては判りません)。このSDKの中にはSimConnect以外にも色々な機能が含まれており、これらもいつか試してみたいと思います。
で、SimConnect の実体はSimConnect.hとSimConnect.libで、VisualStudioC++からインポート&リンクして使用します。

VisualStudio

ウチのPCにはVisualStudio2010 ExpressEdition(要はお金のかからないヤツね)がインストール済なのでこれを使います。SDKのマニュアルによるとVisualStuio2005以降に対応しているとの事なので大丈夫でしょう。

サンプルソース

SDKには多数のサンプルが付いています。この中の’Request Data’というサンプルを元にして必要な情報が取れる様に修正していきます。

プロジェクト作成/コンパイル

まずVisualStudioでWin32コンソールアプリケーションとしてプロジェクトを作成します。そしてSDKの説明に従いヘッダとライブラリを指定します。そしてコンパイルするとプリコンパイル済ヘッダのエラーが出たので安直にプリコンパイル済ヘッダを使用しない設定に変えてしまいました。これでとりあえずはコンパイルも通ってプログラムを実行できる様になりました。
→実験プログラム(VisualC++のプロジェクトツリー一式です。色々関係ないデータも取出していますが結局ロール、ピッチ、方位しか使っていません)

データ取得

‘Request Data’はシミュレータと通信し、高度、緯度、経度を取出してDOS窓に表示するサンプルプログラムです。これを変更して機体のピッチ、ロール、方位を取出し、カンマ区切りで出力します。これらの値は浮動小数点型で単位はラジアンですが、このままArduinoに送っても扱い辛いので単位を度数に変換し、更に数値を10倍して少数以下を切り捨てました。これによりArduino側では整数で扱えます。
また’Request Data’サンプルは一回データを出力したら終りでしたが、これを定期的に出力する様に変更しました。

データをArduinoに転送

これまた安直にDOS窓状で’コマンド名>COM3:’ を実行し、リダイレクトにより仮想シリアルポートに送ります。最終的にはもうちょっとマトモなやり方に変えたいと思いますが、まずは実験です。

Arduinoでの処理

カンマ区切りを分解してロールとピッチのデータを得ます(今回2軸なので方位データは捨てています)。 そして各値をサーボ用の値に変換してサーボライブラリに送ります。
→実験プログラム

サーボ

サーボは随分前にロボットを製作した時の残りのGWSのMicro2BBMGを使用しました。これはかなりトルクがあるサーボなので今回の用途にはちょっと無駄です。実は4グラムサーボも手持ちがありますが、こちらはラジコン飛行機に乗せたいので取っておきます。

リンケージ

サーボから釣り糸をリンケージに使って棒の上の円盤を傾けます。棒と円盤とは熱収縮チューブで接続しているので自由に傾ける事ができます。円盤の上には模型のセスナ172(ThingiVerseからダウンロードしてプリントしました)を乗せています。

Fusion360でレンダリングしてみました。

PlaneDisplay1

Fusion360で描いてみます。

そして実体化。動画です。

この後・・・

今回は機体の傾きをそのままサーボの角度で表していますがモーションシミュレータとなると体にかかる加速度(重力も含めて)を再現しなければなりません。SimConnectで取り出せる変数には加速度データもあるのですが、表示させると何だか思ったものと違う様です。もしかすると速度を微分して計算するしかないのかもしれません。また本当に人が乗れるヤツを作ろうと思ったらアクチュエータをどうするか、また置き場所をどうするかという大問題もあります。

・・・という事で、これまたぼちぼちやります(多分途中でくじけます)。

フライトヨークにミクスチャー、プロップレバーを付けてみる。-3-

今回フライトヨークに追加したレバーのノブを塗ってみました。
「ABS 塗装」で検索するとプラモデル系サイトが多くヒットし、そこではABSに塗装すると割れるとか脆くなるとか、あまりよろしくない事が書かれています。ちょっと躊躇しましたが今回のはプラモの様な細かい部品ではないし、もし壊れてももう一度プリントすれば良いので取り敢えずそのままタミヤカラーを塗ってみました。今のところ大丈夫そうです。

YOKEレバー塗り

青色が濃すぎたかも

 

フライトヨークにミクスチャー、プロップレバーを付けてみる。-2-

「フライトヨークにミクスチャー、プロップレバーを付けてみる。」のつづきです。
数年前に作成したフライトヨークですが、先日からまたイジり始めています。

レバー3本をベースに固定しました。止めねじの位置をボリューム直下にしてしまったので順番を間違えると取付けられない構造になってしまいました。

FlightYokeRev2

レバーとボリュームが付いていると止めねじを回せない。台座固定後にボリュームを取付ける順序で固定します。。

3本とも付きました。ノブにはまだ塗装をしていません。
スロットルに対しミクスチャーとプロップのレバーが大きすぎるので、いずれ改善したいと思います。

FlightYokeRev2_1

レバー3本取付け。

 

今回制御基板も変更します。
以前はこんな基板でしたが・・・

FlightYokeRev2_2

以前の制御基板。

配線をスッキリさせる為、OpenStick基板キット作成時の試作版(≒失敗作)プリント基板に変更します。
ボリューム、スイッチへは配電盤経由で接続しました(結局あまりスッキリした感じがしませんね)。

FlightYokeRev2_3

制御基板/配電盤

 

これでハードウェアは一応完成です。次にOpenStickConfigでコンフィグデータを作成します。
’HID Usage Tables’にはスロットルは定義されていますがプロップやミクスチャーが見当たらなかったので、プロップレバーを’Rx’、ミクスチャーを’Ry’として設定しました。

ヨークRev2のOpenStick設定

ヨークRev2のOpenStick設定

これをPIC18F2550に書き込んでWindowsのプロパティで動作を確認。
ちゃんと’X回転’、’Y回転’が増えています。

FlightYokeRev2_4

Windowsのプロパティで動作を確認。

 

早速Microsoft FlightSimulatorXでフライトしてみます。

FlightYokeRev2_5

Mooney Bravoで熊本上空を飛行。

スロットル、プロップ、ミクスチャー共、レバーに連動して画面上のレバーも前後に動くので正常動作している事が判ります。
機体はプロップレバーも試せる’MooneyBravo’です。
しかし・・・なんか違いが判りません。
プロップレバーはMicrosoftFlightSimulatorXのMooneyBravoの操縦方法のページに書かれた通り、巡行なら吸気圧34インチ/回転数2400RPMに調整しています。これはスロットルとプロップレバーで調整できています。しかしミクスチャーはTITの温度がピークになる様に調整するとの事ですが、変化させてもTITが殆ど変わりません(ところでTITはタービン温度との事ですがMooneyBravoはレシプロエンジンですし、どこのタービンなのでしょう?ターボチャージャーのタービンでしょうか?)。

レバーを追加してはみたものの、もっと勉強が必要な様です。

フライトヨークにミクスチャー、プロップレバーを付けてみる。

久々にフライトヨークをいじります。

スロットルレバーは今までこんな感じの一本だけでした。

スロットルレバー1

スロットルレバー

スロットルレバー2

適度な摩擦感を出すためフェルトを貼っています。

本物には混合気を調整するミクスチャーレバーや、機種によってはプロペラのピッチをコントロールするプロップレバー等があるそうです。
http://www.cfijapan.com/study/html/to199/html-to199/189-5-1-CSP_Operate.htm

これらのレバー搭載は製作当初から予定していたのですがそのままになっていました。それを何故か今思い立って再開です。

まずレーザーでレバーの側板を切りだします。
今まではレバーの片側だけを支えていましたが時々緩んでレバーが下がってくる事があったので今度は両側から挟み込む様に変更します。なので4枚作成です。

YOKEレバー側板1

レバーの側板切りだし。

と思ったのですが、やっぱりスロットルレバーの側板も更新する事にしたので6枚作りました。

スロットルレバー側板2

6枚切りだし完了。

次にレバーを作ります。2mm厚ステンレス版(これも以前ハンズマンのガラクタ市でかった素材)からレバーを切りだします。そしてこれまたハンズマンのドリルストッパー6mmを溶接します。

レバー

レバー。今までのと新しいの二つ。
溶接が上達しません。

ドリルストッパーには六角レンチで回す3mmのイモネジが付いていますが、溶接の際に穴を潰してしまったので開け直して3mmナベネジに変更しました。

そして台座を作ります。
今までスロットルレバーで使っていたのと同じ金具が見つからなかったのでアルミアングルを切って3つ共作り直しました。

スロットル台座

スロットル台座

仮組みして並べてみます。

レバー仮組み

レバー仮組み

スロットルレバーのノブはまだ3Dプリンターを持っていなかった時代だったので「自由樹脂」というお湯で温めて成型する樹脂で作ってあります。
新しいレバーのノブはプリントパーツにしようと思いますが、色付けをどうしましょうかね。ミクスチャーは赤、プロップレバーは青と決まっている様なのでこれに従いたいのですが、普段使っているフィラメントはABSの白です。PLAなら赤と青のフィラメントを持っているのですが樹脂変更はノズルが詰まりやすくなるという話もあるのでやっぱりABSでプリントして塗装しようと思います(ABSの塗装が難しいという話も聞きますが)。

・・・つづく