Arazi Robotu v1.1 (Arduino)

Çarpmayan Araba (Arduino)
Sadece Güneş Enerjisiyle Çalışan Pilsiz Araba v1.0 (Arduino)

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

Proje Fotoğrafı:

Açıklama:

Bluetooth’le kontrol edilebilen içerisinde lipo pil ve 4 adet güçlü dc motor kullanılan arazi robotu hazırladık. Şase kısmını 1 cm kalınlığında dekota ile hazırladık.

Şaseyi çelik levhadan yapmak istemiştik ama zaman ve nakit problemi 🙂 yaşadık. İnşaallah proje ikinci versiyonda Raspberry Pi ve daha gelişmiş özelliklerle karşımızda olacak.

Malzemeler:

  • (1 adet) Arduino Uno
  • 1 cm kalınlığında dekota
  • (1 adet) Android telefon veya tablet
  • Telefona Arduino Bluetooth RC Car yazılımı (indir)
  • (4 Adet) Bağlantı Aparatı 6mm Delikli
  • (4 Adet) Titan 12V 500 Rpm Redüktörlü Dc Motor
  • (4 Adet) 37 mm Motor Bağlantı Aparatı (2 Adet)
  • (1 adet) HC05 Bluetooth Modül
  • (1 adet) 14.8V Lipo Batarya 3000mAh 25C
  • (2 adet) 30A VNH2SP30 Step Motor Sürücü

Versiyon Yenilikleri:

v1.1

  • Bluetooth bağlantı kopma sorunu giderildi.
  • Bluetooth bağlantısı kopunca araç 1 saniye sonra duruyor.

v1.0

  • Araç bluetooth bağlantısı kopunca çalışmaya devam ediyor.

Bağlantı Şeması:

Proje Video’su:

Projenin Diğer Fotoğrafları:

Proje Kodu:

int pwm1 = 5;
int ina1 = 6;
int inb1 = 7;

int pwm2 = 10;
int inb2 = 9;
int ina2 = 8;

int i = 0;         //Döngüler için atanan rastgele bir değişken
int j = 0;         //Döngüler için atanan rastgele bir değişken
int state;         //Bluetooth cihazından gelecek sinyalin değişkeni
int vSpeed = 255;  //Standart Hız, 0-255 arası bir değer alabilir

unsigned long eskiZaman = 0;
unsigned long yeniZaman;

void aracHareketi()
{
  if (state == '0') {
    vSpeed = 0; //Uygulamadan ayarlanabilen 11 hız seviyesi.(Değerler 0-255 arasında olmalı)
  }
  else if (state == '1') {
    vSpeed = 25;
  }
  else if (state == '2') {
    vSpeed = 50;
  }
  else if (state == '3') {
    vSpeed = 75;
  }
  else if (state == '4') {
    vSpeed = 100;
  }
  else if (state == '5') {
    vSpeed = 125;
  }
  else if (state == '6') {
    vSpeed = 150;
  }
  else if (state == '7') {
    vSpeed = 175;
  }
  else if (state == '8') {
    vSpeed = 200;
  }
  else if (state == '9') {
    vSpeed = 225;
  }
  else if (state == 'q') {
    vSpeed = 255; //SON HIZ
  }

  else if (state == 'F')  //Gelen veri 'F' ise araba ileri gider.
  {
    digitalWrite(ina1, HIGH);
    digitalWrite(inb1, LOW);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, HIGH);
    digitalWrite(ina2, LOW);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'G') //Gelen veri 'G' ise araba ileri sol(çapraz) gider.
  {
    digitalWrite(ina1, HIGH);
    digitalWrite(inb1, LOW);
    analogWrite(pwm1, 100);

    digitalWrite(inb2, HIGH);
    digitalWrite(ina2, LOW);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'I') //Gelen veri 'I' ise araba ileri sağ(çapraz) gider.
  {
    digitalWrite(ina1, HIGH);
    digitalWrite(inb1, LOW);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, HIGH);
    digitalWrite(ina2, LOW);
    analogWrite(pwm2, 100);
  }

  else if (state == 'H') //Gelen veri 'H' ise araba geri sol(çapraz) gider
  {
    digitalWrite(ina1, LOW);
    digitalWrite(inb1, HIGH);
    analogWrite(pwm1, 100);

    digitalWrite(inb2, LOW);
    digitalWrite(ina2, HIGH);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'J') //Gelen veri 'J' ise araba geri sağ(çapraz) gider
  {
    digitalWrite(ina1, LOW);
    digitalWrite(inb1, HIGH);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, LOW);
    digitalWrite(ina2, HIGH);
    analogWrite(pwm2, 100);
  }

  else if (state == 'B') //Geri
  {
    digitalWrite(ina1, LOW);
    digitalWrite(inb1, HIGH);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, LOW);
    digitalWrite(ina2, HIGH);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'L') //Gelen veri 'L' ise araba sola gider.
  {
    digitalWrite(ina1, LOW);
    digitalWrite(inb1, HIGH);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, HIGH);
    digitalWrite(ina2, LOW);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'R')  //Gelen veri 'R' ise araba sağa gider
  {
    digitalWrite(ina1, HIGH);
    digitalWrite(inb1, LOW);
    analogWrite(pwm1, vSpeed);

    digitalWrite(inb2, LOW);
    digitalWrite(ina2, HIGH);
    analogWrite(pwm2, vSpeed);
  }

  else if (state == 'S') //Aracı durdur komutu
  {
    araciDurdur();
  }
}

