적외선 신호의 송수신을 가능하게 하는 라이브러리입니다.
Arduino 라이브러리 "IRremote"로 사용 가능합니다.
? 구글 번역
지원되는 IR 프로토콜
특징
버전 4.x의 새로운 기능
버전 3.x의 새로운 기능
2.x 프로그램을 4.x 버전으로 변환
이전 MSB 첫 번째 32비트 IR 데이터 코드를 새로운 LSB 첫 번째 32비트 IR 데이터 코드로 변환하는 방법
이전 튜토리얼에 3.x 버전을 사용할 때 발생하는 오류
2.x를 유지하세요
*.cpp 대신 *.hpp를 사용하는 이유
새로운 *.hpp 파일 사용
튜토리얼
IR 코드를 지정하는 3가지 방법
IRReceiver 핀아웃
IR 코드 수신
부인 성명
이러한 프로토콜을 다룰 수 있는 기타 라이브러리
프로토콜=PULSE_DISTANCE
프로토콜=알 수 없음
IRremote에서 지원하지 않는 프로토콜을 처리하는 방법
decodedIR데이터 구조
모호한 프로토콜
다양한 프로토콜의 RAM 사용량
알 수 없는 프로토콜 처리
IR 코드 보내기
공개 IR 코드 데이터베이스 목록
IRDB IR 코드 보내기
핀 보내기
작은 NEC 수신기 및 송신기
FAST 프로토콜
FAQ 및 힌트
AnalogWrite() 또는tone() 후 또는 모터 실행 후 수신이 중지됩니다.
수신 세트 오버플로 플래그
Neopixels, FastLed 등의 문제
다른 라이브러리와 작동/컴파일되지 않습니다.
다중 IR 수신기 및 발신자 인스턴스
전송된 출력 신호의 강도를 높입니다.
최소 CPU 클럭 주파수
Bang & Olufsen 프로토콜
이 라이브러리의 예
WOKWI 온라인 예시
로봇 자동차의 IR 제어
이슈 및 토론
이 라이브러리에 대한 컴파일 옵션/매크로
Arduino IDE를 사용하여 포함(*.h) 파일 변경
Sloeber IDE를 사용하여 컴파일 옵션 수정
지원되는 보드
타이머 및 핀 사용
다른 라이브러리 및 Tone() 및 AnalogWrite()와 같은 Arduino 명령과의 비호환성
전송을 위한 하드웨어-PWM 신호 생성
전송에 30% 듀티 사이클을 사용하는 이유
신호를 디코딩하는 방법
NEC 인코딩 다이어그램
5개의 Arduino IR 수신 라이브러리의 빠른 비교
역사
유용한 링크
기여자
특허
저작권
NEC / Onkyo / Apple
Denon / Sharp
Panasonic / Kaseikyo
JVC
LG
RC5
RC6
Samsung
Sony
Universal Pulse Distance
Universal Pulse Width
Universal Pulse Distance Width
Hash
Pronto
BoseWave
Bang & Olufsen
Lego
FAST
Whynter
MagiQuest
다음과 같이 #include <IRremote.hpp>
줄 앞에 매크로를 정의하여 프로토콜을 끄고 켤 수 있습니다.
#define DECODE_NEC//#define DECODE_DENON#include <IRremote.hpp>
많은 튜토리얼과 예제.
적극적으로 유지 관리됩니다.
원시 타이밍 데이터 의 수신 및 전송을 허용합니다.
4.3 IrSender.begin(DISABLE_LED_FEEDBACK)
은 더 이상 작동하지 않으므로 대신 IrSender.begin(DISABLE_LED_FEEDBACK, 0)
사용하십시오.
이전에 알려지지 않은 많은 프로토콜을 포괄하는 새로운 범용 펄스 거리/펄스 폭/펄스 거리 폭 디코더가 추가되었습니다.
IrReceiver.printIRSendUsage(&Serial)
로 수신된 명령을 보내는 방법에 대한 코드 인쇄입니다.
RawData 유형은 이제 32비트 플랫폼의 경우 64비트이므로 decodedIRData.decodedRawData
이전과 같이 32비트보다 더 많은 프로토콜에 대한 완전한 프레임 정보를 포함할 수 있습니다.
명령 수신 후 콜백 - 메시지를 수신하자마자 코드를 호출합니다.
PULSE_DISTANCE
+ PULSE_WIDTH
프로토콜 처리가 개선되었습니다.
새로운 FAST 프로토콜.
printIRSendUsage()
사용하여 해당 전송 기능 을 자동으로 인쇄합니다.
#define DECODE_DISTANCE
#define DECODE_DISTANCE_WIDTH
로 바꿔야 합니다(이 디코더를 명시적으로 활성화한 경우에만).
bool hasStopBit
매개변수는 더 이상 필요하지 않으며, 예를 들어 sendPulseDistanceWidth()
함수의 경우 제거되었습니다.
모든 핀을 수신에 사용할 수 있으며 SEND_PWM_BY_TIMER
정의되지 않은 경우 전송에도 사용할 수 있습니다.
피드백 LED는 송신/수신 시 활성화될 수 있습니다.
디코딩을 위해 8/16비트 ** 명령 값과 16비트 주소 및 프로토콜 번호가 제공됩니다(기존 32비트 값 대신).
프로토콜 값은 프로토콜 표준을 따릅니다.
NEC, Panasonic, Sony, Samsung 및 JVC는 LSB를 먼저 디코딩하고 전송합니다.
이전에 알려지지 않은 많은 프로토콜을 다루는 Universal Distance 프로토콜을 지원합니다.
Tone() 라이브러리와 호환됩니다. receiveDemo 예제를 참조하세요.
동시 전송 및 수신. SendAndReceive 예제를 참조하세요.
더 많은 플랫폼을 지원합니다.
IR을 사용하지 않고 기존 수신 장치에 직접 연결하기 위해 비PWM 신호를 생성하여 활성 로우 수신기 신호를 시뮬레이션 할 수 있습니다.
소스 코드에서 직접 프로토콜을 쉽게 구성할 수 있습니다.
메모리 공간을 줄이고 디코딩 시간을 줄입니다.
타이머 리소스가 필요하지 않은 매우 작은 NEC 전용 디코더가 포함되어 있습니다.
-> 5개의 Arduino IR 라이브러리의 기능 비교.
3.1 버전부터 전송을 위한 PWM 생성이 소프트웨어에 의해 수행되므로 하드웨어 타이머가 저장되고 전송을 위한 임의의 출력 핀이 활성화됩니다 .
컴파일에 -flto
플래그를 사용하지 않는 (이전) Arduino 코어를 사용하는 경우 컴파일 중에 start()와 관련된 잘못된 오류 메시지가 나타나면 IRRemote.h에서 #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
줄을 활성화할 수 있습니다.
IRreceiver 및 IRsender 개체가 추가되었으며 잘 알려진 Arduino Serial 개체처럼 정의하지 않고 사용할 수 있습니다.
IRrecv IrReceiver(IR_RECEIVE_PIN);
및/또는 IRsend IrSender;
프로그램에서 IRrecv.
또는 irrecv.
IrReceiver
사용하고 모든 IRsend
또는 irsend
IrSender
로 바꿉니다.
디코딩된 값은 이제 IrReceiver.decodedIRData
에 있고 더 이상 results
에 없으므로 decode_results results
또는 유사한 줄을 제거합니다.
Serial 객체와 마찬가지로 setup()에서 IrReceiver.enableIRIn()
또는 irrecv.enableIRIn()
대신 IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)
또는 IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)
을 호출합니다.
전송하려면 IrSender.begin();
설정()에서.
IR_SEND_PIN이 정의되지 않은 경우( #include <IRremote.hpp>
행 이전) IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
이전 decode(decode_results *aResults)
함수는 간단한 decode()
로 대체되었습니다. 따라서 if(irrecv.decode(&results))
문이 있는 경우 이를 if (IrReceiver.decode())
로 바꾸세요.
디코딩된 결과는 이제 IrReceiver.decodedIRData
에 있고 더 이상 results
에 없습니다. 따라서 results.value
및 results.decode_type
(및 유사한) 항목을 IrReceiver.decodedIRData.decodedRawData
및 IrReceiver.decodedIRData.protocol
로 대체합니다.
오버플로, 반복 및 기타 플래그는 이제 IrReceiver.receivedIRData.flags
에 있습니다.
거의 사용되지 않음: results.rawbuf
및 results.rawlen
IrReceiver.decodedIRData.rawDataPtr->rawbuf
및 IrReceiver.decodedIRData.rawDataPtr->rawlen
으로 대체되어야 합니다.
NEC, Panasonic, Sony, Samsung 및 JVC 5가지 프로토콜이 먼저 LSB로 변환되었습니다. 기존 MSB 데이터 전송을 위한 보내기 함수의 이름이 sendNECMSB
, sendSamsungMSB()
, sendSonyMSB()
및 sendJVCMSB()
로 변경되었습니다. 기존 sendSAMSUNG()
및 sendSony()
MSB 기능을 계속 사용할 수 있습니다. sendPanasonic()
함수의 이전 MSB 버전은 삭제되었습니다. 왜냐하면 아무도 인식하지 못하는 버그가 있어서 전혀 사용되지 않는 것으로 간주되었기 때문입니다.
MSB 코드를 LSB로 변환하려면 아래를 참조하세요.
#include <IRremote.h>#define RECV_PIN 2IRrecv irrecv(RECV_PIN); decode_results 결과;void setup() { ... Serial.begin(115200); // 직렬 통신 설정 irrecv.enableIRIn(); // 수신기 시작}void loop() { if (irrecv.decode(&results)) { Serial.println(결과.값, HEX); ... irrecv.resume(); // 다음 값을 받습니다 } ... }
#include <IRremote.hpp>#define IR_RECEIVE_PIN 2void setup() { ... Serial.begin(115200); // // 직렬 통신 설정 IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // 수신기 시작}void loop() { if (IrReceiver.decode()) { Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // "오래된" 원시 데이터를 인쇄합니다. IrReceiver.printIRResultShort(&Serial); // 수신된 전체 데이터를 한 줄에 인쇄합니다. IrReceiver.printIRSendUsage(&Serial); // 이 데이터를 보내는 데 필요한 명령문을 인쇄합니다. ... IrReceiver.resume(); // 다음 값 수신 활성화 } ... }
NEC, Panasonic, Sony, Samsung 및 JVC 용 새 디코더의 경우 IrReceiver.decodedIRData.decodedRawData
결과는 이제 이러한 프로토콜의 정의에서 알 수 있듯이 LSB 우선 입니다!
하나를 다른 것으로 변환하려면 바이트/니블 위치를 반전한 다음 각 바이트/니블의 모든 비트 위치를 반전하거나 하나의 이진 문자열로 쓰고 반전/미러링해야 합니다.
예: 0xCB 34 01 02
0x20 10 43 BC
니블 역방향 이후
각 니블의 비트 반전 후 0x40 80 2C D3
0->0 1->8 2->4 3->C 4->2 5->A 6->6 7->E 8->1 9->9 A->5 B->D C->3 D->B E->7 F->F
0xCB340102
이진수 1100 1011 0011 0100 0000 0001 0000 0010
입니다.
0x40802CD3
이진수 0100 0000 1000 0000 0010 1100 1101 0011
입니다.
첫 번째 이진 시퀀스를 거꾸로(오른쪽에서 왼쪽으로) 읽으면 두 번째 시퀀스를 얻게 됩니다. 이를 위해 bitreverseOneByte()
또는 bitreverse32Bit()
사용할 수 있습니다.
변환 없이 이전 MSB 코드를 보내는 것은 sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
사용하여 수행할 수 있습니다.
IRremote.hpp
대신 IRremote.h
를 포함한 이전 튜토리얼 코드에서 오류가 발생하는 경우 버전 2.4.0으로 롤백해 보세요.
아마도 코드가 실행될 것이며 새로운 기능을 놓치지 않을 것입니다.
프로젝트에 원래 2.4 릴리스 형식 2017 또는 이전 버전과 호환되는 마지막 2.8 버전을 사용하는 것을 고려해보세요.
이는 충분할 수 있으며 32비트 IR 코드를 완벽하게 처리합니다.
이것이 귀하의 경우에 맞지 않으면 4.x는 최소한 이전 버전과 호환되도록 노력하고 있으므로 이전 예제는 여전히 잘 작동할 것입니다.
다음 디코더만 사용할 수 있습니다.
NEC
Denon
Panasonic
JVC
LG
RC5
RC6
Samsung
Sony
irrecv.decode(&results)
호출은 2.x에서와 같이 기존 MSB 우선 디코더를 사용하고 results.value
에 32비트 코드를 설정합니다.
보다 의미 있는(일정한) 8/16비트 주소 및 8비트 명령으로 디코딩되지 않습니다.
모든 *.cpp 파일은 이 cpp 파일 전용 컴파일러 호출에 의해 별도로 컴파일됩니다 . 이러한 호출은 IDE/make 시스템에 의해 관리됩니다. Arduino IDE에서는 확인 또는 업로드를 클릭하면 호출이 실행됩니다.
이제 Arduino의 문제는 다음과 같습니다.
모든 *.cpp 파일, 특히 사용되는 라이브러리에 대한 컴파일 옵션을 설정하는 방법은 무엇입니까?
Sloeber 또는 PlatformIO와 같은 IDE는 프로젝트별로 옵션 세트를 지정할 수 있도록 하여 이를 지원합니다. -DTRACE
와 같은 각 컴파일러 호출에 이러한 옵션을 추가합니다.
하지만 Arduino에는 이 기능이 없습니다. 따라서 해결 방법은 모든 소스를 개별적으로 컴파일하는 것이 아니라 소스에 포함시켜 하나의 거대한 소스 파일로 연결하는 것입니다.
이는 #include "IRremote.hpp"
와 같이 수행됩니다.
그런데 왜 #include "IRremote.cpp"
가 없나요?
시도해 보면 수많은 오류를 보게 될 것입니다. 왜냐하면 *.cpp 파일의 각 기능이 이제 두 번 컴파일되기 때문입니다. 첫 번째는 거대한 파일을 컴파일하고 두 번째는 위에서 설명한 것처럼 *.cpp 파일을 별도로 컴파일하는 것입니다.
따라서 확장자 cpp를 사용하는 것은 더 이상 가능하지 않으며 한 가지 해결책은 hpp를 확장자로 사용하여 포함된 *.cpp 파일임을 표시하는 것입니다.
cinclude 와 같은 다른 모든 확장은 가능하지만 hpp는 상식인 것 같습니다.
컴파일 옵션을 더 쉽게 지원하려면 기본 프로그램(setup() 및 loop()이 있는 *.ino 파일이라고도 함)에서 #include <IRremote.hpp>
대신 #include <IRremote.h>
> 문을 사용해야 합니다.
다른 모든 파일 에서는 multiple definitions
링커 오류를 방지하기 위해 다음을 사용해야 합니다.
#define USE_IRREMOTE_HPP_AS_PLAIN_INCLUDE#include <IRremote.hpp>
기본 프로그램의 모든 매크로가 #include <IRremote.hpp>
앞에 정의되어 있는지 확인하세요.
그렇지 않으면 다음 매크로가 기본값으로 재정의됩니다.
RAW_BUFFER_LENGTH
IR_SEND_PIN
SEND_PWM_BY_TIMER
DroneBot Workshop의 IR 리모컨 및 IRremote 라이브러리에 대한 매우 정교한 소개입니다.
특정 IR 코드를 지정하는 방법에는 3가지가 있습니다.
각 마크/펄스 및 간격/거리_사이_펄스의 타이밍은 목록 또는 배열로 지정됩니다. 이를 통해 모든 IR 코드를 지정할 수 있지만 메모리가 많이 필요하고 전혀 읽을 수 없습니다 . 주파수 및 반복 사양을 포함하여 이러한 타이밍 배열의 공식적인 정의 중 하나는 Pronto 형식입니다.
더 낮은 시간 해상도를 사용하면 메모리를 절약할 수 있습니다. IRremote의 경우 int16 값 대신 바이트 값을 사용하여 메모리 요구 사항을 절반으로 줄이는 50 µs 해상도를 사용할 수 있습니다. 수신 목적으로 decodeHash()
디코더에서 제공하는 타이밍 해시를 사용할 수 있습니다.
바이너리 비트스트림/16진수 값을 인코딩하는 3가지 주요 인코딩 방식이 있습니다.
PULSE_DISTANCE
. 펄스 사이의 거리에 따라 비트 값이 결정됩니다. 이를 위해서는 항상 정지 비트가 필요합니다! 예를 들면 NEC 및 KASEIKYO 프로토콜이 있습니다. 펄스 폭은 대부분의 프로토콜에서 일정합니다.
PULSE_WIDTH
. 펄스의 폭은 비트 값을 결정하며, 펄스 거리는 일정합니다. 여기에는 정지 비트가 필요하지 않습니다! 알려진 유일한 예는 SONY 프로토콜입니다.
위상/맨체스터 인코딩. 클록에 대한 펄스/일시 정지 전환(위상) 시간에 따라 비트 값이 결정됩니다. 예로는 RC5 및 RC6 프로토콜이 있습니다.
위상 인코딩에는 일정한 비트 길이가 있고, PULSE_DISTANCE
에는 일정한 펄스 폭이 있으며, PULSE_WIDTH
에는 일정한 비트 길이가 없습니다 !
일정하지 않은 펄스 폭 인코딩을 사용하는 PULSE_DISTANCE
의 잘 알려진 예는 RS232 직렬 인코딩 입니다. 여기서는 일정하지 않은 펄스 폭을 사용하여 일정한 비트 길이를 활성화합니다.
대부분의 IR 신호에는 수신기 회로의 자동 이득을 설정하는 데 도움이 되는 특수 헤더가 있습니다. 이 헤더는 인코딩의 일부는 아니지만 특수 프로토콜에 중요한 경우가 많으므로 재현 가능해야 합니다.
펄스/일시 중지 조합에 바이너리 0/1 이상이 입력되는 PULSE_DISTANCE
인코딩을 사용하는 코드가 있다는 점에 유의하세요. 이를 위해서는 2개 이상의 서로 다른 펄스 또는 일시 중지 길이 조합이 필요합니다. HobToHood 프로토콜은 이러한 인코딩을 사용합니다.
인코딩 체계를 사용하면 IR 코드의 사양이 기본적으로 LSB인 비트스트림/16진수 값과 헤더 0 및 1의 펄스/일시 중지 타이밍으로 줄어듭니다. 16진수 값은 매우 읽기 쉽습니다 . 이러한 체계는 이 비트스트림에 주소, 명령 또는 체크섬과 같은 의미를 넣을 수 없습니다.
IRremote에서 직접 구현되는 몇 가지 일반적인 프로토콜이 있습니다. 이는 주파수, 헤더 타이밍, 0 및 1뿐만 아니라 체크섬, 반복 거리, 반복 코딩, 비트 토글 등과 같은 다른 값을 지정합니다. 16진수 값의 의미도 지정되므로 주소 매개변수 2개만 사용할 수 있습니다. IR 코드를 지정하는 명령 입니다. 이는 메모리를 절약하고 가독성이 높습니다 . 종종 주소도 일정하므로 메모리 요구 사항이 더욱 줄어듭니다.
Adafruit IR 센서 튜토리얼
프로그램에서 다음을 사용하여 완전히 수신된 IR 프레임을 확인합니다.
if (IrReceiver.decode()) {}
이는 수신된 데이터도 디코딩합니다.
성공적인 디코딩 후 IR 데이터는 IrReceiver.decodedIRData
로 사용 가능한 IRData 구조에 포함됩니다.
struct IRData { decode_type_t 프로토콜; // 알 수 없음, NEC, SONY, RC5, PULSE_DISTANCE, ... uint16_t 주소; // 디코딩된 주소 uint16_t 명령; // 디코딩된 명령 uint16_t extra; // Kaseikyo 알 수 없는 공급업체 ID에 사용됩니다. 거리 프로토콜을 디코딩하는 데 사용되는 틱입니다. uint16_t numberOfBits; // 데이터(주소 + 명령 + 패리티)에 대해 수신된 비트 수 - 다른 길이가 가능한 경우 프로토콜 길이를 결정합니다. uint8_t 플래그; // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW 등 IRDATA_FLAGS_* 정의 참조 IRRawDataType decodedRawData; // sendRaw 함수에 사용되는 최대 32비트(32비트 CPU 아키텍처의 경우 64비트)로 디코딩된 원시 데이터입니다. uint32_t decodedRawDataArray[RAW_DATA_ARRAY_SIZE]; // 32비트로 디코딩된 원시 데이터로 전송 기능에 사용됩니다. irparams_struct *rawDataPtr; // 디코딩할 원시 타이밍 데이터의 포인터입니다. 주로 ISR을 수신하여 데이터 버퍼가 채워집니다.};
플래그 필드에 포함된 플래그 목록입니다.
예를 들어 if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
로 확인하세요.
국기 이름 | 설명 |
---|---|
IRDATA_FLAGS_IS_REPEAT | 이전 프레임 사이의 간격은 반복에 대해 예상되는 최대 간격보다 작습니다. !!!변경된 명령이나 주소는 확인하지 않습니다. 약 100ms 이내에 리모컨의 2개의 다른 버튼을 누르는 것이 거의 불가능하기 때문입니다!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | 현재 반복 프레임은 반복이므로 항상 일반 프레임 다음에 전송되며 피할 수 없습니다. DENON 및 LEGO 프로토콜에만 지정됩니다. |
IRDATA_FLAGS_PARITY_FAILED | 현재(자동 반복) 프레임이 패리티 검사를 위반했습니다. |
IRDATA_FLAGS_TOGGLE_BIT | RC5 또는 RC6 토글 비트가 설정된 경우 설정됩니다. |
IRDATA_FLAGS_EXTRA_INFO | 주소와 데이터에 포함되지 않은 추가 정보가 있습니다(예: Kaseikyo 알 수 없는 공급업체 ID 또는 decodedRawDataArray에 있음). |
IRDATA_FLAGS_WAS_OVERFLOW | 지정된 RAW_BUFFER_LENGTH 에 표시와 공백이 너무 많습니다. 끝없는 오버플로 플래그 지정을 방지하기 위해 이 경우 irparams.rawlen은 0으로 설정됩니다. |
IRDATA_FLAGS_IS_MSB_FIRST | 이 값은 주로 (알려진) 프로토콜에 의해 결정됩니다. |
자동 myRawdata= IrReceiver.decodedIRData.decodedRawData;
IrReceiver.decodedIRData.flags
에 대한 정의는 여기에 설명되어 있습니다.
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);`
원시 데이터는 수신된 신호와 관련된 Arduino 타이머의 내부 상태에 따라 달라지므로 매번 조금씩 다를 수 있습니다. (해상도 문제). 디코딩된 값은 이러한 작은 차이를 허용하는 해석된 값입니다!
IrReceiver.printIRSendUsage(&Serial);
NEC 프로토콜은 8비트 주소와 8비트 명령으로 정의됩니다. 그러나 물리적 주소와 데이터 필드의 너비는 각각 16비트입니다. 추가 8비트는 패리티 검사를 위해 반전된 주소나 명령을 보내는 데 사용됩니다.
확장된 NEC 프로토콜은 16비트 주소에 대해 주소의 추가 8패리티 비트를 사용하므로 주소에 대한 패리티 검사를 비활성화합니다.
ONKYO 프로토콜은 16비트 주소 및 명령에 대해 추가 8패리티 주소 및 명령 비트를 사용합니다.
패리티가 올바른 경우 디코더는 16비트 값을 8비트 값으로 줄입니다. 패리티가 올바르지 않으면 패리티 오류가 없다고 가정하지만 확장 NEC 또는 확장 NEC 프로토콜 프로토콜을 가정하여 패리티가 없는 16비트 값으로 값을 취합니다.
그러나 이제 16비트 주소 0x00FF 또는 0x32CD를 수신하려고 할 때 문제가 발생합니다! 디코더는 이를 올바른 패리티 0xFF/0xCD가 있는 NEC 8비트 주소 0x00/0x32로 해석하고 이를 0x00/0x32로 줄입니다.
이를 처리하는 한 가지 방법은 #define DECODE_ONKYO
사용하여 라이브러리가 항상 ONKYO 프로토콜 해석을 사용하도록 하는 것입니다. 또 다른 방법은 IrReceiver.decodedIRData.protocol
이 ONKYO가 아닌 NEC인지 확인하고 패리티 감소를 수동으로 되돌리는 것입니다.
길게 누르면 NEC 프로토콜은 해당 프레임을 반복하지 않고 특수한 짧은 반복 프레임을 보냅니다. 이를 통해 길게 누르는 것과 반복적으로 누르는 것을 쉽게 구별할 수 있으며 약간의 배터리 에너지가 절약됩니다. 이 동작은 NEC와 LG 및 Samsung과 같은 NEC에서 파생된 프로토콜에서 매우 독특합니다.
물론 NEC 프로토콜을 사용하지만 특수한 짧은 반복 프레임을 보내는 대신 길게 누를 때 첫 번째 프레임만 반복하는 원격 제어 시스템도 있습니다. 우리는 이것을 NEC2 프로토콜이라고 명명하고 sendNEC2()
를 통해 전송됩니다.
하지만 주의하세요. NEC2 프로토콜은 첫 번째 프레임 이후 길게 누르는 경우에만 NEC 라이브러리 디코더에 의해 감지될 수 있습니다!
길게 누르면 SamsungLG 프로토콜은 프레임을 반복하지 않고 특수한 짧은 반복 프레임을 보냅니다.
RAW_BUFFER_LENGTH
는 디코딩 전 수신된 IR 타이밍 데이터가 저장되는 바이트 버퍼 의 길이를 결정합니다.
최대 48비트의 표준 프로토콜에는 100 이면 충분하며 1비트는 하나의 표시와 공백으로 구성됩니다. 항상 추가 4바이트, 즉 초기 간격에 1바이트, 헤더에 2바이트, 정지 비트에 1바이트가 필요합니다.
48 비트 프로토콜은 PANASONIC, KASEIKYO, SAMSUNG48, RC6입니다.
NEC, SAMSUNG, WHYNTER, SONY(20), LG(28)와 같은 32 비트 프로토콜에는 68 의 버퍼 길이가 필요합니다.
BOSEWAVE, DENON, FAST, JVC, LEGO_PF, RC5, SONY(12 또는 15)와 같은 16 비트 프로토콜에는 36 의 버퍼 길이가 필요합니다.
MAGIQUEST에는 112 의 버퍼 길이가 필요합니다.
에어컨은 최대 750비트까지 더 긴 프로토콜 데이터 스트림을 보내는 경우가 많습니다.
RECORD_GAP_MICROS
에 의해 결정된 레코드 간격이 기본 8ms에서 20ms 이상으로 변경되면 버퍼는 더 이상 바이트가 아니라 uint16_t 버퍼이므로 두 배의 RAM이 필요합니다.
이 라이브러리는 상대적으로 낮은 수준의 리소스를 사용하는 MCU 내부에 적합하도록 설계되었으며 작동하기 위해 MCU의 일부 리소스가 필요한 다른 애플리케이션과 함께 라이브러리로 작동하도록 고안되었습니다.
IR 프로토콜에 대한 모든 정보를 인쇄하려면 ReceiverDemo 예제를 사용하십시오.
ReceiverDump 예제는 더 많은 정보를 제공하지만 정보 인쇄에 필요한 시간으로 인해 반복 감지가 잘못되었습니다.
귀하의 프로토콜이 이 라이브러리에서 지원되지 않는 것 같으면 특히 맨체스터 프로토콜을 훨씬 더 잘 지원하는 IRMP 라이브러리를 사용해 볼 수 있습니다.
에어컨 의 경우 인상적인 프로토콜 세트와 많은 에어컨을 지원하고 ESP32에서도 작동하는 IRremoteESP8266 라이브러리를 사용해 볼 수 있습니다.
Raw-IR-decoder-for-Arduino는 라이브러리가 아니지만 특히 에어컨 프로토콜을 디코딩하는 다양한 방법을 제공하는 Arduino 예제 스케치입니다. 이러한 프로토콜 전송은 Arduino 라이브러리 HeatpumpIR을 통해 수행할 수 있습니다.
다음과 같은 결과가 나오면:
PULSE_DISTANCE: HeaderMarkMicros=8900 HeaderSpaceMicros=4450 MarkMicros=550 OneSpaceMicros=1700 ZeroSpaceMicros=600 NumberOfBits=56 0x43D8613C 0x3BC3BC
그러면 56비트로 구성된 코드가 있는데, 이는 아마도 에어컨 리모컨에서 나온 것일 수 있습니다.
sendPulseDistanceWidth()
사용하여 보낼 수 있습니다.
uint32_t tRawData[] = { 0xB02002, 0xA010 }; IrSender.sendPulseDistance(38, 3450, 1700, 450, 1250, 450, 400, &tRawData[0], 48, false, 0, 0);
sendPulseDistanceWidthData()
두 번 호출하여 처음 32비트에 대해 한 번, 나머지 24비트에 대해 한 번 호출하여 보낼 수 있습니다.
PULSE_DISTANCE
/ PULSE_WIDTH
디코더는 타이밍 스트림을 16진수 값으로 저장된 비트스트림으로 디코딩합니다. 이러한 디코더는 이 비트스트림에 주소, 명령 또는 체크섬과 같은 의미를 넣을 수 없습니다. 그러나 비트스트림은 타이밍 스트림보다 훨씬 더 읽기 쉽습니다. 이 비트스트림은 기본적으로 LSB 먼저 읽혀집니다. LSB가 추가 연구에 적합하지 않은 경우 여기에서 변경할 수 있습니다.
RAM이 2k 이하인 경우 디코더는 RAM 공간을 절약하기 위해 최대 2500마이크로초의 표시 또는 공간 지속 시간만 허용하고, 그렇지 않으면 최대 10ms의 지속 시간을 허용합니다.
Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
된 예의 출력으로 수신된 경우 프로토콜을 디코딩하는 데 문제가 있거나 지원되지 않는 프로토콜이 있는 것입니다.
수신된 비트 수가 홀수 라면 수신기 회로에 문제가 있을 수 있습니다. IR 신호가 너무 약해서 그럴 수도 있습니다.
+ 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
과 같은 타이밍이 표시되면 하나의 450 µs 공간이 200 µs의 스파이크/오류 신호를 사용하여 두 개의 150 및 100 µs 공간으로 분할되었습니다. 아마도 수신기에 결함이 있거나 근처의 다른 발광원과 관련된 신호가 약하기 때문일 수 있습니다.
+ 500,- 550 + 450,- 550 + 450,- 500 + 500,-1550
과 같은 타이밍이 표시되면 표시는 일반적으로 공백보다 짧으므로 이를 보상하기 위해 MARK_EXCESS_MICROS
(ino 파일에 지정됨) 가 음수 여야 합니다. 디코딩 중.
Protocol=UNKNOWN Hash=0x0 1 bits received
표시되면 초기 표시 뒤의 공간이 RECORD_GAP_MICROS
보다 길 수도 있습니다. 이는 일부 LG 에어컨 프로토콜에서 관찰되었습니다. .ino 파일에서 #include <IRremote.hpp>
줄 앞에 #define RECORD_GAP_MICROS 12000
줄을 추가하여 다시 시도하세요.
UNKNOWN 프로토콜의 이유를 찾는 데 도움이 되는 추가 정보를 보려면 IRremoteInt.h에서 //#define DEBUG
줄을 활성화해야 합니다.
IR 송신기가 어떤 프로토콜을 사용하는지 모르는 경우 몇 가지 선택 사항이 있습니다.
해시 값을 사용하여 어떤 명령이 수신되었는지 결정하세요. SimpleReceiverForHashCodes 예제를 참조하세요.
IRreceiveDemo 예제 또는 IRreceiveDump 예제를 사용하여 IR 타이밍을 덤프합니다. 그런 다음 SendRawDemo 예제를 사용하여 이 타이밍을 재현/전송할 수 있습니다.
IRMP AllProtocol 예제는 지원되는 40개 프로토콜 중 하나에 대한 프로토콜과 데이터를 인쇄합니다. 이 코드를 보내는 데 동일한 라이브러리를 사용할 수 있습니다.
더 큰 Arduino 보드(> 100kByte 프로그램 메모리)가 있는 경우 Arduino 라이브러리 DecodeIR의 IRremoteDecode 예제를 시도해 볼 수 있습니다.
IrScrutinizer를 사용하세요. "Arduino Raw"로 내보내면 프로토콜에 대한 전송 스케치를 자동으로 생성할 수 있습니다. IRremote, 기존 IRLib 및 Infrared4Arduino를 지원합니다.
작업하려는 IR 코드(일명 IR 리모컨)를 생성할 수 있는 장치가 있는 경우 시리얼 출력에서 전송 방법을 알려주는 ReceiverDemo 예제를 통해 코드를 수신하는 것이 좋습니다 .
Protocol=LG Address=0x2 Command=0x3434 Raw-Data=0x23434E 28 bits MSB first Send with: IrSender.sendLG(0x2, 0x3434, <numberOfRepeats>);
주소가 상수 이고 명령이 때때로 현명하게 그룹화되어 있다는 것을 알게 될 것입니다.
전송에 사용할 반복 횟수가 확실하지 않은 경우 3 이 좋은 시작점입니다. 이것이 작동하면 나중에 더 낮은 값을 확인할 수 있습니다.
DECODE_DISTANCE_WIDTH
활성화한 경우 printIRSendUsage()
에 의해 인쇄된 코드는 8비트 플랫폼과 32비트 플랫폼에서 다르기 때문에 송신 프로그램과 동일한 플랫폼에서 수신 프로그램을 실행하는 것이 가장 좋습니다.
모든 전송 기능은 합리적인 경우 반복 전송을 지원합니다 . 반복 프레임은 프로토콜에 의해 결정된 고정 주기로 전송됩니다. 예를 들어 NEC의 경우 시작부터 시작까지 110ms입니다.
마지막으로 보낸 mark 이후에는 지연이 없다는 점을 명심하세요. 반복 프레임 전송을 직접 처리하는 경우 올바른 디코딩을 활성화하려면 반복 프레임 앞에 적절한 지연을 삽입해야 합니다.
변환 없이 이전 MSB 코드를 보내는 것은 sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
사용하여 수행할 수 있습니다.
Flipper-IRDB 데이터베이스에 있는 코드는 주소/명령 체계도 사용하기 때문에 변환이 매우 간단합니다.
프로토콜 일치는 NECext -> NECext(또는 Onkyo), Samsung32 -> Samsung, SIRC20 -> 20비트 Sony 등입니다.
irdb 데이터베이스에 있는 코드는 장치 , 하위 장치 및 기능을 지정합니다. 대부분의 경우 장치 및 하위 장치는 주소 매개변수 의 상위 및 하위 바이트로 간주될 수 있으며 기능은 IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
와 같은 주소, 명령 및 반복 횟수 매개변수가 있는 새로운 구조화된 기능 에 대한 명령 매개변수 입니다. IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
.
IR 프로토콜에 대한 IRP 정의 파일에서 정확한 매핑을 찾을 수 있습니다. "D"와 "S"는 장치와 하위 장치를 나타내고 "F"는 기능을 나타냅니다.
SEND_PWM_BY_TIMER
활성화되지 않았기 때문에 기본적으로 소프트웨어 비트 뱅잉을 통해 PWM 신호가 생성되므로 모든 핀을 전송 핀으로 선택할 수 있습니다.
ESP32 에서는 LEDC 채널 0이 IR PWM 생성에 사용됩니다.
IR_SEND_PIN
이 지정되면(c 매크로로) 프로그램 크기가 줄어들고 AVR의 전송 타이밍이 향상됩니다. setSendPin(uint8_t aSendPinNumber)
와 같은 변수를 사용하여 전송 핀을 지정하려면 이 IR_SEND_PIN
매크로를 비활성화해야 합니다. 그런 다음 IR 프레임을 전송하기 전에 언제든지 전송 핀을 변경할 수 있습니다. 이 라이브러리에 대한 컴파일 옵션/매크로도 참조하세요.
http://www.harctoolbox.org/IR-resources.html
플리퍼 IRDB 데이터베이스
플리퍼 디코딩 | IR원격 디코딩 |
---|---|
삼성32 | 삼성 |
NEC | NEC |
NECext | 온쿄 |
<시작 비트><VendorID:16><VendorID 패리티:4><Genre1:4><Genre2:4><Command:10><ID:2><Parity:8><정지 비트> ID는 주소의 MSB입니다. 주소: 8A 02 20 00 명령: 56 03 00 00 -> IR원격: 주소 0x6A8, sendPanasonic(02 20용) 및 명령 0x35 | <시작 비트><VendorID:16><VendorID 패리티:4><Address:12><Command:8><VendorID 패리티의 패리티, 주소 및 명령:8><정지 비트> |
NEC, NEC 변형 또는 FAST(아래 참조) 프로토콜만 필요한 애플리케이션의 경우 특수 수신기/발신기가 포함되어 있으며 코드 크기가 500바이트로 매우 작으며 타이머가 필요하지 않습니다 .
IRremote처럼 50μs마다 입력을 샘플링하는 대신 TinyReceiver 수신기는 프로토콜 선택을 제한하는 즉석 디코딩을 위해 핀 변경 인터럽트를 사용합니다.
각 레벨 변경 시 마지막 변경 이후의 레벨과 시간을 사용하여 프로토콜을 점진적으로 디코딩합니다.
이 작동 원리를 사용하면 IRremote처럼 시간 초과를 기다린 다음 프로토콜을 디코딩할 수 없습니다 .
대신, 최종 디코딩을 수행하기 위한 프로토콜의 마지막 비트(레벨 변경)가 무엇인지 알아야 하고 사용자가 제공한 선택적 콜백 함수인 handleTinyReceivedIRData()
를 호출해야 합니다.
이는 프로토콜의 비트 수와 프로토콜(패밀리)을 알아야 함 을 의미합니다.
TinyReceiver 및 IRDispatcherDemo 예제를 확인하세요.
IRremote.hpp
대신 TinyIRReceiver.hpp
또는 TinyIRSender.hpp
포함하도록 주의하세요.
//#define USE_ONKYO_PROTOCOL // NEC와 비슷하지만 16비트 주소를 취하고 각각을 하나의 16비트 값으로 명령하며 8비트 일반 값과 8비트 반전 값은 아닙니다.//#define USE_FAST_PROTOCOL // NEC 대신 FAST 프로토콜을 사용합니다. ONKYO#include "TinyIRReceiver.hpp"void setup() { initPCIInterruptForTinyReceiver(); // IR 입력 신호 변경 시 인터럽트 생성을 활성화합니다.}void loop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // 이력서()가 필요하지 않습니다 :-)}
#include "TinyIRSender.hpp"void setup() { sendNEC(3, 0, 11, 2); // 2번 반복하여 핀 3에 주소 0과 명령 11을 보냅니다.}void loop() {}
더 많은 프로토콜을 지원하는 또 다른 작은 수신기와 송신기를 여기에서 찾을 수 있습니다.
FAST 프로토콜은 주소가 없고 패리티가 있으며 헤더가 더 짧은 독점적으로 수정된 JVC 프로토콜입니다. 이는 다른 보드에 프로토콜 프레임을 전송한 이벤트에 대한 빠른 응답을 의미합니다. FAST는 전송하는 데 21ms가 걸리며 50ms 주기로 전송됩니다. 오류 감지를 위한 전체 8비트 패리티가 있습니다.
비트 타이밍은 JVC와 같습니다.
헤더는 3156μs 대 12500μs로 더 짧습니다.
주소 없음 및 16비트 데이터는 8비트 명령 및 8비트 반전 명령으로 해석되어 (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 마이크로초 또는 29 ms의 고정 프로토콜 길이로 이어집니다.
반복은 완전한 프레임으로 전송되지만 50ms 주기/21ms 거리로 전송됩니다.
#define IR_SEND_PIN 3#include <IRremote.hpp>void setup() { sendFAST(11, 2); // 2번 반복하여 핀 3에 명령 11을 보냅니다.}void loop() {}
#define USE_FAST_PROTOCOL // FAST 프로토콜을 사용합니다. 주소 없음 및 16비트 데이터, 8비트 명령 및 8비트 반전 명령으로 해석됨#include "TinyIRSender.hpp"void setup() { sendFAST(3, 11, 2); // 2번 반복하여 핀 3에 명령 11을 보냅니다.}void loop() {}
FAST 프로토콜은 IRremote 및 TinyIRReceiver에서 수신할 수 있습니다.
50 µs의 수신기 샘플 간격은 타이머에 의해 생성됩니다. 많은 보드에서 이것은 하드웨어 타이머 여야합니다. 소프트웨어 타이머를 사용할 수있는 일부 보드에서는 소프트웨어 타이머가 사용됩니다.
수신에 사용되는 하드웨어 타이머는 analogWrite()
에 사용해서는 안됩니다.
특히 모터 컨트롤은 종종 analogWrite()
함수를 사용하므로 여기에 표시된 핀에 사용되는 경우 수신을 중지합니다.
UNO 및 기타 AVR 보드에서 수신기 타이머는 톤 타이머와 동일합니다. 따라서 tone()
명령 후에 수신이 중지됩니다. 수신 된 예제를 참조하십시오. 즉, IrReceiver.restartTimer()
사용하는 방법을 다루는 방법을 참조하십시오.
RAW_BUFFER_LENGTH
프로토콜의 모든 마크와 공백에 비해 너무 작 으면 플래그 IRDATA_FLAGS_WAS_OVERFLOW
가 설정됩니다. 이것은 에어컨의 프레임과 같은 긴 프로토콜 프레임에서 발생할 수 있습니다. RECORD_GAP_MICROS
가 프레임과 THR 반복 프레임 사이의 실제 간격보다 작 으면 하나의 연속 프레임으로 해석하는 경우에도 발생할 수 있습니다. 가장 좋은 것은 타이밍을 버려서 어떤 이유가 있는지 확인하는 것입니다.
Neopixels (일명 WS2811/WS2812/WS2812B) 또는 기타 라이브러리가 더 오랜 시간 동안 (> 50 µs)를 차단하는 경우 Irremote는 제대로 작동하지 않습니다.
Adafruit Neopixel lib를 사용하든 빠른 속도로든, 인터럽트는 기본 Arduinos와 같은 50 µs 이상의 많은 하단 엔드 CPU에서 비활성화됩니다. 결과적으로 IR 인터럽트 핸들러가 필요할 때 실행되는 것을 방지합니다. 이 비디오도 참조하십시오.
하나의 해결 방법 은 if (IrReceiver.isIdle()) { strip.show();}
로 NeoPixel 데이터를 보내기 전에 IR 수신기가 유휴 상태가 될 때까지 기다리는 것입니다.
이것은 최소한 실행중인 IR 전송을 중단 하고 Neopixel-의 업데이트 속도를 분해하는 것은 상당히 잘 작동 할 수 있습니다.
더 강력한 프로세서에 대한 다른 솔루션이 있습니다. Marc Merlin 의이 페이지를 참조하십시오.
다른 라이브러리는 IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
을 비활성화하는 경우 에만 작동/컴파일됩니다 . .
이것은 종종 타이머 리소스가 다른 라이브러리와 충돌하기 때문입니다. 아래를 참조하십시오.
이 라이브러리는 CPU 당 하나의 IR 수신기와 1 개의 IR Sender 객체 (IRRECV 및 IRSEND) 만 지원합니다.
그러나 전송은 일련의 작업이므로 setSendPin()
사용하여 PIN을 전환하여 전송 할 수 있으므로 여러 발신자를 모방 할 수 있습니다.
수신기는 특수 타이머 트리거 기능을 사용하여 50 µs마다 한 핀에서 디지털 IR 신호 값을 읽습니다.
따라서 여러 IR 수신기의 출력 핀을 함께 연결 하여만 여러 IR 수신기를 사용할 수 있습니다. IR 수신기 모듈은 내부적으로 NPN 트랜지스터를 VCC에 대한 30K 저항 단지 출력 장치로 사용합니다. 이것은 기본적으로 "오픈 컬렉터"이며 여러 출력 핀을 하나의 Arduino 입력 핀에 연결할 수 있습니다.
그러나 수신기 중 하나의 약한 / 방해 신호는 다른 수신기의 좋은 신호를 방해 할 것입니다.
IR 전력을 무료로 증가시키는 가장 좋은 방법은 2 또는 3 IR 다이오드를 직렬로 사용하는 것입니다. 하나의 다이오드는 20 MA에서 1.2V 또는 100 MA에서 1.5V가 필요하므로 5V 출력으로 최대 3 개의 다이오드를 공급할 수 있습니다.
1.2V 및 20 MA 및 5V 공급으로 2 개의 다이오드에 전원을 공급하려면 저항을 다음과 같이 설정하십시오 .
3 개의 다이오드 의 경우 1.4 v / 20 ma = 70 Ω가 필요합니다.
AVR 핀에서 손실 된 이후 실제 전류가 낮을 수 있습니다. 예를 들어 20 Ma에서 0.3V.
20 MA보다 더 많은 전류가 필요하지 않으면 외부 트랜지스터 (적어도 AVR 칩의 경우)를 사용할 필요가 없습니다.
Arduino Nanos에서는 항상 100 Ω 시리즈 저항과 1 개의 IR LED를 사용합니다.
수신의 경우, 최소 CPU 시계 주파수는 4MHz입니다 . 50 µs 타이머 ISR (인터럽트 서비스 루틴)은 16MHz Atmega에서 약 12 µs를 사용하기 때문입니다.
설문 조사가 필요하지 않은 Tinyreceiver는 1MHz로 실행됩니다.
전송을 위해 기본 소프트웨어 생성 PWM은 8MHz로 실행되는 AVR에 문제가 있습니다 . PWM 주파수는 38kHz 대신 약 30이며 RC6은 신뢰할 수 없습니다. #define SEND_PWM_BY_TIMER
로 타이머 pwm 생성으로 전환 할 수 있습니다.
Bang & Olufsen 프로토콜 디코더는 기본적으로 활성화되지 않습니다. 즉, #define DECODE_<XYZ>
에 의해 명시 적으로 프로토콜이 가능하지 않은 경우. #define DECODE_BEO
에 의해 항상 명시 적으로 활성화되어야합니다. IR 전송 주파수는 455 kHz 이므로 다른 수신기 하드웨어 (TSOP7000)가 필요하기 때문입니다.
455 kHz PWM 신호를 생성하는 것은 현재 SEND_PWM_BY_TIMER
에 대해서만 구현되므로 SEND_PWM_BY_TIMER
또는 USE_NO_SEND_PWM
정의 된 경우에만 송신합니다.
자세한 내용은 ir_bangolufsen.hpp를 참조하십시오.
예제는 파일> 예제> 예제에서 사용자 정의 라이브러리 / Irremote에서 사용할 수 있습니다.
Attiny85 및 Attiny88의 8K 플래시에 예제를 장착하려면이 CPU에 Arduino 라이브러리 Attinyserialout이 필요합니다.
Dronebot Workshop Simplereceiver 및 Simplesender도 참조하십시오.
단순한 예제 와 단순한 예제는 좋은 출발점입니다. 간단한 예는 Wokwi로 온라인으로 테스트 할 수 있습니다.
Simplereceiverforhashcodes 는 해시 디코더 만 사용합니다. 6 개 이상의 모든 IR 프레임을 32 비트 해시 코드로 변환하여 알려지지 않은 프로토콜을 수신 할 수 있습니다.
http://www.righto.com/2010/01/using-arbitrary-remotes-with-arduino.html을 참조하십시오
코드 크기 또는 타이머 사용이 중요한 경우이 예제를보십시오.
Tinyreceiver 예제는 NEC, Extended NEC, Onkyo 및 빠른 프로토콜 만받을 수 있지만 타이머는 필요하지 않은 Tinyirreceiver 라이브러리를 사용합니다. 플라이 디코딩에 핀 변경 인터럽트를 사용하는데, 이는 제한된 프로토콜 선택의 이유입니다.
Tinyreceiver는 Wokwi로 온라인으로 테스트 할 수 있습니다.
Tinysender 예제는 Tinyirsender 라이브러리를 사용하여 NEC, Onkyo 및 빠른 프로토콜 만 보낼 수 있습니다.
Simplesender 예제에서와 같이 8 비트 주소와 8 비트 명령으로 NEC 프로토콜 코드를 표준 형식으로 보냅니다. 확장 NEC, Onkyo 및 빠른 프로토콜을 사용하여 보낼 옵션이 있습니다. Simplesender에 비해 780 바이트 프로그램 메모리와 26 바이트 RAM을 저장하지만 동일하지만 Irremote 라이브러리를 사용하므로 훨씬 유연합니다).
프로토콜이 NEC가 아닌 경우 코드 크기가 중요하다면이 예를보십시오.
수신자는 모든 프로토콜을 수신하고 각 패킷에 수신 된 각 패킷에서 Arduino Tone () 함수로 경고음을 생성합니다 .
하나의 IR 버튼 (하나의 명령에 대한 여러 반복 수신)의 긴 누름이 감지됩니다.
AllProtocolsonlcd는 1602 LCD에 짧은 결과를 추가로 표시합니다 . LCD는 병렬 또는 직렬 (I2C)를 연결할 수 있습니다.
디버그 핀을 접지에 연결하면 각 프레임에 대한 원시 값의 인쇄를 강제 할 수 있습니다. 디버그 핀의 핀 번호는 보드 및 LCD 연결 유형에 따라 달라지기 때문에 설정 중에 인쇄됩니다.
이 예제는 또한 irremote와 tone ()을 함께 사용하는 방법 으로 사용됩니다.
모든 프로토콜을 수신하고 Pronto 형식을 포함하여 수신 된 신호를 다른 풍미로 덤프합니다. 인쇄에는 시간이 많이 걸리므로 반복 신호를 건너 뛰거나 알려지지 않은 것으로 해석 할 수 있습니다.
사용 가능한 모든 프로토콜을 적어도 한 번 보냅니다.
보내는 동안받는 것을 보여줍니다.
버튼 프레스에서 마지막으로 수신 된 IR 신호를 기록하고 재생하십시오 . 알려진 프로토콜의 IR 프레임은 적절한 프로토콜 인코더에 의해 전송됩니다. UNKNOWN
프로토콜 프레임은 원시 데이터로 저장되고 sendRaw()
로 전송됩니다.
Universal Distincewidth Decoder 로 각 IR 프레임을 디코딩하고 데이터를 저장하고 sendPulseDistanceWidthFromArray()
로 버튼 프레스에 보냅니다.
RAM이 2K 이하 인 경우, 디코더는 RAM 공간을 절약하기 위해 최대 2500 마이크로 초의 마크 또는 공간 지속 시간 만 허용되며, 그렇지 않으면 최대 10ms의 지속 시간을 허용합니다.
거리 너비 프로토콜에 대한 데이터를 저장하려면 17 바이트가 필요합니다. ReceiveAndsend 예제는 알려진 프로토콜 데이터에 대해 16 바이트와 EGNEC 프로토콜의 원시 데이터에 대해 37 바이트가 필요합니다.
IR 원격 매크로 확장기 역할을합니다. Samsung32 프로토콜을 수신하고 지정된 입력 프레임을 수신하면간에 적절한 지연이있는 여러 Samsung32 프레임을 보냅니다. 이것은 나의 오래된 삼성 H5273 TV의 Netflix-Key 에뮬레이션 역할을합니다.
다른 IR 코드에 대해 프로그램의 다른 기능을 호출하기 위한 프레임 워크.
리모컨으로 릴레이 (출력 핀에 연결)를 제어하십시오 .
IRREMOTE의 IRRECV 클래스를 사용하는 사용자 정의 클래스의 예제.
일련의 입력에 의해 제어되는 LG 에어컨 IR 코드를 보내는 예.
bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
함수 만 사용하면 다른 명령 소스에서 에어컨을 제어 할 수 있습니다.
ACLG.H 파일에는 LG 에어컨 IR 프로토콜의 명령 문서가 포함되어 있습니다. LG AKB73315611 리모컨의 리버스 엔지니어링을 기반으로합니다.
ireceivertiminganalysis는 개별 IR 코드를 지정하기 위해 시뮬레이션을 실행 중에 수신기를 클릭하면서 온라인으로 테스트 할 수 있습니다.
AEG / Elektrolux Hob2hood 프로토콜 수신 및 전송 예.
이 예제는 IR 수신기 모듈에 의해 전달 된 신호를 분석합니다. 값은 수신 신호의 안정성과 프로토콜을 결정하기위한 힌트를 결정하는 데 사용될 수 있습니다.
또한 IR 수신기 모듈에 의해 도입 된 Mark (Pulse) 지속 시간의 확장 인 MARK_EXCESS_MICROS
값을 계산합니다.
Wokwi로 온라인으로 테스트 할 수 있습니다. 시뮬레이션이 실행되는 동안 수신기를 클릭하여 개별 NEC IR 코드를 지정하십시오.
하나의 프로그램에서 수신 된 Emo + senddemo. 보내는 동안받는 것을 보여줍니다. 여기에는 IR 다이오드 입력 (노란색)에서 수신기 출력 (파란색)의 지연이 표시됩니다.
간단한 수신기
IR Key 5의 간단한 토글
Tinyreceiver
채권 분석
LCD 출력 및 스위치 명령문이있는 수신기
Arduino pwmmotorcontrol 라이브러리 의이 예는 Irremote 라이브러리를 사용하여 로봇 자동차의 기본 기능을 제어합니다.
각 채널에서 2 개의 PWM 모터 채널, 2 개의 모터를 제어합니다.
여기에서 자동차 조립 및 코드에 대한 지침을 찾을 수 있습니다.
TL1838 IR 수신기가있는 ir_robotcar가 확장 보드에 연결되었습니다.
예제 중 일부를 먼저 테스트하지 않고 문제를 열지 마십시오!
문제가있는 경우이 문제를 보여주는 MCVE (최소 완전한 검증 가능한 예)를 게시하십시오. 내 경험은 대부분의 시간 이이 맥브를 만들면서 문제를 찾을 수 있다는 것입니다.
코드 블록을 사용하십시오. 코드를 읽을 수있을 때 도움이됩니다!
라이브러리를 다른 요구 사항으로 사용자 정의하기 위해 컴파일 옵션 / 매크로가 있습니다.
이 매크로는 #include <IRremote.hpp>
를 발효하기 전에 프로그램에서 정의되어야합니다.
이를 활성화 / 비활성화하여 수정하거나 적용 가능한 경우 값을 변경하십시오.
이름 | 기본값 | 설명 |
---|---|---|
RAW_BUFFER_LENGTH | 200 | 원시 입력의 버퍼 크기 UINT16_T 버퍼. 짝수 야! 너무 작 으면 오버 플로우 플래그가 설정됩니다. 100은 최대 48 비트의 일반 프로토콜에 충분하지만 대부분의 에어컨 프로토콜에는 최대 750의 값이 필요합니다. 수신자 예제를 사용하여 요구 사항에 대해 가장 작은 값을 찾으십시오. 200의 값에는 200 바이트 RAM이 필요합니다. |
EXCLUDE_UNIVERSAL_PROTOCOLS | 장애가 있는 | decode() 의 펄스 거리 폭 최대 1000 바이트 프로그램 메모리를 저장합니다. |
DECODE_<Protocol name> | 모두 | 디코딩 될 개별 프로토콜의 선택. 여러 프로토콜을 지정할 수 있습니다. 여기를 참조하세요 |
DECODE_STRICT_CHECKS | 장애가 있는 | 우주 길이가 비트 값을 결정하는 일정한 마크 프로토콜에 대한 마크 길이와 같은 프로토콜 타이밍의 추가 필요한 특성을 확인하십시오. 최대 194 바이트의 프로그램 메모리가 필요합니다. |
IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK | 장애가 있는 | 최대 60 바이트의 프로그램 메모리와 2 바이트 RAM을 저장합니다. |
MARK_EXCESS_MICROS | 20 | Mark_excess_micros는 모든 마크에서 빼고 디코딩하기 전에 모든 공간에 추가되어 다른 IR 수신기 모듈의 신호 형성을 보상합니다. |
RECORD_GAP_MICROS | 5000 | 프로토콜의 끝을 감지하기 위해 IR 전송 사이의 최소 간격. 4500 µs의 NEC 헤더 공간 예를 들어 프로토콜의 공간보다 커야합니다. 명령과 반복 사이의 간격보다 작아야합니다. 예를 들어 소니의 재전송 간격은 약 24ms입니다. 이것은 수신 된 명령의 끝과 디코딩 시작 사이의 지연이라는 것을 명심하십시오. |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | RAM <= 2K 인 경우 50 | 200의 값을 사용하면 최대 10ms의 마크 또는 공간 지속 시간을 디코딩 할 수 있습니다. |
IR_INPUT_IS_ACTIVE_HIGH | 장애가 있는 | 활성 높은 출력 신호가있는 RF 수신기를 사용하는 경우 활성화하십시오. |
IR_SEND_PIN | 장애가 있는 | 지정된 경우 프로그램 크기를 줄이고 AVR의 전송 타이밍을 향상시킵니다. 변수를 사용하여 setSendPin(uint8_t aSendPinNumber) 으로 보내기 핀을 지정하려면 소스 에서이 매크로를 사용 / 비활성화해서는 안됩니다. |
SEND_PWM_BY_TIMER | 장애가 있는 | 소프트웨어에서 캐리어 PWM 생성을 비활성화하고 하드웨어 PWM (타이머 별)을 사용합니다. 보다 정확한 PWM 생성, 특히 의무 CYC의 이점이 있습니다.
확장하다
관련 애플리케이션
추천
관련 정보
전체
|