2

Arduino Microを使用して、フロントエンドで特定のイベントをトリガーしています。ただし、何らかの理由で、いくつかの主要なコンボがランダムにトリガーされています。これが起こったとき、私はarduinoにさえ触れていません。

ボタンを押したときに、ボタンが押されている間それを繰り返すのではなく、一度だけキーストロークをトリガーするように設定しました。

私は何かが足りないのですか、それとも何かを台無しにしますか?

int escButton = 12, valEsc, valEsc2, stateEsc;
int volUp = 11, valVup, valVup2, stateVup;
int volDown = 10, valVdown, valVdown2, stateVdown;
int rebootButton = 9, valReboot, valReboot2, stateReboot;

char ctrlKey = KEY_LEFT_GUI;
char shiftKey = KEY_LEFT_SHIFT;

void pressKeyCombos(int combo){
 switch(combo) {
   case 1:
       Keyboard.press(KEY_ESC);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 2:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F1);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 3:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F3);
       delay(100);
       Keyboard.releaseAll();
   break;

   case 4:
       Keyboard.press(shiftKey);
       Keyboard.press(KEY_F2);
       delay(100);
       Keyboard.releaseAll();
   break;
 }
}

void setup() {
     pinMode(escButton, INPUT);
     stateEsc = digitalRead(escButton);
     Keyboard.begin();
}

void loop(){
     valEsc = digitalRead(escButton);
     delay(10);
     valEsc2 = digitalRead(escButton);

     valVup = digitalRead(volUp);
     delay(10);
     valVup2 = digitalRead(volUp);

     valVdown = digitalRead(volDown);
     delay(10);
     valVdown2 = digitalRead(volDown);

     valReboot = digitalRead(rebootButton);
     delay(10);
     valReboot2 = digitalRead(rebootButton);

     if (valVup == valVup2) {                 
       if (valVup != stateVup) {           
         if (valVup == LOW) {              
           pressKeyCombos(4);
         }
       }
       stateVup = valVup;
     }

     if (valVdown == valVdown2) {                 
       if (valVdown != stateVdown) {           
         if (valVdown == LOW) {              
           pressKeyCombos(3);
         }
       }
       stateVdown = valVdown;
     }

     if (valReboot == valReboot2) {                 
       if (valReboot != stateReboot) {           
         if (valReboot == LOW) {              
           pressKeyCombos(2);
         }
       }
       stateReboot = valReboot;
     }

     if (valEsc == valEsc2) {                 
       if (valEsc != stateEsc) {           
         if (valEsc == LOW) {              
           pressKeyCombos(1);
         }
       }
       stateEsc = valEsc;
     }
}
4

1 に答える 1

3

デフォルトでは、入力は高インピーダンスです。動作の説明から、外部プルアップ/ダウン抵抗を追加しておらず、ピンが通常開のスイッチに接続されていると推測できます。ランダムな入力は、予想どおりであり、digitialRead()のドキュメントに記載されています。

ノート

ピンが何にも接続されていない場合、digitalRead()は
HIGHまたはLOWのいずれかを返すことができます(これはランダムに変化する可能性があります)。

DigitialRead()についてはリファレンスページを参照してください

マイクロには、内部プルアップを提供する機能があります。コードには、内部プルアップ抵抗が有効になっていることが示されていません。これは、入力ピンに書き込むことにより、奇妙に見えるかもしれない方法で達成されます。Arduinoドキュメントから:

Atmegaチップには、ソフトウェアからアクセスできる便利な20Kプルアップ抵抗も組み込まれています。これらの内蔵プルアップ抵抗には、次の方法でアクセスします。

pinMode(pin、INPUT); //ピンを入力に設定
digitalWrite(pin、HIGH); //プルアップ抵抗をオンにします

デジタルピンを参照してください

したがって、あなたの場合、setup()に4つのdigitalWrite()を追加して、プルアップを有効にします。

于 2013-01-06T05:06:29.417 に答える