あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

PC電源ON時にスイッチがオンだったらGrubでWindowsを選んでくれるPro Micro

ラズピッピ以外のボード工作、気がついたら今日はもう一個作ってました。

うちのPCはLinuxとWindows10のデュアルブートで、デフォルトはLinuxでありつつ利用頻度は半々といった感じで運用してます。どちらもSSHかRDPで接続するので、Windowsを起動するときはディスプレイの入力を切り替えずに電源ボタンを押して、10秒後のGrubが起動したであろうタイミングで挿しっぱなしにしてあるキーボードのカーソルキーを連打してWindowsを選択して起動しています。

日中工作をしている途中、引き出しをあさっていたらPro Microが出てきたので、Windowsを起動するときの作業をこいつにやらせることにしました。起動してPro Microの通電が始まった時、スイッチがショートしていたらWindowsモード(10秒くらい待ってカーソルキーを連打してEnter)になります。キーを押し終えたかLinuxモードのときはデバイスをスリープモードにして終わらせています。エコい。

雑にフリスクケースに打ち込んでサクッと完成。

f:id:Akkiesoft:20190323225131j:plain:w640

設置も雑にやりましたが、やりたいことはできるようになったので良いのではないでしょうか。

f:id:Akkiesoft:20190323225145j:plain:w640

めでたし。

以下コード。終了時に消せるLEDを消しとくコードはここのを参考にしました。

www.electronicsweekly.com

#include <HID-Project.h>
#include <HID-Settings.h>
#include <avr/sleep.h>

const int buttonPin = 2;
const int RXLED = 17;
const int TXLED = 30;

int buttonState = 0;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RXLED, OUTPUT);
  pinMode(TXLED, OUTPUT);
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {
    Keyboard.begin();
    delay(11000);
    for (int i=0; i < 4; i++){
      Keyboard.press(KEY_DOWN_ARROW);
      delay(10);
      Keyboard.release(KEY_DOWN_ARROW);
      delay(10);
    }
    Keyboard.press(KEY_RETURN);
    delay(10);
    Keyboard.release(KEY_RETURN);
  }
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(RXLED, HIGH);
  digitalWrite(TXLED, HIGH);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_mode();
}

void loop() {
  delay(1000);
}