喫茶blanc

何か作ったり、何か食べたり

Arduinoとキーマトリクスで遊んでみる

ゆかりさん (https://twitter.com/eucalyn_)の「ねこでも作れる! オリジナルキーボード」をもとに、universal16のキーマトリクスからpress/releaseを捕まえるコードを書いて実験してみました。

eucalyn.booth.pm

Pro Microの4,5,7,8ピンをそれぞれRow 0-3に、10,15,14,16ピンをそれぞれCol 0-3に配線します。

const int Rowpin[] = {4,5,7,8};
const int Colpin[] = {10,15,14,16};
const int Cols = (sizeof(Rowpin)/sizeof(Rowpin[0]));
const int Rows = (sizeof(Colpin)/sizeof(Colpin[0]));
bool beforeState[Rows][Cols];
bool currentState[Rows][Cols];
void setup(){
    Serial.begin(9600);
    while(!Serial);
    Serial.println("Started.");
    for(int i=0;i<Cols;i++){
        pinMode(Rowpin[i],OUTPUT);
    }
    Serial.print("num of Rowpin: ");
    Serial.println(Rows);
    Serial.println("Rowpin initialized.");
    for(int i=0;i<Rows;i++){
        pinMode(Colpin[i],INPUT_PULLUP);
    }
    Serial.print("num of Colpin: ");
    Serial.println(Cols);
    Serial.println("Colpin initialized.");
    for(int i=0;i<Rows;i++){
        for(int j=0;j<Cols;j++){
            currentState[i][j] = HIGH;
            beforeState[i][j] = HIGH;
        }
    }
    Serial.println("initialize finished");
}
void loop(){
    for(int i=0;i<Rows;i++){
        digitalWrite(Rowpin[i],LOW);
        for(int j=0;j<Cols;j++){
            currentState[i][j] = digitalRead(Colpin[j]);
            if (currentState[i][j] != beforeState[i][j]){
                if(currentState[i][j] == LOW){
                    Serial.print("key ");
                    Serial.print(i);
                    Serial.print(",");
                    Serial.print(j);
                    Serial.println(" pressed!");
                } else {
                    Serial.print("key ");
                    Serial.print(i);
                    Serial.print(",");
                    Serial.print(j);
                    Serial.println(" released!");
                }
                beforeState[i][j] = currentState[i][j];
            }
        }
        digitalWrite(Rowpin[i],HIGH);
    }
}

View code on GitHub.com

うごいている様子

左右間の通信などほかの処理を一切含まないため、チャタリングをよく捕まえてしまうのでdelay(1)などを挟んでみてもいいかもしれません。

次回は、universal16のLEDマトリクスについて更新の予定です♨

github.com