Raspberry pi

1편 적외선 리모콘 (IR Remote Controller)

[혜안] 2017. 4. 16. 20:05
728x90

스마트콘센트(Smart Plug) 는 고객니즈를 제대로 반영하지 못한 듯 하다.

와이프 반응이 시큰둥함..

그도 그럴것이, 

스탠드를 자기전에 원격으로 끄는 것까지는 좋다. 그러나, 방에 들어가서 스탠드를 바로 켜야 하는데, 잠시 선 채로 스마트폰으로 접속해 켜야 한다는 문제점이... 스탠드 앞에서 우두커니 말이다.

문앞에 로컬 스위치도 하나 만들어야 한다는 숙제가 생겼다.

그런데 급하지 않다. 왜냐하면, 우리집이 나름 스마트해서 각 방의 전등을 켜고 끄는 스마트폰 앱을 제공해 준다는 사실을 알아냈기 때문... ㅜㅜ


스마트콘센트(Smart Plug)는 재껴두고 다시 고객의 니즈 파악...

주방TV를 음성으로 제어하고 싶단다...

설거지하면서 채널을 돌리거나 볼륨을 조절하고 싶다는 요구사항 접수.


주방TV용 리모콘은 따로 있다.

이 리모콘 신호를 그대로 복사해서 음성명령에 따라 신호를 쏴주기만 하면 된다.

요건 기존에 없겠지...


두번째 프로젝트, 음성리모콘 (적외선리모콘 & 음성인식)


[Raspberry pi] - 1편 적외선 리모콘 (IR Remote Controller)

[Raspberry pi] - 2편 적외선 리모콘 (IR Remote Controller)

[Raspberry pi] - 3편 적외선 리모콘 (IR Remote Controller) + 음성인식

[Raspberry pi] - 4편 적외선 리모콘 (IR Remote Controller) + 음성인식 개선

[Raspberry pi] - 5편 적외선 리모콘 (IR Remote Controller) + TV 스피커리시버 연동



Googling !!!

우선 적외선리모콘에 필요한 부품들과 node.js 패키지들을 찾았다.


구매한 부품

NPN, PNP TR 각 3개 : 신호 증폭을 위해 샀지만 결론적으로 안씀. 바로 GPIO에 물려도 주방TV 쯤은...

IR 수신부 3개 : 리모콘의 신호를 잡아서 등록하려면 필수. 실수로 비싼것(천원) 하나 포함해서 주문함.

IR 송신부 2개

테스터기 : 장난감 수준이지만 없으면 정말 불편. 오천오백원짜리 ㅋㅋ 


1. LIRC 설치

적외선 신호를 HEX 값으로 입력하면 알아서 IR 모듈에 송수신으로 변환해준다.

뿐만아니라, 기존의 리모콘 값을 받아서 저장해 놓을 수 있고, 저장된 값으로 송신도 할 수 있다.

$ sudo apt-get install lirc


2. 설정 변경

/etc/modules 파일 맨 아래 추가, 수신용은 22번, 발신용은 23번 GPIO 사용

$ vi /etc/modules


lirc_dev

lirc_rpi gpio_in_pin=22 gpio_out_pin=23


/etc/lirc/hardware.conf 변경

$ vi /etc/lirc/hardware.conf


# /etc/lirc/hardware.conf

#

# Arguments which will be used when launching lircd

LIRCD_ARGS="--uinput"


#Don't start lircmd even if there seems to be a good config file

#START_LIRCMD=false


#Don't start irexec, even if a good config file seems to exist.

#START_IREXEC=false


#Try to load appropriate kernel modules

LOAD_MODULES=true


# Run "lircd --driver=help" for a list of supported drivers.

DRIVER="default"

# usually /dev/lirc0 is the correct setting for systems using udev

DEVICE="/dev/lirc0"

MODULES="lirc_rpi"


/boot/config.txt 에 dtoverlay 주석해제, 변경

# Uncomment this to enable the lirc-rpi module

dtoverlay=lirc-rpi,gpio_in_pin=22,gpio_out_pin=23


 설치 및 설정은 끝.


3. IR 수신부 연결

설정파일에 지정한대로 GPIO 22번에 연결

3.3v, GND도 연결

재부팅

$ sudo reboot


4. 모듈인식 확인

$ dmesg | grep lirc

[   13.323852] lirc_dev: IR Remote Control driver registered, major 245

[   14.853887] lirc_rpi: module is from the staging directory, the quality is unknown, you have been warned.

[   15.816221] lirc_rpi: auto-detected active high receiver on GPIO pin 22

[   15.816638] lirc_rpi lirc_rpi: lirc_dev: driver lirc_rpi registered at minor = 0

[   15.816654] lirc_rpi: driver registered!


5. 정상 설치 확인

lirc 서비스 중단

$ sudo /etc/init.d/lirc stop

아래 명령 후 리모콘 아무버튼이나 누름

$ mode2 -d /dev/lirc0

space 335

pulse 556

space 10

space 8

space 9

space 88

space 7

space 13

space 17181

space 54

pulse 29

space 6

pulse 24

pulse 43

pulse 7

space 5

pulse와 space가 무작위로 잡히면 일단 수신은 정상.


6. 리모콘 신호 등록


리모콘을 등록하기 전 이미 lirc 리모콘 목록에 있는지 확인

