본문 바로가기

Arduino

Arduino + IRLED + motion (아두이노 IRLED로 간단한 모션인식)






Sky vega광고..얘는 왼쪽 오른쪽을 어떻게 구별하는걸까.. 서..설마 카메라?




리모컨 만들때 쓰이는
IRLED와 적외선수신부를 이용하면 무척 저렴하게
근접 센서와 물체 감지센서를 구현할 수 있습니다. (물체가 있다 없다 정도만...)


물체감지는 IRLED와 센서를 송신 수신 라인을 마주보도록 구성해놓고
그 사이에 물체가 있을경우 수신이 안되므로 판단할 수 있고,

근접센서는 송.수신부를 같은 방향으로 구성해놓고,
송신한 적외선이 물건에 부딪혀 수신부에 들어오는 여부를 판단해서
근접한 물건이 있는지 없는지 알 수 있습니다.

아두이노로 IRLED를 이용한 근접 센서를 테스트해보고...
저 스카이베가 광고가 생각이 나서 센서 두개를 구성해서 간단한 모션인식을 만들어봤습니다.

IRLED는 SI5312-H
수광부는 KSM-603LM5ND

각각 600원, 120원으로 엘레파츠에서 구입.. 싸다 싸..

이미 Arduino를 위한 IR송수신 라이브러리가 존재하므로 그것을 이용 
http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html  

근접 센서로서 테스트를 해보니 대략 7cm이내로는 인식이 잘 됩니다.




요렇게 두개 연결
(수신부에 잡음없애려면 회로를 더 구성해야하지만 단순 있다 없다만 판단하면 되므로 다 무시)




왼쪽에서 오른쪽인지, 오른쪽에서 왼쪽인지 구별하기 위한 스케치 작성.
원래는 수신부를 thread를 써서 하려고 했는데 IR library 와 동시에 사용하는게 불가능해 보여서
(고치는게 능력밖 ;;)
아래와 같이 단순한 코드로 작성 했습니다.
각각의 경우에 1과 2를 시리얼로 뿌려줍니다. 

#include <IRremote.h>

#define PIN_IR 3
#define PIN_DETECT1 5
#define PIN_DETECT2 6
#define PIN_STATUS 13

IRsend irsend;
void setup()
{
  Serial.begin(9600);
  
  pinMode(PIN_DETECT1, INPUT);
  pinMode(PIN_DETECT2, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);
}

void loop() {
  int i = 0;
  int pr1 = digitalRead(PIN_DETECT1);
  int pr2 = 1;
  
  if (pr1 == 0) {
    while (i < 100) {
      delay(10);
      pr2 = digitalRead(PIN_DETECT2);
      if (pr2 == 0) {
        //Serial.println("Right -> Left");
        Serial.println(1);
        delay(100);
        break;
      }
      i++;
    }
  }

  i = 0;
  pr1 = 1;
  pr2 = digitalRead(PIN_DETECT2);
  
  if (pr2 == 0) {
    while (i < 100) {
      delay(10);
      pr1 = digitalRead(PIN_DETECT1);
      if (pr1 == 0) {
        //Serial.println("Left -> Right");
        Serial.println(2);
        delay(100);
        break;
      }
      delay(10);
      i++;
    }
  }
}


 
근데 시리얼로 뿌려만 주면 재미 없으니까!!
우분투 compiz화면 효과와 연동시켰습니다.

Linux쪽 프로그램은 단순 시리얼 프로그래밍에 key event 발생시키는 유틸을 써서 했어요.
(이것도 처음에는 BT장치로 하려고 했었는데 시간이 걸려서 우선 시리얼로 해봤습니다.)




결과

 

요런기능을 쓸일이 없다는게 함정.