در این آموزش با نحوه راه اندازی گیرنده IR با آردوینو آشنا میشویم. ما برای کنترل کردن از راه دور تجهیزات متصل به آردینو میتوانیم از ارتباطات ساده و آسان قطعات مادون قرمز یا IR کمک بگیریم، جالب است بدانید پروژههای آردوینو متعددی توسط این ارتباطات مادون قرمز راه اندازی میشوند بطوریکه شما با سادهترین تجهیزات مادون قرمز قادر خواهید بود برجستهترین نمونههای کاربرد ارتباطات مادون قرمز در زندگی روزمره را مانند کنترل از راه دور تلویزیون/فیلم، سنسورهای حرکت و دماسنج های مادون قرمز، بسازید.
شما در این آموزش ابتدا با نحوهی راه اندازی گیرنده مادون قرمز سه پایه و ریموت آشنا خواهید شد و سپس اصول ارتباط آنها را فرا خواهید گرفت. در ادامه نیز بعد از آشنایی با تجهیزات مادون قرمز با نصب کتابخانه پرکاربرد IRremote آردوینو روبهرو خواهید شد.استفاده از این کتابخانه ساده است و از چندین پروتکل مختلف ارتباط مادون قرمز پشتیبانی میکند. در کدهای اولیه میتوانید پروتکل IR ریموت خود را شناسایی کنید و مشخص کنید هنگام فشردن یک کلید چه کدی ارسال کند. سپس به شما نشان میدهیم چگونه کد دریافت شده را به کلیدها تخصیص دهید و آنها را روی سریال مانیتور نشان دهید. در پایان نگاهی به کنترل خروجی آردوینو با یک ریموت و یک گیرنده میاندازیم.
آنچه خواهید آموخت:
- گیرنده و ریموت مادون قرمز چگونه کار میکند؟
- اصول ارتباط IR
- انواع گیرندههای مادون قرمز
- نحوه اتصال گیرنده و ریموت IR با آردوینو
- نصب کتابخانه آردوینو IRremote
- تشخیص پروتکل مادون قرمز استفاده شده توسط ریموت
- آموزش یافتن کد کلیدهای ریموت IR
- نمونه برنامه اول : نمایش کلیدها در سریال مانیتور توسط گیرنده و ریموت IR با آردوینو
- نمونه برنامه دوم: کنترل چند ال ای دی با گیرنده و ریموت مادون قرمز
گیرنده و ریموت مادون قرمز چگونه کار میکند؟
گیرنده و ریموت IR با ارسال و دیکد کردن سیگنال پالس مادون قرمز با هم ارتباط برقرار میکنند.
تابش مادون قرمز (IR) یا نور مادون قرمز، نوعی تابش الکترومغناطیسی با طول موج 700 نانومتر تا 1 میلیمتر است. با توجه به اینکه محدوده دید چشم انسان از حدود 400 (بنفش) تا 700 نانومتر است، تابش مادون قرمز برای انسان قابل دیدن نیست.
از آنجا که ارتباط مادون قرمز یک پروتکل بیسیم بر پایه نوعی از نور میباشد، نیاز است گیرنده به ارسال کننده دید مستقیم داشته باشد. پس امکان ارتباط غیرمستقیم، با وجود دیوار یا سقف در مسیر آن، مانند بلوتوث یا وای-فای وجود ندارد.
اصول ارتباط مادون قرمز
هر جسم با هر دمایی، طیف مادون قرمز از خود ساطع میکند و متأسفانه LED مادون قرمز موجود در ریموت کنترل شما تنها منبع تابش مادون قرمز نیست. چنانکه دوربینهای حرارتی از این پدیده برای تشخیص گرما استفاده میکنند.
مادون قرمز محیط میتواند ارتباط بین ریموت و گیرنده را مختل کند. پس گیرنده چطور سیگنال مادون قرمزی که توسط ریموت ارسال میشود را تشخیص میدهد؟ جواب مدولاسیون سیگنال است.
با مدولاسیون سیگنال، منبع نور IR مقابل ریموت با فرکانس خاصی خاموش و روشن میشود. در مصارف تجاری و خانگی الکترونیک، معمولا فرکانسِ کریر (carrier) حدود 38 کیلوهرتز است.
این فرکانس خاص در طبیعت کمتر یافت میشود و ارسال سیگنال IR در مقاصد تجاری مورد استفاده قرار می گیرد، در نتیجه میتوان آن را از مادون قرمز محیط جدا کرد.
گیرنده طوری ساخته میشود که فقط به مادون قرمزی که در فرکانس 38 کیلوهرتز دریافت میکند اجازه عبور میدهد. این کار با استفاده از یک فیلتر میان گذر و تقویتکننده (آمپلی فایر) امکانپذیر میباشد. سپس سیگنال باینری دِمِدوله شده (demodulated) به میکروکنترلر (آردوینو) ارسال و رمزگشایی میشود.
یک سیگنال IR به چه شکل است؟
در شکل بالا، محور عمودی نشاندهنده ولتاژی است که به الایدی مادون قرمز ریموت اعمال می شود و محور افقی نشان دهنده زمان است. پس وقتی LED روشن است، در فرکانس 38 کیلو هرتز چشمک میزند (مدوله شده است) و وقتی خاموش است، ولتاژی به آن اعمال نشده است.
نکته مهم مدت زمان روشن و خاموش بودن الایدی است. در پروتکل NEC که یکی از محبوبترین پروتکلهای ارسال مادون قرمز است، بیتهای صفر و یک به صورت زیر نشان داده میشوند:
هر بیت شامل پالسهای کریر (21 پالس) با فرکانس 38 کیلوهرتز و طول 560 میکروثانیه میباشد که با یک وقفه کوتاه همراه است. مدت زمان ارسال “یک ” منطقی 2.25 میلی ثانیه است در حالی که مدت زمان ارسال “صفر” منطقی فقط 1.125 میلی ثانیه است.
مدت زمانی که سیگنال یک یا صفر است و همچنین تعداد بیتهایی که برای هر دستور ارسال میشود بسته به پروتکل مادون قرمز متفاوت است. در پروتکل NEC، کل پیام معمولا از 4 بایتِ 8 بیتی تشکیل میشود.
انواع گیرندههای مادون قرمز IR
گیرندههای IR که به آنها سنسورها یا دیودهای تشخیص مادون قرمز هم گفته میشود، معمولا با دو طراحی مختلف موجود هستند. شما میتوانید دیود را به صورت جداگانه یا به شکل نصب شده روی یک برد برکاوت (breakout) کوچک خریداری کنید.
این دو دقیقا به یک شکل کار میکنند پس تفاوتی ندارد از کدامیک استفاده میکنید. تنها تفاوت این است که برد برک اوت معمولا یک LED کوچک دارد که هنگام تشخیص سیگنال توسط گیرنده، چشمک میزند. این قابلیت میتواند برای عیبیابی مفید باشد.
نحوه اتصال و راه اندازی گیرنده IR به آردوینو
ما برای راه اندازی گیرنده IR با اردوینو ابتدا نیاز به برقراری اتصل فیزیکی بین این دو قطعه را داریم، سیمکشی و اتصال گیرنده مادون قرمز به آردوینو بسیار ساده است و تنها با اتصال سه سیم صورت میگیرد. خروجی سنسور میتواند به یکی از پینهای دیجیتال آردوینو متصل شود. در اینجا ما از پین شماره 2 استفاده کردهایم.
پین تغذیه به 5 ولت و پین زمین به GND متصل میشود. اگر شما از گیرندهای استفاده میکنید که روی برد نصب شده، برای تشخیص پینها به نوشتههای روی PCB توجه کنید. ممکن است ترتیب پینها با خود سنسور متفاوت باشد.
پین خروجی گیرنده مادون قرمز به پین 2 آردوینو متصل شده است.
تجهیزات مورد نیاز
پس از اطلاعاتی که تا به اینجا کسب کردید، زمان کنترل تجهیزات از طریق راه اندازی ریموت و گیرنده IR با آردوینو است. برای آغاز این کار به وسایل زیر نیاز خواهید داشت که می توانید از طریق لینکهای آماده شده زیر تهیه کنید:
- خرید ماژول آردوینو UNO (1 عدد)
- خرید برد بورد (1 عدد)
- خرید سیم جامپر نری/ نری (15 عدد)
- خرید مقاومت برد بوردی (4 عدد)
- خرید کابل USB نوع A/B (1 عدد)
- خرید سنسور گیرنده مادون قرمز سه پایه (1 عدد)
- خرید ریموت کنترل مادون قرمز (1 عدد)
- چراغ ال ای دی در رنگهای متفاوت (4 عدد)
نرم افزار این پروژه:
- Arduino IDE
نصب کتابخانه آردوینو IRremote
ما در این آموزش از کتابخانه محبوب IRremote که توسط Rafi Khan و چند نفر دیگر نوشته شده است، استفاده میکنیم. استفاده از این کتابخانه نسبتا ساده است و از بسیاری از ریموتهای مادون قرمز پشتیبانی میکند.
برای نصب آن به مسیر Tools > Manage Libraries (Ctrl + Shift + I) در IDE آردوینو مراجعه کنید. Library Manager لیست کتابخانههای نصب شده را باز کرده و به روزرسانی را آغاز میکند.
در پنجره جست و جو، IRremote را نوشته و به دنبال کتابخانهای از Armin Joachimsmeyer بگردید. سپس آخرین نسخه آن را نصب کنید.
تشخیص پروتکل مادون قرمز استفاده شده توسط ریموت:
این بخش اختیاری است.
معروفترین و پراستفادهترین پروتکل ارسال مادون قرمز، پروتکل NEC است که توسط بسیاری از سازندههای ژاپنی لوازم الکترونیکی استفاده میشود. با این حال انواع بسیار دیگری از پروتکلها هم وجود دارند. دانستن اینکه ریموت شما از کدام نوع پروتکل IR استفاده میکند، برای کار روی پروژههای سطح بالا و پیشرفته مفید است. همچنین ممکن است مثل من فقط در این باره کنجکاو باشید!
کتابخانه IRremote از پروتکلهای بسیاری پشتیبانی میکند از جمله:
Aiwa | LG | Philips RC6, |
BoseWave | MagiQuest | Samsung |
Denon | Mitsubishi | Sanyo |
Dish | NEC | Sharp |
JVC | Panasonic | Sony |
Lego | Philips RC5 | Whynter |
علیرغم قدیمی بودن نسبی کتابخانه IRremote، همچنان پروتکلهای جدید به آن اضافه میشود. برای مشاهده لیست پروتکلهای برندهای مختلف میتوانید به صفحه گیتهاب این کتابخانه رجوع کنید.
با استفاده از کد زیر میتوانید تشخیص دهید ریموت شما از کدام پروتکل استفاده میکند. همچنین میتوانید ریموتهای دیگری که در خانه دارید را امتحان کنید.
#include <IRremote.h> // include the IRremote library
#define RECEIVER_PIN 2 // define the IR receiver pin
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class
unsigned long key_value = 0; // variable to store the pressed key value
void setup() {
Serial.begin(9600); // begin serial communication with a baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) {
if (results.value == 0XFFFFFFFF) {
results.value = key_value;
}
Serial.println(results.value, HEX);
switch (results.decode_type) {
case NEC:
Serial.println("NEC");
break;
case SONY:
Serial.println("SONY");
break;
case RC5:
Serial.println("RC5");
break;
case RC6:
Serial.println("RC6");
break;
case SHARP:
Serial.println("SHARP");
break;
case JVC:
Serial.println("JVC");
break;
case SAMSUNG:
Serial.println("SAMSUNG");
break;
case LG:
Serial.println("LG");
break ;
case WHYNTER:
Serial.println("WHYNTER");
break;
case PANASONIC:
Serial.println("PANASONIC");
break;
case DENON:
Serial.println("DENON");
break;
case BOSEWAVE:
Serial.println("BOSEWAVE");
break;
case LEGO_PF:
Serial.println("LEGO_PF");
break;
case MAGIQUEST:
Serial.println("MAGIQUEST");
break;
default:
case UNKNOWN:
Serial.println("UNKNOWN");
break ;
}
key_value = results.value;
receiver.resume();
}
}
ما با امتحان کردن چند ریموتی که دسترس داشتیم پروتکلهای زیر را تشخیص دادیم:
آموزش یافتن کد کلیدهای ریموت IR
همانطور که میدانیم انواع مختلفی از ریموتها در بازار موجود و تعداد کلیدها و نوشتههای روی آنها متفاوت است بنابراین باید خودمان تعریف کنیم که کدام سیگنال دریافتی، مربوط به کدام کلید میباشد.
کتابخانه IRremote، سیگنال را میخواند و یک کد خاص به فرم عدد هگزادسیمال (مبنای 16) در خروجی ارائه میدهد که بسته به کلید فشرده شده متفاوت است.
با نمایش این خروجی در سریال مانیتور، میتوانیم یک جدول تبدیل بسازیم:
/* Finding the key codes for your remote. More info: https://www.makerguides.com */
#include <IRremote.h> // include the IRremote library
#define RECEIVER_PIN 2 // define the IR receiver pin
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class
void setup() {
Serial.begin(9600); // begin serial communication with a baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) { // decode the received signal and store it in results
Serial.println(results.value, HEX); // print the values in the Serial Monitor
receiver.resume(); // reset the receiver for the next code
}
}
پس از اینکه کد را آپلود کردید سریال مانیتور را باز کنید. سپس کلیدهای ریموت را به ترتیب فشار دهید و کد مربوط به آن را که در سریال مانیتور می بینید، یادداشت کنید.
توجه کنید، زمانی کد FFFFFFFF رامشاهده خواهید کرد که یک کلید را پشت سر هم فشار دهید. این کدی است که ریموت هنگام تکرار شدن یک کلید ارسال میکند.
برای ریموتی که ما در اختیار داشتیم، جدول تبدیل زیر به دست آمد:
Code | Key |
0xFD00FF | POWER |
0xFD807F | VOL+ |
0xFD40BF | FUNC/STOP |
0xFD20DF | │◄◄ |
0xFDA05F | ►││ |
0xFD609F | ►►│ |
0xFD10EF | ▼ |
0xFD906F | -VOL |
0xFD50AF | ▲ |
0xFD30CF | 0 |
0xFDB04F | EQ |
0xFD708F | ST/REPT |
0xFD08F7 | 1 |
0xFD8877 | 2 |
0xFD48B7 | 3 |
0xFD28D7 | 4 |
0xFDA857 | 5 |
0xFD6897 | 6 |
0xFD18E7 | 7 |
0xFD9867 | 8 |
0xFD58A7 | 9 |
همانطور که در جدول نشان داده شدهاست، مقادیر هگزا دسیمال با پیشوند 0x مشخص شدهاند.
توجه کنید که جدول شما احتمالا متفاوت خواهد بود و برای استفاده از مثالهای بعدی مقاله، نیاز است جدول ریموت خود را بسازید.
نمونه برنامه اول: نمایش کلیدها در سریال مانیتور آردوینو
حال که میدانیم هر کلید چه کدی (برحسب هگزادسیمال) دارد، میتوانیم برنامه را به صورتی تغییر دهیم که به جای کد کلیدها، نام آنها را نمایش دهد.
برای این کار، از یک switch case استفاده میکنیم تا بتوانیم با فشرده شدن هر کلید، بخشی از کد را اجرا کنیم.
کد زیر به جای مقادیر کلیدها در مبنای 16، نام هر کلید را روی سریال مانیتور چاپ میکند. پس از آپلود کد، میتوانید توضیحات آن را در ادامه بخوانید تا متوجه شوید چگونه کار میکند.
/* IR remote and receiver Arduino example code. Print key values in the Serial Monitor. More info: https://www.makerguides.com */
#include <IRremote.h> // include the IRremote library
#define RECEIVER_PIN 2 // define the IR receiver pin
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class
unsigned long key_value = 0; // variable to store the key value
void setup() {
Serial.begin(9600); // begin serial communication with a baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) { // decode the received signal and store it in results
if (results.value == 0xFFFFFFFF) { // if the value is equal to 0xFFFFFFFF
results.value = key_value; // set the value to the key value
}
switch (results.value) { // compare the value to the following cases
case 0xFD00FF: // if the value is equal to 0xFD00FF
Serial.println("POWER"); // print "POWER" in the Serial Monitor
break;
case 0xFD807F:
Serial.println("VOL+");
break;
case 0xFD40BF:
Serial.println("FUNC/STOP");
break;
case 0xFD20DF:
Serial.println("|<<");
break;
case 0xFDA05F:
Serial.println(">||");
break ;
case 0xFD609F:
Serial.println(">>|");
break ;
case 0xFD10EF:
Serial.println("DOWN");
break ;
case 0xFD906F:
Serial.println("VOL-");
break ;
case 0xFD50AF:
Serial.println("UP");
break ;
case 0xFD30CF:
Serial.println("0");
break ;
case 0xFDB04F:
Serial.println("EQ");
break ;
case 0xFD708F:
Serial.println("ST/REPT");
break ;
case 0xFD08F7:
Serial.println("1");
break ;
case 0xFD8877:
Serial.println("2");
break ;
case 0xFD48B7:
Serial.println("3");
break ;
case 0xFD28D7:
Serial.println("4");
break ;
case 0xFDA857:
Serial.println("5");
break ;
case 0xFD6897:
Serial.println("6");
break ;
case 0xFD18E7:
Serial.println("7");
break ;
case 0xFD9867:
Serial.println("8");
break ;
case 0xFD58A7:
Serial.println("9");
break ;
}
key_value = results.value; // store the value as key_value
receiver.resume(); // reset the receiver for the next code
}
}
در صورتی که جدول تبدیل ریموت شما متفاوت است میبایست مقادیر کد و نام کلیدها را در هر خط برنامه، تغییر دهید مثلا:
case 0xFD00FF: // if the value is equal to 0xFD00FF
Serial.println("POWER"); // print "POWER" in the Serial Monitor
این دو خط از کد به این معناست که چنانچه result.value برابر 0xFD00FF بود، در سریال مانیتور عبارت POWER را چاپ کن. توجه کنید باید به کدهای مبنای 16 که در برنامه قبلی مشاهده و یادداشت کردهاید، پیشوند 0x اضافه کنید.
همچنین برای جلوگیری از تشخیص چند بارهی یک کلید، میتوانید یک تأخیر کوچک (مثلا 500 میلی ثانیه) در انتهای حلقه اضافه کنید.
توضیحات کد
اولین گام اضافه کردن کتابخانه IRremote است. چنانچه خطای IRremote.h: No such file or directory را دریافت میکنید احتمالا نصب کتابخانه را به درستی انجام ندادهاید.
#include <IRremote.h> // include the IRremote library
در گام بعدی، پین آردوینو که خروجی گیرنده به آن متصل شده، تعریف میشود. برای دادن یک نام به یک مقدار ثابت عبارت define به کار میرود. خوب است بدانید، کامپایلر در زمان کامپایل برنامه مقدار ثابت را به جای نام قرار میدهد. بنابراین هر جایی از برنامه که RECEIVER_PIN نوشته شود، هنگام کامپایل توسط کامپایلر با مقدار 2 جایگزین میشود.
#define RECEIVER_PIN 2 // define the IR receiver pin
سپس یک شی از کلاس IRrecv ساخته و آن را به خروجی گیرنده (پین 2) لینک میکنیم. در این برنامه این شی با نام receiver ساخته شده که میتوانید برحسب سلیقه خود آن را تغییر دهید. این شی عمل دیکد (decode) و پردازش پروتکلهای IR از سیگنال دریافتی را انجام میدهد.
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
در این مرحله یک شی دیگر به نام results از کلاس decode_results تعریف میشود. این شیء مقادیر دیکد شده از شیء receiver را ذخیره میکند که در ادامه کد از این مقادیر استفاده خواهیم کرد:
decode_results results; // create a results object of the decode_results class
در آخرین خط کد قبل از تابع setup، متغیری برای ذخیره مقادیر کلیدها می سازیم:
unsigned long key_value = 0; // variable to store the key value
در قسمت setup، ابتدا بادریت (baud rate) را روی 9600 قرار دهید، مقدار بادریت سریال مانیتور نیز باید 9600 باشد.
سپس با استفاده از تابع ()enableIRIn، شی receiver را راهاندازی میکنیم.
تابع ()blink13 نیز ال ای دی روی برد آردوینو را هنگام دریافت سیگنال به صورت چشمکزن روشن میکند که میتواند برای دیباگ کردن مؤثر واقع شود.
void setup() {
Serial.begin(9600); // begin serial communication with a baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
}
بخش loop برنامه، با یک عبارت شرطی شروع شدهاست که بررسی میکند کدی دریافت شده یا خیر.
همانطورکه قبلا هم اشاره شد وقتی یک کلید را پشت سر هم فشار دهید، 0xFFFFFFFF دریافت خواهید کرد. برای اینکه هنگام فشردن کلید تکراری، نام صحیح آن دوباره چاپ شود این شرط را مینویسیم که:
if (results.value == 0xFFFFFFFF) { // if the value is equal to 0xFFFFFFFF
results.value = key_value; // set the value to the key value
}
همچنین در انتهای حلقه، خط زیر اضافه شدهاست که مقدار آخرین کلید فشرده شده را ذخیره میکند.
key_value = results.value; // store the value as key_value
سپس دستور swtich case را برای تشخیص کلید فشرده شده اضافه میکنیم و کد مربوط به هر کلید در سریال مانیتور نمایش داده میشود.
در انتهای حلقه نیز تابع resume فراخوانی شده که گیرنده را ریست و برای دریافت کد بعدی آماده میکند.
receiver.resume(); // reset the receiver for the next code
نمونه برنامه دوم : کنترل چند ال ای دی با ریموت و گیرنده مادون قرمز سه پایه
در مثال بعدی با کنترل وضعیت چند ال ای دی بوسیله اتصال ریموت IR با آردوینو آشنا خواهیم شد. شما میتوانید از این کد برای کنترل رلهها، لامپها و موتورها استفاده نمایید.
لازم به ذکر است، این کد بسیار مشابه کد مثال قبلی است، با این تفاوت که چندین تابع به منظور کنترل ال ای دی ها اضافه شدهاست.
همانطور که در شکل زیر نمایش داده شدهاست، گیرنده و ال ای دیها را یه اردوینو متصل کنید.
ال ای دیها به پینهای شماره 2 تا 5 آردوینو و خروجی گیرنده مادون قرمز به پین شماره 6 آردوینو متصل شدهاست. به منظور محدود ساختن جریان عبوری از ال ای دیها از مقاومتها 470 اهم استفاده میکنیم. معمولا جریان مصرفی ال ای دیهای 3 و 5 میلی متر حدود 20 میلیآمپر است. بر این اساس می توانید مقدار مقاومت موردنیاز خود را محاسبه کنید.
با اجرای کد زیر خواهید دید که با فشردن هر یک از کلید های 1 تا 4 ریموت خود، ال ای دیهای متناظر روشن و خاموش میشوند.
/* Example code to control LEDs with an IR remote and receiver with Arduino. More info: https://www.makerguides.com/ */
#include <IRremote.h>
#define RECEIVER_PIN 6 // define the connections
#define RED_LED_PIN 2
#define YELLOW_LED_PIN 3
#define GREEN_LED_PIN 4
#define BLUE_LED_PIN 5
IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class
unsigned long key_value = 0;
void setup() {
Serial.begin(9600); // begin serial communication at a baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
pinMode(RED_LED_PIN, OUTPUT); // set the LED pins as output
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
digitalWrite(RED_LED_PIN, LOW); // turn all the LEDs off
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
}
void loop() {
if (receiver.decode(&results)) {
if (results.value == 0xFFFFFFFF) {
results.value = key_value;
}
switch (results.value) {
case 0xFD00FF:
Serial.println("POWER");
break;
case 0xFD807F:
Serial.println("VOL+");
break;
case 0xFD40BF:
Serial.println("FUNC/STOP");
break;
case 0xFD20DF:
Serial.println("|<<");
break;
case 0xFDA05F:
Serial.println(">||");
break ;
case 0xFD609F:
Serial.println(">>|");
break ;
case 0xFD10EF:
Serial.println("DOWN");
break ;
case 0xFD906F:
Serial.println("VOL-");
break ;
case 0xFD50AF:
Serial.println("UP");
break ;
case 0xFD30CF:
Serial.println("0");
break ;
case 0xFDB04F:
Serial.println("EQ");
break ;
case 0xFD708F:
Serial.println("ST/REPT");
break ;
case 0xFD08F7:
Serial.println("1");
toggleLED(RED_LED_PIN); // run the toggle LED function with the red LED pin as input
break ;
case 0xFD8877:
Serial.println("2");
toggleLED(YELLOW_LED_PIN);
break ;
case 0xFD48B7:
Serial.println("3");
toggleLED(GREEN_LED_PIN);;
break ;
case 0xFD28D7:
Serial.println("4");
toggleLED(BLUE_LED_PIN);
break ;
case 0xFDA857:
Serial.println("5");
break ;
case 0xFD6897:
Serial.println("6");
break ;
case 0xFD18E7:
Serial.println("7");
break ;
case 0xFD9867:
Serial.println("8");
break ;
case 0xFD58A7:
Serial.println("9");
break ;
}
key_value = results.value;
receiver.resume();
}
}
void toggleLED(int pin) { // function to toggle the LED on and off
if (digitalRead(pin) == HIGH) { // if the LED is on
digitalWrite(pin, LOW); // turn it off
}
else { // else
digitalWrite(pin, HIGH); // turn it on
}
}
توضیحات کد
در اولین بخش کد، پینهایی از آردوینو که به LEDها و گیرنده مادون قرمز سه پایه متصل شدند، تعریف شده است. در تابع setup، پین های ال ای دی را به عنوان خروجی تعریف میکنیم و برای خاموش بودن ال ای دی ها، آنها را در وضیعت low قرار میدهیم.
pinMode(RED_LED_PIN, OUTPUT); // set the LED pins as output
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
digitalWrite(RED_LED_PIN, LOW); // turn all the LEDs off
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
تابع loop کد مشابه کد قبلی است، اما به جای نمایش نام کلیدها بر روی سریال مانیتور تابع زیر را هنگام فشردن کلیدهای 0 تا 4 فراخوانی میشود.
toggleLED(pin)
این تابع، پین ال ای دی مشخصی را به عنوان ورودی دریافت میکند و زمانی که شما کلیدی از ریموت را فشار دهید، وضعیت ال ای دی را به روشن یا خاموش تغییر میدهد.
void toggleLED(int pin) { // function to toggle the LED on and off
if (digitalRead(pin) == HIGH) { // if the LED is on
digitalWrite(pin, LOW); // turn it off
}
else { // else
digitalWrite(pin, HIGH); // turn it on
}
بدین صورت شما میتوانید 4 پین خروجی آردوینو را کنترل نمایید. همچنین میتوانید از این تابع برای کنترل رله استفاده کنید. کاربردهای بسیاری از گیرنده و ریموت های مادون قرمز وجود دارد.
در این آموزش نحوه راه اندازی گیرنده و ریموت IR با آردوینو را آموختید. ما چندین نمونه کد را با هم بررسی کردیم، از جمله کد تعیین پروتکل IR و شناسایی کد کلید فشرده شده با ریموت، سپس مقادیر را بر روی سریال مانیتور نمایش دادیم. درنهایت نیز با کنترل خروجیهای آردوینو با ریموت مادون قرمز آشنا شدیم و چندین ال ای دی را به صورت کنترل از راه دور خاموش و روشن کردیم. چنانچه سوال یا پیشنهادی دراین مبحث آموزشی برای شما بوجود آمده خوشحال میشویم آن را در بخش دیدگاه با ما درمیان بگذارید.
۶ دیدگاه. Leave new
واقعا فوق العاده و کاربردی بود.
با تشکر.
سلام و درود بر شما
بسیار عالی و ممنونیم برای همراهیتان
سپاس
ممنون از شما:)
ممنون از توضیحات کاملتون. میخوام بدونم امکان ارسال اطلاعات دمای پی تی سی توسط مادون قرمز وجود داره؟ میخوام شش عدد پی تی سی رو ب پین های انالوگ اردوینو وصل کنم ( مدارش رو دارم فقط میخوام بدونم این امکان وجود داره ) و توسط یک عدد فرستنده مادون قرمز ، اطلاعات لحظه ای دمای هر شش پی تی سی رو انتقال بدم ب گیرنده و پرداز کنم ؟ ممنون میشم راهنمایی کنید
سلام و درود بر شما مسلم عزیز
بله امکان ارسال اطلاعات با IR وجود داره. کافیه اطلاعاتتون رو کد کنید (مشابه پروتکل NEC که در مقاله توضیح دادیم) و بفرستید و در گیرنده هم دیکود انجام بدید. البته بدیهی هست که الزامات ارتباط نوری مثل فاصله نزدیک گیرنده و فرستنده، دیده شدن فرستنده توسط گیرنده، عدم وجود مانع و… باید رعایت شود.
با آرزوی موفقیت:)