PC98配列モドキを実装した試作1号を運用しており、その上で改良したい点をまとめてみました。○改良したい点(1)電卓用にバックスペースや、ESCを追加する。(2)Excel操作向けにカッコも入力できるようにしたい。(3)JIS/US配列を切り替えたい。ユーザー定義のキー配列も実装したい。(4)薄く、コンパクトかつ、十分な強度を持たせたい。こんなところでしょうか。(1)、(2)に関しては、操作用のキースイッチを24個に増やす事で良さそうです。(3)については、試作1号でも実装していたモード切替用のスイッチを追加する必要がありそうです。ON/OFFと、モード表示を兼用できそうです。(4)は筐体設計なので、後回しです。・キースキャン回路は、6行×4桁(モード切替を考慮すると7行×4桁)とする。・シリアルLED1個で表示する。言うことで、以下のような回路になりました。回路図をもとに実装しました。何かあったとき用にリセットボタン(RSTとGND間)も実装しています。セラミックコンデンサ(0.1μF)をVDD/GND間に挿入しています。(チップ型はPin配置が回路図(D型用)とピン配置が違うので注意)タクトスイッチ+基板4x2は、回路的に8x1行だったので、基板パターンを一部カットして4x2行として利用しています。本来ダイオードはキー毎に必要ですが、タクトスイッチ基板の都合でスキャン桁ごとに1本(計8本)としています。モードキーは、ポート2にジャンパ線だけを実装して、押下時にポート10,16,14のダイオードの足に触れることで代用します。スケッチの機能確認レベルなら(複数キーの同時押しなどをしなければ)問題ないでしょう。次は各機能を検討していきましょう。LED状態を表示します。こんなスケッチを組んでみました。(うまくソース表示されない人はこちらからどうぞ)先頭でシリアルLEDと、HIDライブラリをインクルードします。LEDの個数と利用するI/O(Port21)を定義しておき(8,9行目)、LED表示用構造体の初期化(14行目)を行います。チップ型で色の並び順が違うため、指定方法が変わります。LED状態制御についてsetup()でHIDライブラリを初期化(BootKeyboard.begin())しておき、loop()で周期的にBootKeyboard.getLeds()でホストPC側の状態を取得します。あとは、状態に従ってLED表示に反映するだけとなっています。この実装は、ほぼHIDライブラリ付属のサンプルコード(KeyboardLed.ino)のままです。IDEで「ファイル」→「新規ファイル」で新規スケッチを開いて、上記のスケッチを全て貼り付けます。マイコンが認識していることを確認したら、「マイコンボードに書き込む」をクリックしてコンパイル・書き込みを実行します。Lock状態を変化させてみてください。ボード側のLEDが連動してON/OFFすると思います。周期的に色が変化(緑→青→赤)します。次は、ボード側のキー操作に従って、キーコードをホストPC側に送信する機能を実装していきます。LED状態を表示できたので、これにキースキャン制御を追加します。Lockキーとして動作するようにしてみました。Lock状態とマイコン側のLED表示が同期して変化します。こんなスケッチになりました。Lock(0x53)を定義しています。53ページから記載の一覧表より引用しています。次に11-14行目でキースキャン用のI/Oポートの定義を行っています。回路図の通り、7行×4桁として、それぞれのI/Oポート番号を割り付けてます。あとは、キー状態の変化をとらえるため、以下の配列を定義しています。○setup()について追加したキー制御I/Oと、キー状態の初期化を行っています。Active)としている辺りでしょうか。まとめで詳細が解説されています。興味のある方は、ぜひ一読してみるとよいかと思います。○loop()についてfor文を利用してキーに割り当てたI/Oポートの状態を行(row)/列(col)の順に読み出しています。(82-115行)85行目でOUTPUT指定した行(row)側のI/Oを一時的にLOW指定して、90行目で各列(col)を読み出しているのがポイントです。キースイッチがON(導通)状態だと、各列(col)のI/O状態が、行(row)側のI/O出力に従ってLOWになります。「キー押下状態変化あり(chg=1)」としています。(90-96行目)この前回の入力状態との比較を行うことで、同じキーコードが連続で送付されてしまうといった問題を回避しています。○キー押下判定とHIDライブラリ制御についてキー判定に従って、以下のHIDライブラリ関数を使って制御しています。キーボードを自作を参考にさせていただきました。ポイントは、(1)、(2)でキーコードのON/OFFをライブラリに指示しておいて、(3)で一括で送付することにより、ホストとの通信回数を最小限に抑えている点でしょうか。スマートな制御をされていると思います。これでキーボードの基本的な制御である、キースキャン、キー状態判定、ホスト状態表示が動作したことになります。4.Shift制御とメディアキーの実装こまで来たら、あとはキーマップを定義して、Shift制御と、メディアキー(電卓アプリ起動)処理を追加すれば、ほぼ機能としては完成です。一気に実装してしまいます。(うまくソース表示されない人はこちらからどうぞ)○キーマップ7x4のマップを定義しています。HID仕様書(Hut1_12v2.pdf)の53ページ記載の一覧表よりキーコードを引用しています。並びは回路図通りに実装していますが、1行目(Port2番)のマップはダミー実装です。モード制御周りは、実機を組み立てて各OS環境に接続しながら、煮詰めて行きたいと思います。自前でShiftコードを送付する制御にしています。キーコードの上位側を(勝手に)拡張して、SHIFT押下対象コードを判別できるようにしておいて、キー押下時とリリース時にそれぞれShiftコードの付加と削除を行っています。適当な実装ですが、カッコ()やイコール=も、特に文字化けもなく動作しているようです。○メディアキー機能とHIDライブラリ制御についてメディアキー機能は、以下のライブラリ関数を利用しています。(1)ライブラリ初期化Consumer.begin();(2)電卓アプリ起動Consumer.write(ConsumerKeycode(CONSUMER_CALCULATOR));この実装は、HIDライブラリ付属のサンプルコード(Consumer.ino)のままです。キー押下時のみ処理している点(2重起動防止)がポイントでしょうか。画像に記載した文字列(2行目)は、ブレッドボード実装のマイコンから入力しました。チャタリングが発生したりと、少々微妙な動作だったりしますが、ひとまず、ファームの実装がひと段落しましたので、次回はいよいよ実機の制作に入ります。