محول الأشعة تحت الحمراء على Arduino

يتم دمج الأجهزة التي يتم التحكم فيها بواسطة جهاز تحكم عن بعد بالأشعة تحت الحمراء في حياتنا. في بعض الأحيان يتم فقدان جهاز التحكم عن بعد من التلفزيون أو نظام صوت قديم ، ومن المستحيل بالفعل شراء جهاز جديد من الشيخوخة. ليس من الممكن دائمًا طلب جهاز تحكم عن بُعد جديد ، لعمل استنساخ أيضًا ، ولكن إذا كان لديك متبرع أو معلومات حوله ، يمكنك عمل محول. سيتلقى مثل هذا المحول أوامر من وحدة تحكم وترجمتها إلى تنسيق وحدة تحكم أخرى.

بالنسبة إلى Arduino ، توجد مكتبة IRemote ممتازة تجعل بناء مجموعة متنوعة من أنظمة التحكم في الأشعة تحت الحمراء أمرًا سهلاً للغاية. ولكن عند حل مثل هذه المهمة البسيطة مثل محول ، هناك دائمًا مشاكل مثيرة للاهتمام لحلها.
لذا ، بالنسبة للمبتدئين ، نحتاج إلى مستقبل IR متكامل مثل TSOP312 أو الدرع المقابل لـ Arduino. لا تنس أن هناك الكثير من أجهزة استقبال الأشعة تحت الحمراء وأن عددها يختلف بشكل عشوائي. على سبيل المثال ، استخدمت عنصرًا معينًا لا يحمل اسمًا يطابق TSOP382 ولكن في حالة مخفضة وبدون مفتاح فاصل.

نحن بحاجة إلى الدائرة المجمعة لتلقي رموز الأوامر من كل من وحدات التحكم ، ولسوء الحظ ، فإن إزالة الأوامر من جهاز تم فقدان وحدة التحكم الخاصة به يعد أكثر تعقيدًا إلى حد ما. لا يزال بإمكانك العثور على جهاز التحكم عن بعد الخاص بالمتبرع ، استخدم جهاز التحكم عن بعد العالمي لتحديد رمز (لماذا تحتاج بعد ذلك إلى جهاز تحويل ، لأن نظام التحكم عن بعد قد ظهر؟) أو حاول استخدام البيانات من قواعد بيانات الإنترنت باستخدام رموز الأشعة تحت الحمراء. أسهل شيء بالنسبة لي هو استخدام تطبيق للأندرويد يحاكي جهاز التحكم عن بعد الذي أحتاجه.
لقراءة البيانات ، نستخدم المثال IRrecvDumpV2 من تسليم IRremote ، إذا كان جهاز التحكم عن بعد ينتمي إلى مكتبة معترف بها ، فأنت لا تحتاج إلى نتيجة مسح أولية ، على سبيل المثال ، على سبيل المثال ، تم التعرف على جهاز التحكم عن بعد من LG I كأنه Samsung ولم يعمل عندما حاولت إرسال أوامر عبر sendLG.
مثال على البيانات التي تم الحصول عليها تحت المفسد:
Encoding: SAMSUNG
Code: 34346897 (32 bits)
Timing[67]:
+4450, -4350 + 600, — 500 + 600, — 500 + 600, -1600
+ 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500
+ 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600
+ 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500
+ 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600
+ 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500
+ 600, — 500 + 550, -1650 + 550, — 550 + 550, — 550
+ 550, -1650 + 550, — 550 + 550, -1650 + 550, -1600
+ 600, -1600 + 600
unsigned int rawData[67] = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897
unsigned int data = 0x34346897;

