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

モーションシミュレータの座席にラダーペダルを固定するため、金具を切り貼りしたいのですが、先週の雨に続き今週末も台風がやってきて降ったり止んだりしているので外での作業が出来ません。
そこで近所のホームセンターハンズマンにある工作室で金具のカットと穴あけをしてきました(工作室での写真は撮り忘れました)。
切り終えたのがこれ。

Mostionsim6

座席に取付ける金具(切ったあと)。
3mm厚で幅40mm、各辺270mmのL型金具(1本170円)。
元々は建築用みたいです。

現状の座席にも同様の金具をフレームとして使っており、これに溶接する予定ですがハンズマンの工作室でも溶接はできないので晴れたら庭でやろうと思います。が、雨が止んだかなーと思って準備を始めるとまたポツポツと降ってきます。

てるてる坊主

 

晴れるのを待ちながら制御基板の続きを作る事にします。先日故障した基板切削CNCも調子よくなっており切削完了。

MotionSim6-2

切削を終えた基板の両面テープをスクレーパーで剥がします。

部品を実装しました。(一か所回路図段階でミスっておりパターンを修正しましたがこちらの面からだと見えないのでナイショ)

MostionSim6-3

実装も完了。

これくらいの配線量だとユニバーサル基板の方が手っ取り早いかもしれません。でもそこは趣味の世界です。 またArduino標準のピンヘッダ配置はユニバーサル基板がピッタリ納まる様になっていないという問題もあります。

基板を作った後で気づいたのですが、手元の古いArduinoUNOには無い端子を使う配線になっていました。I2C通信で使うSDA,SCL端子は現在のUNOでは端子が追加されて2か所にありますが古いUNOには1か所しかありません。

MotionSim6-4

ArduinoUNOのピンヘッダ新旧比較
(左の新しい方はバッタ物ですが・・・)
左下のAD4,AD5端子がSDA,SCLと兼ねており昔からある端子です。これに対し今のUNOでは右上にも同じ信号がSDA、SCLとして追加されています

仕方ないので新しい方(バッタ物)を使う事にします。

とかやっている間にAliExpressに何となく注文していた基板が届きました。
1枚108円で送料無料です。こんなのを使うのが一番簡単でした(いまさら今回のには使いませんが)。

MotionSim6-5

Arduinoシールド用ユニバーサル基板

 

何はともあれ基板が出来たのでブレッドボードを取り外して交換します。
だいぶスッキリしました。
基板上のトグルスイッチはマニュアルとオートの切替です。オート側にするとPCから仮想COMポート経由で制御でき、マニュアルにしておくと基板上の4つのタクトスイッチで動作させる事が出来ます。

MotionSim6-6

ブレッドボードから基板に変更してスッキリした図

そうこうしている内に雨が止んだ様です。日没まであまり時間がありませんが少しでも溶接作業を進めます。
といっても2本を接合しただけで日が暮れました。座席のフレームとの接合は後日行います。

MostionSim6-7

2本を接合。

少しずつしか進みませんが続けていきます。

フライトシムのモーションシミュレータ化~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での処理となります。

ヨットレースのスタート練習用タイマー~その3~

だいぶ間が空いてしまいましたがヨットレースのスタート練習タイマーの続きです。

前回のマイクがイグニッションノイズを拾ってピロピロ言う問題は電源からの回り込みと思われます。マイクユニットには直接12Vの電源を供給し、ユニット内の抵抗で分圧してコンデンサーマイクに与えていました。コンデンサは大小取付けていますが電源の安定化はしていません。電解コンデンサーを増やしてみたりもしましたが納まらなかったので、マイコン側に供給している5Vレギュレータから電源を取ったところ綺麗にノイズは消えました。

またマイコンのプログラムも修正しました。今までのプログラムでは時々リセットに失敗しておかしな動作をする事があったのでリセット処理を変更しています。
Arduinoスケッチ→http://www.hoihoido.com/data/RaceTimer170329.ino

これで大体の機能は完成したのですが、風が強い日はやはりスピーカーの音量が不足する様です。特にスタートタイマーの発信音はパワーアンプにフルスイングで入れているのでこれが限界かと思われます。アンプはAliExpressから¥104円で買った10WステレオD級アンプですが、これを更にパワーアップするのも大変です。
そこでどれくらい効果があるか分かりませんがスピーカーをもう一つ追加してみる事にしました(秋月電子で¥1500-のヤツです)。アンプはステレオなので出力は2つあります(今まで片CHしか使っていませんでした)。
またスピーカーの向きを可変にして好きな方向に向けられる様にしました。

こんな感じです↓。

StartTimer

ダブルスピーカー!!

まだ強風の中では試せていませんが、かなり改善したと思います。スピーカーの方向を可変にしたのも効いている様です。

 

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

フライトシミュレータでいつか実現したいものに、フォースフィードバックとモーションシミュレータがあります。
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で取り出せる変数には加速度データもあるのですが、表示させると何だか思ったものと違う様です。もしかすると速度を微分して計算するしかないのかもしれません。また本当に人が乗れるヤツを作ろうと思ったらアクチュエータをどうするか、また置き場所をどうするかという大問題もあります。

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

フライトヨークにミクスチャー、プロップレバーを付けてみる。-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はレシプロエンジンですし、どこのタービンなのでしょう?ターボチャージャーのタービンでしょうか?)。

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

ベビースターラーメン 創味シャンタン味

