taiki3's engineering note

プログラミング、電子工作、アクアリウムなど色々. 当面は自作キーボードのこと. 本業はデータサイエンティスト見習い(?)

Black pill でジョイスティックを使ったHIDデバイス

キーボードのキットを複数作ってきて、物足りないのは親指の使い方。 多くの分離型キーボードで、親指キーが全体的に押しにくい気がする。 もちろん、自分の指の位置に合わせてキー位置ずらしたキーボードを設計してもいいんだけど、 それよりもジョイスティックにしてしまえば親指一本で4キーから上手くいけば8キー+押し込みで9キーくらい担当できるかも。

ぱっと考えると同時押しの制約がありそうなんだけど後述の方法で大分何とかなりそう。

準備したもの

Black pill Amazonで買ったジョイスティックhttps://www.amazon.co.jp/dp/B00M0F21KU PC

ProMicroのおうちがあったので使うつもりだったが、Black pillも一度使ってみたかったのでとりあえず。

やったこと

下記のスケッチになった。

#include <USBComposite.h>
#include <USBHID.h>


int xPin = PA2;   // Select the input pin for the potentiometer
int yPin = PA3;
int sensorValue = 0; // Variable to store the value coming from the sensor
int delayTime = 10; //loop delay
int prec = 4096; //Analog input precision
float THRESHOLD = 0.7; // Key input threshold

const int keyNum = 4;
const byte keyMap[keyNum]  = { 0x61, 0x62, 0x63, 0x64 };
USBHID HID; // create instance of USBHID plugin
HIDKeyboard Keyboard(HID); // create a profile
  
void setup() {
  //setup input
  pinMode(xPin, INPUT_ANALOG);
  pinMode(yPin, INPUT_ANALOG);
  //setup HID
  HID.begin(HID_KEYBOARD);
  Keyboard.begin();
}

void loop() {
  // Read the value from the joystick:
  int x_raw = 2 * analogRead(xPin) - prec;
  int y_raw  = 2 * analogRead(yPin) - prec;
  //convert value:
  float x_val = (float)x_raw / prec;
  float y_val = (float)y_raw / prec;

  if (x_val > THRESHOLD) {
    //right
    Keyboard.press(KEY_DELETE);
  } else if (x_val < -THRESHOLD) {
    //left
    Keyboard.press(KEY_LEFT_CTRL);
  } else if (y_val > THRESHOLD) {
    //up
    Keyboard.press(KEY_BACKSPACE);
  } else if (y_val < -THRESHOLD) {
    //down
    Keyboard.press(KEY_LEFT_ALT);
  } else {
    Keyboard.releaseAll();
  }
  delay(delayTime);
}

既知の不具合?

うちの環境で上記を書き込むと、Black pillのCOMポートが死ぬ。 シリアルでデバッグしながらと思ってたらちょっと困った。 HIDデバイスになるっていうのはそういうことなのかもしれない。

動作しているところ

このぐるっと回してショートカットキー入力、個人的には革命なんだけどどうだろうか。

Black Pill でSTM32duinoの準備 with Arduino IDE

Blue Pillの情報も合わせれば楽勝かと思ったがちょっとハマった。 以下覚書

基本方針

ht-deko.com

こちらに従ってセットアップ。 今回はST-Linkを使ってSTM32duinoのブートローダーを書き込んだ。

はまったところ

Arduino IDE で書き込めるようにするためには、

https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip

をダウンロードして、~~Arduino/hardware/ の中に展開してやる必要がある。 また、そのフォルダの中のdivers/win/に入ってinstall.batを実行する。 このバッチファイルの実行を忘れていて Couldn't find the DFU device: [1EAF:0003] というエラーが出てしばらくハマった。

MiniAxeのビルドログ

概要

今日行ってきた天キーの戦利品の中でも、miniAxeは組み立てたさがすごかったので組み立てました()

ビルドガイド→

github.com

ビルドガイドは丁寧なのでポツポツと躓いたとこ等だけ書きます。

三行でまとめとくと

  • フラックスとルーペは用意したほうが良い
  • ケース組み立て時も意外と注意が必要
  • 感動的なコンパクトさ

つまりフラックス無しのルーペ無しで手ハンダで戦って大変でしたということ。

MiniAxeとは

  • 36キーと非常に小さい
  • Pro microでは無くQFPなAVRを直付だったり、他の部品も全てSMDと比較的高いハンダ付けスキルを要求
  • よくあるダイオードを使った格子回路ではなく、全てのスイッチをMCUに直繋ぎ
  • デフォルトでKailh ソケットを同梱でキースイッチがPluggable

