USB2BT+

f:id:EdoBall:20211031125618p:plain

USB2BT+


Bit Trade One のBTOSショップでハロウィーンセール開催、ということで、USB2BT+

ADU2B02P USB2BT PLUS | Bit Trade One, LTD (bit-trade-one.co.jp)

を買って、長年使ってきたFilco Majestouch Miniに接続して試してみましたので、ちょっとご紹介します。

 

このキーボードは日本語キーボードですが、私は英語キーボード配列に慣れているので、OS(Windows/Mac両方に切り替え機を介して接続)には英語キーボードとして認識させる、というちょっと変わった使い方をしていました。(ハード的に日本語配列のノートPCで、英語配列っぽく使うためにこの手法(配列)に慣れた、というのがこんな使い方をしている大きな理由です。)

さて、右下のあたりに変な(汚いw)キーキャップが見えると思います。これは先日Twitterには書いたのですが、シフトキーとカーソルキー周りの配列を変えるため、3Dプリントしたものです。このMajestouch Mini、元の配列ではシフトキーが一番右にあって、右シフトが押しにくかったんですね。これを改善するため、キーキャップを3Dプリンタでプリントして、基板に物理パッチをあて

元は  \ 上 シ だったものを シ 上 上

    左 下 右        左 下 右 (「シ」=シフトキー)

と配列したものです。シフトキーの幅を右に広げるため、カーソルキーは軸から右にオフセットして配置してあります。押し心地は良くありませんが、そんなに多用するキーでもないので今のところそんなに問題は感じていません。ただまぁ、プリントがうまくいかず、だいぶ見た目が悪いのが難ですが。

 

この改造をした後で、USB2BT+が届いたので、さらに、USB2BT+のReplay Key機能を使って、EmacsっぽいControl-F -> 右などのカーソル移動や、無変換キーをEnter、変換キーをBackspaceなど、EdoBall KB-I で試した親指多用なキー配列を試してみたところ、なかなか使い勝手が良くなりました。作成したReplace Key機能のためのCSVファイルの内容は以下のとおりです。上書きしたControl + (X)はShift + Control + (X)に割り当ててみました。これでも実使用上はあまり問題なさそうです。Kanaキーによる変換モードの切り替えは、ブラウザなど、アプリによってはうまく動かない場合があるようです。

// Emacs Like key bindings          
version 1       // 常に1    
device_bitmap 7       // (7)全デバイス/(1)device1のみ/(2)device2のみ/(4)device3のみ
ctrl_capslock 0       // (1)CTRL/CAPSLOCK入れ替え
// 入力シフト キーコード 出力シフト キーコード    
convert[0] 0x00 0x8B 0x00 0x28 // 無変換   - Enter  
convert[1] 0x00 0x8A 0x00 0x2a // 変換     - Backspace
convert[2] 0x01 0x09 0x00 0x4f // C-f - Right  
convert[3] 0x01 0x05 0x00 0x50 // C-b -Left  
convert[4] 0x01 0x13 0x00 0x52 // C-p - Up  
convert[5] 0x01 0x11 0x00 0x51 // C-n - Down  
convert[6] 0x01 0x07 0x00 0x4c // C-d - Delete  
convert[7] 0x01 0x04 0x00 0x4a // C-a - Home  
convert[8] 0x01 0x08 0x00 0x4d // C-e - End  
convert[9] 0x03 0x09 0x01 0x09 // C-S-f - C-f  
convert[10] 0x03 0x05 0x01 0x05 // C-S-b - C-b  
convert[11] 0x03 0x13 0x01 0x13 // C-S-p - C-p  
convert[12] 0x03 0x11 0x01 0x11 // C-S-n - C-n  
convert[13] 0x03 0x07 0x01 0x07 // C-S-d - C-d  
convert[14] 0x03 0x04 0x01 0x4a // C-S-a - C-a  
convert[15] 0x03 0x08 0x01 0x4d // C-S-e - C-e  
convert[16] 0x00 0x88 0x04 0x35 // kana - Alt + 全角/半角

Replay Key機能だけならArduinoを使えば自分でも簡単に作れそうですが、USB Host Shieldが必要だったりで、結構材料費がかかりそう。なによりコンパクトで、デザインもカッコいいので買って満足な製品でした。(BT機能は今のところ使ってませんが、使うこともあるでしょう。)

A TRRS Cable w/ A OLED Display

