Matlab Arduino Nesne Takip Robotu Yapımı

64 558

Kendi Robotunu Yap projelerimizin bu bölümünde matlab ile görüntü işleyerek, kırmızı nesneyi takip eden robot yapımını anlatacağım.Projemiz iki aşamadan oluşuyor. İlk aşama matlab kısmı yani görüntü işleyeceğimiz kısım. İkinci aşama ise arduino ile matlab den gelen bilgilere göre robotumuzu yöneteceğimiz kısım. Genel olarak projemizin hatları bu şekilde. Şimdi nesne takip robotu projemizin yapımına başlayabiliriz.

Malzemeler:

  1. Arduino (modeli fark etmez)
  2. webcam
  3. L293d veya b serisi ya da isterseniz shield de kullanabilirsiniz.
  4. Motor, tekerlek ve şaseyi ister kendiniz yapın isterseniz hazır kit alın veya oyuncak araba da kullanabilirsiniz.
  5. Batarya (7.2v  lipo veya 6v  nimh)

 

Elektronik Kısım:

Devre bağlantıları şekildeki gibidir.

Sağ motor >> 10. ve 11. dijital pinler

Sol motor >> 8. ve 9. dijital pinler

ena hız kontrol pini >> 5.dijital pin

enb hız kontrol pini >> 4.dijital pin

Fritzing dosyasını buradan indirebilirsiniz. >>matlab nesne takip robot

Şimdi arduino ve matlab yazılımına bakalım.

Arduino Yazılımı:

// Robimek Robotik Sistemler
 
//motor pinleri
const int sag_ileri=11;
const int sag_geri=10;
const int sol_ileri=9;
const int sol_geri=8;
//hız kontrol pin
const int ena=5;
const int enb=4;
//motorların hızı
const int motor_hiz = 200; // motor hızı
int led = 13;
void setup()
{
Serial.begin(9600);
pinMode(led,OUTPUT);
pinMode(sag_ileri,OUTPUT);
pinMode(sag_geri,OUTPUT);
pinMode(sol_ileri,OUTPUT);
pinMode(sol_geri,OUTPUT);
pinMode(ena, OUTPUT);
pinMode(enb, OUTPUT);
}
 
void loop()
{
int val;
if (Serial.available())
{
 
val=Serial.read();
if(val=='L')
{
analogWrite(ena,motor_hiz);
analogWrite(enb,motor_hiz);
digitalWrite(sag_ileri,HIGH);
digitalWrite(sag_geri,LOW);
digitalWrite(sol_ileri,LOW);
digitalWrite(sol_geri,HIGH);
digitalWrite(led,LOW);
}
else if(val=='R')
{
analogWrite(ena,motor_hiz);
analogWrite(enb,motor_hiz);
digitalWrite(sag_ileri,LOW);
digitalWrite(sag_geri,HIGH);
digitalWrite(sol_ileri,HIGH);
digitalWrite(sol_geri,LOW);
digitalWrite(led,LOW);
 
}
else if(val=='C')
{
 
digitalWrite(sag_ileri,LOW);
digitalWrite(sag_geri,LOW);
digitalWrite(sol_ileri,LOW);
digitalWrite(sol_geri,LOW);
digitalWrite(led,HIGH);
}
else if(val=='F')
{
analogWrite(ena,motor_hiz);
analogWrite(enb,motor_hiz);
digitalWrite(sag_ileri,HIGH);
digitalWrite(sag_geri,LOW);
digitalWrite(sol_ileri,HIGH);
digitalWrite(sol_geri,LOW);
digitalWrite(led,HIGH);
 
}
else if(val=='B')
{
analogWrite(ena,motor_hiz);
analogWrite(enb,motor_hiz);
digitalWrite(sag_ileri,LOW);
digitalWrite(sag_geri,HIGH);
digitalWrite(sol_ileri,LOW);
digitalWrite(sol_geri,HIGH);
digitalWrite(led,HIGH);
 
}
else
digitalWrite(led,LOW);
}
}

Arduino yazılımını yüklüyoruz.

Şimdi matlab de yeni bir script safası açıp aşağıdaki kodu yapıştıralım.

