Q : 기획자가 이런걸 왜 공부해요?
A : 기술에 대해서 알아야, 어디까지 되고 어디부터는 안되는지 알수 있습니다.
기술에 대해서 알아야, 그 기술을 통해 사용자에게 가치를 전달 할 수 있는 최적의 UI/UX로 설계 할 수 있습니다.
쨋든 공부했으니 아까워서 정리해둡니다.
Pronto가 뭔지, NEC가 뭔지 적외선 신호 가지고 뭘 하라고 해서 머리 싸매고 있는 기획자든, 개발자든
또다른 그 누군가에게 제가 먼저 걸은 길이 도움이 되길 바랍니다.
IR 신호에서의 비트 인코딩 : Logical 0, Logical 1의 표현
IR 신호 프로토콜에서 논리 0과 1을 표현하는 방법에는 두가지 방법이 있다.
1. Variable Length Encoding (PWM / PDM 사용)
MARK(Hightime)상태와 SPACE(Lowtime)상태 둘중 하나의 시간을 고정한채로,
나머지 상태의 길이를 다르게 하여 논리 0과 논리 1을 표현한다.
본 포스팅에서 알아볼 NEC 프로토콜의경우 Carrier Frequency = 38Khz 일때를 기준, 약 21주기
즉, (1/ 38000 hz) * 21 ≈ 562.5 μs 를 Fixed time 길이로 고정하여
- 논리 0 : Fixed time 만큼의 "MARK" 이후 1배수 길이의 "SPACE" 가 따라오는 신호
- 논리 1 : Fixed time 만큼의 "MARK" 이후 3배수 길이의 "SPACE" 가 따라오는 신호
와 같이 정의한다.
즉, 신호가 있는 상태를 의미하는 "MARK"와 신호가 없는 상태를 의미하는 "SPACE" 상태를
하나의 쌍으로써 논리 정보비트를 결정하며, 논리 정보비트의 신호 길이는 달라질 수 있다.
또한, PWM 혹은 PDM 둘중 어떤 주파수 변조 방식을 사용하느냐에
따라 "MARK" 와 "SPACE" 둘중 어느 것을 Fixed time 으로 설정할지 다르다.
PDM 방식은 논리 정보 비트 표현을 위해 "MARK"를 Fixed time 길이로 고정하고,
"SPACE" 의 길이를 다르게 하는데에 반해
PWM 방식의 경우는 "SPACE"를 Fixed time 길이로 고정하고, "MARK"의 길이를 다르게 적용하여 논리 1,0을 표현한다.
NEC 프로토콜의 경우에는 PDM 주파수 변조 방식을 사용한다.
대부분의 IC 컨트롤러는 신호가 없는 "SPACE" 상태를 IR LED를 끔으로서 표현이 가능하지만,
특정 IC 컨트롤러에서는 "SPACE" 상태를 100% Duty Cycle (Fully illuminated) 로서 표현해야 하는 경우도 있다.
전자의 경우에는 PWM보다는 PDM 이나 Manchester Encoding을 사용하는 것이 전력효율에서 이득을 가지며
후자의 경우에는 Manchester Encoding을 사용하는 것이 전력효율에서 이득을 가질 것이다.
2. Manchester Encoding
Variable Length Encoding과 마찬가지로 "MARK" 상태와 "SPACE" 상태를 가지지만
Manchester Encoding의 경우 "MARK" 와 "SPACE" 상태가 같은 Fixed time을 가진다.
즉, Manchester Encoding 에서의 논리 0과 1은 다음과 같이 표현된다.
NEC Protocol Message Frame Breakdown
NEC 프로토콜의 Carrier Frequency 라고 하는 기본 주파수는 38Khz이다. PDM(Pulse Density Modulation)을 사용한다.
NEC 프로토콜의경우 표준 Carrier Frequency = 38Khz 일때를 기준, 약 21주기
즉, (1/ 38000 hz) * 21 ≈ 562.5 μs 를 Fixed time 길이로 고정하여 "MARK" 상태의 단위 길이로 정한다.
Carrier Frequency의 경우 38Khz 가 표준이지만, 제조사에 따라 다른 경우가 있기에
캐리어 주파수에 따라 달라지는 "시간"으로 서술하기 보다는 Fixed time 의 길이를 가진 "MARK" 상태의
최소 단위길이를 1 Unit 이라고 설정하고 해당 단위 길이의 배수로 신호 길이를 서술하고자 한다.
0. 단위 신호 길이
Fixed time 만큼의 길이를 가진 "MARK" 의 단위 길이가 1 Unit 일때
38Khz를 기준으로 1 Unit 은 562.5 μs 의 신호 길이를 가진다.
논리 0
논리 0을 나타내는 신호의 길이는 1 Unit 길이의 "MARK"와 1 Unit 길이의 "SPACE" 신호로 이루어져 있으므로
총 2 Unit, 38Khz를 기준으로 562.5 μs x 2 = 1.125ms 의 길이를 가진다.
논리 1
논리 1을 나타내는 신호의 길이는 1 Unit 길이의 "MARK"와 3 Unit 길이의 "SPACE" 신호로 이루어져 있으므로
총 4 Unit, 38Khz를 기준으로 562.5 μs x 4 = 2.25ms의 길이를 가진다.
이제 본격적으로 NEC 프로토콜에서 정의하는 메세지 구조에 대해 알아보자.
1. 데이터 메세지
1-1. Preamble (Header - Leading Pulse Burst)
송신시 메세지 첫 부분에 길게 보내는 신호.
수신측 장치를 깨우고, IR 수신 Gain 값을 캘리브레이션 할 수 있도록 하는 역할을 한다.
16 Unit 길이의 "MARK" 신호 + 8 Unit 길이의 "SPACE" 신호로 이루어져 있다.
38Khz를 기준으로 9ms의 "MARK" 이후 8 Unit 의 "SPACE" 로 인한 4.5ms 의 간격을 가진다.
1-2. Data (Payload) : 32bit (16bit Address + 8bit Command + 8bit Command in Reversed bit)
8 자리 HEX code 로 알려져 있는 데이터 영역이다.
대체로 NEC 코드값을 표현할때 이 부분만 8자리의 16진수 HEX Code로 기록한다.
ex) https://www.tastethecode.com/backing-up-ir-remote-codes-ir-receiver
Vol+ 키로 기록되어 있는 NEC 코드 : 0xF7087F80 을 4 자리씩 끊어서 보았을때
F708으로 기록된 Address 영역을 2진수로 표현하면
1111 0111 0000 1000 으로 앞 8 bit는 Address, 뒤 8 bit는 Address 의 Bit Inversed 를 표현한다.
7F80으로 기록된 Command 영역을 2진수로 표현하면
0111 1111 1000 0000 으로 앞 8 bit 는 볼륨 UP을 뜻하는 명령코드 | 뒤 8 bit는 Command 의 Bit Inversed 표현임을
알 수 있다.
이처럼 NEC 프로토콜에서 Data 영역은 총 32 bit.
8bit Address + 8bit Address in inversed bit + 8bit Command + 8bit Command in inversed bit 의 구조를 가진다.
이는 데이터 무결성을 확인하기 위함으로,
Address와 그 반전 비트, Command 와 그 반전 비트가 각각 쌍을 이루기에
Variable Length Encoding을 사용하는 NEC 프로토콜에서의 논리 1과 0의 길이는 다르나
비트 반전을 하여 한쌍씩 묶어두어 전체 Data 프레임에서 논리 1과 0의 개수는 동일해짐에 따라
데이터 메세지의 길이는 항상 일정하다.
38Khz를 기준으로
8bit Address 가 전부 논리 0일 경우 = 2 Unit x 8 = 16 Unit = 9ms
8bit Address Bit inverse 는 전부 논리 1 = 4 Unit x 8 = 32 Unit = 18ms
8bit Command 가 전부 논리 0일 경우 = 2 Unit x 8 = 16 Unit = 9ms
8bit Command Bit inverse 는 전부 논리 1 = 4 Unit x 8 = 32 Unit = 18ms
총합, (48 Unit + 48 Unit) = 96 Unit = (27ms + 27ms) = 54ms 의 길이를 가진다.
단, 8bit Address, 즉 256개의 Address 영역이 모두 소진되어 고안된 NEC Extended 의 경우
8bit Address 의 비트반전 영역을 없애고 Address 영역에 통합하여 총 16bit Address 영역을 사용한다.
16 bit Address 영역의 길이는 제조사에게 부여된 Address 마다 다르고
Command 영역은 NEC Standard 와 마찬가지로 비트 반전을 통해 Data integrity를 체크 하기 때문에
Command 영역의 길이는 NEC Standard, NEC Extended 모두 27ms로 같다
이로 인해, NEC Extended 프로토콜에서 서로 다른 Address 정보를 가진 신호는 총 메세지 프레임 길이가 달라 질 수 있다.
1-3. End of Stream (Leadout Pulse Burst)
메세지 프레임의 끝에 스트림 종료를 알리는 신호.
"SPACE" 영역 없이 Fixed time 만큼의 "MARK" 신호만 Burst 한다.
즉, 1 Unit 길이로 38Khz를 기준으로 562.5 μs 길이의 신호이다
2. 반복 신호 (Repeat Codes)
리모컨의 키가 눌린 상태(Long Press)의 표현이나, 누른채로 반복 입력이 필요한 경우(ex) 음량조절)
Repeat Code를 통해 전체 메세지 프레임을 반복 전송하지 않고, 전력소모를 줄이면서 신호를 보낼 수 있도록 하는 신호
데이터 메세지 없이 단순히 Preamble + End of Stream 의 구조로 구성되어 있다.
2-1. Repeat Code's Preamble
Repeat Codes의 Preamable 프레임은 "MARK" 길이는 일반 메세지의 Preamble과 같지만
"SPACE" 길이는 일반 메세지의 Preamble 에서의 "SPACE"에 비해 절반의 길이를 가진다.
따라서 Repeat Codes의 Preamble 신호의 길이는
16 Unit 길이의 "MARK" 신호 + 4 Unit 길이의 "SPACE" 신호로 이루어져 있다.
38Khz를 기준으로 9ms의 "MARK" 이후 4 Unit 의 "SPACE" 로 인한 2.25ms 의 간격을 가진다.
2-2. End of Stream (Leadout Pulse Burst)
Repeat codes는 Preamble 신호 이후 데이터 메세지 없이 바로 1 Unit 길이의 EOS 신호를 보낸다.
마찬가지로, 38Khz를 기준으로 562.5 μs 길이의 신호이다.
즉, Repeat Codes는 38Khz를 기준으로
Preamble + EOS = 16 Unit "MARK" + 4 Unit "SPACE" + 1 Unit "MARK" = 21 Unit = 562.5 μs x 21 = 11.8125ms
의 신호길이를 가진다.
3. NEC 프로토콜 요약
신호 종류 | Preamble | Payload | EOS | ||
데이터 신호 NEC Standard (67.5ms) *EOS 제외 |
16 Unit MARK (9ms) 8 Unit SPACE(4.5ms) |
Address (16bit) | Command (8bit) | Command Inversed bit (8bit) | 1 Unit MARK (562.5 μs) |
NEC Standard (27ms) |
비트 반전으로 개수 일정 8 bit = Logical 0 : 2 Unit x 8 = 16 Unit 8 bit = Logical 1 : 4 Unit x 8 = 32 Unit Total 48 Unit = 27ms |
||||
NEC Extended (각기 다름) |
|||||
반복 신호 (11.8125ms) *EOS 제외 |
16 Unit MARK (9ms) 4 Unit SPACE (2.25ms) |
Payload 없음 |
각 신호 자체의 길이와 관계없이 NEC 프로토콜의 전체 시그널 길이는 38Khz 기준으로 108ms로 동일하게 유지된다.
이는 NEC 프로토콜에서 정의하는 Fixed time 의 정확히 192배이다. (1 Unit = 562.5 μs@38Khz, 192 x 562.5 μs = 108 ms)
NEC 프로토콜의 신호 길이는 192개 Unit이 들어갈 수 있도록 크기를 잡아둔 것이다.
IR Remote의 키를 계속 누르고 있을때 데이터 신호 이후 따라오는 반복신호들의 모양은 다음과 같을 것이다.
Repeat 신호는 단순히 이전에 받았던 Frame Data가 반복중이라는 신호이기때문에 수신 측에서 1st Frame Data를
제대로 수신 하지 못했다면, Repeat 신호 자체에는 그 어떤 Payload 정보도 들어있지 않기에 정보 해독이 불가능하다.
Pronto Edit Infrared HEX Format : 다양한 프로토콜의 IR 신호 기술 양식
IR 신호 전송을 위하여 가장 대중적으로 많이 쓰이는 프로토콜은 앞서 기술한 NEC 프로토콜과,
Philips 에서 개발한 RC-5 (Manchester Encoding 사용) 라는 프로토콜이 있으며
이 외에도 세상에는 IR 신호를 전송하는 다양한 프로토콜이 존재한다.
이렇게 각기 다른 IR 신호 전송 프로토콜과 그 신호 정보의 기술을 위하여 Pronto 라는 IR 신호 표현 양식이 있다.
Pronto는 기본적으로 4자리 16진수로 인코딩 된다.
1. Pronto Edit HEX Format의 Header (Preamble)
Pronto의 헤더는 4 Sets 의 HEX Code 를 담으며
각 Set 는 다음과 같은 정보를 담고 있다.
FLAG
- 서술하는 신호의 종류
- IR Raw 데이터의 경우 0x0000 으로 표기
Carrier 주파수 분할자
- 서술하는 신호 데이터가 사용하는 Carrier 주파수를 기술
- Pronto의 Internal Clock Frequency 는 4,145,146 Hz로서
Internal Clock 주파수를 이 Carrier 주파수 분할자로 나눈값이 후술되는 신호의 주파수 값이 됨 - ex) NEC 프로토콜의 표준 주파수인 38Khz 를 기술할시
IR 신호를 기술할 경우 Carrier 주파수 분할자의 값은 0x006D이 됨
0x006D (HEX) = 109 (Decimal) 이므로
4,145,146 Hz / 109 = 38,028.86 ≈ 38Khz 로 역산 가능
첫 Signal 길이
- Payload 가 담기는 첫 Signal 의 전체 길이에 대한 정보를 기술
- 신호의 "MARK(High)" - "SPACE(Low)" 쌍의 개수를 기록한다.
- 즉, 신호의 Preamble 이나 EOS 등은 정보 비트가 아니지만 어쨌든 한쌍으로 기록하고
데이터 프레임의 경우 논리 0, 논리 1 모두 "MARK"-"SPACE" 의 쌍으로 이루어진 신호이므로
비트에 대응한다고 생각하면 된다.
- 즉, 신호의 Preamble 이나 EOS 등은 정보 비트가 아니지만 어쨌든 한쌍으로 기록하고
- NEC 프로토콜의 경우 0x0022
- ex) NEC 프로토콜의 데이터 프레임 신호는
1쌍(Preamble) + 16쌍 (Address 16 bit) + 16쌍(Command 16 bit) + 1쌍 (EOS) = 34 개
"MARK" + "SAPCE" 쌍으로 이루어져 있다.
따라서 34 (Decimal) = 0x0022 (HEX) 로 표현한다.
두번째 Signal 길이
- 첫 Signal 이후에 오는 Repeat Code 와 같은 신호의 정보를 기술
- 마찬가지로 신호의 "MARK(High)" - "SPACE(Low)" 쌍의 개수를 기록한다.
- NEC 프로토콜의 경우 0x0002
- ex) NEC 프로토콜의 Repeat Code 신호는
1쌍 (Preamble) + 1쌍 (EOS) = 2개 의 쌍으로 이루어져있으므로
2 (Decimal) = 0x0002 (HEX) 로 표현한다.
2. 신호 데이터 (첫 Signal + 두번째 Signal 정보)
Header 에서 기술된 각 신호 길이에 맞춰 각 신호의 "MARK" 와 "SPACE"의
Carrier 신호의 Cycle(주기) 배수를 각기 기술한다.
Pronto 에서의 NEC 프로토콜의 데이터 메세지 Preamble 신호 기술을 예를들면, 다음과 같이 기술된다.
NEC 프로토콜의 데이터 메세지 Preamble은 앞서 알아보았듯이 Carrier 주파수 38Khz 기준
16 Unit MARK (9ms) + 8 Unit SPACE(4.5ms) 로 구성된다.
1 Unit 의 신호 구성은 약 21주기 즉, (1/ 38000 hz) * 21 ≈ 562.5 μs 를 Fixed time 길이로 고정한다고 하였다.
1 Unit 는 21 Cycle 이므로 Pronto Edit HEX Format에서 NEC 프로토콜의 데이터 메세지 Preamble은
"MARK" 21 Cycle x 16 Unit = 336 (Decimal) = 0x0150 (HEX)
"SPACE" 21 Cycle x 8 Unit = 168 (Decimal) = 0x00A8 (HEX) 이므로 다음과 같이 기록한다.
0150 00A8
이런 식으로 첫 Signal 과 두번째 Signal의 전체 신호를 HEX 로 기록하는 것이 Pronto HEX Format 이며
다음은 NEC 프로토콜을 사용하는 한 전자제품의 Volume Down 신호의 Pronto HEX 형식 데이터이다.
(출처 : https://www.remotecentral.com/cgi-bin/codes/rotel/rtc-970_1/page-2/)
0000 006d 0022 0002 0150 00ac 0014 0040 0014 0040 0013 0016 0013 0016 0013 0016 0013 0016 0013 0016 0014 0041 0014 0040 0013 0016 0014 0016 0013 0016 0014 0040 0013 0016 0013 0016 0013 0017 0013 0016 0013 0016 0014 0040 0014 0040 0014 0040 0013 0016 0013 0016 0013 0017 0014 0040 0014 0040 0013 0016 0013 0016 0013 0016 0014 0040 0015 0040 0014 003e 0013 0650 0150 0055 0013 0e0a
분석해보면 다음과 같다.
[Pronto HEX Format 헤더]
0000 : IR RAW Data
006d : 0x006d = 109 | 4,145,146 Hz / 109 = 38,028.86 ≈ 38Khz
0022 : 0x0022 = 22 | 첫시그널 길이 : 34 Pair
0002 : 0x0002 = 2 | 두번째 시그널 길이 : 2 Pair
첫시그널 길이(0x0022) : 34 Pair ( 1 + 16 + 8 + 8 + 1 )
[NEC Protocol 데이터 메세지 Preamble]
0150 00ac
[NEC Extended Protocol Address 16bit] 1100000110001000
[00] 0014 0040 : Logical 1
[01] 0014 0040 : Logical 1
[02] 0013 0016 : Logical 0
[03] 0013 0016 : Logical 0
[04] 0013 0016 : Logical 0
[05] 0013 0016 : Logical 0
[06] 0013 0016 : Logical 0
[07] 0014 0041 : Logical 1
[08] 0014 0040 : Logical 1
[09] 0013 0016 : Logical 0
[10] 0014 0016 : Logical 0
[11] 0013 0016 : Logical 0
[12] 0014 0040 : Logical 1
[13] 0013 0016 : Logical 0
[14] 0013 0016 : Logical 0
[15] 0013 0017 : Logical 0
[NEC Protocol Command 8bit] 00111000
0013 0016 : Logical 0
0013 0016 : Logical 0
0014 0040 : Logical 1
0014 0040 : Logical 1
0014 0040 : Logical 1
0013 0016 : Logical 0
0013 0016 : Logical 0
0013 0017 : Logical 0
[NEC Protocol Command in Inversed 8bit] 11000111
0014 0040 : Logical 1
0014 0040 : Logical 1
0013 0016 : Logical 0
0013 0016 : Logical 0
0013 0016 : Logical 0
0014 0040 : Logical 1
0015 0040 : Logical 1
0014 003e : Logical 1
[NEC Protocol 데이터 메세지 EOS]
0013
[남은 메세지 프레임 시간 채우는 공백]
0650
두번째 시그널 길이(0x0002) : 2 Pair ( 1 + 1 )
[NEC Protocol Repeat Code 메세지 Preamble]
0150 0055
[NEC Protocol Repeat Code 메세지 EOS]
0013
[남은 메세지 프레임 시간 채우는 공백]
0e0a
Pronto HEX 형식으로 기록된 주소 영역의 "MARK"-"SPACE" 길이를 통해
정보 비트로 변환하여 8bit 씩 나누어 보았을때 각 자리가 반전되어 있지 않다는 점을 통해
주소공간 16bit를 전부 사용하는 NEC Extended 프로토콜을 사용하는 것을 알 수 있으며,
Command 영역의 앞 8bit 와 뒤따라오는 8bit 영역이 비트 반전되어 있음으로 직접 확인 할 수 있다.
NEC 프로토콜을 따르는 IR 신호의 프레임 길이는 38Khz 기준으로 108ms 로 고정되어 있으므로
End of Signal 이후 남은 신호의 공백을 채우는 시간을 기록해두는 것을 알 수 있다.
End of Signal 자체는 한번의 "MARK" burst 이지만,
프레임 길이가 끝날때 까지 채워넣는 LOW time 만큼의 "SPACE" 영역과 합쳐서 한쌍의 Pair로 간주하는것이다.
출처 및 참고 링크)
IR 신호 프로토콜
https://book.hacktricks.xyz/todo/radio-hacking/infrared
https://www.sbprojects.net/knowledge/ir/nec.php
https://www.renesas.com/us/en/document/apn/1184-remote-control-ir-receiver-decoder
https://www.bestmodulescorp.com/amfile/file/download/file_id/1945/product_id/798/
https://blog.embeddedexpert.io/?p=1138
https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
https://onlinedocs.microchip.com/pr/GUID-3A005322-7241-4A38-9889-70DEE3EF1259-en-US-3/index.html?GUID-717B7771-EAB8-42FF-B9B3-9F88A9897C7C
Pronto HEX Format
https://www.etcwiki.org/wiki/Pronto_Infrared_Format
https://www.scribd.com/document/275868502/Smartphone-IR-remote-control
https://www.codeproject.com/Articles/6786/C-Remote-Control-using-the-Audio-Port
https://www.remotecentral.com/features/irdisp2.htm
https://www.remotecentral.com/cgi-bin/codes/rotel/rtc-970_1/page-2/