LoginSignup
9
5

More than 1 year has passed since last update.

プログラマブルテンキーを作る

Last updated at Posted at 2021-07-04

はじめに

BUFFALOのテンキーボードBSTK100ATmega32U4マイコンボードを組み込み、プログラマブルテンキーボードに改造する。

テンキーボードBSTK100を分解する

BSTK100は安価で、分解が容易、かつ、くさび型のため内部にマイコンを格納するスペースに余裕がある。
IMG_7634.png

本体裏側から2本のネジを外すだけで簡単に分解できる。内部のプリント基板もネジ1本で留まっているだけ。
IMG_7609.png
キートップは本体表面に留まっている。キーマトリクスフィルムは11ピンのフレキシブルケーブルでプリント基板のソケットに接続されている。
IMG_7615基板.png
基板にはCol/Row番号をシルク印刷したランドが用意されており、このランドにポリウレタン銅線を簡単にハンダ付けできる。
NumLockキーは基板右側のタクトスイッチ(K1)となっている。その右側にLED(D2)青色がある。このテンキーをWindowsPCで普通に使用すると、NumLockのオン/オフに連動してLEDが点灯/消灯する。

キーマトリクスを調べる

11ピンコネクタ(J2)の左から順に以下のCol/Rowとなっている。

1 2 3 4 5 6 7 8 9 10 11
Col0 Col1 Col2 Col3 Row0 Row1 Row2 Row3 Row4 Row5 Col4

また、キーマトリクスは以下の通り。

行\列 Col0 Col1 Col2 Col3 Col4
Row0 NumLock
Row1 - * /
Row2 7 8 9 BackSpase
Row3 4 5 6 +
Row4 1 2 3 Enter Tab
Row5 0 00 .

Row0がNumLockキーだけの割り当てのため、Row0をRow1に短絡させることで、1行減らすことができる。

行\列 Col0 Col1 Col2 Col3 Col4
Row0/1 NumLock - * /
Row2 7 8 9 BackSpase
Row3 4 5 6 +
Row4 1 2 3 Enter Tab
Row5 0 00 .

Col4もTabキーだけの割り当てのため、1列減らしたいところであるが、Row4のためそれができない(Row5なら減らせた)。結局、デジタルピンが10本必要となる。

LEDの配線引き出し

プリント基板上のLEDの配線を追っていくと、一方(赤線)は、1KΩのチップ抵抗を経由して5Vとシルク印刷されたランドに繋がっている。他方(青線)は、黒い樹脂で固められたマイコンに向かっていることがわかる。5V側がアノード、マイコン側がカソードだ。カソード側にはランドがないので、適当な場所のレジストを削ってはんだ付けする必要があるが、抵抗も含めてそのまま使える。
IMG_7615_基板l.png

ATmega32U4ボードのデジタルピンに対応させる

今回は以下のように割り当てることにする。

Col0 Col1 Col2 Col3 Col4 Row0/1 Row2 Row3 Row4 Row5 LED
RX TX D11 D10 D9 A0 A1 A2 MO MI SCK
0 1 11 10 9 18 19 20 16 14 15

テンキーのLEDはプログラムからON/OFFできるようにするため、アノード側はSCK(D15)へ、カソード側はGNDへ接続する。

USBケーブルの配線

基板左側にハンダ付けされているUSBケーブルを取り外し、ATmega32U4ボードのUSB端子に下図の通り結線する。
usb_4.png

ポリウレタン銅線で結線した様子。
IMG_7637.png

導通確認

Keypadライブラリを使用してテストプログラムを作成する。テンキーボードのキーを押したときにキートップ文字がシリアルモニターに出力されれば結線は正常。同時にテンキー上のLEDが点滅する。
Serial.printの代わりにKeyboard.printとかに変更すれば、一旦、元のテンキーの機能が復活する。

導通確認プログラム
#include <Keypad.h>

//digital pins
#define PIN_SCK (15)
#define PIN_MI  (14)
#define PIN_MO  (16)
#define PIN_A2  (20)
#define PIN_A1  (19)
#define PIN_A0  (18)
#define PIN_D9   (9)
#define PIN_D10 (10)
#define PIN_D11 (11)
#define PIN_TX   (1)
#define PIN_RX   (0)