最近はわりと快調に使えている、自作キーボード付きトラックボール EdoBall KB-I なんですが、面倒なのでLED等の表示機構を全く付けなかったところ、やはり、レイヤ等の状態の確認に少々不便を感じていました。

f:id:EdoBall:20210920132104j:plain

A TRRS Cable w/ A OLED Display

そんな折、遊舎工房で販売しているOLED DisplayI2Cで制御できると聞き、それなら元々、I2CでPro Micro間の通信をしている自作のKB-I には簡単に追加できるなと思い、このディスプレイ付きケーブルを作ってみました。やってみたら、I2C接続の分離型キーボードなら大概のものに応用できるし、わりと実用的なようなので、作り方を含めて紹介します。ちょっとコツが必要なところもありますが、自作キーボード(キット)を作成し、keymap.cをカスタマイズしたことがある方なら作成できると思います。費用も以下だと千数百円といったところで、手頃です。

 

材料

OLEDディスプレイモジュール(遊舎工房で販売)

https://shop.yushakobo.jp/products/oled

型番等はよく分かりません。コントローラにSSD1306を用いたものなら、Amazonなど、他から入手可能なものでも使えるかも?(自己責任でお願いします。)

 

TRRS(4極)ケーブルな百均イヤホン*2

(私はDAISOのこども用イヤホンを使用しました。TRRSプラグとリッツ線を別に買うより安価で作業が楽です。

f:id:EdoBall:20210920130005j:plain

こども用イヤホン



なお、間違って、最初こっちを買ったのですが、

f:id:EdoBall:20210920130114j:plain

スマートフォンイヤホンマイク

使えなかったので注意!)

 

筐体

私は3Dプリンタでプリントしましたが、アクリル板やプラ板、なんなら厚紙でもOKだと思います。

 

細いハンダ

リッツ線のハンダ付けのハンダは細い方がやりやすいです。

 

必要な工具

自作キーボード組み立てに必要な工具(ニッパー、ハンダゴテなど。)

テスター(クリップがあると楽です。)

 

あった方が良い工具

ワイヤストリッパ

(ニッパーでもいいんですが、こちらを使った方がイヤホンの被覆剥きの失敗が少なくなります。)

 

自動温度調節機能付きのハンダゴテ

(イヤホンに使われているリッツ線のハンダ付けに便利です。)

ホットボンド

 

作業

・まず、イヤホンのケーブルを端子から15〜30cm(お好みの長さ)に切ります。

・ワイヤストリッパを使って、切断端から10-12mmの長さで被覆を除去します。

リッツ線を傷つけないように気をつけてください。

リッツ線の先端部をハンダ付け(予備ハンダ)します。

私は370°Cの高めの温度で作業しました。(リッツ線の皮膜を溶かさないとハンダがのらなため、温度は高め、作業は素早く、の方が良いようです。)

・結線を調べる。

下準備

ここが超重要なところ、間違えやすいところでもあります。

まず、ご自身の分離型キーボードがシリアル接続ではなく、I2C接続されていることをマニュアルやビルドガイド等を参照の上、実機で確認してください。

I2C接続の場合、

https://docs.qmk.fm/#/feature_split_keyboard

にある、下図のように配線されているので、適宜テスター等を使って確認して下さい。

https://user-images.githubusercontent.com/2170248/92297182-92b98580-ef77-11ea-9d7d-d6033914af43.JPG

ケーブルの確認

次に、予備ハンダをしたTRRSケーブルをキーボード本体に繋ぎ、Pro MicroのSDA/(2/PD1), SCL(3/PD0), GND, VCCがそれぞれどの線に接続されているかテスターを使って確認します。

ちなみに、KB-Iのキーボード部はkeebio/Nyquistなので、Nyquistこども用イヤホンの場合は、

赤:GND、銅:VCC、青:SDA、緑:SCL

でした。プラグの端子との関係では、先端からSCL(3、緑)、SDL(2、青)、VCC(銅)、GND(赤)、でした。

このあたり、デファクトスタンダードな結線とかあるんですかね?あれば汎用品が作れるんですが。

f:id:EdoBall:20210920130327j:plain

こども用イヤホンのリッツ線

・調べた結線のとおり、ディスプレイの端子にリッツ線をハンダ付けする。

この時、1組のケーブルのリッツ線は、ディスプレイ側から基板の裏側にとおし、裏側でハンダ付けすると、ディスプレイ面を傷つける可能性が減ります。

