Λ-1/Lambda-2022 の拡張(8)パラレルインターフェイスキーボードの作成

「マイコン手づくり塾」で Λ-1 に接続して使用するキーボードは ALPS AKB-3420 というパラレルインターフェイス仕様の機種です。7 ビット ASCII コードと Strobe 信号を送出します。

ALPS AKB-3420 はとうの昔に廃番になっており、それどころか現在ではパラレルインターフェイスキーボードというカテゴリ全体が、オークションサイトで探してもたまに見かける程度という希少品種です。

さいわい昨今はキーボード自作部品やツールキットが潤沢に供給されています。自作キーボードの手法でパラレルインターフェイスキーボードを作成しようと思います。

自作キーボードと言いながら、既製品を改造して近道しておりますが…

パラレルインターフェイスキーボードの構成

自作キーボードのファームウェアといえば qmk が定番ですが、qmk ではコンピュータとのインターフェイスとしてサポートされるのは USB のみです。Λ-1 および Chick-Bug モニタで使うキーボードは PIA に接続するパラレルインターフェイスが必要になるので、qmk をそのまま使用することは残念ながら不可能です。

かといってファームウェアをいちから書くのは結構な仕事です。どうしたものかと考えながら qmk_firmware ドキュメントを眺めていたら i2c 経由でパラレルインターフェイスを追加できるかも、と思いつきました。qmk_firmware にはキーマクロ用の C 言語インターフェイスがあるので、キー押し下げイベントに応じて ASCII コードをパラレルポートへ送信する処理が追加できそうです。この方向で試してみます。

また、今回は MCU として Raspberry Pi pico を使います。そもそもパラレル出力などという風変わりなことを試すのに、その上 qmk 標準から外れた RPi pico を使うのでいろいろ予想外の困難が出るかもしれません。段階的に確かめながら作っていくことにします。

RPi pico 版 qmk_firmware のビルドとインストール

Mac Parallels VM の上に Ubuntu 20.04 を新規インストールして専用開発環境を構築します。ホスト Mac 側から VSCode Remote Development で接続して編集、ビルドを行います。

おおよそ次のステップで新しい Ubuntu VM 上に環境を作りました。

  1. Raspberry Pi pico 公式ドキュメントなどを参考に SDK とサンプルコードをセットアップします。サンプルコード pico-examples の blink プログラム(L チカ)が動くところまで確認しておきます(参考)。
  2. qmk 公式ドキュメントを参考に qmk_firmware 環境をセットアップします。
  3. qmk new-keyboard コマンドで新しいキーボードを定義します。mcu として RP2040 を指定します(参考)。

注:2022 年 11 月現在で qmk_firmware の RP2040 対応コードは master ブランチにマージ済みなので、ブランチの切り替えは不要です。

テスト用に作るキーボードはワンキーでも標準的なフルキーでもいいのですが、ともかくキーアサイン定義を RPi pico GPIO に即して書き換えます。GPIO ピン名として “GPnn” という書き方ができます。

キーボードの設定にあたって主に書き換えるのは次のファイルです(キーボード名を ‘lambda2022a’ とした場合)。

  • keyboards/lambda2022a/info.json
  • keyboards/lambda2022a/keymaps/default/keymap.c
  • keyboards/lambda2022a/config.h

この時点で簡単なキー入力テストを行います。実際につなぐのは 1 キー分のスイッチなのでブレッドボード配線で十分です。キーマトリクスの 1 交点を選んでスイッチを GPIO ピンに配線し(1 キーなのでダイオードは不要)、スイッチ押し下げのテストを行います。

使い回しの部品ばかりでリードがよじれていますが動作には問題ありません

下の画面では主に ‘c’ キー交点にスイッチを配線して入力テストを行なっています。途中でブレッドボードの GPIO 配線を差し替えて他のキーに対応する交点にスイッチを組み替えた状態でもテストしています。qmk_firmware を使うとチャタリング回避の調整が不要になるのでその点は安定して使えます(画面中 ‘c’ や ‘b’ が何度も連続して表示されるのはそれだけキーを押したからで、チャタリングではありません)。

せっかくなので C 言語のサンプルキーマクロも動かしました。特定のキーコードの押し下げイベントに対応してカスタム出力が可能であることを確認しました。

GPIO Expander パラレル出力

ここで qmk のほうはいったん置き、GPIO Expander PCF8574 モジュールを RPi pico の i2c ピンにつないでパラレルポートのテストを行います。最も単純な接続方式として PCF8574 を RPi の i2c ピンに直接接続し、電源も RPi 3V3 出力に接続します。こうすると GPIO Expander の出力は RPi pico 動作電圧と同じ 3.3V レベルになります。

デフォルトの i2c SDA/SCL ピン(pin6 と pin7)を使い、pico-examples/i2c/lcd_1602_i2c/ をお手本にして PCF8574 へ 8 ビットデータを出力しました。オシロを見ながら書き込みデータを変えてみると任意の信号を出力できそうなので、ASCII コード(AKB-3420 の仕様に従い負論理 [注 1])を b0-b6 に書いてから b7 ストローブ信号を立ち下げる動作をさせます。これを Λ-1 の PIA に入力します。

上の画像は Λ-1 モニタプログラムのキーボード入力ソースを ACIA シリアルから PIA パラレルインターフェイスキーボードに切り替えた後で文字 ’Q’ を 1.6 秒間隔で受信している状態です。

