تعلم الوحدات · الدرس 2.13
مستقبل الأشعة تحت الحمراء (IR Receiver Module)
العودة إلى الدروسالتحكم بالأشعة تحت الحمراء
جهاز التحكم عن بُعد (IR Remote) وسيلة بسيطة للتحكم اللاسلكي. سنوصل مستقبل الأشعة تحت الحمراء (IR Receiver Module) إلى UNO ونستخدم مكتبته المخصصة. يضم البرنامج الرموز السداسية عشرية لجميع أزرار جهاز التحكم عن بُعد (IR Remote)، ويتعرف إلى الرموز وحالة الاستمرار في الضغط.
المكونات المطلوبة
- لوحة أردوينو (ELEGOO UNO R3).
- مستقبل الأشعة تحت الحمراء (IR Receiver Module).
- جهاز تحكم عن بُعد (IR Remote).
- ثلاثة أسلاك أنثى إلى ذكر (Female to Male DuPont Wires).

عمل المستقبل
يضم المستقبل شريحة وخلايا حساسة للأشعة تحت الحمراء. تستخدم هذه المستقبلات في مقدمة التلفاز ومشغلات DVD؛ ويرسل جهاز التحكم عن بُعد (IR Remote) نبضات من LED خاص به للتشغيل والإطفاء وتغيير القنوات. IR غير مرئية للعين، لذلك يتطلب اختبارها عناية إضافية.
بخلاف المقاومة الضوئية (CdS Photocell) CdS، المستقبل مرشح للأشعة تحت الحمراء ولا يجيد كشف الضوء المرئي. أما CdS فتستجيب للضوء الأصفر والأخضر أكثر من IR.
داخل المستقبل مزيل تضمين يبحث عن IR معدلة عند 38kHz؛ فلا يكفي ضوء IR ثابت، بل يجب أن يومض بهذا التردد. لا تضم CdS مزيل تضمين، وتكشف الترددات ومنها DC ضمن سرعة استجابتها، نحو 1kHz.
خرج المستقبل رقمي: LOW عند كشف إشارة IR بتردد 38kHz، أو HIGH بنحو 5V عند عدم كشفها. أما CdS فتتغير مقاومتها بحسب الضوء.

تبلغ الحساسية ذروتها عند 38kHz وطول موجة 940nm. يمكن استخدام نحو 35–41kHz لكن الحساسية والمدى ينخفضان بعيدًا عن الذروة. وكذلك تعمل أطوال 850–1100nm بكفاءة أقل من 900–1000nm. اختر LED متوافقًا وتحقق من بياناته، ويفضل 940nm، وهو غير مرئي.
توصيل المستقبل


