본문 바로가기

Arduino(아두이노)

[버섯][Arduino] 아두이노 프로 미니(Arduino Pro mini) - IR제어-LED


안녕하세요 버섯돌이 유재성입니다.


본 강좌는 아두이노를 활용한 RC 장난감을 만들기 위한 기초 강좌로서

지금까지 간단하게 아두이노 IDE 환경및 LED 제어 방법을 살펴 봤습니다.


제 경우 단순히 차량이 움직이는 것 외에 아이들이 아주 어리다 보니 좋아할 만한 재미 요소로서

경찰차가 전/후진이나 특정 액션시에 사운드나 차량에 불이 들어오면 좋을 것 같습니다.

그래서 이번에는 적외선(IR)을 이용한 LED 제어를 살펴보도록 하겠습니다.


::요구사항::

아이들의(?) 간단한 요청 사항을 파악합니다.

아빠 아빠~ 리모컨의 전진을 누르면 파란 불이...

리모컨의 후진을 누르면 빨간 불이...

정지(OK) 버튼을 누르면 불이 전부 꺼지게 해주세요~



::선행학습::

[버섯][Arduino] KEYS IR KIT을 이용한 IR 제어 샘플


[버섯][Arduino] 아두이노 프로 미니(Arduino Pro mini) - 포트 설정및 LED 예제


::준비물::

- 빨간색 LED - 1개

- 파란색 LED - 1개

- 저항 330옴(1K 옴 이하) 2개

- IR 수신 소자

- 리모컨 or IR 송신기(예: IR 조종기)

- 브레드 보드 및 점퍼선 

- 아두이노 프로 미니 or 아두이노 제품군


 

::부품 배치::


지난번 IR 강좌에서 IR 수신 모듈을 11번 핀에 연결했으므로 이번에도 동일하게 11번 핀에 연결합니다.

그리고 LED가 2개 사용되므로 빨간색 LED13번 핀에 / 파란색 LED12번 핀에 연결합니다.

저번 강좌에서 설명드렸듯이 LED의 한쪽에는 330옴 저항을 연결하셔야 합니다.


세부 회로도 등을 그리는데 시간이 오래 걸리는군요.^^;;;

대충 그림으로 나타내면 아래와 같습니다.




회로도는 아래와 같습니다.




PCB로는 아래와 같습니다.



디자인 실력이 좋지 않아서 복잡해 보이지만 알고 보면 상당히 간단합니다.

브레드 보드에 올려서 선이 복잡해졌는데 자세히 보시면 상당히 간단하니 아래 사진을 참고 하시기 바랍니다.




제 경우 파란색 LED를 놓고 와서 초록색 LED로 대체했으니 참고하시기 바랍니다.




다른 각도에서 촬영해봤습니다.



IR 소자는 지난 강좌를 참고하시면 결선에 도움이 되리라 봅니다.



사진 몇 컷만으로는 결선이 힘드신 분들을 위해 영상으로 촬영했으니 참고 하시기 바랍니다.



최종 형상은 위와 같으며 제 경우 딸이 좋아하는 뽀로로 리모컨을 사용해야 하는데...

따님께서 최근에 뽀로로 리모컨을 갖고 놀다가 어딘가에 감춰 놓은 것 같은데...

아직 말을 못 하는 나이라서 뽀로로 리모컨을 갖다 달라고 부탁하면 엉뚱한 곳을 헤매다 오네요..^^;;;

ㅋㅋㅋ.. 그래서 일단 이번 버전에서는 송/수신 오류가 최대한 적은 위의 IR 모듈 킷이 사용되었습니다.*^^*V


::소스 코드::

//============================================================================================
// Police Car Sample - IR LED
//--------------------------------------------------------------------------------------------
// date : 2015-06-17
// Ver : 0.1
// Program by Yoo JaeSung ( http://blog.naver.com/dev4unet )
// used library :  https://github.com/shirriff/Arduino-IRremote
//============================================================================================
#include <IRremote.h>

#define IR_KEY_PRESSED 0xFFFFFFFF

#define IR_KEY_UP 0xFF629D
#define IR_KEY_DOWN 0xFFA857
#define IR_KEY_OK  0xFF02FD

#define LED_RED_PIN 13
#define LED_BLUE_PIN 12

int RECV_PIN = 11;
int prevPin = -1;
IRrecv irrecv(RECV_PIN);
decode_results results;


void ledInit() {
  pinMode(LED_RED_PIN, OUTPUT);  
  pinMode(LED_BLUE_PIN, OUTPUT);  
}

