적외선(IR) 센서의 용도
오늘 장난감은 적외선(IR) 센서다.
다들 알겠지만, 리모컨과 체온계에 자주 쓰이는 그 센서다.
적외선을 이용하려면, 송신기와 수신기가 둘 다 필요하다.
주기만 하거나, 받기만 하면 예의가 아닌 것처럼
적외선도 줬으면 받는 것도 있어야 한다.
주고나서 돌아오는지 (장애물이 있는가?)
주고나서 몇 시간 뒤에 돌아오는지 (거리는 어느정도인가?)
어떻게 주는지 (어떤 리모컨 버튼을 눌렀는가?)
등등의 경우로 사용할 수 있다.
괜히 돈 빌려주는 경우가 생각나는데, 넘어가자.
IR센서 연결하는 법
내가 쓰는 적외선 센서에는 3가지 핀이 있다.
각각 PWM(데이터), VCC(전원), GND(접지) 이다.
순서대로 디지털핀, 5V (센서마다 다를 수 있음), GND에 연결시켜주면 된다.
송신기는 각 핀에 뭘 꽂아야 하는지 적혀있다
수신기는 핀이 나를 향하게 나뒀을 때, 왼쪽부터 GND, VCC, PWM 이다.
회로도 (없음)
결과물이다.
이렇게 먼저 보여주는 이유는
회로도 그리는 프로그램이 자꾸 꺼져서ㅠㅠ
전원과 GND 확장을 위해 브레드 보드를 이용하였다.
5V 를 (+), GND를 (-)에 꽂고,
10번에 수신기, 11번에 송신기, 12번에 LED를 꽂았다.
회로도가 없어서 아쉽지만, 그리 어려운 것도 아니니 한번 해보시길.
코드와 불평불만
int ir_reciv = 10, ir_trans = 11, led = 12;
void setup() {
pinMode(ir_reciv, INPUT);
pinMode(ir_trans, OUTPUT);
pinMode(led, OUTPUT);
}
void loop() {
int receive = digitalRead(ir_reciv);
digitalWrite(ir_trans,1);
if (receive == 1) // *여기*
{
digitalWrite(led, 0);
}
else
{
digitalWrite(led, 1);
}
}
*여기*라고 표시해둔 부분을 원래는 0 으로 뒀었다.
상식적으로 신호가 들어오면 1, 없으면 0 이므로,
그런데...
0이라 하면 안되고, 1이라 하면 되길래
'설마 신호가 있는 것을 0으로 잡나?' 라는 생각이 들어서
시리얼 통신으로 확인해보았다.
int ir_reciv = 10, ir_trans = 11
void setup() {
Serial.begin(9600); // 9600보드레이트로 시리얼통신 시작!
pinMode(ir_reciv, INPUT);
pinMode(ir_trans, OUTPUT);
}
void loop() {
digitalWrite(ir_trans, 1);
int obstacle = digitalRead(ir_reciv); // 변수에 수신기로 들어오는 신호를 입력
Serial.println(obstacle); // 시리얼 모니터에 변수 출력
}
했더니...
그렇게 나의 상식은
저승사자 손 잡고 이월드에 가버렸다.
작동 영상
영상을 자세히 보면 수신기 모듈 자체에도 LED가 있는 것을 알 수 있다.
LED를 쓰기 귀찮은 사람들은 이걸 통해 수신여부를 확인하면 된다.
그리고, 위의 시리얼 모니터 캡쳐 사진처럼
송신기를 가까이 대어도 계속 수신하는 것은 아닌 듯하다. (LED가 자주 깜빡이므로)
사실 서보모터를 포스팅 하려고 했는데,
내 노트북이 서보모터의 전력을 감당하기 힘들었는지 (이것조차...?)
자꾸 맛이 가려고 하길래 IR 센서로 노선을 갈아탔다.
정말 내 노트북이 문제인건가? 모터의 소모전력을 계산해보고 싶어진다.