これで、RPi pico + PCF8574 から 3.3V 出力の ASCII データを送信できることがわかりました。当初は信号が減衰してデータエラーが出る可能性を考慮して I2C 回線に 3.3V – 5V レベルシフタを挟むことも検討しましたが、3.3V レベルのままで 60cm 長のフラットケーブルを介して PIA 入力に信号が届くようなのでレベルシフタは割愛します。

RPi pico + PCF8574 でパラレル出力実験

qmk C マクロでパラレル出力ドライバを書く

前節の実験は pico-examples のサンプルコードを流用して書いたものですが、これを qmk 環境に移植します。

前述の qmk 設定に加え i2c 関連機能を有効にするために、次の各ファイルを変更します。qmk 公式ドキュメントの「Raspberry Pi RP2040」および「I2C Master Driver」のページを参考にしました。

  • keyboards/lambda2022a/halconf.h
  • keyboards/lambda2022a/mcuconf.h
  • keyboards/lambda2022a/rules.mk

qmk_firmware には i2c 制御のライブラリが用意されているはずですが、RP2040 ターゲットのビルドを行ったところライブラリのリンクや i2c の初期化がなかなかうまく行きません。ソースツリーの keyboards/ 以下にある他のキーボード用の i2c コードも参照しましたが、RP2040+OLED の組み合わせによる作例ばかりで i2c バス直接制御の使用例はないようです。

この i2c バス直接制御のための設定方法がわからず数日間悩みましたが、結局 rules.mk ファイルに次の 1 行を追加することで RP2040 ビルドでの i2c 関連のリンク、初期化ともほぼ自動的に行われるようです。

OLED_ENABLE = yes

前節と同じブレッドボード上のワンキー構成キーボードを使って、’q’ キーを押すと Λ-1 のパラレルキーボードインターフェイスに ASCII コード ‘Q’ が送られることを確認しました。同時に USB ポートへも ‘q’ キーの押し下げイベントが送信されています。

最後に、qmk のキーコード(KC_xx)とモディファイアキー状態 get_mods() から ASCII コードへの変換を行います。AKB-3420 相当のパラレル出力データとして必要なのは 7 ビット ASCII コードなのでチェックすべきキーコードの数も限られ、比較的シンプルな変換処理になります。

以上でコントローラの設定とプログラムはあらかたできました。次に物理的なキーボードの選定について検討します。

キーレイアウトと機種の選定

Λ-1 で使用された ALPS AKB-3420 の写真を見ると全キーが長方形に収まっておりなかなか端正なデザインです。今で言う 68 キー配列に近いものがあります。そこで既存の 68 キー配列キーボードをベースにしてパラレルインターフェイスキーボードを作ろうと思います。

(AKB-3420 画像出典:Deskthority WIKI)

最初は基板を起こして AKB-3420 のレイアウトを再現しようと思ったのですが、現代のキーキャップで構成するには若干無理があるため断念しました。パラメトリックキーキャップ設計ツールに習熟すればあるいは可能かもしれません。

当面は一般的な 68 キー配列の市販キーボードのケースや基板を流用します。AKB-3420 は ISO 配列ですが、個人的な好みにより ANSI 配列に変更します。AKB-3420 の最大の特徴は右側 2 列のリレジェンダブルキーキャップなのでここはなるべく再現したいところですが、現代の 68 キー配列ではこの部分は 1 列しかありません。ただ、Λ-1 ではこのエリアを多用しないので 1 列のままでもしのげるのではないかと思います(ATN キー、LF キー、ESC キーが最低限必要。LF、ESC はスペースバー横に配置しても可。ATN キーはマトリクスではなく直接配線が必要)。

68 キー配列ではカーソルキーが右端列の下端にはみ出しますがこれはそのまま残します。といっても Λ-1 / Chick-Bug ではカーソルキーはほぼ無用ですので、将来の拡張用といった位置付けになります。

既製品キーボードから流用するのはケース、スイッチプレートとマトリクス配線です。もともと基板に実装されていた MCU などは配線から除外します。今回 MCU として使用する RPi pico、PCF8574 などを足し合わせると既製品ケースには収まりきらないようなので当面はマトリクス配線をケース外に引っ張り出して結線します。いずれにしてもケースは再設計が必要なようです。

組み立てとテスト

既製品キーボードのマトリクスを調べたところ 15×5 でした。RPi pico ではマトリクスに GPIO ピンを 20 個割り当ててもまだ 6 個余るので、そこへ i2c を結線します。キーボード右上端のキーはパターンカットしてマトリクスから除外し、PIA の CA1(NMI 入力) に接続してプルアップ抵抗も付けます。これが Chick-Bug の Atn キーとして機能します。

この既製品キーボードをベースにしたテスト構成では、RPi pico と PCF8574 はブレッドボードに組んだまま使用しています。改造したキーボード基板から多数の線が出ていますが、この状態で実運用予定の構成と同じ配線になっています。

以前に作成したシリアルコンソールと独立して、パラレルインターフェイスキーボードと K68-VDG によるコンソールが動くようになりました。

***

以上で、パラレルインターフェイス方式の ASCII 出力キーボードを作成しました。ところで、よく考えたらこれは Apple II Plus にそのままつながりそうです。今後折を見て、キーレイアウトをカスタマイズしてテストしようと思います。

  1. AKB-3420 単体での出力は正論理ですが、Λ-1 では AKB-3420 にバッファ回路が追加されその部分でインバータを使用しているため Λ-1 への入力信号は負論理となります。

コメントを残す