فرکانس های متداول در ریموت های رادیویی موجود در بازار ایران ۳۱۵مگاهرتز و ۴۳۳مگاهرتز هستند.
فرکانس ۴۳۳.۹۲مگاهرتز برای ریموت ها در ایران و اروپا متداول تر است. این فرکانس جزو ISM Band بوده و استفاده از آن بدلیل license-free frequency بودن آزاد است. استفاده از تجهیزات این فرکانس بسیار ارزان تمام می شود، برد قابل قبولی دارد و مصرف برق بسیار کمی هم دارند که باعث می شود مدتها با یک باتری ساده کار کنند.
ماژول های مخابراتی دیگری مثل GT-38 و LoRa هم می توانند روی فرکانس ۴۳۳مگاهرتز کار کند اما موضوع ما اینجا ماژول های ساده ارسال و دریافت روی فرکانس رادیویی ۴۳۳مگاهرتز است که عموماً برای ریموت ها استفاده می شوند.
در این فرکانس انواع ریموت ها در بازار وجود دارند که در ایران به ریموت های بلوتوثی معروف هستند، البته نه فرکانس نه پروتکل ربطی به بلوتوث ندارد و فقط چراغ اکثرشان آبی است! در دنیا به اینها بیشتر duplicator remote می گویند.
براحتی کپی می شوند و معمولاً نحوه خام کردن آن ها گرفتن همزمان A و B و چندبار زدن B بعد از چشمک زن شدن چراغ است. بسته به مدل گاهی البته ممکن است نیازی به چند بار زدن B برای خام کردن نباشد یا مثلاً بجای B باید C را چندبار زد. نشانه خام شدن این است که بعد از خام شدن با نگه داشتن کلید، چراغ روی ریموت روشن نمی ماند و ممکن است فقط یک چشمک بزند.
بعد از خام کردن ، ریموت خام شده را باید روبروی ریموت اصلی گرفت و کلیدهای مدنظر را روی هر دو ریموت همزمان نگه داشت تا ریموت خام شده کد را بگیرد و چند چشمک بزند و چراغ آن با نگه داشتن دکمه روشن بماند.
موضوع ما اینجا البته (فقط) کپی ریموت نیست، ما می خواهیم بتوانیم روی این ماژول وایرلس انتقال پیام و دستور انجام دهیم مثلاً مقادیر یک سنسور را دریافت و دستورات عملگر را ارسال کنیم یا در استفاده بعنوان ریموت، کد منتقل شده روی این فرکانس توسط دکمه های مختلف ریموت را بگیریم و دیکود کنیم و ذخیره کنیم و مجدداً بتوانیم ارسال کنیم و همزمان براساس دکمه فشار داده شده و کد ارسال شده در فرستنده و گیرنده بتوانیم از طریق تعدادی GPIO یا ارتباط سریال یا شبکه و ... چیزهای دیگری (مثل رله) را کنترل کنیم یا به یک سیستم نرم افزاری وصل کنیم یا هر کار دیگری که می توان بوسیله میکروکنترلر و بردهای توسعه متداول در بازار انجام داد.
هر کدام از دکمه های روی این مدل ریموت ها قابلیت ذخیره و ارسال یک پیام (کد) ثابت را دارند و بنابراین رمزنگاری در کار نیست. هر کس میتواند کد را دریافت و ذخیره و ارسال کند. امنیتی ندارند.
من اینجا از یک جفت ماژول گیرنده فرستنده ۴۳۳مگاهرتز که با قیمت حدود ۳۰هزار تومان در بازار به وفور هست استفاده کرده ام. عین همین مطالب برای ۳۱۵مگاهرتزی ها هم صادق است ، فقط باید فرستنده و گیرنده ۳۱۵ بجای ۴۳۳ استفاده بفرمایید.
مدولاسیون این ماژول ها Amplitude-shift keying (ASK) از نوع on-off keying (OOK) و بسیار ساده است، هیچ مدل رمزنگاری و اعتبارسنجی و CSMA/CA و ... در کار نیست.
برای برد کنترل من از Wemos D1 R1 استفاده کرده ام زیرا یک esp8266 روی یک برد فیزیکی مشابه آردوینو اونو است که با قیمت حدود ۱۰۰هزار تومان ، براحتی بصورت Access Point یا Station می تواند با WiFi کار کند و IP بگیرد و از طریق http دیتا بگیرد و ارایه دهد و در این زمان شاید بصرفه ترین برد توسعه ای که در بازار باشد همین است، البته یک آنالوگ بیشتر ندارد.
برای کتابخانه نرم افزاری ، کتابخانه RadioHead یکی از کاملترین کتابخانه ها برای کار با انواع RF است، اما چون موضوع ما اینجا ریموت و سوییچ است من از کتابخانه RC Switch که مخصوص همین کار است و کار را خیلی راحت می کند استفاده کردم.
همچنین یک ماژول مموری ریدر میکرو SD - Micro SD/TF هم برای ذخیره کدهای دریافتی استفاده شده که البته الزامی نیست اما در کد برنامه نویسی پیوست شده برای ذخیره و بازیابی داده ها (کدهای ریموت) از این روش استفاده شده است.
نمای کلی سخت افزارهای استفاده شده بشکل ذیل است :
نحوه اتصال اجزا و pinoutها هم مشخص هستند و پین اتصال receiver و sd و transmitter روی کد مشخص است، پین سیگنال گیرنده به D4 و فرستنده به D2 متصل شده اند، ۵ولت و gnd هم از برد گرفته شده است.
پین های ماژول کارت SD هم به متناظر روی برد گیرنده وصل شده اند.
یک کد نمونه ساده را برای ارسال کننده و دریافت کننده از روی اینترفیس وب اینجا گذاشته ام :
https://github.com/alghaspour/433MHz-Web-Controller
هر دو کد بسیار ساده و کوتاه هستند.
مجدداً یادآوری می کنم شما روی receiver و transmitter یکسری GPIO به همراه اتصال وای فای و پورت های سریال دارید که هر کدام را می توانید با تغییرات در کد به چیز دیگری وصل بفرمایید که با ارسال و دریافت کدهای مختلف ریموت کارهای دیگری روی سیستم های دیگر انجام شود.
- آدرس ip دریافت کننده (receiver) را که بزنید صفحه کنترل وب برای شما باز می شود و می توانید ip ارسال کننده و کد ارسالی را نیز روی همین صفحه تعیین و ارسال بفرمایید.
- برای ارسال دستور از روی اینترفیس میزبانی شده روی گیرنده به وب سرور فرستنده از ajax و XMLHttpRequest و جاوااسکریپت استفاده شده است (خط ۱۰ فایل html.html تابع run). روی ارسال کننده (transmitter) هدر Access-Control-Allow-Origin: * برای وب سرور تنظیم شده است که بتوان از آدرس های دیگر به آن دسترسی داشت و مشکل CORS Policy روی مرورگر پیش نیاید.
- در کد فرستنده (Transmitter.ino) برای تفسیر دستور ارسال شده از روی وب از پردازش رشته استفاده شده ( خطوط ۷۲ تا ۸۱)و بدلیل اینکه تابع send آرایه کاراکتر می گیرد string با تابع toCharArray به آرایه کاراکتر تبدیل شده است.
- در خط ۷۸ کد فرستنده (Transmitter.ino) پارامتر دوم تابع setProtocol، مقدار Pulse Length است.
- پایه گرفتن کد از گیرنده باید interrupt pin باشد.
روی wemos d1 r1 پین D4 برای دریافت تست شده است.
https://github.com/sui77/rc-switch/blob/master/RCSwitch.h
https://github.com/sui77/rc-switch/blob/master/RCSwitch.cpp
- من برای سادگی کلاً از ESP8266WiFi برای اتصال به WiFi و ایجاد web server استفاده کرده ام، برای استفاده های پیچیده تر توصیه می شود از کتابخانه های ESP8266WebServer یا AsyncWebServer برای راه اندازی وب سرور و هندل کردن درخواست ها استفاده بفرمایید که امکانات خیلی بیشتری دارند.
- در اینجا هر دو برد دریافت کننده و ارسال کننده به یک Access Point وصل می شوند و station هستند، برای استفاده outdoor، موبایل را access point می کنم و روی موبایل به وب اینترفیس دریافت کننده وصل می شوم. برای بدست آوردن ip کلاینت های متصل شده و موارد دیگر روی اندروید از subnet scanner روی PingTools Network Utilities استفاده می کنم. همچنین Network Analyzer برای دیدن اطلاعات شبکه گوشی کمک می کند.
با تغییر بخش wifi می توانید یکی را access point کنید و برای بردها ip ثابت تنظیم بفرمایید.
- کد html صفحات را بصورت compress شده در کد گیرنده (Receiver.ino) استفاده کرده ام، البته روی صفحه گیت هاب نمونه کمپرس نشده آن نیز هست. htmlها (با تگ script) اینجا کمپرس شده، جاوا اسکریپت ها (داخل تگ script) اینجا کمپرس شده اند. سپس در text editor همه " ها با ' عوض (replace " with ' in all) شده است.
- آنتن پیش فرض گیرنده بد نیست اما اصلاً قوی نیست ، اما فرستنده بدون آنتن اضافه، با توجه به اینکه در اینجا ۵ولت به آن برق داده ایم که تا ۱۲ولت جا دارد، چند سانتی متر بیشتر کار نمی کند. محل لحیم آنتن (آنتن فنری خوب است) در تصاویر ماژول ها در بالا نمایش داده شده است.
مقالات مفید دیگر :
Decode and Send 433 MHz RF Signals with Arduino
How 433MHz RF Tx-Rx Modules Work & Interface with Arduino