AGRISMILE DEV BLOG

株式会社AGRI SMILEの開発ブログです。

"gem rails" をタイプできるキーボードを作る

こんにちは。AGRISMILEプロダクト開発部新田です。

弊社は(一部expressを除けば)ほとんどのプロダクトのバックエンドをRuby on Railsで開発しています。
また年に数件の新規プロダクト開発があり、Gemfile に gem "rails" を記載する機会が比較的多い会社です。

source "https://rubygems.org"

gem "rails"

この手間を最小化するため、 gem "rails" を速やかにタイピングできるキーボードを開発したのでそのビルドログを以下に残しておきます。

回路図の設計

今回は 3x3 の単純なマトリクスで設計します。 コントローラにpro microを使い、row は 0, 1, 2ピン、 col は 3, 4, 5 ピンを使います。

ケースの印刷

今回は手配線で作ってしまうので、PCB設計はスキップしてケースを作ってしまいます。
キースイッチはだいたい14mm x 14mmの穴を空けておけばちょうど嵌まるということだけを念頭にケースを作ります。
(通常、キーキャップを含めたピッチを考慮する必要がありますが、今回はキーキャップもピッチにあわせて作るので考えなくて良いものとします)

CADでこういうケースをつくって、印刷

配線

先ほど作ったケースにプッシュスイッチを配置してダイオードの足を巻き付けつつ配線します。
銅色の線はポリウレタン線で、はんだごてで被膜を焼き切るだけで導通するようになるのでとても便利。

ProMicroを固定する方法は考え忘れていたので接着剤で貼り付けました。
また、回路図どおり配線するのが面倒になって7, 8, 9 10, 16, 14ピンを使っています。

配線を終えたらケースをネジで留めます。

プログラム

自作キーボードのファームウェアづくりにはQMK, ZMKを始め様々な便利ツールがありますが、味気無いのでarduino IDEでプログラムを書いてみることにします。

#include "Keyboard.h"

const uint8_t scan_port[] = {1, 0, 2};
const uint8_t data_port[] = {3, 4, 5};

// キーマップの定義
const char keys[3][3] = {
    {'A', 'G', 'R'},
    {'I', 'S', 'M'},
    {'I', 'L', 'E'}
};

bool pushed_state[3][3] = {
    {false, false, false},
    {false, false, false},
    {false, false, false}
};

void scanKeys() {
    for (int column = 0; column < 3; column++) {
        digitalWrite(scan_port[column], LOW);
        delay(3); // チャタリング対策

        for (int row = 0; row < 3; row++) {
            if (digitalRead(data_port[row]) == LOW) {
                if (!pushed_state[row][column]) {
                    // 初めて押されたときのみpressを送信
                    Keyboard.press(keys[row][column]);
                    pushed_state[row][column] = true;
                }
            } else {
                if (pushed_state[row][column]) {
                    Keyboard.release(keys[row][column]);
                    pushed_state[row][column] = false;
                }
            }
        }

        digitalWrite(scan_port[column], HIGH);
    }
}

void setup() {
    Keyboard.begin();
    for (int i = 0; i < 3; i++) {
        pinMode(scan_port[i], OUTPUT);
        digitalWrite(scan_port[i], HIGH); // プルアップ抵抗を有効にする
    }

    for (int i = 0; i < 3; i++) {
        pinMode(data_port[i], INPUT_PULLUP);
    }
}

void loop() {
    scanKeys();
}

Arduino IDEで上のコードを書き込んで、正常に動作することが確認できたらOKです。
押して無いキーが反応したり、押しても反応しないキーがあればテスターを持ち出して導通チェック・はんだし直しをします。。。

キーキャップづくり

GEM RAILS それぞれのキーのキーキャップを作ります。

3Dプリンターでいい感じに印刷します。 FDM方式の場合、精度を出すために0.2mmのノズルを使うのと、積層方向を強くするためにノズル温度を高めに設定するとよいとおもいます。

これをレジンで着色するとこのような形に。

完成

ありがとうございました。