Arduino İle NRF24L01 Kullanarak RC Araba Yapımı

2 751
Merhaba ben Atakan, bügün sizlerle nrf24l01 kablosuz haberleşme modülü kullanarak uzun menzilli bir RC Araba yapacağız, Hadi Başlayalım;

Öncelikle malzeme listesi;

  • 2 Adet Arduino (Nano Veya Uno)
  • 2 Adet Joystick
  • 2 Adet NRF24L01 Antenli modül
  • 1 Adet L298N Motor sürücü
  • 2 Adet DC motor
  • 2 Adet 9V pil ve Breadboard

Bu proje ile öğreneceklerimiz;

  • NRF24L01 modüllerinin haberleşmesi
  • Joystick modüllerinin kullanımı
  • Motor sürücü ile DC motor kontrolü
  • Ve 2 Arduino’nun kablosuz haberleşmesi

Ve şimdide devre şemalarını oluşturalım

Alıcı Devresi

 

Verici Devresi :

 

Verici (kumanda) Kodu :

#include <SPI.h>
#include <nRF24L01.h> // Çeşitli kütüphaneler dahil ediyoruz
#include <RF24.h>

#define CE_PIN 7 // CE pinini belirtiyoruz
#define CSN_PIN 8 // CSN pinini belirtiyoruz
#define x_axis A0 // 1.joysticten gelecek x verisinin pinini belirtiyoruz
#define y_axis A1 // 1.joysticten gelecek y verisinin pinini belirtiyoruz
#define x2_axisa A2 // 2. joystictenj gelecek x verisinin pinini belirtiyoruz
#define y2_axis A3 // 2. joystictenj gelecek y verisinin pinini belirtiyoruz

const uint64_t pipe = 0xE8E8F0F0E1LL; // Başka NRF modüllerinin sinyalleri ile karışmasın diye şifre atadık
RF24 radio(CE_PIN, CSN_PIN);
int data[0];
int data[1]; // Data adlı değişkenler tanımlıyoruz
int data[2];
int data[3];

void setup()
{
Serial.begin(9600); // seri iletişimi açtık
radio.begin(); // radio iletişimi açtık
radio.openWritingPipe(pipe);
}

void loop()
{

data[0] = analogRead(x_axis); // x verisini oku ve data 0 adında kaydet
data[1] = analogRead(y_axis); // y verisini oku ve data 1 adında kaydet
data[2] = analogRead(x2_axis); // x2 verisini oku ve data 2 adında kaydet
data[3] = analogRead(x2_axis); // y2 verisini oku ve data 3 adında kaydet
radio.write( data, sizeof(data) ); // bu verileri alıcıya data adında ilet

// hatalara karşı küçük bir önlem
Serial.print(analogRead(x_axis));
Serial.print(" ");
Serial.print(analogRead(A1));
Serial.print(" ");
//Serial.print(digitalRead(BUTON));
}
Alıcı (Araba) Kodu:

#include <SPI.h> // Gerekli kütüphaneleri dahil ettik dahil ettik
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9 // CE pininin 9. pine bağlı olduğunu belirttik
#define CSN_PIN 10 // CSN pininin 10. pine bağlı olduğunu belirttik
const uint64_t pipe = 0xE8E8F0F0E1LL; // başka pir NRF modülü ile bağlantı karışmaması için şifre atadık
RF24 radio(CE_PIN, CSN_PIN);
int data[2]; // data adında bir değişken atadık
const int Motor1_Ileri = 7; // Sağ motorun ileri pinini belirttik
const int Motor1_Geri = 6;// sağ motorun geri pinini belirttik

const int Motor2_Ileri = 4;// Sol motorun ileri pinini belirttik
const int Motor2_Geri = 2;// Sol motorun geri pinini belirttik
void setup()
{
pinMode(Motor1_Ileri,OUTPUT);// Sağ motorun ileri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor1_Geri,OUTPUT);// Sağ motorun geri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor1_PWM,OUTPUT);// Sağ motorun PWM pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_Ileri,OUTPUT);// Sol motorun ileri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_Geri,OUTPUT);// Sol motorun geri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_PWM,OUTPUT);// Sol motorun PWM pininden çıkış vereceğimizi belirttik belirttik
Serial.begin(9600);// Seri iletişimi başlattık...
radio.begin();// Radio haberleşmeyi başlattık...
radio.openReadingPipe(1,pipe);
radio.startListening();;
}

void loop() {
if ( radio.available() ) // Radio iletişimi başlat ve...
{
int y = data[1];// Gelen y verisini data 1 olarak kaydet
int x = data[0];// Gelen x verisini data 0 olarak kardet
int y2 = data[3];// Gelen y2 verisini data 3 olarak kaydet
int x2 = data[4];// Gelen x2 verisini data 4 olarak kardet
radio.read( data, sizeof(data) ); //Ardından bu verileri oku
if(y >= 400 && y <= 600) { // Eğer gelen y verisi 400 den büyük 600 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,LOW); // Hareket etme
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,LOW);
}
if(y >= 800 && y <= 1023) { // Gelen y verisi 800 den büyük 1023 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,HIGH);// Sağ motoru geri dönder
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,HIGH);// Sol motor geri dönder
}
if(y >= 0 && y <= 450) { // Gelen y verisi 0 dan büyük 450 den küçük ise
digitalWrite(Motor1_Ileri,HIGH);// Sağ motor ileri dönder
digitalWrite(Motor1_Geri,LOW);
digitalWrite(Motor2_Ileri,HIGH);// Sol motor ileri dönder
digitalWrite(Motor2_Geri,LOW);
}
if(x2 >= 0 && x2 <= 450) { // gelen x verisi 0 dan büyük 450 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,HIGH);// Sağ motoru geri dönder
digitalWrite(Motor2_Ileri,HIGH);// Sol motor ileri dönder
digitalWrite(Motor2_Geri,LOW);
}
if(x2 >= 600 && x2 <= 1023) { //gelen x verisi 600 den büyük 1023 den küçük ise
digitalWrite(Motor1_Ileri,HIGH);//Sağ motor ileri döner
digitalWrite(Motor1_Geri,LOW);
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,HIGH); // Sol motor geri döner
}
}
}

Robotun ana mantığı kumandadan gelen x ve y verilerini değerlendiriyor ve bu verileri okuduktan sonra motor sürücü ile motorları kontrol ediyor.

 

Bunlar da İlgini Çekebilir

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

  1. Ahmet Efe Atabey

    Atakan, bey acaba robotun çalışma videosunu atabilirsiniz.

    1. Onur Atakan Ulusoy

      Bu konuda çok üzgünün, bu sene 8.sınıfım bu yüzden daha çok derslere odaklandım. Bu yüzden sistemi kuramadım. Anlayışınız için teşekkür ederim.