Digisparkを使ってUSB接続パトライトを作ってみた

#PCからのイベントを画面を見なくても気付けるようにしたい！
　共用のPCで処理を走らせているあいだに個人用のPCで作業をしていると処理終了に気が付かないことがあります。処理の収量はできるだけ早く周知する必要があるのですが、少し離れたPCの画面をずっと眺めているわけにもいきません。
　そこで処理が終了したらパトライトを光らせるというアイディアまでは出たのですが、USB接続のものは少ないしパトライトを買おうとすると意外と高いということが分かったので自作してみることにしました。
Digisparkは[Amazonとか](https://www.amazon.co.jp/dp/B082M58JR2/ref=cm_sw_em_r_mt_dp_494W1PYK8YCZ5B6D5FF7)で1個300円程度で買えるマイクロUSBタイプのものを使いました。[基盤](https://www.amazon.co.jp/dp/B0117G762U/ref=cm_sw_em_r_mt_dp_95V6ZEFC8YKPMAV9DRCT)とか[LED](https://www.amazon.co.jp/dp/B078MPBQYL/ref=cm_sw_em_r_mt_dp_0MNFD342AYMWBQ9J4BTN)とかは手元にある安物を使ったので、コストは500円もかからなかったと思います。

##WindowsからUSB経由でarduinoに信号を送る
情報を見つけるのに苦労しましたが、[DigisparkのUSB-Serial通信での奮闘記](https://martyworkshopdiary.blogspot.com/2018/04/digisparkusb-serial.html) に書かれていた DigiUSB.h というライブラリと、[digistump
/DigisparkExamplePrograms](https://github.com/digistump/DigisparkExamplePrograms)を解凍したときにできるフォルダ \DigisparkExamplePrograms-master\Python\DigiUSB\windows の中の send.exe を使うとarduinoに信号を送ることが分かりました。
下でお示しするコードをDigisparkに流し込んだあと、Windowsで以下のコマンドを実行するとLEDが３つ点灯するという仕組みです。
タスクスケジューラなどでコマンドを呼び出すようにすると時間が来たら点灯、というようなこともできます。


```
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Ωの抵抗をはさんで結線することを想定しています。

```cpp:patrite.ino
#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個


写真ではわかりにくいですが、安いLEDを使ったら緑色だけ妙に暗かったのが残念です。
![DSC_0054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199416/adf5cd86-46b1-bd83-eb64-a6e0e09e622a.jpeg)