はじめに
ネットサーフィンしていると「スクリーンセーバーの動作を防ぐUSBアダプタ「忍者」が久々に入荷」という記事を見つけました。
考えてみると、オフィスでは時間によって自動でPCをロックする設定にしていますが、在宅勤務ではその必要もありません。
Arduinoを使用すれば簡単に作れそうだと思ったので、家に余っていたArduino互換機(?)で作ってみました。
想定する使用環境は以下です。
- OS: Windows, Mac, Linux
- ドライバをインストールしないで使える
- 刺すだけで動作をはじめる
使ったもの
今回はDigisparkのUSB Development Boardを使用しました。ボードとUSBコネクタが一体になっており、ケーブルなどを使用せず接続できるものです。
ATTINY85というマイコンが使用されており、「Digispark ATTINY85」で検索すると様々なメーカのものがヒットします。
私はeBayで3個 AU$8.95(当時の日本円で777円)で購入しました。
eBayですと届くのに時間がかかるので、急いでいる方は少し高いですがAmazonで購入するのもいいと思います。
USB Microケーブルを使用するタイプもあるので、お好みで選んでいただいたらいいと思います。
開発
今回はWindows10で開発しています。他のOSでは動作が少し異なるかもしれません。
準備
ボードへの書き込みに「Arduino IDE」が必要ですのでインストールをしてください。
Digisparkのボードへ書き込みを行うために、Arduino IDEで設定が必要です。
DigisparkのWikiに手順が記載されているので、記載通りに進めていきます。
http://digistump.com/wiki/digispark/tutorials/connecting
設定を押して出てきた画面の「追加のボードマネージャーのURL」に以下のURLを追加します。
http://digistump.com/package_digistump_index.json
ボードマネージャーから「Digistump AVR Boards」 を追加します。ダウンロードが始まり少し時間がかかります。
ボードで「Digispark (Default - 16.5mhz)」を選択します。
環境によっては書き込みにドライバが必要になります。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秒おきに上下に動かすコードを書きました。
- マウスカーソルを上に動かす(LEDをOFFにする)
- 100ms待つ
- マウスカーソルを下に動かす(LEDをONにする)
- 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
#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);
}