ゲームに使う専用のコントローラーを作りたい
computer_mouse_cord

キーボードの関数の違い

  • keyboard.write
  • 単一の文字のみ、特殊キーに対応。
  • keyboard.print
  • 文字列に対応。
  • keyboard.press
  • キーを押したままにする。特殊キーに対応。
    ずっと押したままになるので、押下を終了するにはKeyboard.releaseを使用する。
no-img2″>
 <figcaption  class=
管理人

Ctrlキーを押しながらAltキーを押す場合などはkeyboard.pressを使用することになると思います。


keyboard.pressを使ってみる

  1. #include <Keyboard.h>
  2. void setup() {
  3.   pinMode(2, INPUT);
  4.   pinMode(4, INPUT);
  5.   Keyboard.begin();
  6. }
  7. void loop() {
  8.   if (digitalRead(2) == LOW) {
  9.     Keyboard.press('A');
  10.   } else {
  11.     Keyboard.release('A');
  12.   }
  13.   if (digitalRead(4) == LOW) {
  14.     Keyboard.press('B');
  15.   } else {
  16.     Keyboard.release('B');
  17.   }
  18. }

no-img2″>
 <figcaption  class=
管理人

同時押しすると動作がおかしいですね。
長押しも有効になっていない気がします。

no-img2″>
 <figcaption  class=
マイ

チャタリングの対策ができていないのもあるでしょうが、動作がおかしいので対策します。


他人の力を借りる

http://eucalyn.hatenadiary.jp/entry/original-keyboard-06

↑こちらのブログでは画像が見れなくなっていますので配線がどうなっているのかはわかりませんが、スケッチを見ると入力がHIGHのときにキーボード入力されるようになっているようです。
このブログでは現在、プルアップ回路を組んでいますのでLOWのときにキーボード入力されるようにしたいと思います。
その方法はHIGHの記述をLOWにすべて入れ替えるだけでOKです。

  1. #include "Keyboard.h"
  2. const int inputPin1 = 2;
  3. const int inputPin2 = 4;
  4. bool currentState1 = HIGH;
  5. bool beforeState1 = HIGH;
  6. bool currentState2 = HIGH;
  7. bool beforeState2 = HIGH;
  8. void setup() {
  9.   pinMode(inputPin1, INPUT);
  10.   pinMode(inputPin2, INPUT);
  11.   Serial.begin(9600);
  12.   Keyboard.begin();
  13. }
  14. void loop() {
  15.   currentState1 = digitalRead(inputPin1);
  16.   currentState2 = digitalRead(inputPin2);
  17.   if ( currentState1 != beforeState1 ) {
  18.     if ( currentState1 == LOW) {
  19.       Keyboard.press('A');
  20.       delay(20);
  21.     } else {
  22.       Keyboard.release('A');
  23.       delay(20);
  24.     }
  25.     beforeState1 = currentState1;
  26.   }
  27.   if ( currentState2 != beforeState2 ) {
  28.     if ( currentState2 == LOW) {
  29.       Keyboard.press('B');
  30.       delay(20);
  31.     } else {
  32.       Keyboard.release('B');
  33.       delay(20);
  34.     }
  35.     beforeState2 = currentState2;
  36.   }
  37. }


no-img2″>
 <figcaption  class=
管理人

チャタリングが発生してボタンが多重押しされてしまいますので、delay(20)を追加しています。
前回delay(200)でしたが、20ぐらいで良いみたいなので20にします。

no-img2″>
 <figcaption  class=
マイ

完璧な挙動になりましたね。

no-img2″>
 <figcaption  class=
管理人

実際のキーボードでAとBのキーを同時押ししてもABABAB…とは入力されないのと同じように、今回作ったものも入力されません。
もしABABAB…と入力したいのであれば、多分writeやprintを使うんじゃないでしょうか