MCUの取り付け

最初にして最大の難所。

www.youtube.com

上の動画のようにやれば簡単そうだが、昔買ったフラックスが見当たらなかったので 一本一本手ハンダしました。

f:id:taiki3e:20181104013358j:plain

汚い...... 案の定、左手はすぐに認識したが、 右手は認識せず延々とハンダを溶かし直したり吸い取り器で吸ったりつけなおしたりする羽目になりました。

他の面実装部品の取り付け

f:id:taiki3e:20181104013556j:plain

真ん中が水晶発振子をつけた所でちょっと左にあるのが水晶発振子の裏面です。

カバーが金属っぽいので周囲のハンダを盛りすぎるとショートしそうだなと思い、 AVR周りのデバッグのときにこちらも結構疑ってたりしました。

抵抗とかコンデンサとかはNyquist作るときにもやったので特に問題なく。

USB端子の取り付け

これが地味にMCUと同じくらい大変でした。

ピッチが狭いのもそうなんだけど、何せ金属カバーがハンダ付け箇所にオーバーハングしていて、 ハンダをつけ過ぎたりすると吸い取るのが他より大変。

f:id:taiki3e:20181104014044j:plain

Kailh ソケットの取り付け

ビルドガイドでも注意している通り、左右それぞれ真ん中の二箇所だけ上下逆なので注意。

f:id:taiki3e:20181104013929j:plain

ソケットが全部つくと物々しい感じに。

f:id:taiki3e:20181104014343j:plain

ガワの組み立て

ハンダ付け終わって油断してましたがここも結構難儀しました。

ネジの寸が足らない問題

下手な図でなんですがMiniAxeの上下プレートとPCBの固定は下図のような層になっています。

で、困ったのがボトム側ねじの長さが足りなくてナットまで届かない。

実測すると足りなかったねじのネジ部の長さが2.7mmでアクリルプレートが2.06mm厚とか。 どちらかというとねじの個体差とかナットとの相性みたいですね。 仕方がないのでアクリルを少しリーマーで削ってねじが少し埋まる感じにして届かせました。

f:id:taiki3e:20181104015451p:plain

アクリルの割れ

これはただの自分のミスなんですが上述のねじによる柱がMiniAxeでは外周ではなく内側にあるので、 外側のアクリルに力をかけてしまうと簡単に割れます。 ヒビで済んだので問題はないですがもし今後作る人が見てたら気をつけて。

QMK firmwareの書き込み

