3Dマウス② ファームウェアを作り始めよう。
2022.12.15


前回の3Dマウスの記事はこちら
https://randol-news.net/art/00569.html


ロータリーエンコーダーとジョイスティックの検証は済んでいたので、
まずは2つを混合させるだけの簡単な仕事から。

まずピン設定や変数、定数の宣言はIncludeで取り込む形にして
よく使うファイルを見やすくすっきりさせた。
今後ソースが肥大化するにつれて視認性の確保と
カスタマイズ性が失われることを防ぐためにも重要。

部品の位置や配線の都合により、X軸、Y軸の値の向きが逆になったりすることもあり得るので
フラグで正位置、逆位置を指定できるように。
0~1024という値を返すジョイスティックは少々扱いにくいと考え、
-512~512で受け取れるように加工。0がニュートラルを示すように分かりやすくした。
実際のニュートラルは個体差があるので、Setupが動いたときに0補正するようにした。



試験用に用意したArduino Nano
中国の互換機です。本家だと思って買ったら偽物だったという奴(;´Д`)
本家との大きな違いはUSB接続。CH320のドライバーを入れないとつながりません。
まぁ動作検証するだけなら十分でしょう。
実はこの企画はATmega32u4を搭載したArduinoじゃないと動きません(;´Д`)
Arduino ProかLeonardoじゃないと実現できないのです。

なぜならキーボードとして認識させる機能がNanoにはないからですね。
でもまぁ、いま使えるのが無いので仕方ないね(;´Д`)
ちょっと急ぎでLeonardoを注文しとこう。

ジョイスティックのVRX(緑)をA1へ、VRY(青)をA0に。SW(オレンジ)をD4へ。
赤線は5V、黒はGNDへ。
ロータリーエンコーダーの緑縞線をD3、青縞線をD2へ。青線をGNDへ。



Arduinoを挿しているこのソケットがかなり便利。
デュポンのオスを挿してもいいし、裸線をさしてもいい。
ネジを締めれば簡単には抜けないので試作では大変重宝しています。(*'▽')



走らせてみた。
実行、修正を数回繰り返し何とか満足いくレベルに。

次はFusion360にキーボードの信号をどうやって送るかを考える。
私は初めて使うライブラリだけど、Arduinoには便利なものが最初から用意されている。
ただしArduino Pro(Leonardo)を使っている場合のみ使用可だけど・・。
いちいちドライバーやらなにやらを自分で組む必要はないみたい。
そして使い方は簡単らしい。

Keyboard.hをIncludeして、setupにKeyboard.begin()を入れ込めば
パソコンはArduinoをキーボードとして認識してくれるとのこと。チョー簡単。
あとは
Keyboard.print(文字データ);
Keyboard.press('文字データ');

これらを使うだけで文字を送れるという話。
文字じゃない特殊キーはKeybord.h内に定数が用意されていて、

#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_LEFT_GUI 0x83
#define KEY_RIGHT_CTRL 0x84
#define KEY_RIGHT_SHIFT 0x85
#define KEY_RIGHT_ALT 0x86
#define KEY_RIGHT_GUI 0x87
#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_ESC 0xB1
#define KEY_INSERT 0xD1
#define KEY_DELETE 0xD4
#define KEY_PAGE_UP 0xD3
#define KEY_PAGE_DOWN 0xD6
#define KEY_HOME 0xD2
#define KEY_END 0xD5
#define KEY_CAPS_LOCK 0xC1
#define KEY_F1 0xC2
#define KEY_F2 0xC3
#define KEY_F3 0xC4
#define KEY_F4 0xC5
#define KEY_F5 0xC6
#define KEY_F6 0xC7
#define KEY_F7 0xC8
#define KEY_F8 0xC9
#define KEY_F9 0xCA
#define KEY_F10 0xCB
#define KEY_F11 0xCC
#define KEY_F12 0xCD

この定数を利用すれば特殊キーの動作をさせることが出来るっぽい。
例えばコピペで使うCTRL+Vはこんな記述。

Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('v');
Keyboard.releaseAll();

FusionもCTRLとかSHIFTとか使うからこれの応用だね。
実際に動かしてみたいけど、Arduino Proがないので届くまでお預け(;´Д`)
仕方ないので、その間他のことを考える。
電流はどれくらい流れてどのくらいの太さの配線でいいのか確認してみよう。
これも結構大事な事。

まずは、ジョイスティックから。



アイドル時に流れている電流は19.3μA



ぐりぐり動かしているときの電流19.4μA
全く同じ。0.1違うのは誤差の範囲です。
こんなに小さいのね。



これはロータリーエンコーダーのアイドル時、GNDラインに落ちる電流の様子。
1.5μAとほぼ無いに等しいレベル。



これはぐりぐり回しているときのGNDラインの様子。
写真では18.8μAまで上昇をとらえてるけど、最大25μAくらいまではあがるっぽい。
それにしたって、こんなもんなんだなー。



XとY軸のうちの信号線を1本をひろってスティックをぐりぐりしている様子。
だいたい25μAが上限だね。



ジョイスティックの様子は一応動画でも残してみた。
オシロスコープのように値をリアルタイムに表示することはできないけど、
だいたいの様子はわかる。

ま、予想はしてたけど、ジョイスティックもロータリーエンコーダーも、
極細配線で十分という結果に。
ネットで買おうとすると一番細いのは30AWG・・・ ま、こんなのは切れやすくもあるので
28AWGあたりが細さの限界値か・・
まぁ28AWGより細い線はそうそうないので、見かけた一番細い線を使えばいいね。
なるべく柔らかいやつ(;´Д`)

次の3Dマウスの記事はこちら
https://randol-news.net/art/00576.html

- CafeNote -