[FONT=Verdana, Arial, Helvetica, sans-serif]Robotic: NQC Programlama Dili
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.RCXin bilgisayarlardaki Windowsa 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 RCXe yuklenmesi gibi pek cok islevi goren bir program gelistirilmistir. RCXi kullanmaya baslamadan once firmware olarak bilinen, RCXin 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 RCXin hangi versiyonunu kullandiginiz sorulur, burdan RCX2yi 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 RCXe yuklemek icinde kullanilabilir. Tools Download Firmware menusune giderek yukleceginiz firmwarei secerek bu islemi yapabilirsiniz.
İlk program
Bu programimizda RCXe 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 RCXe 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.
RCXIN 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 modunun 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.
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]
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.
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.
int w,x,y,z; //Degişkenleri tanımladık
task main()
{
SetSensor(SENSOR_1,SENSOR_ROTATION); //SENSOR_1i 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.
Robot Çalışırken çekilmiş Video Linki:
https://www.youtube.com/watch?v=T3pxo37wJN4
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.
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.
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.RCXin bilgisayarlardaki Windowsa 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 RCXe yuklenmesi gibi pek cok islevi goren bir program gelistirilmistir. RCXi kullanmaya baslamadan once firmware olarak bilinen, RCXin 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 RCXin hangi versiyonunu kullandiginiz sorulur, burdan RCX2yi 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 RCXe yuklemek icinde kullanilabilir. Tools Download Firmware menusune giderek yukleceginiz firmwarei secerek bu islemi yapabilirsiniz.
İlk program
Bu programimizda RCXe 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 RCXe 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.
RCXIN 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 modunun 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.
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]
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.
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_1i 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.
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.