البرمجة
بالبداية تحتاج إلى تحميل مكتبة (RF24 master ) موجدة في إدارة المكتبات في بيئة تطوير الأردوينو،
يمكن معرفة اضافة المكتبات من خلال الرابط
الشفرة البرمجية للمرسل
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8,9); // CE, CSN
const byte address[6] = "00001";
char xyData[32] = "";
int joystick[2];
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MAX);
radio.stopListening();
}
void loop() {
joystick[0] = analogRead(A4);
joystick[1] = analogRead(A3);
radio.write( joystick, sizeof(joystick) );
}
الشفرة البرمجية للمستقبل
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define enA 6
#define in1 7
#define in2 5
#define enB 3
#define in3 4
#define in4 2
RF24 radio(8,9); // CE, CSN
const byte address[6] = "00001";
char receivedData[32] = "";
int xAxis, yAxis;
int motorSpeedA = 0;
int motorSpeedB = 0;
int joystick[2];
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MAX);
radio.startListening();
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
if (radio.available()) { // If the NRF240L01 module received data
radio.read( joystick, sizeof(joystick) );
radio.read(&receivedData, sizeof(receivedData));
yAxis = joystick[0];
xAxis = joystick[1];
Serial.println(yAxis);
Serial.println(xAxis);
}
if (yAxis < 470) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
else if (yAxis > 550) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
}
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
if (xAxis < 470) {
int xMapped = map(xAxis, 470, 0, 0, 255);
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
if (xAxis > 550) {
int xMapped = map(xAxis, 550, 1023, 0, 255);
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
شرح الشفرة البرمجية للمرسل
تضمين المكتبات الضرورية مثل (SPI,nRF24L01,RF24)
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h>
إنشاء كائن (RF24) يحتوي على معاملين و هي منافذ (CE, CSN)
RF24 radio(8,9); // CE, CSN
نحتاج إلى إنشاء مصفوفة تمثل العنوان الذي ستتواصل من خلاله وحدة الإرسال و الاستقبال. يمكننا تغيير قيمة العنوان إلى أي سلسلة مكونة من 5 أحرف وهذا يتيح اختيار أي جهاز استقبال سيوصل مع المرسل، سيكون نفس العنوان في كل من جهاز الاستقبال وجهاز الإرسال.
const byte address[6] = "00001";
نحدد حجم ونوع البيانات التي سيتم إرسالها
char xyData[32] = "";
نعرف مصفوفة من متغيرين ستمثل قيمة محاور عصا التحكم (x,y)
int joystick[2];
في دالة التهئية نهيئ الاتصال التسلسلي و الراديو
void setup() {
Serial.begin(9600);
radio.begin();
نحتاج إلى تهيئة كائن الراديو باستخدام وظيفة radio.openWritingPipe () ونعين عنوان جهاز الاستقبال الذي سنرسل إليه البيانات
radio.openWritingPipe(address);
ثم باستخدام وظيفة radio.setPALevel () ، نعين مستوى مضخم الطاقة ، وفي حالتنا سأقوم بتعيينه على الحد الأعلى حتى نتمكن من التحكم بالروبوت على مسافات أكبر.
radio.setPALevel(RF24_PA_MAX);
نستخدم دالة radio.stopListening(); لتحديد أن الوحدة هي وحدة الإرسال
radio.stopListening(); }
في دالة void loop نحدد مصفوفة لقيم محور y والتي تحدد حركة الماتور إلى الأمام والخلف ومصفوفة لقيم محور xالتي تحدد اتجاه الحركة إلى اليمين أو اليسار
void loop() {
joystick[0] = analogRead(A4);
joystick[1] = analogRead(A3);
نستخدم دالة radio.write لإرسال البيانات و تحتوي الدالة على معيارين الأول يمثل قيمة عصا التحكم و الثاني حجم البيانات التي سيتم نقلها و حددناها (sizeof) بمعنى العدد الفعلي من البايتات (Byts) لمصفوفة (Joystick))
radio.write( joystick, sizeof(joystick) ); }
شرح الشفرة البرمجية للمستقبل
تضمين المكتبات الضرورية مثل (SPI) و (nRF24L01) و(RF24)
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h>
تعريف منافذ وحدة L298
#define enA 6 #define in1 7 #define in2 5 #define enB 3 #define in3 4 #define in4 2
إنشاء كائن (RF24) يحتوي على معاملين و هي منافذ (CE, CSN)
RF24 radio(8,9); // CE, CSN
نحتاج إلى إنشاء مصفوفة تمثل العنوان سيكون نفس العنوان في كل من جهاز الاستقبال وجهاز الإرسال.
const byte address[6] = "00001";
نحدد حجم ونوع البيانات التي سيتم استقبالها
char receivedData[32] = "";
نعرف متغيران لقيمة (X,Y)
int xAxis, yAxis;
نحدد قيمة افتراضية تساوي 0 لسرعة المحركات motorSpeedA و motorSpeedB
int motorSpeedA = 0; int motorSpeedB = 0;
نعرف مصفوفة من متغيرين ستمثل قيمة محاور عصا التحكم (x,y)
int joystick[2];
في دالة التهيئة نعرف منافذ الدخل و الخرج لوحدة L298
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
نهيئ الإتصال التسلسلي و الراديو
Serial.begin(9600); radio.begin();
نحتاج إلى تهيئة كائن الراديو باستخدام وظيفة radio.openReadingPipe () ونعين عنوان جهاز الإرسال الذي سنستلم منه البيانات
radio.openReadingPipe(0, address);
ثم باستخدام وظيفة radio.setPALevel () ، نعين مستوى مضخم الطاقة ، وفي حالتنا سأقوم بتعيينه على الحد الأعلى حتى نتمكن من التحكم بالروبوت على مسافات أكبر.
radio.setPALevel(RF24_PA_MAX);
نستخدم دالة radio.startListening(); لتحديد أن الوحدة هي وحدة الاستقبال
radio.startListening();
اعطاء إشارة منخفضة لجميع منافذ التحكم في وحدة
digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }
نحتاج العبارة المنطقية if لنتحقق من وصول إشارة
if (radio.available()) { // If the NRF240L01 module received data
نستخدم دالة radio.read لاستقبال البيانات و تحتوي الدالة على معيارين الأول يمثل قيمة عصا التحكم و الثاني حجم البيانات التي سيتم استلامها و حددناها (sizeof) بمعنى العدد الفعلي من البايتات (Byts) لمصفوفة (Joystick)
radio.read( joystick, sizeof(joystick) );
تخزين البيانات في مصفوفة joystick
radio.read(&receivedData, sizeof(receivedData)); yAxis = joystick[0]; xAxis = joystick[1];
نستخدمة دالة Serial.println لطباعة قيم عصا التحكم (ان احتجت للتحقق من القراءات)
Serial.println(yAxis); Serial.println(xAxis);}
يستخدم المحور Y للتحكم بالحركة للأمام أو الخلف
if (yAxis < 470) {
يتحرك الروبوت إلى الخلف
digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
قم بتحويل قراءات المحور Y المتدنية للعودة للخلف من 470 إلى 0 إلى قيمة 0 إلى 255 لإشارة PWM لزيادة سرعة المحرك
motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); }
يتحرك الروبوت إلى الأمام
else if (yAxis > 550) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
قم بتحويل قراءات المحور Y المتدنية للتحرك للأمام من 470 إلى 0 إلى قيمة 0 إلى 255 لإشارة PWM لزيادة سرعة المحرك
motorSpeedA = map(yAxis, 550, 1023, 0, 255); motorSpeedB = map(yAxis, 550, 1023, 0, 255); }
إذا بقيت عصا التحكم في المنتصف فإن المحركات لا تتحرك
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
يتحكم محور X بالمحركات للتحرك باتجاه اليمين و اليسار
if (xAxis < 470) {
قم بتحويل قراءات المحور X المتزايدة من 0 إلى 470 إلى قيمة 0 إلى 255
int xMapped = map(xAxis, 470, 0, 0, 255);
يتحرك لليمين بتقليل سرعة المحرك اليمين و زيادة سرعة المحرك على اليسار
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
// Confine the range from 0 to 255
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
if (xAxis > 550) {
قم بتحويل قراءات المحور X المتزايدة من 550 إلى 1024 إلى قيمة 0 إلى 255
int xMapped = map(xAxis, 550, 1023, 0, 255);
يتحرك لليسار بتقليل سرعة المحرك اليسار و زيادة سرعة المحرك على اليمين
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
إرسال اشارة تضمين عرض النبضة
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B }

