Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

29 Haziran 2021 Salı

nRF24L01 modül Arduino ile kullanımı

nRF24L01 modül Arduino ile kullanımı


Genel Bakış


Kablosuz iletişimi açıklamak için iki örnek yapacağız, ilki bir Arduino'dan diğerine basit bir "Merhaba Dünya" mesajı gönderecek ve ikinci örnekte Arduino kartları arasında çift yönlü bir iletişim olacak. İlk Arduino'daki Joystick ile ikinci Arduino'daki servo motoru kontrol edeceğiz ve tam tersi, ikinci Arduino'daki butonu kullanarak ilk Arduino'daki led'i kontrol edeceğiz.

NRF24L01 Alıcı-Verici Modülü - Nasıl Çalışır

NRF24L01 alıcı-verici modülüne daha yakından bakalım. 2.4 GHz bandını kullanır ve 250 kbps'den 2 Mbps'ye kadar olan baud hızlarında çalışabilir. Açık alanda kullanılırsa ve daha düşük baud hızı ile menzili 100 metreye kadar ulaşabilir.

NRF24L01 Alıcı-Verici Modülü

Modül 125 farklı kanal kullanabilir ve bu da tek bir yerde bağımsız olarak çalışan 125 modemden oluşan bir ağa sahip olma imkanı sağlar. Her kanal 6 adede kadar adrese sahip olabilir veya her bir ünite aynı anda 6 adede kadar diğer ünite ile iletişim kurabilir .

Kanalların ve Adreslerin Çalışma Esasları

Bu modülün güç tüketimi, iletim sırasında tek bir LED'den bile daha düşük olan 12mA civarındadır. Modülün çalışma voltajı 1.9 ila 3.6V arasındadır, ancak iyi olan şey, diğer pinlerin 5V mantığını tolere etmesidir, böylece herhangi bir mantık seviyesi dönüştürücü kullanmadan kolayca bir Arduino'ya bağlayabiliriz.

NRF24L01 Alıcı-Verici Modülü Pin Çıkışları Bağlantıları

Bu pinlerden üçü SPI iletişimi içindir ve Arduino'nun SPI pinlerine bağlanmaları gerekir, ancak her Arduino kartının farklı SPI pinlerine sahip olduğuna dikkat edin. CSN ve CE pinleri, Arduino kartının herhangi bir dijital pinine bağlanabilir ve modülü bekleme veya aktif modda ayarlamak ve ayrıca iletim veya komut modu arasında geçiş yapmak için kullanılır. Son pim, kullanılması gerekmeyen bir kesme pimidir.

NRF24L01 modüllerinin birkaç çeşidi vardır. En popüler olanı yerleşik antene sahip olandır. Bu, modülün daha kompakt olmasını sağlar, ancak diğer yandan iletim aralığını yaklaşık 100 metrelik bir mesafeye düşürür.

NRF24L01 çipine dayalı çeşitli modüller

İkinci varyasyon, yerleşik anten yerine, bir SMA konektörüne sahiptir ve daha iyi iletim aralığı için bir ördek anteni ekleyebiliriz.

Burada gösterilen üçüncü varyasyon, ördek antenine ek olarak, PA (Güç Amplifikatörü) ve LNA (Düşük Gürültülü Amplifikatör) içeren bir RFX2401C çipine sahiptir Bu, NRF24L01 sinyalini güçlendirir ve açık alanda 1000 metreye kadar daha iyi iletim aralığı sağlar.

NRF24L01 Modül Pin Çıkışı

İşte NRF24L01 pin çıkışı ve NRF24L01 + PA / LNA modülüne ayrıntılı bir bakış.

NRF24L01 Pin Çıkışı ve NRF24L01 + PA LNA .png

Her iki modül de, NRF24L01 ve NRF24L01 + PA / LNA aynı pin çıkışına sahiptir, bu yüzden onları devremize aynı şekilde bağlayabiliriz.

Devre şeması

NRF24L01 modüllerini Arduino kartlarına nasıl bağlamamız gerektiği aşağıda açıklanmıştır.

NRF24L01 ve Arduino Öğretici Devre Şeması

Daha önce de bahsettiğim gibi, her Arduino kartının farklı SPI pinleri vardır, bu yüzden modülleri Arduino kartınıza bağlarken bunu aklınızda bulundurun.

Arduino SPI Pinleri

