Jump to content
senoleker

Çizgi izleyen robot

Önerilen İletiler

senoleker    0

"İlk proje" ne olmalı? Tabii ki çizgi izleyen robot. Belki yanıp sönen led de yapabilirdik ilk proje olarak ama, onları proje bölümünde değil de, kendi alt bölümlerinde yapmayı daha uygun gördük.

Donanım olarak Arduino UNO'nun daha ucuz olan CH340 arabirimli modelini tercih ettik. Tabii siz elinizde olan bir Arduino kullanabilirsiniz. Çünkü bu proje için çok miktarda I/O ve bellek gerekmiyor. Ayrıca iki tane tekerlekli ve redüktörlü DC motor, motorları sürmek için L298N motor sürücü ile devrenin "gözü" olarak da TCRT5000 üçlü sensor kullandık.

Önce piyasada bulunan yazılımlara baktık ve doğrusu bu yazılımı kullanmak içimize sinmedi. Çünkü üç gözlü sensorda, sensorun özelliğini kullanabilmek için kalınlığı iki göz arasındaki mesafeden daha fazla olan bir bant kullanmak gerekli. Aksi halde robotumuzu bant görmediğinde de hareket edecek şekilde programlamak zorunda kalırız ve bu da çok dengesiz sonuçlara yol açar.

Yazdığımız bu program aslında gerçek bir "çizgi izleyen robot" için halen uygun değil. Çünkü dört başı mamur bir şey yazdık diyebilmek için, robot çizgiden çıktığında hangi açı ile çıktığını hesabedip ona göre bir rota düzeltme yapmalı. Biz ise diğer public yazılımlardaki gibi sadece gözlerin durumunu motorlara aktaracak bir kod tasarladık.

Motorlarımızı LN298'e bağlarken ikisini de aynı yönde bağlamalıyız. Eğer motorları ters bağladıysak tekerler geri doğru dönecektir. Bu durumda ya motorların bağlantılarını değiştirmelisiniz ya da koddaki

  digitalWrite(L298N_RightB,LOW);
  digitalWrite(L298N_LeftB,LOW);
  digitalWrite(L298N_RightA,HIGH);
  digitalWrite(L298N_LeftA,HIGH);

kısmını

  digitalWrite(L298N_RightB,HIGH);
  digitalWrite(L298N_LeftB,HIGH);
  digitalWrite(L298N_RightA,LOW);
  digitalWrite(L298N_LeftA,LOW);

olarak değiştirmelisiniz. Böylece motorlara uygulanacak gerilimin yönünü değiştirmiş olursunuz, kablo söküp takmaya gerek kalmaz.

 

TCRT5000 sensoru, beyaz yüzey için 0, siyah yüzey için 1 değerini verir. Eğer pistimizi siyah (koyu renkli) yaptıysak ve çizgimizi beyaz (açık renk) yaptıysak, okuyacağımız değerler ters gelecektir. Bu yüzden sensor okuma kısmını

//TCRT5000 okuma
  int d1 = 1-digitalRead(TCRT_Left);
  int d2 = 1-digitalRead(TCRT_center);
  int d3 = 1-digitalRead(TCRT_right);

olarak yazmalıyız.

Ama pistimiz açık renk ve çizgimiz koyu renkli ise, o zaman sensor okuma kısmındaki "1-" leri kaldıracağız:
//TCRT5000 okuma
  int d1 = digitalRead(TCRT_Left);
  int d2 = digitalRead(TCRT_center);
  int d3 = digitalRead(TCRT_right);

Böylece koda fazlaca dokunmadan pist seçimimizi yapmak imkanımız olacak.

Sensorlardan hem orta hem de yanlardan biri çizgiyi görüyorsa, robotumuz çizgiden çıkmak üzere sayılır, bu sırada daha düzgün bir hareker için, eğer iki göz birden çizgiyi görüyorsa kenardaki gözün çizgiyi görmediğini varsayacağız. Bunun için koda:

//Sensorların iki tanesi birden çizgiyi görüyorsa
  if ((d1+d2)==2) d1=0;
  if ((d2+d3)==2) d3=0;

ekledik.

Bundan sonrası motorlar dönecek mi, dönecekse ikisi de mi dönecek, birisi dönecekse hangisi dönecek buna karar vermekten ibaret.

Öncelikle motorların dönmesi için tek bir gözün (yukarıda orta ve bir kenar görürse bire indirgemiştik) çizgi görmesi gerek. Böyle değilse, yani üç göz ya da iki kenar çizgi görüyorsa, ya da hiç biri çizgi görmüyorsa motoru çevirmiyoruz. Bunu da bir if komutu ile sağlıyoruz:

  if ((d1+d2+d3)==1)

Burada d1,d2 ve d3 gözler. Bunların toplamı 1 olmalı. Yani sadece bir göz çizgiyi görüyor olmalı. Aksi halde hiç bir motoru çevirmiyoruz. Böylece kenara koyduğumuzda robot saçma sapan hareket etmeyecek, hareketsiz duracaktır.

Eğer bu şart sağlanıyorsa, iki motor birden ya da motorların biri dönmelidir. Bunu da basit bir toplama işlemi ile gerçekleştiriyoruz:

    analogWrite(L298N_RightS,(d1+d2)*hiz);
    analogWrite(L298N_LeftS,(d2+d3)*hiz);

Programın başında "hiz" değerimizi tanımlamıştık. Örneğin 100-150 gibi bir hız değeri verebilirsiniz. Burada d2 değeri 1 ise her iki teker, d1 veya d3 değeri 1 ise, ilgili teker dönecek, böylece robotumuz çizgiyi izlemiş olacaktır.

Bağlantılar:

TCRT'nin sol ucunu Arduino'nun 10 numaralı ucuna, orta ucunu 11 numaraya, sağ ucunu ise 12 numaraya bağlıyoruz.

Motor sürücünün ENA ve ENB pinlerindeki jumper cap'leri çıkartıyoruz. Sonra sırasıyla ENA-IN1-IN2-IN3-IN4-ENAB uçlarını Arduino'nun sırasıyla ,   9-7-6-5-4-3 uçlarına bağlıyoruz. Besleme uçlarını ise besleme planınınıza göre yapabilirsiniz.
 

Robotun deneme videosunu aşağıdaki linkten izleyebilirsiniz.

https://youtu.be/2WsJSOnJRbw

Arduino kodlarını da aşağıdaki linkten indirebilirsiniz.

CizgiRobot.ino

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş

Hesap oluşturun veya yorum yazmak için oturum açın

Yorum yapmak için üye olmanız gerekiyor

Hesap oluştur

Hesap oluşturmak ve bize katılmak çok kolay.

Hesap Oluştur

Giriş yap

Zaten bir hesabınız var mı? Buradan giriş yapın.

Giriş Yap

×

Önemli Bilgilendirme

Facebook / Twitter / Google hesabınızla kolayca kaydolup cevap verebilir, soru sorabilir, istekte bulunabilirsiniz.
Devam etmeniz, forum kurallarını kabul ettiğiniz anlamına gelir.            Forum Kuralları