فك تشفير أجهزة التحكم عن بعد السوداء أو البيضاء باستخدام أردوينو
في هذا البرنامج التعليمي، سوف نتعلم كيفية فك تشفير المفاتيح من أجهزة التحكم عن بعد بالأشعة تحت الحمراء السوداء والبيضاء باستخدام Arduino ومتلقي الأشعة تحت الحمراء. في نهاية هذا المشروع، ستتمكن من تحديد المفتاح الذي تم الضغط عليه على جهاز التحكم وعرض هذه المعلومات على شاشة السيريال. يمكن أن يكون هذا مفيدًا للتحكم في الأجهزة باستخدام أي جهاز تحكم عن بعد قد تمتلكه، مثل أجهزة التلفاز أو الأجهزة الأخرى (في الفيديو عند 01:00).
سنستخدم إعدادًا بسيطًا يتضمن لوحة أردوينو، ووحدة استقبال الأشعة تحت الحمراء، والرمز اللازم لفك تشفير الإشارات. ستلتقط وحدة استقبال الأشعة تحت الحمراء الإشارات من جهاز التحكم عن بُعد، وسيفسر الأردوينو تلك الإشارات لتحديد الزر الذي تم ضغطه. هذا المشروع سهل ويمكن تكييفه مع أنواع مختلفة من أجهزة التحكم عن بُعد.
شرح الأجهزة
تشمل المكونات الأساسية لهذا المشروع لوحة Arduino ووحدة استقبال الأشعة تحت الحمراء، التي تُعرف عادةً باسم VS1838B. ستعمل لوحة Arduino كمتحكم رئيسي، تنفذ الشيفرة التي تعالج الإشارات المستلمة من جهاز التحكم عن بعد. يقوم جهاز الاستقبال بالأشعة تحت الحمراء بالتقاط الإشارات تحت الحمراء المنبعثة من جهاز التحكم عن بعد وتحويلها إلى صيغة يمكن أن تفهمها لوحة Arduino.
VS1838B يعمل بجهد يتراوح بين 2.7 فولت إلى 5.5 فولت، مما يجعله متوافقًا مع معظم لوحات Arduino. يمكنه اكتشاف الإشارات من مسافة تتراوح بين 10 إلى 15 مترًا، اعتمادًا على الظروف. يخرج جهاز الاستقبال بالأشعة تحت الحمراء إشارة رقمية تشير إلى أي زر على جهاز التحكم عن بُعد قد تم الضغط عليه، مما يسمح لـ Arduino بالاستجابة وفقًا لذلك.
تفاصيل ورقة البيانات
| الشركة المصنعة | VS1838B |
|---|---|
| رقم الجزء | VS1838B |
| جهد المنطق/الإدخال والإخراج | ٢.٧-٥.٥ فولت |
| جهد الإمداد | ٥ ف |
| تيار الخرج (لكل قناة) | 1.5 ميللي أمبير |
| مسافة الاستقبال | 10-15 م |
| تكرار الإدخال | ٣٨ كيلوهرتز |
| تيار السكون | 0.8 ميلي أمبير (تقريبا) |
| زاوية التشغيل | 70 درجة |
| باقة | تو-220 |
- تأكد من توفير الجهد الكهربائي المناسب لتجنب تلف جهاز استقبال الأشعة تحت الحمراء.
- ابتعد بوحدة الاستقبال عن أشعة الشمس المباشرة أو مصادر الأشعة تحت الحمراء القوية.
- استخدم مقاومات السحب لأعلى إذا لزم الأمر لاستقرار قراءات الإشارة.
- يجب أن تكون اتصالات الأسلاك آمنة لمنع الإشارات المتقطعة.
- اختبر أجهزة التحكم المختلفة لمعرفة مدى توافقها مع الإعداد.
-
Deconding-IR-remote-main-1
تعليمات التوصيل
لربط مستقبل الأشعة تحت الحمراء باللوحة Arduino، أولاً قم بتوصيل دبوس VCC لمستقبل الأشعة تحت الحمراء بدبوس 5 فولت على اللوحة Arduino. بعد ذلك، قم بتوصيل دبوس GND للمستقبل بأحد دبابيس GND على اللوحة Arduino. وأخيراً، قم بتوصيل دبوس الإشارة (الذي يُسمى غالبًا SIG أو OUT) لمستقبل الأشعة تحت الحمراء بالدبوس الرقمي 11 على اللوحة Arduino.
تأكد من أن التوصيلات آمنة، حيث أن التوصيلات غير المحكمة يمكن أن تؤدي إلى قراءات غير متسقة. إذا كنت تستخدم نسخة PCB من جهاز الاستقبال بالأشعة تحت الحمراء أو وحدة عارية، فإن الأسلاك تظل كما هي؛ فقط تأكد من أنك تحدد الدبابيس بشكل صحيح وفقًا لتعليمات الوحدة (في الفيديو في 03:15).
قم بتثبيت مكتبة IRremote
قم بتشغيل بيئة تطوير Arduino.اردوينو.كومانقر على أيقونة المكتبة على اليسار وابحث عنIRremoteوانقر على "تثبيت" لتثبيته.
#include <IRremote.h>أمثلة التعليمات البرمجية وجولة توضيحية
int RECV_PIN = 11;
const char type ='W'; // W for white, B for black
const boolean PCB = 0; // 1 for PCB, 0 for bare module
IRrecv irrecv(RECV_PIN);في هذا المقتطف، نحدد رقم الدبوس لاستقبال الأشعة تحت الحمراء معRECV_PINتم ضبطه على 11. نحن أيضًا نحدد نوع التحكم عن بُعد المستخدم مع الـtypeمتغير، حيث يشير 'W' إلى جهاز التحكم عن بُعد الأبيض و'B' إلى جهاز التحكم عن بُعد الأسود. الـPCBتُميز المتغير بين استخدام نسخة PCB من جهاز الاستقبال أو وحدة عارية.
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}في الsetup()نقوم بتهيئة الاتصال التسلسلي بسرعة 9600 بت ونبدأ مستقبل الأشعة تحت الحمراء. هذا أمر حاسم لمراقبة الإخراج على الشاشة التسلسلية، مما يتيح لنا رؤية المفتاح الذي تم الضغط عليه.
void loop() {
if (irrecv.decode(&results)) {
robojaxValidateCode(results.value); // Validate the received code
irrecv.resume(); // Receive the next value
}
delay(100);
}الرئيسيloop()يختبر ما إذا كان جهاز استقبال الأشعة تحت الحمراء قد فك شفرة إشارة. إذا كان قد فعل، فإنه يستدعي الـrobojaxValidateCodeوظيفة لمعالجة القيمة المستلمة ثم تستأنف الاستماع للإشارة التالية. الـdelay(100)يضمن أن الحلقة لا تعمل بسرعة كبيرة، مما يمكن أن يساعد في معالجة الإشارات.
عرض / ماذا تتوقع
بمجرد إعداد كل شيء وتحميل الكود، افتح شاشة السيريال لرؤية النتائج. عندما تضغط على زر في جهاز التحكم عن بعد، يجب أن ترى اسم الزر المقابل معروضًا على الشاشة. إذا كان الزر غير معترف به، سيظهر "زر غير معروف". تأكد من الضغط على الأزرار بقوة، حيث يمكن أن تؤدي الاتصالات الفضفاضة إلى قراءات خاطئة (في الفيديو عند 05:40).
إذا ضغطت على مفتاح باستمرار، قد تظهر الإخراج قيم متكررة أو رموز ست عشرية. هذا السلوك طبيعي، ويمكنك تعديل الكود لاستبعاد هذه الإشارات المستمرة إذا رغبت في ذلك. بالإضافة إلى ذلك، يمكنك ضبط الكود لتنفيذ إجراءات بناءً على ضغطات مفاتيح محددة، مثل تشغيل الأضواء أو التحكم في أجهزة أخرى.
طوابع زمنية للفيديو
- :00 بدء
- 00:56 يتم شرح الأجهزة
- 04:26 شرح الأسلاك
- 05:20 يتم شرح الكود
- 12:27 عرض توضيحي لفك شفرة الشيفرة
/*
* Original code and library from - http://arcfn.com
*
* This code decodes keys of Black IR remote and White IR remote
* sold on eBay for Arduino.
* You have to select the type of your remote as Black or White in the code below
* and also select your receiver 1838 either as PCB or bare module. See video for details
*
* Modified/Written by Ahmad Shamshiri
* on July 28, 2018 at 22:48 in Ajax, Ontario, Canada
* for Robojax.com
* Watch video instruction for this code:https://youtu.be/muAkBQb24NI
* Get other Arduino codes from Robojax.com
*
*/
#include <IRremote.h>
int RECV_PIN = 11;
const char type ='W';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details
IRrecv irrecv(RECV_PIN);
// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
0xE318261B, // CH-
0x511DBB, // CH
0xEE886D7F, // CH+
0x52A3D41F, // |<<
0xD7E84B1B, // >>|
0x20FE4DBB, // >||
0xF076C13B, // -
0xA3C8EDDB, // +
0x12CEA6E6, // EQ
0xC101E57B, // 0
0x97483BFB, // 100+
0xF0C41643, // 200+
0x9716BE3F, // 1
0x3D9AE3F7, // 2
0x6182021B, // 3
0x8C22657B, // 4
0x488F3CBB, // 5
0x449E79F, // 6
0x32C6FDF7, // 7
0x1BC0157B, // 8
0x3EC3FC1B // 9
};
// this is array holding codes for White Remote when used with non-PCB version of receiver
unsigned int whiteRemote[] ={
0xFFA25D, // CH-
0xFF629D, // CH
0xFFE21D, // CH+
0xFF22DD, // |<<
0xFF02FD, // >>|
0xFFC23D, // >||
0xFFE01F, // -
0xFFA857, // +
0xFF906F, // EQ
0xFF6897, // 0
0xFF9867, // 100+
0xFFB04F, // 200+
0xFF30CF, // 1
0xFF18E7, // 2
0xFF7A85, // 3
0xFF10EF, // 4
0xFF38C7, // 5
0xFF5AA5, // 6
0xFF42BD, // 7
0xFF4AB5, // 8
0xFF52AD // 9
};
// key labels of white remote
String whiteRemoteKey[] ={
"CH-",
"CH",
"CH+",
"|<<",
">>|",
">||",
"-",
"+",
"EQ",
"0",
"100+",
"200+",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
};
// this is array holding codes for Black Remote when used with non-PCB version of receiver
unsigned int blackRemote[] ={
0xFF629D, // ^
0xFF22DD, // <
0xFF02FD, // OK
0xFFC23D, // >
0xFFA857, // v
0xFF6897, // 1
0xFF9867, // 2
0xF0C41643, // 3
0xFF30CF, // 4
0xFF18E7, // 5
0xFF7A85, // 6
0xFF10EF, // 7
0xFF38C7, // 8
0xFF5AA5, // 9
0xFF42BD, // *
0xFF4AB5, // 0
0xFF52AD // #
};
// this is array holding codes for Black Remote when used with PCB version of receiver
unsigned int blackRemotePCB[] ={
0x511DBB, // ^
0x52A3D41F, // <
0xD7E84B1B, // OK
0x20FE4DBB, // >
0xA3C8EDDB, // v
0xC101E57B, // 1
0x97483BFB, // 2
0xF0C41643, // 3
0x9716BE3F, // 4
0x3D9AE3F7, // 5
0x6182021B, // 6
0x8C22657B, // 7
0x488F3CBB, // 8
0x449E79F, // 9
0x32C6FDF7, // *
0x1BC0157B, // 0
0x3EC3FC1B // #
};
// Black remote key names
String blackRemoteKey[] ={
"^",
"<",
"OK",
">",
"v",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"*",
"0",
"#"
};
decode_results results;
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Robojax Remote Decoder");
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
robojaxValidateCode(results.value);// used the "robojaxValidateCode" below
irrecv.resume(); // Receive the next value
}
delay(100);
}
/*
* function: robojaxValidateCode
* validates the remote code and prints correct key name
* cd is code passed from the loop
* Written by A. S. for Robojax
*/
void robojaxValidateCode(int cd)
{
// Robojax IR Remote decoder
int found=0;
if(type =='W' && !PCB)
{
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=0 then check Black remote code
for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
{
if(whiteRemote[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='W' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'W' (white remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
{
if(whiteRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(whiteRemoteKey[i]);
found=1;
}// if matched
}// for
}else if(type =='B' && PCB){
// Robojax IR White Remote decoder
// if type is set to 'B' (black remote) and PCB=1 then check Black remote code
for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemotePCB[i] ==cd)
{
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}else{
// if type is set to 'B' (black remote) and PCB =0 then check Black remote code
for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
{
// Robojax IR black Remote decoder
if(blackRemote[i] ==cd)
{
if(blackRemoteKey[i] == "OK"){
digitalWrite(9,HIGH);
}
Serial.print("Key pressed:");
Serial.println(blackRemoteKey[i]);
found=1;
}// if matched
}// for
}// else
if(!found){
if(cd !=0xFFFFFFFF)
{
Serial.println("Key unknown");
}
}// found
}
الأشياء التي قد تحتاجها
-
أمازون
-
إي باي
الموارد والمراجع
لا توجد موارد حتى الآن.
ملفات📁
لا توجد ملفات متاحة.