ロータリーエンコーダ
回路図は簡単ですが、Arduinoのスケッチがチョット複雑になりますし、その場所によって数値の設定方法が違うということで悩ましいことになります。
しかし、下のスケッチをそのまま使用すれば全く問題なく動作します。
この回路も本来ならば、プルアップやプルダウンを使った回路になるのですが、Teensy内蔵のプルアップ抵抗を使用するのでここでは一切使用しません。従って超簡単な回路になるのです。
その代わり、スケッチで必ず pinMode(FDSwPin, INPUT_PULLUP); の INPUT_PULLUP というオプションを指定します。
ロータリーエンコーダの場合、ピンが3本出ています、この場合は中央をGNDにしていますがメーカーによってこの位置が違うので注意が必要です。
B747-400 ロータリーエンコーダ:SPD(Teensyのピンはどれでも可)
X-Plane画面のSELスイッチでノットとマッハを切り替えると、エンコーダもそれに合わせて数値を変化させることができます。
※下の例で、逆回転になる場合は、0ピンと1ピンの位置を変えると正回転になります。
//エンコーダで小数点以下からカウントアップ/ダウンする
#include <Encoder.h>
const int AirSpEncR_pin = 0; //teensy0ピンと繋ぐ
const int AirSpEncL_pin = 1; //teensy1ピンと繋ぐ
Encoder AirSpEnc(AirSpEncR_pin, AirSpEncL_pin); //エンコーダピン
short AirSpEncPrev = 0;
//int mode = 0;
FlightSimFloat AirSpeed;
FlightSimInteger AirSpeed_mach;
void setup() {
pinMode(AirSpEncR_pin, INPUT_PULLUP); //エンコーダ
pinMode(AirSpEncL_pin, INPUT_PULLUP); //エンコーダ
AirSpeed = XPlaneRef("sim/cockpit/autopilot/airspeed");
AirSpeed_mach = XPlaneRef("sim/cockpit/autopilot/airspeed_is_mach");
}
void loop() {
FlightSim.update();
// エンコーダの動きを見る
short AirSpEncDiff = AirSpEnc.read() /4; //粗いの変更したエンコーダを読む- 変更前のエンコーダの値
// それらが移動した後のエンコーダをリセット
if (AirSpEncDiff) {
AirSpEncPrev = 0;
AirSpEnc.write(0);
}
// encDiffは20にmyEncDiffの値(1カウント)を掛ける値になる
int AirSpeed_mach_encDiff = 20 * AirSpEncDiff; //20 ✕ 1 で encDiff は20になる
if (AirSpeed_mach == 0) {
//小数点以下2桁からカウントアップ/ダウンを行う
if (AirSpeed_mach_encDiff) { //もし20なら
float tmp = AirSpeed; //tmpはX-Planeからの周波数の値を取得
// encDiffは20だから ✕ 0.05で1ずつカウント(1桁からカウント)となり、その値を周波数にプラスする
tmp += AirSpeed_mach_encDiff * 0.05;
AirSpeed = tmp;
//数値の範囲はX-Plane側で処理しているのでいらない
}
}
if (AirSpeed_mach == 1) {
//小数点以下2桁からカウントアップ/ダウンを行う
if (AirSpeed_mach_encDiff) { //もし20なら
float tmp = AirSpeed; //tmpはX-Planeからの周波数の値を取得
// encDiffは20だから ✕ 0.00005で0.01ずつカウント(小数点以下2桁からカウント)となり、その値を周波数にプラスする
tmp += AirSpeed_mach_encDiff * 0.0005;
AirSpeed = tmp;
//数値の範囲はX-Plane側で処理しているのでいらない
}
}
}
B747-400 ロータリーエンコーダ:HDG(Teensyのピンはどれでも可)
※下の例で、逆回転になる場合は、2ピンと3ピンの位置を変えると正回転になります。
#include <Encoder.h>
const int HDGEncR_Rotation = 2;
const int HDGEncL_Rotation = 3;
Encoder HDGEnc(HDGEncR_Rotation, HDGEncL_Rotation);
short HDGEncPrev = 0; //エンコーダの逆回転
FlightSimInteger HDG;
void setup() {
pinMode(HDGEncR_Rotation, INPUT_PULLUP); //エンコーダ
pinMode(HDGEncL_Rotation, INPUT_PULLUP); //エンコーダ
HDG = XPlaneRef("sim/cockpit/autopilot/heading_mag");
}
void loop() {
FlightSim.update();
// 1クリックで4つ変化するので4で割って1つずつカウントするようにする
short HDGEncDiff = (HDGEnc.read() - HDGEncPrev) / 4;
if (HDGEncDiff) {
// only update prev when we've reached a detent!
//戻り止めに達した場合にのみPREVを更新!
HDGEncPrev = 0;
HDGEnc.write(0);
// datarefを一時的な値にコピー
float heading = HDG;
// 一時的な値に変更を適用
heading += HDGEncDiff;
// datarefへ検証された新しいエアースピードの数値を書く
HDG = heading;
}
}
B747-400 ロータリーエンコーダ:V/S(Teensyのピンはどれでも可)
※下の例で、逆回転になる場合は、9ピンと10ピンの位置を変えると正回転になります。
#include <Encoder.h>
const int VerticalSpEncR_Rotation = 4;
const int VerticalSpEncL_Rotation = 5;
Encoder VerticalSpEnc(VerticalSpEncR_Rotation, VerticalSpEncL_Rotation);
short VerticalSpEncPrev = 0; //エンコーダの逆回転
FlightSimInteger VerticalSpeed;
//FlightSimInteger VerticalSpeedknob;
void setup() {
pinMode(VerticalSpEncR_Rotation, INPUT_PULLUP); //エンコーダ
pinMode(VerticalSpEncL_Rotation, INPUT_PULLUP); //エンコーダ
VerticalSpeed = XPlaneRef("sim/cockpit/autopilot/vertical_velocity");
}
void loop() {
FlightSim.update();
// 1クリックで4つ変化するので4で割って1つずつカウントするようにする
short VerticalSpEncDiff = (VerticalSpEnc.read() - VerticalSpEncPrev) *100 / 4;
if (VerticalSpEncDiff) {
VerticalSpEncPrev = 0;
VerticalSpEnc.write(0);
float verticalSp = VerticalSpeed;
verticalSp += VerticalSpEncDiff;
VerticalSpeed = verticalSp;
}
}
B747-400 ロータリーエンコーダ:ALT(Teensyのピンはどれでも可)
※下の例で、逆回転になる場合は、6ピンと7ピンの位置を変えると正回転になります。
#include <Encoder.h>
const int ALTEnc_R_Pin = 6;
const int ALTEnc_L_Pin = 7;
Encoder AltEnc = Encoder(ALTEnc_R_Pin, ALTEnc_L_Pin); //1、2 → 31、32ピン Altitudeエンコーダ
short AltEncPrev = 0;
FlightSimInteger Altitude; //Altitude
void setup() {
pinMode(ALTEnc_R_Pin, INPUT_PULLUP);
pinMode(ALTEnc_L_Pin, INPUT_PULLUP);
Altitude = XPlaneRef("sim/cockpit/autopilot/altitude"); //encoder
}
void loop() {
FlightSim.update();
// 1クリックで4つ変化するので4で割って1つずつカウントするようにする
short AltEncDiff = (AltEnc.read() - AltEncPrev) *100 /4;
if (AltEncDiff) {
// only update prev when we've reached a detent!
//戻り止めに達した場合にのみPREVを更新!
AltEncPrev = 0;
AltEnc.write(0);
// datarefを一時的な値にコピー
float AltSp = Altitude;
// 一時的な値に変更を適用
AltSp += AltEncDiff;
// 範囲チェックを行う
while (AltSp < 0) AltSp += 1; //エアスピードが 0 より小さい場合は 1 をプラスする(つまり0で止まる)
while (AltSp >= 50001) AltSp -= 1; //エアスピードが 50001 より大きい場合は 1 をマイナスする(つまり50000で止まる)
// datarefへ検証された新しいエアースピードの数値を書く
Altitude = AltSp;
}
}