TV모델명이 아니고 리모콘 하단에 보면 작게 써있는 코드이다.

삼성같은 경우 BN59-0xxxx, AH59-0xxx 이런 식이다.


http://lirc.sourceforge.net/remotes/


있으면 lircd.conf에 include만 시키면 된다.



없으면 신규 등록한다.


1. 등록명령. (lirc 서비스는 중단되어 있어야 한다)

$ irrecord -d /dev/lirc0 dm-2901

리모콘에 써있는 모델명으로 이름 등록. 나중에 TV와 홈씨어터도 등록할 계획이므로...


2. 패턴찾기

Press RETURN now to start recording.

................................................................................

Found const length: 108034

Please keep on pressing buttons like described above.

................................................................................

Space/pulse encoded remote control found.

Signal length is 67.

Found possible header: 8958 4542

Found trail pulse: 508

No repeat code found.

Signals are space encoded.

Signal length is 32

Now enter the names for the buttons.


화면에 dot 가 두줄 생길때까지 리모콘 버튼을 무작위로 눌러준다. (그냥 등록할 버튼 위주로 돌아가면서 1~2초씩 눌러줌.)



3. 버튼 등록

Please enter the name for the next button (press <ENTER> to finish recording)

KEY_POWER


Now hold down button "KEY_POWER".


Please enter the name for the next button (press <ENTER> to finish recording)

KEY_MUTE


Now hold down button "KEY_MUTE".

...... 생략

안내에 따라, 이름 입력 -> 해당버튼 누름을 반복한다.



4. 끝났으면 Enter.

Checking for toggle bit mask.

Please press an arbitrary button repeatedly as fast as possible.

Make sure you keep pressing the SAME button and that you DON'T HOLD

the button down!.

If you can't see any dots appear, then wait a bit between button presses.


Press RETURN to continue.

내용을 읽어보면, 열라빠르게 버튼들을 돌아가면서 누르라는거 같다. 

Enter한번 더 치고, 버튼만 보면서 누르다보면 어느새 끝나있다.

Checking for toggle bit mask.
Please press an arbitrary button repeatedly as fast as possible.
Make sure you keep pressing the SAME button and that you DON'T HOLD
the button down!.
If you can't see any dots appear, then wait a bit between button presses.

Press RETURN to continue.
............................
Toggle bit mask is 0xa0a0.
Successfully written config file.
pi@raspberrypi:~ $ 


완료하면 dm-2901 라는 파일 생성되어 있다.

열어보면 아래와 같이 등록한 키이름과, 코드들이  기록되어 있다.

begin remote
name dm-2901
bits 16
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100

header 8958 4542
one 502 1735
zero 502 605
ptrail 508
pre_data_bits 16
pre_data 0x214C
gap 108034
toggle_bit_mask 0x0

begin codes
POWER 0xCC33
MUTE 0x807F
VOLUMEUP 0xB04F
VOLUMEDOWN 0x08F7
CHANNELUP 0x20DF
CHANNELDOWN 0xA05F
end codes

end remote

생성한 파일을 /etc/lirc 경로에 복사해 주고, /etc/lirc/lircd.conf 파일에 include 시킨다.


서비스 재시작

$ sudo /etc/init.d/lirc restart


등록된 버튼 시험

$ irw

00000000214ccc33 00 KEY_POWER dm-2901

00000000214ccc33 01 KEY_POWER dm-2901

00000000214ccc33 02 KEY_POWER dm-2901

00000000214c20df 00 KEY_CHANNELUP dm-2901

00000000214c20df 01 KEY_CHANNELUP dm-2901

00000000214c20df 02 KEY_CHANNELUP dm-2901

00000000214c20df 00 KEY_CHANNELUP dm-2901

00000000214cb04f 00 KEY_VOLUMEUP dm-2901

00000000214cb04f 01 KEY_VOLUMEUP dm-2901

00000000214cb04f 00 KEY_VOLUMEUP dm-2901

00000000214cb04f 01 KEY_VOLUMEUP dm-2901

00000000214c08f7 00 KEY_VOLUMEDOWN dm-2901

00000000214c08f7 01 KEY_VOLUMEDOWN dm-2901

00000000214c08f7 00 KEY_VOLUMEDOWN dm-2901

00000000214c08f7 00 KEY_VOLUMEDOWN dm-2901

00000000214ca05f 00 KEY_CHANNELDOWN dm-2901

00000000214ca05f 01 KEY_CHANNELDOWN dm-2901

00000000214ca05f 00 KEY_CHANNELDOWN dm-2901

00000000214ca05f 00 KEY_CHANNELDOWN dm-2901

00000000214ca05f 01 KEY_CHANNELDOWN dm-2901

00000000214c807f 00 KEY_MUTE dm-2901

00000000214c807f 01 KEY_MUTE dm-2901

00000000214c807f 00 KEY_MUTE dm-2901

00000000214c807f 01 KEY_MUTE dm-2901

정상 확인.


※ 단, 여기서 정상 확인이 되어도 나중에 실제 시험에서 반응이 없을 수 있음. 그땐 리모콘 신호 등록 절차를 성의있게 다시 수행해야 함. 이것때문에 이틀을 까먹음. 애먼 TR만 의심하고...

※ 한가지 팁은 생성된 파일에서 toggle_bit_mask 항목의 값을 0x0으로 바꿔보자.



728x90