ห้องสมุดที่ช่วยให้สามารถส่งและรับสัญญาณอินฟราเรดได้
มีจำหน่ายในรูปแบบไลบรารี Arduino "IRremote"
- Google แปลภาษา
โปรโตคอล IR ที่รองรับ
คุณสมบัติ
คุณสมบัติใหม่พร้อมเวอร์ชัน 4.x
คุณสมบัติใหม่พร้อมเวอร์ชัน 3.x
การแปลงโปรแกรม 2.x ของคุณเป็นเวอร์ชัน 4.x
วิธีแปลงรหัสข้อมูล IR 32 บิตแรก MSB เก่าเป็นรหัสข้อมูล IR 32 บิตแรก LSB ใหม่
ข้อผิดพลาดในการใช้เวอร์ชัน 3.x สำหรับบทช่วยสอนแบบเก่า
อยู่ที่ 2.x
ทำไมต้อง *.hpp แทนที่จะเป็น *.cpp
การใช้ไฟล์ *.hpp ใหม่
บทช่วยสอน
3 วิธีในการระบุรหัส IR
ขาออกของตัวรับ IRReceiver
การรับรหัส IR
ข้อสงวนสิทธิ์
ไลบรารีอื่นๆ ซึ่งอาจครอบคลุมโปรโตคอลเหล่านี้
โปรโตคอล=PULSE_DISTANCE
โปรโตคอล=ไม่ทราบ
วิธีจัดการกับโปรโตคอลที่ IRremote ไม่รองรับ
โครงสร้างถอดรหัส IRData
โปรโตคอลที่ไม่ชัดเจน
การใช้ RAM ของโปรโตคอลที่แตกต่างกัน
การจัดการโปรโตคอลที่ไม่รู้จัก
การส่งรหัส IR
รายชื่อฐานข้อมูลรหัส IR สาธารณะ
การส่งรหัส IRDB IR
ส่งพิน
ตัวรับและผู้ส่ง NEC ขนาดเล็ก
โปรโตคอล FAST
คำถามที่พบบ่อยและคำแนะนำ
การรับหยุดหลังจาก analogWrite() หรือ tone() หรือหลังจากการรันมอเตอร์
การรับชุดธงล้น
ปัญหากับ Neopixels, FastLed ฯลฯ
ใช้งานไม่ได้/คอมไพล์กับไลบรารีอื่น
อินสแตนซ์ตัวรับและผู้ส่ง IR หลายตัว
เพิ่มความแรงของสัญญาณเอาท์พุตที่ส่ง
ความถี่สัญญาณนาฬิกา CPU ขั้นต่ำ
โปรโตคอลของ Bang & Olufsen
ตัวอย่างสำหรับห้องสมุดนี้
ตัวอย่างออนไลน์ของ WOKWI
การควบคุม IR ของรถหุ่นยนต์
ประเด็นและการอภิปราย
รวบรวมตัวเลือก / มาโครสำหรับไลบรารีนี้
การเปลี่ยนไฟล์รวม (*.h) ด้วย Arduino IDE
การแก้ไขตัวเลือกการคอมไพล์ด้วย Sloeber IDE
บอร์ดที่รองรับ
การใช้งานตัวจับเวลาและพิน
ความเข้ากันไม่ได้กับไลบรารีอื่นๆ และคำสั่ง Arduino เช่น tone() และ analogWrite()
การสร้างสัญญาณฮาร์ดแวร์-PWM สำหรับการส่ง
เหตุใดเราจึงใช้รอบการทำงาน 30% ในการส่ง
เราถอดรหัสสัญญาณอย่างไร
แผนภาพการเข้ารหัส NEC
การเปรียบเทียบอย่างรวดเร็วของไลบรารีรับ Arduino IR 5 ตัว
ประวัติศาสตร์
ลิงค์ที่มีประโยชน์
ผู้ร่วมให้ข้อมูล
ใบอนุญาต
ลิขสิทธิ์
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 เป็น 64 บิตสำหรับแพลตฟอร์ม 32 บิต ดังนั้น decodedIRData.decodedRawData
จึงสามารถมีข้อมูลเฟรมที่สมบูรณ์สำหรับโปรโตคอลได้มากขึ้นกว่าแบบ 32 บิตเหมือนเมื่อก่อน
โทรกลับ หลังจากได้รับคำสั่ง - มันจะเรียกรหัสของคุณทันทีที่ได้รับข้อความ
ปรับปรุงการจัดการโปรโตคอล PULSE_DISTANCE
+ PULSE_WIDTH
โปรโตคอล FAST ใหม่
พิมพ์ ฟังก์ชัน send ที่สอดคล้องกัน โดยอัตโนมัติด้วย 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
รองรับ แพลตฟอร์มเพิ่มเติม
ช่วยให้การสร้างสัญญาณที่ไม่ใช่ PWM เพียง จำลองสัญญาณตัวรับสัญญาณที่ใช้งานน้อย สำหรับการเชื่อมต่อโดยตรงกับอุปกรณ์รับสัญญาณที่มีอยู่โดยไม่ต้องใช้ IR
การกำหนดค่าโปรโตคอลที่ง่ายดาย โดยตรงในซอร์สโค้ดของคุณ
ลดพื้นที่หน่วยความจำและลดเวลาในการถอดรหัส
มีตัวถอดรหัส NEC เท่านั้นขนาดเล็กมาก ซึ่ง ไม่ต้องการทรัพยากรตัวจับเวลาใดๆ
-> การเปรียบเทียบคุณสมบัติของไลบรารี Arduino IR 5 ไลบรารี
ตั้งแต่เวอร์ชัน 3.1 เป็นต้นไป การสร้าง PWM สำหรับการส่งจะดำเนินการโดยซอฟต์แวร์ ซึ่งจะช่วยประหยัดเวลาของฮาร์ดแวร์และ เปิดใช้งานพินเอาท์พุตที่กำหนดเองสำหรับการส่ง
หากคุณใช้แกน Arduino (เก่า) ที่ไม่ได้ใช้แฟล็ก -flto
ในการคอมไพล์ คุณสามารถเปิดใช้งานบรรทัด #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
ใน IRRemote.h หากคุณได้รับข้อความแสดงข้อผิดพลาดเท็จเกี่ยวกับ start() ระหว่างการคอมไพล์
มีการเพิ่มออบเจ็กต์ IRreceiver และ IRsender แล้วและสามารถใช้งานได้โดยไม่ต้องกำหนด เช่นเดียวกับ Arduino Serial object ที่รู้จักกันดี
เพียงลบบรรทัด IRrecv IrReceiver(IR_RECEIVE_PIN);
และ/หรือ IRsend IrSender;
ในโปรแกรมของคุณ และแทนที่ IRrecv.
ทั้งหมด หรือ irrecv.
ด้วย IrReceiver
และแทนที่ IRsend
ทั้งหมดหรือ irsend
ด้วย IrSender
เนื่องจากค่าที่ถอดรหัสแล้วตอนนี้อยู่ใน IrReceiver.decodedIRData
และไม่ได้อยู่ใน results
อีกต่อไป ให้ลบบรรทัด decode_results results
หรือที่คล้ายกัน
เช่นเดียวกับวัตถุอนุกรม ให้เรียก IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)
หรือ IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)
แทน IrReceiver.enableIRIn()
หรือ irrecv.enableIRIn()
ใน setup()
หากต้องการส่ง ให้โทร 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
Overflow, Repeat และแฟล็กอื่นๆ อยู่ใน IrReceiver.receivedIRData.flags
แล้ว
ไม่ค่อยได้ใช้: results.rawbuf
และ results.rawlen
ต้องถูกแทนที่ด้วย IrReceiver.decodedIRData.rawDataPtr->rawbuf
และ IrReceiver.decodedIRData.rawDataPtr->rawlen
5 โปรโตคอล NEC, Panasonic, Sony, Samsung และ JVC ได้ถูกแปลงเป็น LSB ก่อน ฟังก์ชั่น Send สำหรับการส่งข้อมูล MSB เก่าถูกเปลี่ยนชื่อเป็น sendNECMSB
, sendSamsungMSB()
, sendSonyMSB()
และ sendJVCMSB()
ฟังก์ชัน sendSAMSUNG()
และ sendSony()
MSB แบบเก่ายังคงใช้งานได้ ฟังก์ชัน sendPanasonic()
เวอร์ชัน MSB เก่าถูกลบออก เนื่องจากมีจุดบกพร่องที่ไม่มีใครรู้จัก ดังนั้นจึงถือว่าไม่เคยใช้งาน
สำหรับการแปลงรหัส MSB เป็น LSB ดูด้านล่าง
#include <IRremote.h>#define RECV_PIN 2IRrecv irrecv(RECV_PIN); ผลลัพธ์ decode_results การตั้งค่าเป็นโมฆะ () - - อนุกรม.เริ่มต้น(115200); // สร้างการสื่อสารแบบอนุกรม irrecv.enableIRIn(); // เริ่มตัวรับ}void loop() { if (irrecv.decode(&results)) { Serial.println(ผลลัพธ์.ค่า, HEX); - irrecv.เรซูเม่(); // รับค่าถัดไป - - -
#include <IRremote.hpp>#define IR_RECEIVE_PIN 2 การตั้งค่าเป็นโมฆะ() - - อนุกรม.เริ่มต้น(115200); // // สร้างการสื่อสารแบบอนุกรม IrReceiver.begin (IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // เริ่มตัวรับ}void loop() { if (IrReceiver.decode()) { Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // พิมพ์ข้อมูลดิบ "เก่า" IrReceiver.printIRResultShort(&อนุกรม); // พิมพ์ข้อมูลที่ได้รับครบถ้วนในหนึ่งบรรทัด IrReceiver.printIRSendUsage(&อนุกรม); // พิมพ์คำสั่งที่จำเป็นในการส่งข้อมูลนี้ - IrReceiver.resume(); // เปิดใช้งานการรับค่าถัดไป - - -
สำหรับตัวถอดรหัสใหม่สำหรับ NEC, Panasonic, Sony, Samsung และ JVC ผลลัพธ์ IrReceiver.decodedIRData.decodedRawData
อยู่ในขณะนี้ LSB-first ตามที่คำจำกัดความของโปรโตคอลเหล่านี้แนะนำ!
หากต้องการแปลงหนึ่งเป็นอีกตำแหน่งหนึ่ง คุณต้องกลับตำแหน่งไบต์/แทะ จากนั้นกลับตำแหน่งบิตทั้งหมดของแต่ละไบต์/แทะ หรือเขียนเป็นสตริงไบนารี่เดียวแล้วย้อนกลับ/มิเรอร์
ตัวอย่าง: 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.h
แทนที่จะเป็น IRremote.hpp
เพียงลองย้อนกลับไปเป็นเวอร์ชัน 2.4.0
เป็นไปได้มากว่าโค้ดของคุณจะทำงานและคุณจะไม่พลาดคุณสมบัติใหม่
พิจารณาใช้แบบฟอร์มการเปิดตัว 2.4 ดั้งเดิมปี 2017 หรือเวอร์ชัน 2.8 ที่เข้ากันได้แบบย้อนหลังล่าสุดสำหรับโปรเจ็กต์ของคุณ
มันอาจจะเพียงพอและจัดการกับรหัส IR 32 บิตได้อย่างไร้ที่ติ
หากสิ่งนี้ไม่เหมาะกับกรณีของคุณ มั่นใจได้ว่าอย่างน้อย 4.x ก็พยายามเข้ากันได้กับรุ่นก่อนหน้า ดังนั้นตัวอย่างเก่าของคุณควรยังคงทำงานได้ดี
มีเฉพาะตัวถอดรหัสต่อไปนี้เท่านั้น:
NEC
Denon
Panasonic
JVC
LG
RC5
RC6
Samsung
Sony
การเรียก irrecv.decode(&results)
ใช้ตัวถอดรหัสตัวแรกของ MSB แบบเก่าเช่นใน 2.x และตั้งค่าโค้ด 32 บิตใน results.value
ไม่มีการถอดรหัสไปยังที่อยู่ 8/16 บิตที่มีความหมายมากขึ้น (คงที่) และคำสั่ง 8 บิต
ไฟล์ *.cpp ทุกไฟล์จะถูกคอมไพล์แยกกัน โดยการเรียกคอมไพเลอร์สำหรับไฟล์ cpp นี้โดยเฉพาะ การโทรเหล่านี้ได้รับการจัดการโดยระบบ IDE / make ใน Arduino IDE การโทรจะดำเนินการเมื่อคุณคลิกที่ Verify หรือ Upload
และตอนนี้ปัญหาของเรากับ Arduino คือ:
วิธีการตั้งค่าตัวเลือกการคอมไพล์สำหรับไฟล์ *.cpp ทั้งหมด โดยเฉพาะอย่างยิ่งสำหรับไลบรารีที่ใช้
IDE เช่น Sloeber หรือ PlatformIO สนับสนุนสิ่งนี้โดยอนุญาตให้ระบุชุดตัวเลือกต่อโครงการ พวกเขาเพิ่มตัวเลือกเหล่านี้ในการเรียกคอมไพเลอร์แต่ละครั้ง เช่น -DTRACE
แต่ Arduino ขาดคุณสมบัตินี้ ดังนั้น วิธีแก้ปัญหา จึงไม่ใช่การรวบรวมแหล่งข้อมูลทั้งหมดแยกจากกัน แต่ต้องเชื่อมแหล่งข้อมูลเหล่านั้นเข้ากับไฟล์ต้นฉบับขนาดใหญ่ไฟล์เดียวโดยรวมไว้ในแหล่งที่มาของคุณ
ซึ่งทำได้โดยเช่น #include "IRremote.hpp"
แต่ทำไมไม่ #include "IRremote.cpp"
ล่ะ
ลองใช้งานแล้วคุณจะเห็นข้อผิดพลาดมากมาย เนื่องจากแต่ละฟังก์ชันของไฟล์ *.cpp ได้รับการคอมไพล์สองครั้ง ครั้งแรกโดยการคอมไพล์ไฟล์ขนาดใหญ่ และครั้งที่สองโดยการคอมไพล์ไฟล์ *.cpp แยกกัน ดังที่อธิบายไว้ข้างต้น
ดังนั้นการใช้ส่วนขยาย cpp จึงเป็นไปไม่ได้อีกต่อไป และวิธีแก้ไขวิธีหนึ่งคือใช้ hpp เป็นส่วนขยาย เพื่อแสดงว่าเป็นไฟล์ *.cpp ที่รวมอยู่ด้วย
ส่วนขยายอื่น ๆ ทั้งหมดเช่น cinclude จะทำ แต่ hpp ดูเหมือนจะเป็นสามัญสำนึก
เพื่อที่จะสนับสนุนตัวเลือกการคอมไพล์ได้ง่ายขึ้น คุณต้องใช้คำสั่ง #include <IRremote.hpp>
แทน #include <IRremote.h>
ในโปรแกรมหลักของคุณ (หรือที่เรียกว่าไฟล์ *.ino พร้อมด้วย setup() และ loop())
ใน ไฟล์อื่นๆ ทั้งหมด คุณต้องใช้สิ่งต่อไปนี้ เพื่อ ป้องกันข้อผิดพลาดของตัวเชื่อมโยง 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
การแนะนำอย่างละเอียดเกี่ยวกับรีโมท IR และไลบรารี IRremote จาก DroneBot Workshop
มี 3 วิธีในการระบุรหัส IR โดยเฉพาะ
กำหนดเวลาของแต่ละเครื่องหมาย/พัลส์ และช่องว่าง/ระยะทาง_ระหว่าง_พัลส์จะถูกระบุไว้ในรายการหรืออาร์เรย์ ซึ่งจะช่วยให้สามารถระบุ รหัส IR ทั้งหมด ได้ แต่ต้องใช้หน่วยความจำจำนวนมากและ ไม่สามารถอ่านได้เลย คำจำกัดความอย่างเป็นทางการประการหนึ่งของไทม์มิ่งอาเรย์ รวมถึง ข้อกำหนดความถี่และการทำซ้ำ คือรูปแบบ Pronto
หน่วยความจำสามารถบันทึกได้โดยใช้ความละเอียดเวลาที่น้อยลง สำหรับ IRremote คุณสามารถใช้ความละเอียด 50 µs ซึ่งลดความต้องการหน่วยความจำลงครึ่งหนึ่งโดยใช้ค่าไบต์แทนค่า int16 เพื่อวัตถุประสงค์ในการรับ คุณสามารถใช้ แฮชของเวลา ที่ได้รับจากตัวถอดรหัส decodeHash()
มีรูปแบบการเข้ารหัสหลัก 3 รูปแบบซึ่งเข้ารหัสไบนารีบิตสตรีม / ค่าฐานสิบหก:
PULSE_DISTANCE
ระยะห่างระหว่างพัลส์จะกำหนดค่าบิต สิ่งนี้ต้องหยุดสักหน่อยเสมอ! ตัวอย่างคือโปรโตคอล NEC และ KASEIKYO ความกว้างพัลส์คงที่สำหรับโปรโตคอลส่วนใหญ่
PULSE_WIDTH
ความกว้างของพัลส์จะกำหนดค่าบิต ระยะพัลส์คงที่ สิ่งนี้ไม่จำเป็นต้องหยุดสักหน่อย! ตัวอย่างเดียวที่ทราบคือโปรโตคอล SONY
การเข้ารหัสเฟส / แมนเชสเตอร์ เวลาของการเปลี่ยนพัลส์/หยุดชั่วคราว (เฟส) ที่สัมพันธ์กับนาฬิกาจะกำหนดค่าบิต ตัวอย่างคือโปรโตคอล RC5 และ RC6
การเข้ารหัสเฟสมี ความยาวบิตคงที่ PULSE_DISTANCE
โดยมีความกว้างพัลส์คงที่ และ PULSE_WIDTH
ไม่มีความยาวบิตคงที่ !
ตัวอย่างที่รู้จักกันดีสำหรับ PULSE_DISTANCE
ที่มีการเข้ารหัสความกว้างพัลส์ไม่คงที่คือ การเข้ารหัสอนุกรม RS232 ในที่นี้ความกว้างพัลส์ที่ไม่คงที่จะใช้เพื่อให้มี ความยาวบิตคงที่
สัญญาณ IR ส่วนใหญ่มี ส่วนหัวพิเศษ เพื่อช่วยในการตั้งค่าอัตราขยายอัตโนมัติของวงจรตัวรับ ส่วนหัวนี้ไม่ได้เป็นส่วนหนึ่งของการเข้ารหัส แต่มักมีความสำคัญสำหรับโปรโตคอลพิเศษ ดังนั้นจึงต้องทำซ้ำได้
โปรดทราบว่ามีรหัสที่ใช้การเข้ารหัส PULSE_DISTANCE
โดยที่มากกว่าไบนารี 0/1 ถูกใส่เข้าไปในชุดค่าผสมของพัลส์/หยุดชั่วคราว ซึ่งต้องใช้การผสมผสานระหว่างพัลส์หรือความยาวหยุดชั่วคราวมากกว่า 2 แบบ โปรโตคอล HobToHood ใช้การเข้ารหัสดังกล่าว
การใช้รูปแบบการเข้ารหัสจะลดข้อกำหนดของโค้ด IR ให้เป็นค่า bitstream / hex ซึ่งเป็น LSB ตามค่าเริ่มต้นและการกำหนดเวลาพัลส์ / หยุดชั่วคราวของส่วนหัว 0 และ 1 ค่าฐานสิบหก สามารถอ่านได้ค่อนข้างมาก โครงร่างเหล่านี้ไม่สามารถใส่ความหมายใดๆ เช่น ที่อยู่ คำสั่ง หรือเช็คซัมบนบิตสตรีมนี้ได้
มีโปรโตคอลทั่วไปบางประการที่นำไปใช้โดยตรงใน IRremote โดยจะระบุความถี่ การกำหนดเวลาของส่วนหัว 0 และ 1 รวมถึงค่าอื่นๆ เช่น การตรวจสอบ ระยะทางการทำซ้ำ การเข้ารหัสซ้ำ การสลับบิต เป็นต้น นอกจากนี้ ยังระบุความหมายของค่าฐานสิบหกด้วย ซึ่งอนุญาตให้ใช้ ที่อยู่ พารามิเตอร์เพียง 2 ตัวเท่านั้น และ คำสั่ง ให้ระบุรหัส IR ซึ่งช่วยประหยัดหน่วยความจำและ สามารถอ่านได้สูง บ่อยครั้งที่ที่อยู่นั้นคงที่เช่นกัน ซึ่งจะลดความต้องการหน่วยความจำลงอีก
บทช่วยสอนเซ็นเซอร์ IR ของ Adafruit
ในโปรแกรมของคุณ คุณจะตรวจสอบ กรอบ IR ที่ได้รับอย่างสมบูรณ์ ด้วย:
if (IrReceiver.decode()) {}
นอกจากนี้ยังถอดรหัสข้อมูลที่ได้รับด้วย
หลังจากการถอดรหัสสำเร็จ ข้อมูล IR จะอยู่ในโครงสร้าง IRData ซึ่งพร้อมใช้งานเป็น IrReceiver.decodedIRData
struct IRData { โปรโตคอล decode_type_t; // UNKNOWN, NEC, SONY, RC5, PULSE_DISTANCE, ... ที่อยู่ uint16_t; // คำสั่งที่อยู่ถอดรหัส uint16_t; // คำสั่งถอดรหัส uint16_t พิเศษ; // ใช้สำหรับ ID ผู้ขายที่ไม่รู้จัก Kaseikyo เครื่องหมายที่ใช้สำหรับการถอดรหัสโปรโตคอลระยะทาง uint16_t จำนวน Bits; // จำนวนบิตที่ได้รับสำหรับข้อมูล (ที่อยู่ + คำสั่ง + พาริตี) - เพื่อกำหนดความยาวของโปรโตคอลหากมีความยาวต่างกันได้ ธง uint8_t; // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW ฯลฯ ดูคำจำกัดความของ IRDATA_FLAGS_* IRRawDataType ถอดรหัสRawData; // สูงสุด 32 บิต (64 บิตสำหรับสถาปัตยกรรม CPU 32 บิต) บิตถอดรหัสข้อมูลดิบ ใช้สำหรับฟังก์ชัน sendRaw uint32_t ถอดรหัสRawDataArray [RAW_DATA_ARRAY_SIZE]; // ข้อมูลดิบที่ถอดรหัสแบบ 32 บิต เพื่อใช้สำหรับฟังก์ชันส่ง irparams_struct *rawDataPtr; // ตัวชี้ข้อมูลเวลาดิบที่จะถอดรหัส บัฟเฟอร์ข้อมูลส่วนใหญ่เต็มไปด้วยการรับ ISR};
นี่คือรายการธงที่มีอยู่ในฟิลด์ธง
ตรวจสอบด้วยเช่น if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
ชื่อธง | คำอธิบาย |
---|---|
IRDATA_FLAGS_IS_REPEAT | ช่องว่างระหว่างเฟรมก่อนหน้านั้นเล็กกว่าช่องว่างสูงสุดที่คาดไว้สำหรับการทำซ้ำ !!!เราไม่ตรวจสอบคำสั่งหรือที่อยู่ที่ถูกเปลี่ยน เพราะแทบจะเป็นไปไม่ได้เลยที่จะกดปุ่มต่างๆ บนรีโมท 2 ปุ่มภายในเวลาประมาณ 100 ms!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | เฟรมทำซ้ำปัจจุบันคือการทำซ้ำ ซึ่งจะถูกส่งหลังจากเฟรมปกติเสมอ และไม่สามารถหลีกเลี่ยงได้ ระบุไว้สำหรับโปรโตคอล DENON และ LEGO เท่านั้น |
IRDATA_FLAGS_PARITY_FAILED | เฟรมปัจจุบัน (ทำซ้ำอัตโนมัติ) ละเมิดการตรวจสอบพาริตี |
IRDATA_FLAGS_TOGGLE_BIT | ถูกตั้งค่าหากตั้งค่าบิตสลับ RC5 หรือ RC6 |
IRDATA_FLAGS_EXTRA_INFO | มีข้อมูลเพิ่มเติมที่ไม่มีอยู่ในที่อยู่และข้อมูล (เช่น ID ผู้จำหน่ายที่ไม่รู้จัก Kaseikyo หรือใน 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(&อนุกรม);
IrReceiver.printIRResultRawFormatted(&ซีเรียล จริง);`
ข้อมูลดิบขึ้นอยู่กับสถานะภายในของตัวจับเวลา Arduino ที่สัมพันธ์กับสัญญาณที่ได้รับ ดังนั้นจึงอาจแตกต่างกันเล็กน้อยในแต่ละครั้ง (ปัญหาการแก้ปัญหา) ค่าที่ถอดรหัสเป็นค่าที่ตีความซึ่งสามารถทนต่อความแตกต่างเล็กน้อยดังกล่าวได้!
IrReceiver.printIRSendUsage(&อนุกรม);
โปรโตคอล NEC ถูกกำหนดให้เป็นที่อยู่ 8 บิตและคำสั่ง 8 บิต แต่ที่อยู่ทางกายภาพและฟิลด์ข้อมูลแต่ละฟิลด์มีความกว้าง 16 บิต บิตเพิ่มเติม 8 บิตใช้เพื่อส่งที่อยู่กลับด้านหรือคำสั่งสำหรับการตรวจสอบความเท่าเทียมกัน
โปรโตคอล NEC แบบขยาย ใช้ที่อยู่ 8 พาริตีบิตเพิ่มเติมสำหรับที่อยู่ 16 บิต ดังนั้นจึงปิดใช้งานการตรวจสอบพาริตีสำหรับที่อยู่
โปรโตคอล ONKYO จะใช้ที่อยู่และคำสั่งเพิ่มเติม 8 พาริตีบิตสำหรับที่อยู่และคำสั่ง 16 บิต
ตัวถอดรหัสจะลดค่า 16 บิตเป็น 8 บิตหากความเท่าเทียมกันถูกต้อง หากพาริตีไม่ถูกต้อง จะถือว่าไม่มีข้อผิดพลาดของพาริตี แต่รับค่าเป็นค่า 16 บิตโดยไม่มีพาริตี โดยถือว่า NEC แบบขยายหรือโปรโตคอลโปรโตคอล NEC แบบขยาย
แต่ตอนนี้เรามีปัญหาเมื่อเราต้องการรับ เช่น ที่อยู่ 16 บิต 0x00FF หรือ 0x32CD! ตัวถอดรหัสตีความสิ่งนี้ว่าเป็นที่อยู่ NEC 8 บิต 0x00 / 0x32 พร้อมพาริตีที่ถูกต้องของ 0xFF / 0xCD และลดเป็น 0x00 / 0x32
วิธีหนึ่งในการจัดการสิ่งนี้คือการบังคับให้ไลบรารีใช้การตีความโปรโตคอล ONKYO เสมอ โดยใช้ #define DECODE_ONKYO
อีกวิธีหนึ่งคือการตรวจสอบว่า IrReceiver.decodedIRData.protocol
เป็น NEC ไม่ใช่ ONKYO และเพื่อคืนค่าการลดความเท่าเทียมกันด้วยตนเอง
เมื่อกดแบบยาว โปรโตคอล NEC จะไม่ทำซ้ำเฟรม แต่จะส่งเฟรมทำซ้ำแบบสั้นพิเศษ ช่วยให้แยกความแตกต่างระหว่างการกดแบบยาวและการกดซ้ำๆ ได้อย่างง่ายดาย และช่วยประหยัดพลังงานแบตเตอรี่เล็กน้อย ลักษณะการทำงานนี้ค่อนข้างเป็นเอกลักษณ์สำหรับ NEC และโปรโตคอลที่ได้รับ เช่น LG และ Samsung
แต่แน่นอนว่ายังมีระบบควบคุมระยะไกลที่ใช้โปรโตคอล NEC แต่จะทำซ้ำเฟรมแรกเมื่อกดแบบยาวแทนการส่งเฟรมทำซ้ำแบบสั้นพิเศษ เราตั้งชื่อสิ่งนี้ว่าโปรโตคอล NEC2 และมันถูกส่งไปพร้อมกับ sendNEC2()
แต่ระวัง โปรโตคอล NEC2 สามารถตรวจพบได้โดยตัวถอดรหัสไลบรารี NEC หลังจาก เฟรมแรกเท่านั้น และหากคุณกดแบบยาว!
เมื่อกดแบบยาว โปรโตคอล SamsungLG จะไม่ทำซ้ำเฟรม แต่จะส่งเฟรมซ้ำแบบสั้นพิเศษ
RAW_BUFFER_LENGTH
กำหนดความยาวของ บัฟเฟอร์ไบต์ ที่เก็บข้อมูลเวลา IR ที่ได้รับไว้ก่อนที่จะถอดรหัส
100 เพียงพอสำหรับโปรโตคอลมาตรฐาน สูงสุด 48 บิต โดย 1 บิตประกอบด้วยหนึ่งเครื่องหมายและช่องว่าง เราต้องการเพิ่มอีก 4 ไบต์เสมอ 1 ไบต์สำหรับช่องว่างเริ่มต้น 2 ไบต์สำหรับส่วนหัวและ 1 ไบต์สำหรับบิตหยุด
โปรโตคอล 48 บิต ได้แก่ PANASONIC, KASEIKYO, SAMSUNG48, RC6
โปรโตคอล 32 บิต เช่น NEC, SAMSUNG, WHYNTER, SONY(20), LG(28) ต้องการ ความยาวบัฟเฟอร์ 68
โปรโตคอล 16 บิต เช่น BOSEWAVE, DENON, FAST, JVC, LEGO_PF, RC5, SONY(12 หรือ 15) ต้องการ ความยาวบัฟเฟอร์ 36
MAGIQUEST ต้องการความยาวบัฟเฟอร์ 112
เครื่องปรับอากาศมักจะส่งข้อมูลโปรโตคอลที่ยาว ขึ้นถึง 750 บิต
หากช่องว่างการบันทึกที่กำหนดโดย RECORD_GAP_MICROS
เปลี่ยนจากค่าเริ่มต้น 8 ms เป็นมากกว่า 20 ms บัฟเฟอร์จะไม่ใช่บัฟเฟอร์อีกต่อไป แต่เป็นบัฟเฟอร์ uint16_t ซึ่งต้องใช้ RAM มากกว่าสองเท่า
ไลบรารีนี้ได้รับการออกแบบเพื่อให้พอดีกับ MCU ที่มีทรัพยากรค่อนข้างต่ำ และมีวัตถุประสงค์เพื่อทำงานเป็นไลบรารีร่วมกับแอปพลิเคชันอื่นๆ ซึ่งต้องใช้ทรัพยากรบางอย่างของ MCU เพื่อดำเนินการด้วย
ใช้ ตัวอย่าง ReceiverDemo เพื่อพิมพ์ข้อมูลทั้งหมดเกี่ยวกับโปรโตคอล IR ของคุณ
ตัวอย่างReceiveDump ให้ข้อมูลเพิ่มเติมแก่คุณแต่มีการตรวจจับซ้ำที่ไม่ถูกต้องเนื่องจากต้องใช้เวลาในการพิมพ์ข้อมูล
หากไลบรารีนี้ดูเหมือนจะไม่รองรับโปรโตคอลของคุณ คุณอาจลองใช้ไลบรารี IRMP ซึ่งรองรับโปรโตคอลแมนเชสเตอร์ได้ดีกว่ามากโดยเฉพาะ
สำหรับ เครื่องปรับอากาศ คุณอาจลองใช้ไลบรารี IRremoteESP8266 ซึ่งรองรับชุดโปรโตคอลที่น่าประทับใจและเครื่องปรับอากาศจำนวนมาก และใช้งานได้กับ ESP32 เช่นกัน
Raw-IR-decoder-for-Arduino ไม่ใช่ไลบรารี แต่เป็นภาพร่างตัวอย่าง Arduino ซึ่งมีวิธีการถอดรหัสหลายวิธีโดยเฉพาะโปรโตคอล เครื่องปรับอากาศ การส่งโปรโตคอลเหล่านี้สามารถทำได้โดย HeatpumpIR ของไลบรารี Arduino
หากคุณได้รับสิ่งนี้:
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, เท็จ, 0, 0);
คุณสามารถส่งด้วยการเรียก sendPulseDistanceWidthData()
สองครั้ง ครั้งแรกสำหรับ 32 บิตแรกและถัดไปสำหรับ 24 บิตที่เหลือ
ตัวถอดรหัส PULSE_DISTANCE
/ PULSE_WIDTH
เพียงถอดรหัสสตรีมไทม์มิ่งเป็นบิตสตรีมที่จัดเก็บเป็นค่าฐานสิบหก ตัวถอดรหัสเหล่านี้ไม่สามารถใส่ความหมายใดๆ เช่น ที่อยู่ คำสั่ง หรือเช็คซัมบนบิตสตรีมนี้ได้ แต่บิตสตรีมนั้นสามารถอ่านได้ง่ายกว่าไทม์มิ่งสตรีม บิตสตรีมนี้จะถูกอ่าน LSB ก่อนตามค่าเริ่มต้น หาก LSB ไม่เหมาะสำหรับการค้นคว้าเพิ่มเติม คุณสามารถเปลี่ยนแปลงได้ที่นี่
หาก RAM ไม่เกิน 2k ตัวถอดรหัสจะยอมรับเฉพาะระยะเวลาเครื่องหมายหรือช่องว่างสูงสุด 2,500 ไมโครวินาทีเพื่อประหยัดพื้นที่ RAM มิฉะนั้นจะยอมรับระยะเวลาสูงสุด 10 ms
หากคุณเห็นบางอย่างเช่น Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
เป็นเอาต์พุต เช่น ตัวอย่าง ReceiverDemo คุณอาจมีปัญหาในการถอดรหัสโปรโตคอลหรือโปรโตคอลที่ไม่รองรับ
หากคุณได้รับ บิตเป็นจำนวนคี่ วงจรตัวรับของคุณอาจมีปัญหา อาจเป็นเพราะสัญญาณ IR อ่อนเกินไป
หากคุณเห็นการกำหนดเวลาเช่น + 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
แสดงว่าช่องว่าง 450 µs หนึ่งช่องถูกแบ่งออกเป็นช่องว่าง 150 และ 100 µs สองช่อง โดยมีสัญญาณขัดขวาง/ข้อผิดพลาดที่ 200 µs ระหว่าง อาจเป็นเพราะเครื่องรับชำรุดหรือสัญญาณอ่อนร่วมกับแหล่งเปล่งแสงอื่นที่อยู่ใกล้เคียง
หากคุณเห็นการกำหนดเวลาเช่น + 500,- 550 + 450,- 550 + 450,- 500 + 500,-1550
โดยทั่วไปเครื่องหมายจะสั้นกว่าช่องว่างดังนั้น MARK_EXCESS_MICROS
(ระบุไว้ในไฟล์ ino ของคุณ) ควรเป็น ค่าลบ เพื่อชดเชยสิ่งนี้ ในการถอดรหัส
หากคุณเห็น Protocol=UNKNOWN Hash=0x0 1 bits received
อาจเป็นไปได้ว่าช่องว่างหลังเครื่องหมายเริ่มต้นยาวกว่า RECORD_GAP_MICROS
สิ่งนี้ถูกสังเกตสำหรับโปรโตคอลเครื่องปรับอากาศ LG บางรุ่น ลองอีกครั้งด้วยบรรทัด เช่น #define RECORD_GAP_MICROS 12000
หน้าบรรทัด #include <IRremote.hpp>
ในไฟล์ .ino ของคุณ
หากต้องการดูข้อมูลเพิ่มเติมที่สนับสนุนคุณในการค้นหาเหตุผลสำหรับโปรโตคอล UNKNOWN คุณต้องเปิดใช้งานบรรทัด //#define DEBUG
ใน IRremoteInt.h
หากคุณไม่ทราบว่าเครื่องส่งสัญญาณ IR ของคุณใช้โปรโตคอลใด คุณมีทางเลือกหลายทาง
เพียงใช้ค่าแฮชเพื่อตัดสินใจว่าจะได้รับคำสั่งใด ดูตัวอย่าง SimpleReceiverForHashCodes
ใช้ตัวอย่าง IRreceiveDemo หรือตัวอย่าง IRreceiveDump เพื่อถ่ายโอนข้อมูลเวลา IR จากนั้นคุณสามารถทำซ้ำ/ส่งช่วงเวลานี้ด้วยตัวอย่าง SendRawDemo
ตัวอย่าง IRMP AllProtocol จะพิมพ์โปรโตคอลและข้อมูลสำหรับหนึ่งใน 40 โปรโตคอลที่รองรับ สามารถใช้ไลบรารีเดียวกันเพื่อส่งรหัสนี้ได้
หากคุณมีบอร์ด Arduino ที่ใหญ่กว่าอยู่ในมือ (> หน่วยความจำโปรแกรม 100 kByte) คุณสามารถลองใช้ตัวอย่าง IRremoteDecode ของไลบรารี Arduino DecodeIR
ใช้ IrScrutinizer มันสามารถสร้างภาพร่างการส่งสำหรับโปรโตคอลของคุณโดยอัตโนมัติโดยส่งออกเป็น "Arduino Raw" รองรับ IRremote, IRLib เก่าและอินฟราเรด4Arduino
หากคุณมีอุปกรณ์ที่สามารถสร้างรหัส 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 บิต ดังนั้นจึงเป็นการดีที่สุดที่จะรันโปรแกรมรับบนแพลตฟอร์มเดียวกันกับโปรแกรมส่ง
ฟังก์ชันการส่งทั้งหมดรองรับการส่งซ้ำ หากสมเหตุสมผล เฟรมที่ทำซ้ำจะถูกส่งในช่วงเวลาคงที่ซึ่งกำหนดโดยโปรโตคอล เช่น 110 ms ตั้งแต่ต้นจนจบสำหรับ NEC
โปรดทราบว่า ไม่มีความล่าช้าหลังจากเครื่องหมายที่ส่งครั้งล่าสุด หากคุณจัดการการส่งเฟรมซ้ำด้วยตัวเอง คุณต้องแทรกการหน่วงเวลาที่เหมาะสมก่อนเฟรมทำซ้ำเพื่อให้สามารถถอดรหัสได้อย่างถูกต้อง
การส่งรหัส MSB เก่าโดยไม่ต้องแปลงสามารถทำได้โดยใช้ sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
รหัสที่พบในฐานข้อมูล Flipper-IRDB นั้นค่อนข้างตรงไปตรงมาในการแปลง เนื่องจากยังใช้รูปแบบที่อยู่ / คำสั่งด้วย
การจับคู่โปรโตคอลคือ NECext -> NECext (หรือ Onkyo), Samsung32 -> Samsung, SIRC20 -> Sony พร้อม 20 บิต เป็นต้น
รหัสที่พบในฐานข้อมูล irdb จะระบุ อุปกรณ์ อุปกรณ์ย่อย และ ฟังก์ชัน เวลาส่วนใหญ่ อุปกรณ์ และ อุปกรณ์ย่อย สามารถใช้เป็นไบต์บนและล่างของ พารามิเตอร์ที่อยู่ และ ฟังก์ชัน เป็น พารามิเตอร์คำสั่ง สำหรับ ฟังก์ชันที่มีโครงสร้างใหม่ พร้อมที่อยู่ คำสั่ง และพารามิเตอร์การนับซ้ำ เช่น IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
.
การแมปที่แน่นอน สามารถพบได้ในไฟล์คำจำกัดความ IRP สำหรับโปรโตคอล IR "D" และ "S" หมายถึงอุปกรณ์และอุปกรณ์ย่อย และ "F" หมายถึงฟังก์ชัน
สามารถเลือกพินใดก็ได้เป็นพินส่ง เนื่องจากสัญญาณ PWM ถูกสร้างขึ้นโดยค่าเริ่มต้นพร้อมกับการกระแทกบิตของซอฟต์แวร์ เนื่องจาก SEND_PWM_BY_TIMER
ไม่ได้ทำงานอยู่
บน ESP32 ledc ช่อง 0 ใช้สำหรับสร้าง IR PWM
หากระบุ IR_SEND_PIN
(เป็นมาโคร c) จะลดขนาดโปรแกรมและปรับปรุงระยะเวลาการส่งสำหรับ AVR หากคุณต้องการใช้ตัวแปรเพื่อระบุการส่งพิน เช่น ด้วย setSendPin(uint8_t aSendPinNumber)
คุณต้องปิดการใช้งานมาโคร IR_SEND_PIN
นี้ จากนั้นคุณสามารถเปลี่ยนการส่ง PIN ได้ตลอดเวลาก่อนที่จะส่งเฟรม IR ดูเพิ่มเติมที่การคอมไพล์ตัวเลือก/มาโครสำหรับไลบรารีนี้
http://www.harctoolbox.org/IR-resources.html
ฐานข้อมูล IRDB ของฟลิปเปอร์
การถอดรหัสฟลิปเปอร์ | การถอดรหัส IRremote |
---|---|
ซัมซุง32 | ซัมซุง |
เอ็นอีซี | เอ็นอีซี |
ต่อไป | ออนเคียว |
<เริ่มต้นบิต><VendorID:16><VendorID parity: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) และ Command 0x35 | <เริ่มต้นบิต><VendorID:16><VendorID parity:4><ที่อยู่:12><Command:8><Parity ของ VendorID parity ที่อยู่และคำสั่ง:8><บิตหยุด> |
สำหรับแอปพลิเคชันที่ต้องการเฉพาะ NEC, NEC หรือ FAST -ดูโปรโตคอลด้านล่าง จะมีตัวรับ/ผู้ส่งพิเศษรวมอยู่ด้วย ซึ่งมี โค้ดขนาดเล็กมากเพียง 500 ไบต์ และไม่ต้องใช้ตัวจับเวลาใดๆ
แทนที่จะสุ่มตัวอย่างอินพุตทุกๆ 50 µs เหมือนกับที่ IRremote ทำ ตัวรับ TinyReceiver จะใช้ การขัดจังหวะการเปลี่ยนพิน สำหรับการถอดรหัสแบบทันทีทันใด ซึ่งจะจำกัดการเลือกโปรโตคอล
ในการเปลี่ยนแปลงแต่ละระดับ ระดับและเวลาตั้งแต่การเปลี่ยนแปลงครั้งล่าสุดจะถูกนำมาใช้เพื่อถอดรหัสโปรโตคอลแบบค่อยเป็นค่อยไป
ด้วยหลักการทำงานนี้ เรา ไม่สามารถรอการหมดเวลา แล้วถอดรหัสโปรโตคอลเหมือนกับที่ IRremote ทำ
แต่เราจำเป็นต้องรู้ว่าบิตสุดท้าย (การเปลี่ยนแปลงระดับ) ของโปรโตคอลเพื่อทำการถอดรหัสขั้นสุดท้ายและการเรียกของ ผู้ใช้ทางเลือกที่มีฟังก์ชันการเรียกกลับ handleTinyReceivedIRData()
ซึ่งหมายความว่า เราจำเป็นต้องทราบจำนวนบิตในโปรโตคอล และโปรโตคอล (ตระกูล)
ดูตัวอย่าง TinyReceiver และ IRDispatcherDemo
ดูแลที่จะรวม TinyIRReceiver.hpp
หรือ TinyIRSender.hpp
แทน IRremote.hpp
//#define USE_ONKYO_PROTOCOL // เช่นเดียวกับ NEC แต่ใช้ที่อยู่ 16 บิตและสั่งแต่ละค่าเป็นค่า 16 บิตเดียวและไม่ใช่ค่าปกติ 8 บิตและค่ากลับด้าน 8 บิต//#define USE_FAST_PROTOCOL // ใช้โปรโตคอล FAST แทน NEC / ONKYO#include "TinyIRReceiver.hpp" การตั้งค่าเป็นโมฆะ () { initPCIInterruptForTinyReceiver(); // เปิดใช้งานการสร้างอินเทอร์รัปต์จากการเปลี่ยนแปลงสัญญาณอินพุต IR}void loop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // ไม่ต้องมีเรซูเม่() :-)}
#include "TinyIRSender.hpp" การตั้งค่าเป็นโมฆะ () { sendNEC (3, 0, 11, 2); // ส่งที่อยู่ 0 และคำสั่ง 11 บนพิน 3 ด้วยการทำซ้ำ 2 ครั้ง}void loop() {}
สามารถดูตัวรับและผู้ส่งขนาดเล็กอีกตัว ที่รองรับโปรโตคอลเพิ่มเติม ได้ที่นี่
โปรโตคอล FAST เป็นโปรโตคอล JVC ที่ได้รับการดัดแปลงที่เป็นเอกสิทธิ์ โดย ไม่มีที่อยู่ มีความเท่าเทียมกันและมีส่วนหัวที่สั้นกว่า มีไว้เพื่อให้ตอบสนองอย่างรวดเร็วต่อเหตุการณ์ที่ส่งเฟรมโปรโตคอลไปบนบอร์ดอื่น FAST ใช้เวลา ในการส่ง 21 มิลลิวินาที และส่งใน ช่วงเวลา 50 มิลลิวินาที มีความเท่าเทียมกัน 8 บิตเต็มรูปแบบสำหรับการตรวจจับข้อผิดพลาด
Bit timing ก็เหมือนกับ JVC
ส่วนหัวจะสั้นกว่า 3156 µs เทียบกับ 12500 µs
ไม่มีที่อยู่และข้อมูล 16 บิต ตีความว่าเป็นคำสั่ง 8 บิตและคำสั่งกลับด้าน 8 บิต นำไปสู่ความยาวโปรโตคอลคงที่ (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 ไมโครวินาทีหรือ 29 ms
การทำซ้ำจะถูกส่งเป็นเฟรมที่สมบูรณ์ แต่ในระยะเวลา 50 มิลลิวินาที / ด้วยระยะห่าง 21 มิลลิวินาที
#define IR_SEND_PIN 3#include <IRremote.hpp>การตั้งค่าเป็นโมฆะ() { sendFAST(11, 2); // ส่งคำสั่ง 11 บนพิน 3 ด้วยการทำซ้ำ 2 ครั้ง}void loop() {}
#define USE_FAST_PROTOCOL // ใช้โปรโตคอล FAST ไม่มีที่อยู่และข้อมูล 16 บิต ตีความว่าเป็นคำสั่ง 8 บิตและคำสั่งกลับด้าน 8 บิต#include "TinyIRSender.hpp"การตั้งค่าโมฆะ() { sendFAST(3, 11, 2); // ส่งคำสั่ง 11 บนพิน 3 ด้วยการทำซ้ำ 2 ครั้ง}void loop() {}
สามารถรับโปรโตคอล FAST ได้โดย IRremote และ TinyIRReceiver
ช่วงเวลาตัวอย่างตัวรับ 50 µs สร้างขึ้นโดยตัวจับเวลา บนกระดานหลายแห่งสิ่งนี้จะต้องเป็นตัวจับเวลาฮาร์ดแวร์ ในบางบอร์ดที่มีตัวจับเวลาซอฟต์แวร์ใช้งานตัวจับเวลาซอฟต์แวร์
โปรดทราบว่าไม่ควรใช้ตัวจับเวลาฮาร์ดแวร์ที่ใช้สำหรับการรับสำหรับ analogWrite()
โดยเฉพาะอย่างยิ่งการควบคุม มอเตอร์ มักใช้ฟังก์ชั่น analogWrite()
และจะหยุดการรับหากใช้กับพินที่ระบุไว้ที่นี่
บน UNO และบอร์ด AVR อื่น ๆ ตัวจับเวลาตัวรับสัญญาณนั้นเหมือนกับตัวจับเวลาเสียง ดังนั้นการรับจะหยุดหลังจากคำสั่ง tone()
ดูตัวอย่างที่ได้รับวิธีจัดการกับมันเช่นวิธีการใช้ IrReceiver.restartTimer()
ตั้งค่าสถานะ IRDATA_FLAGS_WAS_OVERFLOW
ถ้า RAW_BUFFER_LENGTH
มีขนาดเล็กเกินไปสำหรับเครื่องหมายและช่องว่างทั้งหมดของโปรโตคอล สิ่งนี้สามารถเกิดขึ้นได้กับเฟรมโปรโตคอลยาวเช่นเดียวกับเครื่องปรับอากาศ นอกจากนี้ยังสามารถเกิดขึ้นได้หาก RECORD_GAP_MICROS
มีขนาดเล็กกว่าช่องว่างที่แท้จริงระหว่างเฟรมและเฟรมการทำซ้ำ THR ดังนั้นการตีความทั้งสองเป็นเฟรมติดต่อกัน ดีที่สุดคือการทิ้งเวลาเพื่อดูว่าเหตุผลใดถือ
remote จะไม่ทำงานเมื่อคุณใช้ Neopixels (aka WS2811/WS2812/WS2812B) หรือห้องสมุดอื่น ๆ ที่ปิดกั้นการขัดจังหวะเป็นเวลานาน (> 50 µs)
ไม่ว่าคุณจะใช้ Adafruit Neopixel Lib หรือ Faddled การขัดจังหวะจะถูกปิดใช้งานในซีพียูระดับล่างจำนวนมากเช่น Arduinos พื้นฐานนานกว่า 50 µs ในทางกลับกันสิ่งนี้จะหยุดตัวจัดการอินเตอร์รัปต์ IR ไม่ให้ทำงานเมื่อต้องการ ดูวิดีโอนี้ด้วย
วิธีแก้ปัญหา หนึ่งคือการรอให้ตัวรับสัญญาณ IR ไม่ได้ใช้งานก่อนที่คุณจะส่งข้อมูล neopixel ด้วย if (IrReceiver.isIdle()) { strip.show();}
สิ่งนี้ จะช่วยป้องกันไม่ให้เกิดการส่งสัญญาณ IR ที่ทำงานอยู่ และขึ้นอยู่กับอัตราการอัปเดตของ Neopixel- อาจใช้งานได้ดี
มีวิธีแก้ปัญหาอื่น ๆ สำหรับโปรเซสเซอร์ที่มีประสิทธิภาพมากขึ้นดูหน้านี้จาก Marc Merlin
ห้องสมุดอื่นใช้งานได้เฉพาะ ในกรณีที่คุณปิดการใช้งานสาย IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
-
สิ่งนี้มักเกิดจาก ทรัพยากรตัวจับเวลาขัดแย้ง กับห้องสมุดอื่น ๆ โปรดดูด้านล่าง
ห้องสมุดนี้รองรับตัวรับสัญญาณ IR เพียงตัวเดียวและ ONE IR ผู้ส่ง (IRRECV และ IRSEND) ต่อ CPU
อย่างไรก็ตามเนื่องจากการส่งเป็นงานอนุกรมคุณสามารถใช้ setSendPin()
เพื่อสลับพินเพื่อส่งจึงเลียนแบบผู้ส่งหลายคน
ตัวรับสัญญาณใช้ฟังก์ชัน ตัวจับเวลา พิเศษซึ่งอ่านค่าสัญญาณ IR ดิจิตอลจากหนึ่งพินทุก ๆ 50 µs
ดังนั้น ตัวรับสัญญาณ IR หลายตัว สามารถใช้งานได้โดยการเชื่อมต่อพินเอาท์พุทของตัวรับสัญญาณ IR หลายตัวเข้าด้วยกัน โมดูลตัวรับสัญญาณ IR ภายในใช้ทรานซิสเตอร์ NPN เป็นอุปกรณ์เอาท์พุทที่มีตัวต้านทาน 30K เป็น VCC นี่คือ "ตัวสะสมแบบเปิด" และอนุญาตให้มีหมุดเอาต์พุตหลายตัวเชื่อมต่อกับพินอินพุต Arduino หนึ่งอัน
อย่างไรก็ตามโปรดทราบว่าสัญญาณที่อ่อนแอ / ถูกรบกวนจากตัวรับสัญญาณใดตัวหนึ่งจะรบกวนสัญญาณที่ดีจากตัวรับสัญญาณอื่น
วิธีที่ดีที่สุดในการเพิ่มพลังงาน IR ให้ฟรี คือการใช้ไดโอด 2 หรือ 3 IR ในซีรีส์ ไดโอดหนึ่งต้องการ 1.2 โวลต์ที่ 20 mA หรือ 1.5 โวลต์ที่ 100 mA เพื่อให้คุณสามารถจัดหาไดโอดได้สูงสุด 3 ไดโอดด้วยเอาต์พุต 5 โวลต์
ในการจ่ายไฟ 2 ไดโอด ที่มี 1.2 V และ 20 mA และอุปทาน 5 V ตั้งค่าตัวต้านทานเป็น: (5 V - 2.4 V) -> 2.6 V / 20 Ma = 130 Ω
สำหรับ 3 ไดโอด ต้องใช้ 1.4 V / 20 ma = 70 Ω
กระแสที่เกิดขึ้นจริงอาจต่ำกว่าเนื่องจาก การสูญเสียที่พิน AVR เช่น 0.3 V ที่ 20 Ma
หากคุณไม่ต้องการกระแสมากกว่า 20 mA ไม่จำเป็นต้องใช้ทรานซิสเตอร์ภายนอก (อย่างน้อยสำหรับชิป AVR)
บนนาโน Arduino ของฉันฉันมักจะใช้ตัวต้านทานซีรีย์ 100 Ωและ LED IR หนึ่งตัว?
สำหรับการรับ ความถี่นาฬิกา CPU ขั้นต่ำคือ 4 MHz เนื่องจากตัวจับเวลา 50 µS ISR (รูทีนบริการอินเตอร์รัปต์) ใช้เวลาประมาณ 12 µs ใน ATMEGA 16 MHz
tinyreceiver ซึ่งไม่จำเป็นต้องมีการสำรวจวิ่งด้วย 1 MHz
สำหรับการส่ง ซอฟต์แวร์เริ่มต้นที่สร้างขึ้น PWM มีปัญหาในการทำงานกับ AVR ด้วย 8 MHz ความถี่ PWM อยู่ที่ประมาณ 30 แทนที่จะเป็น 38 kHz และ RC6 ไม่น่าเชื่อถือ คุณสามารถเปลี่ยนเป็นตัวจับเวลา PWM Generation ได้โดย #define SEND_PWM_BY_TIMER
ตัวถอดรหัสโปรโตคอล Bang & Olufsen ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นเช่นหากไม่มีการเปิดใช้งานโปรโตคอลอย่างชัดเจนโดย #define DECODE_<XYZ>
มันจะต้องเปิดใช้งานอย่างชัดเจนโดย #define DECODE_BEO
นี่เป็นเพราะมันมี ความถี่การส่ง IR 455 kHz ดังนั้นจึงต้องใช้ฮาร์ดแวร์ตัวรับสัญญาณที่แตกต่างกัน (TSOP7000)
และเนื่องจาก การสร้างสัญญาณ PWM 455 kHz จะถูกนำมาใช้ในปัจจุบันสำหรับ SEND_PWM_BY_TIMER
เท่านั้น การส่งจะใช้งานได้เฉพาะในกรณีที่ SEND_PWM_BY_TIMER
หรือ USE_NO_SEND_PWM
ถูกกำหนดไว้
สำหรับข้อมูลเพิ่มเติมดู ir_bangolufsen.hpp
ตัวอย่างมีอยู่ที่ไฟล์> ตัวอย่าง> ตัวอย่างจากไลบรารีที่กำหนดเอง / ถาวร
เพื่อให้พอดีกับตัวอย่างของ 8K Flash of Attiny85 และ Attiny88 จึงจำเป็นต้องใช้ห้องสมุด Arduino Attinyserialout สำหรับ CPU นี้
ดูเพิ่มเติมที่ DroneBot Workshop Simplereceiver และ Simplesender
ตัวอย่าง SimpleCeiver และ Simplesender เป็นจุดเริ่มต้นที่ดี ตัวอย่างง่ายๆสามารถทดสอบออนไลน์ด้วย Wokwi
SimpleCeiverForHashCodes ใช้เฉพาะตัวถอดรหัสแฮช มันแปลงเฟรม IR ทั้งหมดนานกว่า 6 เป็นรหัสแฮช 32 บิตจึงช่วยให้ได้รับโปรโตคอลที่ไม่รู้จัก
ดู: http://www.righto.com/2010/01/using-arbitrary-remotes-with-arduino.html
หาก ขนาดรหัส หรือ การใช้ตัวจับเวลา มีความสำคัญให้ดูตัวอย่างเหล่านี้
ตัวอย่าง Tinyreceiver ใช้ไลบรารี Tinyirreceiver ซึ่งสามารถ รับ NEC, Extended NEC, Onkyo และโปรโตคอลได้อย่างรวดเร็ว แต่ไม่ต้องการตัวจับเวลาใด ๆ พวกเขาใช้การเปลี่ยนการเปลี่ยนแปลงพินสำหรับการถอดรหัสการบินซึ่งเป็นเหตุผลสำหรับตัวเลือกโปรโตคอลที่ จำกัด
Tinyreceiver สามารถทดสอบออนไลน์กับ Wokwi
ตัวอย่าง Tinysender ใช้ไลบรารี Tinyirsender ซึ่งสามารถ ส่งโปรโตคอล NEC, Onkyo และ Fast เท่านั้น
มันส่งรหัสโปรโตคอล NEC ในรูปแบบมาตรฐานพร้อมที่อยู่ 8 บิตและคำสั่ง 8 บิตเช่นเดียวกับในตัวอย่าง Simplesender มันมีตัวเลือกในการส่งโดยใช้ NEC, Onkyo และโปรโตคอลที่รวดเร็ว บันทึกหน่วยความจำของโปรแกรม 780 ไบต์และ 26 ไบต์ RAM เมื่อเทียบกับ Simplesender ซึ่งทำเช่นเดียวกัน แต่ใช้ไลบรารี remote (และมีความยืดหยุ่นมากขึ้น)
หากโปรโตคอลไม่ใช่ NEC และขนาดของรหัสให้ดูตัวอย่างนี้
ได้รับการได้รับโปรโตคอลทั้งหมดและ สร้างเสียงบี๊บด้วยฟังก์ชั่น Arduino Tone () ในแต่ละแพ็คเก็ตที่ได้รับ
ตรวจพบการกดปุ่ม IR หนึ่งปุ่มยาว (รับการทำซ้ำหลายครั้งสำหรับคำสั่งเดียว) ถูกตรวจพบ
Allprotocolsonlcd ยัง แสดงผลลัพธ์สั้น ๆ ใน LCD 1602 LCD สามารถเชื่อมต่อแบบขนานหรืออนุกรม (I2C)
ด้วยการเชื่อมต่อขาตั้งดีบักเข้ากับกราวด์คุณสามารถบังคับให้พิมพ์ค่าดิบสำหรับแต่ละเฟรม หมายเลขพินของพินดีบั๊กถูกพิมพ์ระหว่างการตั้งค่าเนื่องจากขึ้นอยู่กับประเภทการเชื่อมต่อบอร์ดและ LCD
ตัวอย่างนี้ยังทำหน้าที่เป็น ตัวอย่างวิธีการใช้ unremote และ tone () ร่วมกัน
รับโปรโตคอลทั้งหมดและทิ้งสัญญาณที่ได้รับในรสชาติที่แตกต่างกันรวมถึงรูปแบบ pronto เนื่องจากการพิมพ์ใช้เวลามากสัญญาณซ้ำอาจถูกข้ามหรือตีความว่าไม่ทราบ
ส่งโปรโตคอลที่มีอยู่ทั้งหมดอย่างน้อยหนึ่งครั้ง
แสดงให้เห็นถึง การรับขณะส่ง
บันทึกและ เล่นสัญญาณ IR ที่ได้รับล่าสุด ที่ปุ่มกด เฟรม IR ของโปรโตคอลที่รู้จักจะถูกส่งโดยตัวเข้ารหัสโปรโตคอลที่เหมาะสม เฟรมโปรโตคอล UNKNOWN
จะถูกเก็บไว้เป็นข้อมูลดิบและส่งด้วย sendRaw()
ลองถอดรหัสเฟรม IR แต่ละเฟรมด้วยตัวถอดรหัส Universal MistanceWidth จัดเก็บข้อมูลและส่งบนปุ่มกดด้วย sendPulseDistanceWidthFromArray()
หาก RAM ไม่เกิน 2K ตัวถอดรหัสจะยอมรับระยะเวลาของเครื่องหมายหรือระยะเวลาสูงสุดถึง 2,500 ไมโครวินาทีเพื่อประหยัดพื้นที่ RAM มิฉะนั้นจะยอมรับระยะเวลาสูงถึง 10 มิลลิวินาที
การจัดเก็บข้อมูลสำหรับโปรโตคอลความกว้างระยะทางต้องใช้ 17 ไบต์ ตัวอย่างของผู้รับเงินต้องการ 16 ไบต์สำหรับข้อมูลโปรโตคอลที่รู้จักและ 37 ไบต์สำหรับข้อมูลดิบของโปรโตคอล EGNEC
ทำหน้าที่เป็น ตัวขยายแมโครระยะไกล IR รับโปรโตคอล Samsung32 และเมื่อได้รับเฟรมอินพุตที่ระบุจะส่งเฟรม Samsung32 หลายเฟรมที่มีความล่าช้าที่เหมาะสมในระหว่างนั้น สิ่งนี้ทำหน้าที่เป็นการ จำลอง Netflix-Key สำหรับทีวี Samsung H5273 เก่าของฉัน
เฟรมเวิร์กสำหรับ การเรียกใช้ฟังก์ชั่นที่แตกต่างกันของโปรแกรมของคุณ สำหรับรหัส IR ที่แตกต่างกัน
ควบคุมรีเลย์ (เชื่อมต่อกับพินเอาต์พุต) ด้วยรีโมทของคุณ
ตัวอย่างสำหรับคลาสที่ผู้ใช้กำหนดซึ่งตัวเองใช้คลาส UNCRECV จาก irremote
ตัวอย่างสำหรับการส่งรหัสเครื่องปรับอากาศ LG ควบคุมโดยอินพุตอนุกรม
เพียงแค่ใช้ฟังก์ชั่น bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
คุณสามารถควบคุมเครื่องปรับอากาศโดยแหล่งคำสั่งอื่น ๆ
ไฟล์ ACLG.H มีเอกสารคำสั่งของโปรโตคอล IR ของเครื่องปรับอากาศ LG ขึ้นอยู่กับวิศวกรรมย้อนกลับของ LG AKB73315611 ระยะไกล
ireceivertiminganalysis สามารถทดสอบออนไลน์ได้ด้วย Wokwi คลิกที่ตัวรับสัญญาณในขณะที่การจำลองกำลังทำงานเพื่อระบุรหัส IR แต่ละตัว
ตัวอย่างสำหรับการรับและส่งโปรโตคอล AEG / Elektrolux Hob2hood
ตัวอย่างนี้วิเคราะห์สัญญาณที่ส่งโดยโมดูลตัวรับสัญญาณ IR ของคุณ ค่าสามารถใช้เพื่อกำหนดเสถียรภาพของสัญญาณที่ได้รับรวมถึงคำใบ้สำหรับการกำหนดโปรโตคอล
นอกจากนี้ยังคำนวณค่า MARK_EXCESS_MICROS
ซึ่งเป็นส่วนขยายของระยะเวลาเครื่องหมาย (พัลส์) ที่แนะนำโดยโมดูลตัวรับสัญญาณ IR
สามารถทดสอบออนไลน์กับ Wokwi คลิกที่ตัวรับสัญญาณในขณะที่การจำลองกำลังทำงานเพื่อระบุรหัส NEC IR แต่ละรายการ
ได้รับ + senddemo ในโปรแกรมเดียว แสดงให้เห็นถึง การรับขณะส่ง ที่นี่คุณจะเห็นความล่าช้าของเอาต์พุตตัวรับสัญญาณ (สีน้ำเงิน) จากอินพุต IR diode (สีเหลือง)
ผู้รับง่าย
TOGGLE ง่าย ๆ โดย IR KEY 5
Tinyreceiver
ลูกหนี้
ตัวรับสัญญาณที่มีเอาต์พุต LCD และคำสั่งสวิตช์
ตัวอย่างของ ไลบรารี Arduino PWMMOTORCONTROL ควบคุมฟังก์ชั่นพื้นฐานของรถหุ่นยนต์โดยใช้ไลบรารี remote
มันควบคุมช่องมอเตอร์ PWM 2 ช่องมอเตอร์ 2 ตัวในแต่ละช่อง
ที่นี่คุณสามารถค้นหาคำแนะนำสำหรับชุดประกอบรถและรหัส
IR_ROBOTCAR พร้อมตัวรับสัญญาณ TL1838 IR เสียบเข้ากับบอร์ดขยาย
อย่าเปิดปัญหาโดยไม่ต้องทดสอบตัวอย่างก่อน!
หากคุณมีปัญหาโปรดโพสต์ MCVE (ตัวอย่างที่ตรวจสอบได้น้อยที่สุด) แสดงปัญหานี้ ประสบการณ์ของฉันคือส่วนใหญ่ที่คุณจะพบปัญหาในขณะที่สร้าง MCVE นี้?
ใช้บล็อกรหัส มันช่วยให้เราช่วยคุณได้เมื่อเราสามารถอ่านรหัสของคุณได้!
ในการปรับแต่งไลบรารีให้เป็นข้อกำหนดที่แตกต่างกันมีตัวเลือกคอมไพล์ / มาโครบางอย่าง
มาโครเหล่านี้จะต้องกำหนดไว้ในโปรแกรมของคุณ ก่อน บรรทัด #include <IRremote.hpp>
เพื่อให้มีผล
แก้ไขโดยการเปิดใช้งาน / ปิดการใช้งานหรือเปลี่ยนค่าหากมี
ชื่อ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
RAW_BUFFER_LENGTH | 200 | ขนาดบัฟเฟอร์ของอินพุตดิบ UINT16_T บัฟเฟอร์ ต้องเป็นคู่! หากมีขนาดเล็กเกินไปจะตั้งค่าสถานะล้น 100 เพียงพอสำหรับโปรโตคอล ปกติ สูงถึง 48 บิต แต่สำหรับโปรโตคอลเครื่องปรับอากาศส่วนใหญ่จำเป็นต้องมีค่าสูงถึง 750 ใช้ตัวอย่างที่ได้รับเพื่อค้นหาคุณค่าที่เล็กที่สุดสำหรับความต้องการของคุณ มูลค่า 200 ต้องใช้ RAM 200 ไบต์ |
EXCLUDE_UNIVERSAL_PROTOCOLS | พิการ | ไม่รวมตัวถอดรหัสสากลสำหรับโปรโตคอลความกว้างระยะทางพัลส์และตัวถอดรหัส (ตัวถอดรหัสพิเศษสำหรับโปรโตคอลทั้งหมด) จาก decode() บันทึกหน่วยความจำโปรแกรมมากถึง 1,000 ไบต์ |
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 | 5,000 | ช่องว่างขั้นต่ำระหว่างการส่งสัญญาณ IR เพื่อตรวจหาจุดสิ้นสุดของโปรโตคอล จะต้องมากกว่าพื้นที่ใด ๆ ของโปรโตคอลเช่นพื้นที่ส่วนหัว NEC ที่ 4500 µs ต้องมีขนาดเล็กกว่าช่องว่างระหว่างคำสั่งและการทำซ้ำ เช่นช่องว่างการส่งคืนสำหรับ Sony อยู่ที่ประมาณ 24 มิลลิวินาที โปรดทราบว่านี่คือความล่าช้าระหว่างการสิ้นสุดของคำสั่งที่ได้รับและการเริ่มต้นของการถอดรหัส |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | 50 ถ้า ram <= 2k, อื่น ๆ 200 | ค่า 200 ช่วยให้สามารถถอดรหัสเครื่องหมายหรือระยะเวลาอวกาศได้สูงสุด 10 มิลลิวินาที |
IR_INPUT_IS_ACTIVE_HIGH | พิการ | เปิดใช้งานหากคุณใช้ตัวรับสัญญาณ RF ซึ่งมีสัญญาณเอาต์พุตสูงที่ใช้งานอยู่ |
IR_SEND_PIN | พิการ | หากระบุจะลดขนาดโปรแกรมและปรับปรุงการส่งเวลาสำหรับ AVR หากคุณต้องการใช้ตัวแปรเพื่อระบุการส่ง PIN เช่น setSendPin(uint8_t aSendPinNumber) คุณต้องไม่ใช้ / ปิดการใช้งานแมโครนี้ในแหล่งที่มาของคุณ |
SEND_PWM_BY_TIMER | พิการ | ปิดการใช้งานการสร้าง PWM ของผู้ให้บริการในซอฟต์แวร์และใช้ฮาร์ดแวร์ PWM (ตามตัวจับเวลา) มีข้อได้เปรียบของการสร้าง PWM ที่แน่นอนมากขึ้นโดยเฉพาะอย่างยิ่ง Cyc Duty
ขยาย
ข้อมูลเพิ่มเติม
แอปที่เกี่ยวข้อง
แนะนำสำหรับคุณ
ข้อมูลที่เกี่ยวข้อง
ทั้งหมด
|