POSレジアプリ用のキーボードをつくった話

# 前書き

同人誌即売会でPOSレジアプリを使うにあたり、物理キーを押して入力したいなあと思ったので実践しました。
準備しなければならないもの・ことが多いので、暇な人、遊びたい人向きです。
概略しか書いていないので、不明点は適宜調べたり、筆者の知り合いの方は直接質問してください。

# やること概要

今回使いたいPOSレジアプリはバーコードリーダーからの入力を受け付けます。
ということは、HIDデバイスからの文字列の入力を受け付けているだけである、というのが今回のミソです。

つまり、「バーコード文字列(商品コード、たとえば0001や42)＋Enterキー」を入力できるHIDデバイスであれば、バーコードリーダーであるかどうかに関わらず、使用できるということになります。

今回はバーコードリーダーのかわりに、キーボードDozen0を使用することにしました。

Dozen0はキーを押すと、POSレジアプリで設定済みの「商品コード」と「Enterキー」を入力するように設定しました。

Dozen0は、12キーのマクロパッドで、USB2BT PLUSを使って無線化し、BluetoothでiPad上のPOSレジアプリと接続します。

接続図はこんな感じ↓

[Dozen 0]
↓
[Micro Bケーブル]
↓
[USB2BT PLUS]←[Micro Bケーブル]←[モバイルバッテリー]
↓
[Bluetooth]
↓
[iPad]
↓
[レジアプリ]

# 準備するもの

## 使うサービス

- POSレジアプリ（いわゆる、POSレジアプリ）
バーコードリーダーからの入力を受け付けているものであれば、大抵なんでもいいはずです。
サードパーティのキーボードのようなものを使用してよいアプリであるかは利用規約から各自ご確認。

- Remap（いわゆる、ブラウザから使えるキーボード設定ソフト）
https://remap-keys.app/
動作確認およびマクロ設定に使います。

- QMK MSYS(いわゆる、自作キーボードファームウェアのビルド環境)
https://msys.qmk.fm/
Bluetooth接続をする場合のマクロ設定に使います。

## 買うもの：

- iPad mini 1個（いわゆる、iPad）
今回使用するPOSレジアプリはiPad上で動くものです。使いたいアプリにあわせて、Androidでもなんでもどうぞ。

- Dozen0 1セット（いわゆる、自作キーボードのマクロパッド）
https://shop.yushakobo.jp/products/dozen0

- Cherry MX スイッチ 12個（いわゆる、キースイッチ）
https://shop.yushakobo.jp/collections/all-switches/products/cherry-mx

- DSA 無刻印キーキャップ 12個（いわゆる、キーキャップ）
https://shop.yushakobo.jp/collections/keycaps/products/dsa-blank-keycaps

- USBケーブル Micro B 0.8m 2本（いわゆる、Micro Bケーブル）
https://shop.yushakobo.jp/products/usb-cable-micro-b-0-8m?_pos=2&_sid=08aaa9d78&_ss=r

- MB-0157BK [モバイルバッテリー 2600mAh ブラック] 1個（いわゆる、モバイルバッテリー）
https://www.nakabayashi.co.jp/product/detail/44127

- EDT-FKEXM [キレイ貼り 宛名・表示ラベル[フリーカットタイプ] 20枚（1面×20シート）] 1シート（いわゆる、ラベルシール）
https://www.elecom.co.jp/products/EDT-FKEXM.html

- ADU2B02P USB2BT PLUS 1個（いわゆる、USB HID-Bluetooth変換アダプタ）
https://bit-trade-one.co.jp/product/module/usb2btp/


# 手順

## キーボードの準備

自作キーボードのマクロパッドDozen0を準備します。
遊舎工房で組み立て済み（半田付け済み）のキットが売っているので、不器用な筆者はそれを買いました。
https://shop.yushakobo.jp/collections/keyboard/products/3923?variant=42888566276327

届いたら、説明書どおりにキースイッチ、キーキャップなどをつけて、組み立てます。
キースイッチは基板に足をはめこむので、折らないように注意。
キースイッチをはめこんだ時点でRemapを使い、キースイッチがちゃんとはまっているか確認しましょう。
筆者はキーがひとつ反応せず、確認したら足を折り曲げて、基板と接触不良を起こしていました。

Dozen0のキーキャップにはラベルシールを貼り付けます。
ラベルは1cm四方くらいでよいです。
品名を書くのがいちばんわかりやすいですが、品番号とかでもなんでも可です。

## Dozen0のファームウェア設定

「商品コード」と「Enterキー」を入力するマクロを設定したファームウェアを、Doen0に書きこみます。

接続をBluetooth化しないのであれば、Remapのマクロ機能で設定可能ですので、以下のソースコードは不要です。
https://www.eisbahn.jp/yoichiro/2021/09/remap_macro.html

