Robotic Programlama

Raphers

Adanmış Üye
31 Ağu 2014
7,286
5
System.Net
[FONT=Verdana, Arial, Helvetica, sans-serif]Robotic: NQC Programlama Dili

1bb432.jpg


Robotların kullanım alanlarının genişlemesi ve yazılım teknolojisinin gelişmesi; belli bir amaç için yapılan robotların, o amaç doğrultusunda programlanması ihtiyacını beraberinde getirdi. Robot yazılımı üreten şirketler öncelikle simülasyonlar üzerinde çalışırlar. Buna off-line programlama denir. Robot üretilmeden önce, yazılım aşamasında, hareketleri, hangi şartlarda ne tür tepkiler vereceği, öğrenme kabiliyeti gibi özellikleri önceden bilgisayar ortamında off-line programlama tekniği ile test edilir.

Ben bu konuda sizlere Robot programlama dili olan NQC programlama dilini anlatacağım.
Tasarımda yardımlarını esirgemeyen WBaskan kardeşime teşekkür ederim.

Lego Mindstorm İnvention Set

Lego Mindstorm Robotic Invention 2.0 seti, 1 adet RCX olarak isimlendirilen mikroislemci kutusu, 2 adet motor, 3 adet sensor, 1 IR kutusu, RIS 2.0 yazilimi ve 700 civarinda Lego parcaciklarindan olusur.RCX’in bilgisayarlardaki Windows’a benzer firmware diye adlandiracagimiz bir isletim sistemi vardir. RCX icin yazilan programlar bir IR kutusu araciligi ile mikroişlemcinin bellegine yuklenir. Programlar farkli yazilimlar kullanılarak yazilabilir.

Bunlardan başlicalari:

RCX Code
NQC (Not Quite C)

RCX Code grafiksel ögeler kullanılarak programlama yapılan bir yazilim dilidir. NQC; C programlama diline benzer olarak gelistirilen bir programlama dilidir. Bu derleyici Daha sonra BricxCC (Bricx Command Center) adinda, windows isletim sistemi altinda calisan, NQC programlarının yazımı, derlenmesi, hatalarin düzeltilmesi ve RCX’e yuklenmesi gibi pek cok islevi goren bir program gelistirilmistir. RCX’i kullanmaya baslamadan once firmware olarak bilinen, RCX’in kendi isletim sisteminin hafizaya yuklenmesi gerekir. Firmware RCX kapatilsa bile hafızada kalir. RCX kutusunun uzerinde kullanici ile iletisimi saglayan bir LCD ekran bulunur.

BricxCC Yazılımı

Bu yazilim ilk açıldığı zaman IR kutusunun bilgisayara hangi yolla baglandığını belirteceğiniz bir diyalog kutusu cikar.Buradan USB1 seçenegini seçin. Ayrica RCX’in hangi versiyonunu kullandiginiz sorulur, burdan RCX2’yi secin. Program acildiginda bu seçeneklerin default olarak secilmis olmasini istiyorsaniz, Edit Preferences seçenegini secin ve Start Up butonuna basarak gereken islemleri yapin. BricxCC firmware i RCX’e yuklemek icinde kullanilabilir. Tools Download Firmware menusune giderek yukleceginiz firmware’i secerek bu islemi yapabilirsiniz.

İlk program

Bu programimizda RCX’e bir motor ve bir dokunma sensoru bağlayacağız. Program motoru ileri yonde döndermeye baslayacak ve her dokunma sensorune basildiginda motorun donus yonunu tersine çevirecektir.

// start.nqc programı

task main( )
{
SetSensor(SENSOR_1, SENSOR_TOUCH);
On (OUT_A);
while(true)
{
Until ( SENSOR_1 == 1 );
Toggle ( OUT_A );
Until ( SENSOR_1 == 0 );
}
}

Programi derleyerek RCX’e yukleyin ve calistirin. Motor donerken A portunun ustunde motorun donus yonunu gosteren kucuk bir ucgen goreceksiniz. Dokunma sensorune basildiginsa 1 portunun hemen altinda sensorun aktif hale geldigini belirten bir ucgen isareti goreceksiniz. Durdurmak icin tekrar Run tusuna basiniz

View Butonu

RCX ekraninda saat, sensorlerden okunan degerler, motorlarin durumlari, programin hangi program kutusuna yuklendigi gibi bilgiler goruntulenebilir. Bu seceneklere view butonu ile erisilebilir.

