C18 Diliyle Robot Programlama – Servo Motor Kullanma

Bu projede amaç bir servo motorunu çalıştıracak şekilde mikrodenetleyiciyi programlamak. Aslında yapacağımız çalışmada toplamda 7 servo motoru sürebilecek kapasitede bir program yazmış olacağız.

Servonun ne olduğundan biraz bahsedelim. Servo bir mil etrafında dönebilen motorlu bir yapıdır. Bu yapı kameralarda, robotik aksamların hareket ettirilmesinde (kol, bacak, kafa) kullanılır. Temelde aldığı sinyale göre döner, böylece servoya bağlı cihazın yönü değişir.

Aşağıda örnek bir servo motoru ve bu motora bağlı parça görünmektedir;

Bir tane servoyu sürmek için yapılması gereken işlem timer 0’ı yaklaşık her 20 milisaniyede bir belli bir duty(gecikme – lojik 1’de kalma süresi) zamanı kadar lojik1’de tutmak. Servo aldığı lojik1 sinyalinin süresine göre dönme işlemi gerçekleştirecek. Bu sinyal çok uzun verilirse servo tamamen bir yöne döner ve zorlanır, eğer bu sinyal lojik sıfır olarak kalırsa bu sefer servo tamamen ters yöne döner ve yine zorlanır. Bu zamanlamayı öyle bir ayarlamalıyız ki ne çok fazla, ne de çok az voltaj vermeliyiz. Benim hesaplarıma göre yaklaşık 20 milisaniyede bir 3 milisaniyeden küçük bir duty değeriyle işlem yaptığımızda servo normale yakın çalışıyor. Bu değerlerle kendi işlemlerinizi yapmak için oynayabilirsiniz.

Okumaya devam et

C18 Diliyle Robot Programlama – I²C (Inter-Integrated Circuit) Haberleşmesi

I²C seri iletişimi, mikrodenetleyicinin diğer entegre elemanlarıyla kolay iletişim kurmasını sağlayan entegreler arası bir haberleşme protololüdür. Kullanacağımız PIC18F4585  içerisinde hem I²C hem de SPI (Serial Peripheral Interface) birimini içinde barındıran MSSP (Master Synchronous Serial Port) modülü bulunmaktadır.

I²C protokolünde haberleşmek için iki uç kullanılır. Bunlar SDA (Seri veri giriş-çıkış) ve SCL (Seri saat sinyali – clock)’dir. SDA uçlarından bilgi aktarımı işlemleri SCL ucundaki  saat sinyali sayesinde senkronize olarak gerçekleştirilmektedir. Datasheet’e bakacak olursak PIC18F4585’de SDA ve SCL  için kullanılan uçların 18. ve 23. pinler olduğunu görebiliriz.

Bu protokolde entegreler master(ana-usta) ya da slave(uydu-köle) olabilir. Entegre master iken; saat sinyalini kendisi yönetir, iletişimin kontrolü master olan entegrededir. Slave konumunda olan entegre saat sinyali üretmez, sadece veri alışveriş işlemi yapar.

Bu bölümdeki amacımız elimizdeki 2 adet PIC18F4585 entegresinden birini master, birini slave olacak şekilde programlayarak master’dan slave‘e veri gönderip, yine master   aracılığıyla slave‘den veri okumak olacak. İki entegreyi de bu senaryo için programlamamız gerekiyor.

I²C iletişiminde her bir slave cihazının kendine özgü bir adresi vardır. Böylece master olan cihaz hangi slave cihazıyla işlem yapacağını belirtebilir (Bir master birden çok slave cihazıyla veya birden çok master kendi arasında I²C kullanarak haberleşebilir). Bu adres  7 bitlik veya 10 bitlik olabilir. Biz bu bölümde 7 bitlik adresleme kullanacağız. Veri iletişim hattı I²C protokolünde 8 bittir. Yani tek seferde 8 bitlik (1 byte) veri gönderip okuyabiliriz.

Genel olarak iletişim aşağıdaki şekilde sağlanır;

  • Başlama şartı (Start Condition)
  • Adres + Okuma/yazma bilgisi
  • Veri bitleri
  • Durma şartı (Stop Condition)

