nRF24L01 ve Arduino Kullanarak Potansiyometre ile Servo Motor Kontrolü (nRF24L01 Modülüne Giriş #3)

Bu uygulamada verici taraftaki potansiyometre ile alıcı taraftaki servo motoru kontrol edebilen bir devre tasarlayacağız.

 Servo motorlar 0 ile 180 derece arasında hareket ederler.0 -360 arası hareket eden çeşitleri de vardır. Servolar, girilen açı değerine uygun pozisyon alırlar ve yeni komut gelmediği sürece pozisyonunu değiştirmezler. Periyodik olarak tekrar eden hareketler için de kullanılabilirler. 3 adet bağlantı noktası vardır. Kırmızı renkli kablo motorun güç hattı(5 V) için, kahverengi renkli kablo GND hattı için ve turuncu renkli kablo bilgi(veri sinyali) içindir.

Potansiyometreler yapı itibariyle ayarlı dirençlerdir. Dönen bir mil ile direncin değeri arttırılıp azaltılabilir. Potansiyometrenin 3 adet pini bulunmaktadır. Baştaki pin 5 V, sondaki pin GND, ortadaki pin ise arduinoya direnç değerini gönderen veri bacağıdır ve arduinonun analog pinlerinden birine bağlanmalıdır.

nRF24L01’lerin Arduino Nano ile bağlantısı için “nRF – Nano Geliştirme Kiti” kullanılmıştır. İhtiyacımız olan malzemeler: 2 adet nRF24L01 haberleşme modülü, 2 adet Arduino Nano, 2 adet nRF-Nano Geliştirme Kiti, bir adet servo motor, 1 adet 1k potansiyometre ve 6 adet jumper

nRF – Nano Geliştirme Kiti ile Devre Bağlantısını Oluşturma

Alıcı tarafı oluştururken servo motorun bağlantısını doğru bir şekilde yapmak gerekir. Servo motorun kırmızı kablosu Arduino Nano’nun 5V hattına, kahverengi kablosu Arduino Nano’nun GND hattına, turuncu kablosu ise Arduino Nano’nun dijital pinlerinden birine bağlanabilir. Servo motorun bağlantısını yaptıktan sonra, arduino nano ve nRF haberleşme modülünü yerlerine taktığınızda devre tamamlanmış olmaktadır.

Verici tarafın bağlantısında potansiyometre kullanacağız. Potansiyometrenin 3 adet bacağı bulunmaktadır. Bu bacaklardan ilkine 5 V takıldıysa sondaki bacak GND, ilk bacak GND ise sondaki bacak 5 V olmalıdır. Ortadaki bacak daima potansiyometrenin veri bacağı olduğundan, nanonun herhangi bir analog pinine takılır.

Aşağıdaki görselde potansiyometre yapısı detaylı olarak açıklanmıştır. 1. Görselde kadran ok yönünde çevrildiğinde 5V ile A0 arasındaki direnç değeri artacak ve arduinonun okuduğu gerilim değeri düşecektir. 2. Görselde kadran ok yönünde çevrilirken 5V ile A0 arasındaki direnç değeri azalacak ve arduinonun okuduğu gerilim değeri artacaktır. Bu durumu şöyle de açıklayabiliriz. Ledin parlaklığını arttırıp azaltmak için bir adet devre kuralım. Kadran ilk görselde göründüğü gibi çevrildiğinde ledin parlaklığı azalır. Kadran iki numaralı görselde göründüğü gibi çevrildiğinde ise ledin parlaklığı artacaktır.

nRF – Nano Geliştirme Kiti Kullanmadan Devre Bağlantısı

Alıcı taraf için uygulanması gereken bağlantı işlemleri aşağıda ki görselde gösterilmiştir.

Verici taraf için uygulanması gereken bağlantı işlemleri aşağıda ki görselde gösterilmiştir.

Alıcı ve Verici Kodları

Verici

Öncelikle #include komutu ile SPI, nRF24L01 ve RF24 kütüphanelerimizi yüklüyoruz. RF24 için kablosuz() adında bir nesne tanımlıyoruz ve parantez içine nRF24L01’in bağlı olduğu  CE ve CSN pinlerinin değerlerini  (D9 ve D10 için 9 ve 10) yazıyoruz.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
int potpin = 0;
int Potdeger;
int data[1];

void setup() {
  kablosuz.begin();
  kablosuz.openWritingPipe(adres);
}

void loop() {
  Potdeger = analogRead(potpin);
  Potdeger = map(Potdeger, 0, 1023, 0, 179);
  data[0] = Potdeger;
  kablosuz.write(data, 1);
}

Adres adında bir byte dizisi oluşturup tırnak içerisinde belirtilen adresin alıcı ve verici için aynı olmasına dikkat ediyoruz. potpin adında bir değişken tanımlıyoruz ve Arduinonun, Analog 0 (A0) pinine atıyoruz. potdeger adında bir değişken tanımlıyoruz. data adında bir dizi tanımlayıp 1 elemanlı olduğunu belirtmek için parantez içine 1 yazıyoruz. Setup kısmına gelip begin() komutu ile nrf modülümüzü başlatıyoruz ve openWritingPipe() ile bir hat oluşturuyoruz. Loop döngümüzün içine gelip analogread() komutu ile 0 .pinden aldığı değeri okuyup potdeger değişkenine atmasını söylüyoruz. Analog pinimizden 0 ile 1023 arasında değerler okuyabiliyoruz. map() komutu ile önce değişkeni ve hangi 2 aralıkta olduğunu yazıyoruz. Ardından değişkenimizin hangi 2 değer arasında olmasını istiyorsak o değerleri yazıyoruz. Değişkenimizin son değerini data dizisine atıyoruz . Mesajımızı write() fonksiyonu ile gönderiyoruz.

Alıcı

Alıcı tarafta const byte adres() satırına kadar olan kodlar ve işlevleri verici tarafla aynıdır. Sadece kütüphaneler kısmına Servo kütüphanesini ekliyoruz. data adında bir dizi tanımlayıp 1 elemanlı olduğunu belirtmek için parantez içine 1 yazıyoruz.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
int data[1];
Servo sg90;

void setup()
{
  sg90.attach(2);
  kablosuz.begin();
  kablosuz.openReadingPipe(1, adres);
  kablosuz.startListening();
}

void loop()
{
  if (kablosuz.available()) {
    kablosuz.read(data, 1);
    sg90.write (data[0]);
  }
}

Servo motor için sg90 adında bir nesne tanımlıyoruz. Setup kısmına gelip atttech() komutu ile motorun bağlı olduğu dijital pini yazıyoruz. begin() komutu ile nrf modülümüzü başlatıyoruz. openReadingPipe() ile bir okuma hattı oluşturuyoruz. startListeninig() ile dinlemeyi başlatıyoruz. available() komutu verinin alıcıya ulaşıp ulaşmadığını kontrol ediyor. Veri geliyorsa kablosuz.read() ile veriyi okuyoruz. sg90.write() komutu ile de gelen veriye göre motorumuzu hareket ettiriyoruz.