自作キーボード製作記 ~ファームウェア編~
自作キーボード第4回、今回は製作しているキーボードのファームウェアをQMK firmwareというツールを用いて作っていく。
QMK firmwareは以下のページのtutorial->setupの部分の説明に従ってインストールすることができる。QMK MSYSというコマンドツールがインストールされるので"4"の項目まで行えば環境の構築は完了。
./util/new_keyboard.sh
上のコマンドで新しくキーボードのファームウェアを一から作ることもできるが、ファイル構成やキーマップなどを変えることを考えるとすでにあるファームウェアをコピーしてキーマップを書き換えるの方が断然早そうなのでそうすることにした。
QMK MSYS上でqmk farmwareをインストールしたフォルダまでカレントディレクトリを移動させてから
qmk setup
でセットアップを開始。
製作したキーボードのファームウェアを作成する
qmk firmwareで作られるファームウェアのファイルの構成は以下のようになっている
<keyboard_name>(folder)
∟keymaps(folder)
∟<keymaps_name>(folder)
∟keymap.c
∟config.h
∟<keyboard_name>.c
∟<keyboard_name>.h
∟matrix.h
赤字で示しているmatrix.cはqmk firmwareにある他のfirmwareとは異なり、今回特別に使用しているプログラムである。以前の記事で書いた倍マトリックスを行うためのソースファイルである。
config.hではキーボードマトリクスに使用しているピンの指定やLEDに関する設定などを指定する。
<keyboard_name>.c は <keyboard_name>.hをインクルードしているだけなので特にいじらず、 <keyboard_name>.hでは製作したキーマトリックス通りのキーが認識されるよう行列を指定する。
keymap.cは<keyboard_name>.hで行列となったキーの番号とキー入力を対応させる行列を入力したファイルである。
上記のファイルたちを画像の通り104キーに対応するよう書き換えることでファームウェアを作成した。
これらのファイルをqmk firmwareをインストールしたフォルダ、\qmk_firmware\keyboards\<keybord_name>
に格納し、QMK MSYS上で
qmk compile -kb <keyboard> -km <keymap>
のコマンドを実行。
もしすでに製作したキーボードのpro microと接続されているのであれば
qmk flash -kb <my_keyboard> -km <my_keymap>
このコマンドで書き込みも行うことができる。
これでキー通りの入力ができていれば完成。
お疲れさまでした。
[追記]
最後まで読んでいただきありがとうございました
ここで紹介しました104キーのフルキーボードのKiCADデータ、qmk firmwareデータ
はご要望に応じて公開いたします。ご希望の方は下記TwitterのDMまでご連絡いただければと思います
自作キーボード製作記 ~はんだ付け・パネル編~
自作キーボードの記事もこれで3本目になる。
今回は前回製作したPCBにLED,ダイオード,キースイッチなどをはんだ付けし、
パネルをアクリル板で製作する回です。
・はんだ付け
この項目に関しては根気強くはんだ付けを繰り返すしかない。
使ってないのでわからないがペーストでソルダリングするのはキースイッチが
高温に耐えられずできないのではないだろうか。
まずはんだ付けは「背の低い部品から」が鉄則なのでLEDからはんだ付けした。
前回使用したPCBのフットプリントはLED用に開けていた穴の寸法がLEDジャストサイズだったのでLEDは少々強めに押し込んだ。
その後、LED背面の端子と隣接するPCBのパッドをはんだ付けする
次にダイオードをはんだ付けする。本体が基板表面側でも問
題はないが、裏面にあった方が見栄えが良いので今回は本体は裏面、はんだ付けは表面で行った。
キースイッチをはんだ付けする前に、ここでpromicroやリセットスイッチも実装した。
基板設計編で「家にタクトスイッチあるしRSTはタクトスイッチでいいか」となってタクトスイッチのフットプリントを紐づけたがここで問題発生。
この後に固定する表面のアクリル製トップパネルとのクリアランスが5mmほどでタクトスイッチの頭がぶつかるのである。
よって今回はタクトスイッチは実装せず、promicroへの書き込みはRSTピンをピンセットでブリッジさせながら行った。(タクトスイッチって結構高さあるんだね...)
そして最後、キースイッチのはんだ付けを行ってはんだ付けは終了。
このタイミングでpromicroにファームウェアを書き
込んで動作確認をすることもできるが、記事の順番がごちゃるのでファームウェアは次回。
・パネル
トップパネルはPCBの一枚表側につける板で
あり、基板がむき出しになるのを防いでいる。ボトムパネルははんだ付けした箇所が直接下面に触れるのを防いでいる。
今回はLEDを実装しているのでこれは透明な材料ということでアクリル板を選んだ。
アクリル板を手作業で穴あけしていくのは骨が折れるので今回は
カインズ工房さんのレーザー加工機時間貸しサービスを使用して加工した。
ただし、ここではAdobe Illustratorが必要になるので要注意。
KiCADでEdge.Cutsのレイヤーだけ出力してそれをイラストレータにインポートし、
使用するレーザー加工機の使用ツールで読み込めるように線種などを編集していく。
利用したレーザー加工機のサービスは30min
2500円・材料費は1000円強だったが、
遊舎工房さんなどでデータを送って注文するサービスだと6000円弱となる。
初心者はレーザー加工機のセッティングなどに時間がかかる可能性があるためどちらが結果的に安くなるかはわからない。
これが終われば後は組み立てるだけ。ボルトやスペーサを使ってパネルとPCBに共開けした穴で両面に固定する。
最後にキーキャップをつけて本体は完成。
とりあえず形が見えると達成感があるね
次回ファームウェアをフラッシュして完成。
自作キーボード製作記 ~基板設計編~
フルキーボード(テンキーまであるやつ)を自作するためにまず基板の設計から始める。今回はJLCPCBに注文する。
設計にはKiCADを使用するのでまずはフットプリントを入手する。
前回の準備編で決定したキースイッチに対応するフットプリントを検索すると
githubなどでフットプリントライブラリが見つかったりする。
今回のキーボードに使用するのはCherry MXという有名なキースイッチに互換性のある
Kailhのspeedというキースイッチの青軸のものを使うことにした。
ただ、なんとなく察せるのがそのシンボルとフットプリントの配置の手間。
フルキーボードつまり104キーを一つずつ並べていくのが面倒なのは容易に想像がつく。
ここで少し検索してみるとKeyboard layout editorという、KiCAD上で任意のキーボード配置にフットプリントを並べてくれるツールを発見。
回路図の方はコピペで何とかなるがキーのレイアウトはQWERTY配列通り並べるのは大変なのでこのツールを使う。
ここら辺のことは以下の記事を参考にさせていただきました
まずはKeyboard layout editeorで任意のキー配置を作る。
www.keyboard-layout-editor.com
キー配置を仕終えたら右上の[↓Download]のボタンのメニューから「Download JSON」をクリックしてJSONファイルをダウンロードする
次にKicadでプロジェクトを作成し、.schファイルを作成する。
フルキーボードは縦に6行、横に20列(倍マトリックスなので信号は10列)
で回路を構成した。(画像は一部)
Keyboard layout editor をダウンロードするとその中に.kicad_pcbファイルとフットプリントライブラリも存在するのでそのフットプリントとキースイッチの関連付けを行う。
また、今回はメインのキースイッチとpromicroの回路とLEDの回路を分けて作成した。
使用したLEDはWS2812Bというマイコン搭載のRGBLEDを使用した。
このLEDはデジタル信号のIN,OUTのピンがあり、この信号線を数珠繋ぎに接続してRGBの信号を伝達する。
なので信号線は直列につなぎ、最後のDOUTは未接続とした。
こちらのフットプリントはすべてWS2812Bで紐づけるが、ここでこのWS2812Bのフットプリントに修正を加えた。というのもキーボードを構成するPCBが二枚で
・キースイッチ+ダイオード
・LED
というように分かれていれば二枚目のPCBにWS2812Bをそのまま表向きに表面実装すればよいのだが、今回はPCBを一枚で構成するのでPCBにLEDがはまるよう穴を用意し、LEDをはんだ付けしてからその上にキースイッチが配置されるようにする。
つまり、LEDのフットプリントは普通の表面にパッド4つではなく、穴の両側にパッドが来るようにしたうえでそのパッドが裏面に配置されるようレイヤーを選択する。
キースイッチのメインの回路とLEDの回路の構成とフットプリントとの関連付けが終了したら例のごとくネットリストを作成する。
PCBレイアウトエディターを開き、二つのネットリストをロードする。
上部リボンの[ツール]→[外部プラグイン]→[Keyboard Layouter]をクリックし
Keyboard layout editor でダウンロードしたJSONファイルをロードする。
Diodeにチェックを入れるとダイオードもキースイッチとオフセット分離れて配置される。
ただしLED,promicro,RSTスイッチは手作業。一つずつ並べていこう。キースイッチ中央に穴があるがその上部にLEDを配置するとキーボード表面まで光が届きやすい。
長方形キースイッチ用のスタビライザーのフットプリントも忘れずに。
CAUTION!!
[この上の図のpromicroの位置ではmicro USB端子のつまみが基板に干渉します!もう少し外側に配置することをお勧めします。]
最後にボルトでPCBを固定することを念頭に入れて四隅意外にも円形のカットを入れる。
さあ、ここまでくるとあとは怒涛の 配線作業。
F.Cuはrow方向(横方向)・B.Cuはcol方向(縦方向)というように縦横の配線の方向を層で分けると無駄にビアを打たなくて済む。4層基板とかにすればもう少し楽になると思うが加工費が跳ね上がるので今回も2層基板。
(最後に3D viewなどで確認することをお勧めします。)
ネットの分をすべて配線し終えたらガーバーファイルを出力して業者に注文。
今回注文したJLCPCBは大体最低発注数の5枚で$45。(大きさは大体 440x140mm)
最後に
今回の基板データはご要望次第で公開いたします。製作は自己責任でお願いいたしますが、ご希望の方はコメントにてその旨お伝えいただけると幸いです。
自作キーボード製作記 ~準備編~
昨今の感染状況により在宅勤務が続く。
やはりそうなると自宅のPC環境は快適なものにしたい
というもっともらしい理由をつけて自作キーボードに挑戦することを決意。
色々下調べをしてみると割と奥が深い。
まず、自作キーボードとは、名前の通り自作したキーボードのこと。
ただし「どこまで自作するか」というレベルは人によって違うらしい。
その界隈で有名な遊舎工房さんなどでキットを購入して作る人、
キットを購入したうえで自前のfirmwareも書く人、
PCBの設計から始める人
色々いるそう。自キニキしゅごい。
自分は3つ目を選択。
あえて難題に挑んでみた!と言いたいところだが自分の欲しいフルキーボード*1でお気に入りのキットが見つからなかったためである。
まずわからないところをひとつづつ調査
・そもそもキーボードの回路ってどうなってるのか
多くのキーボードがマトリックスと呼ばれるキースイッチの行列でどこが押されているかを判別しているらしい。ただしキーの同時押しがあるとキーの判定を絞れなくなるので同時押しがある場合はダイオードを使用する。
マイコンなどの信号の制御部がrow0, row1, row2, .....と順番に信号を切り替えてその時のcolの値を読んで導通を判断する。ダイオードがないと、例えばSW1 とSW8を押したとき、row0,row1,col0,col1が導通と判断しSW1,SW2,SW7,SW8が判定されてしまう。
このマトリックスという手法を使うことでキー数=ピン数必要という問題を回避できる。
・マイコンは何を使っているのか
自作キーボードで王道のマイコンはPro microらしい。
ここの二点を調べたタイミングでとある問題が頭をよぎる
「あれ?マトリックスでもフルキーボードだとピン数足りんくね?」
Pro microの入出力ピンは16pin, つまり最大で(16/2)^2=64キーということになる。
この問題をフルキーボードを作ってる人はどう解決しているんだろうかと
いろいろ調べていくとすごい手法「倍マトリックス」という方法に突き当たった。
これは簡単に言うとダイオード向きを変えたもう一つのマトリックスを用意して
rowをHighにして信号を読んでいくタイミング、colをHighにして信号を読んでいくタイミングで二つのマトリックスのどちらかも判別できるという方法らしい。天才だな。
これで64*2=128キーまで判別可能、フルキーボードが作れる。
キー配置・LED信号など情報はファームウェアとしてpro microに書き込まれる。
すでに作りたいキーボードのキー配置などが一致するファームウェアがあるならhexファイルをQMK toolboxというツールでフラッシュすればよいのだが、今回はないので
ファームウェアはQMK firmwareというツールでビルドする必要がある。
と、いうことで準備するものは以下の通り。
・キースイッチ
・LED
・pro micro
・タクトスイッチ
・スタビライザー
・ボルト+スペーサ
・PCB(基板)
・パネル
黒字の項目は今回は遊舎工房さんで調達する。
赤字の二つはこれから設計する
次回、PCB設計編。
*1:テンキーまであるキー配列
ESP32+PCM5102 Bluetoothスピーカー回路基板
前回、ESP32を用いたBluetoothスピーカーを製作した。
そこでわかったのは、ESP32・DACモジュール・アンプ・スピーカーを構成するのでやはり容積が大きくなってしまう。そこで、
「ESP32・DACモジュール・アンプを一つの回路にできれば、
小型化・コストカットできるのでは?」
ということで、今回はスピーカー以外のモジュール化に挑戦する。
前回と比較し、問題となってくるのはPCM5102の周辺回路だろう。
アンプ回路はそのまま流用するから、PCM5102の周辺を1から回路を作る必要がある。
Texas Instruments 製PCM5102Aのデータシートにtypical application circuitの記載があったのでこれをこのまま使わせてもらおう。
完成までに使用したPC側の環境は以下の通り。
〇必要環境
・KiCAD 5.1.9
・ESP-IDF(プログラムは前回の記事と同じ。そちらを参照のこと)
今回の部品の調達にはmouserを利用したのでmouserにあったDCジャック(PJ-079BH)と3.5mm イヤホンジャック(STX-3150-3N-1)を回路に採用。
スピーカーだけならイヤホンジャックでライン出力する必要ないのだが、今回は搭載する形にした。
BOMは以下の通り。
ESP32はモジュールのフットプリントはすでにライブラリにあったが、開発ボードのものはなかったので2.54mmピッチのピンヘッダのフットプリントの改造して作成。
BOM詳細
〇受動部品
抵抗:リード抵抗→スルーホール
22uF以上のコンデンサ:アルミ電解コンデンサ→スルーホール
22uF未満のコンデンサ:積層チップコンデンサ→表面実装(0603)
※470uFのACカップリングコンデンサはNichiconのmuseコンデンサを使用
※ボリュームはLinkman の基板実装用10kΩ Aカーブの可変抵抗を使用
〇その他部品
PCM5102A:パッケージはTSSOP-20
BP5293-33:3.3V 三端子レギュレータ。DACの電源用。
たまたま手元にあったこれを使えるよう2.54mmピッチのスルーホールを3ピン用意。
※01x02コネクタは基板上ではなく筐体にスイッチ、スピーカーを固定する可能性があるので、配線用にピンヘッダを配置するためのもの
今回はFusionPCBに注文するのでここのデザインルールでフットプリントのPCBレイアウトを行った。(2層基板)
大体100mm x 60mmに収まった
これでgerberファイルを出力、FusionPCBに注文。この大きさ、レイヤーだと最安の$4.9で済むらしい。
配送はOCSを選択、送料のおよそ$17が加算され合計$22での注文となった。
大体1週間後、基板が到着。
mouserの部品は先に届いてたので早速はんだ付け。
ESP32・電源を接続したところ最初は動作せず、一か所PCM5102周辺回路にミスが見つかったのでめっき線で無理やり接続したところ無事に動作した。(soft muteをオープンにしていたがactive low だったのでhigh側に接続・掲載している回路図は修正済み)
まとめ
・PCM5102Aは一個7~800円なのであまりコストカットにはならなかった
・小型化はできたのでよし
・今回の型番のDCジャック、3.5mmイヤホンジャックはmouserでしか確認できてないので、一回の注文で6000円以上でないと送料がかかってしまうこと考えると秋月やmarutsuで取り扱われているもので設計するほうが良い
とりあえず完成してよかった。笑
この記事の情報を使われる方へ
・3.3Vのレギュレータは入力電圧が7V~であるので5Vの入力では動作しません。
別の3端子レギュレータを使用してください。
・ガーバーファイルなどはご要望があれば公開いたしますのでコメント欄にお願いいた
します。FusionPCB向けのデザインとなっておりますのでご注意ください。
・この記事に関する設計・製作物などについて一切責任は負いかねますので
自己責任でご使用ください。
Bluetoothスピーカーの自作<ESP32ボード+既製PCM5102 DAC>
少し前からArduinoなどを使った電子工作を始めて、色々調べていくうちに
"ESP32というモジュールを使えばwifiやbluetooth接続ができる"
ということを知り、このモジュールは秋月電子さんで1300円ほどだった(2021/2/28時点)ので早速購入。
ファームウェアのライターとかよくわからないので開発ボードを選択。
ちゃんと技適は通っているようでよかった。
このモジュールはESP-IDFというIDEが用意されているが、Arduino IDEでもデバッグできるらしい。とりあえずArduino IDE でwifi経由でLチカをするプログラムを入れてみた。光った。
やはり電子工作のポイントは実用性。どうせならこれを使ってちゃんと動くものを作りたい。
ということでBluetoothスピーカーに挑戦してみる
(最近スマホをpixel 5に機種変してイヤホンジャックがなくなったっていう理由もある。)
まずこちらのh_nariさんの記事を参考にさせていただきました。
私の電子工作レベルは初歩of初歩なので基礎情報から必要だったのだが、
bluetoothなどを経由して音声(データ)を通信するとき、I2Sという規格を用いるらしい。
ESP32にはI2Sインターフェースが内蔵されているのでこれを用いて音声データを受信できる。加えてすごいのが内蔵DACもあるということだ。
ここで考えてしまうのが
「じゃあ内蔵DAC使えばいいじゃん!?」ということで本題より前に、
◎内蔵DACでのbluetoothスピーカー製作
に挑戦した
〇必要なもの
- ESP32 開発ボード
〇必要環境
- ESP-IDF
インストール後、
%USERPROFILE%\Documents\ESP-IDF\examples\bluetooth\bluedroid\classic_bt\a2dp_sink
のフォルダを作業フォルダにコピーし
idf.py menuconfig コマンドでA2DP Example Configuration->A2DP Sink Output
->Internal DAC チェックを入れる
※追記
youtubeの動画などESP32を用いて音声出力をする動画で見られる現象ではないが、
私の環境ではa2dp_sinkのプログラムでは、音声送信側(スマホ)が自動で音量を調整する現象が発生した。通信中頻繁に音量を変えてしまうのでa2dp_sink内のmain.c の
/* esp_avrc_rn_evt_bit_mask_operation(ESP_AVRC_BIT_MASK_OP_SET, &evt_set, ESP_AVRC_RN_VOLUME_CHANGE);*/
この一行をコメントアウトしたところこの現象はなくなった。
この後
idf.py build
idf.py -p [esp32を接続しているcomポート] flash
のコマンドで書き込み。これでESP32の準備は完了。
この時点でGPIO25,GPIO26からステレオ音声でアナログ信号が出力される。
パワーはないのでイヤホンで聞いたところしっかり音声は再生されていたが16bitの受信データを8bitで出力しているのであまり音質がよいとは言えないものだった。
それでも特に音質の良し悪しは気にしなければ十分なレベルではあった。
これを踏まえスピーカーアンプは一旦中断しDACは外部に用意してスピーカーを製作する方向にシフト。
そして本題
◎PCM5102DACおよびESP32ボード を用いたBluetoothスピーカーの製作
〇必要なもの
・ESP-WROOM-32E
・DACモジュール
素子とか受動部品を選定して、回路書いて、ってやろうとしたけど面倒だったのでAmazonでこちらのDACモジュールを購入。(実はこの後PCB発注やる体たらく)
・スピーカーアンプ
オーディオアンプIC NJM386BDを使用。周辺回路は大体データシート通り。
これら大きく3つのモジュールを接続する回路を書いた。
この回路をユニバーサル基盤に組み、テストしたところ無事に再生できた。
22uF,100uF,470uFは電解アルミコンデンサ
(470uFのAC coupling コンデンサはNichiconのmuse BPシリーズ)
スピーカーは秋月電子で販売されていた8Ω8Wのものを使用
NJM386BDの1番と8番のピンに10uFのコンデンサの両端を接続するとゲインは200まで上げられるらしいが20で十分。
音量制御用のVolumeは10kΩのAカーブのものを使用
〇必要環境
- ESP-IDF
内蔵DACの時に設定したconfigをExternal I2S Codecに変更する
bluetoothスピーカーの基盤で気力のほとんどを使い果たした私は
最後に筐体に着手。塩ビ版を適当にカットして作った。
DACも含めモジュールで買ってしまったので計4000円くらいかな?
PCBとかが安ければESP以外でパターン書いてプリントしてもほぼ同じ金額に収められるかもしれない。先は長そうだ。