Bluetooth Kontrollü RC Araba

PROJENİN ADI:  Bluetooth Kontrollü RC Araba
 DANIŞMAN ÖĞRETMEN:  Aytekin TUZLALI
AMAÇ:  Radyo kontrollü oyuncak arabayı, arduino ve cep telefonu bluetooth bağlantısı ile kontrol etmek.
GEREKLİ MALZEMELER:
·   ARDUİNO NANO
·   RC Oyuncak Araba
·   Ön farlar için, 1 adet 220 ohm’luk direnç
·   dişi-erkek kablolar
·   Motorlar için 9V pil ve pil jakı
·   Arduino Nano ve Bluetooth (2 adet kalem pil=3V) modülü için, 4 adet 1,5 Voltluk kalem pil
·   Delikli Pertinaks
·   Lehim, havya, sıcak silikon tabancası ve silikon
·   Arka park sensörü için HC-SR04 mesafe sensörü
·   Kara şimşek kayar LED yapmak için, 5 adet şeffaf beyaz LED ve 5 adet 220 ohm’luk direnç
·   Korna için 1 adet buzzer
NASIL YAPTIK:
       Android telefonlarınızla hemen hemen birçok işlemi rahatlıkla yapabilmekteyiz. Bu projemizin sonunda android cep telefonu bluetooth kontrollü rc araba sahibi olacağız. Aşağıdaki resimde tüm bağlantıları bitmiş haldedir.
Motor sürücü için akımı kuvvetlendirmek ve motoru kontrol etmek için L298 entegresini kullanacağız. Benzer entegreler de aynı görevi yapmaktadır. L298 entegresinin en önemli özellikleri, 2 ampere kadar dayanabilmesi ve iki adet H köprüsünün bulunmasıdır. Entegremizde toplam 15 adet ayak bulunmaktadır. Bu ayakların bazıları motorlarımıza bazıları Arduino’ya ve bazıları da beslemeye bağlanacaktır. Entegrenin pin yapılanması için resimden yararlanabilirsiniz.
INPUT 1 ve INPUT 2 (5. ve 7.  Ayaklar): Bu pinlerimizi Arduino’ya bağlayacağız. Input 1’e 5 volt verip input 2’ye 0 volt verdiğimizde motorumuz ileri doğru, tam tersini yaptığımızda da geri doğru gidecektir.
 INPUT 3 ve INPUT 4 (10. ve 12. Ayaklar): Bu pinler de INPUT 1 ve INPUT 2 gibi çalışmaktadır.