いつもと毛色の違う話題ですが・・・

ベビースターラーメンには基本の「チキン味」以外にも「ソース味」や「うましお味」等、様々な種類があります。しかし私の場合、他の味を試しても結局は「チキン味にしとけばよかった」という事になります(個人的な感想です)。

しかし最近ドンキホーテで見つけた「創味シャンタン味」。

BabyStar1

ベビースター ドデカイラーメン 創味シャンタン味

創味シャンタンってちょっと前まで味覇(ウェイパー)だったアレですよね。
食べてみたところ、これ旨いです。「チキン味」に引けを取りません(あくまで個人的感想です)。

旨かったのでスーパーに寄ったついでにもう一度買おうと思ったのですが、あまり売っている店を見かけないんですよね。で、結局またドンキホーテに行きました。そしたら・・・

BabyStar2

ベビースター
創味のつゆ味

「創味のつゆ味」ってのもありました。これも買ったけどまだ食べてません。
どんな味か楽しみです。

RCグライダー ~2~

先日壊れたところを修理します。

スチレンペーパーを少し剥がして覗くとこんな感じでバルサが折れていました。

RCglider4

バルサが折れています。

主翼の断面は下の構造になっています。
補強用のヒノキ棒を下側だけに取付けたのが敗因でした。

RCGlider5

今回、上側にもヒノキ棒を入れて補強しようと思います。RCGlider7

修理

では取り掛かります。翼端の上反角部分はエポキシで接合しており、ここをカッターで切り離します。また今のスチレンペーパーを再利用するのは無理っぽいので全部剥がします。

RCGlider6

翼端を切り離しスチレンペーパーを剥がしました。

そして上側にもヒノキ棒を入れて補強して新しいスチレンペーパーを貼り直し、翼端をエポキシ系接着剤で接合します。
固まるまでの間にずれない様、厚紙で作成した冶具とマスキングテープで固定します。

RCGlider8

右翼

RCGlider9

左翼

これで修理完了。前よりしっかりした感じです。
重量は112gなので2g増えていますが、たぶん影響する程ではないでしょう。

テスト飛行

まずは手投げで飛ばしてみたところ前より若干不安定な感じがします。色々調べていたら尾翼の接合部分の接着剤がはがれてぐらついていたので再接合したらいい感じに戻りました。

そこでショックコード発航に再トライです。フックにコードを引っ掛け数メートル引っ張って飛ばすと一気に高度が上がります。何度か試しても再び主翼が折れる事はなくいい感じです。

なかなか面白いです。グライダー。

 

 

 

ガラクタ市2017年春

今日から近所のホームセンター「ハンズマン」のガラクタ市が始まりました。
例によって出勤前に参戦です。

GARAKUTA1

朝6時33分。
まだそれほど並んでいません。

本来は7:00開店ですが、今日は10分早く開きました。
そのため、昨年秋ほどの長い列はできていません。

どれも安いのですが、今回はあまり「おぉ!」となるものがありません。
あとから登場する品もあったりするので、来週月曜日までマメに足を運んでチェックしたいと思います。

GARAKUTA2

購入した品

Laser加工機製作 ~その17 操作パネル~

続きです。
カットする図形をJW-CADで描き、文字データをInkscapeで作成したので厚紙に試し打ちします。文字は裏から印字する方が表面がツルッとして感じがいいので文字もカットも裏から加工します。なおアクリルの長さが加工機の許容範囲を少し超えているのでデータを2分割し、後半は材料を180度回転させたうえで加工します。

LaserPanel7

厚紙に試し打ち。スイッチも取り付けてみた。

厚紙での試し打ち結果ですが、なんか所々ミスっています。
まずボリュームの目盛りとマニュアル発射スイッチが重なってしまいました。
文字や目盛りはラスター加工するのでデータ作成ソフト(前に紹介したgrasterです)に印字位置を座標で与えます。この時の値がミスっていた様なので修正します。
また 「Manual Shot」印字のMの文字が半分切れてしまいました。これは心当たりがあります。Raster加工を立ち上げたとき、LinuxCNCのStreamerと呼ばれるバッファ(ここにレーザーを発射する座標が格納されている)を最後まで読み込まず、後ろに400行ほどダミー行を追加する事で回避しました。最後まで読まない原因は分かっておらず、400行では不足する場合があるのかもしれません。そこで今回はgrasterを変更してダミー行を600行に増やすと最後まで印字が出来ました。

いよいよアクリルを加工します。

LaserPanel8

アクリル加工完了

 

LaserPanel8

ちょっと見づらいですが、オフセットがずれたままスタートしてしまい、慌てて止めたのですが’e'の文字の部分に不要な穴をあけてしまいました。接着剤で付け直しています。

 

そして加工機に取り付けます。アクリルが2mm厚で少し薄い上に、左側を固定していないため、ちょっとポヨポヨしています。そのうち左側も固定したいと思います。

LaserPanel9

取付け完了。

パネルに搭載したのは上から、電流計、マニュアル発射スイッチ、パワー調整ボリューム、水ポンプスイッチ(横に水センサーのLED)、非常停止スイッチです。
マニュアル発射スイッチは秋月電子で購入した’ミサイルスイッチ ‘と押しボタンスイッチを直列に繋ぎました。ミサイルスイッチは蓋を開けないとONにできない構造になっており、誤ってボタンを押して発射してしまう事を防ぎます。

これでまた少しレーザー加工が快適になりました。