ゆかりメモ

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

オリジナルキーボードを作ってみる その6「プログラムを修正」

前回1キーだけのキーボードまでできたので、今回はキーをどんどん増やせるようにプログラムを修正します。

前回の記事はこちら。

eucalyn.hatenadiary.jp

ところでこの辺りから実際の制作時に参考にしたサイトは以下のものです。

www.toptal.com

いろいろ高度なことまで書いてあってよくわからないところも多かったですが、参考にできるところを参考にして進めていました。


続き。

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

#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;
  }
}

2キーに変更する

まず2キーのキーボードに変更してみましょう。

#include "Keyboard.h"

const int inputPin1 = 3;
const int inputPin2 = 4;
bool currentState1 = LOW;
bool beforeState1 = LOW;
bool currentState2 = LOW;
bool beforeState2 = LOW;

void setup() {
  pinMode(inputPin1,INPUT);
  pinMode(inputPin2,INPUT);

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

void loop() {
  currentState1 = digitalRead(inputPin1);
  currentState2 = digitalRead(inputPin2);

  if ( currentState1 != beforeState1 ){
    if ( currentState1 == HIGH){
      Serial.println("1 Push!");
      Keyboard.press( 0x61 );
    } else {
      Serial.println("1 Release!");
      Keyboard.release( 0x61 );
    }
  beforeState1 = currentState1;
  }

  if ( currentState2 != beforeState2 ){
    if ( currentState2 == HIGH){
      Serial.println("2 Push!");
      Keyboard.press( 0x62 );
    } else {
      Serial.println("2 Release!");
      Keyboard.release( 0x62 );
    }
  beforeState2 = currentState2;
  }
}

3番ピンに繋いだときと同じようにして、4番ピンにもスイッチを繋いでみましょう。

便宜上3番ピンのスイッチをスイッチ1、4番ピンのスイッチをスイッチ2と呼ぶことにします。

これでスイッチ1を押すと「a」、スイッチ2を押すと「b」が入力されると思います。

プログラムを改善する

このままだとキーの数だけどんどん変数が増えていって大変なので、配列を使うことにしましょう。
配列というのは変数を順番に格納できるタンスのようなものです。

更に単純な繰り返し部分にfor文を使いましょう。

#include "Keyboard.h"

const int keyNum = 2;

const int inputPin[keyNum] = { 3, 4 };
const byte keyMap[keyNum]  = { 0x61, 0x62 };

bool currentState[keyNum];
bool beforeState[keyNum];

int i;

void setup() {
  for( i = 0; i < keyNum; i++){
    pinMode(inputPin[i],INPUT);
    currentState[i] = LOW;
    beforeState[i] = LOW;
  }

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

void loop() {
  for( i = 0; i < keyNum; i++){
    currentState[i] = digitalRead(inputPin[i]);

    if ( currentState[i] != beforeState[i] ){
      Serial.print("key");
      Serial.print(i);
      if ( currentState[i] == HIGH){
        Serial.println(" Push!");
        Keyboard.press( keyMap[i] );
      } else {
        Serial.println(" Release!");
        Keyboard.release( keyMap[i] );
      }
    beforeState[i] = currentState[i];
    }
  }
}

const int inputPin[keyNum] = { 3, 4 };
と書いた場合、inputPin[0]で3、inputPin[1]で4が取り出せます。

いい感じにシンプルになったと思います。

次回

これでキーの数を増やしやすくなりました。

でもプログラム上はキーが増やせるとはいえ、この方法でキーを増やしていくとピンがすぐ足りなくなりますね。

そのためにキーマトリックスという手段を使います。

次はその方法でキーを増やします。

eucalyn.hatenadiary.jp


まとめ記事はこちら。

eucalyn.hatenadiary.jp