ファミリーベーシックのキーボードをUSBキーボードにする



たまたま、[Enri's Home PAGE](http://www43.tok2.com/home/cmpslv/Famic/Fambas.htm)というページで、Enriさんという方がファミリーベーシックについて非常に詳細な調査をされていた。

キーボードに関する部分を見ていたら、最近のマイコンを使えばUSBキーボードにできるのでは？と思い、作ってみたところ、思ったより簡単に接続できた。（Enriさんの資料が完璧なので）


この記事は早い話が、「ファミリーベーシックのキーボードをパソコンに接続する」というもの。レトロなキーボードで最新のPCを操作したい、という好事家には楽しいかもしれない。
逆、[USBキーボードをファミリーベーシックのキーボードにする](https://qiita.com/BUBUBB/items/5e529ae68f9f83394a09)　というのもやってみた。「パソコンのキーボードをファミリーベーシックに接続する」というもの。そちらは一体どんな人が読むのかわからないが。

# 必要なもの

## ハードウェアと部品
- PC
- PIC書き込み装置 [PICKIT 4](https://akizukidenshi.com/catalog/g/gM-13337/)など。PICKIT3も使用できるが、MPLAB SnapはPIC18F14K50に非対応なので注意
- [秋月通商 PIC18F14K50使用ＵＳＢ対応超小型マイコンボード](https://akizukidenshi.com/catalog/g/gK-05499/) ￥800
- LED x 3 (CapsLock、ScrollLock、NumLockのLED用。家にあるやつでOK）
- 330Ω抵抗器　x 3　（家にあるやつでOK）
- タクトスイッチ（オプション） x 1 (なんでもよい。[こんなの](https://akizukidenshi.com/catalog/g/gP-08214/)）
- 10KΩ抵抗器　x 1 （オプション）　タクトスイッチを付けない場合には不要

## ソフトウェア
- [MPLAB X IDE](https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide) (無料) ソースからビルドする場合。
- [MPLAB XC8 コンパイラ](https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers) (無料) ソースからビルドする場合。ダウンロードとインストール方法は[googleなどで検索](https://www.google.com/search?q=mplab+xc8+インストール)するとたくさん出てくる。
- [MPLAB X IPE]([MPLAB X IDE](https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide) (無料) バイナリの書き込みだけの場合。インストーラーは MPLAB X IDEと同じ。インストール中に Select Programs の部分で選択できる。


# キーボードとマイコンを接続する方法

キーボードとマイコンを接続するには、いくつか方法がある。それによって必要な部品が異なる。任意の方法を使用する。

## キーボードに傷をつけない方法

キーボードから出ているコネクタを使用して接続することで、「貴重な文化財」のファミリーベーシックキーボードに傷をつけずに接続できる。

### DSUBコネクタを使用

キーボードから出ているケーブルの先には、１５ピンのコネクタがついている。　これは、無理すればDSub15ピンのオスコネクタに接続できる。 ただし、微妙にピッチが違うので、かなり無理して押し込む感じになってしまう。
[Dサブ15ピンコネクタ](https://akizukidenshi.com/catalog/g/gC-00025/)　

### ピンヘッダを使用

ピンヘッダを使用して接続することもできる。両端ロングのピンヘッダを１ピンごとに分割し、キーボードコネクタに差し込む。反対側（両端ロングなので十分な長さがある）を、コネクタ付きのジャンパーワイヤーに差し込みマイコンに接続する。

[両端ロングのピンヘッダ](https://akizukidenshi.com/catalog/g/gC-09056/)
[コネクタ付きのジャンパーワイヤー](https://akizukidenshi.com/catalog/g/gP-03474/)

私は、開発中にこの方法でブレッドボードと接続して使用した。

<img width=40% alt="con1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/64f62d00-6791-ba2c-3215-44fe8a37bfe4.png"/]>

写真を見るとわかるとは思うが、2.5mm ピッチのピンヘッダでも「ぎゅうぎゅう」で今一つみっともない状態になる。

## キーボードを改造する方法

### ケーブルを切断

いまさらファミコンにキーボードは接続しない、という場合、ケーブルを切ってしまって、マイコンに接続することもできる。ケーブルは10本出ており、それぞれ抵抗のカラーコードと同じになっているので、特に迷うことはない。これが最も簡単な接続方法だと思われる。

切断してピンヘッダと接続し、ピンソケットでつないだのが下のような状態。
<img width=40% alt="con2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/25c5eddd-4125-f3fb-34cd-839a9a4f648a.png"/>


### 2.0mmピッチのピンソケットを使って基板と直接接続する
ケーブルを切るのが嫌、さらに無理やり１５Ｐのコネクタを差し込むのが嫌、という場合、キーボードを分解し、基板のJ1についているコネクタを外して、2mmのピンソケットを差し込んで使用することもできる。

[2.0mmピッチピンソケット 10ピン](https://akizukidenshi.com/catalog/g/gC-03870/)
[2.0mmピッチピンソケット 20ピン](https://akizukidenshi.com/catalog/g/gC-08591/)

P1は11ピンだが、11番のピンはそのままキーボードのGNDに接続されているので10ピンで足りるかもしれない。

雑で申し訳ないが、下の写真は、試しに作ってみたもの。20ピンのソケットを切断して11ピンにしてある。一番下は、GNDラインとしてKBユニットに接続する。（マイコン側には接続しない）2.0mmではんだ付けだと強度が不安なので、UVレジンで固めてある。

<img width=40% alt="con.6png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/3d6e9172-3fc4-00a2-e05a-f3336159b7c4.png">

この方法は、ケーブルはそのまま無傷で手元に残り、さらにコンパクトになる（黒くて太い線がキーボードから出ない）のが便利。一方、2.0mmのピンヘッダは手元にない人が多いので買わないといけない。さらにキーボードの分解が必要。（といってもねじを外すだけなので簡単だが）
古いハードウェアなので、ケーブルを抜いた後のピンが劣化しており接触に不安が残る。ペーパーで磨くなどしておいた方が良いかもしれない。

最終的にキーボード内にマイコンを組み込む際には、この方法を使用した。


# 接続端子の説明と接続方法

## キーボード
キーボード側は、コネクタを使用して接続する場合と、本体内の基板にピンソケットを接続する場合がある。それぞれの部分を参照する。

### キーボード本体内基板

キーボードのふたを開けると下のような基板が本体下側に縦に差し込まれている。

<img width=60% alt="con3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/3d5065ab-01b5-d374-0f30-3aaeb7a3e792.png"/>

基板内、P1と書かれている部分が、ファミコン本体への接続ケーブルの部分。（写真では外してある）

主要な部品とコネクタの配置は次のようになっている。P2、P3はキーボードユニットに接続されており、取り外す必要はない。
11番ピンは、黒いケーブルには接続されておらず、キーボードユニットのシャシーにアースされている。

<img width=60% alt="con4png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/2ccaa63a-c3c4-e3bd-2856-e5643ee90127.png" />

このP1は、2mmピッチになっているので[2.0mmピッチピンソケット 10ピン](https://akizukidenshi.com/catalog/g/gC-03870/)を使って独自のケーブルを作ることができる。

### キーボード外部端子

キーボードの外部端子を、外側から覗き込んだ状態は次のようになっている。
![con5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/e75b849d-a05f-0842-3faa-9c71873d9693.png)


## マイコン

# PICモジュール側の端子説明

今回使用する、秋月のPIC18F14K50使用USB対応超小型マイコンボードは、チップ単体に12MHzのXTALやUSBコネクタなど必要な部品をセットにしてすぐに使えるようにしてある。

欠点としては、USBがミニUSBになっている点。せめてmicroUSBになっていてほしかった。[PIC18F4553](https://akizukidenshi.com/catalog/g/gK-06720/)バージョンはmicroUSBになっているので、自分でビルドするときはこちらを選んでも良いかもしれない。

もしくは、[DIPパッケージ](https://akizukidenshi.com/catalog/g/gI-03031/)もあるので、これにXTALやUSBコネクタをつけても良い。（USBではタイミングの許容幅がシビアなところがあるので、内臓オシレータでは不安定になるかもしれない）

![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/a548f1d9-7861-1118-c603-7e2e10fd09a1.png)


## 接続に関する一覧表

本体基板、ケーブル、DSUB、マイコンの接続は次のようになる。


|基板P1|ケーブル色|DSUB端子番号|マイコン側端子|備考|
|---|---|---|---|---|
|1|茶|1|GND|GND|
|2|赤|4|RC3|データ４|
|3|橙|5|RC2|データ３|
|4|黄|6|RC1|データ２|
|5|緑|7|RC0|データ１|
|6|青|10|RB7|キーボード/CMD切り替え。そのままV+に接続しても良い|
|7|紫|11|RB6|ビット上位下位切り替え|
|8|灰|12|RB5|カウンタリセット|
|9|白|13?|-|詳細不明。KBを使うには未接続でもよい|
|10|黒|15|V+|VDD。5Vだが、ICの仕様上は3.3Vでも行けそう



# 全体の回路図

回路図というほどではないが。


## 15ピンで接続する場合

<img width=100% alt="sch1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/f490f7ec-b6b0-99fd-4be8-8293e6206eea.png" />

右側のJ1は、15ピンDSUBを前提にしている。

３つのLEDは、CapsLock/ScrLock/NumLockボタン用なので不要なら接続しなくてもよい。特に、NUMLockは、キーを割り当てていないのでつける意味はあまりないと思われる。

タクトスイッチはデバッグ時に使用した。今後何かに使えるかと思って残してあるだけなので接続しないならしないでもよい。


最終的に作成したものは下のように、LEDとスイッチは別の基板として、メイン基板と離して配置している。

<img width=100% alt="sch2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/796c9aab-2412-3568-0ff6-4fd941b972dc.png">
もちろんこれは、キーボドの中に組み込む都合上の話で、回路としては変わらない。

# ソフトウエア

ソフトウエアは、ソースコード、バイナリとも githubで公開している。
[FamKB-18F14K50](https://github.com/HisayukiNomura/FamKB-18F14K50)

## バイナリを直接書きこむ場合

ソースコードなどには興味がなく、バイナリを直接書き込みたい場合　[GitHubのリリースダウンロード](https://github.com/HisayukiNomura/FamKB-18F14K50/releases) から、.hex　のファイルをダウンロードしてMPLAB X IPEから書き込みを行う。

マイコンのUSBケーブルを外し、PICKitをマイコンのISCP端子に接続、MPLABX IPEを起動する。起動したら、Family/Deviceを操作して、ターゲットデバイスにPIC18F14K50を選択する。ToolにPickitを選択、Connect ボタンを押す。

<img width=50% alt="ipe1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/f3a0788a-0085-4732-8ce3-8df894e93d20.png"/>

hexファイルを選択してProgramボタンを押す。
<img width=50% alt="ipe2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/78e705be-d998-4a3b-c17f-8f18e3809a8f.png"/>

書き込みが成功すると、

```
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x2d7f
configuration memory
Programming/Verify complete
2022-04-16 09:53:30 +0900 - Programming complete
```
などと表示される。




## ソースコードからビルドしたい場合

多くの人がこちらだと思われる。この場合、ビルド方法などを書いても意味がないので、ソースコード中の関連個所の説明だけにしておく。特に、キーのマッピングを自分好みに変えたい、などの要望があると思う。

[FamKB-18F14K50からダウンロード](https://github.com/HisayukiNomura/FamKB-18F14K50)

プログラムはXC8コンパイラ用になっている。

### ディレクトリごとの機能

|ディレクトリ|ファイルの内容|
|---|---|
|/|主要な処理|
|/MCC Generated Files|MCCが生成したコード。主にGPIOのアサインやヒューズ設定など|
|/usb|Microchip社のサンプルから取り出したusbスタック|

ルートディレクトリにあるもの以外は、特に注意する必要はない。というか私にもどんなことをしているかわからない。

### ルートディレクト内のファイルと機能

ルートディレクトリ内にある主な処理は次の通り。

|ファイル|機能|
|---|---|
|app_device_keyboard.c|Microsoftのサンプルを一部修正したもの。USBを使って、ホストと通信する処理が実装されている。APP_KeyboardTasks関数が、メインループの中で繰り返される。|
|FamKey.c|キーボードのマトリックスをスキャンして、USBのキーコードに変換、APP_KeyboardTasks関数に引き渡す。|


# キーマップ

ファミリーベーシックのキーボードは、キーの数が少ないのと、自分の好みに合わない部分があるので、一部変更している。キーの絶対数が足りないため、「カナ」キーをファンクションキーとして、「カナ」を同時に押すことで異なるキーコードが発生するようになっている。例えば、ESCキーは、通常では「TAB」キーを発生し、「カナ」＋「ESC」で[ESC」キーを発生させる。

これは、TabキーがQの隣にあるものだ、という考えなので、それに基づいている。

通常状態のキーアサインは次の通り。表示がないもの（一般キー）はキートップの表示と同じ。

![kb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/801c8338-1e22-fa33-df71-156dacc536b6.png)

Fnキー同時押しの場合

「かな」キーを押しながらの場合、下のようなキーマップになっている。　ALT/CTRLについては、左右を逆にしてある。Windowsキーとアプリケーションキーは、どうでもよくなってきたじゃなくもう場所がなかったので、やむなく「X」と「ン」キーにしてある。

![kb3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/c2969c0d-94a7-6ac1-baa5-6fe254bb09be.png)


## キーマップの変更

キーマップ（ファミリーベーシックキーボードのXXを押したら、USBキーボードのXXが押されたと変換する）は、FamKey.c内で定義されている、次の2つの配列。

通常状態
```
uint8_t key_usage[72] = {
  0x41,0x28,0x30,0x32,0x35,0xff,0x89,0x2a, // F8  RET   [   ]   FUNC  R-SFT ￥ STOP
  0x40,0x2f,0x34,0x33,0x87,0x38,0x2d,0x2e, // F7   レ   モ  ＊    ン    ヲ  ラ   リ
  0x3f,0x12,0x0f,0x0e,0x37,0x36,0x13,0x27, // F6   o    l   k    ,     .    p   0
  0x3e,0x0c,0x18,0x0d,0x10,0x11,0x26,0x25, // F5   i    u   j    m     n    9   8
  0x3d,0x1c,0x0a,0x0b,0x05,0x19,0x24,0x23, // F4   y    g   h    b     v    7   6
  0x3c,0x17,0x15,0x07,0x09,0x06,0x22,0x21, // F3   t    r   d    f     c    5   4
  0x3b,0x1a,0x16,0x04,0x1b,0x1d,0x08,0x20, // F2   w    s   a    x     z    e   3
  0x3a,0x2B,0x14,0xff,0xff,0xff,0x1e,0x1f, // F1 ESC    Q  CTR R-SFT  GRPH  1  2
  0x39,0x52,0x4f,0x50,0x51,0x2c,0x4c,0x49 // CLR ↑   →   ←   ↓   SPC  DEL INS
};
```

拡張状態（「カナ」キーを押しながら押された時に発生するキーテーブル）
```
uint8_t key_usage_EXPKey[72] = {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x35, // ×　 ×   ×   ×   FUNC  R-SFT× 漢字
  0x48,0xff,0xff,0xff,0xff,0x65,0xff,0xff, // PUSE ×   ×   ×   APL   ×   ×  ×
  0x47,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // SLCK ×   ×   ×   ×    ×   ×  ×
  0x46,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // PRSC ×   ×   ×   ×    ×   ×  ×
  0x45,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // F12  ×   ×   ×   ×    ×   ×  ×
  0x44,0xff,0xff,0xff,0xff,0xff,0xff,0xff, // F11  ×   ×   ×   ×    ×   ×  ×
  0x43,0xff,0xff,0xff,0xe3,0x39,0xff,0xff, // F10  ×   ×   ×  Win    CAPS ×  ×
  0x42,0x29,0xff,0xff,0xff,0xff,0xff,0xff, // F9   TAB  ×　 CTR L-SFT  GRPH ×  ×
  0x8b,0x4b,0x4d,0x4a,0x4e,0x2c,0x8a,0x88  // CLR  PU   END  HOME PDN   SPC  無変 変換
};
```

このテーブルを書き換えると、発生する発生するキーコードを変更することができる。


## 変更例 - 簡単なキーの追加や変更

たとえば、現在なにも割り当てられていない、Fnキー＋[ENTER]を押すと、テンキーの[ENTER]が押されるようにしてみる。

まず、Enriさんのページで、[キーボードのマトリックス](http://www43.tok2.com/home/cmpslv/Famic/Fcbmat.png)を確認する。ENTERキーは、１行目、２カラム目になっている。
ソースコードで、「かな」キーを押しながらのキーマップを確認すると、

```
uint8_t key_usage_EXPKey[72] = {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x35, // ×　 ×   ×   ×   FUNC  R-SFT× 漢字
  0x48,0xff,0xff,0xff,0xff,0x65,0xff,0xff, // PUSE ×   ×   ×   APL   ×   ×  ×
　　　：
```
となっており、１行目２カラム目は0xFFになっており、何もキーキーコードを発生させていない。

次に、[USB HID to PS/2 Scan Code Translation Table](https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf)　を参照し、テンキーのENTERのキーコードを確認する。"Keypad Enter" は、HID Usage Page が 0x07、HID Usage IDが0x58になっている。このプログラムでは、ページ0x07が固定なので、0x58を配列の１行目、２カラム目に指定する。

```
uint8_t key_usage_EXPKey[72] = {
  0xff,0x58,0xff,0xff,0xff,0xff,0xff,0x35, // ×　 KP-Enter  ×   ×   FUNC  R-SFT× 漢字
  0x48,0xff,0xff,0xff,0xff,0x65,0xff,0xff, // PUSE ×   ×   ×   APL   ×   ×  ×
　　　：
```

## 変更例 - 修飾キーの機能変更
ほかのキーと同時に押されることを前提としている、SHIFTやALTキーなどを発生させるのは、この配列要素を変更するだけでは対応できない。こうしたキーは、Input Report(デバイス→PCに送られる通信）では、独立したキーコードではなく、マスクビットとして送信されるため。　FamKey.h　を参照すると、これらのキーのマスクが定義されている。

```
#define ATBKEY_LEFTCTRL         0x01
#define ATBKEY_LEFTSHIFT        0x02
#define ATBKEY_LEFTALT          0x04
#define ATBKEY_LEFTGUI          0x08
#define ATBKEY_RIGHTCTRL        0x10
#define ATBKEY_RIGHTSHIFT       0x20
#define ATBKEY_RIGHTALT         0x40
#define ATBKEY_RIGHTGUI         0x80
```
ここに定義されているキーについては、キーマッピングのテーブルで発生させることはできない。ATBKEY_LEFTGUI/ATBKEY_RIGHTKEYは、Windowsキー（macの場合Commandキー）。

修飾キーについてはFamKey.c内のvoid ProcessMatrix関数で処理を行っている。

```
    //
    // 修飾キーの処理
    //
    if ((Buf[7] & 0x08) != 0) {       // CTRL→左CTRL
        mod |= ATBKEY_LEFTCTRL;
	}
  	if ((Buf[7] & 0x10) != 0) {       // 左Shift→左Shift
        mod |=ATBKEY_LEFTSHIFT;
    }
    if ((Buf[0] & 0x20) != 0) {       // 右SHIFT→右Shift
        mod |= ATBKEY_RIGHTSHIFT;
    }
    if ((Buf[7] & 0x20) != 0) {       // GRAPH→左ALT
        mod |= ATBKEY_LEFTALT;
    }
```

Buf[7]は、キーマトリックスの8行目で0x08はコントロールキーに該当（F1がLSBなので)する。　``if ((Buf[7] & 0x08) != 0)`` は、CTRLが押されていたら、という条件式となる。その下の　``mod |= ATBKEY_LEFTCTRL;`` で、USBのInput Reportにコントロールキーの押下を伝えている。

すでに実装済みだが、その下には Fnキーを押しながらCTRLを押すと、右CTRLを発生するような処理が追加されている。上の基本的な処理は変更せず、一度セットされたmod変数を、Fnキーの値を見て変更させている。

```
    if ((Buf[0] & 0x10) != 0) {       // カナキーと修飾キーの同時押しを処理する。
        if (mod & ATBKEY_LEFTCTRL) {        // かな＋CTRLで、右CTRLとする
            mod &= ~ATBKEY_LEFTCTRL;
            mod |= ATBKEY_RIGHTCTRL;
        }
        if (mod & ATBKEY_LEFTALT) {        // かな＋ALTで、右ALTとする
            mod &= ~ATBKEY_LEFTALT;
            mod |= ATBKEY_RIGHTALT;
        }
    }
}
```

# プログラムの変更

## タイミング

キーボードが作られた時代と比べ、マイコンとはいえファミコンのCPUに比べて圧倒的な速さになっている。そのため、適当な待ち時間を入れないと、キーボードを正しく読み込めないようだ。

今回、試行錯誤で適当な値を決めているが、状況によっては変更が必要かもしれない。

プログラム中では、FamKey.c内で２つの待ち時間を定義している。この値は変更できる。 DELAY_SHORTはリセット信号のストローブに、DELAY_LONGは上位下位ビット切り替え時（4019へ出力した後）などに指定している。

```
#define DELAY_LONG  __delay_us(50);
#define DELAY_SHORT __delay_us(10); 
```

また、キーの読み込み時には``__delay_us(200);`` として、長い待ち時間を挿入しているが、不要かもしれない。

使い勝手の問題もあるので、この辺は調整が必要になると思われる。

## ボタン
現在、ボタンが１つあるが、使用していない。
このボタンは、RC4に接続されており、 famkey.cの ``bool isTestButton(void)`` で値を読み込むことができる。

app_device_keyboard.c　の　APP_keyboardTasks 関数内の次の個所が、インプットレポートを送信している部分。最初のifで、キーが押されているかを判断している。このif　に elseを用意し、isTestButton　のチェックを行い適当なキーのインプットレポートを作成してしまえば、ボタンを押すことで任意のキーシーケンスを送信できる。

```
        if (KeyRepIdx != 0) {
            // アトリビュートキーを処理            
            inputReport.modifiers.bits.leftControl = (modifier  & ATBKEY_LEFTCTRL)  ? 1 : 0;
            inputReport.modifiers.bits.leftShift = (modifier & ATBKEY_LEFTSHIFT)  ? 1 : 0;
　　　　　：
　　　　　：
        }
```        

# 完成したキーボード


あとは、箱に入れて完成となる。キーボードは無駄に大きいが、中は意外と狭く、あまり大きなものを置くことができない。また、補強のためかかなりの仕切り壁が入っている。さすが任天堂・・・
完成した基盤を入れたり、USBコネクタをつけるためにかなり中の壁を切る必要があった。

## 外観

最終的には、外観を大きく損ねずに組み付けることができた。

<img width=50% alt="prod1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/0fe1a7af-96fd-b783-cb67-7aaac6ea0081.png">

CapsLock、ScrollLock、NumLockボタンはここに配置した。HVC-007の上に配置したかったが、キーボードユニットの端子類があるためこの位置が限界だった。　キーボード中央に配置しようかと思ったが、やはりこれらのランプは右上に欲しい。

<img width=50% alt="prod2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/9e9727f1-1b54-5a84-db3d-8a97a0a61222.png">

本体横には、PICのICSP端子を出してある（ピンボケで申し訳ない）。PIC18F14K50は、ピンコネクタが出ているが、ピンソケットを２つ向かい合わせにしてはんだ付けして、メスーメスのピンソケットを作ってPICに接続、筐体外側にピンソケットを出している。これも美観の問題。PICKITに接続するときは、ロングのピンコネクタを使って接続する。

<img width=50% alt="prod3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/2d1c825a-1809-2f6c-eabd-a170fd6b833d.png">

本体後ろには、未使用のボタンとUSB端子を出している。PIC18F14K50は、MiniUSBなので今時とはそぐわない。また、本体からケーブルを出すのもカッコ悪いので、本体にはmicro USB端子を出している。

<img width=50% alt="prod3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/d44cf19d-5f23-289a-4ce3-9be4fb38ae2d.png">

本体の、黒太ケーブルが出ていた穴に[USBmicroBコネクターパネル取付キット](https://akizukidenshi.com/catalog/g/gK-13272/)をはめ込んでいる。サイズはちょうどいいが、当然大きな丸穴なので余ってしまう。目隠しのパテでもそのうち埋めようか。

ボタンはどこにつけようかと思ったが、キーボードのカセット出力の穴につけた。キーボードの基盤の音声出力コネクタを外し、空いた空間にスイッチだけを付けた基板を接着してある。

この位置にボタンがあるだけで、なんとなくボタンの機能は、リセットボタン、という感じの位置になってくる。USBでリセットボタンは無理なので、スリープボタンなどに割り付けても良いかもしれない、と少し思った。


## 組み付け時の注意
組み付け時、キーボードユニットのケーブルがはんだ付けされている。

![kbunit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/afd68e34-caeb-36ec-3963-df47747874de.png)

この部分が劣化しており非常に弱くなっている。少し無理をすると簡単に切れてしまうので注意が必要。はんだ付けすれば、直すのは簡単だが、２本同時に切れるとつなぎ方がわからなくなってしまう。（実話）　

最初に写真を撮っておくことをおすすめする。　また、一度、全部外して綺麗にして、再度はんだ付けするのも良いと思う。

ピンの配置は、キーボードのシートを上に見た（上の写真の方向）時、次のようになる。キーボードの底面側、とは、キーボードの赤い底面の方で、キーボードのネジを外した時に見える側。接続先は、キーボード内基板の端子番号。


|接続先|表裏|1|2|3|4|5|6|7|8|9|
|---|---|---|---|---|---|---|---|---|---|---|
|P3|底面側(端子数８)|緑|黄|茶|灰|黒|赤|橙|青|-|
|P2|表面側(端子数９)|青|緑|黄|茶|赤|橙|黒|白|灰|

<img width=60% alt="con4png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/2ccaa63a-c3c4-e3bd-2856-e5643ee90127.png" />


# 使用感
この記事で実際にファミリーベーシックのキーボードで記事を書いている。IMEのボタンに慣れてないことなどを除けば、大きな支障はないように思う。
[カナ]キーをFnのようにつかうのは動作するが、いつもの調子で素早く操作すると、Fnボタンが押されていない状態のキーが出てしまう。ゆっくり操作すれば動作するので、今のところ放置しているが、バグかもしれないし、バグでないにしても、改良の余地がありそうだ。チャタリングが原因なのかもしれない。


USBの規格にのっとっているので、基本的にはなんにでもつながるはずだ。手元にあるノートPCのUbuntu、Raspberry pi 、Windows11には接続できている。ハブ経由での接続も問題ない。

初見でメカニカルキーボード？と思ったが実際にはメンブレンだった。ただ、メンブレンとはいえ一つ一つにスプリングが入っており、最近の安物キーボードより打ちやすい気がする。スペースバーもスタビライザーが入っているので、ぐらつきも少ない。

「子供のおもちゃ」と侮ることはできない品質だと思う。

キーの数が少ないが、SHIFTキーやEnterキーはきちんとした大きさになっている。最近の省スペースキーボードは右シフトが小さいなど不良品が多いが、癖のない配置で良いと思う。

任天堂の昔の製品は子供向け製品を子供向けに作っていない。大人の評価に耐える品質だと思う。

キーの高さが高く、パームレストなどがないと長時間のタイピングは辛い。また、今回初めて知ったが、見た目は普通のキーボードだが、キーの大きさが小さく、標準のキーボードを使っているとその点が使いにくかった。子供の手に合わせたのだろう。一番大きな不満はその点だ。

ただ、今使っている　FILCOのメカニカルキーボードをやめて、これを常用するか？と聞かれれば、100% お断りする。

次は、USBキーボドをファミリーベーシックに接続できるようにしようか…　その前に、ファミリーベーシックカートリッジを入手しないといけない。キーボードはヤフオクなどで普通に入手できるが、カートリッジは少々高いようだ。電池部分が液漏れしていたら嫌だし、バージョンも３つあるらしいので最新が欲しい。悩みどころだ。

# プリント基板
テスト実装時はユニバーサル基板で作ったが、組み付けに苦労したので片面基板にした。

![pcb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/c394753b-7ca5-37ff-7fef-e6e9a1ee7f6b.png)

左がメイン基板、中央がLED、右がスイッチ用。いずれもトップビュー。

kikadのプロジェクト、famkb.zipは[githubからダウンロード](https://github.com/HisayukiNomura/FamKB-18F14K50/releases/latest)できる。

# 実装の状態

最終的に、片面基板にしてキーボードに入れなおした。昔から図画工作の成績が悪かったので、実に汚くて申し訳ないが、実際に組み付ける奇特な人（しかも私と同類の手先がぶきっちょな）がいるかもしれないので、恥を忍んで御開帳。

全体的な配置は次のようになっている。キーボード本体からの１７本の線がキーボード基板に接続されている。ふたを閉めるとき、この１７本の線に力がかからないように捌きながら占める必要がある。上側（白い方）のふたには、仕切りの板があり、これがキーボードとの接続線を巻き込むと、キーボードにはんだ付けされている部分は非常に簡単に切れる。切れてもつなぎなおせるが面倒になる。

<img width=50% alt="kb1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/341c3ec5-a8f7-c90d-ec3c-5ecb99e3f572.png"/>

メイン基板周りの配置は次のようになっている。メイン基板は、両面テープで下の板に固定した。ICSPのピンソケットは力がかかる部分なので、接着剤とレジンで固めてある。スイッチはホットボンドで適当に止めてある。

<img width =50% alt="kb2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/995443db-5856-a2ef-3cf9-bafac46c9a0a.png"/>

USBソケットは、3mmのネジで固定してある。 USBの抜き差しにはかなりの力がかかるので、しっかりと止めないと外れてしまう。ねじ止めし、目隠しにエポキシパテで埋めた。基板に直接信号線を付けているが、この方法は外れやすくあまりよくない。

ピンソケットなどで接続したかったのだが、後ろにも上にも空間の余裕がない。なるべくキーボードの仕切りを切りたくなかったので、このままにしてある。

<img width=50% alt="kb3.png" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/50cf524f-4c4b-3d07-c6f3-0bc52e3ba16f.png">

ケーブルが出る穴を再利用することをせず、もっと良い位置に配置すれば、きちんと接続できると思う。


# 売ろうかな・・・

材料費としては次のようになる。(このキーボードを作るためだけに使用したもののみ）

|部品名|入手方法|価格|備考|
|---|---|---|---|
|キーボード本体|ヤフオク|4,000(送料含）||
|ワイドハイターEXパワー880ml|ドラッグストア|900|RetroBright用|
|マイコンボード|秋月電子|800||
|USBソケット|秋月電子|250||
|USBケーブル|千石通商|150|マイコン⇒USBソケットの内部配線用|
|その他電子部品(*1)|秋月電子|300|概算|

 (*1)線材、LED、抵抗器、タクトスイッチ、ピンソケット類

となり、合計は　￥６,４００　となった。

意外と、ワイドハイターが高価だった。使いまわしも効かないのが痛い。実際のところ、キーボードを外して洗い、黄変したものを漂白し・・・という部分の手間は相当だったので最初から多少高くても、程度の良いキーボードを選ぶべきだった。

もし、ヤフオクで売るとして、赤字にならない設定を考えると送料込みで￥８，０００スタートくらいになってしまう。かなり高くなりそうだ。　

果たしてほしい人がいるのだろうか？これがどれくらいで売れるのか少し興味が出てきた。　機会があったらヤフオクで売って幾らの値段が付くか試してみよう。