Digispark를 사용하여 USB 연결 패트라이트를 만들어 보았습니다.

PC로부터의 이벤트를 화면을 보지 않아도 눈치채고 싶다!



공용의 PC로 처리를 달리고 있는 사이에 개인용의 PC로 작업을 하고 있으면 처리 종료를 눈치채지 못하는 일이 있습니다. 처리의 수율은 가능한 한 빨리 주지할 필요가 있습니다만, 조금 떨어진 PC의 화면을 계속 바라보고 있는 것에도 갈 수 없습니다.
거기서 처리가 종료하면 패트라이트를 빛나게 한다고 하는 아이디어까지는 나왔습니다만, USB 접속의 것은 적고 패트라이트를 사려고 하면 의외로 높다는 것을 알았으므로 자작해 보기로 했습니다.
Digispark는 아마존 로 1개 300엔 정도로 살 수 있는 마이크로 USB 타입의 것을 사용했습니다. 기초 라든지 LED 라든지는 수중에 있는 값싼 물건을 사용했으므로, 코스트는 500엔도 들지 않았다고 생각합니다.

Windows에서 USB를 통해 arduino로 신호 보내기



정보를 찾는 데 어려움을 겪었습니다. 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Ω의 저항을 끼워 결선하는 것을 상정하고 있습니다.

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를 사용하면 녹색만 묘하게 어두웠던 것이 유감입니다.
    Digispark의 USB-Serial 통신에서 분투기

    좋은 웹페이지 즐겨찾기