Herkese selam. Bu yazıda Arduino kullanarak joystick shield ile 4WD RC araba kontrolü yapacağız. Ben yaparken çok eğlendim umarım siz de proje bittiğinde çıkardığınız işten memnun kalırsınız.

RC Araba Üstten Görünüm

Projeye geçmeden önce belirtmek istiyorum. Uzaktan kumandalı aracımı yaparken pili bittiğinde şarj edebilmek için lityum iyon pil kullandım. Siz arzu ederseniz 9V veya 6’lı pil yuvasıyla beraber 6 adet 1.5V kalem pille kullanabilirsiniz.

Öncelikle kütüphanelerimizi indirmekle başlayalım. Bu projeyi yaparken daha öncekilerde kullandığım RF24 kütüphanesinin eski Maniacbug versiyonundaki bazı sorunları çözen bir kütüphane olan TMRh20 versiyonunu kullandım. İlgili kütüphaneyi buradan indirebilirsiniz. Daha önce farklı bir RF24 kütüphanesi indirdiyseniz lütfen onu silip yerine linkteki kütüphaneyi yükleyin.

RC Araba Yapımı için Gerekli Malzeme ve Parçalar

RC araba yapımı sırasında çokça lehimleme yapmanız gerekebilir. Bu konuda bilginiz yoksa korkmayın. Oldukça kolay bir iş. Bu videomuzu izleyerek kısa sürede öğrenebilirsiniz.

Joystick Kurulum ve Yazılımı

Joystick shield Arduino’nun üzerine oturur ve Arduino’yu basit bir kontrol cihazına dönüştürür. 7 adet düğmesi (4 büyük düğme, 2 küçük düğme ve bir joystick seçim düğmesi) Arduino’nuza eski Nintendo denetleyicileri düzeyinde işlevsellik verir. Bu birim ayrıca Nokia 5110 LCD ve nRF24L01 arayüzleri sunar.

Arduino Joystick Shield Özellikleri

  • nRF24L01 arayüzü
  • Nokia 5110 LCD arayüzü
  • Bluetooth arayüzü
  • I2C arayüzü
  • Arduino ile uyumlu
  • 3.5V veya 5V voltaj ayarlı

Joystick için Gerekli Malzemeler

Arduino Joystick Shield ve NRF24L01

Joystick shield 4 büyük düğme, 2 küçük düğme, joystick seçim düğmesine ve iki eksenli bir joystick’e (0 – 1023 arası X ekseni, 0 – 1023 arası Y ekseni) sahiptir. Kullanımı oldukça basit ve eğlenceli bir kontrol cihazı. Ben projemde yukarıdaki düğmeyi buzzer (korna), sağ düğmeyi ön ışık (LED ve 220 Ohm direnç), sol düğmeyi arka ışık (2 adet LED ve 220 Ohm direnç) için kullandım. Diğer düğmeleri kullanmadım.

Arduino Joystick Shield ve NRF24L01 Yan Görünüm

Joystick için Alıcı Kodları

 /* JoyStick modulu verici kodu
 - BAGLANTILAR: nRF24L01 Modulu:
   1 - GND
   2 - VCC 3.3V !!! 5V DEGIL
   3 - CE Arduino pin 9
   4 - CSN Arduino pin 10
   5 - SCK Arduino pin 13
   6 - MOSI Arduino pin 11
   7 - MISO Arduino pin 12
   8 - KULLANILMIYOR
   
   Default Buton Pinleri: 
   Yukari     - pin 2
   Sag  - pin 3
   Asagi   - pin 4
   Sol   - pin 5
   - 
   Analog Joystick modulu
   GND    Arduino GND
   VCC    Arduino +5V
   X      Arduino A0
   Y      Arduino A1
/*-----( Kutuphaneleri ekliyoruz )-----*/

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

#define CE_PIN   9
#define CSN_PIN 10
#define xAxis 14     // A0 Arduino UNO
#define yAxis 15     // A1 Arduino UNO

//const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz

/*-----( Nesneleri tanitiyoruz )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Radio yaratiyoruz

/*-----( Degiskenleri belirtiyoruz )-----*/
int joystick[6];  // Joystick'in ve 4 adet butonun okunmasini tutan 6lı element dizisi

int buttonUp    = 2;
int buttonRight = 3;
int buttonDown  = 4;
int buttonLeft  = 5;


void setup() {

  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
  radio.stopListening();
  
  //Butun butonlar ve baslangic hali icin pinMode'u belirtiyoruz
  pinMode(buttonUp,INPUT_PULLUP);
  pinMode(buttonRight,INPUT_PULLUP);
  pinMode(buttonDown,INPUT_PULLUP);
  pinMode(buttonLeft,INPUT_PULLUP);
  
  digitalWrite(buttonUp,LOW);
  digitalWrite(buttonRight,LOW);
  digitalWrite(buttonDown,LOW);
  digitalWrite(buttonLeft,LOW);

}

void loop() {
  
  joystick[0] = analogRead(xAxis);
  joystick[1] = analogRead(yAxis);
  joystick[2] = digitalRead(buttonUp);
  joystick[3] = digitalRead(buttonRight);
  joystick[4] = digitalRead(buttonDown);
  joystick[5] = digitalRead(buttonLeft);
  
  radio.write( joystick, sizeof(joystick) );
  delay(20);

      Serial.print("X = ");
      Serial.print(analogRead(xAxis));
      Serial.print(" Y = ");  
      Serial.print(analogRead(yAxis));
      Serial.print(" Up = "); 
      Serial.print(digitalRead(buttonUp));
      Serial.print(" Right = "); 
      Serial.print(digitalRead(buttonRight));
      Serial.print(" Down = "); 
      Serial.print(digitalRead(buttonDown));
      Serial.print(" Left = "); 
      Serial.println(digitalRead(buttonLeft));

}  

Joystick devrenizi kurduktan sonra bilgisayarınıza takıp seri monitörden çalışıp çalışmadığını kontrol etmenizi öneririm.

Arduino 4WD RC Araba

Arduino 4WD RC Araba Devre Şeması

RC arabanızın bağlantılarını yukarıdaki şemadaki gibi yapın.

Not: Kodu yüklemeden önce jumper kabloları Arduino Uno kartından ayırmanız gerektiğini unutmayın. (pin 0, 1)

RC Araba Önden Görünüm
RC Araba Arkadan Görünüm

4WD RC Araba İçin Alıcı Kodları

/* JoyStick modulu icin alici kodu
 - BAGLANTILAR: nRF24L01 Modulu:
   1 - GND
   2 - VCC 3.3V !!! 5V DEGIL
   3 - CE to Arduino pin 6
   4 - CSN to Arduino pin 8
   5 - SCK to Arduino pin 13
   6 - MOSI to Arduino pin 11
   7 - MISO to Arduino pin 12
   8 - KULLANILMIYOR
 */
//-----( Gereken kutuphaneleri ekliyoruz )-----
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Sabitleri ve pin numaralarini belirtiyoruz )-----*/
#define CE_PIN 6
#define CSN_PIN 8

// const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz

#define light_Front  18     //On Sag LED   pin A4 Arduino Uno
#define light_Back   19     //Arka Sag LED    pin A5 Arduino Uno
#define horn_Buzz    7     

#define ENA_m1 3          // Motoru etkinlestir/hizlandir On Sag
#define ENB_m1 5          // Motoru etkinlestir/hizlandir Arka Sag
#define ENA_m2 9          // Motoru etkinlestir/hizlandir On Sol
#define ENB_m2 10         // Motoru etkinlestir/hizlandir Arka Sol

#define IN_11  0          // L298N #1 in 1 motor On Sag
#define IN_12  1          // L298N #1 in 2 motor On Sag
#define IN_13  2          // L298N #1 in 3 motor Arka Sag
#define IN_14  4          // L298N #1 in 4 motor Arka Sag

#define IN_21  14         // L298N #2 in 1 motor On Sol
#define IN_22  15         // L298N #2 in 2 motor On Sol
#define IN_23  16         // L298N #2 in 3 motor Arka Sol
#define IN_24  17         // L298N #2 in 4 motor Arka Sol

/*-----( Nesneleri belirt )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Radio olustur
/*-----( Degiskenleri belirt )-----*/
int joystick[6];  // Joystick'in ve 4 adet butonun okunmasini tutan 6lı element dizisi
int speedRight = 0;
int speedLeft = 0;
int  xAxis, yAxis;
// joystickteki 4 adet buton degiskeni
int buttonUp;
int buttonRight;
int buttonDown;
int buttonLeft;

