Digispark でマウスジグラー(スクリーンセーバー起動防止器)を作った話
あらまし
借り物のノートPCのスクリーンセーバーが一般アカウントでは OFF にできないようになっている。他人が触れてしまう環境を想定したセキュリティ管理者の苦悩の設定ではあるのだが、自宅で使っている分には少し使い勝手が悪い。
同じような状況の人は多くいるようで、「マウスふるふる」とか「マウスジグラー」で検索するといろいろな対応されている人がいる。スクリプトを書いて対応している人もいる。PCをわかっている人にとってはスクリプトが楽だと思う(私も uwsc でササっと作ってみた)が、ここでは PC よくわからん人向けに、わかっている人が対応してあげられるという点で優れているマウスジグラーデバイスを Digispark で作ることにした。(USBにマウスをさすのを禁止されているなら別だけど)
せっかくなので、なるべく偽装度を上げるためにデバイス名を変更したりもする。
最終コード
Digispark のスケッチ
#include <DigiMouse.h>
#define PIN_LED 1 // Digispark の仕様により 0 or 1
void setup() {
pinMode(PIN_LED, OUTPUT);
DigiMouse.begin();
}
void loop() {
DigiMouse.delay(59000);
digitalWrite(PIN_LED, HIGH);
DigiMouse.moveX(+4);
DigiMouse.delay(34); // 30fps
DigiMouse.moveX(-4);
digitalWrite(PIN_LED, LOW);
}
DigisparkMouse ライブラリの改造コード
USB_CFG_VENDOR_NAME と USB_CFG_SERIAL_NUMBER 関連の定義文をコメントアウトして、USB_CFG_DEVICE_NAME の定義文を自分好みのデバイス名に変更する。USB_CFG_DEVICE_NAME_LEN には変更したデバイス名の文字数を設定する。
### C:/Users/[ユーザ名]/AppData/Local/Arduino15/packages/ 下(環境による?)の
### digistump/hardware/avr/1.6.7/libraries/DigisparkMouse/usbconfig.h
### の 245行目からを以下のように修正する。
---ここから---
/* Version number of the device: Minor number first, then major number.
*/
//#define USB_CFG_VENDOR_NAME 'd','i','g','i','s','t','u','m','p','.','c','o','m'
//#define USB_CFG_VENDOR_NAME_LEN 13
/* These two values define the vendor name returned by the USB device. The name
* must be given as a list of characters under single quotes. The characters
* are interpreted as Unicode (UTF-16) entities.
* If you don't want a vendor name string, undefine these macros.
* ALWAYS define a vendor name containing your Internet domain name if you use
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
* details.
*/
//#define USB_CFG_DEVICE_NAME 'D','i','g','i','K','e','y'
//#define USB_CFG_DEVICE_NAME_LEN 7
#define USB_CFG_DEVICE_NAME 'U','S','B',' ','O','p','t','i','c','a','l',' ','M','o','u','s','e'
#define USB_CFG_DEVICE_NAME_LEN 17
/* Same as above for the device name. If you don't want a device name, undefine
* the macros. See the file USB-IDs-for-free.txt before you assign a name if
* you use a shared VID/PID.
*/
//#define USB_CFG_SERIAL_NUMBER 'd','i','g','i','s','t','u','m','p','.','c','o','m',':','M','o','u','s','e'
//#define USB_CFG_SERIAL_NUMBER_LEN 19
解説
マウスジグラーとしてのサンプルコードはネット検索するといろいろ上がっているので解説は省略。先人に感謝。
変更したのは以下
1) デバイスの偽装度を高めるために、デバイス名をデフォルトの "DigiKey" から無難な "USB Optical Mouse" に変更する。このために DigisparkMouse ライブラリを改造する。usbconfig.h のベンダー名、デバイス名、シリアル名を定義している箇所を上記の改造コードで記したように書き換える。
2) Digispark デバイスを USB コネクタに接続した直後の 5秒間、デバイス Digispark Bootloader が出現するのを止める。このデバイスはスケッチを書き込むためのデバイス。スケッチを書き込んだ後は不要になる。
https://qiita.com/nak435/items/67aca33ca49b6f328faa を参考にした。
ここにあるブートローダー ROM を取ってきて
C:\Users\[ユーザ名]\AppData\Local\Arduino15\packages\ digistump\tools\micronucleus\2.0a4 下の micronucleus.exe で焼きこむ
書き込んだのは micronucleus-1.11-entry-jumper-pb0-upgrade.hex (元に戻すときは micronucleus-1.11-upgrade.hex を焼きこむ)
micronucleus.exe /run micronucleus-1.11-entry-jumper-pb0-upgrade.hex
> Please plug in the device ...
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 20% complete
connecting: 27% complete
connecting: 34% complete
connecting: 40% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94 page size: 64
> Erase function sleep duration: 752ms
parsing: 60% complete
> Erasing the memory ...
erasing: 65% complete
erasing: 70% complete
erasing: 75% complete
>> Eep! Connection to device lost during erase! Not to worry
>> This happens on some computers - reconnecting...
>> Reconnected! Continuing upload sequence...
erasing: 80% complete
> Starting to upload ...
writing: 85% complete
writing: 90% complete
writing: 95% complete
writing: 100% complete
>> Micronucleus done. Thank you!
その後、適当なコードで P0 ピンと GND を接続してスケッチを書き込む。ジャンパ線を以下の図のように両方のホールが繋がるように差し込み、IDEからスケッチをいつものように流しこむだけ。
スケッチの書き込みができたら、ジャンパ線を外して起動。ブートローダーデバイスが出現しなくなっていることを確認したら、できあがり。
これで偽装度の高いマウスジグラーが完成。
enjoy !!