يحتوي هذا المقال على روابط تسويق بالعمولة مُعلَّمة بعلامة *. بصفتي شريكًا في برنامج Amazon Associates، أربح من عمليات الشراء المؤهلة، دون أي تكلفة إضافية عليك. يساعد ذلك على إبقاء الشروحات مجانية.
ملخص سريع
باستخدام المستقبِل KY-022 ومكتبة IRremote، تقرأ لوحة Arduino Uno إشارات جهاز التحكم عن بُعد المرفق بالطقم أو جهاز تحكم التلفاز. في المرحلة 1 يُشغَّل LED ويُطفأ بزر واحد من جهاز التحكم. وفي المرحلة 2 يُضاف مزلاج باب يحرّكه محرك سيرفو وله مزود طاقة خاص بجهد 5 V.
يتكون هذا الشرح عن التحكم بلوحة Arduino عبر جهاز التحكم عن بُعد IR من مرحلتين:
- المرحلة 1 (LED فقط): يقرأ المستقبِل KY-022 إشارات جهاز التحكم عن بُعد IR، ويبدّل زر واحد حالة LED موصول بالطرف D8 (كل ضغطة تشغّله أو تطفئه).
- المرحلة 2 (LED + باب بمحرك سيرفو): يجعل زرّان إضافيان محرك السيرفو SG90 الموصول بالطرف D9 يفتح مزلاج الباب ويغلقه. يعمل السيرفو من مزود طاقة خارجي بجهد 5 V، ويعرض LED حالة الباب: مضاء = مفتوح، مطفأ = مغلق.
إذا كنت قد بنيت مشروع قفل الباب بكلمة مرور باستخدام Arduino، فيمكنك إعادة استخدام مزلاج الباب منه هنا. في هذا المشروع أخذت باب الاختبار من ذلك المشروع، ووضعت جهاز التحكم عن بُعد المرفق بالطقم ذا 21 زرًا مكان لوحة المفاتيح. ويشرح درس محرك السيرفو مع عصا التحكم وشاشة OLED طريقة عمل محركات السيرفو.
كيف يعمل النظام
- يرسل جهاز التحكم عن بُعد إشارة بالأشعة تحت الحمراء (IR). عند الضغط على زر، يُشغَّل LED الأشعة تحت الحمراء داخل جهاز التحكم ويُطفأ 38,000 مرة في الثانية (الموجة الحاملة بتردد 38 kHz). لا يستجيب المستقبِل إلا للضوء الذي يومض بهذا التردد، لذلك يحجب معظم الضوء الثابت الصادر عن الشمس ومصابيح الغرفة. يُسمّى نمط دفعات الموجة الحاملة وفترات التوقف الناتج عن ضغطة زر واحدة إطارًا (Frame)، وهو يرمّز الزر المضغوط. تستخدم معظم أجهزة التحكم المرفقة بالأطقم بروتوكول NEC، وهو تنسيق توقيت يرسل عنوانًا (أي جهاز) وأمرًا (أي زر).
- يفك المستقبِل KY-022 تضمين الإشارة. فهو يزيل الموجة الحاملة ذات التردد 38 kHz ويُخرج سلسلة من النبضات الرقمية على طرفه OUT، الموصول بالطرف D2 في Arduino.
- تفك مكتبة IRremote ترميز الإطار. تقيس المكتبة طول كل نبضة في الخلفية، مستخدمةً مقاطعة المؤقت (Timer Interrupt)، وهي إشارة عتادية توقف البرنامج الجاري لحظيًا لتنفيذ إجراء قصير، فلا يضطر البرنامج إلى انتظار الإشارة. تتعرف المكتبة على البروتوكول وتخزّن قيمتين: command (رمز الزر القصير) و decodedRawData (الإطار الكامل بطول 32 بت). كما تميّز إطارات التكرار التي يرسلها جهاز التحكم ما دمت تضغط على الزر.
- تنفّذ لوحة Arduino الأمر. يقارن برنامج Arduino (Sketch) الخاص بك الأمر المستلم بالقيم المخزّنة. في المرحلة 1، يؤدي التطابق إلى تبديل حالة LED. وفي المرحلة 2، يحرّك الزران OPEN و CLOSE السيرفو إلى الزاوية المستهدفة، ويتبع LED حالة الباب.
المكونات المطلوبة
القطع المعلَّمة بـ «نعم» في عمود المرحلة 1 هي كل ما تحتاجه للمرحلة 1. أضف القطع المتبقية للمرحلة 2.
| المكوّن | المرحلة 1 (LED فقط) | المرحلة 2 (باب السيرفو) | ملاحظات |
|---|---|---|---|
| Arduino Uno (أو Nano) | نعم | نعم | تصلح أي لوحة مزودة بالمتحكم الدقيق ATmega328 (الشريحة الموجودة في Uno و Nano) |
| مستقبِل IR: وحدة KY-022 (مستقبِل VS1838B مركّب على لوحة صغيرة) | نعم | نعم | وحدة بـ 3 أطراف؛ وصّلها وفق العلامات المطبوعة عليها (S، +، -)؛ ويتصل S (OUT) بالطرف D2 |
| جهاز التحكم عن بُعد IR (المرفق بالطقم) | نعم | نعم | تصلح معظم أجهزة التحكم التي تعمل ببروتوكول NEC |
| LED (أي لون) | نعم | نعم | قياسي بقطر 5 mm، بأطراف للتركيب عبر الثقوب |
| مقاومة 220 Ω | نعم | نعم | مقاومة لتحديد تيار LED |
| لوحة التجارب (Breadboard) وأسلاك التوصيل (Jumper) | نعم | نعم | تكفي لوحة تجارب (Breadboard) بنصف الحجم |
| محرك سيرفو صغير (SG90 أو MG90S) | لا | نعم | SG90 للأبواب الخفيفة |
| مزود طاقة خارجي 5 V (1 A أو أكثر) | لا | نعم | يمنع انخفاضات الجهد (Brownouts)، وهي هبوطات قصيرة في الجهد تعيد تشغيل Arduino؛ لا تغذِّ السيرفو من الطرف 5 V في Arduino |
| مزلاج الباب | لا | نعم | بالطباعة ثلاثية الأبعاد (3D)، أو من السلك، أو من الورق المقوّى |
يختلف ترتيب الأطراف في المستقبِل VS1838B أو TSOP1838 المنفرد (من دون لوحة) عن ترتيبها في وحدة KY-022، فهو OUT ثم GND ثم VCC عند النظر إليه من الأمام. استخدمتُ أنا نسخة الوحدة.
مزلاج الباب في مشروعي هو مزلاج أسطواني (Barrel Bolt)، أي لسان معدني ينزلق داخل ماسكة، مثبّت على باب اختبار من الخشب الرقائقي داخل إطار من قطاعات الألمنيوم (Aluminum Profile). يستقر السيرفو SG90 في حامل بلاستيكي مثبّت على الباب بالبراغي، ويربط سلك مثنيّ ذراعَ السيرفو (Horn)، وهو الذراع البلاستيكية على عمود السيرفو، بمقبض المزلاج. ويشير التعليق “tune to your linkage” في الكود إلى هذا السلك.
المرحلة 1: التحكم في LED
توصيلات LED
وصّل مستقبِل IR و LED بلوحة Arduino كما في الجدول والمخطط. يتصل الطرف OUT في مستقبِل IR بالطرف D2، وهو الطرف الذي تستخدمه أمثلة IRremote على Uno. ويصلح أي طرف رقمي، لأنك تمرّر رقم الطرف إلى IrReceiver.begin(). ويتصل أنود LED عبر مقاومة 220 Ω بالطرف D8.
| المكوّن | الطرف / نقطة التوصيل | يتصل بـ |
|---|---|---|
| مستقبِل IR (KY-022) | OUT (S) | Arduino D2 |
| مستقبِل IR (KY-022) | VCC (+) | Arduino 5 V |
| مستقبِل IR (KY-022) | GND (-) | Arduino GND |
| أنود LED (الساق الطويلة) | الأنود (+) | مقاومة 220 Ω، ثم Arduino D8 |
| كاثود LED (الساق القصيرة) | الكاثود (-) | Arduino GND |
نصيحة للمبتدئين: قطبية LED. الساق الأطول في LED هي الأنود (الموجب)، والساق الأقصر هي الكاثود (السالب، ويُميَّز غالبًا بحافة مسطحة على جسم LED). يمكن وضع المقاومة 220 Ω على أي جانب من LED، لأنها تحدّ التيار فقط لحماية LED وطرف Arduino. إذا لم يُضِئ LED، فاقلبه.

