Windows搭載機を制御するデバイスを作ってみた
はじめに
仕事では、スペクトラムアナライザのような計測器を使うことが多いです。これらの装置は、Windows上で動作するものが多く、特にマウス作業を行いたい場合、起動時にキーボードとマウスを接続する必要があります。しかし、キーボードは場所を取るので、何か代替デバイスを使ってWindows画面に切り替えられないかと考え、解決策としてDigisparkを使えないかと思いついたのが、このアイデアの始まりです。
プログラミング
Digisparkは複数の入力に対応しています。そこで、3つの動作を登録してみました。
ボタン1: Windowsキーを押す動作
ボタン2: タスクマネージャーを表示する動作
ボタン3: Windowsをシャットダウンする動作
ただし、ボタン3でいきなりシャットダウンするのは不親切かなと思い、まずコメントを表示するようにしました。具体的な動作としては以下のとおりです:
メモ帳を開き、「パソコンをもうすぐシャットダウンしますよ」というコメントを表示。
メモ帳を終了。
コマンドプロンプトを起動し、「5秒後にシャットダウンするコマンド」を実行。
このようにして、各ボタンにそれぞれの機能を割り当ててみました。
#include <DigiKeyboard.h>
#define KEY_ESCAPE 0x29
bool outputState = true;
void setup() {
pinMode(0,INPUT);
pinMode(1,INPUT);
pinMode(2,INPUT);
}
void loop() {
DigiKeyboard.sendKeyStroke(0);
int mode,i;
mode=0;
if (digitalRead(0) == HIGH){ mode=1; }
if (digitalRead(1) == HIGH){ mode=2; }
if (digitalRead(2) == HIGH){ mode=3; }
switch(mode){
case 1:
DigiKeyboard.update();
DigiKeyboard.sendKeyStroke(0, MOD_GUI_LEFT);
DigiKeyboard.delay(100);
mode = 0;
break;
case 2:
DigiKeyboard.update();
DigiKeyboard.sendKeyStroke(KEY_ESCAPE, MOD_CONTROL_LEFT | MOD_SHIFT_LEFT);
DigiKeyboard.delay(100);
mode = 0;
break;
case 3:
DigiKeyboard.update();
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(400);
DigiKeyboard.println("notepad.exe");
DigiKeyboard.delay(400);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(400);
DigiKeyboard.sendKeyStroke(KEY_O,MOD_ALT_LEFT);
DigiKeyboard.delay(20);
DigiKeyboard.sendKeyStroke(KEY_F);
DigiKeyboard.delay(20);
DigiKeyboard.sendKeyStroke(KEY_S,MOD_ALT_LEFT);
DigiKeyboard.println("20");
DigiKeyboard.delay(20);
DigiKeyboard.println("Your PC is controlled from USB program!");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.println("Your PC will be shut down soon!");
DigiKeyboard.delay(5000);
DigiKeyboard.sendKeyStroke(KEY_O,MOD_ALT_LEFT);
DigiKeyboard.delay(20);
DigiKeyboard.sendKeyStroke(KEY_F);
DigiKeyboard.delay(20);
DigiKeyboard.sendKeyStroke(KEY_S,MOD_ALT_LEFT);
DigiKeyboard.println("12");
DigiKeyboard.delay(20);
DigiKeyboard.sendKeyStroke(KEY_F4,MOD_ALT_LEFT);
DigiKeyboard.delay(400);
DigiKeyboard.sendKeyStroke(KEY_N,MOD_ALT_LEFT);
DigiKeyboard.delay(400);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
DigiKeyboard.delay(400);
DigiKeyboard.println("cmd.exe");
DigiKeyboard.delay(400);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(1800);
DigiKeyboard.println("shutdown -s -t 5");
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(200);
mode=0;
break;
default:
DigiKeyboard.delay(100);
mode=0;
break;
}
DigiKeyboard.delay(100);
}
接続
プログラムがちゃんと動くかどうか確認するため、ブレッドボードで確認しました。
問題なく動いたので、はんだ付けしてみました。
基板のマウンティング
Digisparkをマウントするのにミンティアケースを使いました。赤色で囲んだ余計な部分はカットしています。LEDとタクトスイッチを通すための穴を開けました。ケースの中で基板やパーツが動かないように、グルーガンで固定しています。
改良後、動かしてみた
Digispark本体のリセットボタンの追加と、動作LEDを追加してみました。USBが接続されると青色のランプが点灯します。
実行後は、こんな感じで動きました。下の写真はWindows8.1ですが、Windows10の動作も確認できています。
ケース違いを作ってみたけど・・・
別のミンティアケースで作ってみましたが、ケースが少しだけ大きくて、スタイリッシュに作ることができませんでした。。