إذا عرض الالتقاط الرسالة "رمز IR طويل جدًا. قم بتحرير IRremoteInt.h وزيادة RAWLEN ”يجب إصلاح المكتبة قليلاً - زيادة حجم المخزن المؤقت للأوامر. بالنسبة لجهاز التحكم عن بعد الذي تخطط للتحكم فيه ، يكفي معرفة رمز الأمر 32 بت ، يجدر الانتباه إلى أنه في بعض أجهزة التحكم عن بعد ، يختلف رمز المفتاح الذي تم الضغط عليه عن نفس الزر في الوضع المضغوط والمحرر. تتطلب هذه الأزرار قيمتين. نقوم بتقليل الرموز المستلمة إلى جدول مناسب لك. في نفس الجدول ، نقوم بحفظ الرموز الخاصة بجهاز التحكم عن بعد الخاص بالمتبرع بشكل خام.
نقوم بتوصيل LED بالأشعة تحت الحمراء بـ Arduino ونكتب برنامجًا بسيطًا يتلقى إشارة الأشعة تحت الحمراء برمز معين ويرسل رمزًا آخر من خلال LED. يتم اختيار المقاوم 82 لما هو في متناول اليد. بالنسبة لجهاز مدمج ، يمكنك زيادته بأمان إلى 200 أوم ، وإذا كان يجب أن يكون جهاز الإرسال بعيد المدى ، فسيتعين عليك تكميله بشلال ترانزستور بسيط ، وإلا فلن يكون التيار من Arduino كافياً.

إذا كان هناك رموز أوامر من كل من أجهزة التحكم عن بعد ، فإن كود محول الشفرة يأخذ الشكل التالي

void loop() {
if (irrecv.decode(&results)) {
    switch(results.value){
      case(0x845E5420):{
	irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
      }break;
    }
  }
  irrecv.resume();
  irrecv.enableIRIn();
}

قم بتشغيل الرسم ، املأه في Arduino. من الغريب ، بعد مرور أمر واحد ، وبعد ذلك يتم تجاهل جميع الأجهزة اللاحقة. لكي لا تعبث بالتصحيح ، نضيف ضوءًا وميضًا على الدبوس الثالث عشر إلى الدورة ونرى أنه بعد المحاولة الأولى لإرسال أمر ، يتجمد اللوحة. حسنًا ، هذا يعني أنه ليس كل شيء سلسًا جدًا في الاستخدام المتزامن لإرسال واستقبال إشارة الأشعة تحت الحمراء في مشروع واحد. بعد أن بحثت قليلاً في المؤقتات المستخدمة ، اتضح أنه نظرًا لأن كلا من الإرسال والاستقبال يستخدمان مؤقتًا مشتركًا ، بعد بدء الإرسال ، يجب أن ينتظر الكود حتى انتهاء الإرسال. يمكنك بشكل تجريبي إضافة تأخير لمدة نصف ثانية (تأخير (500)) وسيعمل كل شيء ، ولكن مع العلم أن البيانات الأولية في بلدنا هي عينات زمنية بالمللي ثانية ، يمكنك ببساطة إضافة وظيفة تأخير إرسال. حتى أن هناك وظيفة custom_delay_usec مناسبة في وحدة Irsend ،الذي استخدمته في البداية بشكل غير صحيح ، متناسيًا مضاعفة التأخير بعامل USECPERTICK من المكتبة (50 مللي ثانية).

void sendDelayed(unsigned int array[]){
  irsend.sendRaw(array, sizeof(array) / sizeof(array[0]), khz);
    int array_size = sizeof(array) / sizeof(array[0]);
    for(int i=0;i<array_size;i++){
      // Using usec, so multiply raw to usec
      irsend.custom_delay_usec(array[i]*USECPERTICK);
    }
}

