Merhabalar, bu yazımızda Jlinker joystick kartı ve Rodeo kodlama robotu kullanılarak Nrf24l01 temelli kablosuz robot araba kontrol uygulaması gerçekleştireceğiz.
Rodeo’yu daha önceki yazılarımızda da tanıtmıştık. Burada Rodeo Kodlama Robotu-2.4G versiyonu kullanılacaktır.
Bu uygulamada yapılacak kodlamalar sonucunda jlinker daki direktifler doğrultusunda Rodeo manuel olarak kontrol edilebilmenin yanı sıra, uzaktan kontrollü çizgi izleyen, uzaktan kontrollü engelden kaçan, uzaktan kontrollü ışık takip eden ve jlinker üzerinde bulunan ivme sensörü sayesinde el hareketlerine bağlı olarak kontrol ve daha fazlası yapılabilecektir.

Jlinker Joystick Kontrol Kartı Nedir?

Jlinker joystick kontrol kartı, iki farklı kablosuz haberleşme seçeneği sunan bir gamepad kartıdır. Bu kart sayesinde bu uygulamamızda olduğu gibi çok rahat bir şekilde uzaktan kumandalı robot araba yapılabilir. Nrf24l01 ile yaşanan bağlantı kopmaları ve güç problemlerine kalıcı çözümler getirlmiştir. NRF24L01+PA ile açık alanda maksimum 1000 metreye kadar kablosuz iletişim sunmaktadır. Kart üzerinde bulunan 0.96″ oled ekran sayesinde alıcı ile olan etkileşim gözlemlenebilmektedir. Arduino kütüphane ve örnek kod desteği sayesinde kodlamada büyük kolaylık sağlamaktadır. Kendin yap projelerine farklı bir boyut kazandıracaktır. Herhangi bir arduino projesinde alıcı tarafındaki küçük bir ayarlama ile kablosuz olarak kontrolüne olanak sağlamaktadır. Jlinker kablosuz joystick kontrol kartı, projelerini kendi yöntemleriyle kontrol etmek isteyen geliştiriciler için özel bir kablosuz çözüm sunmaktadır. Çift taraflı pleksi yapısı bu ürünü son kullanıcı ürünü haline getirmektedir. 9V pil yuvası sayesinde kolay bir güç beslemesi olanağı bulunmaktadır.
Nrf24l01 kablosuz iletişim modüllerinin iletişim adresleri değiştirilebilir olması sayesinde sınıf ortamında kullanıma uygundur.
Detaylı bilgi için ürün sayfasını inceleyebilirsiniz.

Jlinker Joystick Kartı Üzerinde Neler Var?

  • Arduino Nano Kontrolcü kartı
  • NRF24L01+PA+LNA kablosuz modül ve IPX anten
  • 0.96″ Oled ekran-Mavi/Sarı
  • MPU6050 İvme ve Gyro Sensörü
  • XY Joystick modülü
  • Bluetooth konnektörü
  • Güç beslemesi girişi
  • 90° Push Buton
  • Potansiyometre
  • On/Off Switch
  • Push Buton (12x12x7.3mm)

Kurulum:

Rodeo kodlama robotunu aşağıda bulanan videodan faydalanarak rahatlıkla oluşturabilirsiniz. Jlinker Kontrol kartı için tek yapılması gereken pleksi bağlantıları ile güç bağlantılarının yapılmasıdır.

Rodeo kodlama robotumuza Nrf24L01 kablosuz iletişim modülümüzü takmayı unutmayalım.

Rodeo Kodlama Robotu Kodları:

dMoto kütüphanesi indirilerek arduino kütüphanelerine dahil edilir. Ayrıca Jlinker kütüphanesini ve beraberinde gelen kütüphaneleri kurmadıysanız, NRF24L01 kütüphanesininde indirilmesi gerekmektedir. Bu kütüphane sizde varsa tekrar indirip kurmanıza gerek bulunmuyor.