まだQMKのマスターにマージされてないということで叩いたコマンドは下記。 (環境はUbuntu

mkdir miniAxe && cd miniAxe
git pull https://github.com/ka2hiro/qmk_firmware.git
cd qmk_firmware
git checkout miniaxe_support
sudo make miniaxe:default:dfu

突然こんなことを書き出したのは今日の天キーで ”自作キーボードの本当のハードルはハンダ付けではなくて謎の設計図共有サイトの利用” みたいな話があったので。

完成

ソケットということもあり、余っていたGateronのクリアを気軽につけて動作確認をしてみました。

更に有り物のキーキャップを付けて完成。

f:id:taiki3e:20181104020101j:plain

後記

使用感

もともとこのキーの少なさはかなりハードルが高いと思ってましたが 驚異的なコンパクトさを目の当たりにするとなんとか使いこなしてみたくなる魅力を感じます。

作業について

キー自体少ないのと、キー毎のダイオードがない分部品点数はだいぶ少なく感じました。

今回は3時間弱+AVRの動作不良チェックで合計4時間くらいかかったけど、QFPがさらっと付いて動作問題なければ2時間くらいで作れそうです。

イベントでRTAとかしても面白いんじゃないかなーなんて思いました。

天下一キーボードわいわい会 Vol.1に参加してきました

今日は天下一キーボードワイワイ会、略して天キーに参加してきました。

概要

申込み枠が公開時200名→当日夕方に満席→250名に増枠→当日中?翌日?くらいには満席になってたこともあり、 多分すごく混むだろうな、と予想して向かいました。

待機列形成が11時から、開場が12時で物買うつもりなら早く行ったほうが良かろうと思って 11時20分くらいに到着したら30番目くらい?最終的に開場時には50人以上並んでいた感じでした。

早く来る人達は自分含めて買い物目的と思うと、品切れまくるかと思いきや、 意外とどのスペースも数を持ってきてくれてたようで売り切れて買えない、 みたいな物もなくありがたい感じでした。 今日販売開始です、みたいなものも結構あってホクホク。

スケジュールは下記

時間 内容 12:00 開場 13:00 オープニング 13:00 - 17:00 交流会 13:30 - 14:00 国内で手に入るキーボードまるわかり(@eucalyn_) 14:30 - 15:30 それはそう公開収録(@Biacco) 16:00 - 16:30 誰でもできるキーキャッププロファイル作成入門(仮)@monksoffunkJP 17:00 エンディング

最初の2つ、国内で手に入るキーボード丸わかりとそれはそう公開収録を見てて思ったのが、 国内で一定以上の規模でキーボードキット開発してる人達がほぼ全員来ていて、 主要なキーボードキットがほぼ全て会場で買える状態だったということ。

おかげで国内で買えるキットの半分以上手元に集めた疑惑も。 そういうわけで今回の戦利品は以下。

  • Ergo42 Modulo Alpha
  • Corne Cherry ピンクアクリル x 白基板(アウトレット)
  • Fortitude60 クリア (アウトレット)
  • miniAxe
  • TENTAKU
  • Cherry Development Kit (銀軸)
  • キースイッチ20種セット
  • Kailh Silver 35g Lubed * 50個
  • ハンドスピナーキーキャップ 青ラメ(会場限定色)

金額でいうとちょっと洒落にならないので今年はもうおとなしくしていようと思います。

f:id:taiki3e:20181104010143j:plain

空中配線練習

前回作った3Dプリントモデルで空中配線の練習をした。

まずダイオードでカラム方向の配線をして、 f:id:taiki3e:20181023002058j:plain

UEW(ポリウレタンエナメル線)でロー方向の配線。

f:id:taiki3e:20181023002222j:plain

太さは多分100ミクロンくらいの結構太いやつ。

f:id:taiki3e:20181023002615j:plain

こんな風に巻いてからハンダ付けした。 UEWは被覆剥かなくてもハンダ付けの段階でそこだけ勝手に溶けるから楽。

注意点は温調半田ごてで温度低めだと被覆がちゃんと溶けないことがあること。

今度はこれをPro microにつないでテンキーにしたり、 ESP32につないでBLEのトライアルに使いたい。

3Dプリントお試し

先日DMM.make 3Dプリントに注文したテストモデルが届いた。

f:id:taiki3e:20180930013757p:plain

感触はザラザラだけどエッジは立っていてきれいに出来てる。 キースイッチ入れてみた所はこんな感じ。

f:id:taiki3e:20180930013853p:plain

キースイッチの穴は寸法ぴったりの□14mm, かかりの部分の厚みは1.5mmで設計したけど本当にぴったりでスッと入るくらい。 キートップつけて引っ張るとキートップ抜けるより先にスイッチが抜ける。

安定という意味では少し詰めてねじ込んだほうが良い感じ。 かかりの厚みも1.7くらいで食い込ませて行ったほうが良さそう。 本番制作するときはエポキシで固めるという手もある。

角度のお試しという意味もあった。 急傾斜の方1列は約45度、これは流石に厳しい。 ただトップの高さは問題ないので傾斜が出ないように底上げするのは良さそう。 ゆるい30度の方は程よい感じ。

irisキーボード作った

keeb.ioから荷物が届いたので開封&Irisの組み立て。 f:id:taiki3e:20180930005952p:plain

f:id:taiki3e:20180930010144p:plain

組み立ては休み休みやって4時間くらい? ビルドログ色々見ながらやったので特に詰まることもなく。

唯一しんどかったのはPro microのピンヘッダのプラスチックを除去する所。 (そもそもオプショナルな作業) 一回目、ニッパーで砕いていくというプランをとってぐちゃぐちゃになった。 f:id:taiki3e:20180930010443p:plain

二回目は先端が薄くて平たいピンセット(のような毛抜き)で ちょっとずつ上げていって問題なかった。

f:id:taiki3e:20180930010537p:plain

キーマップはひとまずedvorakjpというのを入れてみた。

github.com

キーマップはこれまでQWERTYしか使ってきてないんだけど せっかく自作するのだからいじりたい。

また別記事書くかもしれないけど選定基準は下記

  • Dvorak系のホームポジションによく使うキーを集めた配置
  • 学習コストは気にしないことにする
  • vimmerなのでhjklが素直に打てる配置(最悪別レイヤでもいいが)
  • 日本語でもプログラミングでも不自由しない

日本人が開発しているところで[Eucalyn配列]http://eucalyn.hatenadiary.jp/entry/about-eucalyn-layoutも考えたけど edvorakjpはIrisのがまんまあったのでこちらを先に。

この記事は最初の1行だけIrisキーボードで書きました。