#define LED_BLUE PIN_SCK

const byte ROWS = 5; // 5 rows
const byte COLS = 5; // 5 columns

// Define the Keymap
char keys[ROWS][COLS] = {
  {'n', '-', '*', '/', '\0'},  // n:numlock
  {'7', '8', '9', 'b', '\0'},  // b:backspace
  {'4', '5', '6', '+', '\0'},
  {'1', '2', '3', 'e', 't'},   // e:enter,  t:tab
  {'0', 'z', '\0', '.', '\0'}, // z:00
};

byte rowPins[ROWS] = { PIN_A0, PIN_A1, PIN_A2, PIN_MO, PIN_MI };
byte colPins[COLS] = { PIN_RX, PIN_TX, PIN_D11, PIN_D10, PIN_D9 }; 

// Create the Keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); //onboard RED led
  pinMode(LED_BLUE, OUTPUT); // tenkey BLUE led
  Serial.begin(115200);
}

void loop() {
  char key = keypad.getKey();
  if (key) {
    Serial.print(millis());
    Serial.print("\t");
    Serial.println(key);
    ledSign();
  }
  delay(10);
}

void ledSign() {
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(LED_BLUE, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(LED_BLUE, LOW);
}

ここまで来たら、各々のキーにお好みのキーコードやキーコードシーケンスを割り当てることで、自分専用のカスタマイズキーボードは完成だ。

128x32ドットOLED液晶ディスプレイモジュールを組み込む

このテンキーボードは内部スペースに余裕があるので、さらに128x32ドットOLED液晶ディスプレイモジュールも組み込んでみる。

I2C接続のため、ATmega32U4ボードのSCL/SDAに接続するだけ。ただし、ピンヘッダーが最初からハンダ付けされているので、これを取り外してポリウレタン銅線で結線する。
テンキーの上部にH12mm x W32mmの四角い穴を開けて裏から留める。BUFFALOの文字が一部欠けてしまうが仕方ない。
IMG_7631.png BSTK100WH_front.jpeg

綺麗に加工するのは難しい。歪になってしまった。
IMG_7639.png

このディスプレイに種々情報を表示することで、プログラマブルの幅が広がる。例えば、NumLockキーをモード切り替えのキーとして、N面のモードをサポートし、モードごとにキーとキーコードの対応をさせることで、19キー×N面=数十〜数百通りのキーコードを割り当て可能となる。これは一例なので、様々工夫することで、さらに使いやすいプログラマブルキーボードになるはずだ。

mv.gif
表示ライブラリはU8g2を使用した。

例として、

  • 10キーモード:キートップ文字通りのキーコードを送出
  • マウスモード:マウスを1ドッド単位で上下左右に移動。マウス右/左ボタンのロック。
  • カーソルモード:矢印キーコードを送出。Shift/Control/Altキーのロック。
  • Preset1:Windowsで便利なキーコードを送出
  • Preset2:Macで便利なキーコードを送出
  • Preset3:仕事で便利なキーコードを送出

電卓モードがあってもいいかも。電卓のように四則演算した結果をPCへ送出することも可能だ。実際、電卓モードを備えたテンキーも販売されている

おわりに

ディスプレイを付けたことで、プログラマブルの幅を広げることができた。実際に何をどう割り当てるかは、今後ゆっくり考えることにする。




<2021.9.28追記>
その後、マウス移動やカーソル移動系の機能は、こちらの回転型デバイスに役割を移したため、当記事のプログラマブルテンキーはディスプレイが必要なほど多機能である必要がなくなった。そのため、ディスプレイ無しのシンプルなものに作り直した。

モードは3つだけ。

  1. オリジナルテンキーのNumLockオン時のキーコード送出(LED点灯)
  2. オリジナルテンキーのNumLockオフ時のキーコード送出(LED消灯)
  3. PC普段使いで便利なキーコードを送出(LED点滅)

プログラマブルテンキーとしては、3.のモードだけとなり、使えるキー数はMax19と減ったが、普段使いとしてはこれだけあれば十分である。実際、半数ほどのキーが未割当のままだ。

以上

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5