TrialBoardの紹介、各種機能の説明

2021/03/26

自作キーボードに限った話ではないですが、何かを開発するには試作が必要です。

設計上は問題が無いように見えても、実際に製品が出来上がってから見える問題点というのは結構あります。

初めて試す技術や、そもそも開発の経験が少ないのなら尚更です。

実際、PistachioMacroPadでは試作せずに販売用に基板を発注して痛い目を見ました。(バッテリの極性が逆だったり、シルクが変だったり…)

 

さて、最近はPistachioKeyboardシリーズの次回作としてPistachioProを設計中ですが、初めて使う技術要素があるので試作を行いました。

その副産物がTrialBoardです。

個人用に適当に作った基板ですが、ツイートするとそこそこの反応を頂きましたのである程度整えて販売することとしました。

 

この記事ではTrialBoardの特徴や、搭載している機能の解説をします。

 

 

 

TrialBoardの特徴

PistachioProで取り入れた初めて使う技術要素というのが次の点になります。

・ProMicroを使わない、マイコン(ATmega32u4)直付設計

・Type-Cコネクタの採用

・通常のマトリクスより、倍のキー数を読み取れるduplexmatrixの採用

・OLEDによるディスプレイ表示

・I2Cインターフェースが付いたセンサ値の読み取り(今回はBME280という温湿度/気圧センサ)

これらの技術要素を検証するための試作ボードがTrialBoardです。

 

初めての技術要素ではありませんが、次のものも検証できるような設計としています。

・NeoPixelLED(ws2812c) の検証

・未使用ピンをコネクタに引き出し→ピンソケットを実装することによって、ブレッドボード上で任意の回路を検証する想定です。

 

ProMicroレス、ATmega32u4直付の設計

試作で一番試したかった点がProMicroレスな構造です。

そもそもProMicroレスにしたかった理由としては、

・ProMicroはそれ自体で1000円、コンスルーも合わせると1400円を超えるため販売価格が高くなる

・ProMicro自体に高さ、幅があるため部品配置の自由度が低い

・モゲマイクロと呼ばれるほどUSBコネクタがもげる為、補強が必要だが面倒くさい

・ProMicroだと使えるピン数が少ない(ATmega32u4直付けだと使えるピン数が多い)

などがあります。

 

ProMicroレスな設計をするにあたって、マイコンや部品の選定が必要となります。

今回は特に理由もなかったためProMicro同等の部品、回路としました。

一部違いとしてはUSB端子はType-Cを採用する点と、ProMicroでは3.3~5Vを入力電圧として受けれるようにしていますが、今回は5Vでのみ動けば問題ないためレギュレーターの部分は撤去した点です。

Type-Cコネクタについては次のセクションで詳しく解説します。

 

Type-Cコネクタ選定、設計、探し方

時代はType-Cだぜ!ということでオワコンのUSBmicroB端子をやめてType-Cコネクタを採用します。

Type-Cというと回路設計が難しくなりそうですが、難易度は高くありません。

 

ここではどのようにType-Cコネクタを選定していくかを解説します。

 

配線の観点

USB Type-C規格では様々な通信プロトコルを流すことができ、プロトコルに応じて使われるピンの種類や数が異なってきます。

そのため、特定の用途に使われるType-Cコネクタは一部のピンが廃されていたりします。(電源専用とかだと信号線がない)

 

キーボードとして使う為にはUSB2.0規格で必要なピンが出ているコネクタを選びます。

USB2.0として必要なピンというのは下記リンクのUSB2.0列にチェックがついているピンです。

 

電源線のみのコネクタ以外であれば大丈夫です。

画像のようなピン数が少ないのは電源用。これはデータ通信出来ないためNG。

物理的な観点

ケースなどの設計にもかかわってきますので、コネクタの物理的な寸法が記載されているものを選びましょう。

最悪実物が届いてから計測しても良いのですが、それだと設計し辛いので。

Aliexpressで探すと寸法が書いていない商品が多い…

 

また、対応するフットプリントがKiCAD標準で用意されているものに合うかも確認しておきます。

無いなら作れば良いのですが、フットプリントを作るのは面倒かつ、ミスが発生しやすい作業のためです。

 

duplexmatrixの回路設計、検証用ソフト

duplexmatrixとは、通常のマトリクスと同じピン数で倍のマトリクスを構築できる回路です。

回路の例としては下記のように、列のピンを重複させ、重複している分の列のダイオードは通常とは逆向きに付けたような回路となります。

これによって、通常のマトリクスでは4キーの読み取りに必要なキー数は4ピンでしたが、duplexmatrixでは3ピンで済むようになります。

 

動作例をソフトの動作とリンクして簡単に解説します。

