[工大祭ブログリレー] CNCキーボード作ってみた(ファームウェア編)

はじめまして,21-Yoshizoeです。

この記事は工大祭ブログリレーの記事です。工大祭のロ技研のページはこちら

CNCコントローラー自作してみたのファームウェア編となります。
仕様/回路編
デザイン編
CAD編

きっかけ

自分はMaquinista所属で,Assist研所属ではなかったのですが,Hitomoshi先輩のキーボード作りたいやつ募集投稿を見て,元々自作キーボードに興味があったのでこのプロジェクトに参加しました。
自作キーボードっていうのはこういうのとか

を指すんですがこういうのはスイッチやキーキャップこそ自分で選ぶものの,基板やファームウェアは基本的にキット化されていて,マニュアルに従って組み立てるという感じなんですよね。(画像は自分が保有しているもの,左右分割はいいぞ)
今回は初めて1からキーボードのソースコードを書く&そもそもSTM32をCubeIDEで開発するの自体が初めてだったので結構不安だったのですが,意外となんとかなりました。

今回は1年生的視点で書いているので,当たり前っぽいところをいちいち書いているかもですが悪しからず。

環境構築

初めてやるとなるとまずは環境構築から…
STM32の開発環境は調べると結構色々出てるんですけど今回は公式からSTM32の開発環境として配布されているIDE(統合開発環境)である,CubeIDEを使います。

↑CubeIDEの画面。GUIでピンとか色々なペリフェラルの設定とかをポチポチするだけで難しいコードが生成できる&適当にポチポチするだけで最初からデバッグできて便利~ EclipseベースなのでJavaとかでEclipse使ったことある人にとっては使いやすそう

全体の流れ

今回書いたプログラムの全体の流れは以下のようになっています。

1. タイマー割り込みまで待つ
2. LEDをDMAを使って光らせる
3. キーマトリクス方式のスイッチの状態を読む
4. スイッチの状態に合わせてUSBレポートを作る
5. USBレポートを送信
6. 1に戻る

LED周り

これが結構大変で,今回採用したLEDはSK6812mini-eというマイコンLEDです。つまり全キー別色で光らせられる代わりに通信しないと光りません…
しかもその通信方法がI2CとかUARTとかではなく,だいたい1.25[us]を1セットとして5V(HIGH)->0V(LOW)と入力して,HIGHが0.32[us]程度なら0,0.64[us]程度なら1みたいな感じで,24bit(8bit*3色)送ると言う形式です。(説明難しすぎる…)

これはDMAを使ったPWMを使って実装しました。
なかなかしっかり計算する必要があって,わからない人がいきなり見ても理解できないとは思うのですが一応書き記しておくと,PWMをしてるTimerに入ってくるClockが48[Mhz]なのでこれを60カウントして(1/48×10^6[hz])×60[count]=1.25*10^(-6)[sec]=1.25[us]。
60カウントのうち15カウント=0.3125[us] HIGHにすれば0,31カウント≒0.6458[us] HIGHにすれば1といった具合です。

結構複雑だったのですが似たことをやっているサイトほとんどパクリ,計算して値変えただけ参考にさせていただき,なんとかやりきりました。

スイッチまわり

スイッチを読むところは今回はキーマトリクスというものを使っています。
今回のように24キーもあると普通にスイッチを接続していった場合,当たり前ですが24ピンも必要になります。それを4列6行に分けて,(入力ピンはPull-Downとする)1列HIGHを入れてにして全部の行を読む→次の列をHIGHを入れて全部の行を読む→…というような感じで全部のスイッチの状態を読むんですね。そうすると10ピンで済むようになります。

特に良いツールを知らないので頑張って普通に9個のスイッチを接続した場合と3*3キーマトリクスとした場合の様子をipadで描いてみました。本当はダイオードが必要ですが,簡単のために省略しています。通常だと9ピン必要なのが,キーマトリクスだと6ピンで済んで嬉しいのが分かっていただけると幸いです。


(わかりづら…)

USBまわり

hitomoshi先輩が以前に書かれた記事を参考にして行いました。
要約するとキーボードを作るには,

  • まずマウス用のUSBディスクリプタ(一番最初にこんな内容の情報をUSB経由で送るよ~ってパソコンに教えてあげるやつ)がCubeMXに標準であるライブラリにはマウス用のしか無いので書き換える
  • USBレポート(USBディスクリプタで決めた方法に沿ってデバイスの状態をパソコンにずっと教えてあげるやつ)を作って送る。

の2つを行う必要があるということです。
USBレポートはタイマー割り込みを用いて1msごとに送っています。無駄にレポートレート1000Hzなのでゲーミングデバイス並の低遅延です。

まとめ

完成~!カッコイイ~!

(なんかはんだ付けの道具が転がってるのは壊れたLEDを直していたからです。)

Flash容量が増えて初期設定だとコンパイルが通らなくなったり,そのエラーメッセージの意味がいまいち分からずしばらくスタックしたり,LEDを1つ壊してしまって修理が必要になったり,色々なトラブルに見舞われましたがなんとかやりきることができました。研究室という単位に分かれて活動しているロ技研ですが,こういう感じでたまに気軽な感じでコラボレーションできるのが良いですね。楽しかったです。

拙い文章でしたが,読んでいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です