본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] AVR(ATmega128A)«수업-17» : 적외선(Infrared, IR) / 리모컨(Remote Control)

by 나는영하 2022. 2. 22.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

적외선 통신

적외선 리모컨 사용방법


1. 적외선 통신

1-1. 적외선 통신 

적외선 통신 실습에 사용될 리모컨과 센서(PL-IRM0101)

- 적외선(Infrared) 통신은 10m 이내의 큰거리 통신용

- 주로 리모컨에 사용됨

- 가시광선 바깥쪽의 파장으로 사람의 눈으로는 식별 불가

- 38Khz 반송파로 변조된 신호를 전송

 

1-2. 적외선 데이터 포맷(NEC 프로토콜)

1) 데이터 시작 표시(리드 코드)

일반 데이터 / 반복 데이터

- 데이터 시작을 표시하는 신호는 일반 데이터와 반복 데이터 두가지가 있다.

- 일반 데이터 : 시작 신호 이후 4바이트의 데이터를 전송한다. 

HIGH : 9ms , LOW : 4.5ms, 총 : 13.5ms

- 반복 데이터 : 리모컨에서 동일한 버튼을 누르고 있는 경우 전송되는 데이터로 시작 신호 이후에는 4바이트 데이터 신호를 전송하지 않는다.

HIGH : 9ms, LOW : 2.25ms, 총 : 11.25ms

 

2) 4바이트 데이터(논리 0, 논리 1)

데이터 신호/ 논리 0, 논리 1

- 리드코드(일반 데이터) 이후 4바이트 데이터를 전송 받는다.

- 2바이트 내 0과 1의 개수가 항상 동일하므로 데이터 길이도 동일하다

- 4바이트의 데이터 신호중 첫번째 1바이트와 두번째 1바이트는 서로 반전된 값을 가지고 있다

(3,4번째 바이트도 서로 반전된 신호를 가지고 있다 - 아래의 그림 참고)

 

3) 리드 코드 + 데이터 코드

전체 데이터 신호 형태

- 커스텀 코드 : 제조사별 코드(제조사별로 상이하다)

- 데이터 코드 : 실제로 전송받는 데이터(2바이트)

오실로스코프에서 받은 전체 데이터 신호 형태

- 왼쪽 오실로스코프의 파형은 일반 데이터(리드코드)를 받은 후 4바이트 데이터 신호를 받은 파형이고,

오른쪽 오실로스코프의 파형은 반복 데이터(리드코드)를 받은 후의 파형이다.

1-3. 적외선 데이터 디코딩

1) NEC 프로토콜 데이터의 시간 간격

 

유형 시간 간격(ms) 클록 수
리드코드 일반 데이터 13.5 210.94
반복 데이터 11.25 175.78
논리 데이터 논리 0 1.125 17.58
논리 1 2.25 35.16

- 4가지 유형의 데이터 : 일반 데이터 리드코드, 반복 데이터 리드코드, 논리0, 논리1

- 적외선 수신기로 전달된 데이터에서 상승 에지 사이의 시간 간격으로 4가지 유형의 데이터를 구분할 수 있다.

(하지만 리모컨을 통해 적외선 수신기로 전달되는 신호와 수신기에서 출력되는 신호는 서로 반전되어 있어서 실제 코딩할때는 하강에지를 사용합니다. 이와 관련해선 2-1 / 예제에서 좀 더 자세히 다루겠습니다..! 😁)

- 즉, 1024분주 클록신호의 1주기가 0.0625μs이고, 211개의 클록 신호를 받으면 13.5ms로 리드코드의 일반데이터를 구분할 수 있다. (프로그래밍 방법)

 


 

2. 적외선 통신 관련 예제

2-1. 예제 : 적외선 리모컨 데이터 수신

1) 실습 사진 및 코드

 

2) 코드 설명

- Line 14 ~ 20 : print_received_data 함수부

NEC 프로토콜의 데이터의 시간 간격에 따른 클록수에 따라 데이터를 수신하는 함수부