Matlab Yazılımı:

vid = videoinput('winvideo',1);
set(vid, 'FramesPerTrigger', Inf);
set(vid, 'ReturnedColorspace', 'rgb')
vid.FrameGrabInterval = 3;
s = serial('COM3','BaudRate',9600);
fopen(s);
start(vid)
i=1;
q=1;
c='A';
min=5500;
max=10500;
while(i<=300)
i=i+1;
obj_found=0;
 data = getsnapshot(vid);
 [y x c]=size(data);
 x1=x/2;
 x2=x1-40;
 x3=x1+40;
 % IMAGE SEPERATION BLOCK ---------------------
 
 diff_im = imsubtract(data(:,:,1), rgb2gray(data));
 diff_im = medfilt2(diff_im, [3 3]);
 diff_im = im2bw(diff_im,0.18);
 diff_im = bwareaopen(diff_im,300);
 bw = bwlabel(diff_im, 8);
 stats = regionprops(bw, 'all');
 imshow(data)
 hold on
 
 for object = 1:length(stats)
 obj_found=1;
 bb = stats(object).BoundingBox;
 bc = stats(object).Centroid;
 ar=stats(object).Area;
 rectangle('Position',bb,'EdgeColor','r','LineWidth',2)
 plot(bc(1),bc(2), '-m+')
 
 pix=((((ar<=max)&(ar>=min))*2)+((ar>max)*4)+((ar<min)*5)); if (bc(1)>x2)&(bc(1)<x3)
 disp('center')
 switch (pix)
 case 2
 r=1;
 case 4
 r=4;
 case 5
 r=5;
 end
 
 else if bc(1)<x2 r=2; disp('left') else if bc(1)>x3
 r=3;
 disp('right')
 else
 end
 end
 end
 
 y1=1:y;
 plot(x2,y1);
 plot(x3,y1);
 switch(r)
 case 1
 fwrite(s,'C');
 case 2
 fwrite(s,'L');
 case 3
 fwrite(s,'R');
 case 4
 fwrite(s,'B');
 case 5
 fwrite(s,'F');
 otherwise
 fwrite(s,'N');
 end
 end
 if obj_found == 0
 fwrite(s,'C'); 
 disp('no image')
 end
 
 
 hold off
end
fwrite(s,'C');
stop(vid);
flushdata(vid);
fclose(s);
clear all

Matlab yazılımındaki port adres kısmı yani s = serial(‘COM5′,’BaudRate’,9600); bu kısımda COM5 yazılı ifadeyi arduinonun takılı olduğu port numarasıyla değiştirin.

Webcam kamerayı bilgisayara takın. Yazılım kısmındaki vid = videoinput(‘winvideo’,1); satırındaki “1” ifadesi bilgisayara takılan kamera numarasını gösteriyor. Yani şuan çalıştırırsanız bilgisayarın kendi kamerası açılacaktır.İkinci bir kamera takılı ise bu değer değiştirilmelidir. Yani “2” yapılmalıdır.Matlab programını çalıştırın.Tüm işlemler başarılı şekilde gerçekleştiyse robotunuz hazır demektir. Şimdi kırmızı bir nesneyi kameraya gösterdiğinizde nesnenin konumuna göre robotu hareket ettirecek ve nesneyi takip etmesi sağlanacaktır.

Bütün yazılım dosyalarını buradan indirebilirsiniz. >> matlab nesne takip robotu

Kendi Robotunu Yap projelerimizin bu bölümünde Matlab ile arduino tabanlı nesne takip eden robotumuzu yaptık.

Bunları da beğenebilirsin

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

