Claw44であそぼ。④(OLED編)
はじめに
一日で一番手に触れているものはキーボードという思い込みから、不便さを克服することにより得られる快楽を毎日満喫するために小さなキーボードの導入を思い立ち、2022年12月にClaw44の購入を決意。プログラミングと自作キーボードの知識ゼロから始めた自作キーボード素人によるClaw44カスタマイズの奮闘記を綴っていきたいと思います。
OLEDとは
OLEDとは「Organic Light Emitting Diode」の略称で、いわゆる有機ELディスプレイのことである。自作キーボードにおいて、オリジナリティ度を上げて視覚的に楽しむことができるエンターテイメント的要素を加えるためにキーボードにOLEDを搭載する修行僧もいる。OLEDには数字や文字だけではなく、ドットを駆使して画像やアニメーションを表示させることも可能で、その活用方法は無限大といえる。
Claw44もデフォルトでOLEDが左右にひとつずつ搭載できる拡張性の高い玄人志向の超親切設計で、猫山王のClaw44には右手側にひとつOLEDを搭載している。OLEDを右手側のみに搭載している理由は、Claw44を左手デバイスとして利用するケースもあり、拡張プレートを活用してロータリーエンコーダを左手側に搭載しているためである。よくある活用例としては、キーボードの名称や入力した文字、またレイヤー情報を表示させることで、今どこのレイヤーなのか迷子にならないようにいわば道しるべ的な活用方法であるといえる。猫山王のOLEDは、上からキーボードの名称、Firmwareの名称、搭載しているマイコンの名称、レイヤーの名称、レイヤー番号を表示させている。レイヤー番号については、デフォルトレイヤーを0としてレイヤーがあがると対応する番号が反転する仕様にしている。ただ、猫山王のClaw44は21レイヤーもあるので普通に考えるとレイヤー番号を21個準備しないといけない。そこは日々の不便を克服するトレーニングで培ったクリエイティブな発想により2進数で表現することで解決した。例えばレイヤー7であれば①、②、④の番号が反転することになる。この方法を発見したときは、自分のことを天才と確信しました。自画自賛。
OLEDをキーボードに搭載するだけなら、はんだ付けのみでサクサクっとできます。しかしながら、OLEDに好きな情報を意図した通り表示させるとなるとこれまた一大事で、エクセルとにらめっこしながら迷子にならないよう2進数から16進数への変換表を方位磁石のように活用しつつ、各種召喚呪文を駆使してソースコードを書き換えてコンパイルの嵐の中を駆け抜けようやく使いこなせるようになるまでは修羅の国での修行が必須といえるでしょう。
OLEDのための準備
OLEDを視覚的に楽しむことができるエンターテイメント的要素として機能させるためにはソースコードの書き換えが必須で、ここからはQMKビルド環境を構築してQMK Firmwareを利用することが必要となってきます。これはQMK MSYSの真っ黒い画面の暗黒世界の中をひたすら突き進み、エンドゲームを目指して日々不便さを克服することにより得られる快楽を求める修行僧として精進することの決意を意味します。QMKビルド環境の構築方法については、Google先生に「QMKビルド環境の構築」、「QMK Firnware環境構築」等とお問い合わせいただければ、先人達の導きの書をご案内いただけると思います。各種導きの書を見比べていただいて、お好みの導きの書に従ってQMKビルド環境の構築を済ませましょう。猫山王もプログラミングと自作キーボードの知識ゼロから先人達の導きの書を頼りにQMKビルド環境の構築はできていますので、まだ見ぬ世界へ飛び込むためにも是非チャレンジしてください。
ちなみに、猫山王のClaw44のQMK Firmwareのフォルダー構成はこんな感じです。
OLEDの楽しみ方
1.OLEDを購入してキーボードにはんだ付けしよう
OLEDは自作キーボード会の萬屋的存在の遊舎工房やAliExpressで販売されています。ピンソケット付きが便利で良いでしょう。文字の色は、白色、青色、黄色があって猫山王のは青色ですが、次は黄色にしてみたいと思っています。ピクセル数は128x32で良いでしょう。巨大な面積を求めるのであれば128x64も選択肢になりますが、このサイズをClaw44に搭載するには工夫が必要です。Claw44の開発者のyfukuさんのショップでも以前は販売されていたので猫山王もそこで購入しましたが、今は販売されていないようです。
OLEDの取り付け方法は、Claw44 v3のビルドガイドの上の「v2用はこちらのPDFを参照してください。」をクリックすると、Claw44にOLEDを搭載するビルドガイドにたどり着きます。
2.OLEDに命を吹き込もう
OLEDはキーボードの基板はんだ付けするだけでは、単なるお飾りで全く光りません。OLEDに命を吹き込むために変更が必要なファイルは、keymapsフォルダ下のrules.mkファイル、config.hファイルとkeymap.cファイルの3つです。それぞれのファイルを書き換える方法については、猫山王の設定を参考にひとつひとつ解説していきたいと思います。
3.rules.mkファイルの内容を書き換えよう
keymapsフォルダ下にrules.mkファイルを作成します。その後、以下のOLEDを有効とする召喚呪文を追加します。これでOLEDの魔法を使えるようになります。Claw44フォルダ直下にもrules.mkファイルがあるので、こちらのファイルを書き換えてもOKですが、猫山王は呪文管理の観点で召喚系の呪文は何となくkeymapsフォルダに追加しています。
OLED_ENABLE = yes
4.config.hファイルの内容を書き換えよう
keymapsフォルダ下にconfig.hファイルを作成します。猫山王のClaw44はOLEDを右側に搭載しているので、Slave側(USBをつないでいない側)にOLED情報を表示させる必要があります。そのためconfig.hファイルには、OLED情報をSlave側に表示させる呪文、OLED表示をレイヤーごとに変える呪文、OLED表示をスクリーンセイバーのように自動スクロールするまでの時間の変更、OLED表示のタイムアウト時間の変更等の呪文を書いています。解読できるように簡単な日本語訳も記載しておきます。
#pragma once //config.hファイルにはとりあえず追加する呪文
/* define OLED mirror */
#ifdef OLED_ENABLE
#define SPLIT_TRANSPORT_MIRROR //Slave側に同じ情報を表示
#define SPLIT_LAYER_STATE_ENABLE //レイヤーごとに表示変更可能とする
#endif
/* define OLED Scroll and timeout */
#ifdef OLED_ENABLE
#define OLED_SCROLL_TIMEOUT 10000 //10秒後にスクロール開始
#define OLED_TIMEOUT 180000 //180秒後に表示OFF
#endif
ここまでだといとも簡単にOLEDの魔法を使えたような錯覚を起こしますが、まだ表示する画像については一切触れていません。意図したものを意図通りに表示させるのが一番大変な修行であり、エクセルと2進数から16進数への変換表との無限の反復横跳びの日々が続き、まさに時間が溶けていくという修羅の国での修業が待ち受けています。
5.OLEDの仕組みを理解して表示データを作成しよう
一般的なOLEDのピクセル数は128x32で、この数はセルを意味しています。つまり縦(横?)128個x横(縦?)32個の合計4,096ものドットの世界を表現しています。これには、ひとつのドットを点灯させる/させないの2通り組み合わせがあり、組み合わせの数は2の4,096乗にもなります。2の1,000乗で桁数はすでに300桁を超え、まさに無限の可能性を意味し、クリエイティブな発想力へのチャレンジといえるでしょう。
表示テータの作成方法は、画像ファイルを読み込ませて16進数に変換する方法もあります。しかし、この方法でも細部の調整が必要なので、猫山王は表示画像をエクセルで作成し、これを2進数から16進数に変換するという何とも古典的な不便さMAXの方法を採用しています。具体的には、まずは以下のようにエクセル上でドットで表現したものを作成します。エクセルでは黒を点灯させる箇所、白を点灯させない箇所で表現しています。ここで、2進数から16進数への変換は縦の8ドットを単位として行いますので、それに対応する形で架線を引いていおけば少なからず効率的に進められると思います。
例えば、C列の1行目から8行目について、点灯させる箇所を1、点灯させない箇所を0とすると2進数で表現した場合は上から(00001111)になります。これを16進数に変換すると(0f)になります。
16進数への変換を一瞬で可能とするスーパー変人の方以外の世間一般の修行僧は変換表を用いるか進数変換電卓を用いることになるでしょう。猫山王が変換にいつも利用しているサイトを紹介しておきます。
この16進数の0fの前に0xをつけて、0xf0がC列の1行目から8行目のOLEDの画像データになります。で、この苦行を全部のセルに対して実施した結果が下記になり、この宇宙曼荼羅を完成させて初めてOLEDの画像データの作成が完了となります。時間が解ける修羅の国での試練のイメージはできましたでしょうか。
0x00, 0xf0, 0xf8, 0x0c, 0x0c, 0x98, 0x90, 0x00, 0xff, 0xff, 0x00, 0xf0, 0xf8, 0x0c, 0x0c, 0xf8,
0xf0, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0xf8, 0xf0, 0x00, 0xf0, 0xf8, 0x4c, 0x4c, 0x78, 0x70, 0x00,
0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, 0x83, 0x63, 0x10, 0x90, 0x11, 0x13, 0xf3, 0x01,
0x00, 0x80, 0x63, 0x13, 0x90, 0x10, 0x13, 0xf3, 0x00, 0x01, 0x03, 0x02, 0x02, 0x03, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x46, 0x41, 0x4c, 0x4f, 0xcf, 0x00, 0x00, 0xff, 0x78,
0x46, 0x41, 0x4c, 0x4f, 0xcf, 0x00, 0x00, 0xcf, 0x48, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0xf8, 0xf8, 0xf8, 0x08, 0x00, 0x00, 0x00, 0x01, 0xe1, 0x01, 0x01, 0x00,
0xe0, 0x00, 0x80, 0xa0, 0x01, 0x01, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, 0x20, 0xe0, 0x00, 0x00,
0x18, 0x1c, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1c, 0x18, 0x00, 0x03, 0x04, 0x08, 0x04,
0x03, 0x00, 0x08, 0x0f, 0x08, 0x00, 0x04, 0x0a, 0x0a, 0x0f, 0x08, 0x00, 0x08, 0x0f, 0x08, 0x00,
0xfe, 0x12, 0x32, 0x52, 0x8c, 0x00, 0xfe, 0x12, 0x12, 0x12, 0x0c, 0x00, 0xc4, 0xa2, 0x92, 0x92,
0x8c, 0x7c, 0xa2, 0x92, 0x8a, 0x7c, 0x30, 0x2c, 0x22, 0xfe, 0x20, 0x7c, 0xa2, 0x92, 0x8a, 0x7c
せっかくの宇宙曼荼羅を完成させてもコンパイルしたら得体のしれない現代美術となってしまっては今までの苦行の成果がまさに水の泡となり、得たものはゼロ、失ったものは修羅の国で溶かした時間となります。そのため事前のチェックをお勧めします。image2cppにアクセスして、1. Paste byte arrayに上記のデータをコピペしてみましょう。OLEDのサイズを縦向きの32x128pxに変更後、Read as verticalをクリック。3. Previewの個所で、意図した宇宙曼荼羅が表示されていれば修羅の国での修行は完了。ここで、解読不能の現代美術が表示されてしまったら修羅の国へ逆戻りして、エクセルと変換表との無限の反復横跳びの日々に戻ってください。画像ファイル読み込ませて16進数のデータを作成すると、現代美術が表示される可能性が高く、曼荼羅を完成させるためには調整が必ずと言っていいほど必要なので、猫山王は急がば回れ、不便を極限まで楽しむ精神のもと、エクセルと変換表と変換表の反復横跳びが結果的に最短で修羅の国を卒業できるのではないかと信じています。もっと良い方法があったら是非教えて欲しいです。
6.keymap.cファイルの内容を書き換えよう
keymapsフォルダ下にkeymap.cファイルに宇宙曼荼羅の画像データの呪文を記載します。猫山王のClaw44のOLEDでは、①宇宙曼荼羅、②レイヤー名称、③レイヤー曼荼羅から構成されています。こだわりポイントは縦型表示で、宇宙曼荼羅はすべてのレイヤーで表示させ、レイヤー名称とレイヤー曼荼羅はレイヤーが変わると表示が変わるというレイヤー迷子にならない親切仕様です。OLED表示を掌る曼荼羅の呪文は長編巻物になってしまうので、keymap.cの一番下に記載するのがいいでしょう。猫山王の長編曼荼羅と解読できるように簡単な日本語訳も記載しておきます。
/* OLEDの設定 */
#ifdef OLED_ENABLE
bool should_process_keypress(void) { return true; } // OLED情報をSlave伝達oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (!is_keyboard_master()){return OLED_ROTATION_270; // OLED表示を270度回転殺法
} else {return OLED_ROTATION_270;
}
return rotation;
}
/* OLEDに表示さる曼荼羅の定義 */
static void render_logo(void) {
static const char PROGMEM my_logo[] = {
//宇宙曼荼羅の16進数データ貼り付け
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
static void render_logo_00(void) {
static const char PROGMEM my_logo[] = {
//レイヤー曼荼羅の16進数データ貼り付け、レイヤー0
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
static void render_logo_01(void) {
static const char PROGMEM my_logo[] = {
//レイヤー曼荼羅の16進数データ貼り付け、レイヤー1
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
//以下、レイヤー数に合わせてレイヤー曼荼羅の16進数データ貼り付けを繰り返す
/* レイヤー名称の定義とレイヤーごとに表示を変更する呪文 */
void render_layer_state_1(void) {
switch (get_highest_layer(layer_state)) {
case _00:
oled_write_ln_P(PSTR("-Alph"), false); //-Alphと表示される
break;
case _01:
oled_write_ln_P(PSTR("-Npad"), false); //-Npadと表示される
break;
//以下、レイヤー数に合わせて呪文を繰り返す
}
}
/* レイヤー曼荼羅をレイヤーごとに表示を変更する呪文 */
void render_layer_state_2(void) {
switch (get_highest_layer(layer_state)) {
case _00:
render_logo_00();
break;
case _01:
render_logo_01();
break;
//以下、レイヤー数に合わせて呪文を繰り返す
}
}
/* OLEDの表示制御の設定 */
bool oled_task_user(void) {
if (is_keyboard_master()) {
render_logo(); //宇宙曼荼羅を一番上に表示
oled_set_cursor(0, 7); //レイヤー名称の表示開始箇所の定義
render_layer_state_1(); //レイヤー名称の表示
render_layer_state_2(); //レイヤー曼荼羅の表示
} else {
render_logo();
oled_set_cursor(0, 7);
render_layer_state_1();
render_layer_state_2();
}
return false;
}
#endif
7.さあ、コンパイルしよう
ここまでくれば最後はQMK MSYSでのコンパイルです。コンパイルの方法については、先人達が丁寧に導きの書にまとめてくれているので、お好みの導きの書に従ってコンパイルしましょう。ここで初めて、QMK MSYSの真っ黒い画面をひたすら突き進み不安と期待の中、OK、OK、OKと希望の緑の光が順次点灯し、最終的にコンパイルが完了した時の歓喜を是非堪能して欲しいです。暗黒世界の中、不便さを克服することにより得られる快楽を求める修行僧として極楽浄土に達することができたと錯覚してしまう何物にも代えがたい安住の地へ昇華した瞬間がそこにあります。呪文のコンパイルが無事成功すると、qmk_toolboxを利用してファームウェアを書き換えることでミッション完了。
実際にOLEDを利用してみて
OLEDというものは、無骨な自作キーボードに視覚的なエンターテイメント要素を加えることができるある種白魔法ともいえる呪文です。ただ、呪文の使用者がクリエイティブな発想力を持ち得ているかということが、この呪文の威力を左右するといっても過言ではないでしょう。白魔法でありながらその呪文の習得のためには、エクセルと変換表の無限の反復横跳びという自作キーボードの修行の中でも高高度かつ別次元の苦行があり、自身の曼荼羅の世界観を表現するためには、時間の概念を捨てないか限りは健全な精神状態を保つことができない非常に危険な修行といえます。苦行の成果の現れである曼荼羅の世界観が表現された自作キーボードは、畏敬の念を抱かざるおえない神聖な神器となるでしょう。修行僧の多くは、OLEDにレイヤー曼荼羅を表示させたいという邪念を捨てきれず、レイヤー数が増えれば増えるほどレイヤー曼荼羅の数も増え、エクセルと変換表の無限の反復横跳びに加えてレイヤー曼荼羅の無限ループの世界に陥る者も数多くいます。猫山王もそんな修行僧のひとりで、レイヤー曼荼羅は21にまでなってしまいました。また、OLEDもその中毒性が非常に高く、猫山王もより複雑な曼荼羅の世界の表現を可能とするために128x64のOLEDも購入済みで、今後は別の修羅の国で修業を控えています。不便さを極限まで追い求めることによって、他の修行僧とは一線を画した世界観を曼荼羅で表現したいと思います。
今回はレイヤーごとにOLEDの表示を変更させるというマニアックな呪文についても触れてみました。皆さまの世界観を表現する曼荼羅作成の一助となれば幸いです。
自作キーボードは敷居が高いと思われている方にとって、一日で一番手に触れているものはキーボードということで、不便さを克服することにより得られる快楽の世界への入門のための勇気づけとなれば幸いです。
次回
さて次回はロータリーエンコーダ導入の奮闘記をお届けします。ロータリーエンコーダを活用することで今までは縦方向の動きにしか対応できなかったキーボードに回転方向の動きを加えることで、入力デバイスとし新たな可能性を広げることができ、縦方向のタイピングのみでは決して到達しえない快楽を味うことができます。さらに加えて言えば、ロータリーエンコーダのクルクル回転殺法にどのような機能を割り当てるか、はたまた搭載するノブの形状よってキーボードのオリジナリティ度をさらに増すことができる必殺拳といえるでしょう。
この記事が気に入ったらサポートをしてみませんか?