receivedData 변수는 4바이트 데이터를 저장하기 위한 변수이다(unsigned long 유형)

- Line 22 ~ 64 : ISR(INT0_vect) / 외부 인터럽트0 서비스 루틴 함수부 

(4바이트 데이터를 수신하기 위해서는 총 34번의 ISR이 수행된다)

- Line 24 : 리모컨을 통해 버튼을 눌렀을때 인터럽트가 발생한 시간을 time 변수에 저장한다

- Line 25 : 0번 타이머 오버플로가 발생했는지 여부를 검사한다

- Line 27 ~ 43 : bitCount변수 값이 32면 리드 코드로 인식하고 if 문을 수행한다.

리모컨을 눌렀을때의 인터럽트 발생한 클록 수가 요구 범위(201 < time < 221) 안에 들었을때 4바이트 데이터 값을 저장할 준비를 한다. 만약 반복 데이터 리드코드일 경우 리모컨의 입력 데이터를 다시 받는다

- Line 44 ~ 59 : 일반 데이터 리드코드를 수신한 후 4바이트의 데이터를 저장하는 if문

- Line 60 : 0번 타이머가 오버플로 되거나 정상적인 데이터 값을 받기 위해 TCNT0 값을 초기화

- Line 63 : 0번 타이머의 오버플로 플래그 클리어(★ 주의사항 - 2)

(정상적엔 데이터를 입력 받았을 경우, 맨 처음 리모컨을 입력했을때 딱 한번 오버플로 플래그가 클리어 된다.)

- Line 66 ~ 84 : main 함수부로 UART 및 타이머 설정

77번 라인에서 외부 인터럽트가 하강 에지에서 발생한다는 것이 중요!! (★ 주의사항 - 1)

 

3) 주의사항 - 1 : 적외선 수신기 데이터 반전(Line 77)

- 적외선 수신기에서 출력되는 신호는 리모컨에서 IR 수신기로 들어가는 신호의 반전된 신호이다.

- 즉, 아무런 데이터가 수신되고 있지 않은 경우 논리 1을 출력한다.

- 따라서 ATmega128A에서 적외선 데이터를 디코딩 하는 경우 시간 간격은 하강 에지 사이의 시간 간격을 통해 측정해야 한다. (상승 에지에서 인터럽트가 발생하면 논리 0과 1, 리드코드의 일반데이터와 반복데이터의 구분이 어렵다)

 

4) 주의사항 - 2 : 오버플로 플래그 클리어(Line 63)

- NEC 프로토콜에서 4가지 유형의 데이터는 모두 1024분주의 8비트 타이머로 오버플로 발생 없이 받을 수 있다.

- 하지만 TCNT0 레지스터의 초기화 과정이 없거나 오버플로가 발생했는지 확인하는 과정이 없다면 데이터를 1번 받았는지 중복으로 받았는지 분간할 방법이 없다.

- 따라서 Line 63과 같이 오버플로의 플래그를 클리어 해주고 Line 25에서 오버플로가 발생했는지 여부를 검사한다.

- 독특한 점은, 오버플로 플래그의 클리어 방법이다. TIFR레지스터에서 해당 비트에 사용자가 임의로 1로 세트해주면 해당 비트의 오버플로 또는 비교일치 인터럽트 플래그는 클리어 된다. (기존에 해당 비트가 1이 있든 0이 있든 사용자가 1로 OR연산을 통해 세트하면 클리어 처리 된다 / ex) TIFR = TIFR | (1 << TOV0))

→ 플래그 래지스터는 하드웨어적으로 이렇게 설계되어 있기 때문에 단순히 암기해주면 좋을것 같습니다..😄

→ ISR이 수행되면 자동으로 오버플로 플래그는 클리어 되지만 오버플로 인터럽트는 Disable 상태이기 떄문에 ISR은 수행되지 않는다. 따라서 사용자가 임의로 해당 비트를 1로 세트해서 클리어 해주어야 한다.

댓글