NRF24L01 kablosuz iletişim modülü piyasadaki en uygun fiyatlı kablosuz veri akarımız sağlayabileceğiniz modüllerin başında gelmektedir. Ancak hassas yapısı nedeniyle çalıştırması da oldukça sıkıntılı bir modüldür. Bir önceki yazımızda NRF24L01 kablosuz modüllünün problemlemlerinin çözümünü incelemiştik. Eğer siz de NRF24L01 modülünü çalıştırmakta sorun yaşıyorsanız linkteki yazımızı mutlaka okuyunuz.
NRF24L01 Sorunları ve Çözümü başlıklı yazımız için tıklayınız…
İnternette bulabileceiğiniz bir çok kaynakta NRF24L01 ile tek yönlü veri aktarımı yapıldığını görürsünüz. Ancak NRF24L01 modülleri aynı anda hem alıcı hem de verici olarak kullanılabiliyor. Bu durum bize tasarlayacağınız iki cihaz arasında karşılıklı veri aktarımı imkanı sunacaktır. Bu yazımızda NRF24L01 kablosuz iletişim modülünü çift yönlü olarak kullanacağız.
ÖRNEK PROJE:
Yapacağımız örnek projede bir arduinoya bağlı joystick ile diğer arduinoya bağlı servo motoru kontrol ederken aynı anda diğer arduinodaki buton ile ana arduinoya bağlı led kontrol edeceğiz.
Gerkli malzemeler;
Arduino 2 adet,
NRF24L01 kablosuz iletişim modülü 2 adet,
Joystick 1 adet,
Led 1 adet,
Servo motor 1 adet,
Jumper kablo yeteri kadar.
NRF24L01 bağlantısı için aşağıdaki şemayı dikkate alınız.
Arduino uno ve nano için NRF24L01 bağlantısı;
GND pini arduino GDN inine, VCC pini arduino 3,3V pinine (5V pinine bağlamayınız modül zarar görecektir), CE pini arduino 7 numaralı pine, CSN pini arduino 8 numaralı pine, SCK pini arduino 13 numaralı pine, MOSI pini arduino 11 numaralı pine, MISO pini arduino 12 numaralı pine bağlanmalıdır.
Arduino mega için NRF24L01 bağlantısı;
GND pini arduino GDN inine, VCC pini arduino 3,3V pinine (5V pinine bağlamayınız modül zarar görecektir), CE pini arduino 7 numaralı pine, CSN pini arduino 8 numaralı pine, SCK pini arduino 52 numaralı pine, MOSI pini arduino 51 numaralı pine, MISO pini arduino 50 numaralı pine bağlanmalıdır.
Aşağıdaki bağlantı şemalarını inceleyerek gerekli bağlantıları yapınız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define led 2 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; boolean butonDurum = 0; void setup() { Serial.begin(9600); pinMode(12, OUTPUT); radio.begin(); radio.openWritingPipe(addresses[1]); // 00001 radio.openReadingPipe(1, addresses[0]); // 00002 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.stopListening(); int joystickveri = analogRead(A0); int joyDeger = map(joystickveri, 0, 1023, 0, 180); Serial.println(joyDeger ); radio.write(&joyDeger , sizeof(joyDeger )); delay(5); radio.startListening(); while (!radio.available()); radio.read(&butonDurum, sizeof(butonDurum)); Serial.println(butonDurum); if (butonDurum == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } |
Kodları inceleyecek olursak;
1 2 3 | const byte addresses[][6] = {"00001", "00002"}; |
Yukarıdaki kod ile iki kanal adresi oluşturuyoruz.
1 2 3 4 | radio.openWritingPipe(addresses[1]); // 00001 radio.openReadingPipe(1, addresses[0]); // 00002 |
Yukarıdaki kodlar ile bu arduino için 00001 adresinden karşı arduinoya joystick verilerini gönderirken, 00002 adresinden karşı arduinoya bağlı buton değerini okutuyoruz.
Loop döngüsü içinde ise önce dinlemeyi durdurup joystickten okunan analog değeri map komutu ile 0-180 arasına indirgedikten sonra diğer arduinoya gönderiyoruz.
Sonrasında dinlemeyi bağlatıp karşı arduinodan gelen buton değerini okutup buton durumuna göre ledimizi yakıyor ya da söndürüyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #define button 2 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = {"00001", "00002"}; Servo myServo; boolean butonDurum = 0; void setup() { Serial.begin(9600); pinMode(button, INPUT); myServo.attach(3); radio.begin(); radio.openWritingPipe(addresses[0]); // 00002 radio.openReadingPipe(1, addresses[1]); // 00001 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.startListening(); if ( radio.available()) { while (radio.available()) { int joyDeger = 0; radio.read(&joyDeger, sizeof(joyDeger)); Serial.println(joyDeger); myServo.write(joyDeger); } delay(5); radio.stopListening(); butonDurum = digitalRead(button); Serial.println(butonDurum); radio.write(&butonDurum, sizeof(butonDurum)); } } |
Yukarıdaki kodları inceleyecek olursak;
1 2 3 | const byte addresses[][6] = {"00001", "00002"}; |
Bir önceki arduino kodları için yazdığımız aynı adresleri tanımlıyoruz.
1 2 3 4 | radio.openWritingPipe(addresses[0]); // 00002 radio.openReadingPipe(1, addresses[1]); // 00001 |
Yukarıdaki kodlar ile bu arduino için 00001 adresinden karşı arduinodan gelen joystick verilerini okuturken, 00002 adresinden arduinoya bağlı buton değerini karşı arduinoya gönderiyoruz.
1 2 3 4 5 6 7 8 9 10 | radio.startListening(); if ( radio.available()) { while (radio.available()) { int joyDeger = 0; radio.read(&joyDeger, sizeof(joyDeger)); Serial.println(joyDeger); myServo.write(joyDeger); } |
komut satırı ile dinleme yapıp, diğer arduinodan gelen joystick değerini servo motora açı değeri olarak yazdırıyoruz.
1 2 3 4 5 6 | radio.stopListening(); butonDurum = digitalRead(button); Serial.println(butonDurum); radio.write(&butonDurum, sizeof(butonDurum)); |
komut satırları ile dinlemeyi durdurup sonrasında butondan okunan değeri diğer arduinoya gönderiyoruz.
Yukarıdaki gibi devrelerinizi doğru bir şekilde oluşturduktan sonra kodları yüklediğinizde NRF24L01 kablosuz iletişim modülü ile çift yönlü veri aktarımını başarıyla gerçekleştirmiş olacaksınız.
Bir sonraki yazımızda NRF24L01 ile birden fazla NRF24L01 arasında nasıl veri aktarılır? sorusunun cevabını vereceğiz.
Burada gönderilen verilerin hepsi İnt olarak iletilmiş String iletmemizin Bir yolu varmı