Arduinoでの2-key Keyboard作成

やりたい事

とりあえず家じゅうが閉じこもって各々ゲームをしていたりと、楽しく過ごしているのだが、あるゲームでキーボードの耐久性が気になってきた。あと軸の違いもためしてみたいのでゲームで使うボタンだけのキーボードを作りたい。

準備

Anycubic社製 Kossel Linear Plus

ずいぶん前に思い付きで購入し、リビングの片隅で何かの台になっていたもの。ほこりを吹いたり。

キーボードの筐体モデル

https://www.thingiverse.com/thing:3712151

を使った。Arduino Pro Microの穴とかステーとかついている。

Cherry Mx の軸

赤軸とあとで比較のため青軸を購入。千石電子から、次の日に来た、このご時世なのにはやい。

Arduino Pro Micro 互換ボード

これがあるとすぐにキーボードが作れるとのことなので、Shigezoneで購入、次の日来た。アマプラより早い時がある。

 作業

筐体プリント

とりあえず、1年ぶりくらいに動かすので、ほこりをとるところから。firmwareとか新しいのがあるけど面倒なので as is で。

Auto levelingとか調整、試しにプリントしたらBedの温度が途中で上がらなくなり、煙が出てくる。見ると電源の端子台が焦げている。なんだろうな、なんかゆるんでた?とか思いながらとりあえずケーブルを直ではんだ付け。

https://groups.google.com/forum/#!topic/flashforge/nVOJ0iL29Xg

を見るとTriGorillaでよくある話なのか?

とりあえず、久々だったので、https://www.thingiverse.com/thing:1969059

とか、

https://www.thingiverse.com/thing:2771843

を追加した。PSUカバーは12時間とか言われてあきらめた。

軸取り付け

なんか思っていたのと違う仕上がり。うえからはめるだけ、ぴったり固定される絶妙なサイズ。

 
Sの字のところ、サポートを除去するつもりが、間違って下まで突き破ってしまった。まぁ実用上問題はない。
裏から見るとこんな感じ。

Arduino取付

かちっとはまる。すばらしい。写真にうつってないけどMicroUSBコネクタの穴もきれいにはまる。

配線

とりあえず、各々のスイッチの端子、片方グランドで、他方は、Digital in 2, Digita in 3 にそれぞれ接続、空中配線。

ファーム書き込み

あまり中身は考えてなかったので、とりあえず調べてみる。https://qiita.com/kamaboko123/items/c32ad91434ffc7f4ff8d

が、作業の流れが分かりやすかったです。

Platform IOでKeyboard Libraryを追加して、とりあえず下のようなものを書いてみた(いろいろ考えるところはあるのだが、そんなにシビアじゃないだろうし)。

#include <Arduino.h>
#include "Keyboard.h"

#define KEYZ 2
#define KEYX 3

void setup() {
  // put your setup code here, to run once:
  pinMode(KEYZ, INPUT_PULLUP);
  pinMode(KEYX, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(digitalRead(KEYZ)==LOW){
    Keyboard.press('z');
  }else{
    Keyboard.release('z');
  }
  if(digitalRead(KEYX)==LOW){
    Keyboard.press('x');
  }else{
    Keyboard.release('x');
  }
  
}

おわりに

いろいろ、まとめている人がいるとありがたい。

ブロック崩しのコントローラとか作りたい。

Anycubic Kossel Linear Plus モータードライバ変更

やりたい事

Anycubic Kossel の静音化として、モータドライバをTMC2208に変更する事を検討。検索すると大体でてくるのが、標準のモータドライバと極性が逆になっていることへの対策。

普通はプリンターのFirmwareで反転すればよいので、みなそうしている。ただ、問題は今使用している、AnycubicのAuto leveling firmwareのソースコードが公開されていない事。多分これを機にMarlinベースのFirmwareに移行するのがいいのだろうけど、面倒くさい。

TMC2208は電源投入の設定値をOTP(UART経由)領域で変更できるそうなので、おそらくこの極性とかも変更できるんじゃないかと思った。

まずは、TMC2208の書き換え方法を調査した。

準備

FYSETC TMC2208 V1.2

ずいぶん前に購入。V1.0との違いは?よく調べずに、せっかくなので新しいのを買ったはず。

FYSETC 2208 Tester

UART経由でアクセスできるとのこと。当時よくわからないが、上と同時購入していた。

FYSETC TMC2208について

https://wiki.fysetc.com/TMC2208/

を見る。まずはUARTのピンがモジュール上でつながっていないため、半田でジャンパーをショートする必要があるらしい。

一応もう少し調べてみる。なにやら、バージョンによって違いがあるようだ。

Versions difference
V1.0 The default is standalone mode,If you need UART mode,you must config by yourself.
V1.2 UART mode, it’s used for F6.

ぱっと見、V1.0はStandalone、V1.2 はUART modeに見えるが、正直よくわからない。このページの下のほうのコメント(現在はコメントなくなっている)でも、回路図くれ、何が違うの?俺はうまくいっている、違ったバージョンを買ってしまった!とかかなり混乱している様子。FYSETCの人っぽい人も、今はみなV1.2にアップグレードされているよ、とか言っていて混沌とした感じ。

とりあえずちゃんと勉強しようと、本家のデータシートを見ることに。

TMC2208の勉強

https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC220x_TMC2224_datasheet_Rev1.09.pdf

ざっくり見て、General Configuration RegistersのGCONF(0x00)の3bit目がshaftで Inverse motor direction、となっていてこれで正逆を指定できそう。これのデフォルト値を書き換えられればいいはずだが、デフォルト値が特に書いていない。他のビットでは、Reset Default が OTP、となっているのはあるが、どういうことか。嫌な予感がして、5.1.1を見ると、

The OTP memory holds power up defaults for certain registers.

あ、certainだけか、という感じ。shaftのビットを変えようとすると、毎回起動後にUARTで書き換えないとダメそう。どうやら思っていたことが簡単にできそうにないのでやる気がなくなる。マイコンいれるか、Marlinに移行するかな。

一応モードの整理を続ける。

  • OPTION 1: Standalone STEP/DIR Driver (Legacy Mode)
  • OPTION 2: Standalone STEP/DIR Driver with OTP pre-configuration
  • OPTION 3: STEP/DIR Driver with Full Diagnostics and Control

UART使うのはOPTION 2と3という事。多分OPTION 2がやりたかったこと。(3 mode of operation の説明なのに option というのはわかりにくい)

さて、起動後にUARTでshaftを書き換えるとすると、TXを束ねてUARTで1bitだけ書き換えればよいのでまだ楽そう。ただこのモードの行き来ってどうするのかと疑問に思ったところ、

The TMC22xx supports both, discrete control lines for basic mode selection and a UART based single wire interface with CRC checking. The UART interface automatically becomes enabled when correct UART data is sent. When using UART, the pin selection may be disabled by control bits.

とのことなので、そんなに意識しなくてもよさそう。まぁ、当初考えていたOTPでのモード指定ができたとしても、一回だけ書けるとはいえ、やっぱり戻したいとかなりそうなので、普通にUARTで流しこもう、と気を取り直してきたところで今日は終わり。

ShigezoneでいろんなAruduinoを買っているので、どれかにやらせるか、マイコンとか面倒なのでFPGAでやらせるか(もったいない)。