#include <dmoto.h>
RF24 Nrf(9, 10);
dmoto Rodeo;
const byte addresses[][6] = {"00001", "00002"};
int received[11] = {};
float ldrRemove = 0;
int Speed = 0;
void setup() {
Rodeo.pinSet();
Nrf.begin();
Nrf.openWritingPipe(addresses[0]); // 00001
Nrf.openReadingPipe(1, addresses[1]); // 00002
Nrf.setPALevel(RF24_PA_MIN);
Nrf.startListening();
digitalWrite(ledPin, LOW);
Rodeo.Stop();
}
void loop()
{
Nrf.startListening();
digitalWrite(ledPin, LOW);
if (Nrf.available())
{
digitalWrite(ledPin, HIGH);
Nrf.read(&received, sizeof(received));
}
if (received[0] == 1)
{
LineFollower();
}
if (received[1] == 1)
{
LightTracer();
}
if (received[2] == 1)
{
Obstructing();
}
if (received[3] == 1 && received[5] == 1)
{
Rodeo.Left(70, 150);
}
else if (received[3] == 1 && received[6] == 1)
{
Rodeo.Right(150, 70);
}
else if (received[4] == 1 && received[6] == 1 )
{
Rodeo.BackRight(150, 70);
}
else if (received[4] == 1 && received[5] == 1 )
{
Rodeo.BackLeft(70, 150);
}
else if (received[3] == 1)
{
Rodeo.Forward(Speed);
}
else if (received[4] == 1)
{
Rodeo.Backward(Speed);
}
else if (received[5] == 1)
{
Rodeo.Left(70, 150);
}
else if (received[6] == 1)
{
Rodeo.Right(150, 70);
}
if (received[7] == 1)
{
Speed = 250;
}
else
Speed = received[9];
if (received[8] == 1)
{
digitalWrite(buzzerPin, HIGH);
}
else
{
digitalWrite(buzzerPin, LOW);
}
if (received[0] == 0 && received[1] == 0 && received[2] == 0 && received[3] == 0 && received[4] == 0 && received[5] == 0 && received[6] == 0 )
{
Rodeo.Stop();
}
delay(10);
}
void LineFollower()
{
if (Rodeo.sensor1() == 0 && Rodeo.sensor2() == 1 && Rodeo.sensor3() == 0)
{
Rodeo.Forward(80);
}
if (Rodeo.sensor1() == 1 && Rodeo.sensor2() == 1 && Rodeo.sensor3() == 1)
{
Rodeo.Forward(80);
}
if (Rodeo.sensor1() == 0 && Rodeo.sensor2() == 0 && Rodeo.sensor3() == 0)
{
Rodeo.Forward(80);
}
if (Rodeo.sensor1() == 1 && Rodeo.sensor2() == 0 && Rodeo.sensor3() == 0)
{
Rodeo.Right(0, 80);
}
if (Rodeo.sensor1() == 1 && Rodeo.sensor2() == 1 && Rodeo.sensor3() == 0)
{
Rodeo.Right(0, 80);
}
if (Rodeo.sensor1() == 0 && Rodeo.sensor2() == 0 && Rodeo.sensor3() == 1)
{
Rodeo.Left(80, 0);
}
if (Rodeo.sensor1() == 0 && Rodeo.sensor2() == 1 && Rodeo.sensor3() == 1)
{
Rodeo.Left(80, 0);
}
}
void LightTracer()
{
ldrRemove = abs(Rodeo.LdrRightValue() – Rodeo.LdrLeftValue());
if (Rodeo.LdrRightValue() > Rodeo.LdrLeftValue() && ldrRemove > 80)
{
Rodeo.Left(150, 70);
}
if (Rodeo.LdrRightValue() < Rodeo.LdrLeftValue() && ldrRemove > 80)
{
Rodeo.Right(70, 150);
}
if (ldrRemove < 80)
{
Rodeo.Forward(150);
}
}
void Obstructing()
{
if (Rodeo.distance() < 15)
{
Rodeo.Backward(Speed);
delay(150);
Rodeo.Right(0, 150);
delay(250);
}
else
{ Rodeo.Forward(Speed);
}
}

