المقدمة
توجد العديد من التقنيات التي توفر اتصال لاسلكي بين الأجهزة، و من هذه التقنيات الاتصال باستخدام ترددات الراديو (RF)، في هذا الدرس سنتعرف على وحدة المستقبل والمرسل لموجات الراديو الترددي (RF 433Mhz)، و ستتمكن من برمجة مشروع بسيط يساعدك على التحكم بشدة الإضاءة الثنائي المشع للضوء (LED) عن بعد باستخدام مقاومة متغيرة.
المواد والأدوات المطلوبة
X2 اردوينو اونو
X2 محول طاقة
X1 المستقبل والمرسل لموجات الراديو الترددي (RF 433Mhz)
X2 لوحة تجارب
مجموعة أسلاك توصيل (ذكر/ذكر)
المستقبل والمرسل لموجات الراديو الترددي (RF 433Mhz)
يمكن ارسال البيانات بين لوحتين اردوينو باستخدام وحدة المستقبل والمرسل لموجات الراديو الترددي (RF 433Mhz). حيث ترسل البيانات بشكل متسلسل من جهاز المرسل إلى جهاز المستقبل.
تعمل وحدات المرسل لموجات الراديو الترددي المستخدمة بالدرس بتردد محدد يبلغ 433 ميجاهرتز. تُستخدم هذه الوحدات في الاتصالات قصيرة المدى. ويتم استخدامه في مجالات مختلفة مثل أجهزة التحكم في الإضاءة عن بُعد، وأنظمة RFID، والإنذار اللاسلكي وأنظمة الأمان وما إلى ذلك.
تعمل وحدة المرسل لموجات الراديو الترددي على اصدار موجات بشكل مستمر وتؤثر اشارة البيانات على سعة الموجة ما يعرف بتقنية تضمين إزاحة السعة (Amplitude Shift Keying). عندما تكون إشارة البيانات (1)، يتم تشغيل إشارة الناقل وعندما تكون إشارة البيانات (0) يتم إيقاف تشغيل إشارة الناقل.
وتحتوي وحدة المستقبل على دارة RF لتضخيم الموجة الحاملة المستقبلة من جهاز الإرسال.
توصيل دائرة المرسل
توصيل دائرة المستقبل
البرمجة
بالبداية ستحتاج إلى تحميل مكتبة (VirtualWire) و من ثم تثبيتها على بيئة تطوير الاردوينو (Arduino IDE) يمكنك الاطلاع على الدرس الأول -تنصيب برنامج اردوينو (IDE) على جهازك من سلسة تعلم الاردوينو لمعرفة كيف يتم تثبيت المكتبات
برمجة المرسل
#include <VirtualWire.h> #define size 1 int pot = A0; byte TX_buffer[size]={0}; byte i; void setup() { vw_set_tx_pin(3); // pin vw_setup(2000); // bps for(i=0;i<size;i++) { TX_buffer[i]=i; } } void loop() { int val = map(analogRead(pot),0,1024,0,255); TX_buffer[0] = val; vw_send(TX_buffer, size); vw_wait_tx(); delay(10); }
برمجة المستقبل
#include <VirtualWire.h> byte message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message int received_number = 0; int LED = 5; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); Serial.println("Ready..."); vw_set_rx_pin(3); // pin vw_setup(2000); // bps vw_rx_start(); } void loop() { if (vw_get_message(message, &messageLength)) // non-blocking { Serial.print("Potentiometer: "); for (int i = 0; i < messageLength; i++) { //Serial.print(message[i]); received_number = message[i]; } Serial.println(received_number); analogWrite(LED, received_number); } }
شرح الكود البرمجي
أولا المرسل
في البداية سنقوم باستدعاء مكتبة (VirtualWire) والتي تتضمن دوال تساعدنا على برمجة الوحدة، ونعرف منفذ المقاومة المتغيرة
#include <VirtualWire.h> #define size 1 int pot = A0; byte TX_buffer[size]={0}; byte i;
في دالة void setup() نهيئ منفذ الارسال
void setup() { vw_set_tx_pin(3); // pin vw_setup(2000); // bps for(i=0;i<size;i++) { TX_buffer[i]=i; } }
في دالة void loop() نأخذ قراءة من المقاومة المتغيرة ضمن مدى من 0 إلى 255 والتي تمثل شدة الإضاءة المطلوبة، و نرسل الإشارة
void loop() { int val = map(analogRead(pot),0,1024,0,255); TX_buffer[0] = val; vw_send(TX_buffer, size); vw_wait_tx(); delay(10); }
ثانيا المستقبل
نقوم باستدعاء مكتبة VirtualWire وتعريف الإشارة المستقبلة وحجم الرسالة، وتعريف منفذ الثنائي المشع للضوء (LED)
#include <VirtualWire.h> byte message[VW_MAX_MESSAGE_LEN]; byte messageLength = VW_MAX_MESSAGE_LEN; int received_number = 0; int LED = 5;
في دالة void setup() نقوم بتهيئة منفذ الاتصال التسلسلي حتى نتمكن من طباعة القيم المستقبلة على شاشة الاتصال وكمت سيتم تعريف منافذ الخرج
void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); Serial.println("Ready..."); vw_set_rx_pin(3); // pin vw_setup(2000); // bps vw_rx_start(); }
في دالة void loop() نستقبل الرسالة و نعكس قيمتها ليتم تحديد شدة اضاءة الثنائي المشع للضوء (LED)
void loop() { if (vw_get_message(message, &messageLength)) // non-blocking { Serial.print("Potentiometer: "); for (int i = 0; i < messageLength; i++) { //Serial.print(message[i]); received_number = message[i]; } Serial.println(received_number); analogWrite(LED, received_number); } }