RCX’IN Diğer özellikleri (SES)

6 kayitli melodi vardir. Bunun yaninda frekansı ve süresi belirtilerek istenilen ses üretilebilir. Çalinacak melodi ve sesler sıraya konur. Siraya 9 ses/melodi konabilir. Programin belirli asamalarinda melodi çalınmasını sağlayabilirsiniz.

NQC Programlama Dili

NQC C benzeri bir dildir. DOS temelli bir dil olarak geliştirilmistir.
Komutlar küçük/büyük harf duyarlıdır.
Aciklamalar // veya /* … */ karakterleri ile yapılır.
Komutlar ; karakteri ile bitirilir
Fonksiyon yada değişken isimleri harf yada _ isareti ile baslar ve harf, sayi ve _ karakterleri içerebilir. Bu programlama dili komutlar ve hazır fonksiyonlardan oluşur.

Sensörler

Bir sensörü kullanabilmek icin sensörün çeşidi (type) ve modu’nun tanimlanmasi gerekir. Bunlar icin şu komutlar kullanılır:
SetSensorType( sensorPort, type );
SetSensorMode( sensorPort, mode);

Örnek:

SetSensorType( SENSOR_1, SENSOR_TYPE_LIGHT); // Sensör 1 i ışık sensörü olarak ayarla.
SetSensorMode(SENSOR_1,SENSOR_MODE_BOOLEAN); // Sensör 1 i Boolean Mod da ayarla.

Örnek bir program yapacak olursak ;

//prog1.nqc
//Bu program OUT_A portuna bağlı olan bir motoru çalıştırır ve SENSOR_1 portuna bağlı olan
//bir dokunma sensörüne basılınca motoru durduran program.

