Hazırlayan: Tuna BULUT – Çizgi izleyen robot bir çok kişinin uyguladığı bir proje ve hala güncelliğini koruyor mekanik, elektronik, yazılım bir çok bölümde başlangıç için örnek proje. Yazıda sadece robot yapımı değil daha bir çok faydalı bilgi bulunuyor. Çizgi izleyen robot konusunda bilgileri paylaşan hazırlayan emeği geçen kişilere teşekkürler.
ÇİZGİ İZLEYEN ROBOT YAPIMI
Tanımı ve Çalışma Prensibi: Çizgi izleyen robot, adından da anlaşıldığı üzere, renk farkından faydalanarak bir çizgiyi takip eden robot çeşididir. Bu robot, endüstriyel alanlarda çok faydalı olabilecek bir robottur. Eğer sürekli bir yerden diğer bir yere mal götürülüyorsa, bu işi otonom olarak bir robota yaptırmak hem işleri hızlandıracak hem de ihtiyaç duyulan iş gücünü azaltacaktır. Bu sistemi kurabilmek için ise yapılması gereken tek şey robotun gitmesi gereken güzergâha bir çizgi çizmek. Bu robotların çalışma prensibi aşağıdaki diyagramla açıklanabilir:
Bu projede kullanacağımız optik sensörler kızılötesi (ir) ışık yayarlar ve tekrar yansıyan ışığı detektörleri aracılığıyla toplar ve topladıkları bu ışığın şiddetine göre belli voltaj düzeylerinde çıkış verirler. Daha iyi sonuçlar alabilmek için çizginin rengi ışığı en üst seviyede yansıtan beyaz veya en düşük seviyede yansıtan siyah olmaktadır. Zeminin de, daha iyi sonuç vermesi açısından, çizgi siyahsa beyaz, çizgi beyazsa siyah olması tercih edilir.
Sensörlerden gelen çıkışlar analog olduğu için, bu çıkışları karar verme mekanizmamızın(mikroişlemci) anlayabileceği dile, lojik 1 ve 0 lara dönüştürmemiz gerekmektedir. Bu dönüştürme işlemini de karşılaştırıcı olarak kullandığımız opamplar(işlemsel kuvvetlendirici) yapmaktadır.
Opamplar şu şekilde çalışmaktadır: Opampa bir referans gerilimi veriyoruz ve opamp bu referans gerilimiyle sensörlerden gelen gerilimi karşılaştırıp 5 V (lojik1) veya 0 V (lojik 0) çıkış vermektedir. Bu çıkış gerilimi, kullandığımız devreye ve sensörlerden gelen gerilime göre değişmektedir. Bizim kullanacağımız devrede sensörlerden referans geriliminin altında bir gerilim geldiğinde opamp 5 V (lojik1), üstünde bir gerilim geldiğinde de 0 V (lojik 0) çıkışı vermektedir.
Yani sensörlerimiz siyah rengi gördüklerinde opamp 0 V, beyaz rengi gördüklerinde de 5 V çıkış vermektedir. Sensörlerden gelen bu verilere göre de mikroişlemci bir karar vermekte ve bu karara göre de motorları harekete geçirmektedir. Mikroişlemcinin kararı şu şekilde olabilir:
3 numaralı sensörün çizgi üzerinde olması aracın çizginin sol tarafında olduğunu gösterir. Bu yüzden aracın konumunu düzeltmesi için 2 numaralı sensör çizgiyi görene kadar sağa dön.
2 numaralı sensör çizgi üzerinde olduğu için düz git
1 numaralı sensörün çizgi üzerinde olması aracın çizginin sağ tarafında olduğunu gösterir. Bu yüzden aracın
konumunu düzeltmesi için 2 numaralı sensör çizgiyi görene kadar sola dön.
Bu üç durum bir çizgi izleyen robotun çizgi üzerinde gitmesi için yeterlidir. Bu 3 sensörlü bir sistem için geçerlidir. Sensör sayısı artırılarak ve farklı konfigürasyonlar kullanarak belki daha iyi sonuçlar alınabilir. Ancak şunu unutmamak lazım ki daha fazla sensör, daha fazla durum bu da daha uzun bir program demektir.
Programın uzun olması, sistemin farklı durumlar karşısında göstereceği tepki süresinin daha uzun olmasına sebep olur ki bu da fazla sensör kullanmanın kötü yanıdır. Burada sistemin vereceği tepki süresi robotun çizgiye sağlayacağı uyum açısından önemli olduğu için gerekmediği sürece fazla sensör kullanmanın uygun olmayacağını söyleyebilirim. Ayrıca sensörlerin formasyonu ve aralarındaki uzaklık direk olarak aracın performansını etkileyeceği için bu da bir diğer önemli noktadır.
Bu uzaklık ve sensörlerin dağılım biçimi aracın hızına, genişliğine, uzunluğuna ve sistemin vereceği tepki süresine göre değiştiği için en uygun değerleri bulmak için ya bütün bu etkenler göz önünde bulundurularak meşakkatli bir hesaplama yapılmalı ya da deneme yanılma yöntemi kullanılmalıdır.
Mekanik Kısım
Aracın mekanik kısmı da diğer kısımlar gibi robotun performansı üzerinde doğrudan bir etkiye sahiptir. Bu sebeple
mekanik tasarım da önemlidir. Robotun kasası için birkaç farklı tasarım kullanılabilir. Bunlardan biri hazır bir oyuncak araba alınıp onun kasası bu iş için kullanılabilir. Bu oyuncak arabalar, otomobillerde olduğu gibi, ackerman steering denilen sürüş sistemine sahiptir. Bu sürüş sisteminde aracın hareketi arka tekerleklere bağlı olan bir motorla sağlanırken, yönlendirilmesi için de ön tekerleklere bağlı bir adet motor kullanılmaktadır. Bu sürüş sisteminde aracın manevra yeteneği düşük olacağından keskin virajları dönemeyecektir.
Bir diğer sistem de önde bir adet sarhoş tekerin kullanıldığı ve arka tarafta da birbirinden bağımsız hareket eden iki teker ve bunlara bağlı motorlardan oluşan sistemdir. Bu sistemde araç dönüşünü iki tekerin hız farkından faydalanarak yapmaktadır bu sürüş sistemine de diferansiyel sürüş denir. Araç daha yavaş dönen teker tarafına doğru yönlenecek ve tekerlekler arasındaki hız farkı arttıkça da aracın manevrası daha da keskinleşecektir. Resimde görülen robotta motorlar tekerleklere direk bağlandığı için motorlar yüksek akım çekecektir bunun için de yüksek akımlı pillere ihtiyaç vardır.
Dişli kutulu motorlar kullanılarak aracın çektiği akımı düşürmek mümkündür. Tabi bu motorlar diğer motorlara göre daha pahalı olduğundan bu şekilde robotun maliyeti de artmaktadır. Eğer böyle bir mekanik aksamı kendiniz yaparak uğraşmak istemiyorsanız, hazır bir oyuncak araba alıp devrelerinizi onun üzerine kurmalısınız.
Yukarıdaki Şekilde bizim yapmış olduğumuz çizgi izleyen robot görülmektedir. Bu robot sürüş sistemi olarak iki adet dişli kutulu dc motor, bunlara bağlı 2 teker ve önde bir adet sarhoş tekerden oluşmaktadır. Gövde ise dayanıklı ve hafif olan plexiglass maddesinden yapılmıştır. Batarya olarak da 12 V asit batarya kullanılmıştır. Bu batarya ağırdır ve çabuk deşarj olmaktadır, kullanılma sebebi ise ucuz olmasıdır.
Elektronik Kısım
Robot İçin Gerekli Malzemeler Kontrol devresi için:
- 1 adet PIC16F628A (mikrodenetleyici)
- 1 adet L293D(motor sürüş entegresi)
- 1 adet 74HC14(schmitt trigger)
- 2 adet 18’lik dip soket(PIC16F628A için)
- 1 adet 16’lık dip soket(L293D için)
- 1 adet 14’lük dip soket(74HC14 için)
- 1 adet 4 MHz kristal
- 2 adet 22 pF seramik kondansatör
- 1 adet 100 nF seramik kondansatör
- 1 adet 10 kΩ direnç
- 4 adet 2’li klemens
Voltaj regülatörü devresi için:
- 1 adet 7805(voltaj regülatörü)
- 1 adet 330 μF kondansatör
- 1 adet 10 μF kondansatör
- 1 adet 0.1 μF kondansatör
- 1 adet 1N4001(diyot)
- 2 adet 2’li klemens
Sensör devresi için:
- 3 adet CNY70(sensör)
- 3 adet 100 Ω direnç
- 3 adet 47 k Ω direnç
Diğer malzemeler:
- Yeteri kadar kablo(devreleri birbirine bağlamak için)
- 9–12 volt veya 4,8 volt batarya1
Mekanik aksam için:
- Araç için uygun bir kasa
- 2 adet dişli kutulu DC motor
- 2 adet teker
- Motorları tekerleklere ve kasaya monte edebilmek için uygun aksamlar(hub, L ayak vb)
- 1 adet sarhoş teker
Kullandığımız elemanlar nedir ne işe yarar?
PIC(mikrodenetleyici): PIC (Peripheral Interface Controller) Microchip firmasının ürettiği bir mikrodenetleyicidir. Mikrodenetleyici ise mikroişlemci, RAM, ROM, ALU, kontrol ünitesi ve I/O ünitesini tek bir chip içinde barındıran entegre(tümleşik) devredir. Bu devrede mikrodenetleyici kullanılmasının sebebi şudur: Her robotta olduğu gibi çizgi izleyen robotumuzda da bir karar verme mekanizması olmalıdır. Bu mekanizma daha önce de söylediğimiz gibi şu şekilde olmalıdır:
Robot sensörleri vasıtasıyla dış ortamdan bilgileri toplar ve bu bilgiler robot tarafından yorumlanır ve bu yorumlara göre eyleyicilerine(motorlara) uygun komutları verir. İşte bu yorumlama ve komut verme işlemi mikrodenetleyici tarafından gerçekleştirilir. Bu sistemdeki sensörleri gözlere, mikrodenetleyiciyi beyne, motorları ise kol veya bacaklara benzetebiliriz. Bu örnekten deanlaşıldığı üzere mikrodenetleyici kısmı robotumuzun en önemli parçasıdır.
Tabi ki diğer mekanizmalar da(algılayıcı, eyleyici) sistemin ayrılmaz bir parçası olduğu için onlar da önemlidir. Bu uygulamada PIC kullanmamızın sebebi ise ucuz, kolay ulaşılabilir olması ve kullanım kolaylığıdır. Daha karmaşık ve hızın önemli olduğu sistemlerde(görüntü işleme gibi) PIC yetersiz kalacağından başka mikrodenetleyiciler kullanmak gerekecektir, ancak bu proje için PIC ideal bir mikrodenetleyicidir. Ayrıca PIC’in bir diğer özelliği de birkaç dille (Pic Assembly, Pic Basic, Pic C) programlanabilmesidir. Bu konudaki detaylı bilgi programlama bölümünde verilmektedir.
L293D (Motor sürücü entegre): Pic’in bir bacağından(pininden) çekebileceğimiz akım maksimum 25 mA düzeyindedir. Bu akım seviyesi bir motoru sürmek için yeterli olmayacağından akımın kuvvetlendirilmesi (yükseltilmesi) gerekmektedir. İşte bu kuvvetlendirme işini de içinde transistor, mantık kapısı ve diyot barındıran L293D entegresi yapmaktadır. Bu entegre vasıtasıyla çekilebilecek maksimum akım 600 mA olduğundan daha fazla akım gerektiren uygulamalarda bu entegre kullanılamayacaktır, onun yerine çekilebilecek akım düzeyi 4 A’ e kadar çıkabilen L298 entegresi kullanılabilir. Bu entegreler hakkında daha fazla bilgi kataloglarında(datasheet) bulunabilir.
74HC14(schmitt trigger)
Schmitt Trigger içerisinde 6 adet opamp devresi barındıran bir entegredir. Bu opamp devresi karşılaştırıcı olarak
çalışmaktadır. Daha önce de belirttiğim gibi karşılaştırıcı(comparator) devresinde referans gerilimi uyguladığımız bir giriş ve yükseltmek veya düşürmek istediğimiz diğer bir giriş olmak üzere toplamda 2 giriş ve 1 çıkış bulunmaktadır.
Referans gerilimi ve giriş gerilimi arasındaki ilişkiye göre bir çıkış gerilimi oluşmaktadır. 74HC14 entegresinde referans gerilimi 2.5 V olarak ayarlanmıştır. Bu sebeple eğer sensörlerden gelen gerilim 2.5 V un üzerindeyse 74HC14 bu gerilimi düşürüp 0 V yapmakta, 2.5 V’un altındaysa da gerilimi yükseltip 5 V yapmaktadır. Daha önce söylediğim gibi Pic’in sensörlerden gelen veriyi düzgün olarak alabilmesi için bu işlem gereklidir. Aksi halde sistem kararsız bir yapıya sahip olacaktır.
Ayrıca 74HC14 14 pine sahiptir bunlardan 2’si besleme girişi, 6’sı veri girişi, 6’sı da veriçıkışıdır. 6 giriş ve çıkış olduğu için bir entegreye en fazla 6 sensör bağlanabilmektedir. Biz robotumuzda 3 sensör kullanacağımız için bir entegre yeterli olmakta 3 giriş ve 3 çıkış da boş kalmaktadır.
CNY70 (sensör)
Bir optik sensör çeşidi olan CNY70 verici (transmitter) olarak kızılötesi(ir) led(light emitting diode), alıcı (receiver) olarak da fototransistor içermektedir.
Yukarıdaki Şekilde de görüldüğü üzere kızılötesi led den çıkan ışık bir yüzeyden yansıyarak fototransistorun baz (base) ucunda bir tetiklenme meydana getirmektedir. Bu tetiklenme sonucunda kollektör (C) ve emetör (E) arası iletime geçmektedir.
Eğer fototransistoru bir anahtar(switch) olarak düşünürsek baza ışık geldiği zaman anahtar kapalı , yani kollektör-emetör arası iletimde, ışık gelmediğinde ise anahtar açık konumdadır , yani kollektör-emetör arası kesimdedir diyebiliriz.
Yukarıdaki Şekilde CNY70’in devre şeması verilmektedir. Transistorun baz ucu tetiklendiği zaman kollektör emetör arası iletime geçer ve 5 V’luk gerilim kaynağından toprağa doğru transistor üzerinden akım akar ve PIC’in CNY70 e bağlı olan ucu 0 olur, baz ucu tetiklenmediği zaman ise kollektör emetör arası açık uç olur ve akım kaynaktan PIC’e doğru akar ve PIC’in bacağı 5 V olur. CNY70’in çalışma prensibi bu şekildedir.
Daha önce sensörlerin kart üzerindeki dağılımının önemli olduğunu söylemiştim. Çizgi olarak 2 cm’lik siyah veya beyaz elektrik bandı kullanacağımızı düşünürsek şekildeki konfigürasyon robot için uygun bir dağılımdır.
Sensörlerin konumu ve sayısı da piste göre değişecektir. Örneğin yol çizgisine dik çizgilerin olduğu bir pistte bu
dağılım uygun değildir. Sensörlerin kendi içindeki konumlarının önemli olmasının yanısıra aracın neresinde olduğu da önemlidir. Eğer pist üzerinde köprü, tümsek gibi çıkıntılar yoksa sensör devresini aracın en ön kısmına, tekerin hemen önüne koyunuz.
Kristal: Kristal bir osilatör çeşididir ve pic’in çalışması için osilatör gerekli bir elemandır. Osilatör bir kare dalga sinyali üretir, bu sinyale saat(clock) sinyali denir. Saat sinyali pic’e yüklediğimiz programın çalışması için gereklidir ve sinyalin frekansı da komutların işleniş hızını da değiştirecektir. Kristalin frekansı arttıkça programın çalışma hızı da artmaktadır. Bu yüzden kristalin frekansını seçerken yapacağımız uygulamayı göz önünde bulundurmalıyız. Biz bu projede 4 MHz’lik kristal kullanmaktayız. Bizim için bu hız yeterlidir.
Diyot: Diyot ters yönde akım geçirmeyen bir devre elemanıdır. Buradaki kullanılış amacı ise devreye bataryayı yanlışlıkla ters bağladığımızda devre elemanlarının zarar görmesini engellemektir.
Kondansatör: Kondansatör farklı amaçlarda kullanılabilir. Burada kullanma amacımız gerilim kaynağımızda oluşabilecek ani yükselişleri veya inişleri filtre edip düzgün bir elektrik akımı oluşturmak ve bundan doğabilecek zararları engellemek.
Robotta Kullanılacak Devreler: Ana Devre
Baskı Devre Hali
Voltaj Regülatörü Devresi
Baskı Devre Hali
Sensör Devresi
Baskı Devre Hali
Devrelerin Kurulması
Yukarıda verilen devreler farklı şekillerde kurulabilir: Baskı devre yapılabilir, pertinaks kart (delikli kart) veya breadboard (delikli panel) kullanılabilir. Ancak baskı devre yapabilmek için bazı alet edevat ve malzemelere ihtiyaç vardır. Eğer bu malzemeler sizde bulunmuyorsa baskı devreyi bu işi yapan kişilere de yaptırabilirsiniz.
Elemanları delikli pertinaksın (delikli kart) üzerine de lehimleyebilirsiniz ya da hiçbir lehim veya alet edevata ihtiyaç olmaksızın breadboard (delikli panel) kullanabilirsiniz.
Breadboardun Kullanılışı
Şekilde görüldüğü üzere breadboard harflerden (A, B, C, D, E, F, G, H, I, J) oluşan satırlara ve rakamlardan oluşan sütunlara ayrılmıştır.
Şekilde görülen dikey çizgiler 5’li olarak kendi aralarında iletimdedir. Yani A1,B1,C1,D1,E1 aynı hat üzerinde
bulunmaktadır. Keza A2,B2,C2,D2,E2 kendi içinde iletimdedir ve bu şekilde gitmektedir. En dış kısımlarda bulunan mavi ve kırmızı çizgilerle gösterilen delikler ise şekildeki yatay siyah çizgi boyunca iletimdedir. Bu bilgiler ışığında devreleri breadboard üzerine uygun olacak şekilde kurabilirsiniz. Ancak sensör devresini bir delikli pertinaksa kurmanız veya baskı devre olarak yapmanız daha önce verdiğim formasyonu sağlayabilmek için gereklidir.
Delikli Pertinaks Kullanımı
Şekilde de görüldüğü üzere delikli pertinaks delik bakır dairelerden oluşmaktadır. Kullanılacak elemanın bacakları bu deliklerden geçirilir ve devre şemasına uygun biçimde birbirine bağlanması gereken elemanlar tel ve lehim aracılığıyla birleştirilir.
Baskı Devrenin Yapılışı
Baskı devre için gerekli alet ve malzemeler
- Mini el matkabı
- Havya
- Lehim
- Ütü
- Uygun boyutlarda bakır plaket
- Perhidrol
- Tuz ruhu
- Asetat kağıdı
Öncelikle yapacağınız devrenin baskı devre halinin(elemansız olanın) aynı boyutlarda bir lazer yazıcıdan asetat kağıdı üzerine çıktısını alın. Eğer lazer yazıcı bulunmuyorsa herhangi bir yazıcıdan A4 kağıdına çıktı alıp daha sonra bu çıktının asetat kağıdı üzerine fotokopisini çektirebilirsiniz. Ancak lazer yazıcı daha iyi sonuç verecektir. Çıktıyı aldıktan sonra asetat kağıdındaki fazlalıkları bir makas yardımıyla kesiniz. Bu işlemden sonra sıra geldi asetat üzerindeki şekli bakır plaketin üzerine aktarmaya. Bu iş için öncelikle plakanın üzeri parmak izi, kir kalmayacak şekilde güzelce sünger ve deterjan yardımıyla temizlenmelidir.
Bu işlem şeklin plakanın üzerine düzgünce aktarılabilmesi açısından önemlidir. Temizlik işinden sonra asetat kağıdını, toner kısmı plakanın bakır kısmına gelecek şekilde plakanın üzerine kapatalım. Asetat kağıdını ütülerken kaymaması için erimeyecek bir bantla (elektrik bandı olabilir) kenarlarından plakaya yapıştırın. Daha sonra ütünüzün ayarını yünlü/pamuklu ve buharsız konumuna getirip kızması için bekleyin. Ütü kızdıktan sonra asetat kağıdının üzerine ince bir bez örterek plakayı bastırarak ütülemeye başlayın. Bu işlemi 3–5 dakika plakanın her tarafına uygulayın daha sonra asetat kağıdını bir kenarından hafifçe kaldırarak plakanın üzerine yolların çıkıp çıkmadığına bakınız, eğer çıkmayan yerler varsa bir müddet daha bu kısımları ütüleyiniz.
Yalnız bu işlemin çok uzamaması lazım, aksi takdirde yollar plakanın üzerinde dağılmaya başlar. Bu işlem de bittikten sonra devrenin soğumasını bekleyelim, buzdolabına koyup hızlı biçimde soğumasını sağlarsanız daha iyi
sonuç alabilirsiniz. Soğuma işleminden sonra asetadı bakır levha üzerinden yavaşça kaldırınız, eğer tam çıkmayan yollar varsa ince uçlu baskı devre kalemiyle bu yolları birleştirip bütün yolların tam olduğundan emin olun.
Bütün bu işlemler sırasında levhanın bakır kısmına dokunmamaya çalışınız. Eğer bakırın üzerinde parmak izi veya kir olursa bu kısımlar devreyi asidin içine attığımızda tam olarak erimeyecek veya geç eriyecektir. Bu yüzden bakır yüzeyin olabildiğince temiz olması lazımdır. Sıra geldi bakırı eritme işlemine. Bir plastik kabın içerisine 1 perhidrol, 3 tuz ruhu oranında bir karışım hazırlayınız. Bu işlemde asitle uğraştığımız için eldiven giymeniz tavsiye edilir, eğer çıplak elle bu işlemi yapıyorsanız aside temas etmeyiniz ve mümkünse bu işlemleri açık ortamda yapınız. Karışımı hazırladıktan sonra plakayı asidin içine yavaşça bırakınız. Erime işlemini hızlandırmak için kabı yavaşça sallayabilirsiniz.
Yolların dışındaki bakır kısım tam olarak eridikten sonra levhayı asit içinden çıkarınız ve çeşme altına tutarak asidin levha yüzeyinden gitmesini sağlayınız. Yolların üzerindeki toner izini kaldırabilmek için bir süngerin yeşil kısmını bir miktar deterjanla birlikte plakanın üzerine bastırarak sürünüz.
Toner izlerini de ortadan kaldırdıktan sonra plakayı bir maket bıçağı aracılığıyla uygun boyutlarda kesebilirsiniz.
Levhayı kolay bir şekilde kesebilmek için cetvel yardımıyla maket bıçağıyla kesmek istediğiniz yerden çizikler oluşturun ve bu çiziklerin üzerinden geçerek çiziği iyice derinleştirin aynı işlemi devrenin ters tarafı için de
gerçekleştirin, ancak diğer çizgiyle aynı hizada olmasına dikkat edin. Plaka kolay ve düzgünce kırılabilir duruma geldikten sonra bir pense veya kargaburnu yardımıyla devreyi çizdiğiniz yerden dikkatlice kırınız, daha sonra isterseniz bir eyeyle kartın kenarlarını düzeltebilirsiniz.
Şunu söylemem gerekir ki bu işlemler biraz güç gerektirmekte ve uğraştırmaktadır. Devreyi uygun boyutlarda kestikten sonra sıra geldi devredeki delikleri açmaya, bu işlem için bir mini el matkabı kullanmanız gerekmektedir ve plakanın üzerindeki bakır yolları kaldırmamak için deliğin boyutuna uygun bir matkap ucu kullanınız. En son olarak da devrenin baskı devre haline (elemanlı durum) bakarak elemanları devre üzerine lehimleyiniz (Bu işi yaparken sizin yaptığınız baskı devreyle yukarıda verilen devrelerin baskı devre hallerinin birbirinin aynası (mirror) olduğunu unutmayınız ve elemanları lehimlerken buna dikkat ediniz. Kolaylık sağlaması açısında yukarıdaki baskı devrelerin daha büyük bir çıktısını aynalanmış (mirror) olarak almanızda fayda vardır.
Bu çıktıya bakarak elemanları devreye lehimlerseniz sizin için daha kolay olur) Ancak PIC, L293D, 74HC14 gibi
entegreleri devreye lehimlemeyeniz, çünkü lehimleme sırasında bu entegreleri yakabilirsiniz, onun yerine bu entegreler için listeye yazdığımız soketleri devreye lehimleyip daha sonra da entegreleri soketlere çentik
kısımları üst üste gelecek şekilde takınız.
Programlama
Pic i programlarken 3 dil kullanabiliriz. Bunlar Pic Assembly, Pic Basic ve Pic C’ dir. Aşağıda Pic Assembly dilinde yazılmış örnek çizgi izleyen robot kodlarını bulabilirsiniz. Tabi bu kodları geliştirip daha iyi sonuçlar da
alabilirsiniz.
Pic Assembly
Assembly kodlarınızı yazıp derlemek için Microchip firmasının ücretsiz olan Mplab Ide programını kullanabilirsiniz. Bu programı Microchip’in kendi sitesinden indirebilirsiniz.
Mplab’ın Kullanımı
Öncelikle kullanacağımız mikrodenetleyiciyi seçmeliyiz. Bunun için Configure/Select Device kısmına gidelim.
Buradan PIC16F628A’yı seçip OK diyelim.
Şimdi kodlarımızı yazabilmek için File/New deyip yeni bir sayfa açalım.
Daha sonra File/Save As kısmından dosyaAdi.asm şeklinde kaydedelim. Açtığımız bu boş sayfaya kodlarımızı yazabiliriz.
;ÇİZGİ İZLEYEN ROBOT ÖRNEK ASM KODLARI ;BU PROGRAM BEYAZ ZEMİN ÜZERİNE SİYAH ÇİZGİ İÇİN VE DİFERANSİYEL SÜRÜŞ SİSTEMİ İÇİN YAZILMIŞTIR ;Tuna BULUT TARAFINDAN YAZILMIŞTIR LIST P=16F628A INCLUDE "P16F628A.INC" __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF MOVLW H'07' MOVWF CMCON ;COMPARATOR ÖZELLİĞİ KAPALI VE PORTA I/O İÇİN AKTİF MODDA CLRF PORTB ;PORTB Yİ SIFIRLA ;GİRİŞ-ÇIKIŞ TANIMLAMALARI BANKSEL TRISA ;BANK1 E GEÇİŞ YAP MOVLW H'FF' MOVWF TRISA ;PORTA NIN BÜTÜN PİNLERİNİ GİRİŞ YAP CLRF TRISB ;PORTB NİN BÜTÜN PİNLERİNİ ÇIKIŞ YAP BANKSEL PORTB ;TEKRAR BANK0 A GEÇ CLRF PORTB ;PORTB Yİ SIFIRLA ;ANA PROGRAM DONGU BTFSS PORTA,1 ;ORTA SENSÖRÜ KONTROL ET EĞER 0 SA(SİYAH ÇİZGİDEYSE) DUZ GIT ;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ GOTO DUZ ;DUZ ALT RUTİNİNE GİT BTFSS PORTA,0 ;SOL SENSÖRÜ KONTROL ET 0 SA SOLA DON ;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ GOTO SOL ;SOL ALT RUTİNİNE GİT BTFSS PORTA,2 ;SAG SENSÖRÜ KONTROL ET 0 SA SAĞA DÖN GOTO SAG GOTO DONGU DUZ BSF PORTB,4 ;SAG MOTORU ÇALIŞTIR BSF PORTB,6 ;SOL MOTORU ÇALIŞTIR GOTO DONGU SOL BSF PORTB,4 ;SAG MOTORU ÇALIŞTIR BCF PORTB,6 ;SOL MOTORU DURDUR GOTO DONGU SAG BCF PORTB,4 ;SAG MOTORU DURDUR BSF PORTB,6 ;SOL MOTORU ÇALIŞTIR GOTO DONGU END ;PROGRAMI SONLANDIR
Şunu söylemem gerekir ki bu kodlarla robottan çok yüksek bir performans beklenmemelidir. Aracın dönüşleri daha yumuşak yapılarak daha iyi sonuçlar alınabilir. Bu araç diferansiyel sürüş sistemine sahip olduğu için bir teker durdurularak bir teker de tam hızda döndürülerek yapılan dönüşler çok sert olmaktadır. Bu da aracın yalpalayarak hareket etmesine sebep olacaktır.
Tekerlekler arası hız farkı azaldıkça aracın dönüş açısı da azalacak ve daha yumuşak bir dönüş sağlanacaktır. Motorların dönüş hızını da voltajlarını düşürerek düşürebiliriz. Bunun için PWM(Pulse Width Modulation) metodunu kullanacağız. PWM metodunda pic’in çıkışına düz bir sinyal değil de şekildeki gibi bir kare dalga gönderiyoruz.
Çıkış voltajını belirleyen, 1 süresinin toplam süreye oranı olmaktadır. Örneğin 100 μs 1, 100 μs de 0 gönderirsek çıkış voltajımız 5*(100/(100+100)) den 2.5 V olmaktadır. Bu şekilde hızı ayarlayabilir ve daha iyi sonuç alabiliriz. Bu işlemi de asm de şu şekilde yapabiliriz.
;ÇİZGİ İZLEYEN ROBOT ÖRNEK ASM KODLARI ;BU PROGRAM BEYAZ ZEMİN ÜZERİNE SİYAH ÇİZGİ İÇİN VE DİFERANSİYEL SÜRÜŞ SİSTEMİ İÇİN YAZILMIŞTIR ;Tuna BULUT TARAFINDAN YAZILMIŞTIR LIST P=16F628A INCLUDE "P16F628A.INC" __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF ;-------DEĞİŞKEN TANIMLAMALARI--------------- CBLOCK H'20' SAYAC ;SAYAC DEĞİŞKENİNİ BİR ADRESE ATA IS ;IS DEĞİŞKENİNİ BİR ADRESE ATA BEK ;BEK DEĞİŞKENİNİ BİR ADRESE ATA ENDC ;--------------------------------------------- MOVLW H'07' MOVWF CMCON ;COMPARATOR ÖZELLİĞİ KAPALI VE PORTA I/O İÇİN AKTİF MODDA CLRF PORTB ;PORTB Yİ SIFIRLA ;GİRİŞ-ÇIKIŞ TANIMLAMALARI BANKSEL TRISA ;BANK1 E GEÇİŞ YAP MOVLW H'FF' MOVWF TRISA ;PORTA NIN BÜTÜN PİNLERİNİ GİRİŞ YAP CLRF TRISB ;PORTB NİN BÜTÜN PİNLERİNİ ÇIKIŞ YAP BANKSEL PORTB ;TEKRAR BANK0 A GEÇ CLRF PORTB ;PORTB Yİ SIFIRLA ;ANA PROGRAM MOVLW D'128' MOVWF IS ;IS DEĞİŞKENİNE 128 SAYISINI YÜKLE MOVLW D'128' MOVWF BEK ;BEK DEĞİŞKENİNE 128 SAYISINI YÜKLE DONGU BTFSS PORTA,1 ;ORTA SENSÖRÜ KONTROL ET EĞER 0 SA(SİYAH ÇİZGİDEYSE) DUZ GIT ;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ GOTO DUZ ;DUZ ALT RUTİNİNE GİT BTFSS PORTA,0 ;SOL SENSÖRÜ KONTROL ET 0 SA SOLA DON ;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ GOTO SOL ;SOL ALT RUTİNİNE GİT BTFSS PORTA,2 ;SAG SENSÖRÜ KONTROL ET 0 SA SAĞA DÖN GOTO SAG GOTO DONGU DUZ BSF PORTB,4 ;SAG MOTORU TAM GÜÇTE ÇALIŞTIR BSF PORTB,6 ;SOL MOTORU TAM GÜÇTE ÇALIŞTIR GOTO DONGU SOL BSF PORTB,4 ;SAG MOTORU TAM GÜÇTE ÇALIŞTIR ;-----------SOL MOTORU %50 HIZDA ÇALIŞTIR(PWM)---------- BSF PORTB,6 MOVF IS,W CALL GECIKME BCF PORTB,6 ;SOL MOTORU DURDUR MOVF BEK,W CALL GECIKME ;------------------------------------------------------- GOTO DONGU SAG BSF PORTB,6 ;SOL MOTORU TAM GÜÇTE ÇALIŞTIR ;----------SAG MOTORU %50 HIZDA ÇALIŞTIR(PWM)----------- BSF PORTB,4 MOVF IS,W CALL GECIKME BCF PORTB,4 ;SAG MOTORU DURDUR MOVF BEK,W CALL GECIKME ;-------------------------------------------------------- GOTO DONGU GECIKME MOVWF SAYAC ; W YAZMACINDAKİ DEĞERİ SAYAC DEĞİŞKENİNE ATA DONGU2 DECFSZ SAYAC,F ;SAYAC DEĞİŞKENİNDEKİ SAYIYI 1 AZALT VE EĞER 0 SA BİR SONRAKİ KOMUTU ATLA GOTO DONGU2 RETURN END ;PROGRAMI SONLANDIR
IS ve BEK değişkenlerine yüklenen sayıları değiştirerek motorun farklı hızlarda dönmesini sağlayabilirsiniz. Deneme yanılma yöntemiyle en uygun hız değerini bulabilirsiniz.
Bu programlardan birini yazdıktan sonra tekrar kaydedin daha sonra da Project/Quickbuild den yazdığınız kodu derleyin.
Şimdi sıra geldi kodu pic e yükleme işine. Bunun için bir programlayıcıya ihtiyacınız vardır. Eğer Ankara’da bulunuyorsanız Ulus-Konya Sokak‘tan uygun fiyata temin edebilirsiniz. Bu programlayıcıların kimisi seri porta, kimisi paralel porta, kimisi de usb ye takılmaktadır. Usb den takılanlar dizüstü bilgisayarlarla da kullanılabilmektedir. Ancak diğerleri dizüstü bilgisayarlarda düzgün olarak çalışmamaktadırlar. Bunun bir sonucu olarak da usb programlayıcılar diğerlerine göre daha pahalıdırlar. Bu programlayıcıların yanında programları da bulunmaktadır. Bu programları kullanarak kodunuzu derledikten sonra oluşan hex dosyasını pic’ e yükleyebilirsiniz.
Dipnot 1): Eğer 4.8 V luk pil kullanacaksanız voltaj regülatörü devresini kullanmamalısınız. Ana devrede görülen J3 girişine de bu pili direk bağlamalısınız. Unutmamanız gerekir ki J3 girişi direk motorları beslemektedir. Bu yüzden kullandığınız batarya ile motorun uyumlu olması gerekmektedir.
Kaynaklar: Güçlü Tuğay, Elektronik Hobi, Alfa Yayınları, 2.bs.2004, 246 sf., ISBN: 975-297-481-1
Orhan Altınbaşak, Mikrodenetleyiciler ve Pic Programlama, Altaş Yayıncılık, 1.bs.2005,325
sf. ISBN:975-8834-09-6 O dtü Robot Topluluğu Dökümanları
Ankara Telsiz ve Radyo Amatörleri Klubü
Microchip
HAZIRLAYAN
Tuna BULUT
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/12/02 Etiketler: 74HC14, çizgi izleyen robot, cny70, L293D, mekanik, PIC16F628 örnekleri, PIC16F628A, robot projeleri robotlar, robot yapımı, sensör
Bu programın 16F877 için ASM dosyasına ulaşabilirmiyim. Teşekkürler
bu programın c dilinde yazılmış olanını bana gönderebilirmisiniz.teşekkürler
Kaynak: http://www.t-robot.info/dokumanlar/robotik/cizgi-izleyen-robot-yapimi.html
Ayrıca burdaki dökümanın eski versiyonudur uyarayım.
Uyarı için teşekkürler
yeni versiyon yazıya eklendi
Merhaba
Bu projenin sorunsuzca çalıştığını PWM sinyallerini sorunsuz alabildiğini düşünen birileri varmı acaba? benim yaptığım robotta tek tarafa dönüş yapılamıyor bir sorun var ve bu sorunun nedenini anlayamadım hala:/
arkadaşlar programa bakın çıkışlar portb’nin 4 ve 6 numaralı uçlarından ama devreye bakın devrede 0,1,2,3 nolu portlardan çıkış var yani programı düzeltmeniz lazım ben çok uğraştım ve hala yapamıyorum…
evet samet arkadaşın dediği doğrudur. devreyi yaptık ama motorlarda tık yok
devreyi daha bugün yaptık olmuyor motorlar çalışmıyor çıkış yok telefon kamerasıyla cny70’lere baktık çalışıyor ama l293d’nin çıkışında 0.1 v ölçüyoruz çıkış yok yani acil cevap bekliyorum.
@ramazan
yanınızda değiliz yaptığınız devreyi görmüyoruz belki bilr malzeme hatalı, yanlış takıldı belki kullandığınız entegreler sorunlu belkide bir yerde kısa devre var nereden bilelim ?
devreyi detaylıca kontrol edin voltaj ölçümleri yapın
bahsettiğiniz bu sorunun çözümüne ulaşabildinizmi ? aynı sorunla yaptığım iki devrede de karşılaştım …
motorlar çalıştı fakat çizgiyi izlemiyor kafasına göre gidiyor araba sizin vermiş olduğunuz pic yazılımı ile yaptık ama rasgele gidiyor araba
Arkadaşlar ben de .hex oluşturamadım.Hep asm den .hex e çevirirken error dosyası da oluşturuyor.Acaba .hex ini gönderebilir imisiniz?
Gerçekten bu devre çalışıyor mu ?
Bu proğram c dilinde varsa mail atabilirmisiniz?
[email protected]
berk@n devre çalışıyor.Biz aynısını yaptık.sadece proglamada bir hata olmuş. Boş olan 4 bacağa çıkış verilmiş.sizlere çok teşekkür ederim….
Motor seçerken neye dikket etmeliyiz? Bu proje için ideal motor kaç Rmp olmalıdır. lutfen yardımcı olurmusunuz ? Şimdiden ilgilenen arkadaşlara teşekkur ederim..
Mustafa düzelmiş kodu verebilirmisin? iki kod da hatalı mı? Sana göre düzgün kodu paylaşırsan çok iyi olur
arkadaşlar bende bu devreyi yaptım yanlız yazılımında hata var yardımcı olursanız sevinirim . yazılımı düzeltilmiş şekilde mail atarsanız iyi olur şimdiden çok teşekkür ederim.
hangi boş ayak tam olarak ifade edebilir misiniz arkadaşlar
Her şeyi yaptım kodunda sorun çıktı düzeltilmiş kodu aynı devreyi yapan birisi düzeltilmiş kodu paylaşabilir mi?
Sadece port cıkışlarında hata var.Portları düzeltir ya da pıctekı cıkışları .değiştir
Öncelikle paylaşım için çok teşekkür ediyorum.Mustafa’ya da bana cevap verdiği için teşekkür ederim.Ama her şeyi metinde belirtilen gibi yapmama rağmen pıc çıkışlarından MV cinsinden değerler ölçüyorum.Yukarıda yazılı olan kodu Mplab 7.50 ‘de derlerken bir çok warning alıyorum,bunlar normal mi?Breadboard ‘da denedim Pıc ‘ten çıkış alamadım.Bu problemi nasıl çözebilirim?(derlerken bir sorun olduğunu düşünmekteyim ,o yüzden hex dosyasını paylaşan olursa sevinirim)Şimdiden ilgilenenlere çok teşekkür ederim:
arkadaŞlar devreyi yaptım ama motorlarda tık yok ne yapmam gerekiyor
arkadaşlar burdaki kodlarda bir problem var. Gökhan motorlara çıkış veren bacakların sorun var yanılmıyorsan 9 un motor çıkışı 10 … 7 nın motor çıkışı 12 olması gerekiyor. Birde bunların vol. olc bakalım değerler nasıl olacak..
eğer motorlarda tıkyoksa port cıkışlarına bak elektrik geliyor mu diye eğer elektrik geliyorsa saorun motorlarda eğer gelmiyorsa kablonu yada pıc 2-6 bacaklarını kes o zaman motorların harekete geçecektir
Ramazan sensörler uygun uzaklıkta mı ?
tuna arkadaş sana nasıl ulaşabilirim bana bir tl numarası verebilirmisin ben unv robot topllugu kurdum uglamada yardımcı olacak kimse yok bana yardımcı olursan çok memnun olurum teşekkürler
ben 4mhz yerine 20mhz’lik pic kullanmayı düşünüyorum acaba algılama süresi arasındaki bu farklılığı hıza ne kadar yansıtabilirim ? ne kadar güçlendirsem motoru aynı işlemi yapar ?
20 mhz çok hızlı işlev yapmasına neden olur. Buda dönüşlerde pıc’ın belleğinin karışmasına neden olucaktır.
Merhaba, ben proje olarak çizgi izleyen robot yapacağım.Kırıkkale’de gerekli malzemeleri bulamadım.Siz gerekli malzemeleri gönderebilir misiniz.Robot yapım aşamalarını da çok güzel anlatmışsınız.Şimdiden teşekkürler…
çok güzel bir çalışma teşekkür ederim ben yaptım çalıştı yapacak olanlara kolay gelsin iyi çalışmalar
Çok sağ ol abi sayende ödevi bitirdim haftaya teslim edeceğim :))
Merhaba arkadaşlar size bir sorum olacak ;
ben 3 devreyide kurdum ama birkaç sorunla karşılaştım 3 devreyi nasıl birleştiricez ve bu cny70 lerin yönü ne tarafa olacak bunlar hakkında bilgi verebilirmisiniz?
aynen. bende devreleri birleştirmede sorun yaşıyorum. bir yol gösteren olursa seviniriz. =)
merhaba arkadaşlar ben sensör devresi ile ana devreyi yaptım lehimledim hocayada piki yüklettim ama ne yapsam yapayım çalışıyorr neden acaba bunlar hakkında bilgi verirmisinizz
teşekkürler, bitirme projesi olarak yaptım hatasız çalıştı
asm kodların da hata ile karşılaştınız mı acaba ? biz de hata veriyor.
şu config yerinde mi hata verdi sizdede ?
Merhaba 2 program arasındaki fark nedir ?
Ben bu devreyi deliksiz plakete ütü ile baskı yapmak istiyorum, sizce hangisi daha iyi olur (delikli pertinaks’a bağlantıları elle yapmak mı yoksa (baskı devreyi aresten çıkarıp plakete çıkarıp malzemeleri yerlerine göre lehimlemek mi ? Bunlara da yardımcı olursanız çok teşekkür ederim…..
baskı devre hazırlamayı bılıyosan hem profesyonel bi görün saglamak için hemde daha rahat çalışabılmek için baskı devre çıkarmanı öneririm
Hangi motoru kullandığınızı öğrenebilir miyim?
Arkadaşlar kodu aynen yazdım ama hepsi hata veriyo. yardım eder misiniz lütfen!!
INCLUDE
_CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;——-DEĞİŞKEN TANIMLAMALARI—————
CBLOCK H’20’
SAYAC ;SAYAC DEĞİŞKENİNİ BİR ADRESE ATA
IS ;IS DEĞİŞKENİNİ BİR ADRESE ATA
BEK ;BEK DEĞİŞKENİNİ BİR ADRESE ATA
ENDC
;———————————————
MOVLW H’07’
MOVWF CMCON ;COMPARATOR ÖZELLİĞİ KAPALI VE PORTA I/O İÇİN AKTİF MODDA
CLRF PORTB ;PORTB Yİ SIFIRLA
;GİRİŞ-ÇIKIŞ TANIMLAMALARI
BANKSEL TRISA ;BANK1 E GEÇİŞ YAP
MOVLW H’FF’
MOVWF TRISA ;PORTA NIN BÜTÜN PİNLERİNİ GİRİŞ YAP
CLRF TRISB ;PORTB NİN BÜTÜN PİNLERİNİ ÇIKIŞ YAP
BANKSEL PORTB ;TEKRAR BANK0 A GEÇ
CLRF PORTB ;PORTB Yİ SIFIRLA
;ANA PROGRAM
MOVLW D’128′
MOVWF IS ;IS DEĞİŞKENİNE 128 SAYISINI YÜKLE
MOVLW D’128′
MOVWF BEK ;BEK DEĞİŞKENİNE 128 SAYISINI YÜKLE
DONGU
BTFSS PORTA,1 ;ORTA SENSÖRÜ KONTROL ET EĞER 0 SA(SİYAH ÇİZGİDEYSE) DUZ GIT
;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ
GOTO DUZ ;DUZ ALT RUTİNİNE GİT
BTFSS PORTA,0 ;SOL SENSÖRÜ KONTROL ET 0 SA SOLA DON
;1 SE BİR SONRAKİ KOMUTU ATLA SONRAKİ KOMUTA GEÇ
GOTO SOL ;SOL ALT RUTİNİNE GİT
BTFSS PORTA,2 ;SAG SENSÖRÜ KONTROL ET 0 SA SAĞA DÖN
GOTO SAG
GOTO DONGU
DUZ
BSF PORTB,4 ;SAG MOTORU TAM GÜÇTE ÇALIŞTIR
BSF PORTB,6 ;SOL MOTORU TAM GÜÇTE ÇALIŞTIR
GOTO DONGU
SOL
BSF PORTB,4 ;SAG MOTORU TAM GÜÇTE ÇALIŞTIR
;———–SOL MOTORU %50 HIZDA ÇALIŞTIR(PWM)———-
BSF PORTB,6
MOVF IS,W
CALL GECIKME
BCF PORTB,6 ;SOL MOTORU DURDUR
MOVF BEK,W
CALL GECIKME
;——————————————————-
GOTO DONGU
SAG
BSF PORTB,6 ;SOL MOTORU TAM GÜÇTE ÇALIŞTIR
;———-SAG MOTORU %50 HIZDA ÇALIŞTIR(PWM)———–
BSF PORTB,4
MOVF IS,W
CALL GECIKME
BCF PORTB,4 ;SAG MOTORU DURDUR
MOVF BEK,W
CALL GECIKME
;——————————————————–
GOTO DONGU
GECIKME
MOVWF SAYAC ; W YAZMACINDAKİ DEĞERİ SAYAC DEĞİŞKENİNE ATA
DONGU2
DECFSZ SAYAC,F ;SAYAC DEĞİŞKENİNDEKİ SAYIYI 1 AZALT VE EĞER 0 SA BİR SONRAKİ KOMUTU ATLA
GOTO DONGU2
RETURN
END ;PROGRAMI SONLANDIR