見出し画像

Windows搭載機を制御するデバイスを作ってみた

はじめに

仕事では、スペクトラムアナライザのような計測器を使うことが多いです。これらの装置は、Windows上で動作するものが多く、特にマウス作業を行いたい場合、起動時にキーボードとマウスを接続する必要があります。しかし、キーボードは場所を取るので、何か代替デバイスを使ってWindows画面に切り替えられないかと考え、解決策としてDigisparkを使えないかと思いついたのが、このアイデアの始まりです。

プログラミング

Digisparkは複数の入力に対応しています。そこで、3つの動作を登録してみました。

  • ボタン1: Windowsキーを押す動作

  • ボタン2: タスクマネージャーを表示する動作

  • ボタン3: Windowsをシャットダウンする動作

ただし、ボタン3でいきなりシャットダウンするのは不親切かなと思い、まずコメントを表示するようにしました。具体的な動作としては以下のとおりです:

  1. メモ帳を開き、「パソコンをもうすぐシャットダウンしますよ」というコメントを表示。

  2. メモ帳を終了。

  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とタクトスイッチを通すための穴を開けました。ケースの中で基板やパーツが動かないように、グルーガンで固定しています。

ケースの加工
マウント後
出来上がり
USBケーブルをつなぐとこんな感じ

改良後、動かしてみた

Digispark本体のリセットボタンの追加と、動作LEDを追加してみました。USBが接続されると青色のランプが点灯します。

改良後

実行後は、こんな感じで動きました。下の写真はWindows8.1ですが、Windows10の動作も確認できています。

パソコン接続時(青ランプが点灯)
Windowsが表示されるボタンを押す(ボタン1)
タスクマネージャーが表示されるボタンを押す(ボタン2)
シャットダウンボタンを押す(ボタン3)
コマンドプロンプトが起動し、シャットダウンコマンドが自動入力される
無事にシャットダウンしました

ケース違いを作ってみたけど・・・

別のミンティアケースで作ってみましたが、ケースが少しだけ大きくて、スタイリッシュに作ることができませんでした。。

中身
見た目

いいなと思ったら応援しよう!