Previous Post | Top | Next Post |
TOC
以下は基本的に備忘録です。
2016-2017年頃の自作キーボードのハード作成
Arduinoは素人ででもシステム細部まで理解して プログラム出きるので、それなりに面白いんですが、LEDのチカチカやbeep音出し だけではすぐに飽きてしまいました。
そこでキーボードの自作を思いたち、2016年の年末から海外サイトを色々見ました。
- https://geekhack.org/ – geekhack
- https://deskthority.net/ – deskthority
昔から気になっていたことを根本的に解決してくれる ortholinear系のデザインのキーボードがとっても気になり 欲しくなりました。ただPCBからすべて買って組み立てるだけでは面白くない ので、キースイッチの位置精度が要るケース部品のネタ部分だけを3mm MDF板の レーザー加工で2017年2月に発注し入手しました。
作ろうとしたキーボードのデザインは、14C * 4R のortholinear タイプで、 右端のキーを真ん中に移動し、左右の手を通常より2キー離れて置くことを特徴とし ていました。planck等で採用されている片側6列ではなく片側7列とし、左右の手 の間隔を通常より取ったので窮屈でない姿勢で使えるキーボードのデザインにでき たと一人悦に入っていました。
MDFを木工ボンドで接着し組み立て、角をヤスリで落し、段差を紙粘土で埋めて スムーズな形にして、仕上げに塗装したあと、キーを置いてみて気分を楽しんで いました。
まあ、MDFは木材感覚なので、塗装が出来るのと、角を削って落とせるのは メリットでした。キーはプレートマウント状態ですがMDF板は3mm あり1.0-1,5 mm 厚であるべきマウントプレートとして引っかかりある取り付けができませんでした。 それに関してはキースイッチをホットメルト接着剤で裏から留めることで安定させ たので、むしろカンカンという金属板の共鳴音もしなくていい感じでした。
ただその後、他の事に忙しくなり、電子回路を組み上げずに中断していました。 (ケースの高さを抑えかつ強度を確保しようとし過ぎため、ケース内のスペース が少なく配線の作業性が極端に悪かったのも挫けた一因です。)
キーボード関連MCU・ソフト状況
このころいろいろ読んでの、私なりのキーボード関連でのソフトに関する結論を 備忘録で記します。
(昔、この辺は英語でhttps://github.com/osamuaoki/avrdude-friend/wiki に纏めていました。ちょっと加筆して整理しなおしました。今見直すとかなり 参考になります)
まず、USBキーボードに使うMCUはやはりサポートソフト基盤のARDUINOやQMKがあり とっつきが良いATmega32u4に絞りました。読み込んだ資料は以下です。
- atmega32u4 data etc.
- atmega32u4 データシート
- LUFA: the Lightweight USB Framework for AVRs
- Arduino
- The QMK Configurator – Open-source keyboard firmware for Atmel AVR and Arm USB families
いくつか気づいたポイントを以下に箇条書きにします。
- アプリは、低アドレスに置かれ、電源ON時にアドレス0からスタートする。
- ブートローダーは、高アドレス置かれ、リセット時にブートローダーの 最下位アドレスからスタートする。スタートした際のUSBデバイスタイプや 占有メモリーサイズが違うブートローダーが幾つかあり、いずれも ホストコンピューターからUSB経由で送り込まれるアプリデーターを 下位アドレスに書き込む。
- ChipのデーターシートでISP (In-System Programming)とよばれる方法が 我々にとってもっとも低レベルのChipへのプログラム導入方法。これは ArduinoでICSP とマークされているピンからのプログラム導入と同じです。 ブートローダーの書き込みにはこれが必須です。
- アプリケーションのプログラムにもISPを使えるのですが、やはり手軽なのは USB経由でホストコンピューターからブートローダー経由でアプリデーターを 送り込む方法です。これだとISPを使いブートローダーを書き込んだチップの ISPのPINを、組み込み後I/Oに利用したりアクセスしにくくなってもアプリ 更新が難なくできます。
ATmega32u4関連で使えそうなdevelopment boardは以下:
- Arduino Leonardo (大き過ぎ,32+6+USB) – 互換品なら1000円程度
- Arduino micro (34+6+USB) – 3000円程度
- Teensy 2.0 (小さい,29+1+USB) – 互換品なら1000円程度
- Pro Micro (24+USB) – 互換品なら800円程度
メモリーとPINが強化されたAT90USB1286 関連で使えそうなdevelopment boardは以下:
- Teensy 2.0++ (小さい,43+1+USB) – 互換品なら1200円程度まで値下がりしている
大きさと使えるピン数と価格のバランスで、Teensy 2.0互換品が良さそうです。 でも、あまり安くなったので、Teensy 2.0++互換品に目移りもしています。
(将来ATmega32u4の計算パワーやメモリー量に不足を感じたら、その際には Arm系のSTM32F401を使う500円程度で買えるdevelopment boardを考えます。)
ATmega32u4の代表的なブートローダーのUSBデバイスタイプ、サイズ状況は以下:
LUFAには各種USBデバイスタイプ(HID, CID, DFU, …)のブートローダーがあるが、 どうもいずれも4KBのメモリーを占有する(要確認)。
Atmelのチップには製造時、1KBメモリーを占有する(要確認)、DFUブートローダー が書き込まれている。ソースは無いがBINARYは megaAVR DFU USB Bootloaders で入手可能。LUFAのDFUブートローダーよりは小さい模様。
Arduino Leonardoのブートローダーは、CIDブートローダーで、これは中身はどうもLUFAの CIDブートローダーそのもので、大きさは変わらない模様。
Teensy 2.0というATmega32u4を使う純正development boardにはプロプライエタリーの 512Bに収まったHIDブートローダーが書き込まれている。LUFA版のHIDブートローダー より小さい。使用するUSB VID等が違う以外はLUFAのHIDブートローダーとまったく 同じプロトコルを使っている。ホストコンピューター側のソフトはフリーソフトで 同じもの。 Teensy2.0互換として売られているUSB AVR開発ボードにはTeensyの HIDブートローダーが当たり前ですが書き込まれていません。AtmelのDFU ブートローダーが書き込まれているようです。
OSによるデバイス認識対応の手間や問題が発生しないのはHIDブートローダー。
幸い、LUFAのHIDブートローダーをアッセンブリーで512Bに収めた nanoBoot がMITライセンスで提供されている。 総合的にはこれをISPでブートローダーとしてATmega32u4の高位アドレスに 組上げ前に書き込むのが、OS対応も楽でメモリーも有効利用でき一番良い模様。
2022年追記:nanoBootには最近私のパッチもマージされ、かなり強化されています。さらに各種のパッチをくみあわせたりも私自身しました。
AVRチップ関連のFirmware関連をキーボードで使うUSBとArduino Uno等のシリアル タイプの両方について纏めました。
ホスト側のプログラマーの状況は以下:
avrdude
はISPによる直接プログラム更新とDFU・CIDのブートローダー利用の
プログラム更新に対応。ArduinoのGUIアプリもバックエンドでこれを
利用しています。
dfu-programmer
はDFUブートローダー利用のプログラム更新のみに対応。
(Windows用にはFLIPを使うそうです。)
LUFAのhid_bootloader_cli
は、nanoBootも含めたHIDブートローダー利用のプログラム
更新に対応している。
2019-2021 年頃の自作キーボードのハード作成
配線スペース確保のために、兎に角荒技ですがMDFをDremelに似た小型手動ルーターで 見えない部分で削りました。
現在配線作業が進行中!それに付けても気を付け無いとよく断線や接触不良が起こりま した。
組み立て時のテストの件:
結線確認はまずテスターでしました。それなりの性能のテスターは結線確認を0.5V以下 でするので、ダイオードの順方向でも「導通ビー」とならないので注意が必要でした。 まあ、低圧での検査はデバイスを壊す心配は無くいいのですが、キーボードのマトリクス 確認には、3Vで検査する安いテスターの方が便利でした。
この次のレベルの結線確認には各種「LED Blink」他のアプリを準備するのが便利そう。 このアプリの準備はArduino環境であれ何であれどんなプラットフォームで作ろうと 良いはず。アプリのバイナリーサイズが許容範囲内で全て低位アドレスに書き込めさえ すれば動くはず。
実際にキーボードが動いたのは2022年の2月でした、
Previous Post | Top | Next Post |