64 Yorum

  1. Ziyaretçi

    Emeğinize sağlık çok güzel bir proje yapmışsınız. Projenizle ilgili anlamadığım birkaç şeyi sormak istiyorum.

    Burada yazdığınız
    q=1;
    c=’A’;
    min=5500;
    max=10500;
    Ne işe yarıyor?

    pix=((((ar=min))*2)+((ar>max)*4)+((arx2)&(bc(1)<x3)
    disp('center')
    switch (pix)
    case 2
    r=1;
    case 4
    r=4;
    case 5
    r=5;
    end

    else if bc(1)x3
    r=3;
    disp(‘right’)
    else

    Birde switch case yapısı kullanmışsınız. Bu yapı ne işe yarıyor onu anlayamadım. Yardımcı olursanız çok sevinirim.

  2. Erdi

    Emeğinize sağlık. Ben yalnızca arduino ve kamera kullanarak renk ayırmak istiyorum. Nasıl bir yol izleyebilirim. Teşekkürler

  3. Kazım Ünal

    vermiş olduğunuz bilgi için teşekkürler. Bunun c# kodu var mı acaba elinizde? Bir de robotu yaptım, matlabda görüntü aldım ama hafızadan dolayı şişme yaptı ve programı otomatik durdurdu, hocam c# istediği için test amaçlı matlab yapmıştım yardımcı olursanız sevinirim. Teşekkürler.

  4. hasan

    Merhaba,

    R2016a da preview ile görüntü alamıyorum.
    windows içinde bulunan uygulama ile kameranın çalıştığını doğruladım.
    ama matlab ta görüntü alamdım hata vermiyor preview penceresi açılıyor fakat görüntü gelmiyor.
    nerede sorun olabilir?
    yardımcı olurmusunuz.

    vid = videoinput(‘winvideo’,1);
    preview(vid);

  5. ramazan

    bunu bluetooth ile beni takip eden bi sistem yapmak istiyorum nasıl olabilir

  6. Arda inanç

    Hangi kamerayı kullandınız

    1. Arda inanç

      Bir de masaüstü bilgisayar ile kuallanırken matlab da 1 mi olucak 2 mi olucak

      1. Sezgin GÜL

        standart webcam kullandım. tabi görüntünün donma yapmaması için biraz iyi kamera almanı öneririm. Harici kamerayı pc de ilk sıraya alman lazım. Zaten kendi sürücünü kurduğunda ilk sıraya otomatik alıyor. Yani 1 yazman lazım.

        1. Arda İNANÇ

          teşşekkürler

        2. Doğan Ham

          kardeşim seninle iletişime geçmemiz mümkünmü acaba?

  7. mustafa

    merhabalar öncelikle teşekkür ederiz bu proje için. projeyi çalıştırdık fakat motorlar çok hızlı gidiyor arduino’daki motor hızını düşürdük en son 130 oldu ama hala çok hızlı ne yapmamız gerekiyor sizinki gibi yavaş olmadı topu görünce kafayı yiyor araba kolay gelsin.

  8. Muslum

    Merhaba hocam usb ile denedim çalışıyor Bluetooth ile denedim Matlab ile bağlantısını sağladım ama çalıştırıyorm robot çalışmıyor neden acaba? Bide hocam usb ile çalıştırınca ilk çalıştırınca calisiyor sonra tekrar deniyorum line 18,72 hata veriyor tekrar yürütülmuyor program neden acaba hocam? Teşekkürler hocam

    1. Sezgin GÜL

      bluetooth sorununu yukarıda cevapladım. ikinci kez çalıştırınca çalışmamasının sebebi matlab açıkken programı kapatsanız bile arka planda çalışıyor olmasından dolayı ikinci kez çalıştırmada hata verir. Program zaten çalışıyor.

  9. muslum

    merhaba hocam bluetooth ile matlab baglantısını sagladım ama robot çalişmiyor ? normalde usb ile çaliştırıyorum hiç bir sıkıntı çıkmıyor? bide kodu 1 kere çaliştırdıktan sonra 2. kez çaliştırınca line 18 72 de hata veriyor neden acaba bunları cevaplarsanız çok sevinirim tesekkuler saygılarımla hocam

    1. Sezgin GÜL

      bluetooth ile hem gecikme yaşarsınız hem de pc nin bleutoothu ile bağlantı sık sık kopmaktadır.

  10. ahmet

    1) Bu kısım objeji bulduktan sonra yapacağı işlem mi

    if obj_found == 0
    fwrite(s,’C’);
    disp(‘resim yok’)
    end
    2) bu kısmı kodda yazmak zorunda mıyız sürekli renk okuma yapma istiyorsak bu kısm eklemesek olur mu
    hold off
    end
    fwrite(s,’C’);
    stop(vid);
    flushdata(vid);
    fclose(s);
    clear all

    1. Sezgin GÜL

      birinci kısım obje tarama işleminden sonra obje yoksa c karakteri yazdırır.
      ikinci kısımda serial portu ve veri alma kısmını kapatıyor. renk okuma işleminde üst kısmı kullanabilirsiniz. eğer serial portu açarsanız kapatma fonksiyonu da gerekir.

  11. Mehmet

    İyi günler hocam,
    Sizden ricam robotun yapım aşamasını anlatan bir yazınız var mı?

  12. Bahattinates

    merhaba . tessekurler. iyi calismalar. dilerim.size.

  13. Bahattinates

    merhaba. kamerayi. arduino. usb. baglanacak. onu ögrenmek. tesekkurler
    allaha.emanet olun

    1. Sezgin GÜL

      kamera usb ile pc ye bağlanacak. yani kamera sadece robotun üzerinde duracak. arduino ile hiçbir bağlantısı yok.

  14. Bahattinates

    merhaba. pC kamerasi var .bende. anlasildi. devresemasina. nasil. bagliyacam. bu konudan. cevap verirseniz.
    cok tesekkur.ederim. size. islerinizden. basarilar. dilerim. hersey. gonlunce. olsun.

  15. Bahattinates

    merhaba, bu robotun. kod calisiyor. semasida var. kamerayla calismasi. icin ne yapmam. gerekli. tabi kamera. programida gerekli. sizden ricam. bu konudan. bana. yardimci. olursaniz, cok. sevinirim. . tessekkur.ederim.size. sizin sayenizde, bilgi sahibi. oldum. allah. sizden. razi olsun. allaha. emanet olun. sitenizdeki. robotlariniz. harika. bazilari. sizin sayenide. denedim. calisiyor. elin. koluna saglik.
    isvrcten selamlar. bide eger . size dedigim. kamerea. uygun degilse. bu sizin robota. hanki. kamera. uygun. bunu. ogrenmek. isterim? tesekkurler.

  16. Bahattinates

    merhaba. parallax kit olarak. servo. 2 adet onde sarhos. teker. serial. girisli. parallax. basic kod yulkleniyor. sadece. kamerada. 3 kaplo var. . sizin dediginiz, gibi. usb. yok.
    bu kit.Boe-Bot Robot Kit – Serial . baglaniyor. usb. girisli. degil . bu dedigim. kamera. siz.diyorsunuz. uymaz. ne yapmam. gerekli. bide. kamera. semada. gostermemisiniz. baglantilari. tesekkurler. allaha. emanet olun. Bu robotu, sizin sayenizde, yapmak. kod calisiyor. iyi calismalar.

  17. Bahattinates

    merhaba. elin koluna saglik. . harika. olmus. sizin elinizde. birsey kacmiyor. cok tercubelisiniz. inanki.
    elimde . parallax .kamera var. bundan. 3 sene .evel.almistim. cok pahalidir. oyle duruyor. bu sizin robota uyarmi?
    kamere . 3 pinli. 1.arti.2.GND. 3 . outomat. bu konudan. cevap . bekliyorum. tesekkurler.
    islerinizden. basarilar. dilerim. allaha. emanet olun.
    iyi geceler.

    1. Sezgin GÜL

      kameranın serial dönüştürücüsü varsa olur. usb girişinden görüntü aktarabilirsin.

  18. Mustafa

    hocam öncelikle gayet güzel olmuş, elinize sağlık, matlab community de araştırma yaparken buraya denk geldim şu satırda biraz sıkıntım var
    pix=((((ar=min))*2)+((ar>max)*4)+((ar<min)*5));
    işlemdeki mantık nedir acaba şu anda evde değilim eve gidince satır satır işlemleri görerek deneyeceğim fakat önce bi sormak istedim.

    tekrardan teşekkürler

  19. Heysem

    Hocam mrb, wifi cam ile görüntüyü aktarsak ne gibi değişiklik yapmamız gerekir. Teşekkürler.

    1. Sezgin GÜL

      matlab kısmında wifi kameranızı pc nin kamerası olarak göstermeniz gerekir. Yada pc nin ayarlarından wifi kameranızı birinci kamera olarak ayarlayın.

      1. Heysem

        Ardunioda peki aktaramaz mıyız? Videodakinin aynısı sadece kamera kablosuz wifi ile aktarmayı düşünüyorum. Teşekkür ediyorum.

  20. Elif İLİKSİZ

    merhaba ; uzaktan kumandalı arabayı motor yerine kullanırsak arduino ile nasıl bağlantı yapabiliriz teşekkürler

    1. Sezgin GÜL

      oyuncak arabada direksiyon sistemi olduğu için kod kısmında motorların dönme yönlerini değiştirmen gerekir. Örneğin;
      else if(val==’F’)
      {
      analogWrite(ena,motor_hiz);
      analogWrite(enb,motor_hiz);
      digitalWrite(sag_ileri,HIGH);
      digitalWrite(sag_geri,LOW);
      digitalWrite(sol_ileri,HIGH);
      digitalWrite(sol_geri,LOW);
      digitalWrite(led,HIGH);

      }
      buradaki kısım ileri git fonksiyonu. Oyuncak arabaya uyarlarsan direksiyondaki motor durma pozisyonunda olacak arka motor ise ileri hareket pozisyonunda olacak yani aşağidaki gibi yapabilirsin.
      else if(val==’F’)
      {
      analogWrite(ena,motor_hiz); // ön motor hız
      analogWrite(enb,motor_hiz); // arka motor hız
      digitalWrite(sag_ileri,HIGH); // arka motor
      digitalWrite(sag_geri,LOW); // arka motor
      digitalWrite(sol_ileri,LOW); // direksiyon motor
      digitalWrite(sol_geri,LOW); // direksiyon motor
      digitalWrite(led,HIGH);
      }
      Bu şekilde diğer yön fonksiyonlarını ayarlaman yeterli diğer kısımlar aynı kalacak.

  21. Mehmet

    Matlab ek paket lazım sanırım bunun için ne yapmamızı önerirsin?

    1. Sezgin GÜL

      ek paket gerekmiyor. 12 ve üzeri sürümlerde sorunsuz çalışıyor

      1. Mehmet

        >> videoinput
        Error using videoinput (line 107)
        ADAPTORNAME and DEVICEID must be specified.

        selam matlab bu hatayı veriyor ne yapmam gerekir

        >> kamea1
        Error using videoinput (line 217)
        Invalid ADAPTORNAME specified. Type ‘imaqhwinfo’ for a list of available ADAPTORNAMEs. Image acquisition adaptors may be available
        as downloadable support packages. Open Support Package Installer to install additional vendors.

        Error in kamea1 (line 1)
        vid = videoinput(‘winvideo’,1);

        1. Sezgin GÜL

          kamerayı açamıyor. Harici kamera kullandıysanız uyumsuzluk sorunu olabilir.

          1. mehmet

            dahili kameraya da aynı hatayı veriyor siz matlab ın hangi versiyonunu kullanıyorsunuz

  22. Mehmet

    merhaba tamamen kablosuz çalıştırmak istersek ne gibi bir öneriniz olur? daha önceden arduino ya gelen komutları hc 05 / 06 üzerinden sağlayabilceğimizi söylemişsiniz ancak kamera görüntüsünü nasıl kablosuz aktarma şansımız olur?

    Birde motor shield kullanmak istersek arduino ya nasıl bir kod atmamız gerekir?

    Ellerinize ve emeğinize sağlık

    1. Sezgin GÜL

      kablosuz aktarımda bluetooth kullanırsınız fakat donma olur verim alamassınız. ip kamera kullanabilirsiniz. Motor shield kullanacaksanız kütüphane fonksiyonlarına göre koddaki hareket fonksiyonlarını değiştirin. Hangi shield kullanacağınızı yazın örnek kodu yazayım.

      1. Mehmet

        Funduino motor control shield for arduino kullanmak istiyoruz

  23. mustafa serdar

    merhabalar ,
    Öncelikle paylaşımınız için teşekkür ederim. Ben ;
    Error using message
    Invalid Message ID format: ‘sss’.

    Error in videoinput (line 217)
    error(message(‘sss’));

    Error in nesnetakip (line 1)
    vid = videoinput(‘winvideo’,2);
    hatalarını aldım yardımcı olabilir misiniz

  24. BURAK

    Öncelikle paylaşımınız için teşekkürler çok güzel olmuş böyle kod paylaşımı yapan kişiler bulmak internette çok zor benim dönem projemle çok benzer bir proje matlab kodunda hata alıyorum
    Undefined function ‘matlab’ for input arguments of type ‘char’. yardımcı olabilirmisiniz MATLAB R2012b sürümünü kullanıyorum. Birde projede dc motor kullanmışsınız servo motorla yaptığımızda arduino algoritması nasıl değişiklik gösterir. Yardımınız için şimdiden teşekkürler .

    1. Sezgin GÜL

      matlab 2013a sürümde sorunsuz çalışıyor. Arabada kullanırsanız sürekli dönen servo kullanmanız gerekir. Kod kısmında ise tanımlı karakterlerin altına servonun yönünü belirtip o şekilde yapabilirsiniz. Eğer pan sistemine uyarlayacaksınız konuma göre servonun açısını birer veya ikişer derece artırarak takip ettirebilirsiniz.

  25. Muslum

    İyi akşamlar hocam görüntüyü alıyorum camera 10/saniye falan aktif çalışıyor ona gore robotu hareket ettiriyor ama 10sn sonra fotoğraf çekiyor öyle duruyor onu nasıl sürekli hâle getirebilirm yardımlarınız için şimdiden tesekkur ederim

  26. muslum

    mrb hocam öncelikle elinize sağlık çok güzel bir çalişma olmuş benim de bu sene bitirme projeme yakın bir çalişma yapmişsinz aca seri haberleşmeyi bluetooth ile yapsak olur mu yani matlab ile arduıno arasında .

    1. Sezgin GÜL

      Olur hem de çok güzel olur.Pc nin kendi bluetoothu ile hc-05 veya 06 yı haberleştirebilirsin. Fakat baudrate değerini yüksek tututmanda fayda vardır .

      1. muslum

        onu deneyecem inş yapabilirim sizin paylaştığınız kodları yazdım önce bunu bir yapim kablosuz haberleşmeyi daha sonra yaparım önerileriniz içn teşekkür ederim

        1. Sezgin GÜL

          Rica ederim takıldığınız yeri sorabilirsiniz iyi çalışmalar

          1. muslum

            bilgisayarın webcamerası biraz yavaş kalıyor heralde bir zamandan sonra donuyor acaba nasıl bir camera modülü kullanmalıyım bir fikriniz var mı?

  27. gökhan odabaşı

    merhaba,

    elinize sağlık süper çalışma
    compile ettiğim programı çalıştırınca şöyle bir hata aldım.

    Cannot create: No class
    com.mathworks.toolbox.instrument.SerialComm can be located on the Java class Path
    Error in == A.m at line 5

    bu satır serial portu açtığı satır.

    arduıno nun portu ile programdaki serial port numarasını değiştirdim

    teşekkürler

    gökhan

    1. Sezgin GÜL

      Arduino ile matlab deki port numarası aynı olmalıdır. Birde sürüm farkından kaynaklı olabilir. Çünkü toolbox hatası almışsınız. 13 versiyonda sorunsuz çalışmaktadır.

  28. Alper Gencan

    Paylaşım için çok teşekkürler.Benim sormak istediğim kırmızı rengi nerede belirtiyoruz acaba? Başka renk istersek nasıl ayarlamamız gerekir acaba?

    1. Sezgin GÜL

      rectangle(‘Position’,bb,’EdgeColor’,’r’,’LineWidth’,2) satırında “r” ifadesi red yani kırmızı rengi belirtir. Bunu “b” yaparsan mavi rengi algılar

  29. abdurrahman ulusoy

    ellerine emeğine sağlık. çok güzel bir proje.. kodları paylaştığın içinde ayrıca teşekkürler.