Robot programlama (Çizgi sayma)

Bu sefer robotu üçüncü çizgide durdurma problemine bakayım dedim. Temel Lego programlama derslerinde işlenen bir problem. Robot zeminden farklı renkte çizgilerin üzerinden geçerken üçüncü çizgide durmalı. En basit çözümlerden biri heralde şöyle olabilirdi:

Yavaşça kısa süre hareket et.

Çizgi görene kadar ilerle.

Çizgiyi görünce dur.

Bu üç adımı üç kere tekrarlayan bir program bu problemi çözer.

Yeni şeyler öğrenebileceğim bir çözüm aradım ve aşağıdaki programı yaptım. Bu programda birbirine paralel (yani aynı anda) çalışan iki program akışı var. Başlangıç bloğundan çıkan iki ayrı yol bu program parçalarını belirliyor. Önce programa iki tane başlangıç bloğu koyup yaptım bunu ama nedense ikisini de tek tek çalıştırmam gerekti. Bu şekilde iki program parçası da tek bir tuşla başlatılabiliyor.

Alt taraftaki program parçası sadece robotu sürekli ileri doğru hareket ettiriyor ve sonsuz bir döngüye giriyor, yani bu program hiçbir şeye bakmadan sürekli ierliyor. Bu döngüden sonra ise robotu durdurma bloğu var. Demek ki bu döngü o kadar da sonsuz değilmiş. Evet, bu döngünün ömrünü üst taraftaki program parçası belirliyor.

Üstteki program parçası temelde şunu yapıyor. Renk değişimi olana kadar bekliyor. Değişiklik olunca yeni rengi bir değişkene yazıyor. Eğer yeni renk siyah ise (kullandığım çizgilerin rengi siyahtı) o ana kadar görülmüş çizgi sayısı değişkenini bir arttırıyor. Eğer toplam 3 olmuşsa alt taraftaki sonsuz döngüyü bitiriyor ve böylece motor duruyor.

Programda iki tane değişken var. Bunlar biri ‘color’ adında diğeri de ‘line’ adında kırmızı bloklar şeklinde tanımlanmış. Bu blok programlama dilinde beni en rahatsız eden şey değişken kullanımı oldu. Bir değişkenin değerini arttırmak için önce bir değişken okuma bloğu kullanıyoruz. Sonra bu değişkenin çıktısını toplama bloğuna sokuyoruz. Çıkan sonucu da tekrar değişken yazma bloğuna gönderiyoruz. Basit bir işlem için üç blok gerekiyor yani. Bu blokları bir araya getirip kendi bloklarımıza yapabiliriz ama bu işi henüz o kadar öğrenmedim.

Üstteki program parçasının alt kısmında toplama bloğunun girişlerinin biri çizgi sayısı değişkeninin değeriyken diğeri de renk değişkeninin siyah olup olmadığını kontrol eden karşılaştırma bloğunun çıkışıdır. Eğer renk değişkeninin yeni değeri siyah ise karşılaştırma bloğunun çıkışı 1 değerine, aksi durumlarda ise 0 değerine sahip oluyor. Bu nedenle aşağıdaki toplama bloğu sadece renk geçisi siyaha olursa çizgi değişkenini 1 arttırıyor, diğer durumlarda ise 0 arttırıyor, yani sabit tutuyor.

Sonraki blok ise çizgi sayısı değişkeninin değerinin 3 olup olmadığını kontrol ediyor. Eğer 3 ise çıktı doğru oluyor ve bir sonraki döngü bloğu bitiyor. Eğer 3 değilse çıktı yanlış oluyor ve döngü devam ediyor. Bu döngü bitince de döngü durdurma bloğu çalışıyor ve bu blokta kullanılan numara bitirmek istediğimiz döngüye verdiğimiz numarayla aynı olmalı (Programda 02). Dikkat edersek üstteki program parçası 01 numaralı döngüye, alttaki program parçası ise 02 numaralı döngüye sahip. Biz de 02 numaralı döngüyü bitirmek istiyoruz, çünkü böylece motor duracak.

Aiağıdaki kısa filmde programı çalışırken görebilirsiniz.

Robot programlama

Bir süredir Serkan’a aldığım Lego Mindstorms EV3 setiyle oynuyorum. Pahalı olmasına rağmen oldukça hoşuma giden bir öğrenim imkanı.

Programlamayı şimdilik Lego Mindstorms EV3 yazılımıyla yapıyorum. İlk başta android için olan uygulamayı kullanmıştım ama orada çok daha az blok olduğundan bazı programlar daha zor oluyordu.

Aşağıda ilk denemelerimden birini görebilirsiniz. Sonsuz döngü içinde hareket eden bir robot. Kızılötesi sensörle önünde bir engel olup olmadığına bakıyor. Eğer bir engel varsa biraz geriye gidip restgele seçtiği bir yöne dönüp bir sonraki engele kadar ilerliyor. Programdaki ses blokları temel program için önemli değildir.

Program sonsuz döngü içinde çalıştığından robotu durdurmak için kontrol bloğunun üzerindeki düğmeyi kullanmak gerekmekte. Programda tabii ki hangi sensörün ve motorun hangi giriş kanalına bağlandığına dikkat etmek lazım. Aşağıdaki program B ve C kanallarına takılı büyük motorları ve 1. kanalda bulunan kızılötesi sensörünü kullanmakta. Bekleme bloğu kızılötesi sensör engel algılayana kadar motorun düz hareket etmesini sağlıyor. Engel algılandıktan sonra motoru durduruyorum çünkü diğer durumda ses dosyası motor gürültüsünden duyulmayabiliyor. Yani ses dosyaları kullanılmazsa motorları durdurmaya da gerek yok. Ses dosyası çalındıktan sonra motorlar geriye doğru bir tur döndürülüyor. Rastgele sayı bloğu 1 ile 4 arasında (1 ve 4 dahil) rastgele bir tamsayı üretiyor ve sonraki ‘switch’ bloğunda her bir ihtimale karşı ne yapılacağı programlanıyor.

Bir engelle karşılaşınca yön değiştiren robot progamı

Aşağıdaki videoda da robotu çalışırken izleyebilirsiniz.