راهاندازی این ماژول توسط آردوینو با وجود کتابخانهی RF24 بسیار آسان است. فایل زیپ این کتابخانه را از طریق لینک قرار دادهشده در انتهای آموزش دانلود کرده و از طریق مسیر زیر به کتابخانهی آردوینو IDE اضافه کنید.
Sketch -> Include Library -> Add .ZIP
پس از اضافه کردن کتابخانه، باید دو برنامه یکی برای طرف فرستنده و دیگری برای سمت گیرنده تنظیم شوند. اما همانطور که قبلاً اشاره شد هر ماژول می تواند هم به عنوان فرستنده و هم گیرنده کار عمل کند. برنامه را با ضافه کردن کتابخانههای ضروری شروع میکنیم. از آنجا که NRF از پروتکل SPI استفاده میکند، کتابخانهی SPI و همچنین کتابخانهی NRF را فراخوانی میکنیم. از کتابخانه سروو موتور نیز برای کنترل آن استفاده میشود.
#include <SPI.h>
#include "RF24.h"
#include <Servo.h>
در این قسمت پینهای اتصال پایههای ()CE و ()CS را مشخص میکنیم. مطابق با اتصالات ما به پایههای 7 و 8 متصل هستند.
RF24 myRadio (7, 8);
در این برنامه ازمتغیر msg برای ارسال و دریافت داده ها از ماژول RF استفاده می شود. هر ماژول RF یک آدرس منحصر به فرد دارد که با استفاده از آن می تواند داده ها را به دستگاه مربوطه ارسال کند. به دلیل اینکه در این برنامه از تنها از دو ماژول استفاده شده است آدرس را هم در سمت گیرنده و هم در سمت فرستنده صفر میکنیم. اگربخواهید ازچندین ماژول استفاده کنید می توانید 6 رقم منحصر به فرد را به عنوان شناسه در نظر بگیرید.
byte addresses[][6] = {"0"};
در مرحله بعدی در داخل تابع setup void ، ماژول RF راه اندازی اولیه کرده و به پهنای باند عاری از نویز 115 و حداقل سرعت 250Kbps را برای آن تنظیم میکنیم.
void setup()
{
Serial.begin(9600);
myRadio.begin();
myRadio.setChannel(115); //115 band above WIFI signals
myRadio.setPALevel(RF24_PA_MIN); //MIN power low rage
myRadio.setDataRate( RF24_250KBPS ) ; //Minimum speed
myservo.attach(6);
Serial.print("Setup Initialized");
delay(500);
}
تابع WritData داده های ارسال شده به ماژول را می نویسد. همانطور که قبلاً گفته شد NRF میتواند در آن واحد با چندین ماژول دیگر ارتباط داشته باشد. بنابراین برای مشخص شدن هر ارتباط از یک آدرس استفاده میشود. در اینجا از 0xF0F0F0F066 به عنوان آدرس برای نوشتن دادهها استفاده شده است. در سمت گیرنده نیز از همان آدرس تابع ReadData استفاده کنیم تا داده هایی که نوشته شده است را دریافت کنیم.
void WriteData()
{
myRadio.stopListening(); //Stop Receiving and start transminitng
myRadio.openWritingPipe(0xF0F0F0F066);//Sends data on this 40-bit address
myRadio.write(&data, sizeof(data));
delay(300);
}
در تابع ReadData دادهها خوانده شده و در داخل یک متغیر قرار میگیرند. از عدد 0xF0F0F0F0AA به عنوان آدرسی برای خواندن دادهها نیز استفاده شده است. این بدان معنی است که اطلاعات فرستاده شده از ماژول دیگر در این آدرس نوشته شده و قرار است که این اطلاعات خوانده شوند.
void ReadData()
{
myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //Which pipe to read, 40 bit Address
myRadio.startListening(); //Stop Transminting and start Reveicing
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
Serial.println(data.text);
}
}
همچنین سیگنال دریافت شده از پتانسیومتر به بازهی 0 تا 180 نگاشت کرده و برای کنترل میزان چرخش سروو موتور به ماژول گیرنده فرستاده میشود.
/*
Partineh
Arduino Tutorial Series
Website: www.Partineh.com
*/
Code for Transmitter Part:
/*Transmit POT value through NRF24L01 using Arduino
*
* Pin Conections
* CE - 7
MISO - 12
MOSI - 11
SCK - 13
CS - 8
POT-A7
*/
#include <SPI.h>
#include "RF24.h"
RF24 myRadio (7, 8);
struct package
{
int msg = 0;
};
byte addresses[][6] = {"0"};
typedef struct package Package;
Package data;
void setup()
{
Serial.begin(9600);
myRadio.begin();
myRadio.setChannel(115); //115 band above WIFI signals
myRadio.setPALevel(RF24_PA_MIN); //MIN power low rage
myRadio.setDataRate( RF24_250KBPS ) ; //Minimum speed
delay(500);
Serial.print("Setup Initialized");
}
void loop()
{
int Read_ADC = analogRead(A7);
char servo_value = map (Read_ADC, 0, 1024, 0,180);
if (servo_value>1)
data.msg = servo_value;
WriteData();
delay(50);
// ReadData();
//delay(200);
}
void WriteData()
{
myRadio.stopListening(); //Stop Receiving and start transminitng
myRadio.openWritingPipe( 0xF0F0F0F0AA); //Sends data on this 40-bit address
myRadio.write(&data, sizeof(data));
Serial.print("
Sent:");
Serial.println(data.msg);
delay(300);
}
void ReadData()
{
myRadio.openReadingPipe(1, 0xF0F0F0F066); // Which pipe to read, 40 bit Address
myRadio.startListening(); //Stop Transminting and start Reveicing
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
Serial.print("
Received:");
Serial.println(data.msg);
}
}
Code for Receiver Part:
/*CE - 7
MISO - 12
MOSI - 11
SCK - 13
CS - 8
Recently tested with nano
*/
#include <SPI.h>
#include "RF24.h"
#include <Servo.h>
Servo myservo;
RF24 myRadio (7, 8);
struct package
{
int msg;
};
typedef struct package Package;
Package data;
byte addresses[][6] = {"0"};
void setup()
{
Serial.begin(9600);
myRadio.begin();
myRadio.setChannel(115); //115 band above WIFI signals
myRadio.setPALevel(RF24_PA_MIN); //MIN power low rage
myRadio.setDataRate( RF24_250KBPS ) ; //Minimum speed
myservo.attach(6);
Serial.print("Setup Initialized");
delay(500);
}
int Servo_value;
int Pev_servo_value;
void loop()
{
ReadData();
delay(50);
Pev_servo_value = Servo_value;
Servo_value = data.msg;
while (Pev_servo_value< Servo_value)
{
myservo.write(Pev_servo_value);
Pev_servo_value++;
delay(2);
}
while (Pev_servo_value> Servo_value)
{
myservo.write(Pev_servo_value);
Pev_servo_value--;
delay(2);
}
//data.msg = "nothing to send";
//WriteData();
// delay(50);
}
void ReadData()
{
myRadio.openReadingPipe(1, 0xF0F0F0F0AA); //Which pipe to read, 40 bit Address
myRadio.startListening(); //Stop Transminting and start Reveicing
if ( myRadio.available())
{
while (myRadio.available())
{
myRadio.read( &data, sizeof(data) );
}
Serial.print("
Received:");
Serial.println(data.msg);
}
}
void WriteData()
{
myRadio.stopListening(); //Stop Receiving and start transminitng
myRadio.openWritingPipe(0xF0F0F0F066);//Sends data on this 40-bit address
myRadio.write(&data, sizeof(data));
Serial.print("
Sent:");
Serial.println(data.msg);
delay(300);
}