スクリーンセーバーを動作させないデバイスを作った

# はじめに

ネットサーフィンしていると「[スクリーンセーバーの動作を防ぐUSBアダプタ「忍者」が久々に入荷](https://akiba-pc.watch.impress.co.jp/docs/wakiba/find/1289761.html)」という記事を見つけました。
考えてみると、オフィスでは時間によって自動でPCをロックする設定にしていますが、在宅勤務ではその必要もありません。
Arduinoを使用すれば簡単に作れそうだと思ったので、家に余っていたArduino互換機(？)で作ってみました。

想定する使用環境は以下です。

* OS: Windows, Mac, Linux
* ドライバをインストールしないで使える
* 刺すだけで動作をはじめる

## 使ったもの

今回はDigisparkの[USB Development Board](http://digistump.com/products/1)を使用しました。ボードとUSBコネクタが一体になっており、ケーブルなどを使用せず接続できるものです。
ATTINY85というマイコンが使用されており、「Digispark ATTINY85」で検索すると様々なメーカのものがヒットします。
![](https://s3.amazonaws.com/digistump-resources/images/m/2520dcf84a0a3bf2257c2559d7a187db.jpg)
私はeBayで3個 AU$8.95(当時の日本円で777円)で購入しました。
eBayですと届くのに時間がかかるので、急いでいる方は少し高いですが[Amazon](https://amzn.to/3pQ0l9z)で購入するのもいいと思います。

[USB Microケーブルを使用するタイプ](https://amzn.to/3nKYf9a)もあるので、お好みで選んでいただいたらいいと思います。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114063/bf06c2b5-d796-8181-d184-aeb16d46f2d9.jpeg width=40%>


## 開発

今回はWindows10で開発しています。他のOSでは動作が少し異なるかもしれません。

### 準備

ボードへの書き込みに「[Arduino IDE](https://www.arduino.cc/en/software)」が必要ですのでインストールをしてください。

Digisparkのボードへ書き込みを行うために、Arduino IDEで設定が必要です。
DigisparkのWikiに手順が記載されているので、記載通りに進めていきます。
<http://digistump.com/wiki/digispark/tutorials/connecting>

設定を押して出てきた画面の「追加のボードマネージャーのURL」に以下のURLを追加します。
`http://digistump.com/package_digistump_index.json`
![](http://digistump.com/wiki/_media/digispark/tutorials/preferences.gif)
![](http://digistump.com/wiki/_media/digispark/tutorials/entry.jpg)

ボードマネージャーから「Digistump AVR Boards」 を追加します。ダウンロードが始まり少し時間がかかります。
![](http://digistump.com/wiki/_media/digispark/tutorials/digispark_install.gif)

ボードで「Digispark (Default - 16.5mhz)」を選択します。
![](http://digistump.com/wiki/_media/digispark/tutorials/pickdigispark.gif)

環境によっては書き込みにドライバが必要になります。GitHubから入手できますので、OSに合わせてインストールしてください。<https://github.com/digistump/DigistumpArduino/tree/master/tools>

### 書き込み時の注意点

このボードは書き込み前はPCから外しておく必要があります。
Arduino IDEの「マイコンボードに書き込む」を選択した後、以下のメッセージが表示されるのでその後刺しこみます。

```
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
```

書き込みに成功すると以下のメッセージが表示されます。

```
>> Micronucleus done. Thank you!
```

### コード

マウスカーソルを5秒おきに上下に動かすコードを書きました。

1. マウスカーソルを上に動かす(LEDをOFFにする)
2. 100ms待つ
3. マウスカーソルを下に動かす(LEDをONにする)
4. 5秒待つ
5. 1に戻る

という流れになっています。
動作していることが分かるようにLEDが点滅するようにしています。

`MOUSE_MOVE_AMOUNT`でマウスの移動量、`TIME_INTERVAL_S`で処理間隔(上のフローで4の秒数)を調整できます。
`MOUSE_MOVE_AMOUNT`を100とかに変えると動作している様子が確認できます。

手元にあったMacBook Proと開発したWindowsとは異なるWindowsマシンで動作が確認できています。ドライバのインストールも不要です。

GitHubでも公開していますのでよかったらStarを押してもらえるとテンションが上がります。
<https://github.com/marc0468/BlockScreensaver>

```cpp
#include <DigiMouse.h>

#define MOUSE_MOVE_AMOUNT 1
#define TIME_INTERVAL_S 5

int time_interval_ms = TIME_INTERVAL_S * 1000;

void setup()
{
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A  
  DigiMouse.begin();  //start or reenumerate USB
}

void loop()
{
  DigiMouse.moveY(MOUSE_MOVE_AMOUNT);
  digitalWrite(0, LOW); // LED OFF
  digitalWrite(1, LOW);
  DigiMouse.delay(100);

  DigiMouse.moveY(-1 * MOUSE_MOVE_AMOUNT);
  digitalWrite(0, HIGH); // LED ON
  digitalWrite(1, HIGH); 
  DigiMouse.delay(time_interval_ms);
}
```