الخطوة 1: تثبيت مكتبة IRremote
افتح Arduino IDE وانتقل إلى Tools > Manage Libraries. ابحث عن IRremote من تطوير Arduino-IRremote وثبّت أحدث إصدار. تستخدم البرامج واجهة IRremote 4.x البرمجية (IRremote.hpp، IrReceiver.begin())، وقد اختبرتها بالإصدار 4.5.0.
يبدأ تشغيل المستقبِل بسطرين:
#include <IRremote.hpp> // ... IrReceiver.begin(pin, ENABLE_LED_FEEDBACK);
يجعل ENABLE_LED_FEEDBACK مصباح LED المدمج في اللوحة (الطرف 13) يومض كلما وصلت إشارة IR، فترى أن المستقبِل يعمل. وفي البرامج، يطلب IrReceiver.resume() من المكتبة الاستماع إلى الإشارة التالية، ويخزّن F(“…”) النصوص الثابتة في ذاكرة الفلاش (ذاكرة البرنامج) بدلًا من RAM (ذاكرة العمل الصغيرة المخصصة للمتغيرات).
الخطوة 2: قراءة أكواد جهاز التحكم لديك
قد ترسل أجهزة تحكم متطابقة في الشكل أكوادًا مختلفة. قيم المثال في البرامج (0x45، 0x46، 0x47) مأخوذة من جهاز تحكم شائع مرفق بالأطقم ذي 21 زرًا، لذا اقرأ أكواد جهازك قبل استخدامها. تشير البادئة 0x إلى عدد ست عشري (بالأساس 16)، وهو التنسيق الذي يطبعه برنامج المسح.
ارفع برنامج المسح أدناه إلى اللوحة وافتح الشاشة التسلسلية (Serial Monitor)، وهي النافذة في Arduino IDE التي تعرض النصوص المرسلة من اللوحة عبر USB. يستخدم البرنامج سرعة 115200 baud (سرعة النقل بالبت في الثانية) بدلًا من القيمة الشائعة 9600، فتستغرق طباعة كل سطر وقتًا أقل. اضبط Serial Monitor على القيمة نفسها، وإلا فستظهر رموز غير مقروءة. اضغط كل زر في جهاز التحكم عدة مرات.
// IR Code Scanner (IRremote >= 3.x)
#include <IRremote.hpp>
const uint8_t IR_RECEIVE_PIN = 2;
void setup(){
Serial.begin(115200);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println(F("IR Scanner ready. Press remote buttons..."));
}
void loop(){
if(IrReceiver.decode()){
IrReceiver.printIRResultShort(&Serial); // concise one-liner
Serial.print(F("Protocol=")); Serial.print(IrReceiver.decodedIRData.protocol);
Serial.print(F(" Command=0x"));Serial.print(IrReceiver.decodedIRData.command, HEX);
Serial.print(F(" RAW=0x")); Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.resume();
}
}
ما الذي يجب ملاحظته: تطبع كل ضغطة سطرين. يأتي الأول من printIRResultShort() ويذكر اسم البروتوكول، مثل NEC. أما الثاني فهو سطر البرنامج نفسه: يعرض Protocol= البروتوكول كرقم، و Command= رمز الزر، و RAW= الإطار الكامل.
دوّن قيمة command (بعد Command=) لكل زر. في أغلب الحالات تبقى القيمة نفسها مع كل ضغطة. إذا تغيرت قيمة command بين ضغطات الزر نفسه، أو أظهرت كل الأزرار 0x00، فدوّن قيمة RAW (بعد RAW=) بدلًا منها. في معظم أجهزة التحكم، تصلح قيمة RAW بديلًا احتياطيًا.
اختر زرًا واحدًا لتبديل حالة LED. وللمرحلة 2، اختر زرين آخرين لـ OPEN و CLOSE. دوّن القيم الثلاث كلها.
الخطوة 3: برنامج LED
في البرنامج، ضع قيمة command التي حصلت عليها من المسح مكان قيمة المثال 0x45 في CMD_LED_TOGGLE. إذا كانت قيمة command في جهاز التحكم لديك غير مستقرة، فألغِ التعليق عن سطري RAW كليهما (الثابت وسطر else if). لإلغاء التعليق عن سطر، احذف // من بدايته. الصق قيمة RAW الخاصة بك في الثابت. تطبع IRremote 3.x والإصدارات الأحدث قيم RAW بترتيب بتات مختلف عن الدروس القديمة (0xBA45FF00 بدلًا من 0x00FFA25D للزر نفسه)، لذا انسخ القيمة من مخرجات برنامج المسح لديك.
// IR remote: toggle an LED (IRremote 4.x)
#include <IRremote.hpp>
const uint8_t IR_RECEIVE_PIN = 2; // IR OUT → D2
const uint8_t LED_PIN = 8; // LED → 220Ω → D8
// Replace with your scanned value:
const uint32_t CMD_LED_TOGGLE = 0x45; // example NEC command
// Alternative if command is unstable:
// const uint32_t RAW_LED_TOGGLE = 0xBA45FF00; // example 32-bit RAW
bool ledOn = false;
void setLED(bool on){
ledOn = on;
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
void setup(){
pinMode(LED_PIN, OUTPUT);
setLED(false);
Serial.begin(115200);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println(F("LED-only mode. Press your toggle key."));
}
void loop(){
if(!IrReceiver.decode()) return;
if(!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)){
uint32_t cmd = IrReceiver.decodedIRData.command;
uint32_t raw = IrReceiver.decodedIRData.decodedRawData;
if (cmd == CMD_LED_TOGGLE) setLED(!ledOn);
// else if (raw == RAW_LED_TOGGLE) setLED(!ledOn); // use if needed
Serial.print(F("[IR] cmd=0x")); Serial.print(cmd, HEX);
Serial.print(F(" raw=0x")); Serial.println(raw, HEX);
}
IrReceiver.resume();
}
كيف يعمل برنامج LED
- IRDATA_FLAGS_IS_REPEAT: ما دمت تضغط على زر، يرسل جهاز التحكم العامل ببروتوكول NEC إطار تكرار قصيرًا كل 108 ms تقريبًا. ومن دون ترشيح، ستبدّل ضغطة طويلة واحدة حالة LED مرات عديدة. يتجاهل السطر if(!(IrReceiver.decodedIRData.flags وIRDATA_FLAGS_IS_REPEAT)) إطارات التكرار هذه، فلا تُحتسب إلا الضغطة الأولى.
- command مقابل decodedRawData: يحمل الحقل command رمز الزر القصير، وهو بايت واحد في NEC. ويحمل الحقل decodedRawData الإطار الكامل بطول 32 بت متضمنًا العنوان. استخدم command ما دام مستقرًا مع جهاز التحكم لديك، وارجع إلى decodedRawData عندما تتغير قيمة command أو تكون صفرًا.
- setLED(): الدالة setLED() هي الموضع الوحيد الذي يكتب على طرف LED ويحدّث ledOn، لذا يتطابق المتغير دائمًا مع حالة LED الفعلية. وتعتمد المرحلة 2 على ذلك.
المرحلة 2: إضافة باب السيرفو
احتفظ بالتوصيلات ومنطق LED من المرحلة 1، وأضف السيرفو وزرين آخرين من جهاز التحكم، هما OPEN و CLOSE.
توصيلات السيرفو
أضف التوصيلات الواردة في الجدول إلى دائرة المرحلة 1. تتصل إشارة السيرفو بالطرف D9، المعلَّم في الجدول بـ PWM (تعديل عرض النبضة). هذه الإشارة نبضة متكررة، وطول النبضة يحدد زاوية السيرفو.
| المكوّن | الطرف / السلك | يتصل بـ |
|---|---|---|
| السيرفو (SG90) | الإشارة (برتقالي/أصفر) | Arduino D9 (PWM) |
| السيرفو (SG90) | VCC (أحمر) | مزود الطاقة الخارجي 5 V (+) |
| السيرفو (SG90) | GND (بني/أسود) | مزود الطاقة الخارجي 5 V (-) |
| GND لمزود الطاقة الخارجي | GND | GND في Arduino (أرضي مشترك) |
لماذا مزود طاقة خارجي بجهد 5 V: عند التغذية عبر USB، يستطيع الطرف 5 V في Arduino توفير نحو 500 mA إجمالًا. يسحب SG90 نحو 100 mA عندما يتحرك بحرية، ويصل إلى نحو 650 mA عندما يُعاق عن الحركة (تيار التوقف). تؤدي قفزات التيار هذه إلى هبوط جهد خط 5 V في Arduino، مما يعيد تشغيل اللوحة ويشوّش استقبال IR ويجعل السيرفو يرتجف. استخدم مزود طاقة منفصلًا بجهد 5 V وتيار مقنَّن 1 A أو أكثر، ووصّل GND الخاص به بـ GND في Arduino. فمن دون هذا الأرضي المشترك لا يكون لإشارة D9 جهد مرجعي، فلا يستجيب السيرفو أو يتحرك بشكل عشوائي.

