2019年7月16日火曜日

P-51D武装関連コントローラ その3 ProMicro上での処理

P-51D武装関連コントローラの製作工程です。



先日出来てしまっているので後追い記事になりますが、完成品はこんな感じ。
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.リセットスイッチの処理

フライトコントローラの弱点の一つに、コントローラーの状態とフラシム内のスイッチの状態にずれが生じる場合がある。と言う点があります。リセットスイッチは、押した時点でのコントローラの状態を読み取り、フラシム内に反映させると言う機能です。

コントローラにはボタンを実装しているのでコードを書くだけなんですが、飽きてきた時間が無いのでまだ書いてませんmm
今回の仕様であれば、最初ボタン位置がずれていてもボタンを操作すれば一致するのであまり必要性は高くなかった。。。というのもあります。

7.まとめ

スイッチの動作確認がしやすいよう、ボタンの種類ごとに分けてアップしましたが、実際には全部まとめて一つのスケッチになっています。

2 件のコメント:

  1. はじめまして。
    私、DCSでMH-60Rが出る事を願い続け、ホームコックピットの構築を考えているものでございます。
    本記事を拝見させていただき、疑問に思ったのですが、複数のarduinoをジョイスティックと認識させてpcに接続させるには、#include joystick〜〜
    の〜部分を違うアルファベットにしないと同じデバイスだと誤認識されてしまうのでしょうか?
    お忙しいとは思いますが、ご返答お待ちしております。

    返信削除
    返信
    1. まつなおさま
      コメントに気きませんでした。すみません。
      複数のjoystickを認識させる件ですが、arduinoにスケッチを書き込むときに、書き込みたいボードだけを接続するようにしてください。それ以外は特に何も気を付けなくても複数のarduinoを異なるジョイスティックとして利用することができます。

      #include joystick.h
      という行はjoystick.hというライブラリをスケッチに含めるという意味です。
      joystick.hがなければ、
      Joystick.setButton()やJoystick.setXAxis()といった、ジョイスティックの動きをPCに伝えるためのコマンドが使えません。

      削除

ESP32でスマホとシリアル通信 その2 BluetoothでLチカ

1.BluetoothでLチカ制御 前回、Bluetoothでの双方向通信に成功しましたので、ついでに少しスケッチを修正してスマホからESP32のLチカを制御した様子が以下の動画です。 撮影が悪くて画面が良く見えませんが、"1"を送信...