Jlinker Joystick Kontrol Kartı Kodları:

Jlinker.lib indirilerek arduino kütüphanelerine dahil edilir. Jlinker kütüphanesini arduino kütüphane klasörüne kopyalaıyın. Ayrıca ihtiyaç duyulan diğer kütüphaneler de Jlinker ile birlikte gelir. Bu kütüphaneler sizde daha önce varsa onları kopyalamayın. Yoksa hepsini “C:\Program Files (x86)\Arduino\libraries ” klasörüne kopyalayın. Kurulumunuza göre bu adres farklı olabilir ancak genellikle bu adrestedir. Farklı bir adres kullanıyorsa arduino IDE programınız, ilgili adrese kopyalayınızç.

#include <jlinker.h>
jlinker Joystick;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
char bufferX [20];
char bufferY [20];
char bufferZ [20];
int transmitted[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int distance = 0;
RF24 Nrf24l01(9, 10); // CE, CSN
const byte address[][6] = {"00001", "00002"};
void setup() {
Joystick.pinSet();
Nrf24l01.begin();
Nrf24l01.openWritingPipe(address[1]); // 00002
Nrf24l01.openReadingPipe(1, address[0]); // 00001
Nrf24l01.setPALevel(RF24_PA_MIN);
Nrf24l01.stopListening();
Serial.begin(9600);
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
accelgyro.initialize();
}
void loop() {
digitalWrite(User_LED, HIGH);
Nrf24l01.stopListening();
transmitted[9] = map(Joystick.POT_2(), 0, 1023, 255, 0);
Serial.println(transmitted[9]);
decide();
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Nrf24l01.write(&transmitted, sizeof(transmitted));
Nrf24l01.startListening();
if (Nrf24l01.available())
digitalWrite(User_LED, HIGH);
Nrf24l01.read(&distance, sizeof(distance));
sprintf(bufferX, " Robolink Market ");
sprintf(bufferY, " Jlinker ");
sprintf(bufferZ, " Rodeo-2.4G");
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
}
int decide ()
{
for (int i = 0; i <= 8; i++)
transmitted[i] = 0;
if (Joystick.Switch_1() == 1 && Joystick.Switch_2() == 1)
{
transmitted[0] = 1;
}
if (Joystick.Switch_1() == 0 && Joystick.Switch_2() == 1)
{ transmitted[1] = 1;
}
if (Joystick.Switch_1() == 1 && Joystick.Switch_2() == 0)
{ transmitted[2] = 1;
}
if (Joystick.Switch_1() == 0 && Joystick.Switch_2() == 0)
{
if ( Joystick.joyRightY() > 530)
{ transmitted[3] = 1;
}
if ( Joystick.joyRightY() < 370)
{ transmitted[4] = 1;
}
if (Joystick.joyLeftX() > 550 )
{ transmitted[5] = 1;
}
if (Joystick.joyLeftX() < 490)
{ transmitted[6] = 1;
}
if (Joystick.Button_3() == 0 && Joystick.Button_4() == 0 )
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
if (ay < –3000)
{ transmitted[3] = 1;
}
if (ay > 5000)
{ transmitted[4] = 1;
}
if ( ax < –4500)
{
transmitted[6] = 1;
}
if ( ax > 4000)
{ transmitted[5] = 1;
}
}
}
if (Joystick.Button_1() == 0 )
{ transmitted[7] = 1;
}
if (Joystick.Button_2() == 0 )
{ transmitted[8] = 1;
}
}
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 20, bufferX);
u8g.drawStr( 0, 40, bufferY);
u8g.drawStr( 0, 60, bufferZ);
}

11 YORUMLAR

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz