Arduino İle NRF24L01 Wireless Modülü Kullanımı
Bu derste nRF24L01 alıcı-verici modüllerini kullanarak iki Arduino kartı arasında nasıl kablosuz iletişim kurulacağını öğreneceğiz. nRF24L01 modülü kablosuz iletişim için çok popüler bir seçimdir.
NRF24L01 İle Basınç ve Sıcaklık Verisi Aktarma
Bu eğitim için, bir Arduino’ya bağlı bir BMP280 barometrik basınç ve sıcaklık sensörü kullanacağız ve ardından bu verileri biraz uzaktaki ikinci bir Arduino’ya iletmek için iki NRF24L01 dijital alıcı-verici tarafından sağlanan bir 2.4GHz radyo bağlantısını kullanacağız. Aradaki duvarlara bağlı olarak bu mesafe yaklaşık 50 m’den az olmalıdır.
Burada, I2C ile bağlı bir BMP280 ve SPI ile bağlı NRF24L01 ile donatılmış bir Arduino’ya sahip olacağız. Bu, gelen verileri seri monitörde görüntüleyecek bir alıcı olarak çalışan ikinci bir NRF24L01 ile donatılmış ikinci bir Arduino’ya bir radyo sinyali iletecektir. LCD ekran da kullanabilirsiniz. NRF24L01 her iki yönde de çalışabilir. Örneğin, alıcı bir onay ile yanıt verebilir, ancak bu, bu demo için ihtiyacımız olandan daha fazla karmaşıklık katacaktır.
Akılda tutulması gereken bir şey, bu gerçek bir SHF (Süper Yüksek Frekans) radyo bağlantısıdır ve tüm bu tür radyo bağlantıları gibi, ne kadar yüksekse o kadar iyidir. Ayrıca, etkisiz hale getirilmiş bir ışık demeti gibi “davranma” eğilimindedir, bu nedenle ne kadar az engel o kadar iyi.
NRF24L01 Nedir?
NRF24L01, 2.4GHz ISM bandında (ISM, Endüstriyel, Bilimsel ve Medikal anlamına gelir) veri iletme ve alma yeteneğine sahip, SPI bağlantılı bir dijital alıcı-vericidir. 250 kbps’den 2 Mbps’ye kadar baud hızlarında çalışabilir. Açık alanda ve daha düşük baud hızında kullanıldığında menzili 100 metreye kadar çıkabilir. Bu, Bluetooth ve WiFi tarafından kullanılan bantla aynıdır ve düşük güçlü olduğu için lisans gerektirmez. 3V ile çalışan bir modüldür. VCC pinini doğrudan UNO’nun 3.3V pininden sürebilirsiniz. SPI arayüzü 10mbps’ye kadar çalışır. Her modül, 2.400 ile 2.525 GHz arasında aynı frekans veya kanalda çalıştırılır. Her kanal içinde, her kanalda 6 adede kadar bağlantıya izin veren 6 ‘pipes(boru)’ vardır. Bu, bir master’ın tümü aynı kanalda ancak farklı ‘borularda’ 6 slave dinleyebileceği anlamına gelir.
NRF24L01’in 3 adet varyantı bulunmaktadır. Bu varyantların pin şeması aynıdır.
NRF24L01 Özellikleri
- 2.4GHz bandında yayın yapabilir.
- 250KBps, 1MBps ve 2MBps gibi hızlarda haberleşme hızı seçilebilir.
- Gelişmiş ShockBurst™ hızlandırma protokolünü desteklemektedir.
- Ultra düşük güç tüketimi
- Çalışma Voltajı: 1.9-3.6V
- IO Portları Çalışma Voltajı:0-3.3V/5V
- Verici Sinyal Gücü: +7 dB
- Alıcı Hassasiyeti ≤ 90dB
- Haberleşme Mesafesi: Açık Alanda 250m
- Boyutları: 15x29mm
NRF24L01 Pin Şeması
NRF24L01’in değişik varyantları bulunduğunu ve bunların pin şemasının hepsinde aynı olduğunu yukarıda söylemiştik.
NRF24L01 | Arduino Uno |
VCC | 3.3V |
GND | GND |
MOSI | 11 |
MISO | 12 |
SCK | 13 |
CE | 9 |
CSN | 8 |
IRQ | Kullanılmadı |
BMP280 Barometrik Basınç Sensörü
BMP280, nereden satın aldığınıza bağlı olarak farklı tiplerde gelir. Bazılarının 5V, bazılarının ise 3.3V sensörler olduğuna dikkat edin. Ayrıca, bazıları SPI veya I2C’dir ve bazıları değildir. Bu makale I2C 3.3V sürümü kullanacaktır. Bu, 3.3V olmasına rağmen, veri pinlerinde 5V uyumludur. NRF24L01, SPI veri haberleşmesini kullandığı için biz I2C sürümü kullanıyoruz.
Basınç aralığı 300 hPa ila 1100 hPa’dır, bu da deniz seviyesinden yaklaşık 10m aşağıdan 9km yüksekliğe kadardır. 950hPa ile 1050 hPa arasında, irtifa doğruluğu +/-1m’dir ve bu oldukça iyi bir hata payıdır.
Bazı birimlerde I2C adresi 0x77, bazılarında ise 0x76’dır. Burada Arduino oyun alanında kullanışlı bir adres tarayıcı var. Adresi bulamazsa, kablolamanızı kontrol edin.
BMP280 | Arduino Uno |
VCC | 3.3V |
GND | GND |
SCL | A5 |
SDA | A4 |
CSB | Kullanılmadı |
SDD | Kullanılmadı |
NRF24L01,BMP280 ve Arduino Bağlantı Şeması
Projede gerekli malzemeler aşağıdadır:
- 2 Adet Arduino Uno
- 2 Adet NRF24L01 Modülü
- 1 Adet BMP280 Barometrik Basınç Sensörü
- 1 Adet Breadbord
- Jumper Kablolar
Bağlantı şemamız aşağıdadır.
Yüklenecek Kütüphaneler
Yüklenmesi gereken kütüphaneler aşağıdadır:
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- #include <Adafruit_BMP280.h>
- SPI.h standart arduino kütüphanesidir
Kodlar Hakkında Genel Bilgiler
- sizeof() işlevi, değişkenin uzunluğunu bayt cinsinden algılar, yani bir int 2 bayt uzunluğunda, float 4 bayt vb.
- NRF24’ün gerçekte gönderdiği sizeof() uzunluğunda bir bayt dizisi olduğundan, alıcı tarafta eşleşen bir veri tipine sahip olmanız ZORUNLUDUR.
- Alıcı tarafta 2 baytı 1 bayta doldurmaya çalışırsanız, çöp alırsınız.
- Bir dizi kullanıyorsanız, 32 bayt sınırını aşmamak koşuluyla bir mesajda birkaç veri gönderebilirsiniz. Herhangi bir türde veri, yani karakter dizileri, tam sayılar veya kayan değerler gönderebilirsiniz. Alıcının aynı veri türünü yakalamayı beklediğinden emin olun. Örneğimizde, 3 ondalık değer istediğimiz için 3 kayan noktalı bir dizi kullanıyoruz. Tek bir mesajın maksimum uzunluğu 32 bayttır. Yani 3 yüzer 12 bayta ihtiyaç duyar ve bol miktarda boşluk bırakır.
- CE ve CSN dışındaki tüm pinler belirtildiği gibi bağlanmalıdır. Ancak, bu ikisi herhangi bir uygun pin olabilir ve şöyle bildirilir: RF24 nrf(9, 8); // CE, CSN
Master İçin Arduino Kodu
//nrf2401 transmitter:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_BMP280.h>
RF24 nrf(9, 8); // CE, CSN
Adafruit_BMP280 bmp;
const byte linkAddress[6] = "link1";
float QNH = 1022.67; //Change the "1022.67" to your current sea level barrometric pressure (https://www.wunderground.com)
const int BMP_address = 0x76;
float pressure;
float temperature;
float altimeter;
float data[3];
char charVal[17];
////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600);
Serial.println("BMP280/NRF24L01 link");
nrf.begin();
bmp.begin(BMP_address);
nrf.openWritingPipe(linkAddress); //set the address
//nrf.setPALevel(RF24_PA_LOW); //keep tx level low to stop psu noise, can remove this but then put in decoupling caps
// Options are: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=0dBm.
nrf.setPALevel(RF24_PA_HIGH);
nrf.stopListening(); //act as a transmitter
}
///////////////////////////////////////////////////
void loop()
{
pressure = bmp.readPressure()/100; //and conv Pa to hPa
temperature = bmp.readTemperature();
altimeter = bmp.readAltitude (QNH); //QNH is local sea lev pressure
data[0] = pressure;
data[1] = temperature;
data[2] = altimeter;
//----- display on local monitor: ------------
Serial.print(data[0]); Serial.print("hPa ");
Serial.print(data[1]);
Serial.write(0xC2); //send degree symbol
Serial.write(0xB0); //send degree symbol
Serial.print("C ");
Serial.print(data[2]); Serial.println("m");
//---------------------------------------------
nrf.write(data, sizeof(data)); //spit out the data array
delay(300);
}
Master Kodu Açıklama
- float QNH = 1022.67; QNH bir havacılık terimidir. Bir altimetreye uygulandığında, mevcut konumda deniz seviyesinden yüksekliği doğru bir şekilde okumasını sağlayacak bir düzeltme faktörüdür. Bu günden güne hatta saatten saate değişir. Pilotların altimetrelerini kalibre etmek için her uçtuklarında bunu ayarlamaları gerekir. Pilotlar, örneğin okyanus üzerinde uçarken bunu alamazlarsa, hepsi 1013 kullanır, o zaman altimetrelerinin tümü aynı referansı kullanarak okur. Bu, çarpışmayı önlemek için aralıklı yüksekliklerde uçmalarını sağlar. Hava durumu web sitelerinden edinilebilir.
- Örneğin, Cape Town’da: Bu siteden bakabilirsiniz.
- Bunu yapmak zorunda değilsin. Ancak bulunduğunuz yerdeki irtifa okumasının düzeltilmiş bir değeri olmadan, yanlış olacaktır (atmosferik basınçtaki yerel değişiklikleri dikkate almanız gerektiğinden) ve hatta negatif gösterebilir. Gerçek basınç ve sıcaklık hala doğrudur.
- nrf.openWritingPipe(bağlantıAdresi); 125 kanaldan birini başlatır. Verici ve alıcı aynı adrese sahip olmalıdır.
- nrf.setPALevel(RF24_PA_HIGH); vericinin güç seviyesini ayarlar. YÜKSEK(HIGH), 3,3V gücünüz uzun kablolardan geçiyorsa, kararsızlık sorunlarına neden olabilir. Üzerine 100 uF kapasitör yerleştirmek en iyisidir, ancak daha uzun pil ömrü için DÜŞÜK(LOW) daha iyi olabilir.
- nrf.stopListening(); modüle bir verici gibi davranmasını söyler ve bunun tersine, nrf.startListening(); alıcı gibi davranmasını söyler.
- İletilecek veriler yerel olarak seri monitörde (bağlıysa) yazdırılır ve ayrıca alıcıya gönderilir. Serial.write(0xC2) satırları; Serial.write(0xB0); seri monitöre bir derece sembolü gönderin (bu, bazı PC’ler için farklı olabilir).
- Bir LCD kullanıyorsanız bunu şununla yapabilirsiniz: lcd.print((char) 223); // derece işareti ekle.
- Son olarak, nrf.write(data, sizeof(data)); veri dizisinin içeriğini iletir. Kaç bayt gönderileceğini bilmesi gerektiğini ve sizeof() bunu aldığını unutmayın.
Slave İçin Arduino Kodu
//nrf2401 receiver
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 nrf(9, 8); // CE, CSN
const byte linkAddress[6] = "link1"; //address through which two modules communicate.
const byte greenLED = 10;
float data[3];
/////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600);
Serial.println("Starting");
pinMode(greenLED, OUTPUT);
nrf.begin();
nrf.openReadingPipe(0, linkAddress); //set the address
nrf.startListening(); //Set nrf as receiver
}
///////////////////////////////////////////////////
void loop()
{
digitalWrite(greenLED, HIGH);
delay(50);
digitalWrite(greenLED, LOW);
delay(50);
if (nrf.available()) //Read the data if available in buffer
{
nrf.read(&data, sizeof(data));
Serial.print(data[0]); Serial.print("hPa ");
Serial.print(data[1]);
Serial.write(0xC2); //send degree symbol
Serial.write(0xB0); //send degree symbol
Serial.print("C ");
Serial.print(data[2]); Serial.println("m");
}
}
Slave Kodu Açıklama
Kodun çoğu ana koda oldukça benzer, ancak nrf.openReadingPipe(0, linkAddress); 6 borudan birini başlatır. Verici ve alıcı aynı adrese sahip olmalıdır. Burada hangi okuma borusunun kullanıldığını ayarlayan ek bir parametre olduğunu unutmayın (bu durumda 0).
Seri Moditör’de Veri Çıktısı
Her şey doğru şekilde kablolanmışsa, alıcı Arduino’daki seri monitör aşağıdakileri göstermelidir:
NRF24L01 modülü ile yapılmış diğer projelere aşağıdaki linklerden ulaşabilirsiniz.