دریافت و کد گشایی سیگنال مادون قرمز در آردوینو
سه شنبه, ۲۰ اسفند ۱۳۹۸، ۰۲:۵۵ ب.ظ
دریافت و کد گشایی سیگنال مادون قرمز در آردوینو
سید علی طلاکش

در این پروژه سیگنال مادون قرمز ،کتابخانه ای از اشعه مادون قرمز با نام IRLib معرفی می شود.در ابتدای کار مراحل نصب این کتابخانه بررسی خواهد شد. برای دانلود کتابخانه IRLib به سایت Github مراجعه کرده و پس از اتمام دانلود و خارج کردن از حالت فشرده، فایلی با نام IRLib2-master خواهیم داشت که شامل ۵ پوشه جداگانه است. این بدان خاطر است که کتابخانه IRLib خود شامل ۵ کتابخانه مختلف است که در ارتباط با یکدیگر هستند. حال باید پوشه هر ۵ کتابخانه را در کتابخانه آردوینو و در کنار کتابخانه های دیگر آن کپی کرد. به صورت پیش فرض محل کپی کتابخانه ها در قسمت
Documents/Arduino/Librarie folder
است. کتابخانه ها حتما باید در محل کتابخانه آردوینو و نه در قسمت دیگری کپی شوند. پس از کپی کتابخانه ها باید برد را ریستارت نمود. پس از ریستارت این ۵ کتابخانه به مجموعه کتابخانه های آردوینو اضافه می شود:arduino/libraries/IRLib2
arduino/libraries/IRLibfreq
arduino/libraries/IRLibProtocols
arduino/libraries/IRLibRecv
arduino/libraries/IRLibRecvPCI
سخت افزار مورد نیاز
کتابخانه IRLib بر روی avr های ۸ بیتی که مبتنی بر آردوینو هستند همانند: leonardo،uno ,micro،mega اجرا می شوند. به تازگی پشتیبانی برای پردازشگرهای ۳۲ بیتی ARM SAMD21 ارائه شده که عملکرد آن را شبیه به بردهای Arduino M0 و CPE می کند.با این وجود در حال حاضر پشتیبانی برای بردهای Arduino Due یا دیگر سیستم های مشابه Arduino وجود ندارد. کتابخانه IRLib در میکروکنترلرهای مبتنی بر سیستم ATtiny85 نظیرAdafruit trinket
و Adafruit gemma
اجرا نمی شود ولی پشتیبانی برای این میکروکنترلرها در حال انجام است و احتمالا در آینده نزدیک نسخه ساده ای برای این نوع پلتفرم ها نیز منتشر خواهد شد. بنابراین فعلا اولین چیزی که به آن احتیاج خواهیم داشت یک برد آردوینو uno یا دیگر بردهای سازگار است. حال برای دریافت امواج مادون قرمز(IR) نیاز به یک IR receiver خواهیم داشت. در اینجا برای دریافت این امواج از سنسور TSOP38238 استفاده می کنیم.این سنسور ترکیبی از فتوسل های حساس دریافت کننده مادون قرمز،فیلتر میان گذر ۳۸KHZ و سیستم کنترل اتوماتیک بوده که محدوده عملکرد آن محدود به دامنه ولتاژ ۳٫۳ ولت تا ۵ ولت است. این گیرنده از طریق مدولاسیون سیگنال مادون قرمز ورودی،شکل موج مربعی دقیقی از پالس های on و off منبع تغذیه را ایجاد می کند. این بدان معناست که می توان خروجی آن را مستقیما به پین ورودی آردوینو متصل نمود. در نهایت نیاز به یک کنترل کننده از راه دور مادون قرمز(IR Remote)، مشابه کنترل های تلویزیون و دستگاه های پخش داریم. در اینجا در تمامی مثال ها از ریموت کنترل های کوچک ساخته شده توسط شرکت Adafruit استفاده شده است. در صورتی که شما به این نوع remote دسترسی ندارید جای نگرانی وجود ندارد. ما به شما نشان خواهیم داد که چگونه پروتکلی که ریموت کنترل تلویزیون شما از آن استفاده می کند را شناسایی کرده و در صورتی که این پروتکل توسط کتابخانه IRLib پشتیبانی شود، می توانید از آن استفاده کنید. استفاده از سنسور TSOP38238 بسیار آسان است. همان گونه که در شکل پایین نشان داده شده، این دریافت کننده مادون قرمز سه پایه دارد. پایه خروجی سمت چپ برای متصل شدن به هر پایه دیجیتال ورودی آردوینو به کار می رود که در این مثال ما از Pin2 استفاده کرده ایم. پایه وسط باید به زمین متصل شود و پایه سمت راست برای متصل شدن به منبع تغذیه ۵ ولت است. همانگونه که گفته شد این سنسور مجهز به یک فیلتر میان گذر است که روی فرکانس ۳۸KHZ تنظیم شده که فرکانس معمول مورد استفاده اکثر پروتکل هاست. با این وجود بعضی از پروتکل ها از رنج فرکانسی ۳۶KHZ تا ۵۷KHZ استفاده می کنند. با این وجود فیلتر استفاده شده در سنسور TSOP38238 منحصر به فرکانس ۳۸KHZ نیست و می توان از آن برای رنج فرکانسی ۳۶KHZ تا ۴۰KHZ نیز استفاده کرد. اگرچه باز هم پروتکل هایی هستند که از این رنج فرکانسی بیرون باشند، همانند پروتکل های دستگاه های قدیمی پاناسونیک که از فرکانس ۵۶KHZ استفاده می کنند و گیرنده TSOP38238 به سختی می تواند این فرکانس را کدگشایی کند. برای به دست آوردن اطلاعات بیشتر در مورد دریافت کننده ها با رنج های فرکانسی مختلف و همچنین شماتیک آن ها به کتابخانه IRLib بخش ۱٫۴٫۳ مراجعه کنید.کدگشایی سیگنال مادون قرمز دریافتی(IR Data)
برای این منظور کد زیر را بارگذاری کنید. این کد با کمی تغییر و اصلاح از طرح dump ،موجود در پوشه مثال های کتابخانه (example folder) گرفته شده است.کدهای تمامی مثال ها در پوشه "IRLib2/examples
" موجود است.#include "IRLibAll.h" //Create a receiver object to listen on pin 2 IRrecvPCI myReceiver(2); //Create a decoder object IRdecode myDecoder; void setup() { Serial.begin(9600); delay(2000); while (!Serial); //delay for Leonardo myReceiver.enableIRIn(); // Start the receiver Serial.println(F("Ready to receive IR signals")); } void loop() { //Continue looping until you get a complete signal received if (myReceiver.getResults()) { myDecoder.decode(); //Decode it myDecoder.dumpResults(true); //Now print results. Use false for less detail myReceiver.enableIRIn(); //Restart receiver } }بعد از این که کد بارگذاری شد، قسمت نمایشگر سریال آردوینو را باز کرده و مطمئن شوید که band rate آن روی ۹۶۰۰ تنظیم شده باشد. حال ریموت کنترل را به سمت گیرنده گرفته و دکمه ای را دلخواه فشار دهید. به طور مثال ما در اینجا دکمه play/pause را در ریموت کنترل Adafruit فشار می دهیم. نتایج بدین شرح است:
مهمترین قسمت این کد،خط اول آن است. از آن متوجه می شویم که پروتکل انتقال دیتای مادون قرمز شناسایی شده از نوع NEC بوده و شماره ۱ جلوی آن بدان معناست که این پروتکل شماره ۱ را در بین پروتکل های پشتیبانی شده در کتابخانه IRLib دارد. دیتا دریافت شده ۳۲ بیتی،مقدار آنDecoded NEC(1): Value:FD807F (32 bits)
Raw samples(68): Gap:40826
Head: m8850 s4450
۰:m500 s600 1:m550 s550 2:m500 s600 3:m550 s600
۴:m500 s600 5:m500 s600 6:m500 s600 7:m550 s550
۸:m500 s1750 9:m500 s1700 10:m500 s1700 11:m550 s1650
۱۲:m550 s1700 13:m500 s1700 14:m500 s600 15:m550 s1700
۱۶:m500 s1700 17:m500 s600 18:m500 s600 19:m500 s600
۲۰:m550 s600 21:m450 s650 22:m500 s600 23:m500 s600
۲۴:m500 s600 25:m500 s1700 26:m550 s1700 27:m500 s1700
۲۸:m500 s1700 29:m550 s1700 30:m500 s1700 31:m500 s1700
۳۲:m500
Extent=65850
Mark min:450 max:550
FD807F
و به صورت هگزادسیمال نشان داده شده است. بقیه کدهای آورده شده در خط های بعد در مورد داده های زمانی خام از علامت های واقعی و مکان های دریافت شده است که این اطلاعات برای متوجه شدن روند اجرای دستور و همچنین آشنایی با پروتکل های پشتیبانی شده مفید است. این شماره ۳۲ بیتی منحصرا دکمه ای که آن را فشرده ایم را شناسایی می کند. برای مثال اگر دکمه volume up/down را در ریموت کنترل فشار داده بودیم، مقدار هگزادسیمال دریافتی از آن ها به ترتیب ۰XFD00FF
و ۰XFD40BF
می شد. با فشردن دکمه های مختلف ریموت کنترل تلویزیون یا دستگاه پخش نتایج مختلفی ممکن است حاصل شود. مثلا در صورتی که کد ظاهر شده در خط اول بدین صورت باشد:Decoded Unknown(0): Value:0 (0 bits)
Decoded Sony(2): Value:74BCA (20 bits)
Decoded Panasonic Old(5): Value:37990C (22 bits)
Panasonic_old protoc
(پروتکل ۵ ) استفاده می کند و ۲۲ بیتی است. اکثر پروتکل ها عمدتا از مقدار بیت مشابهی استفاده می کنند. اگرچه برخی همانند sony، ورژن های مختلفی دارد و می تواند از پروتکل های ۸،۱۲ یا ۱۵ بیتی علاوه بر ۲۰ بیتی استفاده کند.سیگنال مادون قرمز چگونه کار می کند؟
حال میخواهیم نگاهی دقیق تر به آنچه اتفاق می افتد داشته باشیم. گیرنده حساس به سنسور مادون قرمز(IR) بوده و به محض دریافت یک سیگنال شروع به اندازه گیری زمان نشانه ها و فواصل می کند. در صورتی که میزان مشخصی از زمان گذشت و هیچ سیگنال دیگری دریافت نشد،گیرنده فرض می کند که دیتا کامل دریافت شده است و با زدن دکمهmy_receiver.getresults
برای اطمینان از دریافت دیتا،گیرنده به ما پاسخ true که به معنای تایید دریافت است را می دهد. سپس گیرنده دیتا را به قسمت دیکدر(کدگشا) ارسال می کند. در نهایت کدگشا با استفاده از اطلاعات زمانبندی و تعداد بیت استفاده شده،معین می کند که دیتا با یکی از پروتکل های پشتیبانی شده مطابقت دارد یا نه و در صورت تطابق پیغام true را می دهد. برای آگاهی یافتن از شماره پروتکل،تعداد بیت های مورد استفاده و همچنین مقدار دیتای رمزگشایی شده باید به ترتیب به my_decoder.protocolNum
،my_decoder.bits
و my_decoder.value
مراجعه کرد. کد زیر مربوط به یک کدگشا تحت عنوان IRdecode است. این کلاس از کدگشا تمام ۱۱ پروتکل پشتیبانی شده را با هم ترکیب می کند. در صورت استفاده از یک کتابخانه برای کنترل دستگاهی نظیر سرو موتور یا برای خاموش و روشن کردن یک رله،معمولا از یک ریموت کنترل با یک پروتکل استفاده می شود. به محض دانستن پروتکل مورد استفاده،ممکن است که بخواهیم از یک کدگشا با کلاس دیگر که مختص پروتکل مورد استفاده ماست،بهره ببریم.این کار سبب ذخیره هرچه بیشتر فضای ارزشمند برنامه برای ما می شود. به عنوان مثال در صورتی که ما از ریموت کنترل کوچک Adafruit که از پروتکل NEC بهره می برد استفاده کنیم،بند شماره ۷ برای خواندن آن را تغییر می دهد:IRdecodeNEC My_Decoder;
مسائل خاص پروتکل ها
کتابخانه IRLib مستقیما از ۱۱ پروتکل پشتیبانی می کند و همچنین شامل نمونه کدهایی برای پیاده سازی بقیه پروتکل ها نیز هست.یکی از وظایف اصلی کتابخانه ها مجزا کردن قسمت نرم افزار برنامه نویس از قسمت داخلی آن است. با این وجود در برخی موارد پروتکل های خاصی وجود دارندکه ممکن است لازم باشد با آن ها سر و کار داشته باشیم. پروتکل ها تقریبا در بند ۱۴ و در کتابخانه هایIRLibprotocols/IRLibProtocols.h
و به شرح زیر شمارش شده اند:#define UNKNOWN 0 #define NEC 1 #define SONY 2 #define RC5 3 #define RC6 4 #define PANASONIC_OLD 5 #define JVC 6 #define NECX 7 #define SAMSUNG36 8 #define GICABLE 9 #define DIRECTV 10 #define RCMM 11حال در اینجا بعضی مسائل خاص پروتکل ها که ممکن است با آن ها سروکار پیدا کنیم را بررسی می کنیم.
کدهای تکراری NEC
پروتکل NEC از رشته های خاصی از علائم و فضاها استفاده می کند که در واقع عملکرد آن بدین گونه است که هرگاه دکمه پایین نگه داشته شد، این پروتکل باید هرچیزی که بار آخر به آن فرستاده شده است را تکرار کند. این به خود ما بستگی دارد که آیا می خواهیم اجازه دهیم که کدها تکرار شوند یا این که می خواهیم اپراتور را مجبور به فشار دادن و رها کردن هربار دکمه کنیم. زمانی که کتابخانه IRLib مقدار هگزادسیمال۰XFFFFFFFF
را نشان می دهد درواقع به ما می فهماند که رشته تکراری ویژه ای دریافت شده است. می توانیم به این رشته اعتنایی نکنیم که در این صورت کاربر مجبور به رها کردن و دوباره فشار دادن دکمه در هر بار می شود و یا این که می توانیم کد دریافت شده قبلی را ذخیره کرده و هر زمان که پیام تکراری ویژه ای دریافت کردیم،آن را پردازش کنیم.پیام های سه گانه SONY
مشخصات فنی پروتکل SONY بدین گونه است که هر کد ۳ بار پی در پی با هر فشار کلید باید فرستاده شود. کتابخانه IRLib خود وظیفه ارسال سه باره ی کد را انجام می دهد،بنابراین نیاز نیست ما کار خاصی را انجام بدهیم. با این وجود باید توجه داشته باشیم هنگام دریافت پروتکل های سونی ما قرار است ۳ کپی از رشته دیتا را با هر بار فشردن دکمه توسط کاربر دریافت کنیم. در صورتی که هنوز درگیر پردازش رشته اول دیتا باشیم، ممکن است آن دو رشته را از دست بدهیم که البته اهمیتی ندارد. اما در مواقعی که مشغول شمردن تعداد فشرده شدن کلید و یا دیگر برنامه ها هستیم،آن دو رشته از دست داده شده اهمیت پیدا می کند و باید از آن آگاهی داشت.Toggle کردن بیت های RC5 و RC6
پروتکل های RC5 و RC6 که توسط شرکت PHILIPS اختراع شده اند،از معکوس کننده های بیت (toggle bit) خاصی استفاده می کنند که سبب می شود متوجه شویم که آیا کد با پایین نگه داشتن دکمه، تولید شده و یا این که مربوط به فشردن یک کلید مستقل دیگری است. برای مثال فرض کنید که تلویزیونی داریم که از پروتکل RC5 استفاده می کند و کد آن برای دکمه volume up،۰x1010 است. در صورتی که دکمه volume up را فشار داده و نگه داریم،مکررا کدی مشابه را ارسال می کند. در صورتی که اگر دکمه را رها کرده و دوباره آن را فشار دهیم، کد ۰X1810 را دریافت خواهیم کرد. فشردن هر کلید سبب toggle کردن یک بیت از کد ۰X0800 خواهد شد.در این صورت می توان با پوشاندن آن بیت خاص،از نادیده گرفتن آن اطمینان حاصل کرد. زمانی که یک مقدار دیکد شده از این پروتکل دریافت می شود، می توان دستور زیر را انجام داد:My_Decoder.value &=0xf7ff;
۰X10000
است.از این رو برای پوشاندن آن از دستور زیر استفاده می شود:My_Decoder.value &=0xfeffff;
- ۹۸/۱۲/۲۰
سلام.گزینه ای واسه دانلود وجود نداره .چطور میشه این کتابخانه رو دانلود کرد