B747-400 auto-pilot cockpit of X-Plane
タクトスイッチ
一番簡単な配線とArduinoのスケッチで実現します。
本来ならば、プルアップやプルダウンを使った回路になるのですが、Teensy内蔵のプルアップ抵抗を使用するのでここでは抵抗は一切使用しません。従って超簡単な回路になるのです。
その代わり、スケッチで必ず pinMode(FDSwPin, INPUT_PULLUP); の INPUT_PULLUP というオプションを指定します。
タクトスイッチの場合はONの状態を保持する必要があります。従ってX-Planeのコマンドを使った方が簡単ですので「FlightSimCommand」を使用します。
この中で、3行目にBounce(THRswPin, 5); といのがありますが。最後の数字5は遅延させるミリ秒の数値です。バウウンスするとき5ミリ秒だけ処理を遅延させます。その間に起きるチャタリングを全てチャラにしようということです。それでも起きるときは数値をあげていきます。
100ぐらいまで上げるとほとんどチャタリングはうまく処理できるようになります、その分次のスイッチが反応しないという理屈になるのですが、X-Planeでのスイッチ処理はゲームのように次々に押すとうことはしないので、これでも十分でしょう。スイッチの反応がおかしいときはこの数値を変化させることで解決できると思います。
B747-400 THRスイッチのスケッチ(Teensyのピンはどれでも可)
// FlightSimCommandが使えるので、タクトスイッチでもON/OFFがトグルになる #include <Bounce.h> const int THRswPin = 10; //27SWの番号の宣言 Bounce THRswitch = Bounce(THRswPin, 100); //100ミリ秒処理を遅延させる FlightSimCommand THRautothrottle; elapsedMillis inactivityTimeout;// 無活動タイムアウト void setup(){ pinMode(THRswPin, INPUT_PULLUP); THRautothrottle = XPlaneRef("sim/autopilot/autothrottle_toggle"); } void loop(){ FlightSim.update(); THRswitch.update(); if (THRswitch.fallingEdge()) { THRautothrottle = 1; inactivityTimeout = 0; } if (THRswitch.risingEdge()) { THRautothrottle = 0; } }
このスケッチで、elapsedMillis inactivityTimeout; // 無活動タイムアウトというところがあるが、意味が今ひとつなんですが、私なりに理解しているのは、下の方にその処理としてinactivityTimeout = 0;となっています。これはボタンを押し下げたとき、THRスイッチを1にした直後、無活動の状態を0にする。つまり次のスイッチの押上の状態をすぐに処理するということかな?押す下げと押上げを間髪入れずに処理する形になるということだと思います。押して、上げる間の遊び時間を0にするとうことだと理解してのですが、それならチャタリングはこれだけで解決と思うのだが、上のBounce処理は何故必要かということにもなる。
とにかく、タクトスイッチのように押し下げ、押上げの処理をするときはこれを入れて置くと大丈夫なんでしょうね。あまり深く考えないことにしましょう。
その他のタクトスイッチで使用されているdataref
上のスケッチに下のdetarefを入れ替えると、そのスイッチが動作します。当然のことですが、全て一緒に使用する場合はそのスクリプト用にその他の部分を変更する必要があります。
THR:sim/autopilot/autothrottle_toggle
SPD:sim/autopilot/level_change
SEL:sim/autopilot/knots_mach_toggle
L NAV:sim/autopilot/NAV
V NAV:sim/autopilot/vnav
FL CH:sim/autopilot/level_change
HOLD(HDG):sim/autopilot/heading
V/S:sim/autopilot/vertical_speed
HOLD(ALT):sim/autopilot/altitude_hold
LOC:sim/autopilot/NAV
APP:sim/autopilot/approach
A/P ENGAGE:sim/autopilot/servos_toggle
DISENGAGE:sim/autopilot/servos_toggle
とにかく、タクトスイッチのように押し下げ、押上げの処理をするときはこれを入れて置くと大丈夫なんでしょうね。あまり深く考えないことにしましょう。
その他のタクトスイッチで使用されているdataref
上のスケッチに下のdetarefを入れ替えると、そのスイッチが動作します。当然のことですが、全て一緒に使用する場合はそのスクリプト用にその他の部分を変更する必要があります。
THR:sim/autopilot/autothrottle_toggle
SPD:sim/autopilot/level_change
SEL:sim/autopilot/knots_mach_toggle
L NAV:sim/autopilot/NAV
V NAV:sim/autopilot/vnav
FL CH:sim/autopilot/level_change
HOLD(HDG):sim/autopilot/heading
V/S:sim/autopilot/vertical_speed
HOLD(ALT):sim/autopilot/altitude_hold
LOC:sim/autopilot/NAV
APP:sim/autopilot/approach
A/P ENGAGE:sim/autopilot/servos_toggle
DISENGAGE:sim/autopilot/servos_toggle