라즈베리 파이 파이썬 리모컨 - lajeubeli pai paisseon limokeon

Raspberry pi 로 TV on/off

Raspberry pi 는 GPIO 가 있다.

GPIO 에 ir led 를 달아서 TV 리모컨 신호를 보내면 TV 를 켜거나 끌 수 있다.

물론 볼륨을 조절하거나 mute 를 시킬 수도 있겠다.

라즈베리파이로 TV 를 컨트롤 할 수 있는 것 외에도 리모컨으로 동작하는 선풍기나 에어컨을 조작 할 수도 있다.

TV 만 조작 할 거라면 HDMI 를 통해서 TV 를 조작 할 수 있는 방법도 있는데 연결된 TV 가 해당 기능이 있어야 하는 것 같다. 

실패 TT  실패 사례는 나중에 성공하면 포스트 하겠다.

대신 적외선 LED 를 이용하면 범용적이라는 장점이 있겠다.

Rasp 로 TV 를 조작하는 방법은 인터넷에 많이 올라와 있다.

간단히 내용을 다시 언급하고 제작과정과 주의사항을 올린다. 

이게 삽질 유발 과정이 있어서 잘 안될때는 주의사항을 참고하시라.

재료

TR  :  KTC3198-Y 

IR LED : SI13317-H    950nm, 1.3V , 100mA   

Resistor : 360 ohm x 1 , 20K x 1

모두 유사한 스펙에 부품사용이 가능하다.

필요한 저항값을 계산해보자.

라즈베리파이에 GPIO 는 5V 를 뽑아 내는데, LED 가 필요한 전압은 1.3V 이다.

100mA 를 다소모 할 필요는 없으니 10mA 정도 지나가게 하려면

5V - 1.3V = 3.7V 

3.7V / 10mA = 370 ohm

TR 손실을 0.1V 정도로 보면

360 ohm 에 10mA 이다. 

만약 TV 가 멀리 떨어져 있다면 저항을 줄여서 필요한 수준으로 전류를 높이도록 하자.

LED 가 망가지기 전까지 올려보고 싶다면 100mA 니까 36 ohm 되시겠다. 대신 LED 수명은 스펙만큼 보장하지 못한다.

사실 10mA 면 GPIO 출력으로도 될테니  꼭 TR 을 써야 되나 싶긴 한데... 

이걸 만들때는 다른 TV 에 간섭이 생기지 않아야 하는 상황이였고 10mA 로 얼마나 전달 되는지 시험데이터가 없었다.

만들어서 시험해보니 10mA 로 약 30cm 정도 전달되는 데이터를 얻었는데 상황에 적당했다.

만약 멀리 보내야 할필요가 있을때는 GPIO 가 내는 출력을 초과해야 하니 꼭 TR 을 써야 한다.

TR 구동용으로는 20K or 10K 정도 써준다.

개인적으로는 요즘 10K ohm 저항이 잘팔린다. 10K ohm 저항이 조금 부족하니 20K 재고 소진. 

ebay 중국 부품 상인님에게 보내달라고 주문 go go. 1$ 정도 하려나.

0.9x$ 를 무료배송으로 주문하자니 좀 민망하다. 주문했는데 안오면 따지기도 그러니, 다른거랑 같이 주문해야겠다.

GPIO 연결

간단하지만 두어개 사용해야 하니 PCB 를 만들어 본다

라즈베리파이 GPIO 핀맵은 인터넷에 널렸으니 pass.

회로도도 패턴이 넘 간단하니 pass.

라즈베리 파이 파이썬 리모컨 - lajeubeli pai paisseon limokeon

동판 에칭, 이상태가 잴 보기 좋다.

자른다

라미네이트 필름을 벗겨 낸다.

패드만 벗겨내는 쉬운 방법이 있으면 좋으련만..

부품을 올린다.

LED 만 안보이는데 선을 길게 빼야 하기 때문에 단자만 만든다.

라즈 조립 상태는 포스트 첫번째 사진참고.

라즈베리파이 설정

lirc 를 설치한다.

 sudo apt-get install lirc

sudo vim /etc/modules

 lirc_dev

 lirc_rpi gpio_out_pin=22

GPIO 핀을 설정한다.

22번으로 설정했는데 다른데 연결했다면 바꾸자.

sudo vim /etc/lirc/hardware.conf

