ゆかりメモ

いろんなことのメモです。

オリジナルキーボードを作ってみる その5「とりあえず1キーキーボード」

前回でArduinoの基本的な使い方がわかったと思うので早速キーボードにしていきます。

前回の記事はこちら。

eucalyn.hatenadiary.jp

前回の最後でプログラムはこうなってたと思います。

const int inputPin = 3;
const int ledPin =13;

void setup() {
  pinMode(inputPin,INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if ( digitalRead( inputPin ) == HIGH ){
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

ではこれをキーボードにしましょう。

「a」だけが入力できるキーボードを作る

まずはボタンを押すと「a」が入力される1キーのキーボードならすぐ作れそうですね。

マイコンボード選び編で書いてたように、ArduinoLeonardoやMicro、ProMicroなら標準でHID機能がついているので、それを前提として進めていきます。

eucalyn.hatenadiary.jp

単純に書き換えるとこうなります。

#include "Keyboard.h"

const int inputPin = 3;
const int ledPin =13;

void setup() {
  pinMode(inputPin,INPUT);
  pinMode(ledPin, OUTPUT);

  Keyboard.begin();
}

void loop() {
  if ( digitalRead(inputPin) == HIGH ){
    digitalWrite(ledPin, HIGH);
    Keyboard.press( 0x61 );
  } else {
    digitalWrite(ledPin, LOW);
    Keyboard.release( 0x61 );
  }
}

キーボード機能のヘッダファイルを読み込んで、キーボード機能を初期化して、
必要箇所でPressとReleaseしてる感じですね。

キーコードについて

Keyboard.press(0x61);

上記の部分がキーを押しているところですが、0x61というのが「a」を表しています。

これはASCIIコードとして決まっているものです。他のキーについては以下のサイトに書いてあります。

Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion

ちなみにShiftやCommandといった特殊キーのコードは以下のページを参照してください。

Arduino - KeyboardModifiers

プログラムの書き換え

さてさっきのプログラムはスイッチを押したらLEDが光り、Aが入力される。
スイッチを離したらLEDが消えて、Aを離すイメージです。

アップロードすると多分そのイメージ通りに動いたと思います。

でもよくプログラムを見てみると、Loopが実行される度にKeyboard.press()かKeyboard.release()が実行されてそうです。
実際は押した瞬間にPressして、離した時にReleaseするだけでいいと思うので書き換えましょう。

あと言い忘れましたが、キーボードやマウス機能を実装するとき、ミスるとPCに繋ぐだけでマウスやキーボードが暴れて、 コードをArduinoに送れない!!的な問題が起こりがちです。
なので基本何かを書き換える時はシリアルモニターでチェックしてからにしたほうが安全です。

ちなみにProMicroの場合、RSTとGNDをショートしてから数秒間だけ動作が止まり、その間にアップロードできれば書き換わります。
コツとしてはコンパイルの早いBlinkファイルを開いておいて、 ショート→ポート選択→Blinkをアップロード! とするのが一番成功率が高いと思います。
コンパイル時間のかかる重いファイルをアップロードしようとすると、その間にリセット時間が過ぎてエラーでアップロードできないからです。

さて、なのでこんな風に書き換えてみました。

#include "Keyboard.h"

const int inputPin = 3;
const int ledPin =13;
bool currentState = LOW;
bool beforeState = LOW;

void setup() {
  pinMode(inputPin,INPUT);
  pinMode(ledPin, OUTPUT);

  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {
  currentState = digitalRead(inputPin);

  if ( currentState != beforeState ){
    if ( currentState == HIGH){
      digitalWrite(ledPin, HIGH);
      Serial.println("Push!");
//      Keyboard.press( 0x61 );
    } else {
      digitalWrite(ledPin, LOW);
      Serial.println("Release!");
//      Keyboard.release( 0x61 );
    }
  beforeState = currentState;
  }
}

前の状態をbeforeState、今の状態をcurrentStateに入れて処理することにしました。 これで前回と状態が違う場合にのみ処理が走るようになると思います。

シリアルモニターで見てみましょう。
押した時にPush!
離した時にRelease! と表示されれば成功です。

時々微妙にPush!とRelease!が何度か入力されることがあるかもしれません。
これはチャタリングという現象です。

少し待って再度チェック、とかをすれば防止できますが、今はめんどくさいのでやめておきます。
気になる方は調べてみてください。

さて、シリアルモニターで見てみて大丈夫そうな場合、コメントアウトを外せば、意図通りAが入力されると思います。

これで1キーのキーボードはできました! 次はこれを複数キーに増やしたいと思います。

eucalyn.hatenadiary.jp


まとめ記事はこちら。

eucalyn.hatenadiary.jp