Arduinoのデジタル入力は、隣接するピンと変動します

私はデジタルピン(2,3,4,5)を使用して、入力ピンとグランドの間に10kΩの抵抗をプルダウンした状態で3pdtスイッチでMIDIノートをオン/オフします。

しかし、異なる時間間隔でボタン2を無作為に押すと、時々モニターのピン3の高さが示されます。 (ここでフォーラムを読んだ後、物理的接触板がこれの理由であるかもしれない場所を私が使用している大きなスイッチが原因であるかもしれないことに気付きました)。私はワイヤーを交換して、ワイヤーからのノイズを排除するためにワイヤーを互いに隔離しました。 私はすべての接続をチェックし、Arduinoボードのピンを私が持っている最善のスキルで半田付けし、トラックをすべてクリアしました。

他のボタン間でも同じことが起こりますが、必ずしもそうではありません。 しかし、Debounceについて読んだ後、私は次のようにコードを変更しましたが、今度は一度だけエラーが発生しました。デバウンス機能を複数のスイッチに正しく割り当てていれば誰かがコードを見てアドバイスを受けることができますか?もしそうでなければ、私はコーディングで新しいものです 私は3pdtスイッチを使用しているので、私はスイッチモードを追加しました..

#include 

int buttonPin[] = {2, 3, 4, 5};
byte mode[] = {0, 0 , 0 ,0};
boolean currentState = LOW;
boolean lastState = LOW;
int buttonPinM[] = {6, 7, 8, 9};
byte mode1[] = {0, 0, 0, 0};

boolean currentState1 = LOW;
boolean lastState1 = LOW;

long lastDebounceTime = 0;
long debounceDelay = 50;

void setup (){
    MIDI.begin(MIDI_CHANNEL_OMNI);

    int i;
    for (i = 0; i < 4; i++) {
        pinMode(buttonPin[i], INPUT);
    }
    int j;
    for (j = 0; j < 4; j++) {
        pinMode(buttonPinM[j], INPUT);
    }

    {
        int i;
        for (i = 0; i < 4; i++);
    }
    {
        int j;
        for (j = 0; j < 4; j++);
    }
}

// This will track which pin/mode we're using

int j = 0;
int i = 0;

void loop() {
    {  
        currentState = digitalRead(buttonPin[i]);

        if ( (millis() - lastDebounceTime) > debounceDelay) {
            switch (mode[i]) {
                case 0:
                    if (currentState == HIGH) {
                        MIDI.sendNoteOff (i+55, 0, 1);
                        mode[i] = 1;
                        lastDebounceTime = millis();
                    }
                    break;
                case 1:
                    if (currentState == HIGH)
                        mode[i] = 2;
                    break;
                case 2:
                    if (currentState == LOW) {
                        MIDI.sendNoteOn (i+55, 127, 1);
                        mode[i] = 3;
                        lastDebounceTime = millis();
                    }
                    break;
                case 3:
                    if (currentState == LOW)
                        mode[i] = 0;
                    break;
            }
        }
        lastState = currentState;
        if (++i > 3)
            i = 0;  
    }
    {
        currentState1 = digitalRead(buttonPinM[j]);
        if ( (millis() - lastDebounceTime) > debounceDelay) {
            switch (mode1[j]) {
                case 0:
                    if (currentState1 == HIGH ) {
                        MIDI.sendNoteOn (j+61, 127, 1);
                        mode1[j] = 1;
                        lastDebounceTime = millis();
                    }
                    break;
                case 1:
                    if (currentState1 == HIGH)
                        mode1[j] = 2;
                    break;
                case 2:
                    if (currentState1 == LOW) {
                        MIDI.sendNoteOff (j+61, 0, 1);
                        mode1[j] = 3;
                        lastDebounceTime = millis();
                    }
                    break;
                case 3:
                    if (currentState1 == LOW)
                        mode1[j] = 0;
                break;
            }
        }
        lastState1 = currentState1;
        if (++j > 3)
            j = 0;   
    }
}
0
追加された 編集された
ビュー: 3
@ frarugi87私はすべてのことをチェックし、pcbも変更しました。あなたはそのコードを考えていますか?
追加された 著者 JJM Driessen,
@NickGammonが変更を加えました。
追加された 著者 JJM Driessen,
あなたの投稿を編集し、コードフォーマットマークダウン(4つの先頭スペース)を使用してコードをフォーマットしてください。ヘルプについては、 Markdownヘルプをご覧ください。コードを選択して Ctrl + K を押すと、ブラウザでこれを行うことができます。
追加された 著者 Nick Gammon,
あなたのコードは読みにくいです。 IDEには自動フォーマット機能があります。それを使用してコードを再提出してください。また、配線のイメージを含めてください。配線の説明は実際の状況の正義をめったにしません。
追加された 著者 Nick Gammon,
通常、何か「変動する」とは、固定状態ではないことを意味します。プルアップ/プルダウンなしでボタンを使用すると、これは通常です。しかし、二重スロー(xxDT)スイッチを持ち、両方の端末にvccとグランドを接続していれば、おそらくそれはちょうど悪い連絡先です...
追加された 著者 Tom Collins,

