행복한 하루
라즈베리파이 제로 프로젝트(18) – Pioneer600 모듈 IR Receiver (TSOP4856) 본문
라즈베리파이 제로 프로젝트(18) – Pioneer600 모듈 IR Receiver (TSOP4856)
변화의 물결 2021. 5. 18. 01:03
안녕하세요.
이번에는 생활 속에 볼 수 있는 리모컨을 이용해 보겠습니다. Pioneer600 모듈에는 IR Receiver 센서가 부착되어 있습니다. 이 부품은 집에서 사용하는 TV 리모컨 신호를 받을 수 있는 기능을 합니다. 그럼 한번 IR에 대해서 알아보겠습니다.
1. IR 원리
(1) 적외선(Infrared Ray) 이란
적외선은 가시광선 780㎚보다 긴 파장으로 레이저, 전파 등과 함께 가시광선 밖의 영역으로 구분된다. 적외선은 열적 작용이 강해 열선으로 불리며 가열, 건조, 생체에 대한 온열 효과로 이용된다. 파장의 길이에 따라 분류하면 파장 0.75∼3㎛의 적외선을 근적외선, 3∼25㎛의 것을 적외선, 25㎛ 이상의 것을 원적외선이라 한다.
근적외선은 열작용 외에 사진 작용, 광전 작용, 형광 작용을 하므로 검출기에는 사진 건판, 광전지, 광전관, 열전대, 인광체 등이 쓰이며, 그 외에도 소독이나 살균, 관절과 근육 치료에 쓰인다. 원적외선은 파장이 25㎛ 이상인 적외선이다.
가시광선보다 파장이 길어서 눈에 보이지 않고 열작용이 크며 침투력이 강하다. 또, 유기화합물 분자에 대한 공진 및 공명 작용이 강하다. 이러한 특성을 살려서 적외선은 [그림 1-16]처럼 다양한 산업, 의료 분야, 각종 전자제품 등에 응용되고 있다
그렇다면, 추가로 가시광선(Visible Light)에 대해서 알아볼 필요가 있다.
가시광선의 파장 범위는 약 380~780㎚로 가시광 이외의 다른 영역에 비해 매우 좁다. 이 좁은 영역에 다양한 색광이 포함되어 있어 우리 눈에 들어와 색 감각을 일으킨다.
(2) 적외선 센서
적외선을 쏘는 발광부(Ir LED)와 적외선을 받아들이는 수광부(photo diode)로 이루어진 센서로 명암을 분하여 거리측정을 할 수 있는 장치이다.
<참조 : 적외선(Ir) 통신 및 리모컨 원리 이해- steam.kofac.re.kr>
2. TSOP4856(IR Receiver Module) 특징
• Low supply current
• Photo detector and preamplifier in one package
• Internal filter for PCM frequency
• Improved shielding against EMI
• Supply voltage: 2.7 V to 5.5 V
• Improved immunity against ambient light
• Insensitive to supply voltage ripple and noise
- Block Diagram
- Relative Spectral Sensitivity vs. Wavelength
일반 Transistor처럼 Emitter, Base, Collector 3 단자로 구성되어 있습니다. 창을 통해 들어오는 빛이 Base에 인가되어 Transistor가 동작하므로 부품에 있는 Base 단자는 연결하지 않고 사용합니다. 파장 900nm ~ 1000nm 부근에서 최대 감도를 가지는 것을 알 수 있습니다.
- Horizontal Directivity
그리고 방사 패턴을 보면 방사각이 지향성 보다 넓습니다. 다시 말해서 IR LED와 같이 사용할 때, 이 방사각 안에 적외선이 들어와야 감지가 된다는 것입니다. IR LED의 지향 각도 조금 크므로 IR LED와 Photo-transistor가 서로 마주 보지 않아도 송수신이 가능합니다.
3. 회로도
C12는 전원 리플과 고주파 노이즈 제거용 콘덴서이고, 특히 +3.3V와 직렬로 연결된 R6 저항은 필히 연결하여 전류를 제한해야만 모듈이 고장 나지 않습니다. 이 저항값이 크면 OUT 출력 레벨이 줄어들기 때문에 적절하게 사용하는 것이 좋습니다. 저항과 콘덴서를 없이 사용해도 되지만 신뢰도가 떨어질 수 있습니다.
4. 연결하기
회로도에서 본 것처럼 3선만 연결하면 됩니다. +전원(3V3), GND, Data 핀(P1)과 연결해주면 됩니다.
5. 소스 확인
- 소스는 분석이 어려울 수 있습니다. 그래서 먼저 리모컨 프로토콜을 간단하게 이해하고 소스 코드를 보도록 하겠습니다.
1) 소스코드 분석 전 이해 필요 부분
- IR 프로토콜은 크게 2가지 회사 제품으로 포맷으로 되어 있습니다.
( 프로토콜이 2개만 있는 것은 아닙니다. 그중에 많이 공개된 것을 말합니다.)
- 삼성은 TOSHIBA format을 LG는 NEC format이 같은 구조를 가집니다. 가장 큰 차이는 리더 코드의 ON 시간이 4.5ms와 9ms를 제외하고 동일합니다. 아래 프로토콜을 보면 구조를 보면 알 수 있습니다.
① 선두 코드(Leader Code)
리모컨 데이터의 시작을 알려주는 코드이며, LG는 9ms 동안 ON, 4.5ms 동안 OFF이며 삼성 리모컨은 4.5ms 동안 ON, 4.5ms 동안 OFF입니다.
② 커스텀 코드(Custom Code)
2바이트의 데이터로 구성되어 있으며, 커스텀 코드는 리모컨 제작 회사와 제품별 다른 코드로 구성되며, 회사에 따라 16비트 코드나 8비트 코드와 반전된 8비트 코드를 사용합니다.
③ 데이터 코드(Data Code)
2바이트의 데이터로 구성되고, 첫 번째 바이트는 리모컨 버튼에 따른 인식 코드이며, 두 번째 바이트는 첫 번째 바이트의 반전시킨 데이터입니다.
- 데이터의 각 비트는 0과 1로 구성되어 있으며, 비트가 0인 경우에는 ON 부분이 0.56ms이고 전체 데이터 길이는 1.125ms입니다. 그리고 비트가 1인 경우에는 ON 부분이 0.56ms이고 전체 데이터 길이는 2.25ms입니다. 따라서 수신된 데이터 비트가 0과 1을 판별하기 위해서는 데이터의 길이를 측정하면 알 수 있습니다.
즉, 각 신호의 상승 에지에서 다음 상승 에지까지의 시간을 측정하여 1.125ms이면 수신된 비트가 0이고 2.25ms이면 수신된 비트가 1이 됩니다. 소스 상에서도 뒷부분의 시간을 측정해서 0과 1로 구분합니다.
2) 소스 확인
- 소스코드는 NEC/LG 타입으로 설정되어 있습니다. 필요에 따라 리드 시간을 설정해서 삼성/도시바 타입으로 바꿀 수도 있습니다.
- 입력 핀을 풀업으로 설정합니다.
- 현재에서는 리더 값(Leader) 필요 없으니 시간 저장하지 않고 흘려보냅니다.
- 저장할 변수를 초기화합니다.
- 실제 필요한 4바이트 주소 변수와 데이터 받을 준비를 합니다.
- 0과 1을 구분하기 위해서 첫 번째 펄스를 확인하고 두 번째 하강 펄스 시간을 구해 0과 1을 구분해 냅니다. 그리고 시프트 연산을 해서 데이터를 누적하고 카운트 개수에 따라서 idx 값을 바꿔 4곳 data 배열에 저장합니다.
- 최종 저장된 data 배열을 보면 앞의 8비트와 앞의 8비트를 반전된 값으로 되어있기 때문에 서로 더하면 0xFF(0x1111 1111) 값이 되기 때문에 0xFF 값을 체크하고 정상이면 리모컨에서 받은 값을 출력해줍니다.
<irm.c>
#include <wiringPi.h>
#include <stdio.h>
#define PIN 1
#define IO digitalRead(PIN)
unsigned char i,idx,cnt;
unsigned char count;
unsigned char data[4];
int main()
{
if (wiringPiSetup() < 0)return 1;
pinMode(PIN, INPUT);
pullUpDnControl(PIN, PUD_UP);
printf("IRM Test Program ... \n");
while (1)
{
if(IO == 0)
{
count = 0;
while(IO == 0 && count++ < 200) //9ms
delayMicroseconds(60);
count = 0;
while(IO == 1 && count++ < 80) //4.5ms
delayMicroseconds(60);
idx = 0;
cnt = 0;
data[0]=0;
data[1]=0;
data[2]=0;
data[3]=0;
for(i =0;i<32;i++)
{
count = 0;
while(IO == 0 && count++ < 15) //0.56ms
delayMicroseconds(60);
count = 0;
while(IO == 1 && count++ < 40) //0: 0.56ms; 1: 1.69ms
delayMicroseconds(60);
if (count > 25)data[idx] |= (1<<cnt);
if(cnt == 7)
{
cnt = 0;
idx++;
}
else cnt++;
}
if(data[0]+data[1] == 0xFF && data[2]+data[3]==0xFF) //check
printf("Get the key: 0x%02x\n",data[2]);
}
}
}
<Makefile>
irm:irm.c
gcc -Wall irm.c -o irm -lwiringPi
clean:
rm irm
pi@raspberrypi:~/Pioneer600/IRM/wiringPi $ make clean && make
pi@raspberrypi:~/Pioneer600/IRM/wiringPi $ ./irm
6. 동작 확인
- 현재 집에 TV가 없어서 리모컨이 없습니다. 그래서 LG 스마트폰 G2에 붙어 있는 IR 리모컨 기능으로 테스트해보았습니다.
- 전원 버튼을 누르면 0x08이 나왔고 채널 Up 버튼은 0x00 등 데이터를 확인할 수 있습니다.
- 이 데이터를 이용해서 리모컨으로 라즈베리파이에 명령을 주는 코드로 작성할 수 있습니다. 그리고 RF 통신보다 가격도 비싸고 안테나 고려하지 않고 TV 리모컨으로 재미있는 것을 만들 수 있을 거라고 생각 듭니다.
감사합니다.
<참고 사이트>
1. [적외선 통신] IR 송수신 소자, IR 송수신 회로
https://www.tuwlab.com/ece/27106
2. 적외선(Ir) 통신 및 리모컨 원리 이해
https://steam.kofac.re.kr/wp-content/plugins/download-attachments/includes/download.php?id=915
3. TSOP4856 Datasheet
'RaspberryPi > Raspberry Pi Zero' 카테고리의 다른 글
라즈베리 파이 제로 2 W(Raspberry Pi Zero 2 W) 사용 후기 (0) | 2022.03.20 |
---|---|
라즈베리파이 제로 프로젝트(17) – Pioneer600 모듈 1-wire 온도센서 (DS18B20) (0) | 2021.03.27 |
라즈베리파이 제로 프로젝트(16) – Pioneer600 모듈 Real Time Clock (DS3231) (0) | 2021.03.13 |
라즈베리파이 제로 프로젝트(15) – Pioneer600 모듈 (BMP280) (0) | 2021.03.07 |
라즈베리파이 제로 프로젝트(14) – Pioneer600 모듈 (PCF8574 I/O expansion) (0) | 2021.02.19 |