توجد ثلاثة توصيلات: إشارة وتغذية وأرضي. العلامة G أرضي، و Y إشارة، و R تغذية 5V.
البرنامج و switch
قبل رفع البرنامج، تأكد من توفر مكتبة IRremote في بيئة Arduino IDE. إذا لم تكن مثبتة أو ظهرت رسالة تشير إلى مكتبة مفقودة، فاتبع خطوات التثبيت في قسم «ما هي المكتبات؟» وطرق تثبيتها في الدرس 1.5 «وميض LED وإضافة المكتبات».
افتح ملف البرنامج IR_Receiver_Module.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.
إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.
انقل RobotIRremote خارج مجلد المكتبات إذا كانت موجودة لتجنب التعارض، ويمكن إعادتها بعد انتهاء البرمجة. أعد تشغيل IDE بعد التثبيت.
يقارن switch(results.value) الرموز؛ مثل 0xFFA25D للزر POWER و 0xFFE21D للزر FUNC/STOP، ويطبع other button في الحالة الافتراضية.
switch…case
مثل if، تتحكم في مسار البرنامج. تقارن قيمة المتغير بالقيم في case وتنفذ الكتلة المطابقة. تخرج break من switch، وتكتب عادة في نهاية كل حالة. دونها يستمر التنفيذ في الحالات التالية، ويسمى ذلك falling-through، حتى break أو نهاية switch.
صيغة switch
switch (var) {
case label1:
// statements
break;
case label2:
// statements
break;
default:
// statements
break;
}var المتغير المطلوب مقارنته، من نوع int أو char. label1 و label2 قيم ثابتة من int أو char. لا تعيد البنية قيمة.
الكود
IR_Receiver_Module/IR.h
#ifndef _IR_H
#define _IR_H
#define RECEIVER 11
#define KEY_POWER (0xFFA25D)
#define KEY_FUNC_STOP (0xFFE21D)
#define KEY_VOL_ADD (0xFF629D)
#define KEY_FAST_BACK (0xFF22DD)
#define KEY_PAUSE (0xFF02FD)
#define KEY_FAST_FORWARD (0xFFC23D)
#define KEY_DOWN (0xFFE01F)
#define KEY_VOL_DE (0xFFA857)
#define KEY_UP (0xFF906F)
#define KEY_EQ (0xFF9867)
#define KEY_ST_REPT (0xFFB04F)
#define KEY_0 (0xFF6897)
#define KEY_1 (0xFF30CF)
#define KEY_2 (0xFF18E7)
#define KEY_3 (0xFF7A85)
#define KEY_4 (0xFF10EF)
#define KEY_5 (0xFF38C7)
#define KEY_6 (0xFF5AA5)
#define KEY_7 (0xFF42BD)
#define KEY_8 (0xFF4AB5)
#define KEY_9 (0xFF52AD)
#define KEY_REPEAT (0xFFFFFFFF)
#define KEY_NUM 21
#define REPEAT 22
unsigned long keyValue[]={KEY_POWER,KEY_FUNC_STOP,KEY_VOL_ADD,KEY_FAST_BACK,KEY_PAUSE,KEY_FAST_FORWARD,
KEY_DOWN,KEY_VOL_DE,KEY_UP,KEY_EQ,KEY_ST_REPT,KEY_0,KEY_1,KEY_2,KEY_3,KEY_4,KEY_5,
KEY_6,KEY_7,KEY_8,KEY_9,KEY_REPEAT};
char keyBuf[][15]={"POWER","FUNC/STOP","VOL+","FAST BACK","PAUSE","FAST FORWARD","DOWN","VOL-",
"UP","EQ","ST/REPT","0","1","2","3","4","5","6","7","8","9"};
#endif
IR_Receiver_Module/IR_Receiver_Module.ino
//www.elegoo.com
//2020.3.12
#include "IRremote.h"
#include "IR.h"
IRrecv irrecv(RECEIVER); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
void setup() {
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn();
}
void loop()
{
int tmpValue;
if (irrecv.decode(&results)) // have we received an IR signal?
{
for (int i = 0; i < 23; i++)
{
if ((keyValue[i] == results.value) && (i<KEY_NUM))
{
Serial.println(keyBuf[i]);
tmpValue = results.value;
}
else if(REPEAT==i)
{
results.value = tmpValue;
}
}
irrecv.resume(); // receive the next value
}
//The implementation effect of the above program is
//the same as that of the following, but it is more concise
// switch(results.value)
// {
// case 0xFFA25D: Serial.println("POWER"); break;
// case 0xFFE21D: Serial.println("FUNC/STOP"); break;
// case 0xFF629D: Serial.println("VOL+"); break;
// case 0xFF22DD: Serial.println("FAST BACK"); break;
// case 0xFF02FD: Serial.println("PAUSE"); break;
// case 0xFFC23D: Serial.println("FAST FORWARD"); break;
// case 0xFFE01F: Serial.println("DOWN"); break;
// case 0xFFA857: Serial.println("VOL-"); break;
// case 0xFF906F: Serial.println("UP"); break;
// case 0xFF9867: Serial.println("EQ"); break;
// case 0xFFB04F: Serial.println("ST/REPT"); break;
// case 0xFF6897: Serial.println("0"); break;
// case 0xFF30CF: Serial.println("1"); break;
// case 0xFF18E7: Serial.println("2"); break;
// case 0xFF7A85: Serial.println("3"); break;
// case 0xFF10EF: Serial.println("4"); break;
// case 0xFF38C7: Serial.println("5"); break;
// case 0xFF5AA5: Serial.println("6"); break;
// case 0xFF42BD: Serial.println("7"); break;
// case 0xFF4AB5: Serial.println("8"); break;
// case 0xFF52AD: Serial.println("9"); break;
// case 0xFFFFFFFF: Serial.println(" REPEAT");break;
// default:
// Serial.println(" other button ");
// }// End Case
}