1 答え

それはかなり長いのでここに投稿してください。しかし、それは完全な答えではなく、ちょっとした考えと改善の可能性があります。

さて、あなたのコードには理解できないものがいくつかあります:

1:setup()

{
    int i;
    for (i = 0; i < 4; i++);
}
{
    int j;
    for (j = 0; j < 4; j++);
}

これらは何のためですか?

2:デバウンス

あなたはそれを正しく実装していない、少なくとも私のためではない。あなたは、デバウンすることなく、50msごとにボタンを読んでいます。 [OK]を、 "バウンス"が表示されませんが、より良いソリューションがあります(後で参照してください)。

3:モード1と3

彼らは全く役に立たない。それらは何のため?

4:ピン6,7,8,9

それらは何のため?

5:laststate変数

それは何のため?あなたはそれを使用しない

6:ループごとに1つのボタンを更新する

それは必要ですか?つまり、ループごとに1つのボタンを更新するのではなく、ループごとに1つのボタンを更新するだけです。

In the end

コードをインデントすることを覚えておいてください(それ以外は読めません):私はいつもbounce2クラスを使用してボタンをデバウンスします。なぜなら、内部にすべてが入っているからです。うーん、うまくいきます。また、ボタンの上端や下端を検出することもできます。これは、コードを正しく解釈する場合に必要なことです。

もう1つ:デバウンスの遅延を(わずか5msまで)下げることができます:

#include 
#include 

int buttonPin[] = {2, 3, 4, 5};
int buttonPinM[] = {6, 7, 8, 9};

Bounce debouncers[4];
Bounce debouncersM[4];

int debounceDelay = 50;//Usually is lower - even 5ms is fine
uint8_t i = 0;

void setup ()
{
    MIDI.begin(MIDI_CHANNEL_OMNI);

    for (i = 0; i < 4; i++)
    {
        pinMode(buttonPin[i], INPUT);
        debouncers[i].attach(buttonPin[i]);
        debouncers[i].interval(debounceDelay);

        pinMode(buttonPinM[i], INPUT);
        debouncersM[i].attach(buttonPinM[i]);
        debouncersM[i].interval(debounceDelay);
    }
}

void loop ()
{
    for (i = 0; i < 4; i++)
    {
        debouncers[i].update();
        debouncersM[i].update();
    }

    for (i = 0; i < 4; i++)
    {
        if (debouncers[i].rose())//button i switched from 0 to 1
            MIDI.sendNoteOff(i+55, 0, 1);
        if (debouncers[i].fell())//button i switched from 1 to 0
            MIDI.sendNoteOn (i+55, 127, 1);
        if (debouncersM[i].rose())//button i switched from 0 to 1
            MIDI.sendNoteOn (i+61, 127, 1);
        if (debouncersM[i].fell())//button i switched from 1 to 0
            MIDI.sendNoteOff(i+61, 0, 1);
    }
}
0
追加された
おかげで@ frarugi87設定モードINT iとjは、2つのグループのスイッチ(それぞれ4つのスイッチ)であり、このコードでは異なる機能を持っています。スイッチの1つのグループは、入力が高く、他のグループが送信するNoteOnコマンドを送信していますInputがHighのとき、NoteOffコマンド。 2.私はこのコードで私のデバウンスロジックに絶対に間違っているかもしれません。3.モード1と3では、ケース1と3を意味しますか?スイッチが物理的にスイッチの状態をロックする3pdt以来、 CASEを作成しますが、私のスイッチで動作する場合はコードを試して更新します
追加された 著者 JJM Driessen,
@ fraugi87私はあなたが言ったことを理解し、それは理にかなっています。迅速な返信ありがとうございます。私はいくつかのテストを行い、できるだけ早く元に戻す!
追加された 著者 JJM Driessen,
@ fraugi87私はあなたのコードとそのうまく動作しようとしました。私はあなたのコードだけを変更して動作させませんでした。以前は完全な解決策ではなく、間もなく即興化が必要なのか?
追加された 著者 JJM Driessen,
私のコードも同様に動作していますが、時にはデジタルピンが別の番号を読み取ることがあります。たぶんあなたはデバウンシングについて正しいです:-)
追加された 著者 JJM Driessen,
あなたはいつも2つの州しか持っていません。 switch-caseのアプローチを使用することはできますが、ケース1と3は、そのモードを終了すると(変数 mode がケースを決定するのでモードと呼ばれます)、前のように)。とにかく、私はバウンスのアプローチをお勧めします:簡単で、速く、エラーの発生が少ない
追加された 著者 Tom Collins,
@Ashish私は問題がどこにあるのか分からなかったので完全ではないと言ったので、私はちょうど "一般的な"アドバイスでした。それがうまくいくと、これは本当の解決策になりますが、なぜこれが動作するのか、あなたのものではないのか分かりません;)誤ったデバウンスのせいかもしれませんが...とにかく...唯一の改善点は、 2つのボタンセットがありますが、実用的な改善ではなく、もっと読みやすいソリューションです。
追加された 著者 Tom Collins,