방에 에어컨을 달았는데, 마찬가지로 HomeKit 으로 제어해보고 싶었다.
리모컨이 있으니 전등에 비해 꼭 필요한건 아니였지만...
시리로 켜고 끈다거나,, 온도에 따라 자동 제어 같은걸 해보고 싶어서...
가장 먼저 에어컨 리모컨 신호를 받아서, 아두이노로 다시 보내서 테스트해보는걸 먼저 해보았다.
이번에 방에 설치한 에어컨.
LG WHISEN SUC066BC 모델...
이모가 쓰시던걸 받아왔다.
IR 은 예전에 적외선 송수신 킷을 구매했던걸 활용하였다.
구매처는 아트로봇, 링크
무려 13년도에 샀던건데, 구매내역에 잘 보관되어 있었다..
어떻게 연결하는지 등은 Hook-up Guide 글을 보자.
연결 후에는 아두이노에서 IRremote 라이브러리를 내려받고 사용하면 된다.
라이브러리를 받은 후에
libraries/IRremote/examples/ 폴더로 가면
IRsendRawDemo, IRrecvDumpV2 예제가 있으니, 이 스케치로 원래 리모컨의 신호를 읽고, 날려보면 된다.
예시 폴더에 LGACSendDemo.. 가 있는 것은 이 글을 보면서 발견했는데,,
https://github.com/chaeplin/lgwhisen 이런 오픈소스도 있지만 결과적으로 나는 제대로 작동하지 않아서, 다시 코드를 짰다.
여튼 돌아와서, IRrecvDumpV2 스케치를 업로드한 후에 리모컨으로 눌러보면
이런식으로 신호가 나오게된다.
rawData 를 복사해서 IRSendRawDemo 의 예시처럼,
irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), khz)
이렇게 보내주면 그대로 복사하는거라고 하는데....
실제로 해보면 안된다. ㅡㅡ;
또한 에어컨 리모컨은 특성상, 각 신호가 온도, 바람세기 등의 정보를 가지고 있는데 저걸 어떻게 분석해야하나.. 난감했는데,
위의 LG 에어컨 코드들이 제대로 작동은 안할지언정 기본 베이스가 같아서 도움이 되었다.
위 코드와 IRremote 라이브러리의 ir_LG.cpp 등의 코드를 보면,
업다운 신호가 한 세트로, +500, -500 이면 0, +500, -1500 이면 1 이 되어서 28 bit 의 신호를 만들게 된다.
위 사진의 경우 1000 1000 1100 0000 0000 0101 0001 이 되겠지.
이제 IRrecvDumpV2 스케치에서 loop 함수를 이렇게(접어둠) 바꿔두고 리모컨을 눌러보며 신호를 분석해보면 된다.
더보기
접기
void loop ( )
{
decode_results results; // Somewhere to store the results
if (irrecv.decode(&results)) { // Grab an IR code
for (int i = 2; i < results.rawlen; i=i+2) {
Serial.print((results.rawbuf[i] * USECPERTICK > 1000) ? '1' : '0');
if (i % 8 == 0) Serial.print(' ');
}
Serial.println("");
irrecv.resume(); // Prepare for the next value
}
}
접기
git 에 https://github.com/chaeplin/lgwhisen/blob/master/decoding.md 이것도 참고 사항이 되긴 하지만...
리모컨 몇번 눌러보면 금방 파악이 되긴 한다.
나의 버전으로 다시 정리를 해보자면 28bit 가
1000 1000 (1) (2) (3) (4) CRC
이렇게 생겨먹었고, CRC 는 ( (1)+(2)+(3)+(4) ) & 0xFF
모드별로 보면
(2)
냉방: 0 => 0000 x000 xxxx xxxx
제습: 1 => 0000 x001 1001 xxxx
송풍: 2 => 0000 x010 0011 xxxx
인공지능: 3 => 0000 x011 0010 0101
ㄴ 0: 전원을 켤때, 1: 이미 켠 후 조작시
대충 이렇게 생겼다.
(3) 은 주로 온도. 온도에서 15를 뺀 값
(4) 는 바람 세기.
low: 0
mid: 2
hight: 4
auto: 5
이렇게였는데, 이건 위의 예제들의 분석과 동일하다.
여튼 이제 원하는 28bit 를 만들 수 있으니 이 신호를 보내면 된다.
아두이노를 두개 준비해서 보낸 신호를 확인해봐도 좋다.
먼저 적외선 LED 를 아두이노에 연결는데, 타이머를 사용해서 핀이 정해져있다.
Uno, Nano 등의 보드의 경우 PIN 3 을 사용하면 된다.
연결 후 스케치를 업로드 해보면 sendRaw 함수로는 여전히 작동을 안하는데..
28bit 를 long 으로 만들어서 irsend.sendLG 함수를 이용하면 된다.
다만 내가 쓴 위 적외선 송수신 킷의 경우, 신호가 많이 약해서 상당히 가까이,
약 30cm 거리에서 작동해서 처음에 안되는 줄 알았다..
앞으로 코드가 많이 수정되겠지만, 이 단계까지의 나의 코드는 아래와 같다.
더보기
접기
#include <IRremote.h>
IRsend irsend;
/*
Arduino Uno, Nano, ...: PIN 3
1000 1000 (1) (2) (3) (4) CRC
(2) MODE
냉방: 0 0000 x000 xxxx xxxx
제습: 1 0000 x001 1001 xxxx
송풍: 2 0000 x010 0011 xxxx
인공지능: 3 0000 x011 0010 0101
ㄴ 0: with poweron, 1: already on
(3) TEMP
temp - 15
(4) FAN
low: 0
mid: 2
hight: 4
auto: 5
*/
void make_signal(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
a &= 0xF; b &= 0xF; c &= 0xF; d &= 0xF;
uint16_t val = (a << 12 | b << 8 | c << 4 | d) & 0xFFFF;
uint8_t crc = (a + b + c + d) & 0xF;
unsigned long data = 0x08800000;
data |= val << 4 | crc;
irsend.sendLG(data, 28);
}
void cooling(int temp, int fan) {
temp = min(max(18, temp), 30);
make_signal(0, 8, temp-15, fan);
}
void poweron(int temp, int fan) { // with cooling mode
temp = min(max(18, temp), 30);
make_signal(0, 0, temp-15, fan);
}
void poweroff() {
make_signal(12, 0, 0, 5);
}
//============================================================================//
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char c = Serial.read();
if (c == 'o') poweron(29, 0);
else if (c == 'p') poweroff();
else if (c == '6') cooling(26, 0);
else if (c == '7') cooling(27, 0);
else if (c == '8') cooling(28, 0);
else if (c == '9') cooling(29, 0);
else if (c == '0') cooling(30, 0);
}
}
접기
댓글을 달아 주세요
자세한 포스팅 너무 감사드립니다~^^
혹시 회로 구성도 볼 수 있을까요~?
+,- 연결하고, VEND1 을 디지털핀(글에서는 2번핀)에 연결한게 끝입니다.
전원은 어떻게 언결하나요?
사진에 보이듯 지폐기 위에 회로도가 그려져있어서.. 그냥 전원 어댑터 선 잘라서 연결해주었습니다.
안녕하세요~~! 현금인식기와 케이블을 어딧서 새제품으로살수 있는지 궁금합니다! 또한 돈 천원을 넣을때마다 모터가 3초동안만 움직일수 있도록 하고 싶은데 어떻해야 할수있을까요??아직 아두이노에 관심은 있는데 잘하질 못해서 그럽니다ㅜㅠ
제가 링크 걸었던 곳( http://smartpon4989.com/ )과 같이 자판기나 게임기 판매 사이트에서 구할 수 있는 것 같습니다. 온라인보다 오프라인에서 구하기 더 쉬우실 수도 있을 것 같네요.
후자는 purseIn 등으로 신호를 감지해서 모터를 작동하게 코드를 작성하시면 될 것 같네요.
왼쪽 부분 배선은 납뗌을 하셨나요 ?
배선 방법이 궁금합니다.
실 사용할땐 납땜해서 사용했습니다.
그라운드 공통선 물려주고 남는 선 하나로 펄스가 나오는데 analog 핀에 물려주고 읽으면 됩니다.
아두이노를 이용하여 인식이 되면 시리얼 모니터에 값을 띄우도록 설정하고 싶은데, 펄스값이 일정하지 않은 탓인지 지멋대로 인식이 되네요 ㅜㅜ 따로 방법 같은건 잘 모르시는지요 .. ?
잘봤습니다
인터럽트를 사용하면 놓치는 일은 없지 않을까요
덕분에 좋은 아이디어 하나 얻어 갑니다^^
위에 첨부된 코딩을 이용해 작동하니, 1000원 지폐 1회에 1~3회 인식됩니다(Serial monitor)
또 때론 인식 실패에도 1~2회 인식됩니다
(연결선: 2번 핀에 진권신호선 연결, 그라운드에 12용 SMPS 및 아두이노 Ground와 연결되었음
문제가 무엇인지요? ( 참고로 동일한 유형의 지폐기 입니다(삼덕사, 100mS))
조언 주시면 고맙겠습니다
PS:다른분의조언에 PC817 1번에 진권신호, 2번에 12V GND연결, 3번에 아두이노 Tx와 연결, 4번 아두이노 5VGND에 연결
이후 SMPS 및 아두이노 GND연결 해 보았으나 작동되질 않습니다
조언부탁드립니다
인식 실패에도 신호가 온다는걸 보니 노이즈가 있는 것 같습니다.
SMPS와 아두이노 외 다른 전원을 사용하는 장비가 있다면 빼고 아두이노와 지폐인식기만 연결해서 사용해보시고 케이블 연결 상태나 커넥터, 아두이노와 연결접점 등을 잘 확인해보세요
와..
마침 가게 다트기계에 오천원 만원권이 인식이 안되고 천원짜리만 인식되어서 알아보고있는데...
혹시 이거 주문제작도 가능하신가요??
가능하시다면 연락부탁드립니다.
01공8554 5985
어떤걸 주문제작 하고 싶으신진 모르겠지만...
저도 지폐인식기는 샀구요, 지폐인식기에서 값을 읽어오는 장치를 만든겁니다.
사용하시는 환경에서는 다트기계에 해당하는 부분일텐데, 다트기계 제조사에서 수정해줘야할 부분일 것 같네요!