مقدمه
در این راهنمای جامع، شما را با دنیای شگفتانگیز فناوری مادون قرمز (IR) آشنا کرده و به شما نشان میدهیم که چگونه با استفاده از آردوینو از قدرت آن استفاده کنید. ارتباطات مادون قرمز به بخشی جداییناپذیر از بسیاری از دستگاههای الکترونیکی تبدیل شده و به آنها امکان تبادل اطلاعات به صورت بیسیم را میدهد. فناوری IR در همه جای زندگی روزمره ما وجود دارد؛ از کنترل از راه دور گرفته تا دربهای اتوماتیک. درک اصول ارتباط IR و یادگیری نحوه کار با آن با استفاده از آردوینو، امکانات وسیعی را در اختیارتان قرار خواهد داد. این راهنمای ارتباط مادون قرمز با آردوینو، دانش و مهارتهای مورد نیاز برای ارسال و دریافت موفقیتآمیز سیگنالهای IR با آردوینو را فراهم میکند. ما اصول اولیه ارتباطات IR، از جمله پروتکلها و کدهای مختلف مورد استفاده، و همچنین مثالهای عملی و آموزشهای گام به گام را برای شروع به کار خواهیم گرفت.
آنچه در این آموزش یاد می گیرید
- نحوه کار مادون قرمز در برقراری ارتباط
- کاربرد فناوری IR
- آشنایی با فرستنده و گیرنده IR
- برقراری ارتباط مادون قرمز بین دو آردوینو
ارتباطات مادون قرمز (IR) چیست؟
ارتباطات IR یا مادون قرمز یک فناوری ارتباط بیسیم رایج، ارزان و آسان است. نور مادون قرمز بسیار شبیه به نور مرئی است، با این تفاوت که طول موج آن کمی بیشتر است. به این معنی که IR برای چشم انسان غیر مریی است؛ بنابراین برای تبادل اطلاعات مناسب میباشد.
مادون قرمز (IR) برای ارتباط در بردهای کوتاه استفاده میشود و به دید مستقیم نیاز دارد. همچنین قادر نیست از دیوار عبور کند.
به دلیل همین محدودیتهای IR، رهگیری ارتباطات دشوار است. در واقع، ارتباطات بین دستگاههای مادون قرمز معمولاً به صورت یک به یک است. بنابراین، دادههای منتقل شده در روش IR معمولاً رمزگذاری نشده است.
هنگامی که از کنترل بیسیم IR استفاده میکنید، از یک LED در طیف مادون قرمز برای انتقال اطلاعات به گیرنده استفاده میشود. اما منابع IR مختلفی در اطراف ما وجود دارند. خورشید، لامپ یا هر چیز دیگری که گرما تولید میکند در طیف مادون قرمز بسیار روشن هستند.
بنابراین، گیرنده IR باید بتواند سیگنالهای ریموت را از بین سیگنالهای IR محیط تشخیص دهد. به همین منظور، از سیگنال IR مدوله استفاده میشود. مدولاسیون یک سیگنال مانند اختصاص یک الگو به دادههاست، به طوری که گیرنده آن را بشناسد.
یک مدولاسیون رایج برای ارتباطات IR، مدولاسیون 38 کیلوهرتز است. منابع طبیعی بسیار کمی وجود دارند که دارای موج سیگنال 38 کیلوهرتزی باشند، بنابراین یک فرستنده IR که دادهها را با آن فرکانس ارسال میکند در میان امواج IR محیط متمایز خواهد بود.
هنگامی که کلیدی را بر روی ریموت خود فشار میدهید، LED فرستنده IR در کسری از ثانیه چشمک میزند و دادههای کدگذاری شده را به گیرنده منتقل میکند.
دادههایی که از طریق IR ارسال میشوند، علاوه بر اینکه فرکانس عمده آنها 38 کلیوهرتز است، دارای پروتکلهای خاص خود نیز هستند. به عنوان مثال، پروتکل NEC—که توسط سازندگان لوازم خانگی ژاپنی استفاده فراوانی داشت و دارد—داده را با فرمت زیر ارسال میکند.
در این قسمت، با فرستنده و گیرنده IR و همچنین نحوه برقراری ارتباط بین آنها آشنا شدیم. در ادامه، با نحوه استفاده از این روش برای برقراری ارتباط بین دو برد آردوینو و ارسال و دریافت دستورات بین آنها آشنا خواهیم شد.
لوازمی که به آن احتیاج دارید
ایجاد ارتباط مادون قرمز IR بین دو برد آردوینو
همانطور که قبلاً اشاره کردیم دو مدار جداگانه را با استفاده از آردوینو میسازیم. مدار اول از یک سنسور مادون قرمز 38 کیلوهرتزی برای دریافت سیگنال IR و یک کنترلر آردوینو برای تفسیر سیگنال ورودی استفاده میکند. مدار دوم نیز شامل ماژول LED فرستنده مادون قرمز برای ارسال کدهای IR به گیرنده و یک کنترلر آردوینو میباشد.
سیمبندی
برای فرستنده، مدار زیر را بسازید.
همچنین برای قسمت گیرنده، سیمکشی بین برد آردوینو و سنسور IR را مطابق شکل زیر انجام دهید.
کد آردوینو برای ارسال IR
ابتدا کتابخانه IRremote را از این لینک دانلود و نصب کنید. سپس فایل Sender را از این لینک دانلود و آن را در نرمافزار Arduino IDE باز کنید.
/*
modified on AUG 23, 2023
Modified by MajidMerati from Arduino Examples
Home
*/
#include <Arduino.h>
#define DISABLE_CODE_FOR_RECEIVER // Disables restarting receiver after each send. Saves 450 bytes program memory and 269 bytes RAM if receiving functions are not used.
//#define SEND_PWM_BY_TIMER // Disable carrier PWM generation in software and use (restricted) hardware PWM.
//#define USE_NO_SEND_PWM // Use no carrier PWM, just simulate an active low receiver signal. Overrides SEND_PWM_BY_TIMER definition
/*
This include defines the actual pin number for pins like IR_RECEIVE_PIN, IR_SEND_PIN for many different boards and architectures
*/
#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp> // include the library
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
Serial.print(F("Send IR signals at pin ")); //Printouts the IR send pin used in the chip you want.
Serial.println(IR_SEND_PIN);
// IrSender.begin(); // Start with IR_SEND_PIN as send pin and if NO_LED_FEEDBACK_CODE is NOT defined, enable feedback LED at default feedback LED pin
IrSender.begin(DISABLE_LED_FEEDBACK); // Start with IR_SEND_PIN as send pin and disable feedback LED at default feedback LED pin
}
/*
Set up the data to be sent.
For most protocols, the data is build up with a constant 8 (or 16 byte) address
and a variable 8 bit command.
There are exceptions like Sony and Denon, which have 5 bit address.
*/
uint8_t saddress = 0;
uint8_t sCommand = 0;
uint8_t sRepeats = 0;
void loop() {
if (digitalRead(10) == LOW)
{
saddress = 0x00;
sCommand = 0x10;
sRepeats = 1;
}
else if (digitalRead(11) == LOW)
{
saddress = 0x01;
sCommand = 0x20;
sRepeats = 1;
}
else if (digitalRead(12) == LOW)
{
saddress = 0x02;
sCommand = 0x30;
sRepeats = 1;
}
if (digitalRead(10) == LOW || digitalRead(11) == LOW || digitalRead(12) == LOW)
{
/*
Print current send values
*/
Serial.println();
Serial.print(F("Send now: address=0x")); Serial.print(saddress, HEX);
Serial.print(F("command=0x")); Serial.print(sCommand, HEX);
Serial.print(F(", repeats=")); Serial.print(sRepeats);
Serial.println();
Serial.println(F("Send standard LG with 8 bit address"));
Serial.flush();
IrSender.sendLG(saddress, sCommand, sRepeats);
}
delay(1000); // delay must be greater than 5 ms (RECORD_GAP_MICROS), otherwise the receiver sees it as one long signal
}
برای فهم بهتر کد، کامنتهای نوشته شده در کنار آنها را مطالعه کنید.
این کد، وضعیت پایههای 10، 11 و 12 آردوینو را میخواند و در صورتی که هر یک از آنها به GND وصل شود یک پیام حاوی دستورهای (Command) مختلف را با آدرسی (address) متفاوت ارسال میکند. پروتکل استفاده شده LG است. میتوانید با تغییر متغیر sRepeats، تعداد تکرار پیام در هر ارسال را تنظیم کنید.
دادههای ارسال شده، در Serial Monitor نیز قابل مشاهده هستند. برای اینکار، باید این پنجره را در نرمافزار Arduino IDE باز کرده و سپس بادریت را روی 115200 تنظیم کنید.
کد آردوینو برای دریافت IR
فایل Receiver را از این لینک دانلود و آن را در نرمافزار Arduino IDE باز کنید.
/*
modified on AUG 23, 2023
Modified by MajidMerati from Arduino Examples
Home
*/
/*
* Specify which protocol(s) should be used for decoding.
* If no protocol is defined, all protocols (except Bang&Olufsen) are active.
* This must be done before the #include <IRremote.hpp>
*/
//#define DECODE_DENON // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC // alias for DECODE_KASEIKYO
#define DECODE_LG
#define DECODE_NEC // Includes Apple and Onkyo
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6
//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER
//#define DECODE_FAST
//#define DECODE_DISTANCE_WIDTH // Universal decoder for pulse distance width protocols
//#define DECODE_HASH // special decoder for all protocols
//#define DECODE_BEO // This protocol must always be enabled manually, i.e. it is NOT enabled if no protocol is defined. It prevents decoding of SONY!
//#define DEBUG // Activate this for lots of lovely debug output from the decoders.
//#define RAW_BUFFER_LENGTH 180 // Default is 112 if DECODE_MAGIQUEST is enabled, otherwise 100.
#include <Arduino.h>
/*
* This include defines the actual pin number for pins like IR_RECEIVE_PIN, IR_SEND_PIN for many different boards and architectures
*/
#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp> // include the library
void setup() {
Serial.begin(115200);
// Start the receiver and if not 3. parameter specified, take LED_BUILTIN pin from the internal boards definition as default feedback LED
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.print(F("Ready to receive IR signals of protocols: "));
printActiveIRProtocols(&Serial);
Serial.println(F("at pin " STR(IR_RECEIVE_PIN))); //Printouts the IR receive pin used in the chip you want.
}
void loop() {
/*
* Check if received data is available and if yes, try to decode it.
* Decoded result is in the IrReceiver.decodedIRData structure.
*/
if (IrReceiver.decode()) {
/*
* Print a short summary of received data
*/
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRSendUsage(&Serial);
if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
// We have an unknown protocol here, print more info
IrReceiver.printIRResultRawFormatted(&Serial, true);
}
Serial.println();
/*
* !!!Important!!! Enable receiving of the next value,
* since receiving has stopped after the end of the current received data packet.
*/
IrReceiver.resume(); // Enable receiving of the next value
/*
* Finally, check the received data and perform actions according to the received command
*/
if (IrReceiver.decodedIRData.command == 0x10) {
// do something
Serial.println("received command 10");
} else if (IrReceiver.decodedIRData.command == 0x20) {
// do something else
Serial.println("received command 20");
} else if (IrReceiver.decodedIRData.command == 0x30) {
// do something else
Serial.println("received command 30");
}
}
}
با این کد، آردوینو منتظر دریافت سیگنال IR میماند. به محض دریافت سیگنال و در صورتی که فرمت داده دریافتی صحیح باشد، متناسب با دستور (command) و آدرس (address) آن، پیغامی را در Serial Monitor چاپ میکند.
تست ارتباط مادون قرمز با آردوینو
پس از پروگرام کردن هر دو برد آردوینو، LED فرستنده و دیود گیرنده IR را روبروی یکدیگر قرار دهید. در این حالت، اگر یکی از پایههای 10، 11 یا 12 برد فرستنده را به GND وصل کنید، آدرس و دستور متناظر به گیرنده ارسال میشود.
میتوانید اطلاعات ارسالی و دریافتی را به ترتیب در Serial Monitor فرستنده و گیرنده مشاهده کنید. ما در اینجا، با اتصال هریک از پایههای 10، 11 و یا 12 به GND، هر سه حالت را آزمایش کردیم. همانطور که مشاهده میکنید دستورات متناظر با هریک از پایهها ارسال و دریافت شده است.
یک گام جلوتر
در این آموزش با مفاهیم ابتدایی فرستندهها و گیرندههای IR و همچنین انواع آنها آشنا شدیم. با استفاده از مطالبی که یاد گرفتیم میتوانیم انواع سیستمهای ارتباط از راه دور را بسازیم.
برای توسعه برنامهای که نوشتید، میتوانید با ESP8266 یا ESP32، فرستنده یا گیرنده IR طراحی کنید. کتابخانهای که برای این دو کنترلر نوشته شده، انواع پروتکلها را پشتیبانی میکند. بنابراین با استفاده از آن میتوانید یک فرستنده یا گیرنده Universal بسازید که امکان برقراری ارتباط با همه ریموت کنترلرها را داشته باشد.
این کتابخانه را میتوانید از این لینک دانلود کنید.
به عنوان مثال، با ساخت دستگاه فرستنده Universal، میتوانید همزمان با چندین دستگاه دارای گیرنده IR ارتباط برقرار کرده و بر روی آنها کنترل داشته باشید. برای اینکار فقط کافیست یک گیرنده Universal بسازید و پروتکل و کد دادۀ ارسالی از ریموت کنترلرهای مختلف را بخوانید و کپی کنید. اگر آنها را در زمان ارسال سیگنال IR در فرستنده Universal خود لحاظ کنید، میتوانید گیرندهها را کنترل کنید.