LIRCD_ARGS="--uinput"

LOAD_MODULES=true

DRIVER="default"

DEVICE="/dev/lirc0"

MODULES="lirc_rpi"

LIRCD_CONF=""

LIRCMD_CONF=""

모듈 내용 추가.

sudo vim /boot/config.txt

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

23은 input 용인데 임의로 적었고 의미는 없다.

혹시 나중에 리시버를 달때는 의미 있는 번호를 넣어주자.

sudo vim /etc/lirc/lirc_options.conf

driver    = default

device    = /dev/lirc0

[2018.06.01] 최근 lirc 업데이트로 위에 설정을 추가로 해주어야 한다.

리모컨 신호 파일을 찾는다.

우선 아래 url 을 들어가서 이리저리 다른 디렉토리를 찾아보면 적당한걸 발견할 수 있다.

나는 LG, Samsung TV 가 필요하니 아래 URL

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

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

적당한 파일을 찾았다면 해당파일을 /etc/lirc/ 디렉토리에 다운로드 해둔다.

이런식으로

cd /etc/lirc

sudo wget http://lirc.sourceforge.net/remotes/lg/42H3000

sudo wget http://lirc.sourceforge.net/remotes/samsung/BN59-00869A

그리고 아래 파일에서 참조하도록 추가 해준다.

sudo vim /etc/lirc/lircd.conf

include "42H3000"

include "BN59-00869A"

device 파일을 준비시킨다.

sudo lircd --device /dev/lirc0

리모컨신호로 TV 제어

아래와 같이 명령어를 내본다.

irsend SEND_ONCE LG_42H3000 KEY_POWER

irsend SEND_ONCE Samsung_BN59-00869A BTN_POWER 

커멘드라인에서 TV 를 조작할 수 있게 되었으니

Homebridge 등에 연결해서 iPhone 으로 TV 를 켜거나, 아마존 EchoDot 에게 "Alexa TV turn on!" 해서 켜볼 수도 있다.

EchoDot 이나 Siri 연결은 다른 포스트로 올릴 예정이다.

주의사항

시험할때는 잘 작동했지만, 어쩔때는 되고 어쩔때는 안되는 수가 있다.

이건 리모컨 신호가 전달 될때 전등이 켜지거나 노이즈가 들어가는 경우일 수 있다.

실생활에서 이런 경우는 무시할 수 없을만큼 자주 일어나기 때문에 제조사들은 리모컨 버튼 push 한번에 여러번 신호를 보낸다.

digital analyzer 로 실제 신호를 찍어보면 3,4번은 기본으로 보낸다.

irsend 는 명령 한번에 1회만 보낸다.

irsend -# 3 SEND_ONCE LG_42H3000 KEY_POWER 

이런 식으로 여러번 보내도록 해보자. 작동 신뢰성이 높아진다.

당연하겠지만 이렇게 짧은 시간에 여러번 신호를 보낸다고 TV 가 꺼지고 켜지지는 않는다. 그사이 신호들은 적당히 무시되므로 걱정말자.

잘되다가 리부팅되면 안된다.

이게 막상 하드웨어와 소프트웨어를 넘나드는 프로젝트를 해보면 간단한 것도 되다 안되다 하는 경우가 허다하다.

게다가 잘되던게 자고 일어나면 안되는 상황이 벌어지고, 제일 처음 의심하는게 장치에 문제가 있나 하는 생각이 든다.

작동 안된다고 하드웨어 부분을 뒤지면 시간을 엄청쓰고 다시 돌아온다. TT TT

보통은 간단한 문제들이 원인이된다.

라즈 부팅이 되면 항상 아래를 실행해 준다.

이걸 안하면 irsend 명령이 실행될때 device 가 준비되지 않았다고 실패하게 된다.

sudo pkill lircd

sudo lircd --device /dev/lirc0

ls /dev/lir* 

그래도 불안하면 실행전에 서비스 리셋

sudo /etc/init.d/lircd restart 

sudo 를 생략해도 작동하지 않는다. 꼭 root 권한으로 실행 하자.

/etc/rc.local 파일에 넣는것도 방법이다.

irsend 를 파이썬이나 기타 프로그램에서 연동해서 사용하면 보통 에러 로그가 보일리 없고, 하드웨어 탓하는 덫에 걸린다.