QMK Keyboard

Netflix専用キーボード (su120)

ロータリーエンコーダー、スライドスイッチ、OLEDを搭載した多機能メディアコントローラー。VIALで簡単カスタマイズ

Netflix専用キーボード (su120)

プロジェクトの背景

Fusion 360を学習しながらYouTubeやNetflixを見る時、音量調節や早送り/巻き戻し、ページめくりを手元で簡単に操作したい。

そんなニーズから生まれたNetflix専用キーボードです。su120プラットフォームをベースに、段階的に機能を追加してきました。

Netflix専用キーボード完成品

特徴

  • ロータリーエンコーダー × 2個: 音量調節、ページめくり
  • スライドスイッチ: エンコーダー出力を左右/上下カーソルで切り替え
  • OLED搭載: レイヤー状態をビットマップ表示
  • VIAL対応: ブラウザGUIでキーマップ変更
  • QMKファームウェア: 高度なカスタマイズ可能
  • 総コスト約¥3,500

使い方

PCにUSBで接続すると、キーボードとして認識されます。

基本操作

  • ロータリーエンコーダー1: ページめくり(上下カーソル)
  • ロータリーエンコーダー2: 音量調節
  • スライドスイッチ: エンコーダー1を左右カーソル ⇔ 上下カーソル切り替え
  • OLEDディスプレイ: レイヤー状態を視覚的に表示

VIAL設定

ブラウザでvial.rocksにアクセスすれば、ファームウェア書き換えなしでキーマップをGUI編集できます。


遊び方

  • Netflix/YouTube視聴時の快適操作
  • 電子書籍のページめくり専用コントローラー
  • 動画編集ソフトのシャトルコントローラー
  • プレゼン資料のページ送り
  • 音楽再生の音量調節専用デバイス
  • 好きなショートカットに設定してマクロパッド化

VIALのGUIで即座にキーマップ変更できるので、用途に応じて使い分けられます。


材料の調達

マイコン

Pro Micro(¥800-1,200)

ATmega32u4搭載のマイコンボード。QMK/VIAL対応。

購入先:

PCB基板

su120基板(¥1,000-1,500)

遊舎工房などで販売されている、分割型のユニバーサルキーボード基板です。

購入先:

キースイッチ

メカニカルスイッチ × 4個(¥30-100/個)

Cherry MX互換のメカニカルスイッチ。お好みの打鍵感のものを選びましょう。

購入先:

ロータリーエンコーダー

EC12互換ロータリーエンコーダー × 2個(¥100-300/個)

ロータリーエンコーダー

音量調節やページめくりに使う回転式のエンコーダー。大きめのキャップを付けると操作しやすくなります。

購入先:

注意点: 大きなキャップを使う場合は、周辺のキースイッチと干渉しないよう配置に工夫が必要です。

スライドスイッチ

大型スライドスイッチ(¥100-300)

スライドスイッチ

キーキャップサイズの大型スライドスイッチ。エンコーダー出力を切り替えます。

購入先:

OLEDディスプレイ

SSD1306 OLED(128x32)(¥300-600)

I2C接続の小型OLEDディスプレイ。レイヤー状態を視覚的に表示します。

購入先:

スペック:

  • 解像度: 128x32ピクセル
  • インターフェース: I2C
  • 電圧: 3.3V~5V

ダイオード

1N4148 × 4個(¥5-10/個)

キーマトリクス用のダイオード。必要な個数分用意します。

電子ワイヤ

AWG22~26程度の電子ワイヤ。OLED接続用に4本(VCC、GND、SDA、SCL)、スイッチ配線用に2本必要です。

購入先:

ハンダ

鉛入りまたは鉛フリーハンダ。直径0.6mm~1.0mm程度が使いやすいです。

3Dプリントパーツ

OLED用の開口部を持つケースをThingiverseで公開しています。

必要な工具:

  • はんだごて(温度調節機能付きがおすすめ)
  • ニッパー
  • ワイヤーストリッパー
  • ピンセット
  • テスター(動作確認用)

組み立て方

1. ダイオードのはんだ付け

su120基板の各キースイッチ位置にダイオードをはんだ付けします。

