ジョイスティックマウス
Arduinoとジョイスティックで、マウスが作れるらしいので作ってみる。スケッチ例だけだと自分の環境では動かなかったので、一個ずつやってみる。
お買い物
ドキュメント移動
センタープッシュが付いてるやつにした。
接続
つないだ。
とりあえずanalogRead()で取得
int axisX = 0;
int axisY = 0;
void setup() {
pinMode(18,INPUT);
pinMode(19,INPUT);
Serial.begin(9600);
}
void loop() {
axisX = analogRead(18);
axisY = analogRead(19);
Serial.print("X: ");
Serial.print(axisX);
Serial.print(" Y: ");
Serial.print(axisY);
Serial.println();
}
analogRead()は基準電圧間を10bit(0-1023)のデジタルデータに変換してくれる。静止状態だと、中央値の511-512になるはずなので、この結果はちょっとずれてる。キャリブレーションが必要だけど、まぁ無視する。
Mouse.hを使ってみる
#include <Mouse.h>
boolean finished = false;
void setup() {
Mouse.begin();
}
void loop() {
if (!finished) {
for (int i = 1 ; i <= 10; i++) {
Mouse.move(-10, 10, 0);
delay(1000);
finished = true;
}
}
}
止まらなくなるのが怖いので、一旦何回かやったら止まるようにする。Mouse.move()の意味がよく分かってなかったのだけど、現在の位置から、引数の分だけマウスが飛ぶ感じの動きみたい。引数を大きくすれば飛ぶ量が大きくなる。スイーっと動くんじゃなくて、飛ぶ。
2つを合わせてみる
#include <Mouse.h>
boolean finished = false;
int axisX = 0;
int axisY = 0;
signed char X;
signed char Y;
void setup() {
pinMode(18, INPUT);
pinMode(19, INPUT);
Mouse.begin();
}
void loop() {
if (!finished) {
for (int i = 1 ; i <= 10000; i++) {
axisX = analogRead(18);
axisY = analogRead(19);
X = map(axisX, 0, 1023, -3, 3);
Y = map(axisY, 0, 1023, -3, 3);
Mouse.move(X, Y, 0);
delay(2);
finished = true;
}
}
}
取りあえず動くものを書いてみた。これだけでも既にカーソルが動いてくれる。すげーな。ただ静止状態でもカーソルが動いてしまうし、動きはカクカクしていてなめらか~な感じじゃない。XY軸沿いの動きはするんだけど、斜めになるととたんに反応が悪くなる。なんだろなー。
map()
https://www.arduino.cc/reference/en/language/functions/math/map/

ある範囲における数値を別な範囲における数値に変換する - Qiita
以上 以下の範囲に存在する数値 を、0 以上 1 以下の範囲に存在する数値 に変換する、つまり正規化するためには\b…
これ便利ね。
参考
https://www.arduino.cc/reference/en/language/functions/usb/mouse/
コメント