マウスとして動作させることでスクリーンセーバーの起動を回避する「Mouse Jitter」なるUSB機器があることを知る。
ATMEGA32U4を使うArduino Leonardoは、PCにUSB接続した際にHID(ヒューマン・インターフェイス・デバイス)として自身を認識させる機能があり、その機能を使って「Mouse Jitter」を自作してみる。
- Arduino Reference > Language > Functions > Usb > Mouse
- Arduino Reference > Language > Functions > Usb > Keyboard
元々はジャイロセンサー用のサブマイコンとして使うつもりで購入していた中華製の「SS Micro」は利用できるピンに制限があるがArduino Leonardo互換機として使える上に、直接USBポートに接続でき、かつ小型・安価なのでこのような用途にはちょうどよい。ebay経由で700円ほどで購入。
Arduino IDEは1.8.5を使い、スケッチ例の「09.USB」→「Mouse」→「JoysticMouseControl」などを参考にソースを作成する。最終的にはこんな感じになった。
/** Mouse Jitter 2018-04-04 ohguma Bord : SS Micro(32u4) */ #include "Mouse.h" #define PIN_LED 13 #define MOVE_PX 3 void setup() { Mouse.begin(); pinMode(PIN_LED, OUTPUT); } void loop() { Mouse.move(0, MOVE_PX, 0); digitalWrite(PIN_LED, HIGH); //ON delay(50); Mouse.move(0, - MOVE_PX, 0); digitalWrite(PIN_LED, LOW); //OFF delay((unsigned long) 1000 * 200); }
ポイント1
作業中にマウスポインタが動いても支障がないように、動きは最小限にする。
自分が使う環境ではMOVE_PXが「1」の場合、マウスの挙動は無視されるようだった。
ポイント2
当初「delay(1000 * 200)」としていて200秒おきにマウスポインタが動くだろうと思っていたら、3秒ほどで動作するのでなぜかと調べて、以下に気づく。
- Arduino 日本語リファレンス delay(ms)
- 200,000 % 65,536 = 3,392 ということか。
- setup()に「Serial.begin(9600);」、loop()に「Serial.println(millis());」を追記して、上記周期になっていることを確認した。
- ソース中で直接数値を記述する場合は注意が必要。
問題点
しばらく放置すると13ピンのLEDが点きっぱなしになる。
- Mouse.move()の後に「delay(10);」を入れても変わらず。
- digitalWrite()の後にMouse.move()を持っていっても変わらず。
- 1週目のloop()ではOFFになっているが、2周目のloop()でLEDがOFFにならない模様。