البرنامج المدمج: LED + باب السيرفو
ضع قيم command الثلاث التي حصلت عليها من المسح مكان قيم المثال في CMD_LED_TOGGLE و CMD_OPEN و CMD_CLOSE (0x45، 0x46، 0x47). إذا احتاج جهاز التحكم لديك إلى بديل RAW، فألغِ التعليق عن ثوابت RAW الثلاثة والصق قيم RAW الخاصة بك. حوّل فحوص command الثلاثة إلى تعليقات (ضع // أمام كل سطر) وألغِ التعليق عن فحوص RAW الثلاثة. إذا كان النوعان مفعّلين وتطابق كلاهما، فسيبدّل زر التبديل حالة LED مرتين ولن يبدو أن شيئًا قد حدث.
// Arduino IR remote LED + Servo Door (IRremote >= 3.x)
#include <IRremote.hpp>
#include <Servo.h>
const uint8_t IR_RECEIVE_PIN = 2; // IR OUT → D2
const uint8_t LED_PIN = 8; // LED → 220Ω → D8
const uint8_t SERVO_PIN = 9; // Servo signal → D9
// === Replace with your scanned values ===
const uint32_t CMD_LED_TOGGLE = 0x45; // LED toggle
const uint32_t CMD_OPEN = 0x46; // door open
const uint32_t CMD_CLOSE = 0x47; // door close
// RAW fallback (uncomment if needed):
// const uint32_t RAW_LED_TOGGLE = 0xBA45FF00;
// const uint32_t RAW_OPEN = 0xB946FF00;
// const uint32_t RAW_CLOSE = 0xB847FF00;
const int OPEN_ANGLE = 20; // tune to your linkage
const int CLOSE_ANGLE = 90;
const int STEP_DEG = 2;
const int STEP_MS = 10;
Servo door;
bool ledOn = false;
int curAngle = CLOSE_ANGLE;
void setLED(bool on){
ledOn = on;
digitalWrite(LED_PIN, on ? HIGH : LOW);
}
void moveServoTo(int target){
int dir = (target > curAngle) ? 1 : -1;
while(curAngle != target){
curAngle += dir * STEP_DEG;
if((dir > 0 && curAngle > target) || (dir < 0 && curAngle < target)) curAngle = target;
door.write(curAngle);
delay(STEP_MS);
}
}
void setDoorOpen(bool open){
moveServoTo(open ? OPEN_ANGLE : CLOSE_ANGLE);
setLED(open); // LED shows door status: ON=open, OFF=closed
}
void setup(){
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
setLED(false);
door.attach(SERVO_PIN);
door.write(CLOSE_ANGLE);
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println(F("LED + Servo mode. Use TOGGLE / OPEN / CLOSE keys."));
}
void loop(){
if(!IrReceiver.decode()) return;
if(!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)){
uint32_t cmd = IrReceiver.decodedIRData.command;
uint32_t raw = IrReceiver.decodedIRData.decodedRawData;
if (cmd == CMD_LED_TOGGLE) setLED(!ledOn);
else if (cmd == CMD_OPEN) setDoorOpen(true);
else if (cmd == CMD_CLOSE) setDoorOpen(false);
// RAW fallback:
// if (raw == RAW_LED_TOGGLE) setLED(!ledOn);
// if (raw == RAW_OPEN) setDoorOpen(true);
// if (raw == RAW_CLOSE) setDoorOpen(false);
}
IrReceiver.resume();
}
كيف يعمل برنامج باب السيرفو
- OPEN_ANGLE و CLOSE_ANGLE: يحدد هذان الثابتان مقدار دوران السيرفو لوضعي الفتح والإغلاق. القيمتان الافتراضيتان (20° و 90°) مجرد نقطتي بداية. أما للمزلاج الأسطواني في الفيديو الخاص بي فاستخدمت 0° للفتح و 110° للإغلاق. تعتمد القيم الصحيحة على المزلاج لديك، لذا اضبطها باتباع تسلسل الاختبار أدناه.
- الحركة بخطوات صغيرة (moveServoTo): الحركة بخطوات مقدارها 2° مع فترات توقف 10 ms توزّع مسار الحركة البالغ 70° بين 20° و 90° على نحو 0.35 s. يقلل ذلك قفزة التيار عند البدء ويجعل حركة الباب أهدأ. زِد STEP_DEG لحركة أسرع، وأنقصه لحركة أنعم.
- يعرض LED حالة الباب: تستدعي setDoorOpen() الدالة setLED() بعد أن يتحرك السيرفو. بعد كل أمر OPEN أو CLOSE يكون LED مضاءً عند الفتح ومطفأً عند الإغلاق. يظل زر تبديل LED يعمل، لكن LED عندها لن يطابق حالة الباب حتى أمر OPEN أو CLOSE التالي.
كيفية اختبار المشروع وضبطه
- اختبر برنامج المسح أولًا. ارفع برنامج المسح من الخطوة 2 وافتح Serial Monitor على سرعة 115200 baud. اضغط كل زر في جهاز التحكم وتأكد من أن المخرجات ثابتة. إذا لم يظهر شيء، فافحص التوصيلات، وخاصة توصيل OUT في مستقبِل IR بالطرف D2.
- افحص برنامج LED. ارفع برنامج LED من الخطوة 3 واضغط زر التبديل الذي اخترته. يُضيء LED الموصول بالطرف D8 مع الضغطة الأولى وينطفئ مع الثانية. يعرض Serial Monitor قيم command بعد فك ترميزها، فيمكنك مقارنتها بنتائج المسح.
- اختبر السيرفو من دون الباب. قبل تركيب السيرفو على مزلاج الباب، ارفع البرنامج المدمج واختبره والسيرفو حرّ على الطاولة. اضغط OPEN و CLOSE وتأكد من أن السيرفو يدور بين الزاويتين. يجنّبك ذلك تكسّر أسنان التروس إذا كانت الزوايا خاطئة.
- اضبط الزوايا. عدّل OPEN_ANGLE و CLOSE_ANGLE حتى يصل ذراع السيرفو (Horn) إلى الوضعين الصحيحين لمزلاج بابك. أعد رفع البرنامج واختبره بعد كل تغيير، بمقدار 5 إلى 10 درجات في كل مرة.
- ركّب مزلاج الباب. اربط ذراع السيرفو بمزلاج الباب. شغّل البرنامج المدمج وتأكد من أن الباب يُفتح ويُغلق وأن LED يعرض حالته.
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب المحتمل | الحل |
|---|---|---|
| لا تظهر أي مخرجات تسلسلية | سرعة baud خاطئة أو خطأ في التوصيلات | اضبط Serial Monitor على 115200. تأكد من أن OUT في مستقبِل IR موصول بالطرف D2 وأن الوحدة تتلقى 5 V و GND. |
| زر جهاز التحكم لا يستجيب بشكل موثوق | إشارة ضعيفة، أو مسافة أو زاوية غير مناسبة | وجّه جهاز التحكم نحو المستقبِل من مسافة لا تزيد على 3 m. أبعِد مصادر الأشعة تحت الحمراء القوية (ضوء الشمس وبعض المصابيح) التي قد تُشبِع المستقبِل. |
| قيمة command تتغير بشكل غير متوقع | عدم تطابق البروتوكول أو إشارة مشوشة | استخدم البديل RAW (decodedRawData) بدلًا من command. فبعض أجهزة التحكم تستخدم بروتوكولات تتغير فيها قيمة command. |
| LED لا تتبدل حالته | قيمة command خاطئة في البرنامج | افتح برنامج المسح، واضغط الزر، وقارن قيمة command المطبوعة بالقيمة الموجودة في برنامج LED. وافحص قطبية LED (واقلبه إذا لزم الأمر). |
| الضغطات الطويلة تسبب تبديلًا متكررًا | غياب ترشيح إطارات التكرار | أبقِ فحص IRDATA_FLAGS_IS_REPEAT في البرنامج. |
| السيرفو يرتجف أو يطنّ | طاقة غير كافية أو إشارة مشوشة | استخدم مزود الطاقة الخارجي 5 V مع أرضي مشترك، راجع قسم توصيلات السيرفو. اجعل سلك الإشارة قصيرًا وبعيدًا عن كابلات الطاقة. |
| السيرفو لا يتحرك إطلاقًا | طرف خاطئ، أو انعدام الطاقة، أو أمر خاطئ | تأكد من أن سلك الإشارة موصول بالطرف D9، وأن مزود الطاقة الخارجي يعمل وأن GND الخاص به موصول بـ GND في Arduino. وقارن قيمتي OPEN و CLOSE بمخرجات برنامج المسح. |
| السيرفو يتحرك في الاتجاه الخاطئ | قيمتا OPEN_ANGLE و CLOSE_ANGLE معكوستان | بادِل بين القيمتين في البرنامج وأعد رفعه. |
| لوحة Arduino تعيد التشغيل عندما يتحرك السيرفو | السيرفو يسحب تياره من Arduino | استخدم مزود الطاقة الخارجي 5 V، راجع قسم توصيلات السيرفو. لا يتحمل الطرف 5 V في Arduino قفزات تيار السيرفو. |
| استقبال IR يتوقف بعد إضافة السيرفو | تشويش في مزود الطاقة أو تعارض في المؤقتات | أضف مكثفًا كهروليتيًا سعته 470 µF (بجهد مقنَّن 10 V أو أكثر) بين + و GND في مزود طاقة السيرفو، بالقرب من السيرفو. وصّل الجانب المعلَّم بالشريط (-) بـ GND؛ فالمكثف الكهروليتي الموصول بقطبية معكوسة قد يسخن بشدة وينفجر. في Uno، تستخدم IRremote المؤقت Timer 2 وتستخدم مكتبة Servo المؤقت Timer 1، فلا يحدث تعارض بينهما. يظهر التعارض إذا أضاف البرنامج مستخدمًا ثانيًا لـ Timer 2، مثل tone(). |
الأسئلة الشائعة
تعمل معظم أجهزة تحكم التلفاز وأجهزة التحكم العامة (Universal). المستقبِل KY-022 مضبوط على 38 kHz؛ أما أجهزة التحكم ذات الموجات الحاملة الأخرى من 36 إلى 40 kHz فتعمل لمدى أقصر. ترسل أجهزة تحكم المكيفات إطارات طويلة (غالبًا أكثر من 100 بت) لا تستطيع IRremote عادةً فك ترميزها إلى أمر واحد، لذا تجنبها في هذا المشروع. شغّل برنامج المسح لمعرفة أكواد أزرار جهاز التحكم لديك.
تستخدم الدروس المكتوبة لـ IRremote 2.x الكائن IRrecv والدالة decode(&results). ومنذ الإصدار 3.x تستخدم المكتبة IrReceiver.decode() و IrReceiver.decodedIRData. الاستدعاءات القديمة مُهمَلة (Deprecated)، أي مُعلَّمة في المكتبة على أنها قديمة، وقد لا تعمل كما هو متوقع، لذا استخدم البرامج الواردة في هذا المقال مع الإصدار الحالي من المكتبة.
المصادر
دروس OmArTronics ذات الصلة
- قفل باب بكلمة مرور مع Arduino ولوحة مفاتيح وشاشة LCD: مزلاج الباب الذي يعيد هذا المشروع استخدامه، ويُتحكَّم فيه بلوحة مفاتيح وشاشة LCD.
- التحكم بمحرك سيرفو بعصا التحكم (Joystick) وشاشة OLED: التحكم في السيرفو بمدخل تناظري وشاشة عرض.
مصادر خارجية
المشاريع التالية المقترحة
- أضف وحدة مرحّل (Relay) لتشغيل حمل منخفض الجهد وإطفائه، مثل شريط LED بجهد 12 V أو مروحة. لا تتحكم بجهد الشبكة الكهربائية (230 V أو 120 V) إلا إذا كنت مدرّبًا على ذلك: توصيلات جهد الشبكة قد تقتل، ولوحة المرحّل المركّبة على لوحة تجارب غير معزولة لتحمّل هذا الجهد.
- أضف شاشة LCD أو OLED تعرض حالة الباب وآخر أمر مستلم.
- ادمج جهاز التحكم IR مع قفل لوحة المفاتيح بحيث يحتاج فتح الباب إلى الاثنين معًا. أكواد IR غير مشفّرة، ويمكن لأي جهاز تحكم قابل للتعلّم (جهاز تحكم عام يسجّل أكواد IR ويعيد إرسالها) نسخها، لذا استخدم هذا الدمج للعرض التوضيحي فقط. فهو لا يؤمّن بابًا حقيقيًا.
- سجّل أوامر IR المستلمة على بطاقة SD.
الخاتمة
تتبع المرحلتان النمط نفسه: اقرأ كود الزر، وخزّنه، وأضف شرطًا واحدًا لكل إجراء. ولا تحتاج المخرجات الإضافية، مثل مرحّل أو سيرفو ثانٍ، إلا إلى مزيد من الأكواد المقروءة والشروط.