void araciDurdur()
{
  digitalWrite(ina1, LOW);
  digitalWrite(inb1, LOW);
  analogWrite(pwm1, 0);

  digitalWrite(inb2, LOW);
  digitalWrite(ina2, LOW);
  analogWrite(pwm2, 0);
}

void setup() {
  pinMode(ina1, OUTPUT);
  pinMode(inb1, OUTPUT);
  pinMode(pwm1, OUTPUT);

  pinMode(inb2, OUTPUT);
  pinMode(ina2, OUTPUT);
  pinMode(pwm2, OUTPUT);

  Serial.begin(9600); //9600 baud hızında bir seri port açalım
}

void loop()
{
  /*
    Millis fonksiyonunu yaklaşık 50 gün çalışabilmektedir. Bu süreden sonra kendisini sıfırlar.
    Arduino'yu 50 gün boyunca hiç kapatmadan çalıştırdığımızı düşünelim.
    50. günün sonunda millis fonksiyonunu kullandığımızda,
    fonksiyon sıfırlanacağı için Arduino yeniden başlamış gibi değerler döndürecektir.
  */
  yeniZaman = millis();       //Arduinonun çalışma suresi milisaniye cinsinden alınıyor.

  if (Serial.available() > 0) //Telefondan komut geliyorsa
  {
    state = Serial.read();    //Gelen veriyi 'state' değişkenine kaydet

    eskiZaman = yeniZaman;    //Eski zaman değeri yeni zaman değeri ile güncelleniyor.
  }

  /*
    Bluetooth bağlantısı koptuktan sonra bağlantı kopmadan önceki state değeri kullanıldığı için
    araç bağlantı kopmadan önce hareket ediyorsa bağlantı kopuncada harekete devam ediyor.
    Aşağıdaki koşul ifadesiyle bu sorunu çözdük.
    Bluetooth'tan 1 saniye komut gelmeyince araç durduruluyor.
  */
  if (yeniZaman - eskiZaman > 1000)
  {
    state = 'S';
  }

  aracHareketi(); //telefondan komut gelmese bile araç belli süre hareket ediyor

  /*
    Projede Serial.print() ve Serial.println() fonksiyonları hiç kullanılmadı çünkü
    android programı devamlı bluetooth'tan veri gönderiyor, bizde Serial.print() ve Serial.println() kullansaydık
    telefona veri göndermiş olacaktık, bu durumda(çift taraflı iletişimde) telefonun komutları arduino'ya geç iletilirdi.
    Yani biz araca dur dediğimizde örneğin 2 saniye sonra durur, git dediğimizde 2 saniye sonra giderdi.
  */
}

Size faydalı olduysa, sosyal medyada paylaşarak bize destek olun. Teşekkürler.

Çarpmayan Araba (Arduino)
Sadece Güneş Enerjisiyle Çalışan Pilsiz Araba v1.0 (Arduino)