Arduino ve NRF24L01 Kodu

NRF24L01 modüllerini Arduino kartlarına bağladıktan sonra hem verici hem de alıcı için kodlar yapmaya hazırız.

Öncelikle  , programlamayı daha az zorlaştıran RF24 kütüphanesini indirip kurmamız gerekiyor .

İşte kablosuz iletişim için iki kod ve bunların açıklaması aşağıdadır.

Verici Kodu

/*
* Arduino Wireless Communication Tutorial
* Example 1 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}

Alıcı kodu

/*
* Arduino Wireless Communication Tutorial
* Example 1 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}

Açıklama:

Bu nedenle, temel SPI ve yeni kurulan RF24 kitaplıklarını dahil etmemiz ve bir RF24 nesnesi oluşturmamız gerekiyor. Buradaki iki argüman CSN ve CE pinleridir.

RF24 radio ( 7 , 8 ) ; // CE, CSN

Daha sonra, adresi temsil edecek bir bayt dizisi veya iki modülün iletişim kuracağı sözde boruyu oluşturmamız gerekir.

const byte address[6] = "00001";

Bu adresin değerini herhangi bir 5 harfli diziye değiştirebiliriz ve bu, hangi alıcıyla konuşacağımızı seçmemizi sağlar, böylece bizim durumumuzda hem alıcıda hem de vericide aynı adrese sahip olacağız.

Kurulum bölümünde radyo nesnesini başlatmamız gerekiyor ve radio.openWritingPipe () fonksiyonunu kullanarak veri göndereceğimiz alıcının adresini, daha önce belirlediğimiz 5 harfli diziyi ayarlıyoruz.

radio.openWritingPipe(address);

Öte yandan alıcıda radio.setReadingPipe () fonksiyonunu kullanarak aynı adresi ayarlıyoruz ve bu şekilde iki modül arasındaki iletişimi sağlıyoruz.

radio.openReadingPipe(0, address);

Daha sonra radio.setPALevel () işlevini kullanarak Güç Amplifikatörü seviyesini ayarladık, bizim durumumuzda modüllerim birbirine çok yakın olduğundan minimuma ayarlayacağım.

radio.setPALevel(RF24_PA_MIN);

Daha yüksek bir seviye kullanılıyorsa, çalışma sırasında daha kararlı gerilime sahip olmaları için modüllerin GND ve 3,3 V'luk baypas kapasitörlerinin kullanılması tavsiye edilir.

Daha sonra modülü verici olarak ayarlayan radio.stopListening () fonksiyonumuz var ve diğer tarafta modülü alıcı olarak ayarlayan radio.startListening () fonksiyonumuz var.

// at the Transmitter
radio.stopListening();

// at the Receiver
radio.startListening();

Döngü bölümünde, vericide, "Merhaba Dünya" mesajını atadığımız bir karakter dizisi oluşturuyoruz. Radio.write () işlevini kullanarak bu mesajı alıcıya göndereceğiz. Buradaki ilk argüman, gönderilmesini istediğimiz değişkendir.

void loop() {
const char text[] = "Hello World";
radio.write(&text, sizeof(text));
delay(1000);
}


Değişken adından önce "&" yi kullanarak, aslında gönderilmesini istediğimiz veriyi saklayan değişkenin bir işaretini ayarlıyoruz ve ikinci argümanı kullanarak bu değişkenden almak istediğimiz bayt sayısını belirliyoruz. Bu durumda sizeof () işlevi "metin" dizelerinin tüm baytlarını alır. Programın sonunda 1 saniye gecikme ekleyeceğiz.

Diğer tarafta, alıcıda, döngü bölümünde radio.available () işlevini kullanarak alınacak veri olup olmadığını kontrol ederiz. Bu doğruysa, önce gelen verileri kaydedeceğimiz "metin" adı verilen 32 öğelik bir dizi oluşturuyoruz.

void loop() {
if (radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
Serial.println(text);
}
}

Radion.read () işlevini kullanarak verileri okur ve "metin" değişkenine kaydederiz. Sonunda sadece seri monitöre metin yazdırıyoruz. Her iki programı da yükledikten sonra, alıcıda seri monitörü çalıştırabiliriz ve her saniye "Merhaba Dünya" mesajının yazdırıldığını fark edeceğiz.

Sorun giderme

Güç kaynağı gürültüsünün , NRF24L01 modülleri ile başarılı bir iletişim kurmaya çalışırken insanların karşılaştığı en yaygın sorunlardan biri olduğunu belirtmek gerekir Genel olarak, RF devreleri veya radyo frekansı sinyalleri güç kaynağı gürültüsüne duyarlıdır. Bu nedenle, güç kaynağı hattına bir dekuplaj kondansatörü eklemek her zaman iyi bir fikirdir. Kapasitör, 10 uF ila 100 uF arasında herhangi bir şey olabilir.

NRF24L01 Sorun giderme - ayırma kondansatörü ve harici güç kaynağı

Diğer bir yaygın sorun da Arduino kartlarının 3,3V pininin NRF24L01 modülüne her zaman yeterli güç sağlayamamasıdır. Bu nedenle, modülü harici bir güç kaynağıyla çalıştırmak da iyi bir fikirdir.

İki NRF24L01 modülü ile Arduino Kablosuz Çift Yönlü İletişim


İki Arduino kartı arasında çift yönlü kablosuz iletişim olan ikinci örneğe bakalım. İşte devre şemaları:

Arduino Kablosuz İletişim NRF24L01 Devre Şeması Eğitimi

Kaynak kodu

İşte iki kod ve aşağıda bunların açıklaması var.

Verici Kodu

/*
* Arduino Wireless Communication Tutorial
* Example 2 - Transmitter Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define led 12
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;
void setup() {
pinMode(12, OUTPUT);
radio.begin();
radio.openWritingPipe(addresses[1]); // 00002
radio.openReadingPipe(1, addresses[0]); // 00001
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));
delay(5);
radio.startListening();
while (!radio.available());
radio.read(&buttonState, sizeof(buttonState));
if (buttonState == HIGH) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}

Alıcı Kodu

/*
* Arduino Wireless Communication Tutorial
* Example 2 - Receiver Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#define button 4
RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;
void setup() {
pinMode(button, INPUT);
myServo.attach(5);
radio.begin();
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(1, addresses[1]); // 00002
radio.setPALevel(RF24_PA_MIN);
}
void loop() {
delay(5);
radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}
delay(5);
radio.stopListening();
buttonState = digitalRead(button);
radio.write(&buttonState, sizeof(buttonState));
}
}

Burada önceki örnekten farklı olan şey, iki yönlü iletişim için iki kanal veya adres oluşturmamız gerektiğidir.

const byte addresses[][6] = {"00001", "00002"};

Kurulum bölümünde her iki boruyu da tanımlamalıyız ve ilk Arduino'daki yazma adresinin ikinci Arduino'daki okuma adresi olması gerektiğini ve bunun tersi, ilk Arduino'daki okuma adresinin şu adrese yazma adresi olması gerektiğini unutmayın. ikinci Arduino..

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001

Radio.stopListening () işlevini kullanan döngü bölümünde, ilk Arduino'yu verici olarak ayarlıyoruz, Joystick'in değerini 0'dan 180'e okuyup eşleştiriyoruz ve radio.write () işlevini kullanarak verileri alıcıya gönderiyoruz.

radyo. dinlemeyi bırak ();
int potValue = analogRead ( A0 ) ;
int angleValue = map ( potValue, 0 , 1023 , 0 , 180 ) ;
radyo. write ( & angleValue, sizeof ( angleValue )) ;

Öte yandan radio.startListening () fonksiyonunu kullanarak ikinci Arduino'yu alıcı olarak ayarlıyoruz ve mevcut veri olup olmadığını kontrol ediyoruz. Mevcut veriler varken onu okuyacağız, "açıV" değişkenine kaydedeceğiz ve sonra bu değeri servo motoru döndürmek için kullanacağız.

radio.startListening();
if ( radio.available()) {
while (radio.available()) {
int angleV = 0;
radio.read(&angleV, sizeof(angleV));
myServo.write(angleV);
}

Daha sonra, vericide, ilk Arduino'yu alıcı olarak ayarlıyoruz ve boş bir "while" döngüsü ile ikinci Arduino'nun gönderme verisini bekleriz ve bu, basılsın veya basılmasın butonun durumu için veridir. Düğmeye basılırsa LED yanar. Yani bu süreç sürekli olarak tekrar eder ve her iki Arduino kartı da sürekli veri gönderip alır.

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.