void setup()
{
  pinMode(light_Front, OUTPUT);
  pinMode(light_Back, OUTPUT);
  pinMode(horn_Buzz, OUTPUT);
    
  pinMode(ENA_m1, OUTPUT);
  pinMode(ENB_m1, OUTPUT);
  pinMode(ENA_m2, OUTPUT);
  pinMode(ENB_m2, OUTPUT);
  
  pinMode(IN_11, OUTPUT);
  pinMode(IN_12, OUTPUT);
  pinMode(IN_13, OUTPUT);
  pinMode(IN_14, OUTPUT);
    
  pinMode(IN_21, OUTPUT);
  pinMode(IN_22, OUTPUT);
  pinMode(IN_23, OUTPUT);
  pinMode(IN_24, OUTPUT);

/*  Serial.begin(9600);
  Serial.println("Nrf24L01 Alici Baslatiliyor"); */
  
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
}

void loop()
{
  if ( radio.available() )
  {
      radio.read( joystick, sizeof(joystick) );
      xAxis = joystick[0];
      yAxis = joystick[1];
      
      // joystickteki 4 adet buton degiskeni
      int buttonUp    = joystick[2];
      int buttonRight = joystick[3];
      int buttonDown  = joystick[4];
      int buttonLeft  = joystick[5];
      
      //Serial.println(); //  debugging
      // Debugging kodu asagida
  
      if (buttonUp == HIGH){digitalWrite(horn_Buzz, LOW);}
        else {digitalWrite(horn_Buzz, HIGH);}
      if (buttonRight == HIGH){digitalWrite(light_Front, LOW);}
        else {digitalWrite(light_Front, HIGH);}
      if (buttonLeft == HIGH){digitalWrite(light_Back, LOW);}
        else {digitalWrite(light_Back, HIGH);}

// Y-axis One ve geriye kontrol
    if (yAxis < 470) {
    // Sag motorlari geriye ayarladik
    digitalWrite(IN_11, LOW);
    digitalWrite(IN_12, HIGH);
    digitalWrite(IN_13, HIGH);
    digitalWrite(IN_14, LOW);
    // Sol motorlari geriye ayarladik
    digitalWrite(IN_21, HIGH);
    digitalWrite(IN_22, LOW);
    digitalWrite(IN_23, LOW);
    digitalWrite(IN_24, HIGH);
    
    // Geriye giderken motor hizini arttirmak icin PWM sinyalini azalan Y eksen degerlerini 470ten 0a'dan 0dan 255'e seklinde ayarlayin
    speedRight  = map(yAxis, 470, 0, 0, 255);
    speedLeft   = map(yAxis, 470, 0, 0, 255);
  }

else if (yAxis > 550) {
    // Set Right Motors forward
    digitalWrite(IN_11, HIGH);
    digitalWrite(IN_12, LOW);
    digitalWrite(IN_13, LOW);
    digitalWrite(IN_14, HIGH);
    // Set Left Motors forward
    digitalWrite(IN_21, LOW);
    digitalWrite(IN_22, HIGH);
    digitalWrite(IN_23, HIGH);
    digitalWrite(IN_24, LOW);
 
    // One giderken motor hizini arttirmak icin PWM sinyalini artan Y ekseninde 550-1023ten 0-255'e ayarlayin
    speedRight  = map(yAxis, 550, 1023, 0, 255);
    speedLeft   = map(yAxis, 550, 1023, 0, 255);
  }
  // Joystick ortada kalirsa motorlar hareket etmeyecek
  else {
    speedRight  = 0;
    speedLeft   = 0;
  }

// Sol sag kontrolleri icin X eksenini ayarlama
  if (xAxis < 470) {
    // Azalan X-axis okumalarini 470-0'dan artan 0'dan 255'e ayarliyoruz
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Sola hareket - sol motor hizini azaltma, sag motor hizini arttirma
    speedLeft = speedLeft - xMapped;
    speedRight = speedRight + xMapped;
    // Menzili 0 - 255 arasina ayarla
    if (speedLeft < 0) {
      speedLeft = 0;
    }
    if (speedRight > 255) {
      speedRight = 255;
    }
  }
  if (xAxis > 550) {
    // Artan X-ekseni okumalarini 550den 1023'e durumundan 0'dan 255'e ayarla
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Saga hareket - sag motor hizini azalt, sol motor hizini arttir
    speedLeft = speedLeft + xMapped;
    speedRight = speedRight - xMapped;
    // Confine the range from 0 to 255
    if (speedLeft > 255) {
      speedLeft = 255;
    }
    if (speedRight < 0) {
      speedRight = 0;
    }
  }
  // Dusuk hizlarda kornayı engelle (motorlariniza gore ayarlayin degeri)
  if (speedLeft < 70) {
    speedLeft = 0;
  }
  if (speedRight < 70) {
    speedRight = 0;
  }

  analogWrite(ENA_m1, speedRight); // A motoruna PWM sinyali gonder
  analogWrite(ENB_m1, speedRight);
  analogWrite(ENA_m2, speedLeft); // B motoruna PWM sinyali gonder
  analogWrite(ENB_m2, speedLeft);
     
  /*    Serial.print("X = ");
      Serial.print(xAxis);
      Serial.print(" Y = ");  
      Serial.print(yAxis);
      Serial.print(" Up = ");
      Serial.print(joystick[2]);
      Serial.print(" Right = ");  
      Serial.print(joystick[3]);
      Serial.print(" Down = ");
      Serial.print(joystick[4]);
      Serial.print(" Left = ");  
      Serial.println(joystick[5]); */
      
      
      
      }

      
  }

  