手順:

  1. ダイオードの向きを確認(カソード側にマーク)
  2. 基板の穴に差し込む
  3. 裏面ではんだ付け
  4. 余分なリード線をカット

2. Pro Microのはんだ付け

基板にPro Microをはんだ付けします。コンスルー(スプリングピンヘッダ)を使うと着脱可能になります。

手順:

  1. コンスルーまたはピンヘッダを基板に差し込む
  2. Pro Microを載せる
  3. Pro Micro側をはんだ付け

3. ロータリーエンコーダー × 2個のはんだ付け

ロータリーエンコーダー配置

2個のロータリーエンコーダーを基板にはんだ付けします。

重要なポイント:

  • 最外列Dのキーは配置しない: 大きなエンコーダーキャップとの干渉を避けるため
  • 背の高いエンコーダーを使う: 周辺部品との物理的な衝突を防ぐ

4. スライドスイッチの配線

スイッチ配置

ロータリーエンコーダーとの干渉で、通常のキースイッチが配置できない最右列にスライドスイッチを配置します。

配線方法:

  1. スイッチの端子にワイヤをはんだ付け
  2. 基板のキーマトリクスの対応する位置(行1、列D)に接続
  3. スイッチを右にスライドすると回路が閉じる(キー押下として認識)

5. OLED用配線

配線図

接続:

  • VCC: Pro MicroのVCC → OLEDのVCC
  • GND: Pro MicroのGND → OLEDのGND
  • SDA: Pin 2(D1) → OLEDのSDA
  • SCL: Pin 3(D0) → OLEDのSCL

手順:

  1. 基板の表側から4ピンコネクタを通してVCC/GNDを接続
  2. SDA/SCLワイヤは裏側に回してはんだ付け
  3. OLEDモジュールにワイヤを直付け
  4. テスターで導通確認

6. キースイッチの取り付け

メカニカルスイッチを基板に取り付けます。

7. ケースへの組み込み

3DプリントしたケースにOLED用の開口部があることを確認してから組み込みます。


VIALファームウェアのセットアップ

1. VIAL環境の構築

QMK環境を構築後、VIALリポジトリをクローンします。

git clone https://github.com/vial-kb/vial-qmk.git
cd vial-qmk
make git-submodule
qmk setup

2. 必要なファイルの作成

keyboard.json:

ハードウェア仕様を定義します(USB VID/PID、マトリクスピン、レイアウトなど)。

{
    "keyboard_name": "su120_netflix",
    "manufacturer": "e3w2q",
    "maintainer": "kurosuke",
    "processor": "atmega32u4",
    "bootloader": "caterina",
    "usb": {
        "vid": "0x1209",
        "pid": "0x4649",
        "device_version": "0.0.1"
    },
    "matrix_pins": {
        "rows": ["F6"],
        "cols": ["D1", "D0", "D4", "C6"]
    },
    "diode_direction": "COL2ROW"
}

vial.json:

VIAL GUI用の設定ファイル。

{
    "lighting": "none",
    "matrix": {"rows": 1, "cols": 4},
    "layouts": {
        "keymap": [
            ["0,0", "0,1", "0,2", "0,3"]
        ]
    }
}

UID生成:

python3 util/vial_generate_keyboard_uid.py

生成されたUIDをvial.jsonに追加します。

3. rules.mkの設定

VIAL_ENABLE = yes
OLED_ENABLE = yes
OLED_DRIVER = SSD1306
ENCODER_ENABLE = yes
MOUSEKEY_ENABLE = yes

# メモリ削減
CONSOLE_ENABLE = no
COMMAND_ENABLE = no
SPACE_CADET_ENABLE = no
MAGIC_ENABLE = no
KEY_OVERRIDE_ENABLE = no
TAP_DANCE_ENABLE = no
COMBO_ENABLE = no
LTO_ENABLE = yes

4. keymap.cの実装

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT(
        KC_A,   KC_B,   KC_C,   MO(1)   // 最右列がスライドスイッチ
    ),
    [1] = LAYOUT(
        KC_X,   KC_Y,   KC_Z,   _______
    ),
};

