متأسفانه سورسهای زیادی وجود دارند که از منابع متنباز (Open Source) کپی شدهاند و بهصورت تجاری در فضای اینترنت به فروش میرسند. سورس ریموتهای کدلرن نیز از این دسته است. اگر سورس های متنباز وجود نداشتند شاید این میزان از پیشرفت در حوزه علم و تکنولوژی حاصل نمیشد. پس شایسته است که بهجای منفعت شخصی خود به منفعت جمعی بیندیشم و سورسهایی ازایندست را بفروش نرسانیم و با انتشار رایگان آنها نقشی در بالابردن سطح دانش داشته باشیم.
ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموتهای درب بازکن تا ریموتهای دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی میکنند و آنهم ارسال اطلاعات بهصورت بیسیم است.
بسترهای متفاوتی برای ارسال اطلاعات وجود دارد که از پرکاربردترین آنها، امواج مادونقرمز است که نمونهاش را همگی در ریموتهای تلویزیون و وسایل خانگی دیدهایم و نوع دیگر، ریموتهای رادیویی هستند که از امواج رادیویی برای ارسال دادهها استفاده میکنند.
موضوع بحث ما، مورد دوم است: ریموتهای رادیویی. این ریموتها برای اینکه بتونند اطلاعات را منتقل کنند نیاز دارند که اول اطلاعات را روی یه موج دیگر که به آن موج حامل گفته میشود سوار (مدولاسیون) کنند. با این کار اطلاعات قابلیت انتشار در فضا را بهدست خواهند آورد.
انواع مدلاسیون
مدلاسیون دو نوع آنالوگ و دیجیتال دارد که خود به انواع دیگری تقسیمبندی میشوند. در مدولاسیون، سیگنال فرکانس بالا (حامل) براساس سیگنال پیام تغییر داده میشود. سیگنال حامل خواص مختلفی ازجمله دامنه، فرکانس و فاز دارد که میتوانند بر اساس سیگنال پیام تغییر داده شوند و ازاینرو انواع مختلفی از مدولاسیون پدید میآید. (عکس زیر)
همانطور که در عکس فوق مشاهده میکنید، در مدلاسیون AM سیگنال داده بر روی دامنهی موج حامل تأثیر میگذارد و در مدلاسیون FM سیگنال داده بر روی فشردگی سیگنال حامل (فرکانس) تأثیر میگذارد. این مدلاسیون بهمراتب دارای برد بیشتری نسبت به مدلاسیون AM است؛ چراکه در مدلاسیون AM کاهش دامنه به معنی کاهش توان فرستنده است. نوع بعدی مدلاسیون دیجیتال (Keying) است که درواقع نوعی از مدلاسیون FM محسوب میشود.
در مدارات دیجیتال ما با دو منطق صفر و یک سروکار داریم که برای انتقال به فرکانسهای F0 و F1 تبدیل میشوند. فرکانس F0 یعنی منطق 0 و فرکانس F1 یعنی منطق 1. در این روش کار گیرنده خیلی ساده است و باید بتواند تفاوت بین فرکانس F0 و F1 را تشخیص دهد و آشکار کند. در ریموتکنترلهای رادیویی برای ارسال داده از این نوع مدلاسیون یا مدلاسیون های مشابه استفاده میشود.
ریموتهای کدلرن از مدلاسیون ASK برای ارسال داده استفاده میکنند. مدلاسیون ASK زیرشاخهی سادهشدهای از مدلاسیون دیجیتال است؛ فرکانس F0 از آن حذف شده است و فقط فرکانس F1 در آن استفاده میشود. یعنی وقتیکه منطق 1 باشد فرکانس F1 تولید میشود و وقتیکه منطق صفر است فرستنده خاموش میشود و هیچ سیگنالی تولید نمیشود.
ترفند هم باعث سادهسازی فرستنده و هم گیرنده میشود؛ چراکه در فرستنده فقط باید فرکانس حامل با فرکانس F1 تولید شود و در گیرنده هم فقط باید فرکانس F1 شناسایی شود.
انواع گیرنده ریموت
تا اینجا با نحوهی ارسال اطلاعات آشنا شدیم.
برای ساخت یک ریموت کنترل ابتدا لازم است که امواج ارسالی از ریموت (فرستنده) را دریافت کنیم که بعد از پردازش بتوانیم عملی مناسب با درخواست کاربر را اجرا کنیم. با توجه به نوع فرستنده نیاز داریم که یک گیرنده ASK داشته باشیم که فرکانس آن با فرکانس ریموت یکی باشد، یعنی اگر از ریموت با فرکانس 433 مگاهرتز استفاده میکنیم گیرنده ASK نیز باید با همان فرکانس کار کند. در غیر این صورت مدار بهدرستی کار نخواهد کرد.
مطابق عکس زیر میتوانیم مدار گیرنده را خودمان بسازیم؛ اما با توجه به پیچیدگیهای بحث RF این کار توصیه نمیشود و بهتر است که از مدارها و ماژولهای آمادهی موجود در بازار استفاده کنید.
معمولاً ریموتها در دو فرکانس ۴۳۳ و ۳۱۵ مگاهرتز موجود هستند. در خرید گیرنده دقت کنید که گیرندهی تهیهشده با فرکانس ریموت شما همخوانی داشته باشد. در حال حاضر دو نوع گیرنده ASK در بازار ایران یافت میشود:
مدل قدیمیتر درواقع یک گیرندهی ترانزیستوری ساده از نوع super regenerative است که دارای حساسیت و دقت کمتر و قیمت پایینتری است. این گیرنده نیاز به ولتاژ کاری ۵ ولت دارد و خروجی داده صفر و یک دارد، ولی به دلیل ساختار و نحوه آشکارسازی، بسیار تحت تأثیر نویزهای محیطی قرار میگیرد. (عکس زیر)
مدل جدیدتر درواقع یک گیرنده super heterodyne است و دارای مدار پیچیدهتری برای آشکارسازی داده است. این گیرنده از کریستال کوارتز استفاده می کند؛ همین امر سبب میشود که هم کیفیت گیرندگی و هم دقت بالاتری داشته باشد.
این گیرندهها علاوه بر ۵ ولت قادرند با ۳.۳ ولت نیز به خوبی کار کنند و خروجی داده هم دارند. درواقع چینش پایههای این دو نمونه گیرنده به نحوی است که بهراحتی میتوان آنها را جایگزین هم کرد. پس اگر گیرندهای دارید که از برد آن راضی نیستید میتوانید فقط ماژول ASK را به super heterodyne تغییر دهید و شاهد برد بهتر باشید.
پروتکل ریموت کدلرن
بعد از دریافت دادهها و هموار شدن مسیر، نیاز است که پروتکل ارسال اطلاعات اینگونه ریموت ها را بشناسیم تا قادر به رمزگشایی آنها باشیم. اولین نکتهی مبهی که در خصوص ریموتهای کدلرن به ذهن میآید، خود واژه کدلرن است. درواقع تا قبل از فراگیر شدن این نوع ریموتها، ریموتهای کدفیکس وجود داشتند. ریموتهای کدفیکس دارای ۸ پایه بودند که برای کد کردن آنها باید این پایهها را در حالات مختلفی به صفر و یک وصل میکردید و همین کار را در گیرنده نیز تکرار میکردید تا گیرنده و فرستنده باهم همخوانی داشته باشند و کار کنند. این عمل را کد دادن میگفتند.
دلیل نامگذاری کدفیکس هم این است که گیرندههای این نوع ریموت، کد ثابتی دارند و اگر بخواهید ریموت دیگری نیز با این گیرنده کار کند باید دقیقاً مطابق دیگر ریموتها کددهی شود. که البته این موضوع به لحاظ امنیتی مساله ساز است؛ چراکه اگر کد انتخابی شما را کسی متوجه شود بهراحتی میتواند یک ریموت سازگار با گیرنده شما بسازد.
اما ریموتهای کدلرن دارای امنیت بالاتری هستند. به این معنی که توسط شرکت یک کد ۲۰ بیتی اتفاقی در حافظه آنها نوشته شده است. هر ریموت یک کد منحصربهفرد دارد و دو ریموت با کد یکسان وجود ندارد: بنابراین برای همگام کردن ریموتها با گیرنده، گیرنده باید قادر باشد که کد هر ریموت را در خود ذخیره کند تا در مواقع درخواست، چک کند که آیا ریموت معتبر هست یا نه؟ این عمل را اصطلاحاً لرن کردن میگویند. یعنی شما باید ریموت موردنظر خود را در گیرنده لرن کنید و برای همین هم به آنها ریموتهای کدلرن میگویند.
خوشبختانه پروتکل مورداستفاده در ریموتهای کد لرن مشابه است و فرقی نمیکند که شما از آیسی HS1527 یا EV1527 یا خانوادههای مشابه استفاده میکنید. همه از انکدر OTP استفاده میکنند.
در این روش ۲۴ بیت داده از ریموت ارسال میشود که بیست بیت اول همان کد منحصربهفرد برای هر ریموت است و ۴ بیت انتهایی مربوط به وضعیت کلیدهای فشردهشده ریموت است. در ابتدای هر ارسال، یک وضعیت همزمانی (Preamble) ارسال میشود که ما با دریافت این همزمانی باید منتظر دریافت ۲۴ بیت داده باشیم. با توجه به توضیحات ارائهشده، ما نیاز 3 حالت منحصربهفرد داریم: حالت اول برای ایجاد سیگنال همزمانی (Preamble)، حالت دوم برای ایجاد وضعیت ۱ منطقی و حالت سوم برای ایجاد ۰ منطقی.
- حالت همزمانی: در این حالت اگر میزان یک بودن سیگنال مثلاً ۱ میکروثانیه باشد، میزان صفر آن باید ۳۱ میکروثانیه باشد.
- حالت یک منطقی : در این حالت اگر میزان یک بودن سیگنال مثلا ۳ میکروثانیه باشد میزان صفر بودن آن باید ۱ میکروثانیه باشد.
- حالت صفر منطقی: در این حالت اگر میزان یک بودن سیگنال مثلا ۱ میکروثانیه باشد میزان صفر بودن آن باید ۳ میکروثانیه باشد.
توجه داشته باشید زمانهای ذکرشده بهعنوان مثال هستند. برای روشنتر شدن موضوع و درواقع میزان این زمانها با توجه به نوسانساز داخلی آیسی تعیین میشود ولی نسبتها بهصورت توضیح داده شده حفظ میشوند.
توپولوژی برنامه ریموت
نمونه کدهای زیادی را در این راستا دیدهام؛ چه سورس هایی که در اینترنت به فروش میرسند و چه سورسهایی که بهصورت آموزشی منتشرشده است، هیچکدام از روش اصولی برای این کار استفاده نکردهاند. نمونههایی دیدهام که حتماً باید ریموت مورداستفاده مقاومت نوسان سازش مقداری خاص باشد (چون در کد صرفاً مقدار صفر بودن بررسی میشده)، برد خوبی نداشتهاند، با ضعیف شدن باطری ریموت درست کار نمیکنند و مسائل زیادی که به وجود میآورند.
اما حال که با نحوهی عملکرد ریموت آشنایی پیدا کردید، نوبت به آن میرسد که با توجه به امکانات و اختیارات موجود در میکروکنترلرها، برنامهای بنویسیم که قادر باشد کد دریافتی را شناسایی کند و نسبت به آن عکسالعمل نشان دهد. برای اینکه بتوانید به بهترین نحو دادههای ارسالی را دیکد کنید، باید به این صورت عمل کنید: با دریافت لبه بالارونده، یک کانتر شروع به شمارش کند و با لبه پایینرونده مقدار کانتر را خوانده و دوباره کانتر را صفر کنید و با لبه بالارونده بعدی مقدار قبلی خونده شده از کانتر را با وضعیت فعلی کانتر مقایسه کنید که باید شامل یکی از حالات بالا باشد. دقت داشته باشید که حتماً باید پترن ارسال داده توسط ریموت را دنبال کنید (اول همزمانی بعد ۲۴ بیت داده معتبر) چراکه نویزهای محیطی خود باعث به وجود آمدن حالات بالا بهصورتی تصادفی میشوند که اگر پترن را رعایت نکرده باشید ممکن است گیرنده شما عکسالعمل نشان دهد و خروجی را بهصورت اتفاقی قطع یا وصل نماید(اتفاقی که در برخی از گیرندهها شاهد آن هستیم).
خوب سؤال کلیدی این است که تایمر کانتر ما با چه سرعتی باید شروع به شمارش کند تا بتوانیم بهدرستی طول پالسها را با دقت مناسب اندازهگیری کنیم. برای پاسخ به این سؤال، به برگهی مشخصات آیسی مذکور مراجعه میکنیم و با جدول زیر مواجه میشویم:
که درواقع مدتزمان لازم برای ارسال یک فریم داده را با مقدار ولتاژهای مختلف و مقاومت رزوناتورهای مختلف رسم کرده است. کمترین زمانی که این چیپ قادر به ارسال یک فریم از داده است (۲۴ بیت بهعلاوه همزمانی) ۱.۳۴ میلیثانیه است که با توجه به اینکه هر فریم شامل ۱۲۸ پالس است طول هر پالس ۱۰ میکروثانیه خواهد بود. پس اگر تایمر کانتر ما با فرکانس ۱ مگاهرتز شروع به شمارش کند (۱ میکروثانیه) قادر خواهیم بود طول یک پالس را با دقت بالایی اندازه بگیریم.
توضیح سورس موجود
سورس قرارگرفته در دو نسخه کدویژن و GCC موجود است که با استفاده از میکروکنترلر ATMega8 پیادهسازی شده است. خروجی داده ماژول گیرنده به پایه شماره ۴ آیسی وصل شده است که درواقع پایه ورودی انتراپت صفر است (جهت تشخیص لبهها) و از تایمر کانتر صفر برای اندازهگیری طول هر پالس استفاده شده است. برنامه بهگونهای نوشتهشده که بهراحتی قابلحمل باشد و شما بتوانید آن را بر روی هر میکروکنترلر دلخواهی پیادهسازی کنید.
فرکانس کاری میکروکنترلر ۸ مگاهرتز است که از کریستال خارجی تامین شده است.
این کد با سه نمونه ریموت آزمایش شده است؛ هم با فرکانس ۳۱۵ و هم با فرکانس ۴۳۳. با ریموت ۴۳۳ بدون آنتن گیرنده، تا حدود ۸ متر جواب داده است!
دانلود سورس کد ریموت
* برای دانلود ورژن جدید کتابخانه به “پروژه ریموت کنترل 4 کانال کاملا رایگان + مستندات” مراجعه کنید.
منبع: سیسوگ
[…] توجه به اینکه کتابخانهی ریموت کدلرن در سال 2009 نوشته شده و بعدازآن هیچ تصحیحی روی آن صورت […]
[…] ریموتهای کدفیکس و کدلرن برخوردار هستند. قبلاً در پست ریموت کدلرن و چگونگی دکد بررسی کردیم که ریموتهای کدلرن و یا کد فیکس چطور کار […]