Tüm adımları doğru yaptığınızdan emin olduktan sonra RC arabanız hazır!

Video için takipte kalın. Görüşmek üzere. 🙂

19 Yorumlar

  1. Merhaba
    Aracın kodunu derlerken hata verdi aşağıda verdiği hata ve satırda mevcut nedir acaba sorun…

    ‘pipe’ was not declared in this scope

    radio.openReadingPipe(1,pipe);

      • Her ikisinde de aynı hatayı veriyorsa kütüphanelerin çakışmış olması yüksek ihtimal. Kütüphaneleri kontrol ettikten sonra sorunu çözemezseniz çıkan hata mesajının tamamını benimle paylaşırsanız yardımcı olmaya çalışırım tekrar.

    • Merhaba. Kütüphanelerinizin doğru yerde olup olmadığını ve dosya isimlerini kontrol edin. Daha önceden farklı bir RF24 kütüphanesi yüklediyseniz onu silip yazıda linkini verdiğim kütüphaneyi yükleyin.

    • hata buradan kaynaklanıyor basındaki // işareti kaldırım Öyle Deneyin

      //const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————HATALI

      const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————-OLMASI GEREKEN

    • hata buradan kaynaklanıyor basındaki // işareti kaldırın Öyle Deneyin

      //const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————HATALI

      const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————-OLMASI GEREKEN

  2. 1 Alıcı modül için arduino uno yerine arduino mega kullanmak istiyorum kodda veya devrede sıkıntı ya da değişim olur mu ?
    2 Nrf24l01 yerine Pa+Lna modülünü kullanacağım, herhangi bir ön ayar yapmam gerekir mi? pinleri aynı sanırım

    • hata buradan kaynaklanıyor basındaki // işareti kaldırım Öyle Deneyin

      //const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————HATALI

      const uint64_t pipe = 0xE8E8F0F0E1LL; // Pipe tanimliyoruz ————-OLMASI GEREKEN

  3. Arkadaşlar Bu Hatayı Alıyorum Yardımcı Olur musunuz Kütüphaneyi Yükledim Ama Nafile Olmadı.

    C:\Users\Admin\Desktop\sketch_apr03a\sketch_apr03a.ino: In function ‘void setup()’:

    sketch_apr03a:28:25: error: ‘pipe’ was not declared in this scope

    radio.openWritingPipe(pipe);

    ^
    exit status 1
    ‘pipe’ was not declared in this scope

  4. Kodların ikisinde de alıcı yazıyor.Doğru olanları buldum fakat kodunuz hatalı.Hataları düzletmeye çalıştım ama alıcı ile verici eşleşmiyor.Bence kodu bir elden geçirip deneyin.

  5. herşey takılı olduğu halde arabayı kontrol edemiyorum kumanda bilgisayara bağlı arduino 9v luk pilden besleniyor acaba kumandayı da ayrı bir pilden beslersem düzelir mi

  6. motorlardanmı motor sürücüdenmi ne ses çıkıyor motorlarım dönmüyor ne yapacağım video olsa yapabilirim bu yıl sınavım var uğraşamayacağım ondan son projemi yapayım diyorum yardım edin

CEVAP VER

Please enter your comment!
Please enter your name here