Not:  Start ve Stop şartları master cihaz tarafından oluşturulur. Master cihazın adres bilgisi olmaz. Veri bitlerinden önce mutlaka adres bilgisi gönderilmelidir ki o adrese sahip slave    cihaz seçilsin. Yoksa veri aktarımı -tek bir slave cihazla haberleşme yapılsa bile- gerçekleşmez. Okuma/yazma bilgisi denen şey iste master cihazın slave cihaza veri gönderme veya cihazdan veri alma durumunun belirlenmesinde kullanılır.

Okumaya devam et

C18 Diliyle Robot Programlama – RS232 Seri Haberleşme (USART)

Bu yazıda amaç bilgisayar ile deneme kartımızı seri şekilde haberleştirmek olacak. Bilgisayarlarla haberleşmek için seri iletişim, paralel iletişim gibi yöntemler vardır. Paralel iletişimde her bir bilgi için bir data hattı vardır, tüm bilgiler aynı anda bu veri yollarından gönderilir. Bu nedenle paralel iletişim seri iletişime göre daha hızlıdır fakat mesafe uzayınca çok maliyetli olmaktadır.

Seri haberleşmede bilgiler tek bir hat üzerinden gönderilip alınır. Hızı paralel iletişime göre yavaş fakat daha ucuzdur. Senkron ve Asenkron olmak üzere 2 adet seri haberleşme yöntemi vardır.

Senkron seri iletişimde gönderilen ve alınan veriler aynı anda aktarılır, yani verici ve alıcı taraf eşzamanlı çalışır. Bu eşzamanlılığı sağlamak için iki devre arasında bir clock sinyali hattı bulunur. Bu nedenle asenkron iletişime göre daha hızlıdır. Asenkron seri iletişimde sadece veri hattı bulunur, alıcı ve verici taraf farklı zamanlarda data gönderebilir.     Eşzamanlı olmadığı için iletilen her verinin başında ve sonunda start-stop bitleri bulunur. Ayrıca her veriyle beraber hata kontrolü için gönderilen parity biti vardır.

Okumaya devam et

C18 Diliyle Robot Programlama – Dış Kesme (External Interrupt) Kullanımı

Bu bölümde amacımız B portundan gelen sinyalin değişimini algılayan bir kesme oluşturmak. Bu kesme pinlerden gelen sinyaller tarafından tetiklenecek ve istediğimiz işlemi yapacak. Özellikle encoder okuma modülünü kodlarken bu sinyal değişimleri tarafından tetiklenen kesmelerden çokça faydalanacağız.

PIC18F4585’te 3 adet dış kesme girişi bulunur. Bunlar RB0(INT0), RB1(INT1) ve RB2(INT2) pinleridir.

Aynı zamanda bu RB0, RB1 ve RB2 pinlerine bizim butonlarımızın da bağlı olduğunu biliyoruz. Biz bu butonlar sayesinde bu kesme girişlerine +5V sinyali ve 0 (IDLE) sinyali verebiliyoruz. (Butona basmazsak 5V, butona basarsak 0V olduğunu kabul edelim). Amacımız butonlarla oluşturacağımız bu sinyalin düşen veya yükselen kenarlarında kesmelerin oluşmasını sağlamak. Düşen kenar dediğimiz şey, sinyalin 1 (+5V) durumundan 0 (IDLE) durumuna geçmesi, yükselen kenar dediğimiz şey ise sinyalin 0 (IDLE) durumundan 1 (+5V) durumuna geçmesidir.

Şekilde;

  • Mavi dikey çizginin olduğu bölümler; B sinyalinin yükselen kenarlarını,
  • Kırmızı dikey çizginin olduğu bölümler A sinyalinin yükselen kenarlarını,
  • Mor dikey çizginin olduğu bölümler B sinyalinin düşen kenarlarını,
  • Yeşil dikey çizginin olduğu bölümler A sinyalinin düşen kenarlarını göstermektedir.

Okumaya devam et

C18 Diliyle Robot Programlama – Timer (Zamanlayıcı) Kullanımı

