0

Teensy 3.2ボード(Teensyduinoプラグインを介してArduinoを使用)に配線された8つのプッシュボタンのシンプルなセットがあります。8 つのボタンはピン 1 ~ 8 にあり、それらの共通のグランド ライン (各ボタンにはんだ付けされた 1 つのライン) は GND ピンにあります。機能するボタンを1つでも機能させるコードがあります。現在、2番目のボタンを押すと「A」タイプになるように設定されています。

押しボタン 1 から 8 を、押したときにそれぞれ A、B、C などと入力したいと思います。私は自分のセットアップに関する 2 つの問題について聞いたことがあります。1 つ目は、すべてのボタンのコードをコピーするのは良くない方法であり、2 つ目はバウンスの問題 (5 回押すごとに 1 回のキーストロークが発生する) の影響を受けやすいことです。また、これを設定して、将来、ユーザーの好みに基づいてキーを構成するサード パーティのアプリを作成できるようにしたいと考えています。

これらのニーズを追加すると、次にどこに行くべきかわかりません。私は十分に初心者なので、バウンス クラスを適切に組み込む方法や、ニーズに応じてそれが正しい方法であるかどうかはわかりません。

マトリックスは行くべき道ですか、それとも各ボタンを手動で設定してバウンスを補正するエレガントな方法はありますか? ありがとう〜現在のコードは次のとおりです。

#define CHECK_EVERY_MS 20
#define MIN_STABLE_VALS 5

unsigned long previousMillis;
char stableVals;
char buttonPressed;

void setup() {
  // make pin 2 an input and turn on the 
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}

void  loop() {
    if ((millis() - previousMillis) > CHECK_EVERY_MS)
    {
        previousMillis += CHECK_EVERY_MS;
        if (digitalRead(2) != buttonPressed)
        {
            stableVals++;
            if (stableVals >= MIN_STABLE_VALS)
            {
                buttonPressed = !buttonPressed;
                stableVals = 0;

                if (buttonPressed)
                {
                    //Send an ASCII 'A', 
                    Keyboard.write(65);
                }
            }
        }
        else
            stableVals = 0;
    }
}

--------- コード編集 1

#include <Bounce2.h>

// Instantiate a Bounce object
Bounce debouncer[8];
bool prevValues[8];

// Keyboard values for btn   1    2    3    4    5    6    7    8
char keyboardValues[] =    {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

void setup() {
// First setup all the pins as input with pullup
    pinMode(BUTTON_PIN_1,INPUT_PULLUP);
    pinMode(BUTTON_PIN_2,INPUT_PULLUP);
    pinMode(BUTTON_PIN_3,INPUT_PULLUP);
    pinMode(BUTTON_PIN_4,INPUT_PULLUP);
    pinMode(BUTTON_PIN_5,INPUT_PULLUP);
    pinMode(BUTTON_PIN_6,INPUT_PULLUP);
    pinMode(BUTTON_PIN_7,INPUT_PULLUP);
    pinMode(BUTTON_PIN_8,INPUT_PULLUP);

// Setup Bounce instance - First attach them to the debouncer
    debouncer[0].attach(BUTTON_PIN_1);
    debouncer[1].attach(BUTTON_PIN_2);
    debouncer[2].attach(BUTTON_PIN_3);
    debouncer[3].attach(BUTTON_PIN_4);
    debouncer[4].attach(BUTTON_PIN_5);
    debouncer[5].attach(BUTTON_PIN_6);
    debouncer[6].attach(BUTTON_PIN_7);
    debouncer[7].attach(BUTTON_PIN_8);

    Keyboard.begin();
    // Then set the interval (e.g. 10 ms)
    unsigned char i;
    for (i = 0; i < 8; i++)
        prevValues[i] = 0;
}

void loop() {
    // Update the Bounce instances
    unsigned char i;
    for (i = 0; i < 8; i++)
        debouncer[i].update();

    bool debounced_btn_1 = debouncer[0].read();
    bool debounced_btn_2 = debouncer[1].read();
    bool debounced_btn_3 = debouncer[2].read();
    bool debounced_btn_4 = debouncer[3].read();
    bool debounced_btn_5 = debouncer[4].read();
    bool debounced_btn_6 = debouncer[5].read();
    bool debounced_btn_7 = debouncer[6].read();
    bool debounced_btn_8 = debouncer[7].read();      


    for (i = 0; i < 8; i++)
    {
        bool currVal = debouncer[i].read();
        if ((!currVal) && (prevValues[i]))
        { // If now it is pressed (value = 0) and it wasn't before (prevvalue = 1)
            Keyboard.write(keyboardValues[i]);
        }
    }

}
4

1 に答える 1

1

すでに提案したように、このソリューションは、ボタンを 1 つだけ使用する必要がある場合にうまく機能します。さらにボタンが必要な場合は、ボタンごとにこのコードを複製する必要があります。

別の方法は、ポート値を直接チェックすることです (一度に 8 ビット)。これはパフォーマンスには最適なソリューションだと思いますが、あまり読みやすくありません。

私の意見では、bounce2 ソリューションが最適です。あなたはただしなければならない

  1. Bounce2ライブラリをダウンロードして適切にインストールする
  2. スケッチで使用します。

たとえば、配列を使用してすべてのバウンサーを格納できます。8 ピンの例:

#include <Bounce2.h>

// Instantiate a Bounce object
Bounce debouncer[8];

void setup() {
    // First setup all the pins as input with pullup
    pinMode(BUTTON_PIN_1,INPUT_PULLUP);
    pinMode(BUTTON_PIN_2,INPUT_PULLUP);
    ...

    // After setting up the button, setup the Bounce instance
    // First attach them to the debouncer
    debouncer[0].attach(BUTTON_PIN_1);
    debouncer[1].attach(BUTTON_PIN_2);
    ...

    // Then set the interval (e.g. 10 ms)
    unsigned char i;
    for (i = 0; i < 8; i++)
        debouncer[i].interval(10);

    // other initializations
    ...
}

void loop() {
    // Update the Bounce instances
    unsigned char i;
    for (i = 0; i < 8; i++)
        debouncer[i].update();

    // From now on you can access the debounced
    // values directly from the array, for instance

    bool debounced_btn_1 = debouncer[0].read();

    bool debounced_btn_8 = debouncer[7].read();

    ...
}

あなたの場合、キーボードコマンドを送信したいので、すべての値を配列に保存し(もちろん変更できます)、必要に応じて送信できます。また、ボタンを押したときに値を送信する最後の状態も覚えておく必要があります...

bool prevValues[8];

// Keyboard values for btn   1    2    3    4    5    6    7    8
char keyboardValues[] =    {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

void setup() {
    // Pins initializations
    ...

    for (i = 0; i < 8; i++)
        prevValues[i] = 0;
}

void loop() {
    // Update the Bounce instances
    ...


    for (i = 0; i < 8; i++)
    {
        bool currVal = debouncer[i].read();
        if ((!currVal) && (prevValues[i]))
        { // If now it is pressed (value = 0) and it wasn't before (prevvalue = 1)
            Keyboard.write(keyboardValues[i]);
        }
    }

    ...
}
于 2015-11-04T16:11:25.733 に答える