#ifdef ENCODER_ENABLE
bool encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) {
        // エンコーダー1: レイヤーで出力を切り替え
        if (layer_state == 0) {
            tap_code(clockwise ? KC_LEFT : KC_RIGHT);
        } else {
            tap_code(clockwise ? KC_UP : KC_DOWN);
        }
    } else if (index == 1) {
        // エンコーダー2: 音量調節
        tap_code(clockwise ? KC_VOLU : KC_VOLD);
    }
    return false;
}
#endif

#ifdef OLED_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    return OLED_ROTATION_180;
}

bool oled_task_user(void) {
    if (layer_state == 0) {
        oled_write_raw_P(bitmap_layer0, sizeof(bitmap_layer0));
    } else {
        oled_write_raw_P(bitmap_layer1, sizeof(bitmap_layer1));
    }
    return false;
}

// ビットマップデータ(image2cppで生成)
static const char PROGMEM bitmap_layer0[] = {
    0x00, 0x00, 0x00, 0x00, // ...
};

static const char PROGMEM bitmap_layer1[] = {
    0x00, 0x00, 0x00, 0x00, // ...
};
#endif

ビットマップ画像の作成

1. 画像の準備

128x32ピクセルの白黒画像を用意します。

macOSの場合:

convert -size 128x32 xc:white basic1.jpg

macOSプレビューアプリで画像を開き、鉛筆ツールでドット絵を描きます。

ビットマップデザイン

2. image2cppで変換

image2cppにアクセスし、画像をアップロードします。

設定:

  • Canvas size: 128x32
  • Background color: Black
  • Draw mode: Horizontal
  • Output: Arduino code array

3. keymap.cに埋め込み

生成されたHEXデータをコピーして、keymap.cに貼り付けます。


プログラムのinstall

1. ファームウェアのビルド

qmk compile -kb su120 -km vial

メモリ不足エラーが出る場合は、rules.mkでさらに機能を削減します。

2. Pro Microへの書き込み

qmk flash -kb su120 -km vial

プロンプトが表示されたら、Pro MicroのリセットボタンをGNDとRSTをショートさせて押します。

3. VIAL Web UIでの設定

VIAL Web UI

  1. ブラウザでvial.rocksを開く(Chrome推奨)
  2. デバイスが自動認識される
  3. GUIでキーマップを編集
  4. 変更は即座に反映(ファームウェア書き換え不要)

4. 動作確認

  • ロータリーエンコーダー1: スライドスイッチOFF時に左右カーソル、ON時に上下カーソル
  • ロータリーエンコーダー2: 音量調節
  • OLED: レイヤー切り替えで表示が変わることを確認
  • キースイッチ: 割り当てた機能の確認

カスタマイズのヒント

エンコーダー出力のカスタマイズ

keymap.cを編集することで、エンコーダーの機能を自由に変更できます。

レイヤー0の例:

  • ページスクロール(KC_PGUP / KC_PGDN)
  • 動画シーク(KC_LEFT / KC_RIGHT)

レイヤー1の例:

  • ズーム操作(Ctrl+Plus / Ctrl+Minus)
  • ブラウザタブ切り替え(Ctrl+Tab / Ctrl+Shift+Tab)

OLED表示のカスタマイズ

  • アニメーション: タイマーを使って複数のフレームを順次表示
  • ステータス表示: CapsLock、NumLockの状態表示
  • テキスト表示: oled_write_P()で文字列表示
  • スクロール: oled_scroll_left()などでスクロール効果

VIAL GUIでの設定

ファームウェアを書き換えずに、ブラウザから以下を設定できます:

  • キーマップの変更
  • マウスキー設定
  • レイヤー切り替え
  • タップ/ホールド動作

QMK / VIA / VIAL の比較

機能QMKVIAVIAL
GUIでキーマップ変更
カスタムキーコード○(SAFE_RANGE)
OLED対応○(固定表示)○(柔軟)
ロータリーエンコーダー○(QMK制御)
Web UIusevia.appvial.rocks
レイヤー数制限無制限最大4層無制限
セキュリティロック

VIALは、VIAの利便性とQMKの柔軟性を両立したファームウェアです。


参考リンク

総コスト目安
約¥3,500