void ledAllOff() {
  digitalWrite(LED_RED_PIN, LOW);
  digitalWrite(LED_BLUE_PIN, LOW);
}

void ledOff(int pin) {
  digitalWrite(pin, LOW);
}

void ledOn(int pin) {
  digitalWrite(pin, HIGH);
}

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  ledInit();
  ledAllOff();
}

void loop() {
  if (irrecv.decode(&results)) {
    switch(results.value) {
        case IR_KEY_PRESSED:
                Serial.print("Prev Pin : ");
                Serial.println(prevPin);
                break;

        case IR_KEY_UP:
         Serial.println("IR_KEY_UP");
                if(prevPin != -1) ledOff(prevPin);
                prevPin = LED_BLUE_PIN;
                ledOn(prevPin);
         break;
        
        case IR_KEY_DOWN:
         Serial.println("IR_KEY_DOWN");
                if(prevPin != -1) ledOff(prevPin);
                prevPin = LED_RED_PIN;
                ledOn(prevPin);
         break;
        
        case IR_KEY_OK :
         Serial.println("IR_KEY_OK ");
                ledAllOff();
                     prevPin = -1;
                   break;
        default:
         //Serial.print("Unknown Key:");
                //Serial.println(results.value, HEX);
         break;
    }
    irrecv.resume(); // Receive the next value
  }
}


소스와 동작을 조금씩 다듬어 나가는 형태로 진행하는 게 좋을 듯싶어서 간단한 형태로 작성했으니

지난 IR 강좌를 이해하셨으면 설명이 필요 없을 정도로 소스가 상당히 간단합니다.


간단히 설명 드리면....

setup()에서는 irrecv.enableIRIn();에 의해서 IR 수신 모듈을 활성화시키고

ledInit();에 의해서 각 LED 핀들을 출력 핀으로 활성 합니다.

혹시나 싶어서 ledAllOff();에 의해서 모든 LED의 불을 꺼 놓습니다.^^


그 뒤로는 loop()에 의해서 loop() 안의 내용이 무한 반복됩니다.

"if (irrecv.decode(&results)) {" 에 의해서 IR 리모컨의 신호를 수신했을 때에만 특정 부분이 실행되되록 되어있습니다.


"case IR_KEY_PRESSED:"는 특정 버튼을 계속 누르고 있을 때 실행됩니다.

예를 들어, 전진 버튼을 계속 누르고 있을 때 실행됩니다.


"case IR_KEY_UP:"는 전진 버튼(위 방향 키)를 눌렀을 때 실행됩니다.


"case IR_KEY_DOWN:"은 후진 버튼(아래 방향 키)를 눌렀을 때 실행됩니다.


"case IR_KEY_OK:"는 정지 버튼(OK 버튼)을 눌렀을 때 실행됩니다.


"default:"는 위 외의 버튼이 눌렸을 때 실행되며 주석 부분을 해제해서 갖고 계시는 리모컨에 맞는
전진/후진/정지 버튼의 키 값을 알아 내신 후 #define 의 값을 수정하시기 바랍니다.

IR_KEY_UP / IR_KEY_DOWN 등에서 직접 특정 LED에 불을 켜도 되는데...
보통 상용 IR 차량들을 보면 전진 버튼을 위로 올리고 있는 동안에만 전진하는 형태라서
비슷하게 구현하기 위해 해당 버튼이 눌린 시점에서는 어떤 키가 눌렸다는 값을 prevPin 변수에 저장 후
IR_KEY_PRESSED(특정 버튼을 계속 누르고 있을 때에 실행 됨)에서 해당 값을 활용하려고 했으나...
제 내공으로는 버튼에서 손을 떼는 시점을 정확하게 확인하는 게 쉽지 않아서 소스가 저런 형태가 되었습니다.*^^*V
무엇보다 아직 기초 문법만 사용해야 하는데 소스가 더 복잡해지면 보는 사람도 어려워질 듯싶어서 적정 수준에서 타협했습니다.^^;;


::동작 영상::
간단한 동작 영상을 확인하시면 이해하는데 도움이 되리라 봅니다.*^^*
 


IR 특성상 형광등 아래에서 전파 간섭이 있어서 신호가 제대로 수신되지 않는 경우가 있으며
가급적 IR 리모컨을 IR 수신 모듈을 향해서 눌러 주시기 바랍니다.


[목차] 버섯돌이와 함께하는 아두이노(Arduino) 기초 목차