自作 Mouse Jitter

マウスとして動作させることでスクリーンセーバーの起動を回避する「Mouse Jitter」なるUSB機器があることを知る。

ATMEGA32U4を使うArduino Leonardoは、PCにUSB接続した際にHID(ヒューマン・インターフェイス・デバイス)として自身を認識させる機能があり、その機能を使って「Mouse Jitter」を自作してみる。


元々はジャイロセンサー用のサブマイコンとして使うつもりで購入していた中華製の「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にならない模様。