温度は高め(私は370°Cにしました。)で、基板とリッツ線を温めて、手早くハンダをあて、リッツ線をなぞるようにハンダゴテを外すと(私は)うまくいきました。

とはいえ、リッツ線のハンダ付けというのは慣れるまでなかなか大変です。初めての方は、別な基板等で練習してからの本番に望むのが良いかも知れません。

もう1組のケーブルは、基板の裏側のハンダ付けした上にさらにハンダ付けします。

・筐体の組み込みと補強。

私は、3Dプリンタで、犬の形をテキトーに作って、ホットボンドで無理やり固定しました(全体的にテキトーで雑w)。この時、ハンダ付け部が断線しやすいので、ホットボンドで補強します。

f:id:EdoBall:20210920130042j:plain

裏側

・ソフトウェアの準備

ソフトウェアは、QMK Firmwareを使っている場合、ドキュメント (https://docs.qmk.fm/#/feature_oled_driver )のサンプルコードを適宜御自身の使っているレイヤーに合わせて変更すれば動くと思います。ただし、QMK Firmwareのバージョンがちょっと古い場合は、

Rules.mk や keymap.c で

OLED_ENABLE

ではなく、

OLED_DRIVER_ENABLE

として下さい。

・完成!

最後にテスターで結線が繋がれているか、ショートしていないかを確認して、TRRSケーブルとして接続します。

f:id:EdoBall:20210920130447j:plain

A TRRS Cable w/ A OLED Display

簡単、とまでは言いませんが、わりと気軽に作れるし、そんなに費用も掛からないので、皆さんもぜひ作ってみて下さい!

小変更

f:id:EdoBall:20210404223955j:plain

キーキャップも3Dプリンタで自作しました。

最近、キーキャップを3Dプリンタで作成するのが流行っているようなので、私もやってみた。とはいえ、単なる13x13x2mmの四角い板。軸はKailh Box Redのデータシート(

https://cdn.shopify.com/s/files/1/3099/8088/files/CPG1511F01S04-BOX_Red.pdf)を見て適当に。これ以上はないというぐらいに、シンプルなキーキャップ。でも、案外打ちやすい。黒青2色なのは、黒のフィラメントがなくなったため。あまりかっこよくないので、黒のフィラメントが手に入ったら作り直そうかと思ってはいる。

QMK FirmwareでのI2C通信

さて、また随分と間が開いてしまってすみません。引き続き仕事が忙しかった&年を取るとなかなか集中力も続かず、なかなか面倒な作業は進みが遅くなりがちです。

さて、今回は、ADNS-5050の使い方( https://edoball.hatenablog.com/entry/2021/01/24/154514 )の続き、I2C通信を使ってQMK Firmware(の動いているProMicro)にProMicro + ADNS-5050を追加する方法について見ていきたい。

I2Cは、QMK Firmwareでの左右分離型のキーボードの接続によく使われているので、概要をご存じの方も多いと思う。ざっくり言うと、バス型のデバイス間通信の規格で、各デバイスはアドレスを持ち、マスタデバイスからのクロックに同期して、マスタとスレイブ間でデータのやり取りをする、というものだ。詳しいことは良い解説ページが幾つもある(例えば、kurobekoblog.com)ので、そちらを参照してほしい。

QMK Firmwareで何かカスタマイズする時は、だいたいkeymap.cを修正すればいいようになっているけど、I2Cで他のデバイスと通信する際もkeymap.cを書き換えるだけで良いようだ。今回はポインティングデバイスの追加なので、追加する内容としては、I2Cとポインティングデバイス関係で、I2Cとポインティングデバイスを初期化し,あとは適宜I2Cを使ってデバイスからのデータを読み込み,ホストにポインティングデバイス関係のイベントを送る、というものだ。

以前書いたADNS-5050コントロール側のProMiciroでは

Wire.onRequest(requestEvent);

という関数で、リクエストイベント関数を登録し、

requestEvent()

関数内で

Wire.write(-mouse_dx);
Wire.write(-mouse_dy);

などとI2Cで送信するデータを登録している。

一方、読み出し側のQMK Firmware側では、メインループから読み出される関数であるpointing_device_task()関数内で、
status = i2c_readReg(I2C_SLAVE_2_ADDR, 0x1, buff, sizeof(buff), TIMEOUT);
といった風に読み出してやればいい。


もう少し、具体的に見てみよう。

#include QMK_KEYBOARD_H
#include <stdint.h>
#include "report.h"
#include "host.h"
#include "timer.h"
#include "print.h"
#include "debug.h"
#include "pointing_device.h"
#include "i2c_master.h"
#include "i2c_slave.h"

// I2C_SALVE_2(8bit address)
#define I2C_SLAVE_2_ADDR 0x20
#define TIMEOUT 100
static report_mouse_t mouseReport = {};

まずは、こののように,pointing_device.h, i2c_master.h, i2c_slave.h などのポインティングデバイスや,I2C関係のヘッダをインクルードしておく。前の記事でADNS-5050コントローラ側のPro Microのアドレスを 7ビットで 0x10と定義したが,QMK Firmware側では8bitで表すので、上の例では
#define I2C_SLAVE_2_ADDR 0x20
と定義している。

次に、ポインティングデバイスの初期化等:

void pointing_device_init(void){
  mouseReport.x = 0;
  mouseReport.y = 0;
  mouseReport.v = 0;
  mouseReport.h = 0;
  mouseReport.buttons = 0;
}

void pointing_device_send(void){
  host_mouse_send(&mouseReport);
  mouseReport.x = 0;
  mouseReport.y = 0;
  mouseReport.v = 0;
  mouseReport.h = 0;
}

pointing_device_task()関数の実装:

void pointing_device_task(void){
  uint8_t buff[4];
  i2c_status_t status;
  int8_t dX, dY;
  static uint8_t prev_buff_state = 0;
  static uint8_t prev_buff_state_touch = 0; 
  static int8_t v_movement = 0;
  static float v_movement_mag = 0.05;
  mouseReport.x = 0; // x方向移動量
  mouseReport.y = 0; // y方向移動量
  mouseReport.v = 0; // 縦スクロール量
  mouseReport.h = 0; // 横スクロール量

// I2Cからの読み出し。
  status = i2c_readReg(I2C_SLAVE_2_ADDR, 0x1, buff, sizeof(buff), TIMEOUT);

  if (status == I2C_STATUS_SUCCESS) { //   正常に読み出せ場合
    dX = (int8_t) buff[0];
    dY = (int8_t) buff[1];
    // ハードウェアスイッチ(3バイト目のデータのLSB)についての処理。
    // オンの時RAISEレイヤをオンにする。
    if (prev_buff_state != buff[2]) {
      if (buff[2] & 1) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
     }
    }
    prev_buff_state = buff[2];
    // タッチスイッチ1(4バイト目のデータのLSB)についての処理。
    // オンの時MOUSEレイヤをオンにする。
    if (prev_buff_state_touch != buff[3]) {
      if (buff[3] & 1) {
        layer_on(_MOUSE);
      } else {
        layer_off(_MOUSE);
      }
    }
    prev_buff_state_touch = buff[3];
    if ((buff[3] & 1) && ((buff[3] & 1<<1) == 0)) { // タッチスイッチ1がオンでタッチスイッチ2がオフの時、x,y 座標の移動量をマウスの移動量にする。
      // mouse x y movement
      mouseReport.x = dX;
      mouseReport.y = dY;
    } else {
      // それ以外の時(タッチスイッチ1がオフ、又は、タッチスイッチ2がオン)のときは、y座標の移動量を縦スクロールの移動量にする。
      v_movement += dY;
      if (abs(v_movement * v_movement_mag) >= 1) {
mouseReport.v = -(v_movement * v_movement_mag);
v_movement = v_movement + mouseReport.v / v_movement_mag;
      }
    }
    pointing_device_send();
  } else {
    // I2C 失敗。
  }
}

前の記事では、ADNS-5050 コントローラ側でのタッチスイッチ関係のコードを省略していたので、上のコードと対応していない点があるが、ざっくりこんな感じで、割と簡単にProMicroとI2C通信ができることがお分かりいただけたかと思う

QIDI TECH X-smartのビルドシートとレベリングペーパ

I2Cの記事を書こうと思いつつも、なかなかかけずにいるので、その前に小ネタ。

私はQIDI TECH X-smartという3Dプリンタを使っている。

http:// https://www.amazon.co.jp/dp/B078Q5HKLR/ref=cm_sw_em_r_mt_dp_AP9BGSFXJCHFPPB0XBQQ

マグネット式のビルドシートと専用のレベリングペーパが付いてきて大変便利なのだが私の使い方が荒いので劣化してきた。新しいのが欲しいと思い、本体を購入したamazon.co.jpを検索してみたところ、在庫切れ。そこで、QIDIのサポートにメールで連絡したら土曜日にもかかわらずすぐ返事が来て、eBayで買えるとのこと。(AliExpressは事前に検索していたのだけれど、eBayは盲点だった。)

https://www.ebay.com/itm/Platform-sticker-PC-board-Magnetic-for-QIDI-TECH-X-smart-3D-Printer-3-pcs-kit/333210500484?hash=item4d94e4bd84:g:-ZgAAOSwqu1atgsw

 https://www.ebay.com/itm/QIDI-TECHNOLOGY-leveling-papers-for-QIDI-3d-printer-One-Piece/333210480489?hash=item4d94e46f69:g:r1EAAOSwf4JdjaI6

2000年代初頭までは海外通販もよく使ってたけど、何時しかamazon.co.jpで事足りるようになり、著名なサービスではあるけれど、eBayはアカウントすら持っていなかった。まぁ、せっかくなので利用してみますかね。

Arduino Pro Micro + ADNS-5050によるトラックボールのコントロール

大分時間が空いてしまいまして、すみません。本業が忙しかったもので。
 
さて、今回は、Arduino Pro Micro  +  Arduino IDEを使用した場合のADNS-5050の使い方について簡単に触れてみたい。つまり、QMK Firmware でなく、Arduino のライブラリを使ってADNS-5050というマウスセンサをPro Microでコントロールして、USBマウスを作る方法だ。
 
Pro MicroとADNS-5050の物理的な接続はSPIという規格のインタフェースを用いて行う。(例えば、https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html  )ちょっと難しそうだけれど、幸い、 https://github.com/okhiroyuki/ADNS5050 とのライブラリを見つけた。これを使わせていただくと、そんなに難しくはなかった。
また、Arduinoのライブラリには、USBマウスのためのMouse.hなどというものがあるので、単にUSBトラックボールを作るだけなら、比較的簡単にできることが分かった。また、多少苦労したものの、Fusion 360 + 3Dプリンタでボールカップを作成し、Mouse.hを使ってマウスカーソルを動かすことができた。

さて、具体的なやり方を見ていこう。
まず、ハードウェア。ビットトレードワンの通販ページからデータシート https://btoshop.jp/wp-content/uploads/sites/3/2019/04/ADNS-5050.pdf を入手する。Fig. 8 にサンプルの回路図があるので、それに従って、Pro Micro と ADNS-5050を接続する。基本的に、ADNS-5050にLEDとコンデンサを繋ぎ、Pro MicroとSCLK, SDIO, NCSを接続すればOK。回路としてはそんな難しくはない。(実装は面倒かとは思う。ADNS-5050はピン間が2mmなので、ユニバーサル基板にはうまく収まらない。私は、100円ショップで買ったマウスを分解してプリント基板を加工して流用した。)
ソフトウェアは、
 
1. https://github.com/okhiroyuki/ADNS5050 のCode -> Download ZIP から、ライブラリをダウンロード。
2. Arduino IDE のスケッチ->ライブラリをインクルード->.ZIP形式のライブラリをインストール、でライブラリをインストール。
3. サンプルプログラムは以下のとおり。10番ピンがローだとUSB HIDとして動き、ロー以外ならI2Cで動作する。I2CのピンアサインはSDIO: 4, SCLK: 5, NCS: 6とした。

/* ADNS-5050 Controller

 for USB HID and QMK Firmware (I2C)
 Default I2C Address: 0x10(7bit) 0x20(8bit, QMK Firmware)
*/

#include <Wire.h>
#include <Mouse.h>

// ADNS-5050 ライブラリのインクルードが必要です。
// https://github.com/okhiroyuki/ADNS5050
#include <adns5050.h>

#define USB_HID_MODE_PIN 10 // LOW: USB_HID is active. Not LOW: i2c is available.
#define I2C_SLAVE_2_ADDRESS 0x10 // (7 bit version of I2C addresses)
#define LED_PIN  13

// The register map of ADNS5050
#define MOTION          0x02  //R   0x00
#define DELTA_X         0x03  //R   any
#define DELTA_Y         0x04  //R   any

// Mouse sensor object
ADNS5050 mouse(4, 5, 6); // (SDIO, SCLK, NCS)

unsigned long last_time; 
char mouse_dx = 0;
char mouse_dy = 0;

// I2C応答イベント
void receiveEvent(int s) {
  char c;

  while (Wire.available()) 
  {
    c = Wire.read(); // 1バイト(文字)読み出し
    if (c == 'a') digitalWrite(13, HIGH); // LED on
    if (c == 'z') digitalWrite(13, LOW);  // LED off
#ifdef DEBUG
    Serial.println(c, HEX);
#endif
  }
}

// I2C要求イベント
void requestEvent() {
  if (digitalRead(USB_HID_MODE_PIN) == HIGH) { // HIGH: I2C is active. USB HID is inactive.
#ifndef DEBUG
    Wire.write(-mouse_dx);
    Wire.write(-mouse_dy);
    Wire.write(0); // ハードウェアスイッチ用のデータフィールド(予約。現在未使用。)
    Wire.write(0); // タッチスイッチ用のデータフィールド(予約。現在未使用。)
    #endif
#ifdef DEBUG
    Serial.print(mouse_dx);
    Serial.print(", ");
    Serial.print(mouse_dy);
    Serial.print("; ");
#endif
    mouse_dx = mouse_dy = 0;
  }
}

void setup() {
  // シリアル通信のセットアップ
  Serial.begin(9600);

  // I2Cのセットアップ
  Wire.begin(I2C_SLAVE_2_ADDRESS);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  pinMode(USB_HID_MODE_PIN, INPUT_PULLUP);

  // マウスセンサのセットアップ
  mouse.begin();
  delay(100);
  mouse.sync();
  if (digitalRead(USB_HID_MODE_PIN) == LOW) {
    Mouse.begin();
  }
  last_time = millis();
}

void loop() {
  unsigned long curr_time = 0;
  unsigned long interval = 10;
  byte prev_button_state, prev_touch_button_state;

  curr_time = millis();

  // read the mouse sensor.
  if ((abs(curr_time - last_time) > interval) && (mouse.read(MOTION) != 0) ) {
    mouse_dx = mouse_dx + (char)mouse.read(DELTA_X);
    mouse_dy = mouse_dy + (char)mouse.read(DELTA_Y);
    last_time = curr_time;
  }

  if (digitalRead(USB_HID_MODE_PIN) == LOW) { // USB HID is active
    Mouse.move(mouse_dx, mouse_dy);
    mouse_dx = mouse_dy = 0;
  }
}

これで、マウスとしては動作すると思う。I2CについてはQMK Firmware側の対応もちょっと面倒なので、次回にでも。

小変更

(最近、本業が忙しくて更新が滞っています。すみません。)

本当は、ADNS-5050の使い方や、I2Cを使って、Nyquistにさらにもう一つProMicroを追加する方法を書きたいのだが、真面目に書こうとするとそれなりに準備が必要で、まだまだ書けていない状況。次の更新は12月後半になりそう。すみません。

 

 とか言い訳していてもつまらないので、ちょっとだけ見た目を変えたので紹介したい。

f:id:EdoBall:20201201231228j:plain

EdoBall KB-I(改)

Amazonをみていたら、導電性ゴムシートというものが有ったので購入し、以前の導電性テープと交換してみた。導電性テープに比べればギラつきが抑えられていて、多少は見た目もマシになったか?(私は機能を重視していて、見た目はあまり気にしていないのだが。)抵抗値は、導電性テープに比べればかなり高いが、それでもタッチセンサ用では問題になるレベルではない。

ついでに、今まで、不用意に押したくないキーは、3Dプリントした自作の背の低い小さなキーキャップを使っていたが、それを手持ちのDSAのものに変えてみた。どうも、キーの高さが違うとタイピングのリズムが狂うようで、ミスタイプが逆に増えてしまったためだ。私がOrthogonal配列に慣れたせいもあるかと思うが、交換前よりタイピングミスは減ったように思う。タイピングミスといえば、Orthogonal配列に慣れたとはいえ、5行のうち最上段(数字の行)は、通常のキーボードから1文字分ぐらい右にオフセットしているので、どうもタイプミスが多い。(2をタイプしようとして1をタイプしてしまうなど。)やはりこの辺は試してみないと分からないことも多い。

キーの機能別に、手持ちのキーキャップから色を変えてみたのだが、少々うるさい印象。どうしたものかと思案中である。