PCからのイベントを画面を見なくても気付けるようにしたい!
共用のPCで処理を走らせているあいだに個人用のPCで作業をしていると処理終了に気が付かないことがあります。処理の収量はできるだけ早く周知する必要があるのですが、少し離れたPCの画面をずっと眺めているわけにもいきません。
そこで処理が終了したらパトライトを光らせるというアイディアまでは出たのですが、USB接続のものは少ないしパトライトを買おうとすると意外と高いということが分かったので自作してみることにしました。
DigisparkはAmazonとかで1個300円程度で買えるマイクロUSBタイプのものを使いました。基盤とかLEDとかは手元にある安物を使ったので、コストは500円もかからなかったと思います。
WindowsからUSB経由でarduinoに信号を送る
情報を見つけるのに苦労しましたが、DigisparkのUSB-Serial通信での奮闘記 に書かれていた DigiUSB.h というライブラリと、digistump
/DigisparkExampleProgramsを解凍したときにできるフォルダ \DigisparkExamplePrograms-master\Python\DigiUSB\windows の中の send.exe を使うとarduinoに信号を送ることが分かりました。
下でお示しするコードをDigisparkに流し込んだあと、Windowsで以下のコマンドを実行するとLEDが3つ点灯するという仕組みです。
タスクスケジューラなどでコマンドを呼び出すようにすると時間が来たら点灯、というようなこともできます。
send.exe RGB
コマンド一覧
r 赤色LED消灯
R 赤色LED点灯
t 赤色LED点滅
g 緑色LED消灯
G 緑色LED点灯
h 緑色LED点滅
b 青色LED消灯
B 青色LED点灯
n 青色LED点滅
Arduino (Digispark)側のプログラムと配線
以下のプログラムではP0、P1, P2にそれぞれ青、緑、赤色LEDを1KΩの抵抗をはさんで結線することを想定しています。
# include <DigiUSB.h>
char LED[3];
int t=0;
void setup() {
DigiUSB.begin();
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
/* Starting demo */
digitalWrite(0,HIGH);
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
DigiUSB.delay(2000);
digitalWrite(2,LOW);
DigiUSB.delay(500);
digitalWrite(1,LOW);
DigiUSB.delay(500);
digitalWrite(0,LOW);
}
void get_input() {
int lastRead;
// when there are no characters to read, or the character isn't a newline
while (true) { // loop forever
if (DigiUSB.available()) {
// something to read
lastRead = DigiUSB.read();
if(lastRead == 'B'){ /* turn on blue LED */
LED[0]=1;
}else if(lastRead == 'G'){ /* turn on green LED */
LED[1]=1;
}else if(lastRead == 'R'){ /* turn on red LED */
LED[2]=1;
}else if(lastRead == 'b'){ /* turn off blue LED */
LED[0]=0;
}else if(lastRead == 'g'){ /* turn off green LED */
LED[1]=0;
}else if(lastRead == 'r'){ /* turn off red LED */
LED[2]=0;
}else if(lastRead == 'n'){ /* blink blue LED */
LED[0]=2;
}else if(lastRead == 'h'){ /* blink green LED */
LED[1]=2;
}else if(lastRead == 't'){ /* blink red LED */
LED[2]=2;
}
if (lastRead == '\n') {
break; // when we get a newline, break out of loop
}
}
turnLED();
// refresh the usb port for 10 milliseconds
DigiUSB.delay(10);
}
}
void loop() {
// print output
DigiUSB.println("Waiting for input...");
// get input
get_input();
}
void turnLED(){
int i=0;
for(i=0; i<3; i++){
if(LED[i]==1){ /* turn on LED i */
digitalWrite(i,HIGH);
}else if(LED[i]==0){ /* turn off LED i */
digitalWrite(i,LOW);
}else if(LED[i]==2){ /* turn blink LED i */
if(t>50){
digitalWrite(i,HIGH);
}else{
digitalWrite(i,LOW);
}
}
}
if(t>100){
t=0;
}else{
t++;
}
}
部品リスト
- Digispark microUSBタイプ 1個
- ユニーバーサル基盤 1枚を3分の1に切ったもの
- LED 赤、青、緑 各2個
- 抵抗 1KΩ 3個