يعمل هذا الرمز بشكل جيد ، في التبديل يكفي إدخال العدد الضروري لحالة الأزرار وسيعمل كل شيء. لكنها لم تكن هناك. تتم كتابة رموز RawData كمصفوفة int ، ولدينا نظام أساسي على متحكم دقيق. سيتم تناول ذاكرة المتغيرات بالفعل بواسطة خمسة أوامر بطول 100 عنصر. ولكن على جهاز التحكم عن بعد هناك 25 زرًا.
لا توجد مشكلة إذا كنت لا تستخدم التمثيل الخام للبيانات ، فهذه المكتبة لديها القدرة على إرسال أوامر إلى بروتوكولات معروفة ، على سبيل المثال ، بالنسبة لأجهزة التحكم عن بعد المتوافقة مع سوني ، فهي sendSony. لقد طبقت المكتبة بالفعل أجهزة تحكم عن بعد لمصنعين معروفين ، لكنني لم أستطع التعامل مع جهاز التحكم عن بُعد على الفور. لذلك ، ننتقل إلى طرق أكثر بدائية لتوفير الذاكرة التي ستساعد أولئك الذين لديهم أجهزة تحكم عن بعد غير قياسية تمامًا.
أول شيء يتبادر إلى الذهن هو تعيين rawData ليس int ، ولكن انتقل إلى بايت. جميع القيم في هذا المصفوفة هي نتيجة لقراءة إشارة الأشعة تحت الحمراء باستخدام جهاز توقيت بفترة 50 مللي ثانية ، وبما أن هذه البيانات هي مضاعفات 50 ، فإن تقسيمها على 50 لن يفقد أي شيء. سيكون الحد الأعلى محدودًا بـ 50 * 255 = 12750 ، وهذه 12 ثانية ، والتي ستكون كافية حتى لفك شفرة مورس على مهل - إذا ظهرت مثل هذه الحاجة.
تمت إضافة طريقة قبول وحدات البايت للإدخال إلى المكتبة ، مما أدى إلى خفض استهلاك الذاكرة إلى النصف

IRsend::sendRaw (byte buf[],  unsigned int len,  unsigned int hz)

يحتوي Arduino فقط على كيلوبايتين من الذاكرة للمتغيرات ، وهو بحد أقصى 40 أمرًا لكل 50 بايت. نحن بحاجة إلى المزيد من الذاكرة. وسنقوم باستخراج هذه الذاكرة من جزء الأوامر. يكفي حجز مجموعة واحدة من الحجم الكافي وملئها قبل إرسال سلسلة من المهام. في المجموع ، سيتم إنفاق حوالي 100 بايت على أمر واحد من مقطع الرمز ، ولكن بعد كل شيء ، لدينا ما لا يقل عن عشرة كيلوبايت من مساحة الرمز. لذلك بالنسبة إلى جهاز التحكم عن بعد العادي الذي يحتوي على مائة زر ، لدينا بالفعل ما يكفي.
من أجل عدم حشو المهام بالأيدي ، تمت إضافة مثال IRrecvDumpRawByte إلى المكتبة التي تعرض البيانات الأولية ليس فقط في شكل وحدات بايت ولكن أيضًا في شكل كتلة مهمة
مثال تحت المفسد
rawData[0]=87;rawData[1]=87;rawData[2]=10;rawData[3]=9;rawData[4]=10;rawData[5]=9;rawData[6]=10;rawData[7]=10;rawData[8]=10;rawData[9]=9;rawData[10]=10;rawData[11]=9;rawData[12]=10;rawData[13]=29;rawData[14]=10;rawData[15]=9;rawData[16]=10;rawData[17]=9;rawData[18]=10;rawData[19]=10;rawData[20]=10;rawData[21]=9;rawData[22]=10;rawData[23]=9;rawData[24]=10;rawData[25]=10;rawData[26]=10;rawData[27]=9;rawData[28]=10;rawData[29]=9;rawData[30]=10;rawData[31]=10;rawData[32]=10;rawData[33]=9;rawData[34]=10;rawData[35]=86;rawData[36]=10;rawData[37]=9;rawData[38]=11;rawData[39]=9;rawData[40]=10;rawData[41]=9;rawData[42]=10;rawData[43]=9;rawData[44]=10;rawData[45]=28;rawData[46]=10;rawData[47]=29;rawData[48]=10;rawData[49]=28;rawData[50]=10;rawData[51]=9;rawData[52]=10;rawData[53]=28;rawData[54]=10;rawData[55]=10;rawData[56]=10;rawData[57]=9;rawData[58]=10;rawData[59]=28;rawData[60]=10;rawData[61]=10;rawData[62]=10;rawData[63]=9;rawData[64]=10;rawData[65]=9;rawData[66]=10;rawData[67]=28;rawData[68]=10;rawData[69]=9;rawData[70]=11;rawData[71]=27;rawData[72]=10;rawData[73]=29;rawData[74]=10;rawData[75]=9;rawData[76]=10;

