مكتبة تتيح إرسال واستقبال إشارات الأشعة تحت الحمراء.
متوفر كمكتبة Arduino "IRremote".
؟ ترجمة جوجل
بروتوكولات الأشعة تحت الحمراء المدعومة
سمات
ميزات جديدة مع الإصدار 4.x
ميزات جديدة مع الإصدار 3.x
تحويل برنامج 2.x إلى الإصدار 4.x
كيفية تحويل رموز بيانات IR 32 بت القديمة من MSB إلى رموز بيانات IR 32 بت الأولى من LSB الجديدة
أخطاء في استخدام الإصدارات 3.x للبرامج التعليمية القديمة
البقاء على 2.x
لماذا *.hpp بدلاً من *.cpp
استخدام ملفات *.hpp الجديدة
دروس
3 طرق لتحديد رمز IR
دبابيس IRReceiver
استقبال رموز الأشعة تحت الحمراء
تنصل
المكتبات الأخرى، والتي قد تغطي هذه البروتوكولات
البروتوكول=PULSE_DISTANCE
البروتوكول=غير معروف
كيفية التعامل مع البروتوكولات التي لا يدعمها IRremote
بنية بيانات IRD التي تم فك تشفيرها
بروتوكولات غامضة
استخدام ذاكرة الوصول العشوائي (RAM) لبروتوكولات مختلفة
التعامل مع البروتوكولات غير المعروفة
إرسال رموز الأشعة تحت الحمراء
قائمة قواعد بيانات كود IR العامة
إرسال رموز IRDB IR
إرسال دبوس
جهاز استقبال ومرسل NEC صغير الحجم
بروتوكول سريع
الأسئلة الشائعة والتلميحات
يتوقف الاستلام بعد التناظرية () أو النغمة () أو بعد تشغيل المحرك
تلقي مجموعات إشارة التجاوز
مشاكل مع Neopixels و FastLed وما إلى ذلك.
لا يعمل/يترجم مع مكتبة أخرى
مثيلات متعددة لجهاز استقبال ومرسل IR
زيادة قوة إشارة الإخراج المرسلة
الحد الأدنى من تردد ساعة وحدة المعالجة المركزية
بروتوكول بانج آند أولفسن
أمثلة لهذه المكتبة
أمثلة على WOKWI على الإنترنت
التحكم بالأشعة تحت الحمراء في سيارة روبوت
القضايا والمناقشات
تجميع الخيارات/وحدات الماكرو لهذه المكتبة
تغيير ملفات التضمين (*.h) باستخدام Arduino IDE
تعديل خيارات الترجمة باستخدام Sloeber IDE
اللوحات المدعومة
استخدام الموقت والدبوس
عدم التوافق مع المكتبات الأخرى وأوامر Arduino مثلtone() وanalogWrite()
الأجهزة - توليد إشارة 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 الآن 64 بت لمنصات 32 بت، وبالتالي يمكن أن يحتوي decodedIRData.decodedRawData
على معلومات إطار كاملة لبروتوكولات أكثر من 32 بت كما كان من قبل.
رد الاتصال بعد تلقي أمر - يقوم باستدعاء الرمز الخاص بك بمجرد تلقي الرسالة.
تحسين التعامل مع بروتوكولات PULSE_DISTANCE
+ PULSE_WIDTH
.
بروتوكول سريع جديد.
طباعة تلقائية لوظيفة الإرسال المقابلة باستخدام 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 أولاً.
يدعم بروتوكول المسافة العالمية الذي يغطي الكثير من البروتوكولات السابقة غير المعروفة.
متوافق مع مكتبة النغمة () . راجع مثال ReceiveDemo.
إرسال واستقبال في وقت واحد. راجع مثال SendAndReceive.
يدعم المزيد من المنصات .
يسمح بتوليد إشارة غير PWM لمحاكاة إشارة استقبال منخفضة نشطة للاتصال المباشر بأجهزة الاستقبال الموجودة دون استخدام الأشعة تحت الحمراء.
تكوين سهل للبروتوكول، مباشرة في كود المصدر الخاص بك .
يقلل من أثر الذاكرة ويقلل من وقت فك التشفير.
يحتوي على وحدة فك ترميز NEC صغيرة جدًا فقط، والتي لا تتطلب أي مورد مؤقت .
-> مقارنة الميزات بين 5 مكتبات Arduino IR.
بدءًا من الإصدار 3.1، يتم إنشاء PWM للإرسال عن طريق البرنامج ، وبالتالي توفير مؤقت الأجهزة وتمكين دبابيس الإخراج العشوائية للإرسال .
إذا كنت تستخدم نواة Arduino (قديمة) لا تستخدم علامة -flto
للتجميع، فيمكنك تنشيط السطر #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
في IRRemote.h، إذا تلقيت رسائل خطأ خاطئة بخصوص begin() أثناء التجميع.
تمت إضافة كائن IRreceiver و IRsender ويمكن استخدامه دون تعريفهما، مثل كائن Arduino Serial المعروف.
ما عليك سوى إزالة السطر 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
.
أصبحت علامات التجاوز والتكرار وغيرها من العلامات الآن في IrReceiver.receivedIRData.flags
.
نادرًا ما يتم استخدام: results.rawbuf
و results.rawlen
يجب استبدالهما بـ IrReceiver.decodedIRData.rawDataPtr->rawbuf
و IrReceiver.decodedIRData.rawDataPtr->rawlen
.
تم تحويل البروتوكولات الخمسة NEC وPanasonic وSony وSamsung وJVC إلى LSB أولاً. تمت إعادة تسمية وظائف الإرسال لإرسال بيانات MSB القديمة إلى sendNECMSB
و sendSamsungMSB()
و sendSonyMSB()
و sendJVCMSB()
. لا تزال وظائف sendSAMSUNG()
و sendSony()
MSB القديمة متاحة. تم حذف إصدار MSB القديم من وظيفة sendPanasonic()
، نظرًا لأنه يحتوي على أخطاء لم يتعرف عليها أحد، ولذلك كان من المفترض عدم استخدامه مطلقًا.
لتحويل رموز MSB إلى LSB انظر أدناه.
#include <IRremote.h>#define RECV_PIN 2IRrecv Irecv(RECV_PIN); نتائج decode_results؛ إعداد باطل () { ... Serial.begin(115200); // إنشاء اتصال تسلسلي Irecv.enableIRIn(); // ابدأ تشغيل جهاز الاستقبال}void Loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); ... Irecv.resume(); // احصل على القيمة التالية } ... }
#تتضمن <IRremote.hpp>#تعريف 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.h
بدلاً من IRremote.hpp
، فما عليك سوى محاولة العودة إلى الإصدار 2.4.0.
على الأرجح سيتم تشغيل التعليمات البرمجية الخاصة بك ولن تفوتك الميزات الجديدة.
فكر في استخدام الإصدار 2.4 الأصلي لعام 2017 أو الإصدار 2.8 الأخير المتوافق مع الإصدارات السابقة لمشروعك.
قد يكون كافيًا ويتعامل بشكل لا تشوبه شائبة مع رموز الأشعة تحت الحمراء 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، يتم تنفيذ الاستدعاءات عند النقر فوق "تحقق" أو "تحميل" .
والآن مشكلتنا مع اردوينو هي:
كيفية تعيين خيارات الترجمة لجميع ملفات *.cpp، خاصة للمكتبات المستخدمة؟
يدعم IDE مثل Sloeber أو PlatformIO هذا من خلال السماح بتحديد مجموعة من الخيارات لكل مشروع. يقومون بإضافة هذه الخيارات عند كل استدعاء للمترجم، على سبيل المثال -DTRACE
.
لكن اردوينو يفتقر إلى هذه الميزة. لذا فإن الحل البديل لا يتمثل في تجميع كافة المصادر بشكل منفصل، بل في ربطها بملف مصدر ضخم واحد عن طريق تضمينها في المصدر الخاص بك.
يتم ذلك عن طريق، على سبيل المثال، #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
مقدمة مفصلة للغاية لأجهزة التحكم عن بعد بالأشعة تحت الحمراء ومكتبة IRremote من DroneBot Workshop.
هناك 3 طرق مختلفة لتحديد رمز IR معين.
يتم تحديد توقيت كل علامة/نبضة ومسافة/مسافة بين النبضات في قائمة أو صفيف. يتيح ذلك تحديد كافة رموز الأشعة تحت الحمراء ، ولكنه يتطلب قدرًا كبيرًا من الذاكرة ولا يمكن قراءته على الإطلاق . أحد التعريفات الرسمية لمصفوفة التوقيت هذه، بما في ذلك مواصفات التردد والتكرارات ، هو تنسيق برونتو .
يمكن حفظ الذاكرة باستخدام دقة وقت أقل. بالنسبة إلى IRremote، يمكنك استخدام دقة تبلغ 50 ميكروثانية مما يؤدي إلى خفض متطلبات الذاكرة إلى النصف باستخدام قيم البايت بدلاً من قيم int16. لأغراض الاستلام، يمكنك استخدام تجزئة التوقيت التي توفرها وحدة فك ترميز decodeHash()
.
هناك 3 أنظمة تشفير رئيسية تقوم بتشفير قيمة bitstream/hex الثنائية:
PULSE_DISTANCE
. تحدد المسافة بين النبضات قيمة البت. وهذا يتطلب دائما التوقف قليلا! ومن الأمثلة على ذلك بروتوكولات NEC وKASEIKYO. عرض النبضة ثابت بالنسبة لمعظم البروتوكولات.
PULSE_WIDTH
. يحدد عرض النبضة قيمة البت، وتكون مسافة النبضة ثابتة. وهذا لا يتطلب التوقف قليلا! المثال الوحيد المعروف هو بروتوكول SONY.
المرحلة / ترميز مانشستر. يحدد وقت انتقال النبض/الإيقاف المؤقت (المرحلة) بالنسبة للساعة قيمة البتة. ومن الأمثلة على ذلك بروتوكولات RC5 وRC6.
تشفير الطور له طول بت ثابت ، PULSE_DISTANCE
مع عرض نبضي ثابت و PULSE_WIDTH
ليس له طول بت ثابت !
أحد الأمثلة المعروفة لـ PULSE_DISTANCE
مع تشفير عرض النبض غير الثابت هو التشفير التسلسلي RS232 . هنا يتم استخدام عرض النبضة غير الثابت لتمكين طول بت ثابت .
تحتوي معظم إشارات الأشعة تحت الحمراء على رأس خاص للمساعدة في ضبط الكسب التلقائي لدائرة الاستقبال. هذا الرأس ليس جزءًا من التشفير، ولكنه غالبًا ما يكون مهمًا لبروتوكول خاص وبالتالي يجب أن يكون قابلاً للتكرار.
انتبه إلى أن هناك رموزًا تستخدم ترميز PULSE_DISTANCE
حيث يتم وضع أكثر من ثنائي 0/1 في مجموعة نبض/إيقاف مؤقت. يتطلب هذا أكثر من مجموعتين مختلفتين من طول النبض أو الإيقاف المؤقت. يستخدم بروتوكول HobToHood مثل هذا الترميز.
يؤدي استخدام أنظمة التشفير إلى تقليل مواصفات كود IR إلى قيمة bitstream/hex، وهي LSB افتراضيًا وتوقيت النبض/الإيقاف المؤقت للرأس و0 و1. القيمة السداسية قابلة للقراءة تمامًا . لا يمكن لهذه المخططات وضع أي دلالات مثل العنوان أو الأمر أو المجموع الاختباري في تدفق البت هذا.
هناك عدد قليل من البروتوكولات الشائعة التي يتم تنفيذها مباشرة في IRremote. وهي تحدد التردد وتوقيت الرأس و0 و1 بالإضافة إلى قيم أخرى مثل المجموع الاختباري ومسافة التكرار وتكرار التشفير وتبديل البت وما إلى ذلك. كما يتم تحديد دلالات القيمة السداسية، مما يسمح باستخدام عنوان معلمتين فقط والأمر لتحديد رمز الأشعة تحت الحمراء. وهذا يوفر الذاكرة ويمكن قراءته بدرجة كبيرة . غالبًا ما يكون العنوان ثابتًا أيضًا، مما يقلل من متطلبات الذاكرة.
البرنامج التعليمي لمستشعر Adafruit IR
في برنامجك، يمكنك التحقق من وجود إطار IR مستلم بالكامل باستخدام:
if (IrReceiver.decode()) {}
يؤدي هذا أيضًا إلى فك تشفير البيانات المستلمة.
بعد فك التشفير بنجاح، يتم تضمين بيانات IR في بنية IRData، وهي متاحة كـ IrReceiver.decodedIRData
.
بناء IRData {بروتوكول decode_type_t؛ // غير معروف، NEC، SONY، RC5، PULSE_DISTANCE، ... عنوان uint16_t؛ // أمر فك تشفير العنوان uint16_t؛ // الأمر الذي تم فك تشفيره uint16_t extra; // يستخدم لمعرف البائع غير المعروف لـ Kaseikyo. القراد المستخدمة لفك بروتوكول المسافة. uint16_t numberOfBits; // عدد البتات المستلمة للبيانات (العنوان + الأمر + التكافؤ) - لتحديد طول البروتوكول إذا كان من الممكن وجود طول مختلف. أعلام uint8_t؛ // IRDATA_FLAGS_IS_REPEAT، IRDATA_FLAGS_WAS_OVERFLOW وما إلى ذلك. راجع تعريفات IRDATA_FLAGS_* IRRawDataType decodedRawData; // ما يصل إلى 32 بت (64 بت لبنيات وحدة المعالجة المركزية 32 بت) من البيانات الأولية التي تم فك تشفيرها، وتستخدم لوظائف sendRaw. uint32_t decodedRawDataArray[RAW_DATA_ARRAY_SIZE]; // بيانات أولية تم فك تشفيرها 32 بت، لاستخدامها في وظيفة الإرسال. irparams_struct *rawDataPtr; // مؤشر بيانات التوقيت الأولية المراد فك تشفيرها. يتم ملء المخزن المؤقت للبيانات بشكل أساسي عن طريق تلقي ISR.};
هذه هي قائمة الأعلام الموجودة في حقل الأعلام.
التحقق من ذلك على سبيل المثال if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
.
اسم العلم | وصف |
---|---|
IRDATA_FLAGS_IS_REPEAT | تكون الفجوة بين الإطار السابق أصغر من الحد الأقصى للفجوة المتوقعة للتكرار. !!!نحن لا نتحقق من تغيير الأمر أو العنوان، لأنه يكاد يكون من غير الممكن الضغط على زرين مختلفين على جهاز التحكم عن بعد خلال حوالي 100 مللي ثانية!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | إطار التكرار الحالي هو تكرار، ويتم إرساله دائمًا بعد إطار عادي ولا يمكن تجنبه. مخصص فقط لبروتوكولات DENON وLEGO. |
IRDATA_FLAGS_PARITY_FAILED | الإطار الحالي (التكرار التلقائي) ينتهك التحقق من التكافؤ. |
IRDATA_FLAGS_TOGGLE_BIT | يتم ضبطه إذا تم ضبط بت التبديل RC5 أو RC6. |
IRDATA_FLAGS_EXTRA_INFO | توجد معلومات إضافية غير واردة في العنوان والبيانات (على سبيل المثال، معرف البائع غير المعروف لـ Kaseikyo، أو في decodedRawDataArray). |
IRDATA_FLAGS_WAS_OVERFLOW | هناك عدد كبير جدًا من العلامات والمسافات لـ RAW_BUFFER_LENGTH المحدد. لتجنب وضع علامة لا نهاية لها على التجاوز، يتم تعيين irparams.rawlen على 0 في هذه الحالة. |
IRDATA_FLAGS_IS_MSB_FIRST | يتم تحديد هذه القيمة بشكل أساسي بواسطة البروتوكول (المعروف). |
auto myRawdata= IrReceiver.decodedIRData.decodedRawData;
تعريفات IrReceiver.decodedIRData.flags
موضحة هنا.
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);`
تعتمد البيانات الأولية على الحالة الداخلية لمؤقت Arduino فيما يتعلق بالإشارة المستقبلة وبالتالي قد تختلف قليلاً في كل مرة. (مشكلة القرار). القيم التي تم فك تشفيرها هي تلك المفسرة التي تتحمل مثل هذه الاختلافات الطفيفة!
IrReceiver.printIRSendUsage(&Serial);
يتم تعريف بروتوكول NEC كعنوان 8 بت وأمر 8 بت. لكن العنوان الفعلي وحقول البيانات يبلغ عرض كل منها 16 بت. يتم استخدام البتات الثمانية الإضافية لإرسال العنوان المقلوب أو الأمر للتحقق من التكافؤ.
يستخدم بروتوكول 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
طول المخزن المؤقت للبايت حيث يتم تخزين بيانات توقيت الأشعة تحت الحمراء المستلمة قبل فك التشفير.
100 يكفي للبروتوكولات القياسية حتى 48 بت ، حيث تتكون البتة الواحدة من علامة واحدة ومسافة. نحن نطلب دائمًا 4 بايت إضافية، بايت واحد للفجوة الأولية، 2 بايت للرأس وبايت واحد لبت التوقف.
بروتوكولات 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 مللي ثانية افتراضية إلى أكثر من 20 مللي ثانية، فلن يعد المخزن المؤقت بايتًا بل مخزن مؤقت uint16_t، مما يتطلب ضعف ذاكرة الوصول العشوائي (RAM).
تم تصميم هذه المكتبة لتتناسب مع وحدات MCU ذات مستويات منخفضة نسبيًا من الموارد وكان الهدف منها العمل كمكتبة مع التطبيقات الأخرى التي تتطلب أيضًا بعض موارد MCU لتشغيلها.
استخدم مثال ReceiveDemo لطباعة كافة المعلومات حول بروتوكول IR الخاص بك.
يوفر لك مثال ReceiveDump مزيدًا من المعلومات ولكنه يحتوي على اكتشاف متكرر سيئ بسبب الوقت المطلوب لطباعة المعلومات.
إذا بدا أن البروتوكول الخاص بك غير مدعوم من هذه المكتبة، فيمكنك تجربة مكتبة IRMP، التي تدعم بشكل خاص بروتوكولات مانشستر بشكل أفضل.
بالنسبة لمكيفات الهواء ، يمكنك تجربة مكتبة IRremoteESP8266، التي تدعم مجموعة رائعة من البروتوكولات والكثير من مكيفات الهواء وتعمل أيضًا على ESP32.
Raw-IR-decoder-for-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
فقط بفك تشفير تدفق التوقيت إلى تدفق البتات المخزن كقيم سداسية عشرية. لا يمكن لأجهزة فك التشفير هذه وضع أي دلالات مثل العنوان أو الأمر أو المجموع الاختباري في تدفق البت هذا. لكن دفق البت أكثر قابلية للقراءة من دفق التوقيت. تتم قراءة تدفق البت هذا بشكل افتراضي LSB أولاً . إذا لم يكن LSB مناسبًا لمزيد من البحث، فيمكنك تغييره هنا.
إذا كانت ذاكرة الوصول العشوائي (RAM) لا تزيد عن 2 كيلو بايت، فإن وحدة فك التشفير تقبل فقط فترات العلامة أو المسافة التي تصل إلى 2500 ميكروثانية لتوفير مساحة ذاكرة الوصول العشوائي (RAM)، وإلا فإنها تقبل فترات تصل إلى 10 مللي ثانية.
إذا رأيت شيئًا مثل Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
كإخراج، على سبيل المثال، مثال ReceiveDemo، فإما أن لديك مشكلة في فك تشفير بروتوكول، أو بروتوكول غير مدعوم.
إذا كان لديك عدد فردي من البتات المستلمة، فمن المحتمل أن تكون دائرة الاستقبال الخاصة بك بها مشاكل. ربما لأن إشارة الأشعة تحت الحمراء ضعيفة للغاية.
إذا رأيت توقيتات مثل + 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
فسيتم تقسيم مساحة 450 ميكروثانية إلى مسافتين 150 و100 ميكروثانية مع إشارة ارتفاع / خطأ تبلغ 200 ميكروثانية بينهما. ربما بسبب وجود خلل في جهاز الاستقبال أو إشارة ضعيفة بالتزامن مع مصدر آخر ينبعث منه الضوء في مكان قريب.
إذا رأيت توقيتات مثل + 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.
إذا كنت لا تعرف البروتوكول الذي يستخدمه جهاز إرسال الأشعة تحت الحمراء لديك، فلديك العديد من الخيارات.
ما عليك سوى استخدام قيمة التجزئة لتحديد الأمر الذي تم استلامه. راجع مثال SimpleReceiverForHashCodes.
استخدم مثال IRreceiveDemo أو مثال IRreceiveDump للتخلص من توقيت IR. يمكنك بعد ذلك إعادة إنتاج/إرسال هذا التوقيت باستخدام مثال SendRawDemo.
يقوم مثال IRMP AllProtocol بطباعة البروتوكول والبيانات الخاصة بأحد البروتوكولات الأربعين المدعومة . يمكن استخدام نفس المكتبة لإرسال هذه الرموز.
إذا كان لديك لوحة Arduino أكبر في متناول اليد (> 100 كيلو بايت من ذاكرة البرنامج)، فيمكنك تجربة مثال IRremoteDecode الخاص بمكتبة Arduino DecodeIR.
استخدم إيرسكروتينيزر. يمكنه إنشاء رسم إرسال للبروتوكول الخاص بك تلقائيًا عن طريق التصدير كـ "Arduino Raw". وهو يدعم IRremote وIRLib القديم وInfrared4Arduino.
إذا كان لديك جهاز في متناول اليد يمكنه إنشاء رموز IR التي تريد العمل معها (ويُعرف أيضًا باسم IR Remote)، فمن المستحسن استلام الرموز مع مثال ReceiveDemo، والذي سيخبرك في الإخراج التسلسلي بكيفية إرسالها.
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 مللي ثانية من البداية إلى البداية بالنسبة لشركة 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
هذا. ثم يمكنك تغيير دبوس الإرسال في أي وقت قبل إرسال إطار IR. راجع أيضًا ترجمة الخيارات/وحدات الماكرو لهذه المكتبة.
http://www.harctoolbox.org/IR-resources.html
قاعدة بيانات فليبر IRDB
فك تشفير الزعانف | فك التشفير عن بعد |
---|---|
سامسونج32 | سامسونج |
إن إي سي | إن إي سي |
NECext | أونكيو |
<بت البداية><معرف البائع:16><تكافؤ معرف البائع:4><النوع1:4><النوع2:4><الأوامر:10><المعرف:2><التكافؤ:8><بت التوقف> والمعرف هو MSB للعنوان. العنوان: 8A 02 20 00 الأمر: 56 03 00 00 -> جهاز التحكم عن بعد: العنوان 0x6A8، أرسلPanasonic (لـ 02 20) والأمر 0x35 | <بت البداية><معرف البائع:16><تكافؤ معرف البائع:4><العنوان:12><الأمر:8><تكافؤ تكافؤ معرف البائع والعنوان والأمر:8><بت التوقف> |
بالنسبة للتطبيقات التي تتطلب فقط متغيرات NEC أو NEC أو بروتوكول FAST -انظر أدناه-، يوجد جهاز استقبال/مرسل خاص مضمن، والذي يحتوي على حجم رمز صغير جدًا يبلغ 500 بايت ولا يتطلب أي مؤقت .
بدلاً من أخذ عينات من الإدخال كل 50 ميكرو ثانية كما يفعل 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" void setup() { initPCIInterruptForTinyReceiver(); // تمكين إنشاء المقاطعة عند تغيير إشارة إدخال الأشعة تحت الحمراء}void loop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // لا يلزم استئناف () :-)}
#include "TinyIRSender.hpp"void setup() { sendNEC(3, 0, 11, 2); // أرسل العنوان 0 والأمر 11 على الدبوس 3 مع تكرارين.}void loop() {}
يمكن العثور هنا على جهاز استقبال ومرسل صغير آخر يدعم المزيد من البروتوكولات .
بروتوكول FAST هو بروتوكول JVC معدل خاص بدون عنوان، مع تكافؤ ورأس أقصر . من المفترض أن يكون هناك استجابة سريعة للحدث الذي أرسل إطار البروتوكول على لوحة أخرى. يستغرق FAST 21 مللي ثانية للإرسال ويتم إرساله في فترة 50 مللي ثانية . لديه تكافؤ كامل 8 بت لاكتشاف الأخطاء.
توقيت البت يشبه JVC
الرأس أقصر، 3156 ميكروثانية مقابل 12500 ميكروثانية
لا يوجد عنوان وبيانات 16 بت، يتم تفسيرها على أنها أمر 8 بت وأمر مقلوب 8 بت، مما يؤدي إلى طول بروتوكول ثابت قدره (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 ميكروثانية أو 29 مللي ثانية.
يتم إرسال التكرارات كإطارات كاملة ولكن في فترة 50 مللي ثانية / بمسافة 21 مللي ثانية.
#define IR_SEND_PIN 3#include <IRremote.hpp>void setup() { sendFAST(11, 2); // أرسل الأمر 11 إلى الطرف 3 مع تكرارين.}void loop() {}
#define USE_FAST_PROTOCOL // استخدم بروتوكول FAST. لا يوجد عنوان وبيانات 16 بت، يتم تفسيرها على أنها أمر 8 بت وأمر مقلوب 8 بت #include "TinyIRSender.hpp"void setup() { sendFAST(3, 11, 2); // أرسل الأمر 11 إلى الطرف 3 مع تكرارين.}void loop() {}
يمكن استقبال بروتوكول FAST بواسطة IRremote وTinyIRReceiver.
يتم إنشاء الفاصل الزمني لعينة المستقبل البالغ 50 μs بواسطة جهاز توقيت. في العديد من المجالس ، يجب أن يكون هذا مؤقتًا للأجهزة. في بعض اللوحات التي يتوفر فيها مؤقت للبرامج ، يتم استخدام مؤقت البرامج.
يجب أن تدرك أن مؤقت الأجهزة المستخدم لاستلامه لا ينبغي استخدامه لـ analogWrite()
.
يستخدم التحكم في المحرك بشكل خاص وظيفة analogWrite()
وبالتالي ستوقف الاستلام إذا تم استخدامه على المسامير المشار إليها هنا.
على لوحات UNO وغيرها من لوحات AVR ، فإن مؤقت المتلقي هو نفس مؤقت Tone Timer. وبالتالي فإن الاستلام سيتوقف بعد أمر tone()
. انظر مثال مستلم كيفية التعامل معها ، أي كيفية استخدام IrReceiver.restartTimer()
.
تم تعيين Flag IRDATA_FLAGS_WAS_OVERFLOW
، إذا كان RAW_BUFFER_LENGTH
صغيرًا جدًا لجميع علامات البروتوكول ومساحاته. يمكن أن يحدث هذا على إطارات بروتوكول طويلة مثل تلك الموجودة في مكيف الهواء. يمكن أن يحدث أيضًا ، إذا كان RECORD_GAP_MICROS
أصغر من الفجوة الحقيقية بين إطار تكرار الإطار ، وبالتالي تفسير كلاهما كإطار واحد متتالي. الأفضل هو تفريغ التوقيت بعد ذلك ، لمعرفة أي سبب ينطبق عليه.
لن يعمل Irremote بشكل صحيح عند استخدام Neopixels (ويعرف أيضًا باسم WS2811/WS2812/WS2812B) أو المكتبات الأخرى التي تمنع المقاطعات لفترة أطول (> 50 µs).
سواء كنت تستخدم adafruit neopixel lib ، أو التضخيم ، يتم تعطيل المقاطعات في العديد من وحدات المعالجة المركزية المنخفضة مثل Arduinos الأساسي لمدة تزيد عن 50 µs. بدوره ، يمنع هذا معالج مقاطعة الأشعة تحت الحمراء من الركض عندما يحتاج إلى ذلك. انظر أيضا هذا الفيديو.
يتمثل أحد الحلول في انتظار أن يكون جهاز استقبال الأشعة تحت الحمراء في وضع الخمول قبل إرسال بيانات Neopixel باستخدام if (IrReceiver.isIdle()) { strip.show();}
.
هذا يمنع ما لا يقل عن كسر انتقال الأشعة تحت الحمراء وإعدام معدل التحديث في Neopixel - قد يعمل بشكل جيد.
هناك بعض الحلول الأخرى لهذا على معالجات أكثر قوة ، راجع هذه الصفحة من مارك ميرلين
مكتبة أخرى تعمل/تجميع فقط إذا قمت بإلغاء تنشيط خط IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
.
غالبًا ما يرجع ذلك إلى تعارض موارد المؤقت مع المكتبة الأخرى. يرجى الاطلاع أدناه.
تدعم هذه المكتبة مستقبلاً IR واحد فقط وكائن مرسل IR واحد (IRRECV و IRSEND) لكل وحدة المعالجة المركزية.
ومع ذلك ، نظرًا لأن الإرسال مهمة تسلسلية ، يمكنك استخدام setSendPin()
لتبديل الدبوس لإرساله ، وبالتالي محاكاة المرسل المتعدد.
يستخدم جهاز الاستقبال وظيفة مؤقتة تم تشغيلها ، والتي تقرأ قيمة إشارة الأشعة تحت الحمراء الرقمية من دبوس واحد كل 50 µs.
لذلك لا يمكن استخدام مستقبلات IR متعددة إلا عن طريق توصيل دبابيس الإخراج لعدة أجهزة استقبال IR معًا. تستخدم وحدات استقبال الأشعة تحت الحمراء داخليًا ترانزستور NPN كجهاز إخراج مع مقاوم 30K فقط لـ VCC. هذا هو في الأساس "جامع مفتوح" ويسمح بتوصيل دبابيس إخراج متعددة بدبوس إدخال Arduino.
ومع ذلك ، ضع في اعتبارك أن أي إشارة ضعيفة / مضطربة من أحد أجهزة الاستقبال سوف تتداخل أيضًا مع إشارة جيدة من جهاز استقبال آخر.
أفضل طريقة لزيادة قوة الأشعة تحت الحمراء المجانية هي استخدام 2 أو 3 ثنائيات الأشعة تحت الحمراء في السلسلة. يتطلب الصمام الثنائي 1.2 فولت عند 20 مللي أمبير أو 1.5 فولت عند 100 مللي أمبير حتى تتمكن من توفير ما يصل إلى 3 ثنائيات مع إخراج 5 فولت.
لتشغيل 2 الثنائيات مع 1.2 فولت و 20 مللي أمبير و 5 فولت ، اضبط المقاوم على: (5 فولت - 2.4 فولت) -> 2.6 فولت / 20 مللي أمبير = 130 Ω .
بالنسبة لـ 3 ثنائيات ، يتطلب 1.4 فولت / 20 مللي أمبير = 70 Ω .
قد يكون التيار الفعلي أقل منذ الخسارة عند دبوس AVR . على سبيل المثال 0.3 فولت في 20 مللي أمبير.
إذا كنت لا تحتاج إلى أكثر من 20 مللي أمبير ، فليست هناك حاجة لاستخدام ترانزستور خارجي (على الأقل لرقائق AVR).
على نانو Arduino الخاص بي ، أستخدم دائمًا مقاومًا من سلسلة 100 و LED IR؟
لتلقي ، الحد الأدنى من تردد ساعة وحدة المعالجة المركزية هو 4 ميغاهيرتز ، لأن المؤقت 50 µs ISR (روتين خدمة المقاطعة) يأخذ حوالي 12 µs على Atmega 16 ميغاهيرتز.
Tinyreceiver ، الذي لا يتطلب أي استطلاع ، يعمل مع 1 ميغاهيرتز.
للإرسال ، فإن البرنامج الافتراضي الذي تم إنشاؤه PWM لديه مشاكل في تشغيل AVR مع 8 MHz . يبلغ تردد PWM حوالي 30 بدلاً من 38 كيلو هرتز و RC6 غير موثوق به. يمكنك التبديل إلى توقيت PWM Timer بواسطة #define SEND_PWM_BY_TIMER
.
لم يتم تمكين وحدة فك ترميز بروتوكول Bang & Olufsen افتراضيًا ، أي إذا لم يتم تمكين بروتوكول بشكل صريح بواسطة #Define DECODE_<XYZ>
. يجب دائمًا تمكينه بشكل صريح بواسطة #define DECODE_BEO
. هذا لأنه يحتوي على تردد نقل الأشعة تحت الحمراء 455 كيلو هرتز وبالتالي يتطلب أجهزة استقبال مختلفة (TSOP7000).
ولأن إنشاء إشارة PWM 455 كيلو هرتز يتم تنفيذها حاليًا فقط لـ SEND_PWM_BY_TIMER
، فإن الإرسال يعمل فقط إذا تم تحديد SEND_PWM_BY_TIMER
أو USE_NO_SEND_PWM
.
لمزيد من المعلومات ، راجع ir_bangolufsen.hpp.
الأمثلة متوفرة في الملف> أمثلة> أمثلة من المكتبات المخصصة / Irremote.
من أجل تناسب الأمثلة على فلاش 8K من Attiny85 و Attiny88 ، فإن مكتبة Arduino Attinyserialout مطلوبة في وحدة المعالجة المركزية هذه.
انظر أيضًا DroneBot Workshop Simplereceiver و Simplesender.
أمثلة Simplereceiver و Simplesender هي نقطة انطلاق جيدة. يمكن اختبار مثال بسيط عبر الإنترنت باستخدام Wokwi.
يستخدم SimplereceiverforhashCodes فقط وحدة فك ترميز التجزئة. إنه يحول جميع إطارات الأشعة تحت الحمراء أطول من 6 إلى رمز التجزئة 32 بت ، وبالتالي تمكين من تلقي بروتوكولات غير معروفة.
انظر: http://www.righto.com/2010/01/using-ritrary-remotes-with-arduino.html
إذا كان حجم الكود أو استخدام المؤقت مهمًا ، فابحث عن هذه الأمثلة.
يستخدم مثال TinyReceiver مكتبة TinyiRreceiver التي لا يمكنها سوى تلقي NEC و NEC الممتدة و Onkyo وبروتوكولات سريعة ، ولكنها لا تتطلب أي مؤقت . يستخدمون مقاطعة تغيير دبوس على فك تشفير الطيران ، وهذا هو سبب اختيار البروتوكول المقيد.
يمكن اختبار Tinyreeceiver عبر الإنترنت مع Wokwi.
يستخدم مثال Tinysender مكتبة Tinyirsender التي يمكنها فقط إرسال NEC و Onkyo وبروتوكولات سريعة .
يرسل رموز بروتوكول NEC بتنسيق قياسي مع عنوان 8 بت وأمر 8 بتات كما في مثال Simplesender. لديها خيارات لإرسالها باستخدام NEC الموسعة ، Onkyo وبروتوكولات سريعة. يحفظ 780 بايت ذاكرة البرنامج و 26 بايت ذاكرة الوصول العشوائي مقارنة مع Simplesender ، والتي تفعل الشيء نفسه ، ولكن يستخدم مكتبة Irremote (وبالتالي أكثر مرونة).
إذا لم يكن البروتوكول NEC وحجم الرمز مهمًا ، فابحث عن هذا المثال.
يتلقى Sentreemo جميع البروتوكولات ويولد صافرة مع وظيفة Arduino Tone () على كل حزمة مستلمة.
تم اكتشاف الضغط الطويل لزر IR واحد (تلقي تكرارات متعددة لأمر واحد).
يعرض AllProtocolsonLCD بالإضافة إلى ذلك النتيجة القصيرة على 1602 LCD . يمكن توصيل شاشة LCD بالتوازي أو التسلسلي (I2C).
من خلال توصيل دبوس التصحيح بالأرض ، يمكنك فرض طباعة القيم الخام لكل إطار. تتم طباعة رقم دبوس دبوس التصحيح أثناء الإعداد ، لأنه يعتمد على اللوحة ونوع اتصال LCD.
يعمل هذا المثال أيضًا كمثال على كيفية استخدام Irremote و Tone () معًا .
يتلقى جميع البروتوكولات ويتخلص من الإشارة المستلمة في نكهات مختلفة بما في ذلك تنسيق Pronto. نظرًا لأن الطباعة تستغرق الكثير من الوقت ، فقد يتم تخطي أو تفسير إشارات التكرار على أنها غير معروفة.
يرسل جميع البروتوكولات المتاحة مرة واحدة على الأقل.
يوضح الاستلام أثناء إرسال .
سجل وتشغيل آخر إشارة الأشعة تحت الحمراء في Button Press. يتم إرسال إطارات الأشعة تحت الحمراء للبروتوكولات المعروفة بواسطة تشفير البروتوكول المناسب. يتم تخزين إطارات البروتوكول UNKNOWN
كبيانات أولية وإرسالها باستخدام sendRaw()
.
حاول فك تشفير كل إطار IR مع وحدة فك ترميز Universal Distatewidth ، وقم بتخزين البيانات وأرسلها على زر اضغط مع sendPulseDistanceWidthFromArray()
.
إذا لم يكن ذاكرة الوصول العشوائي أكثر من 2K ، فإن وحدة فك الترميز تقبل فقط فترات العلامة أو الفضاء حتى 2500 ميكروثانية لتوفير مساحة ذاكرة الوصول العشوائي ، وإلا فإنه يقبل فترات تصل إلى 10 مللي ثانية.
يتطلب تخزين البيانات لبروتوكول عرض المسافة 17 بايت. يتطلب مثال ReceiveAndsend 16 بايت لبيانات البروتوكول المعروفة و 37 بايت للبيانات الأولية لبروتوكول EGNEC.
بمثابة موسع ماكرو عن بعد IR. يستقبل بروتوكول Samsung32 وعند استلام إطار إدخال محدد ، فإنه يرسل عدة إطارات Samsung32 مع تأخيرات مناسبة بينهما. هذا بمثابة محاكاة Netflix-Key لتلفزيون Samsung H5273 القديم.
إطار لاستدعاء وظائف مختلفة لبرنامجك لرموز الأشعة تحت الحمراء المختلفة.
التحكم في ترحيل (متصل بدبوس الإخراج) مع جهاز التحكم عن بُعد.
مثال لفئة محددة المستخدم ، والتي تستخدم نفسها فئة IRRECV من Irremote.
مثال لإرسال رموز IR مكيف الهواء LG التي تتحكم فيها المدخلات التسلسلية.
من خلال استخدام الوظيفة bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
يمكنك التحكم في مكيف الهواء من قبل أي مصدر أمر آخر.
يحتوي الملف ACLG.H على وثائق الأمر لبروتوكول مكيف الهواء LG. استنادا إلى الهندسة العكسية لجهاز التحكم عن بُعد LG AKB73315611.
يمكن اختبار Ireceivertiminganalysis عبر الإنترنت مع Wokwi انقر فوق المتلقي أثناء تشغيل المحاكاة لتحديد رموز الأشعة تحت الحمراء الفردية.
مثال لاستلام وإرسال بروتوكول AEG / Elektrolux Hob2hood.
يحلل هذا المثال الإشارة التي تقدمها وحدة استقبال الأشعة تحت الحمراء. يمكن استخدام القيم لتحديد استقرار الإشارة المستلمة وكذلك تلميح لتحديد البروتوكول.
كما أنه يحسب قيمة MARK_EXCESS_MICROS
، وهي امتداد مدة العلامة (النبض) التي تم تقديمها بواسطة وحدة مستقبل الأشعة تحت الحمراء.
يمكن اختباره عبر الإنترنت مع Wokwi. انقر على جهاز الاستقبال أثناء تشغيل المحاكاة لتحديد رموز IR الفردية.
Traveemo + SendDemo في برنامج واحد. يوضح الاستلام أثناء إرسال . هنا ترى تأخير إخراج المتلقي (الأزرق) من إدخال الصمام الثنائي IR (أصفر).
جهاز استقبال بسيط
تبديل بسيط بواسطة مفتاح الأشعة تحت الحمراء 5
Tinyreceiver
recevertiminganalysis
جهاز الاستقبال مع إخراج LCD وبيان التبديل
يتحكم هذا المثال في مكتبة Arduino PWMMotorControl في الوظائف الأساسية لسيارة روبوت باستخدام مكتبة Irremote.
يتحكم في 2 قنوات حركية PWM ، محركان في كل قناة.
هنا يمكنك العثور على تعليمات لتجميع السيارات والرمز.
IR_ROBOTCAR مع TL1838 IR المتلقي IR موصولة في لوحة التوسع.
لا تفتح مشكلة دون اختبار بعض الأمثلة أولاً!
إذا كانت لديك مشكلة ، فيرجى نشر MCVE (مثال كامل للتحقق الكامل) الذي يوضح هذه المشكلة. تجربتي هي ، في معظم الأوقات ستجد المشكلة أثناء إنشاء هذا MCVE؟
استخدم كتل التعليمات البرمجية ؛ يساعدنا على مساعدتك عندما نتمكن من قراءة الكود الخاص بك!
لتخصيص المكتبة لمتطلبات مختلفة ، هناك بعض خيارات التجميع / وحدات الماكرو المتاحة.
يجب تعريف وحدات الماكرو هذه في برنامجك قبل الخط #include <IRremote.hpp>
لتنفيذ.
قم بتعديلها عن طريق تمكين / تعطيلها ، أو تغيير القيم إن أمكن.
اسم | القيمة الافتراضية | وصف |
---|---|---|
RAW_BUFFER_LENGTH | 200 | حجم العازلة من الإدخال الخام UINT16_T العازلة. يجب أن يكون حتى! إذا كانت صغيرة جدًا ، فسيتم تعيين علامة الفائض. 100 يكفي للبروتوكولات العادية التي تصل إلى 48 بت ، ولكن بالنسبة لمعظم بروتوكولات مكيف الهواء ، هناك حاجة إلى قيمة تصل إلى 750. استخدم مثال Trabump للعثور على أصغر قيمة لمتطلباتك. تتطلب قيمة 200 بايت ذاكرة وصول عشوائي. |
EXCLUDE_UNIVERSAL_PROTOCOLS | عاجز | يستبعد وحدة فك الترميز العالمية لبروتوكولات عرض مسافة النبض و Decodehash (وحدة فك ترميز خاصة لجميع البروتوكولات) من decode() . يحفظ ما يصل إلى 1000 بايت ذاكرة البرنامج. |
DECODE_<Protocol name> | الجميع | اختيار البروتوكول الفردي ليتم فك تشفيره. يمكنك تحديد بروتوكولات متعددة. انظر هنا |
DECODE_STRICT_CHECKS | عاجز | تحقق من الخصائص المطلوبة الإضافية لتوقيت البروتوكول مثل طول العلامة لبروتوكول علامة ثابت ، حيث يحدد طول المساحة قيمة البت. يتطلب ما يصل إلى 194 بايت إضافي لذاكرة البرنامج. |
IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK | عاجز | يحفظ ما يصل إلى 60 بايت من ذاكرة البرنامج و 2 بايت ذاكرة الوصول العشوائي. |
MARK_EXCESS_MICROS | 20 | يتم طرح mark_excess_micros من جميع العلامات وإضافتها إلى جميع المساحات قبل فك التشفير ، للتعويض عن تكوين الإشارة من وحدات مستقبل الأشعة تحت الحمراء المختلفة. |
RECORD_GAP_MICROS | 5000 | الحد الأدنى من الفجوة بين عمليات نقل الأشعة تحت الحمراء ، للكشف عن نهاية البروتوكول. يجب أن يكون أكبر من أي مساحة لبروتوكول على سبيل المثال مساحة رأس NEC 4500 µs. يجب أن تكون أصغر من أي فجوة بين أمر وتكرار ؛ مثل الفجوة إعادة الإرسال لسوني حوالي 24 مللي ثانية. ضع في اعتبارك أن هذا هو التأخير بين نهاية الأمر المستلم وبدء فك التشفير. |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | 50 إذا كان ذاكرة الوصول العشوائي <= 2K ، آخر 200 | تسمح قيمة 200 بفك تشفير المدة أو فترات الفضاء حتى 10 مللي ثانية. |
IR_INPUT_IS_ACTIVE_HIGH | عاجز | قم بتمكينه إذا كنت تستخدم جهاز استقبال RF ، والذي يحتوي على إشارة إخراج عالية نشطة. |
IR_SEND_PIN | عاجز | في حالة تحديد ، فإنه يقلل من حجم البرنامج ويحسن إرسال توقيت لـ AVR. إذا كنت ترغب في استخدام متغير لتحديد إرسال PIN على سبيل المثال مع setSendPin(uint8_t aSendPinNumber) ، يجب ألا تستخدم / تعطيل هذا الماكرو في المصدر الخاص بك. |
SEND_PWM_BY_TIMER | عاجز | يعطل Carrier PWM Generation في البرامج واستخدام الأجهزة PWM (بواسطة مؤقت). يتمتع بميزة توليد PWM أكثر دقة ، وخاصة واجب CYC
يوسع
معلومات إضافية
تطبيقات ذات صلة
نوصي لك
أخبار ذات صلة
الكل
|