ماژول انتقال بیسیم اطلاعات +nrf24l01 ( فرکانس 2.4g ) + آنتن
ماژول انتقال بیسیم اطلاعات +nrf24l01 ( فرکانس 2.4g ) + آنتن
ماژول فرستنده و گیرنده رادیویی +nRF24L01 از جدیدترین فرستنده و گیرنده 2.4 گیگاهرتزی شرکت Nordic Semiconductor یعنی چیپ +nRF24L01 استفاده می کند. فرکانس این آی سی برای دریافت و ارسال رادیویی اطلاعات باند 2.4 گیگاهرتز بوده و مشخصات بسیار جدیدی دارد. این آی سی تمامی مشخصات و مزایای آی سی سری قبل خود یعنی nRF24L01A را داراست. بعلاوه pipeline و بافرهای اضافی، و همچنین ارسال مجدد اتوماتیک، از قابلیتهای اضافه شده در این سری از آی سی های RF است.
توجه: در سری پلاس «+» از این آی سی ها یعنی +nRF24L01 شرکت Nordic مشخصاتی مانند برد، حساسیت و نرخ تبادل اطلاعات را نسبت به محصول سری قبل یعنی nRF24L01 ارتقاء داده است. با این حال دستورات کنترلی یا Command های این سری با سری قبل یکی بوده و تغییری نداشته است.
مشخصات:
- آنتن 2.4 گیگاهرتز روی بورد
- برد 100 متر
- نرخ تبادل اطلاعات قابل تنظیم از 250 کیلوبیت تا 2 مگابیت بر ثانیه
- Auto Acknowledge
- Re-Transmit Auto
- Multiceiver با 6 دیتاپایپ
- دارای 32 بایت FIFO بصورت مجزا برای TX و RX
- پایه های ورودی با تحمل ولتاژ 5 ولت
- قابلیت تنظیم کانال ارتباطی از 2400 مگاهرتز تا 2525 مگاهرتز (125کانال قابل انتخاب)
- حداقل نیاز به قطعات جانبی جهت راه اندازی
- ترتیب پایه ها :VCC ، CE ، CSN ، SCK ، MOSI ، MISO ، IRQ
شماتیک مدار:
مثال آردوینو:جهت سفارش این کالا، به این بخش در فروشگاه آفتاب رایانه مراجعه نمایید.کد:/* # Be name Khoda! # A Mirf example to test the latency between two Ardunio. # Company : AftabRayaneh # Website : http://shop.aftabrayaneh.com # Developers : Reza Najafi, Elham Rasekh # Date : 09.09.2013 # Version : 3.0 * Pins: * Hardware SPI: * MISO -> 12 * MOSI -> 11 * SCK -> 13 * * Configurable: * CE -> 8 * CSN -> 7 */ #include <SPI.h> #include <Mirf.h> #include <nRF24L01.h> #include <MirfHardwareSpiDriver.h> const int MAX_BUFFER_LEN = 16; String Receive_Address = "clie1"; //A name that is dedicated to this station; MAX is 5 Char. String Send_Address = "clie2"; //A name that is dedicated to another station; MAX is 5 Char. String strMirfBuffer=""; byte Transfer_Lock=0; void setup() { Serial.begin(9600); Setup_Mirf(); // initializing overall needed... sendData("TALK"); } void loop() { if (!Mirf.isSending()) check_MirfBuffer(); read_SerialBuffer(); } //This function checks mirf data availability. if data is available, put it in the buffer and generates an event. void check_MirfBuffer() { if (Mirf.dataReady()) { while(Mirf.dataReady()) { int tmp_index=0; byte tmp_buffer[4]={0}; Mirf.getData(tmp_buffer); while(tmp_buffer[tmp_index] && tmp_index<4 ) { strMirfBuffer = strMirfBuffer + char(tmp_buffer[tmp_index]); tmp_index++; } if (strMirfBuffer.length() >= MAX_BUFFER_LEN ) buffer_ready(); if (!Mirf.dataReady()) delay(2); } } else if (strMirfBuffer.length()>0 ) buffer_ready(); } //This function sends a 4 byte packet void sendPacket(char packet[5]) { Mirf.send((byte *)packet); while(Mirf.isSending()); } //This function sends data void sendData(String strData) { int StrLen=0; String tmp_Str=""; Serial.print("sending data: "); Serial.print(strData); Transfer_Lock=1; StrLen=strData.length(); Serial.print(" : "); Serial.println(StrLen); //parsing the data to 4 character packets (byte *)packet while (StrLen>0) { char tmp_Char[5]={0}; if(StrLen>4) { tmp_Str=strData.substring(0,4); strData=strData.substring(4); } else { tmp_Str=strData; strData=""; } tmp_Str.toCharArray(tmp_Char, 5);; sendPacket(tmp_Char); StrLen=strData.length(); } Transfer_Lock=0; } //This function parses received commands from another nrfs. void buffer_ready() { if (strMirfBuffer == "TALK") { sendData("HURRAY !"); Serial.println("Talking..."); } //and parse other commands so on ... else { Serial.print("<"); Serial.print(strMirfBuffer); Serial.println(">"); } clear_buffer(); } //This function forms a buffer of serial data and send it void read_SerialBuffer() { if(Serial.available()) { char CharData; String StrSerialBuffer=""; while (Serial.available() && StrSerialBuffer.length() < MAX_BUFFER_LEN ) { CharData=Serial.read(); StrSerialBuffer=StrSerialBuffer + CharData; if (!Serial.available()) delay(1); } while (Transfer_Lock); //wait for transfer process sendData(StrSerialBuffer); } } //This function initializes overall needed for wireless communication void Setup_Mirf() { char Receive_Adr_Char[6]; char Send_Adr_Char[6]; Receive_Address.toCharArray(Receive_Adr_Char, 6); Send_Address.toCharArray(Send_Adr_Char, 6); Mirf.spi = &MirfHardwareSpi; Mirf.init(); Mirf.setRADDR((byte *)Receive_Adr_Char); Mirf.setTADDR((byte *)Send_Adr_Char); Mirf.payload = sizeof(unsigned long); Mirf.config(); //reg - Start byte rf_setup = 0; Mirf.readRegister( RF_SETUP, &rf_setup, sizeof(rf_setup) ); if (rf_setup != 0) Serial.println("Beginning ... "); else { Serial.println( "Wireless did not initialize!" ); while (rf_setup==0); } delay(100); } //This function clears the buffer void clear_buffer () { strMirfBuffer=""; }
ویرایش توسط max : 10-31-2013 در ساعت 01:12 PM
================================
سلام
این کد برای یک جفت +nrf24l01 تولید شده است ، فرض بر این هست که هر کدام از ماژول ها به یک برد آردوینو متصل هست ،کافی هست فقط این دو خط رو تغییر بدید و بعد روی هر برد جداگانه آپلود کنید.
String Receive_Address = "clie1"; String Send_Address = "clie2";
.
به صورت پیش فرض یکی از بردها به نام clie1 و برد دیگر clie2 نامگذاری شده ، پس توجه داشته باشد در زمان آپلود کد بر روی برد دوم حتما جای اسامی رو به این ترتیب تغییر بدید:
String Receive_Address = "clie2"; String Send_Address = "clie1";
.
بعد از اجرای کد در صورتی که از کنسول سریال مونیتور آردوینو استفاده کنید باید به راحتی بتونید پیام ها رو به صورت متنی برای برد دوم ارسال و دریافت کنید.
=====================================
سلام
این 11 12 13 پایه های برد آردوینو هست ، باید معادلش رو روی میکرو مورد نظر خودتون پیدا کنید.
* MISO -> 12 * MOSI -> 11 * SCK -> 13 * * Configurable: * CE -> 8 * CSN -> 7 */
=============================================
با سلام من آردوینو مگا رو با آردوینو پرو مینی را با این ماژول بیسیم به هم وصل کردم
فقط یادتون باشه شما با استفاده از کتابخانههای بالا نمیتونید پایه هارو خودتون عوض کنید پس بل اجبار باید از دیتا شیت آردیونو خودتون پایهای فوق ( * MISO -> 12 * MOSI -> 11 * SCK -> 13 * * Configurable: * CE -> 8 * CSN -> 7 */) را پیدا کنید
==============================================
طبق دیتا شیت باید که از 1.9 تا 3.5 کارکنه و ولتاژ 2.5 به نظر ایمن میاد برای کار (ولتاژ 2.5 با تقیسم ولتاژ دو مقاومت 10 کیلو از پین VCC میکرو گرفته شده است)
البته از خود کتابخانه SPI واسه تست کردن استفاده کردم و تمام مود ها و تقسم کلاک ها را نیز چک کردم به نظر تو کلاک های پاینتر پایدارتر میاد اما باز هم نتیجه ای نگرفتم
ممکن است به خاطر کیفیت پایین محصولات چینی باشه.
=============================
مشکل حل شد. سیم بندی برای Mega2560 باید به صورت زیر باشد:
MISO -> 50
MOSI -> 51
SCK -> 52
CE -> 8
CSN -> 7
GND -> GND
VCC -> 3.3v
==================================
من از یک Arduino Pro Mini که به یک سنسور دما و رطوبت DHT 22 متصل است استفاده کردم. طرف دیگه یک آردینو Uno بود که مقادیر رو دریافت می کنه و روی یک Liquid Crystal نمایش میده. با همه ماژول های NRF که 8 پایه هستند تست کردم و با همشون به خوبی کار میکنه.
کد ارسال:کد دریافتکد:/* YourDuinoStarter Example: nRF24L01 Transmit Joystick values - WHAT IT DOES: Reads Analog values on A0, A1 and transmits them over a nRF24L01 Radio Link to another transceiver. - SEE the comments after "//" on each line below - CONNECTIONS: nRF24L01 Modules See: http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo 1 - GND 2 - VCC 3.3V !!! NOT 5V 3 - CE to Arduino pin 9 4 - CSN to Arduino pin 10 5 - SCK to Arduino pin 13 6 - MOSI to Arduino pin 11 7 - MISO to Arduino pin 12 8 - UNUSED - Analog Joystick or two 10K potentiometers: GND to Arduino GND VCC to Arduino +5V X Pot to Arduino A0 Y Pot to Arduino A1 - V1.00 11/26/13 Based on examples at http://www.bajdi.com/ Questions: terry@yourduino.com */ /*-----( Import needed libraries )-----*/ #include "DHT.h" #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> /*-----( Declare Constants and Pin Numbers )-----*/ #define CE_PIN 9 #define CSN_PIN 10 //#define JOYSTICK_X A0 //#define JOYSTICK_Y A1 #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT22 // DHT 22 (AM2302) // NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe /*-----( Declare objects )-----*/ RF24 radio(CE_PIN, CSN_PIN); // Create a Radio /*-----( Declare Variables )-----*/ int data[3]; // 2 element array holding Joystick readings DHT dht(DHTPIN, DHTTYPE); void setup() /****** SETUP: RUNS ONCE ******/ { Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); dht.begin(); }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { //joystick[0] = analogRead(JOYSTICK_X); //joystick[1] = analogRead(JOYSTICK_Y); float h = dht.readHumidity(); float t = dht.readTemperature(); data[0] = 1; data[1] = 100;//h; data[2] = 200;//t; radio.write( data, sizeof(data) ); //delay(1000); }//--(end main loop )--- /*-----( Declare User-written Functions )-----*/ //NONE //*********( THE END )***********کد:/* YourDuinoStarter Example: nRF24L01 Receive Joystick values - WHAT IT DOES: Receives data from another transceiver with 2 Analog values from a Joystick or 2 Potentiometers Displays received values on Serial Monitor - SEE the comments after "//" on each line below - CONNECTIONS: nRF24L01 Modules See: http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo 1 - GND 2 - VCC 3.3V !!! NOT 5V 3 - CE to Arduino pin 9 4 - CSN to Arduino pin 10 5 - SCK to Arduino pin 13 6 - MOSI to Arduino pin 11 7 - MISO to Arduino pin 12 8 - UNUSED - V1.00 11/26/13 Based on examples at http://www.bajdi.com/ Questions: terry@yourduino.com */ /*-----( Import needed libraries )-----*/ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display /*-----( Declare Constants and Pin Numbers )-----*/ #define CE_PIN 9 #define CSN_PIN 10 // NOTE: the "LL" at the end of the constant is "LongLong" type const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe /*-----( Declare objects )-----*/ RF24 radio(CE_PIN, CSN_PIN); // Create a Radio /*-----( Declare Variables )-----*/ int data[3]; // 2 element array holding Joystick readings void setup() /****** SETUP: RUNS ONCE ******/ { Serial.begin(9600); delay(1000); Serial.println("Nrf24L01 Receiver Starting"); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening();; lcd.init(); // initialize the lcd lcd.backlight(); }//--(end setup )--- void loop() /****** LOOP: RUNS CONSTANTLY ******/ { if ( radio.available() ) { // Read the data payload until we've received everything bool done = false; while (!done) { // Fetch the data payload done = radio.read( data, sizeof(data) ); //Serial.print("H = "); //Serial.print(data[1]); //Serial.print(" T = "); //Serial.println(data[2]); lcd.clear(); lcd.setCursor(0,0); lcd.print("Channel: "); lcd.print(data[0]); lcd.setCursor(0,1); lcd.print("H: "); lcd.print(data[1]); lcd.print(" T: "); lcd.print(data[2]); delay(500); } } else { //Serial.println("No radio available"); lcd.clear(); lcd.print("No radio available"); delay(500); } }//--(end main loop )--- /*-----( Declare User-written Functions )-----*/ //NONE //*********( THE END )***********
امّا از دو طرف فقط توی سریال صفر میبینم...
دوستانی که کار کردن با این ماژول و یا اطلاعاتی دارن لطفاً راهنمایی کنید...
قسمت SETUP هر دو تا برنامه یکی هست و فقط جای آدرس pipe ها (read و write)عوض شده
اون قسمت setRetries هم با 15و15 هم همین طور کار می کرد...
من چیز دیگه ای، به ذهنم نمیرسه دوستان اگر چیزی میدونند لطفاً کمک کنید...
لینک پرشین*گیگ:
Download LIBRARIES.zip
لینک از سرور همین سایت:
LIBRARIES.zip
من کد شما رو تست کردم و خب دقیقا همون جواب 0 رو دریافت کردم ولی چون من دقیقا نمیدونم میخواید چه کار انجام بدید نمی دونم کد رو اون جور که میخواید تونستم تغییر بدم یا نهاین هم لینک دانلود دوتا کتابخونه rf24,nRF24l01 ممنون میشم...
لینک پرشین*گیگ:
Download LIBRARIES.zip
لینک از سرور همین سایت:
فایل پیوست 1159
حالا این کد هارو میزارم ببینید به درد کارتون میخوره یا بازهم اگر مشکل داره بگید تغیرش بدم
کد مگا به عنوان فرستندهکد uno به عنوان گیرندهکد:/* ####UPLOAD TO MEGA#### # MOSI==>51 # # MISO==>50 # # SCK===>52 # # # # # # # # # # # ## # CE_pin 7&CSN_pin 8 # ###################### */ //====# header files #==== #include<SPI.h> #include<nRF24l01.h> #include<RF24.h> //====# define #==== #define CE_pin 7 #define CSN_pin 8 //====# pre initializing #==== RF24 radio(CE_pin,CSN_pin); const uint64_t mega_to_uno_pipe=0x0f0f0f0f01LL; //40 bit add, differs in lsb const uint64_t uno_to_mega_pipe=0x0f0f0f0f02LL; // LL means long-long int A[1]; bool done; //====# SetUp part #==== void setup(){ Serial.begin(9600); radio.begin(); radio.setPayloadSize(sizeof(A)); radio.openReadingPipe(1,mega_to_uno_pipe); radio.openWritingPipe(uno_to_mega_pipe); radio.setRetries(0,0); radio.setDataRate(RF24_1MBPS); } //====# The main program #==== void loop(){ A[0] = 0xF0; done=radio.write( A, 1 ); Serial.print(done); delay(100); }کد:/* ####UPLOAD TO UNO#### # MOSI==>11 # # MISO==>12 # # SCK===>13 # # # # # # # # # # # # #CE_pin 7&CSN_pin 8 # ##################### */ //====# header files #==== #include<SPI.h> #include<nRF24l01.h> #include<RF24.h> //====# define #==== #define CE_pin 7 #define CSN_pin 8 //====# pre initializing #==== RF24 radio(CE_pin,CSN_pin); const uint64_t mega_to_uno_pipe=0x0f0f0f0f01LL; //40 bit add, differs in lsb const uint64_t uno_to_mega_pipe=0x0f0f0f0f02LL; // LL means long-long int A[1]; bool done=false; //====# SetUp part #==== void setup(){ A[0] = 0x000; Serial.begin(9600); radio.begin(); //radio.setPayloadSize(sizeof(A)); radio.openReadingPipe(1,uno_to_mega_pipe); radio.openWritingPipe(mega_to_uno_pipe); radio.setRetries(0,0); radio.setDataRate(RF24_1MBPS); pinMode(13,OUTPUT); radio.startListening(); } //====# The main program #==== void loop(){ if (radio.available()){ while (true){ radio.read(&A,sizeof(A)); if(A[0]==0xF0){ done=true; } //radio.stopListening(); digitalWrite(13,done); Serial.print("Done: "); Serial.println(done); Serial.print("A[0]: "); Serial.println(A[0],HEX); delay(100); } } }
ویرایش توسط navidnkh : 11-10-2014 در ساعت 06:15 PM
بسم الله الرحمن الرحیم
0)من اینو خریدم منتها قاعدتا این کد برای سایر بوردهای NRF24l01 هم جواب می ده:
ماژول انتقال بیسیم اطلاعات +NRF24L01 ( فرکانس 2.4G ) + آنتن
1) برای رفع مشکل تغذیه شما می تونید با موازی کردن دو خازن در رنج های ۱۰۰ نانو فاراد و ۱۰ میکرو فاراد با تغذیه ۳/۳ ولتی اون هر نویزی رو از روی تغذیه حذف کنید و مطابق شکل زیر سیم کشی ها رو انجام بدید:
2)من از کتابخونه RF24 استفاده کردم؛ فایل فشرده RF24 رو unzip کنید و توی فولدر libraries قرار بدید.
github.com/tmrh20/RF24
3)فایل فشرده my_RF24_T کد مربوط به فرستنده هست و فایل فشرده my_RF24_R کد مربوط به گیرنده هست.
اتصال پین ها باید با کد انطباق داشته باشه:امیدوارم مفید بوده باشه.کد:// Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 RF24 radio(7,8);
- =================================
-
آقا دمت گرم
جواب داد!!!
واقعا ممنونم...
دوستانی که مثل من از یه دنیا کتابخونه الکی خسته شدید میتونید با همین RF24 و توضیحات کامنت شده توی برنامه همایون مشکلتون رو حل کنید
homayoun جان ممنون
navidnkh جان واقعا ممنون بابت پشتیبانی و پیگیری هات...
و mshams از شما هم ممنون که کمک کردید
بشه که جبران کنم
-
=================================
ممکنه به خاطر سیم بندیتون هم باشه تا جایی که میتونید سیم هایی را که استفاده میکنید چک بفرمایید
-
===============================
دوستان من یک مودم یا فرستنده انترنت میخوام که 7 8 کیلومتر هوای برد داشته باشه ایا چیزی هست.؟ یا چجوری میتونم با کمترین هزینه راه بندازم. منط.ه کارمون بیابون هست و فاصله 7 8 کیلومتریمون یک ابادی هستش ک اونجا اینترنت داره و من میخوام یک خط اینترنت توی یکی از خانهای اونجا بگیرم و با یک مودم یا چیز دیگه اینتر بگیرم توی مسیرم هیچ مانعی نیست صاف صاف هستش حالا ممنون میشم از دوستانی که اطلاعات یا اگاهی دارن در اختیارم بگدارن.
1-همچین فرستنده ای که ورودی سریال داشته باشه با همچین بردی هیچ جا پیدا نمیکنی.
2-شما اصلا با یه بورد 4 هسنه ای کار کن..ولی باید در حد یک سیستم عامل تو لینوکس برنامه بنویسی که یک عکس یا صفحه وب رو با مثلا spi انتقای بدی!
اگر اونجا موبایل آنتن میده با همون gprs کنار بیا که در بیابان لنگه کفش غنیمته!
-
=============================
-
از این لینک استفاده کنید
How to Install Libraries in the Arduino
- ===============================