يوجد مثال على رسم مكتوب بالفعل يسمح لك بالتحكم في Samsung DVD HR-755 باستخدام جهاز التحكم عن بعد Daewoo R40A01 في الأمثلة تحت اسم DaewooR40A01toDVDHR755Transcoder. لم يقبل أحد طلب السحب لإضافة أمثلة إلى الفرع العام ، بحيث يمكنك تنزيل المكتبة المعدلة من الشوكة .
العديد من الصور مع مسجل إعادة بنائه











تحت القطة توجد صور لتكامل Arduino Nano داخل مسجل DVD هذا ، يشغل Arduino Mini بالتأكيد مساحة أقل بكثير ، ولكن نانو فقط كانت في متناول اليد. أخذت السلطة من لوحة التحكم. تم توصيل الإشارة من جهاز الاستقبال المضمن بـ Arduino ، وتم لحام جهاز استقبال IR آخر يقع على الجانب الآخر من جهاز الاستقبال الأول بالتوازي. مع نفس التثبيت المركب ، تم لحام LED LED إليه. من حيث المبدأ ، كان من الممكن تجنب هذا التكرار - ولكن الإشارة من مستقبل الأشعة تحت الحمراء مقلوبة - وبالتالي ، لا يمكنني توصيل إشارة TTL مباشرة إلى الجهاز - ولم أبدأ في عكس العاكس على المنطق أو الترانزستور.

على الرغم من حقيقة أن البيانات الخام في حالتي عملت بشكل جيد ، فقد أظهرت التجارب مع بقية المعدات المنزلية أنه لم تعمل جميع الإشارات الملتقطة بشكل صحيح عند محاولة التحكم في جهاز معين. لم يعمل أمر تشغيل مكيف الهواء ، على الرغم من أنه إذا تم تشغيله بالفعل ، فإن تغيير الأوضاع يعمل بشكل صحيح. كما رفض متحدث LG قبول الأوامر الأولية ، لكنه استجاب جيدًا لإرسال الرموز عبر sendSamsung. في الوقت نفسه ، تفاعلت خمسة أجهزة تلفزيون تم جمعها من المعارف بشكل جيد للغاية مع البيانات الأولية. لقد جربت الخيار بترددات إشارة مختلفة - لم يساعد. ربما تكمن المشكلة في معدل أخذ عينات الإشارة عند 50 مللي ثانية. استنادًا إلى قابلية تشغيل فرق بتنسيق Samsung باستخدام تقنية LG ، يجب إضفاء الطابع الرسمي على البروتوكول كوحدة منفصلة عن طريق القياس مع ir_LG.cpp ir_JVC.cpp ir_Dish.cpp ،اختيار جهاز ومعلمات ترميز الأصفار والأصفار لجهاز معين. ربما يكون تحليل كتابة مثل هذا البروتوكول بمثابة موضوع جيد للمقال.

حسنًا ، بالإضافة إلى ذلك ، فإن مكتبة IR الكبيرة الثانية لـ Arduino هي IRLib . لديها وظائف مماثلة ، حتى أنها تحتوي على وحدة جاهزة لتحليل بروتوكولات الأشعة تحت الحمراء لسطح المكتب. تم إجراء اختبار مقارنة سريع لقراءة البيانات الأولية التي لم تكشف عن اختلاف في العينات مقارنة مع IRemote. من الإيجابيات ، لدى IRLib بالفعل مثال لتحديد أي تردد يعمل مرسل IR. مثال على تطبيق Samsung36 فعليًا لتحليل بروتوكول باستخدام البيانات من الإنترنت. بالإضافة إلى ذلك ، تصف الوثائق بشكل مثالي كيفية توصيل مستقبلات الأشعة تحت الحمراء بالتسلسل وأكثر من ذلك بكثير. على الرغم من رأيي ، فإن IRemote أسهل بكثير في الفهم والاستخدام.

Source: https://habr.com/ru/post/ar391001/


All Articles