Bluetooth化すると、USBとBluetoothの速度差のせいでEnterキー連打とかの不具合が出るっぽいので、商品コードを一文字入力するごとにディレイ（スリープ）を入れないとならないから、ソースコードを書きました。

QMK MSYS環境の準備はWeb上の情報を参照する。
https://zenn.dev/diwamoto/articles/1943345edce519
https://bigotor.com/qmk-firmware/

QMK MSYS環境を準備したら、
qmk_firmware/keyboards/yynmt/dozen0/keymaps/mykeymap/keymap.cに以下の様に書く。

```
enum custom_keycodes {
    BASE = SAFE_RANGE,
    LOWER,
    RAISE,
    ADJUST,
    RGBRST,
    QMK001,
    QMK002,

（略）

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_BASE] = LAYOUT(
        QMK001, QMK002, QMK003, QMK004, QMK005, QMK006,
        QMK007, QMK008, QMK009, QMK010, QMK011, MO(_LOWER)
    ),
    [_LOWER] = LAYOUT(
        QMK013, QMK014, QMK015, QMK016, QMK017, QMK018,
        QMK019, QMK020, QMK021, QMK022, QMK023, QMK024
    ),

（略）

bool process_record_user(uint16_t keycode, keyrecord_t *record) {

switch (keycode) {
case RGBRST:
    #ifdef RGBLIGHT_ENABLE
    if (record->event.pressed) {
        eeconfig_update_rgblight_default();
        rgblight_enable();
        RGB_current_mode = rgblight_config.mode;
    }
    #endif
    break;
case QMK001: // "0" "0" "1" "1" リターンキー
    if (record->event.pressed) {
        SEND_STRING("0" SS_DELAY(50) "0" SS_DELAY(50) "1" SS_DELAY(50) "1" SS_DELAY(50) SS_TAP(X_ENTER));
    } else {
    }
    break;
case QMK002: // "0" "0" "2" "2" リターンキー
    if (record->event.pressed) {
            SEND_STRING("0" SS_DELAY(50) "0" SS_DELAY(50) "2" SS_DELAY(50) "2" SS_DELAY(50) SS_TAP(X_ENTER));
    } else {
    }
    break;

（略）
```

## POSレジアプリの準備
Dozen0のファームウェア設定で設定した商品コードを使用して、商品情報を設定する。

## 準備したものを接続する
上述の図のとおり、準備したものを接続する


以上で、大体完成。

# 振り返り

## マクロ機能

Remapのマクロ機能で簡単にすむと思っていたら、POSレジアプリがうまく動かない。
試しにパソコンとつないでテキストエディタに入力してみたら、どうも変なEnterキー連打が入る。

切り分けをしてみたところ、Bluetoothをはさむと挙動がおかしく、USB直結だと問題がない、とわかりました。
どうもこれは（多分）BluetoothとUSBの送受信速度の差のせいらしい。

Remapのマクロにディレイ機能あるかなあと淡い期待を持って確認しても、どうにもなさそう。
そんなわけで、黒い画面を見て、ソースコードを書く羽目になりました。
幸い筆者は職業C言語プログラマだったので、「あーはいはい、defineして……あー、はいはいそうかこれも先に宣言しないとね……」とすんなりコードが書けました。

マクロに入れたディレイが適切な時間かどうかは不明ですので、そこらへんは話半分の参考文献未満として読んでください。

## キーボード組み立て

半田付けなんて、学校の実験以来だよ、あのときも芋半田を量産したよ、ということで、目的を勘案し、素直に組み立て済みを買いました。（それなりの値段したけど、自分で下手につくって動かないよりはマシです）

今回は即売会で使うという目的上、小さめのキーボードにしたくてDozen0を選びました
Dozen0は名前のとおり12キーのマクロパッドですが、筆者のサークルは品数が12以上あるので、レイヤー機能を使って更に多くの品数に対応できるようにしてあります。
QMKに対応していてマクロ機能があれば、どのキーボードでもいいはずなので、自分のサークルの品数を考慮してお好きなものを選びましょう。
（さあ、自作キーボードの沼へ！）


# まとめ

即売会参加はまだなので、このキーボードが活躍するかは未知数です。
さいわいピコサークルなので、レジを打っている暇がない……ということにはならないはず。

実際に使ってみたら、それについても追記しておきたいと思います。

さて、半田付けなんてしたくないと言っていた筆者は自作キーボードセットとツールセットを買いました。
確実に沼に片足つっこみました。

この記事を読んで、自分もPOSレジアプリ用のキーボードをつくろうかなと思ったあなた。
さあ、あなたも自作キーボードの沼へどうぞ！