OUTPUT 1 ve OUTPUT 2 (2. Ve 3. Ayaklar): Bu iki pin motorun iki ucuna bağlanması gerekmektedir.
OUTPUT 3 ve OUTPUT 4 (13. Ve 14. Ayaklar): Bu iki pin diğer motorun iki ucuna bağlanması gerekmektedir.
ENABLE A ve ENABLE B (6. ve 11. Ayaklar): Bu iki pin bizim hızımızı ayarlayacak pinlerdir. Bu yüzden bu pinleri Arduino’nun PWM ayaklarına bağlamamız gerekir. Verilen PWM sinyaline göre hızımız belli olacak ve INPUT ayaklarına verdiğimiz veya vermediğimiz 5 volta göre de motorun yönü belli olacaktır.
VSS (LOGIC SUPPLY VOLTAGE – 9. Ayak): Adından da anlaşıldığı gibi bu pinin 5 volta bağlanması gerekmektedir. Devrenin kararsızlığını azaltmak için bu pin ile toprak arasına 100nF’lık kondansatör bağlanabilir.
GND (8. Ayak) : Bu pini toprağa bağlamamız gerekmektedir. Ayrıca entegrenin tepesindeki metal de toprak olmaktadır. Bunu belirtmemin nedeni yanlışlıkla kısa devre yapmamanız içindir.
VS (4. Ayak): Entegremizin motorlara gidecek enerjiyi sağladığı asıl besleme ayağıdır. Buraya verdiğimiz motor kontrolümüz doğrultusunda motorlara verilecektir. Motorumuzun özellikleri göze alınarak uygulamalarımızda buraya 12 Volt bağlayacağız.
Yazılımda yazdığımız kodlarla yani Arduino ayaklarıyla motor sürücümüzün ayakları arasındaki bağlantıları bir tabloda gösterelim.
Arduino    Motor Sürücü
8              INPUT 1
9              INPUT 2
13            INPUT 3
12            INPUT 4
*11       ENABLE A     A ve B köprülerini etkinleştirmek için bu bacaklara +5 volt bağlamak gerekmektedir.
*10       ENABLE B     A ve B köprülerini etkinleştirmek için bu bacaklara +5 volt bağlamak gerekmektedir.
Motor          Motor Sürücü
Motor1       + OUTPUT 1
Motor1       - OUTPUT 2
Motor2       + OUTPUT 3
Motor2        - OUTPUT 4
(Motorun + veya – ucunun hangisi olduğu farketmez)
Besleme        Motor Sürücü
+12 Volt           VCC
Toprak (- uç)    GND
+5 Volt             VS 
ARDUİNO PROGRAMI :
// Proje Hocam - www.projehocam.com
//Geliştirme ve düzenleme - Aytekin TUZLALI
// Android Kontrollü RC Araba Programı
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(10, 9);
byte ledPin[] = {2, 3, 4, 11, 12}; /* LED pinleri için dizi oluşturuyoruz*/
int ledDelay(100); // değişiklikler arasındaki gecikmeyi belirliyoruz
int yon = 1; int currentLED = 0; unsigned long degismeZamani;
int referansDegeri = 10;
int piezoPin = 13; // Declaring Piezo Buzzer on Pin 13
int trigPin = A1; // sensörün trig pinine bağlanacak arduino pini
int echoPin = A0;  // sensörün echo pinine bağlanacak arduino pini
long olcum;
long cm; // sensörümüzden okuduğumuz uzaklık
char dataIn = 'S'; // Durma fonksiyonu için karakter
int pinileri = 5; //İleri sürüş için kontrol pini
int pingeri = 6; //Geri sürüş için kontrol pini
int pinsol = 7; //Sola sürüş için kontrol pini
int pinsag = 8; //Sağa sürüş için kontrol pini
char determinant; //Program döngüsü için karakter
char det; //Program döngüsü için karakter
void setup() {
  Bluetooth.begin(9600);//HC-06 bluetooth modülü için btu 9600  //Serial.begin(9600); //bilgisayar haberleşmesi
  for (int x = 0; x < 5; x++) { // bütün pinleri çıkış olarak tanımlıyoruz
    pinMode(ledPin[x], OUTPUT);
  } degismeZamani = millis();
  pinMode(pinileri, OUTPUT);
  pinMode(pingeri, OUTPUT);
  pinMode(pinsol, OUTPUT);
  pinMode(pinsag, OUTPUT);
  pinMode(piezoPin, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
void loop() {
  /*digitalWrite(trigPin, LOW); // sensör ilk başta ses yollamasın
    delayMicroseconds(500);
    digitalWrite(trigPin, HIGH); // Burada ses dalgasını yolluyoruz
    delayMicroseconds(1000);
    digitalWrite(trigPin, LOW);  // Tek bir ses dalgası yolladık
    olcum = pulseIn(echoPin, HIGH); // Eğer ses geri dönerse echo pinine geri dönecektir. // Burada geçen süreyi hesaplıyoruz.
    cm = olcum / 29.1 / 2; // ölçüm değerini zamandan -> CM’ye çeviriyoruz
    //Serial.print(cm); // sonucu Serial Monitor’den görmek için bilgisayara yolluyoruz
    //Serial.println("cm");
    //delay(100);
    det = check();
    if (cm <= referansDegeri) {
    tone(piezoPin, 2500); // Play a 2500Hz tone from the piezo (beep)
    }
    else {
    noTone(piezoPin);
delay(10);*/
  det = check();
  while (det == 'F') //Telefondaki programda atanmış olan ileri sürüş butonunun harf eşdeğeri
  {
    digitalWrite(pinileri, HIGH);
    det = check();
  }
  while (det == 'B') //Telefondaki programda atanmış olan geri sürüş butonunun harf eşdeğeri
  {
    digitalWrite(pingeri, HIGH);
    det = check();
  }
  while (det == 'L') //Telefondaki programda atanmış olan sola dönüş butonunun harf eşdeğeri
  {
    digitalWrite(pinsol, HIGH);
    det = check();
  }
  while (det == 'R') //Telefondaki programda atanmış olan sağa butonunun harf eşdeğeri
  {
    digitalWrite(pinsag, HIGH);
    det = check();
  }
  while (det == 'G') //Telefondaki programda atanmış olan ileri sola butonunun harf eşdeğeri
  {
    digitalWrite(pinileri, HIGH);
    digitalWrite(pinsol, HIGH);
    det = check();
  }
  while (det == 'I') //Telefondaki programda atanmış olan ileri sağa butonunun harf eşdeğeri
  {
    digitalWrite(pinileri, HIGH);
    digitalWrite(pinsag, HIGH);
    det = check();
  }
  while (det == 'H') //Telefondaki programda atanmış olan geri sola butonunun harf eşdeğeri
  {
    digitalWrite(pingeri, HIGH);
    digitalWrite(pinsol, HIGH);
    det = check();
  }
  while (det == 'J') //Telefondaki programda atanmış olan geri sağa butonunun harf eşdeğeri
  {
    digitalWrite(pingeri, HIGH);
    digitalWrite(pinsag, HIGH);
    det = check();
  }
  while (det == 'V') //Telefondaki programda atanmış olan korna butonunun harf eşdeğeri
  {
    tone(piezoPin, 2500);
    det = check();
  }
  while (det == 'v') //Telefondaki programda atanmış olan korna kapat butonunun harf eşdeğeri
  {
    noTone(piezoPin);
    delay(10);
    det = check();
  }
  while (det == 'S') //Telefondaki programda atanmış olan durma fonksiyonun harf eşdeğeri
  {
    digitalWrite(pinileri, LOW);
    digitalWrite(pingeri, LOW);
    digitalWrite(pinsol, LOW);
    digitalWrite(pinsag, LOW);
    det = check();
  }
  if ((millis() - degismeZamani) > ledDelay) {
    changeLED();
    degismeZamani = millis();
  }
}
void changeLED() {
  for (int x = 0; x < 5; x++) { // tüm ledler sönük
    digitalWrite(ledPin[x], LOW);
  }
  digitalWrite(ledPin[currentLED], HIGH);
  currentLED += yon; // yön değerinde arttırıyoruz
  if (currentLED == 4) {
    yon = -1;
  }
  if (currentLED == 0) {
    yon = 1;
  }
}
int check()
{
  if (Bluetooth.available() > 0) //Serial portun kontrolü
  {
    dataIn = Bluetooth.read(); //Telefondan gelen verilerin kontrolü
    if (dataIn == 'F')
    {
      determinant = 'F';
    }
    else if (dataIn == 'B')
    {
      determinant = 'B';
    }
    else if (dataIn == 'L')
    {
      determinant = 'L';
    }
    else if (dataIn == 'R')
    {
      determinant = 'R';
    }
    else if (dataIn == 'G')
    {
      determinant = 'G';
    }
    else if (dataIn == 'I')
    {
      determinant = 'I';
    }
    else if (dataIn == 'H')
    {
      determinant = 'H';
    }
    else if (dataIn == 'J')
    {
      determinant = 'J';
    }
    else if (dataIn == 'V')
    {
      determinant = 'V';
    }
    else if (dataIn == 'v')
    {
      determinant = 'v';
    }
    else if (dataIn == 'W')
    {
      determinant = 'W';
    }
    else if (dataIn == 'w')
    {
      determinant = 'w';
    }
    else if (dataIn == 'S')
    {
      determinant = 'S';
    }
  }
  return determinant;
}

Hiç yorum yok:

Yorum Gönder