duplexmatrixのソフトは2021/3月現在、qmk_firmwareには標準にマージされていませんので、matrix.cを独自に実装する必要があります。

TrialBoardの実装は下記を参照ください。

 

通常のマトリクス、COL2ROWでは列を順番に電圧をかけ、行の電圧を読むことでスキャンを行っています。(ROW2COLは逆)

duplexmatrixではCOL2ROW、ROW2COLをどちらも行うイメージです。

 

下記より、duplexmatrixの動作をソフトの実装例も交えて解説します。

 

SW1とSW4が押下されている状態とします。

①ではCOL2ROW相当の処理を行い、左半分のキー読み取りを行います。

このとき、右半分のキーが―押されていたとしてもダイオードによってガードされるので無視されます。

uint8_t matrix_scan(void) {
    bool changed = false;

    // Set row, read cols
    for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
        changed |= read_cols_on_row(raw_matrix, current_row);
    }
    // Set col, read rows
    for (uint8_t current_col = 0; current_col < MATRIX_COLS/2; current_col++) { /* 物理的には2列あるためMATRIX_COL=2だが、duplexmatrixでは列数を倍にして扱う為、/2を行っている*/
        changed |= read_rows_on_col(raw_matrix, current_col);
    }

    debounce(raw_matrix, matrix, MATRIX_ROWS, changed);

    return (uint8_t)changed;
}

 

②ではROW2COL相当の処理を行い、右半分のキー読み取りを行います。

左半分のキーが押されていたとしても、ダイオードによってガードされるため無視されます。

 

 

static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
    bool matrix_changed = false;

    // Select col and wait for col selecton to stabilize
    select_col(current_col);
    wait_us(30);

    // For each row...
    for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
        // Store last value of row prior to reading
        matrix_row_t last_row_value = current_matrix[row_index];

        // Check row pin state
        if (readPin(row_pins[row_index])) {
            // Pin HI, clear col bit
            current_matrix[row_index] &= ~(ROW_SHIFTER << ( current_col + MATRIX_COLS/2 ));
        } else {
            // Pin LO, set col bit
            current_matrix[row_index] |= (ROW_SHIFTER << ( current_col + MATRIX_COLS/2 ));
        }

        // Determine if the matrix changed state
        if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
            matrix_changed = true;
        }
    }

    // Unselect col
    unselect_col(current_col);
    return matrix_changed;
}

 

OLEDの回路設計、検証用ソフト

OLEDは自作キーボードで良く採用されている、SSD1306という制御ICが乗ったものを採用しました。

ソフトが楽ですし、配線もI2Cに繋げばよいだけなので簡単です。

基本的にはドキュメントを見ればソフト実装も可能です。

 

一瞬ハマったこととして、128×64のOLEDを使っているにも関わらず、解像度の設定が漏れており128×32として認識されていたことがありました。


上記ツイートのツリーにもある通り、

#define OLED_DISPLAY_128X64

の定義が盛れていたようです。定義を追加したら問題無く表示されました。

 

BME280の検証

次にI2Cの検証を行います。

その実験体としてBME280を使います。気温、湿度、気圧が測れるセンサーです。

I2C、SPIどちらでも扱えるため便利です。

TrialBoardのキットには付属しませんが、I2Cポートに接続すれば検証できます。

 

そもそもBME280を搭載する理由ですが、OLEDを搭載しているキーボードは数多くありますが、表示したい情報が少ないんですよね。

そこで、「気温、湿度、気圧が表示されたら嬉しいんじゃね?」と思ったわけです。

デスクワーク中、気温や湿度を軽視している人は多いように感じますが、作業しやすいように環境を整えるのは重要です。

不快指数増し増しな状況で作業なんてやってられないのです。

そういう意味ではCO2センサも搭載したかったのですが、実用に耐えそうなものは高価で手が出ませんでした。

 

今回採用しているOLEDは、I2Cで扱えるためOLEDと同じバス上に配線すればマイコンの貴重なピンも消費しません。

 

ソフト実装として参考になるものを探したのですが、現状qmk_firmwareにマージされているキーボードでBME280は愚か、気温センサを搭載しているキーボードは無いようです。

そのためスクラッチから実装しました。

 

資料

回路図

回路図は下記を参照ださい。クリックで拡大します。

TrialBoard 回路図
TrialBoard 回路図

部品表

部品表は下記を参照ください。

 

ファーム作成

ファームウェアの作成、書き込み方法は下記の記事をご覧ください。

 

販売ページ

Boothにて販売しております。

 

おわりに

もし、「分かり辛い!」「なんか知らないけどトラブった!」などがあればお気軽にTwitterかこの記事のコメントのほうまでご連絡ください。