Task main
{
SetSensor (SENSOR_1, SENSOR_TOUCH); //Dokunma Sensoru
On(OUT_A); //Motoru çalıştır
until(SENSOR_1 == 1); //Sart saglanana kadar bekle
Off(OUT_A); //Motoru durdur.

kc5924.jpg


Bu resimdeki robotu bizzat kendim yaptım. Robot kolu bir yöne doğru dönerek herhangi bir yük ile karşılaştığında durup o yükü kaldırıp başka bir yere taşıma amaçlı yapılmıştır.

Diğer bir taşıma aracı;[/FONT]

22d0788.jpg


NQC (Not Quite C) programlama dilinde program yazmayı daha detaylı anlatacağım.

task main()
{
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(400);
OnRev(OUT_A+OUT_C);
Wait(400);
Off(OUT_A+OUT_C);
}


Bu programı RCX hafızasına yükleyip çalıştırdığımızda robotumuz 4 sn ileri hareket, 4 sn geri hareket edip duracaktır.

Bir başka örnekte robotumuza dokunma sensörü tanımlayabiliriz.

task main()
{
SetSensor(SENSOR_1,SENSOR_TOUCH);
OnFwd(OUT_A+OUT_C);
until (SENSOR_1 == 1);
Off(OUT_A+OUT_C);
}


SENSOR_1 ‘e dokunma sensörü tanımladık. A ve C motorlarını çalıştırdık. Tank robot ileri doğru hareket edecek. SENSOR_1==1 şartı sağlanınca yani robotun önüne herhangi bir engel çıkınca motor duracaktır.



Şimdi biraz daha detaya inerek baştan sona bir robot tasarlayalım. Adım adım ilerleyip bu robotun neler yapabildiğine bakalım.


TANITIM​

Bu aşamada RCX mikroişlemci tabanlı robot programlayacağız. Programladığımız robot kare şeklinde bir alanda rastgele yerleştirilmiş tenis toplarını hızlı bir şekilde bulup, onları taşıyarak kare alanın dışına bırakacaktır.

1V2BauUzYj4VW-JzIam59kjN9nhsB9htm7vT4eA9jZFaxBiLCkUzwY9-AsR2FjRdFcGo1M483_UdiJVBPGs3iZp40APCLOqfd0zFtdCHwDxXKW9-ku0PRmfgACigXKwXPg




MALZEMELER


  • Lego Mindstorms Robotik Buluş Seti
  • Ek dokunma sensörleri, ışık sensörü, cıva anahtarı ve viraj sensörleri








KODLAMA

int w,x,y,z; //Degişkenleri tanımladık
task main()
{
SetSensor(SENSOR_1,SENSOR_ROTATION); //SENSOR_1’i Rotasyon sensörü olarak ayarla
OnRev(OUT_B);
Wait(120);
OnRev(OUT_B);
w=0;
OnFwd(OUT_A+OUT_C); //İleri hareket için RCX çalışır.
start check; //Sürekli kontrol görevi başlattık.
}

task check()
{
while(true) //Sonsuz döngü
{
z=Random(50)+15; //Dönüş süresi için rasgele bir değer belirle
w=w+1;
if(w>2)
{
w=1; //Dönüş iki yolla tanımlayabiliriz. 1 veya 2 şeklinde ya da SAĞ ve SOL olarak
}
x=SENSOR_1; //Dönme sensörünü x degerine atadık.
Wait(70); //0.7 sn beklettik
y=SENSOR_1; //Dönme sensörünü tekrar kontrol ettik.
if(x==y) //Eğer tekerlek hareketsiz ise, başka bir deyişle x=y ise
{
OnFwd(OUT_A+OUT_C); //çift kontrollü ileri hareket
PlaySound(SOUND_UP); //çift kontrollü olduğuna dair sesi çal
x=SENSOR_1;
Wait(70);
y=SENSOR_1;
if(x==y)
{
Off(OUT_A+OUT_C); //Motorları kapat
OnFwd(OUT_B); //kepçeyi yukarı hareket ettir
Wait(120); //1.2 sn bekle
Off(OUT_C); //kepçeyi kapat
OnFwd(OUT_A+OUT_C); //ileri hareket et
Wait(100); //1 sn bekle
Off(OUT_A+OUT_C); //ileri hareketi durdur
OnRev(OUT_B); //kepçeyi aşağı indirerek topu veya topları bırak
Wait(125); //1.25 sn bekle
OnFwd(OUT_B); //kepçeyi yukarı hareket ettir
Wait(120); //1.2 sn bekle
Off(OUT_B); //yukarı hareketi durdur
OnRev(OUT_A+OUT_C); //geri git
Wait(10); //0.1 sn bekle
OnRev(OUT_B); //kepçe aşağı indir
Wait(125); //1.25 sn bekle
if(w==1) //eğer dönüş degişkeni w=1 ise sola dönüş yap
{
OnRev(OUT_A); //sol tekerlek geri yönde hareket
OnFwd(OUT_C); //sag tekerlek ileri yönde hareket, böylece olduğu yerde sola dönüş sağlanır.
Wait(z);
}
if(w==2) //eğer dönüş degişkeni w=2 ise sağa dönüş gerçekleştir
{
OnRev(OUT_C); //sağ tekerlek geri yönde hareket
OnFwd(OUT_A); //sol tekerlek ileri yönde hareket, böylece olduğu yerde sağa dönüş sağlanır.
Wait(z);
}
}
}
else
{
OnFwd(OUT_A+OUT_C); //ileri harekete devam et.
}
}
}



Robotun görünüşü resimde görüldüğü gibidir.
Z8UWmBgCBMueV2jUiIjBIte-sME0H3h76K6715kA9OI3C30n78G9sN0Xr2j97TmuiCprtMaG31lFq_WZYVcqOtwtnhfZqBVq6bEAwHQoN7ARFhFmHcJpx8_QWJP2k8XRzQ

Robot Çalışırken çekilmiş Video Linki:

https://www.youtube.com/watch?v=T3pxo37wJN4


GELİŞTİRMELER

Geriye dönüp baktığımızda, çok şey yaptık gibi gözükse de bunu daha da geliştirebiliriz. Mesela; daha fazla sayıda ve çeşitte sensör ekleyerek topları arayabiliriz. Veya dönüşleri daha iyi yaptırabiliriz. Ya da videoda görüldüğü gibi 3 topu birden taşıyabilen bir kaldıraç sistemi yapılabilirdi. Liste uzayıp gider.

SONUÇ

Mühendislik, programlama ve fizik alanlarının birleşimi olan NQC programlama dili, pek bilinmeyen bir dildir. Fakat görüldüğü gibi gayet basittir. Ben elimden geldiğince basit anlatmaya çalıştım. Umarım faydalı olmuştur.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.