先日出来てしまっているので後追い記事になりますが、完成品はこんな感じ。
DCS側の設定を理解したのでそれに合わせてコードを書きます。
ブログ上でコードを見やすくするツールもある様ですがまだ勉強出来てないので、勉強出来たら更新します。
1.ON-OFFトグルスイッチの処理
2ポジションのトグルスイッチは、ProMicroのピン数節約の為、すべてON-OFFタイプを使用し、arduino上でON-ONとして動作させます。PCとコントローラ上の動作の対比は次の通りです。コントローラ上:PC上
トグルON :トグルON側(ボタン10) ON
トグルOFF :トグルOFF側(ボタン11) ON
※コード上のbuttonの名前は0~31、PC上の名前は1~32ですで一つずれています。
コードは以下の通りです。
---------------------------------------------------------------------------------------
//Device Toggle Switch 2position Aの制御
#include "Joystick.h"
//シリアルモニタ出力 mon = 1 出力オン/ mon = 0 出力オフ
int mon = 0;
int TS2APosition = 0;
int currentTS2APosition = 0;
int PIN8State = 0;
//ジョイスティックの開始
Joystick_ Joystick;
void setup() {
//シリアルモニタ開始
Serial.begin(9600);
//ジョイスティックの初期化
Joystick.begin();
//デジタルピン設定 ピン8を使用
pinMode(8, INPUT_PULLUP);
}
void loop() {
//TS2Aの処理
PIN8State = !digitalRead(8); //pin8の状態を読み取り
//トグル位置を更新
if(PIN8State == HIGH){
currentTS2APosition = 10;
} else {
currentTS2APosition = 9;
}
//トグル位置をボタン10、11のON、OFF情報として送信
if ( currentTS2APosition != TS2APosition){
for (i=9 ; i<=10 ; i++){
Joystick.setButton(i,LOW);
}
Joystick.setButton(currentTS2APosition,HIGH);
if (mon == 1){
Serial.print("Position ");
Serial.print(TS2APosition);
Serial.print(" to ");
Serial.println(currentTS2APosition);
}
TS2APosition = currentTS2APosition;
}
}
---------------------------------------------------------------------------------------
2.ON-OFF-ONトグルスイッチの処理
3ポジションのトグルスイッチはON-OFF-ONを使用し、Aruduino上ではON-ON-ONとして信号を送信します。3ポジションのロータリスイッチも同様です。コードは以下の通りです。
---------------------------------------------------------------------------------------
//Device Toggle Switch 3position Aの制御
#include "Joystick.h"
//シリアルモニタ出力 mon = 1 出力オン/ mon = 0 出力オフ
int mon = 0;
int TS3APosition = 0;
int currentTS3APosition = 0;
int PIN2State = 0;
int PIN3State = 0;
//ジョイスティックの開始
Joystick_ Joystick;
void setup() {
//シリアルモニタ開始
Serial.begin(9600);
//ジョイスティックの初期化
Joystick.begin();
//デジタルピン設定、ピン2、3を使用
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
}
void loop() {
//TS3Aの処理
PIN2State = !digitalRead(2);
PIN3State = !digitalRead(3);
if(PIN2State == HIGH){
currentTS3APosition = 0;
} else if (PIN3State == HIGH){
currentTS3APosition = 2;
} else {
currentTS3APosition = 1;
}
if ( currentTS3APosition != TS3APosition){
for (i=0 ; i<=2 ; i++){
Joystick.setButton(i,LOW);
}
Joystick.setButton(currentTS3APosition,HIGH);
if (mon == 1){
Serial.print("Position ");
Serial.print(TS3APosition);
Serial.print(" to ");
Serial.println(currentTS3APosition);
}
TS3APosition = currentTS3APosition;
}
}
---------------------------------------------------------------------------------------
3.アナログボリュームの処理
3軸トリムコントローラ「TRIM CUBE」でやったのと同じなのでテスト用コードのみ。---------------------------------------------------------------------------------------
//Device VOLume Aの制御
#include "Joystick.h"
//シリアルモニタ出力 mon = 1 出力オン/ mon = 0 出力オフ
int mon = 0;
//アナログ軸数値の初期化
int VOLAValue = 0;
int currentVOLAValue = 0;
//ジョイスティックの開始
Joystick_ Joystick;
void setup() {
//シリアルモニタ開始
Serial.begin(9600);
//ジョイスティックの初期化
Joystick.begin();
void loop() {
//VOLAの処理
currentVOLAValue = analogRead(A3);
if (currentVOLAValue < VOLAValue - 1 || currentVOLAValue > VOLAValue + 1){
if (mon == 1){
Serial.print("VOLA = ");
Serial.println(currentVOLAValue);
}
Joystick.setXAxis(currentVOLAValue);
VOLAValue = currentVOLAValue;
}
4.3ポジションロータリスイッチの処理
3ポジショントグルスイッチと同じなので割愛します。5.4ポジションロータリスイッチの処理と分圧抵抗回路
分圧抵抗回路の詳細は次回、別に取り上げます。6.リセットスイッチの処理
フライトコントローラの弱点の一つに、コントローラーの状態とフラシム内のスイッチの状態にずれが生じる場合がある。と言う点があります。リセットスイッチは、押した時点でのコントローラの状態を読み取り、フラシム内に反映させると言う機能です。コントローラにはボタンを実装しているのでコードを書くだけなんですが、
今回の仕様であれば、最初ボタン位置がずれていてもボタンを操作すれば一致するのであまり必要性は高くなかった。。。というのもあります。
はじめまして。
返信削除私、DCSでMH-60Rが出る事を願い続け、ホームコックピットの構築を考えているものでございます。
本記事を拝見させていただき、疑問に思ったのですが、複数のarduinoをジョイスティックと認識させてpcに接続させるには、#include joystick〜〜
の〜部分を違うアルファベットにしないと同じデバイスだと誤認識されてしまうのでしょうか?
お忙しいとは思いますが、ご返答お待ちしております。
まつなおさま
削除コメントに気きませんでした。すみません。
複数のjoystickを認識させる件ですが、arduinoにスケッチを書き込むときに、書き込みたいボードだけを接続するようにしてください。それ以外は特に何も気を付けなくても複数のarduinoを異なるジョイスティックとして利用することができます。
#include joystick.h
という行はjoystick.hというライブラリをスケッチに含めるという意味です。
joystick.hがなければ、
Joystick.setButton()やJoystick.setXAxis()といった、ジョイスティックの動きをPCに伝えるためのコマンドが使えません。