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.
kod yanlış
https://github.com/ckaplan634/uzaktan-kumandal-araba-
buradan bakıp yapabilirsiniz tamamen denenmiş çalışma
int data [1]; hata veriyor
Kütüphaneler Nerede
Kodların ikisi de hatalı
data[0]
data[1]
data[2]
data[3]
diye tanımladığı değişkenleri galiba numaraları yanlış yere yazdı.
Merhabalar. Arabanın iskeleti için yapmış olduğum ve ekleyeceğim özellikler yüzünden araba modelim biraz ağır oldu.
tüm özelliklerle birlikte araba yaklaşık 5 kilo. Bu arabayı kaldırabilmek için ne tür ve nasıl bir motor kullanmalıyım. Bilgi verebilir misiniz acaba ?
Merhaba yakin zamanda bende buna benzer raspberry pi kullanarak bir robot yaptım ilk basta standart 4wd robot araba kitinin ne kadar agir olacağını düşünmemiştim birdebonun üstüne motor sürücü vb şeyler eklenince araba bi hayli zorlanıyor açıkçası ben durumu 2 adet pili oyuncak arabalardan çıkan sarf edilebilir pil kullanarak cozdum piyasada oldukça güçlü motorlar var bunlar için motor sürücüler var birde iyi bir lipo pil almanız lazim başka turlu 5kg yerinden oynatamayiz bence standart motorların bi üstünü ve onlar eğer çok amper çekiyorsa kullandığımız motor sürücüyü ve iyi bir güç kaynağı kullanmanız lazim yanlız kullandığımız motor sürücüde guclu bir motor surucu eğer motorlar çok güçlü değilse değiştirmeye gerek yok
ya çok güzelde çok önemli bir sorun var ben kodu kendim sıfırdan yazdım ama kullanırken araç menzilin dışına çıkınca yada kumandanın pili bitince kısacası alıcı ile verici arasındaki bağlantı kopunca araç aldığı son komutta kalıyor mesela ileri doğru hızla giderken bir anda bağlantı kopunca araba aynı hızla gitmeye devam ediyor ve bir yere çarpıp kırılıyor bunun için kod yazmayı çok denedim sonuna else komutunu koyunca araba hiç gitmiyor denedim onu bir tanesi çalıştı yaptıklarımın fakat genede iyi bir performans alamadım bu sorunun bilinen bir kodu var mı ?
Merhaba ilginiz için teşekkür ederim. Öncelikle modülden gelen sinyalleri arduino nun seri monitörüne yansıtın ve bilerek iletişimi kesin ve seri monitörde gelen bilgiyi atıyorum 0 bunuda aynı ileri geride olduğu gibi if komutu ile arabayı durduracak şekilde yapın menzile tekrar girince bağlanıyormu hiç denemedim ama en mantıklısı arabanın durması olacaktır
Motorların hareketlerini high, low şeklinde digital Değil de analog yapacak olsaydık, joystick i çevirdiğimiz oranda hızlanması ve dönmesi için nasıl bir değişiklik yapmalıyız. Çıkamadım işin içinden. Yardımcı olur musunuz?
Merhabalar bu konuda oldukça mantıklı bir sistem olacaktır pwm sinyal ile kullanmak bunun için ;
L298n nin pinlerinden 4 ünü kullanık ama aslında 6 tane pin var bunlar en sağdaki ve en soldaki pinler bu pinlerden pwm sinyal verebiliyoruz buda hızını ayarlamamıza yarıyor.
öncelikle bu söylediğim pinlere birer kablo bağlayın ve bu kabloyuda arduino nun örneğin 6 ve 11 pinlerine bağlayın burada dikkat etmeniz gereken pinin pwm çıkışı desteklemesi olmalı bunu yanındaki işaretten anlayabilirsiniz.
bu pinleri kodda tanımlamamız lazım tabiki
const int a = 10;
const int b = 11;
ardından ise bu pinleri yani motor hızını kontrol etmek için
analogWrite(a, 150);
analogWrite(b , 150);
bunun gibi bir yol izleyerek sistemi kurabilirsizin
Birde cons int deki pinleri hangi pine bağladıysanız ona göre değiştirmeniz lazım
birde void setup kısmına şunu eklemeniz lazım
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
Merhaba ilginiz için teşekkür ederim. Öncelikle modülden gelen sinyalleri arduino nun seri monitörüne yansıtın ve bilerek iletişimi kesin ve seri monitörde gelen bilgiyi atıyorum 0 bunuda aynı ileri geride olduğu gibi if komutu ile arabayı durduracak şekilde yapın menzile tekrar girince bağlanıyormu hiç denemedim ama en mantıklısı arabanın durması olacaktır
Kodlarda çok büyük hatalar var.Dogrusu bu diye bakmayın
Atakan bey, motor sürücü ile Arduino arasındaki kabloları Arduinonun PWM pinlerini kullanmanız gerekmez miydi???
Merhaba araba zaten pek çıkışlı olarak tasarlanan bu yüzden normal lojik çıkış veren pinlerde kullanilabilir açıklamasını yaparken pwm pin demişim kusura bakmayin
Atakan, bey acaba robotun çalışma videosunu atabilirsiniz.
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.