-
리모컨과 적외선 센서의 기본 연결하기Arduino/리모컨과 적외선 센서 2020. 10. 30. 17:56
아래와 같이 우선, 아두이노의 5V와 빵판의 VCC에 연결하고,
아두이노의 GND와 빵판의 GND에 연결한다.
VCC선은 붉은 선, GND는 검은 선이다.
그리고 지금 보이는 적외선 센서의 방향을 기준으로 오른쪽 왼쪽이라고 하겠다.
적외선 센서의 맨 왼쪽은 아두이노의 11번핀과 연결한다.
맨 오른쪽은 빵판의 VCC와 연결하고 가운데 선은 빵판의 GND와 연결한다.
각 선들의 색은 노란색(아두이노 11번핀), 검은색(GND), 붉은색(VCC)이다.
GND는 뒤에 연결하였다.
리모컨과의 기본적인 수신 예제
아래의 예제를 실행하고 시리얼 모니터를 통해 리모컨의 버튼을 누르면
리모컨 버튼이 눌리면 0이 출력됨을 알 수 있다.
소스 코드
더보기// 리모콘과의 수신 void setup() { // put your setup code here, to run once: pinMode(11,INPUT); Serial.begin(9600); } void loop() { Serial.println(digitalRead(11)); delay(100); }
아두이노 프로그램에서 스케치 탭에서 라이브러리 포함하기를 선택하고 라이브러리 관리를 선택한다.
그리고 IRremote 라이브러리를 설치한다.
아래의 예제를 통해서 리모컨의 숫자버튼을 눌렀을 때의 값은 16진수로 출력이 됨을 알 수 있다.
이 값들을 유심히 보자.
밑에서 이 눌린 값을 가지고 LED를 ON/OFF 하거나 서보 모터를 작동 시킬 것이다.
소스 코드
더보기#include <IRremote.h> IRrecv IrReceiver(11); // 11번핀을 사용. 아두이노의 11번핀에 연결 decode_results result; void setup() { // put your setup code here, to run once: Serial.begin(9600); IrReceiver.enableIRIn(); // IrReceiver의 수신 시작을 의미 } void loop() { // put your main code here, to run repeatedly: // 데이터를 result에 저장. if (IrReceiver.decode(&result)) { Serial.println(result.value,HEX); IrReceiver.resume(); // 다음 값을 받을 수 있도록 세팅 } }
아래는 리모컨이 어느 회사 제품인지를 확인하는 예제이다.
나중에 관심이 있으면 "IR 신호 구성"이라고 검색해서 더 자세히 알아보도록 하자.
시리얼 모니터를 통해 리모컨 키패드를 누르면 그에 대한 정보가 뜬다.
소스 코드
더보기#include <IRremote.h> #define IRRECV_PIN 11 // IR 수신 핀 할당 // IR 수신 클래스 객체 생성 IRrecv irrecv(IRRECV_PIN); // IR 수신하여 복조된 데이터 클래스 객체 생성(수신된 데이터의 저장소) decode_results results; // decodeType 출력을 편하게 하기위한 문자열 배열 String decodeType[19] = { "UNKNOWN", // decodeType : -1 "UNUSED", // decodeType : 0 "RC5", "RC6", "NEC", "SONY", "PANASONIC", "JVC", "SAMSUNG", "WHYNTER", "AIWA_RC_T501", "LG", "SANYO", "MITSUBISHI", "DISH", "SHARP", "DENON", "PRONTO", "LEGO_PF", }; void setup() { Serial.begin(9600); delay(3000); Serial.println(F("IR Recv Program Start...")); irrecv.enableIRIn(); // IR 리시버 동작 시작 irrecv.blink13(true); } void loop() { // irrecv.decode(&results) 수신된 IR 데이터 처리가 문제 없는 경우 1(TRUE)을 반환 // results.decode_type는 회사코드 if (irrecv.decode(&results)) { // DecodeType, Data, Bit 수를 출력 Serial.println(F("========================================")); Serial.print(F("Decode Type : ")); Serial.println(decodeType[results.decode_type+1]); Serial.print(F("Received Data : 0x")); Serial.println(results.value, HEX); Serial.print(F("Received Data Bits : ")); Serial.println(results.bits); irrecv.resume(); // 다음신호를 받을 수 있도록 준비 } delay(100); }
위에서 말한대로, 리모컨의 키패드 버튼1과 2를 누르면 LED 제어 및 서보 모터 제어를 하자.
하드웨어를 연결해보자.
LED를 연결해보자. LED는 아두이노의 7번핀과 연결한다. 저항은 220옴을 사용한다.
저항의 맨 오른쪽 다리는 빵판의 GND에 연결된다.
LED와 같은 라인의 초록색선은 아두이노의 7번핀과 연결된다.
그리고 아래의 그림과 같이 점프선이 하나 필요하다.
그리고 마지막으로 서보 모터를 연결하자.
서보 모터에 붙은 선의 색상을 기준으로 연결해보자.
갈색은 빵판의 GND에 연결하고, 가운데 붉은선은 빵판의 VCC에 연결한다.
맨 왼쪽의 주황색선은 아두이노의 6번핀에 연결한다.
소스 코드
더보기#include <IRremote.h> #include <Servo.h> IRrecv IrReceiver(11); // 11번핀을 사용. 아두이노의 11번핀에 연결 decode_results result; Servo servo; // 리모컨의 1번 키패드 값,2번 키패드 값,3번 키패드 값에 대한 16진수값 int remoteValues[] = {0xFF30CF,0xFF18E7, 0xFF7A85}; int remoteValuesLen = 0; // remoteValues배열의 데이터의 개수 bool remoteState = false; bool servoMotorState = false; const int LED_PIN = 7; // LED를 아두이노 7번핀과 연결 const int SERVO_PIN = 6; // 서보 모터를 아두이노 6번핀과 연결 // 리모컨 키패드값에 따른 처리로 // 1값은 리모컨의 1번 키패드 값으로 LED ON/OFF 제어를 // 2값은 리모컨의 2번 키패드 값으로 서보 모터의 제어를 한다. enum MENU{LED_MENU = 1,SERVO_MOTOR_MENU}; void setup() { // put your setup code here, to run once: Serial.begin(9600); IrReceiver.enableIRIn(); // IrReceiver의 수신 시작을 의미 remoteValuesLen = sizeof(remoteValues) / sizeof(int); pinMode(LED_PIN, OUTPUT); // LED 핀의 초기화 servo.attach(SERVO_PIN); // 6번핀 servo.write(0); // 서보 모터 초기화 } // 리모컨이 눌린 값을 매개변수로 전달해서 // 리모컨의 키패드 값으로 변환하는 함수 int remoteKey(int value) { for (int i = 0; i < remoteValuesLen; i++) { if (remoteValues[i] == value) return (i + 1); } return 0; } void loop() { // 암호화된 데이터를 result에 저장. if (IrReceiver.decode(&result)) { int keyNum = remoteKey(result.value); // 리모컨 키 패드값으로 변환 Serial.println(result.value,HEX); // 리모컨의 1번 키패드가 눌리면 LED 제어 if (keyNum == LED_MENU) { if (remoteState == false) { LED_OnOFF(true); remoteState = true; } else { LED_OnOFF(false); remoteState = false; } } // 리모컨의 2번 키패드가 눌리면 서보 모터 제어 else if (keyNum == SERVO_MOTOR_MENU) { if (servoMotorState == false) { servo.write(170); servoMotorState = true; } else { servo.write(0); servoMotorState = false; } delay(1000); } IrReceiver.resume(); // 다음 값을 받을 수 있도록 세팅 } } void LED_OnOFF(bool state) { digitalWrite(LED_PIN,state); }
아래의 예제는 위의 내용에 피에조 부저를 추가한 내용이다.
피에조 부저의 하드웨어적인 연결은 아래를 참고하자.
아래의 파일에서 각 핀들의 설정을 재설정하도록 하자.
즉, LED핀과 서보 모터의 핀을 변경하도록 하자.
그리고 아래의 파일의 내용에 다음의 함수가 있다. 아래의 함수는 피에조 부저가 소방차 음을 내는 함수이다.
bool sobangcha(){ for(int hz=300;hz<=750;hz++){ tone (soriPin, hz); delay(5); /* if(ir.decode(&result)){ if(result.value==0x9716BE3F) return false; ir.resume(); }*/ } for(int hz=750;hz>=300;hz--){ tone (soriPin, hz); delay(10); /* if(ir.decode(&result)){ if(result.value==0x9716BE3F) return false; ir.resume(); } */ } flag=false; return false; }
위에서 주석으로 된 if 문장이 의미하는 바는 만약 리모컨으로 피에조 부저음을 울리게 했다면
이 부조가 울리는 중간에 음을 끄는 기능을 위해 넣은 것으로
리모컨의 수신을 가능하도록 하는 부분이다.