2019年7月17日水曜日

P-51D武装関連コントローラ その4 分圧抵抗回路でスイッチ数節約

前回予告した分圧抵抗回路の説明です。

分圧抵抗回路についてはこちらのサイトで詳しく解説されていますが、今回は簡易版の回路構成で十分ですので、少し改変して以下の通りの回路としました。

1.分圧抵抗回路によるスイッチング読み取り

分圧抵抗回路の考え方は、可変抵抗器とほぼ同じです。VccとGNDの間に任意の数の抵抗を配置し、それぞれの部位の電圧を図る事で、何個めのポジションにあるのかを推定します。回路図にすると次の通りです。
分圧抵抗回路
抵抗値の数を増やせばスイッチングのポジションも増やせます。
ここでスイッチが切り替わった際のアナログ入力の読込値を推定すると、このようになります。

  • スイッチが最上段の場合、1024×3/4=768
  • 上から2番目の場合、1024×2/4=512
  • 上から3段目の場合、1024×1/4=256
  • 上から4段目(最下段)、1024×0/4=0
すでにこの回路で実装しているのですが、、、良く考えたら一番上の抵抗いらなかったんじゃまいか!
まぁいいです。忘れましょう。

この様に、スイッチングによってアナログ入力値が段階的に変化するため、それぞれのポジションに対応したスイッチが押された事にしておくというのが分圧抵抗スイッチの考え方です。


2.分圧抵抗回路の限界

ただし、この方法には限界もあります。
一つ目は、ボタンの同時押しに対応出来ないと言う事。どれか一つなら簡単ですが、複数のボタンが押された場合、合成抵抗になってしまうのでどのボタンとどのボタンが押されたのかが識別できません。
今回は、ロータリースイッチへつなぐため、二つ以上のスイッチが同時にONにならないと言う条件がありますので問題ありません。

二つ目は、スイッチングの瞬間が不安定と言う事です。ロータリースイッチの特性上、スイッチが切り替わる瞬間、どこにもつながっていない状態、もしくは2ポジション同時につながっている場合などが発生します。今回は、切り替直後の不安定な時間帯の入力をソフト的にオミットしています。

三つ目はデジタル処理よりも時間がかかるらしいこと。
かかるらしいのですが、今回の用途では気にならないし、感じもしません。

3.分圧抵抗回路用のコーディング

このコードではPINナンバー10でアナログ値を読み取り、それぞれのポジションに応じてボタン20,21,22,23のON/OFFを送信しています。PC側のボタン認識は21,22,23,24です。

ポイントはポジション認識の為のアナログ値の閾値に一定の幅を持たせている点と、ポジションが変わった際にはdelayコマンドで50ms待たせて再確認している点です。スイッチ切り替え時のノイズはこれでほぼキャンセルされます。

#include "Joystick.h"
//シリアルモニタ出力 mon = 1 出力オン/ mon = 0 出力オフ
int mon = 0;

int RS4APosition = 0;
int currentRS4APosition = 0;
int RS4AValue = 0;
int P1 = 0;
int P2 = 0;
int i = 0;


//ジョイスティックの開始
Joystick_ Joystick;

void setup() {

//シリアルモニタ開始
  Serial.begin(9600);
  
//ジョイスティックの初期化

  Joystick.begin();

}


void loop() {
//anarog値読み取り
  RS4AValue = analogRead(10);

  if( RS4AValue >=0 && RS4AValue <= 80 ){
    P1 = 23;
  }
  if( RS4AValue > 160 && RS4AValue <= 330){
    P1 = 22;
  }
  if( RS4AValue > 400 && RS4AValue <= 590){
    P1 = 21;
  }
  if( RS4AValue > 650 && RS4AValue <= 850){
    P1 = 20;
  }

  if (P1 != P2) {
    P2 = P1;
    delay(50);
  } else {
    currentRS4APosition = P2;
  }

  if (currentRS4APosition != RS4APosition){
    for (i=20 ; i<=23 ; i++){
      Joystick.setButton(i,LOW);
    }
    Joystick.setButton(currentRS4APosition,HIGH);

    if (mon == 1){
      Serial.print("Position ");
      Serial.print(RS4APosition);
      Serial.print(" to ");
      Serial.println(currentRS4APosition);
    }

    RS4APosition = currentRS4APosition;
  }
  delay(50);
}


4.まとめ

Arduino Pro Microのスイッチ不足解消法は他にもいくつかあるのですが、今回はお試しで実装が一番楽と思われる方法を選択してみました。
思った通りの結果が得られたのでかなり満足です。

次回は全体のコーディングと基板実装を行い、いよいよ完成です。(もう完成してるけど)

0 件のコメント:

コメントを投稿

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

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