Zamanlayıcı kullanmak için mikroişlemcilerde belirli birimler bulunur. PIC18F4585‘te bununla ilgili 3 birim bulunmakta. Timer0, Timer1 ve Timer2.

Bu bölümde amacımız bu zamanlayıcı birimlerini kullanarak belirli zaman aralıklarında kesme oluşmasını sağlamak. Oluşan kesmelerin kontrolünü yine ledlerle yapacağız.

Timer0 ve Timer1 hem zamanlayıcı hem de sayıcı olarak kullanılabilir. Birimin zamanlayıcı olarak kullanılabilmesi için değer artışının düzenli (periyodik) olması gerekir (Ör: 3 saniyede bir butona basmak). Sayıcı olarak kullanımda ise değer artışı düzenli olmak zorunda değildir (Ör: 10 dakika boyunca 35 defa herhangi bir zamanda butona basmak). Timer2 birimi ise sadece sayıcı olarak kullanılır. Bu birimleri sırayla inceleyelim.

Okumaya devam et

C18 Diliyle Robot Programlama – Kesme (Interrupt) İşlemleri

Kesmelerde temel amaç o anki program akışını durdurup kesmeyi oluşturan duruma özgü kodları çalıştırmak ve kodların çalışması bittikten sonra program akışını kalınan yerden devam ettirmektir. PIC18F4585’te kesmeleri oluşturmak için 2 vektör adresi kullanırız. Bu vektör adresleri mikroişlemcide interrupt geldiği zaman çalıştırılacak kodların bulunduğu bir bölüme referans verir. Bu vektör adreslerinden biri low_vector(düşük öncelikli interruptlar) diğeri ise high_vector(yüksek öncelikli interruptlar)’dür. Low_vector 0x18 adresini, High_vector ise 0x08 adresini gösterir. Programda bu kısımlar aşağıdaki şekilde kodlanır;

#pragma code high_vector=0x08
void high_interrupts (void) {
     _asm GOTO high_ints _endasm
}
#pragma code

Aynı şekilde düşük öncelikli interruptlar için low_vector=0x18 yazılır. Ayrıca _asm _endasm arasında kalan kısıma assembly koduyla referans verilir. Goto komutuyla high_ints denen bir bölgeye gidilir. Bu bölge aşağıdaki şekilde kodlanır;

#pragma interrupt high_ints
void high_ints (void) {

     //Kesme geldiginde calisacak kodlar

}

high_ints veya high_interrupts yerinde kendiniz de isimler belirleyip yazabilirsiniz.

Bir kesmenin oluşup oluşmadığı nasıl anlaşılır? Bunun için ilgili birimle alakalı flag‘in 1 ya da 0 olma durumuna  bakılır.  C18’de  bir  çok  modüle ait register  bulunur.  Bu  register’ların bazıları interruptların enable/disable durumunu ayarlamak için, bazıları interrupt oluştuğunda anlayabilmek için, bazıları kendi modülüne ait işlemleri gerçekleştirmek için kullanılır.

Okumaya devam et

C18 Diliyle Robot Programlama – ADC Okuma

ADC (Analog to Digital Converter) okumanın mantığı elimizde analog halde bulunan voltaj değerlerini ona karşılık gelecek dijital değerlere çevirip işlem yapmaktır. Benim kullandığım    PIC18F4585 mikrodenetleyicisi içerisinde ADC modülü bulunmakta. Bu modülü kullanarak şu an mikrodenetleyicimin üzerinde bulunduğu kartan analog değer okuma işlemini yapacağım.

Kart üzerindeki bağlantıları kontrol ettiğimizde analog sinyal üreteceğimiz birimin mikrodenetleyicinin 2. pinine bağlı olduğunu görüyoruz. Datasheet’te bu pin AN0 girişine karşılık gelmekte.

Amacımız bu pin üzerinden açacağımız bir kanalla ADC fonksiyonlarını kullanarak dijital çıkış değerleri okumak ve bu dijital çıkış değerlerini Adım Büyüklüğü (1 LSB) ile çarparak    analog voltaj değerine karşılık gelen dijital voltaj değerini bulmak.

Okumaya devam et