Robotçu Nasıl Olunur?

Robotçu nasıl olunur sorusundan önce biz önce kendimize robotcu kelimesinin anlamını soralım. Robotçu demek, başlı başına sadece robot inşa etmek demek değildir. Bir insan, iki motoru bir entegreye bağlayıp, bir platformu hareket ettirdiğinde robotçu olmaz. Robotçu kavramı biraz felsefik bir kavramdır. Robotçu dediğimiz kişi yaratıcıdır. Yaptığı her robot onun parçasıdır. Robotçu, kendi aleminde ‘tanrı’dır. Robotçu işte bu bilinç düzeyiyle robotlarını tasarlar ve onlara ‘hayat’ verir. Onlara ‘hayat’ verirken de Isaac Asimov’un belirlediği 3 robot kuralını aklından çıkarmaz:
  1. Bir robot hiçbir şekilde insanoğluna zarar veremez; veya pasif kalmak suretiyle zarar görmesine izin veremez.
  2. Bir robot kendisine insanlar tarafından verilen komutlara 1. kuralla çelişmediği sürece itaat etmek zorundadır.
  3. Bir robot 1. ve 2. kurallarla çelişmediği sürece kendi varlığını korumak zorundadır.
İşte bu kurallara bağlı kalarak robotlarına ‘hayat’ veren kişi robotçudur. Biraz ‘kaçıkça’ ve ‘deli saçması’ gibi gelse de bu bahsettiklerim, işin içine girmeye başlayıp robotlar inşa etmeye başladığınızda daha iyi anlaşılır. Evet, robotçu kavramının tanımını yaptığımıza göre asıl sorumuzun cevabına gelebiliriz. Robotçu nasıl olunur? Öncelikle robotçu olmak için hiçbir ön bilgiye ihtiyacınız yoktur. Robotik konusunda bembeyaz bir sayfa olabilirsiniz, bu hiç önemli değil. Bir robotçu da bulunması gereken ilk özellik meraktır. Bir insan ne kadar meraklıysa, robotik konusunda kendini o kadar fazla geliştirebilir. Bu meraklı insanda bulunması gereken bir diğer özellik de sabırdır. Robotikle uğraşmaya başlayanların yarısından fazlası ne yazık ki sabırsızlıkları yüzünden robotiğe küsüyor. Sabır gösteremeyen insanlar iki-üç günde her şeyi öğrenip ‘Asimo’ yapacaklarını umuyorlar. Bu yüzden, robotikte sabır, robotçunun yol arkadaşıdır. Bir başka önemli özellik de düzendir. Robotçu olmak isteyen bir insanın düzenli olması çok önemlidir. Fakat şunu da belirtmek isterim ki, çoğu robotikle ilgilenen insan, önceden düzenli olmamasına rağmen robotikte ilerledikçe düzenin avantajları sezip, çalışmalarını belirli bir düzene oturtmuştur. Düzenli olmak, size hem zaman kazandırır, hem de kafanızın boşuna yorulmamasını sağlar. Sonuçta kafanızı hangi parçanın nerede olduğuyla değil, neyi nasıl yapmalıyım soruları ile doldurmanız gerekir.
Robotiğe başlamak için yukarda saydığım üç özelliğin ( Merak, sabır ve düzen) sizde mevcut olduğunu düşünüyorsanız, robotik dünyasına tereddüt etmeden adım atabilirsiniz. Peki adımınızı nasıl atacaksınız? Bir insan, ben robotçu olacağım diyince robotçu olamıyor maalesef. Robotçu olmaya giden yol, uzun ve zorlu bir yoldur. Bu yolda ilerlerken çok fazla hata yapacaksınız. Sabahlara kadar çalışıp bazen hiçbir gelişme kat edemediğiniz olacak. Yine de vazgeçmeyip, hatalarınızdan ders çıkararak yolunuza devam etmelisiniz. Bu uğurda çok entegre yanacak. Burnunuz, en ufak bir yanık konusunu alacak kadar keskinleşecek. Projenin bitiş zamanına yaklaştıkça uyku sürenizde bariz azalmalar görünecek. Ama ilk robotunuzu imal ettiğinizde, sizin verdiğiniz komutları bir bir yerine getirirken, dudağınızda hafif bir tebessüm belirecek. Bunu ben yaptım diyeceksiniz. O’na ben hayat verdim…

Proteus İle İlk Simülasyon

CCS C ile program yazmayı öğrendiğimize göre artık Proteus'un Isis adlı devre simülasyon programını kullanarak simülasyon hazırlayabiliriz. Şunu ek olarak belirtmek istiyorum; burada proteus ile ilgili anlatacaklarım muhtemelen yeterli olmayacaktır. Proteus için internette sayısız Türkçe ve İngilizce kaynak bulabilirsiniz.
CCS C'de kod yazmayı yeni öğrenirken yazdığımız kodları simülasyon programında denemek bize çok zaman kazandırır. Dolayısıyla Ben CCS C konularını bitirmeden gerçek bir mikrodenetleyici üzerine yazılım gömmemenizi (embedding) tavsiye ediyorum. Çünkü başka sebeplerden dolayı çıkması muhtemel sorun kafanızı karıştırıp, asıl öğrenmeniz gerek şeyden yani yazılım bilgisinden sizi uzaklaştırabilir.
Öncelikle Isis programını çalıştırıyoruz.

Karşımıza yukardaki ekran gelecek. Noktalı olan büyük çerçeve bizim elektronik devrelerimizi simule edeceğimiz çalışma alanımızdır. Ekranın en sol tarafında da gördüğünüz üzere çeşitli ikonlar mevcuttur. Bu ikonlardan component mode ikonu ( ), bizim en çok kullanacağımız ikondur. Şimdi bu ikona yıklayalım. Gördüğünüz gibi Devices yazan yerin altında hiç birşey yazmıyor. Yani listemizde hiç elektronik parça bulunmuyor. Şimdi elektronik parça ekleme için Devices yazısının yanındaki P (Pick from Libraries) ikonuna basalım.
Yukarıda görüldüğü gibi Pick Devices penceresi açıldı. Isis çok geniş elektronik parça bilgisine sahiptir. İstediğimiz parçayı keywords kısmına yazarak bulabiliriz. şimdi keywords kısmına PIC16F628A yazalım. Yazdıktan sonra 'Results' kısmında Mikrodenetleyicimizi görebilirsiniz. OK tuşuna bastığınızda ise artık PIC16F628A mikrodenetleyicimiz 'Devices' listemizde görünecektir. Listedeki PIC16F628A ya tıklayıp çalışma alanımızda herhangi bir alana tıklar iseniz mikrodenetleyicimiz çalışma alanımıza yerleşmiş olur. Yerleştikten sonra sürükleyerek istediğiniz yere götürebilirsiniz. Bir de çalışma tezgahınıza, mouse'unuzun scroll'unu kullanarak zoom in ve zoom out yapabilirsiniz. Çalışma tezgahına eklediğiniz bir parçayı silmek istiyorsanız mouse'ınızla parçanın üstünde iki kere sağ tuşa tıklar iseniz parça silinir.
Şimdi bu mikrodenetleyicimizin yanına bir led, bir de direnç ekleyelim. Led için pick devices penceresine girip keywords kısmına "animated led" yazarsanız, karşınıza bir çok farklı renkte led çıkar ben onların arasından LED-RED 'i seçiyorum. OK'a basıp ekliyorum. Daha sonra LED'im mikrodenetleyicime bağlanabilmesi için gereken direncimi de keywords kısmına "Minres330r" yazarak ekliyorum. Son olarak da Ledim ve direncimi çalışma alanıma ekleyerek aşağıdaki gibi bir tasarım elde ediyorum. (Parçaları döndürmek için parçaya sağ tuşla tıkladığınızda çıkan menuden 'Rotate Clockwise' veya 'Rotate Anti-Clockwise' seçeneklerini kullanabilirsiniz.)

Bu dizaynımızın çalışabilmesi için sistemimize toprak (ground) ekliyip, parçaları birbirine bağlamamız gerekir. Yalnız toprağı component listemizden elde edemeyiz. Toprak için en sağdaki ikonlardan terminals mode'a () basmamız gerekir. Daha sonra çıkan listeden 'Ground' u seçip, çalışma alanımızda bir noktaya tıkladığımızda oraya ground eklemiş oluruz. Ground'u da parçalar gibi istediğiniz yere taşıyabilirsiniz. Şimdi kablolalama yapalım. kablolama için kablolama yapacağınız yerin başına ve sonuna tıklamanız yeterli. Yalnız tıklayacağınız uca geldiğinizde ucun etrafında kırmızı kare belirmesine dikkat edin.
Evet, ilk devre tasarımımızı gerçekleştirmiş bulunmaktayız. Bu devre sistemimize göre mikrodenetleyicimizin RA0 bacağı eğer mantık-1'e çekilirse, yani bacaktaki gerilim +5V olursa, Ledimiz yanacaktır. Şimdi bir kod yazalım ve bunun gerçekleştirelim.
Bu aşamada sizden kodları anlamanızı beklemiyorum. Çünkü kodlarla ilgili henüz bir eğitim almadığınızı varsayıyorum. Sizden şu an beklediğim sadece simülasyonu çalıştırmak. Eğer bunu başarabilirseniz, örnekler kısmındaki bütün uygulamaları çok rahat gerçekleştirebilirsiniz.
Öncelikle bir önceki bölümde öğrenmiş olduğumuz gibi CCS C derleyicisini açalım ve kod ekranındaki bütün herşeyi silip, aşağıdaki kodları eksiksiz girin.

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)
#use fast_io(a)
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0x00);
output_a(0x00);
output_high(pin_a0);
}

Daha sonra F9 tuşuna basıp derleyicinin hatasız bir şekilde kodu derlediğinden emin olun. Artık hex dosyasımızı Isis'te çalıştırabiliriz. Şimdi tekrar Isis'teki çalışma alanımıza geri dönelim. Mikrodenetleyicimize çift çıklayalım. Karşımıza 'Edit Component' penceresi çıkacak. Bu pencerede 'Program File' yazan kısımdaki klasör ikonuna tıklıyoruz ve burdan demin derlediğimiz kodun hex dosyasını seçiyoruz. Daha sonra 'OK' tuşuna basarak pencereyi kapatıyoruz. Artık simülasyonumuz tamamıyla hazır. Geriye kalan tek şey sol alt köşedeki 'Play' tuşuna basmak.

CCS C ile ilk program

Bu bölümde sizlere yaptığınız kurulumdan sonra CCS C derleyicisinde nasıl yazılım yazıldığınız göstereceğim. Bu bönümde önemli olan yazdığım kodlar değil, derleyicinin ayarlanmasıdır. Kod yazma kısmına daha sonra gireceğiz. Öncelikle masaüstümüzde beliren PIC C compiler ikonuna tıklıyoruz ve programı açıyoruz.
Program açıldıktıntan sonra PIC Wizard yazan ikona tıklıyoruz. Tıkladıktan sonra karşımıza 'Farklı Kaydet' penceresi çıkıyor. Bu pencerede proje dosyasını nereye kaydedeceğimizi seçiyoruz. Proje dosyasını belirli bir klasörün içine koymakta yarar var. Çünkü proje dosyasını derlediğimiz zaman çıkan dosyalar ve projeyle ilgili gereken tüm dosyalar proje dosyasının bulunduğu klasörün içine atılıyor.Proje dosyasının yerini belirlediğimiz zaman karşımıza PIC wizard penceresi çıkıyor. burda yapılacak ayarları sıralıyorum.

General kısmında,
Device: PIC16F628A
Oscilator Frequency: 4.000.000 HZ
Fuses: Internal RC Osc

Communications kısmında,
Use RS-232 nin tikini kaldırıyoruz.

OK'a basıyoruz.


Karşımıza yukarıdaki gibi bir ekran çıkıyor. Bu ekran bizim kodlarımızı yazacağımız ekrandır. Yalnız burada kodda bir problem bulunmakta. 11.satırda bulunan; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1););
komutunun son iki karakteri olan ")" ve ";" fazladan yazılmıştır. bu iki karakterin silinmesi gerekir. Yani 11.satırdaki doğru kod
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
olacaktır. Artık kodumuzu yazmaya hazırız. Kodumuzu yazdıktan sonra F9 tuşuna basarak kodumuzu derleyebiliriz. F9 a bastığımızda hiç hata vermeden kodumuzu derlerse proje dosyamızın bulunduğu klasörün içinde proje dosya ismimizle aynı isimde olan hex uzantılı bir dosya oluşacaktır. Bu hex dosyası mikrodenetleyicimize yükleyeceğimiz dosyadır. Bu yükleme işlemi çeşitli yükleyicilerle yüklenir.

Dijital Dünyaya Hoşgeldiniz

Önceden programlama bilginiz olmadığını farzederek bu bölümü hazırladım. Dolayısıyla sayı sistemleri hakkında bilginiz varsa bu bölümü geçebilirsiniz.
Daha önceden hep duymuşsunuzdur. Dijital sistemler "
1" ve "0" mantığıyla çalışır. Bu "1" ve "0" a biz mantık-1 ve mantık-0 diyeceğiz. Kendimizi mikrodenetleyicinin yerine koyup düşündüğümüz zaman ya vardır diyeceğiz (mantık-1) ya da yoktur (mantık-0) diyeceğiz. Bu ikisinin arasında bir durumu mikrodenetleyiciler kabul etmez. Dijital sistemler, bu yapılarından dolayı, matematik işlemlerini gerçekleştirebilmek için ikilik (binary) sayı sistemini kullanır.

İKİLİK SAYI SİSTEMİ (BINARY)
İkilik sayı sistemleri "1" ve "0" ı temel alıp bunlarla matematiksel işlemler yapmamızı sağlayan bir sistemdir. Biz normalde Onluk (decimal) sayı sistemini kullanırız. Onluk sayı sistemi biz insanlar için gayet anlaşılır ve kolay bir sistemdir. Daha önceden de bahsettiğim gibi dijital sistemler kendilerini sadece "1" ve "0" mertebesinde ifade edebildikleri için, onluk sayı sisteminde işlem yapamazlar. Eğer bir mikrodene
tleyiciye Onluk sayı sisteminde işlem yaptırmak istiyorsanız, öncelikle işlem yaptıracağınız sayıları ikilik sayı sisteminde ifade etmeniz sonra da işlemi yaparak bulduğunuz ikilik sayı sistemindeki sayıyı onluk sayı sistemine çevirmeniz gerekir. Şimdi dediklerimi bir örnek ile açıklayacağım.
Örnek olarak 56+35 = ? işlemini dijital bir sist
eme yaptırmak istersek,


Yukarıda örnekte sayının ikilik sayı sistemde olduğunu ifade edebilmek için sayının başına "0b" ifadesi konulmuştur. Bu C dilindeki standart k
ullanımdır. Örnekte yapılan toplama işlemiyle ilgili bilgi birazdan açıklanacaktır.

İklik sayı sistemi ile Onluk sayı sistemi arasındaki geçişler
Bu konuyla ilgili detaylı bilgileri lise matematik kita
plarında bulabilirsiniz. Onluk bir sistemden ikilik sayı sistemine geçmenin en kolay yöntemi onluk sayıyı sürekli ikiye bölerek kalanların yanyana dizilmesidir. Bunu bir örnekle açıklayayım:
62 sayısının ikilik sisteme göre ifade edelim.
Sayı aslında altı basamaklı bir sayı olsa da soluna iki adet sıfır eklenerek 8 basamaklı hale getirilmiş. Bunun sebebi C dilinde ve CCS derleyicisinde değişken tanımlamak için en çok tür 8-bitlik değişkenlerdir. Dolayısıyla bu bölümdeki tüm örneklerde sizden 8 basamaklı sayı tipine alışmanız bekleniyor. İkilik sayı sisteminden onluk sayı sistemine geçmenin de en kolay yolu ikilik sayı sistemindeki sayıların ilk basamağından başlayarak basamak değerlerini ikinin katlarıyla çarpıp çıkan tüm sayıları toplamaktır. Bu şekilde ikilik sayı sistemindeki sayıları onluk sayı sistemine kolayca çevirebilirsiniz. Bunu bir örnekle açıklayalım:
0b10111001 sayısının onluk sisteme göre ifade edelim.

İkilik sayı sisteminden onluk sisteme geçmek bilgisayarlar için kolay bir iş olsa da bizim için zahmetli bir iştir. Bu yüzden biz robotçular genelde ikilik sistemle daha kolay ilişki kurabileceğimiz onaltılık (hexadecimal) sistemi tercih ederiz. Bölümün sonunda onaltılık sayı sistemine geçiş ile ilgili bilgiler verilecektir.

İkilik sayı sistemindeki sıkça kullanacağımız matematiksel ve mantıksal operatörler

Toplama Operatörü
İkilik sayı sisteminde yapılan toplama işlemi onluk sisteminkine benzer şekilde yapılır.


Örneği anlamadıysanız ikilik sayı sistemleri ile ilgili biraz araştırma yapmanız gerekir.

Veya Operatörü
Veya mantıksal operatörünün mantık tablosu aşağıda verilmiştir. Mantıksal operatörler bit bit kullanıldığı için tek bitte bildiğiniz işlemi diğer tüm sayılar için de kullanabilirsiniz.
Bu tabloyu bir örnekle pekiştirelim:


Ve operatörü
Veya mantıksal operatörünün mantık tablosu aşağıda verilmiştir.
Bu tabloyu da bir örnek ile pekiştirelim:

ONALTILIK SAYI SİSTEMİ (HEXADECIMAL)
Onaltılık sayı sistemindeki her bir rakam 4 bitlik bir ikilik sistem sayısına eş değerdir. Dolayısıyla bu sistemden ikili sisteme geçmek için onluk sistemdeki gibi yorulmamıza gerek kalmaz.

Yukardaki tabloyu ezberlemeniz çok önemlidir. Bu sayede onaltılık sistem ile ikilik sistem arasındaki geçişleri çok kolay yapabilirsiniz. Bu tablonun çıktısını alıp gözününüz önüne asmanızda yarar vardır. Çünkü konu anlatımında ve örneklerde çoğunlukla onaltılık sistem kullanıyorum.

Robotiğe ilk adım

Aslında herşeyde olduğu gibi robotikte de en zoru ilk adımı atabilmektir. Tamam, robotçu olmak istiyorum ama ne yapmalıyım? nerden başlamalıyım? Bu gibi sorularla boğuşup dururken haliyle araştırmaya koyulursunuz. Ama karşınıza o kadar çok yol çıkar ki, nereye adım atacağınızı şaşırırsınız. O yüzden ben bu sitede sizlere birşeyler anlatmaya çalışırken hep tek bir yol izlemeye çalıştım. Bu yolu takip ederken unutmamanız gereken şey bu yolun tek doğru yol olmadığıdır.
Projelerimde mikrodenetleyici olarak ben PIC(Programmable Intelligent Computer)'i kullanmayı uygun gördüm. Ancak PIC mikrodenetleyicilerinden de yüzlerce çeşit bulunmakta. Biz başlangıç aşamasında olduğumuz için PIC'in 16F628A modeli mikrodenetleyicisini kullanmayı tercih ettim. Bu mikrodenetleyiciyi programlamak içinde bir çok programlama dili ve derleyici bulunmaktadır. Bunların arasından da bana en kolay gelen ve gelişmiş projelerde kullanabileceğimiz C dilini seçtim. Derleyici olarak da CCS firmasının C derleyicisini kullandım. Ayrıca yazılım konusu ile ilgili yazdığım örnek kodları gerçek hale getirmedim. Proteus isimli simulasyon programını kullanarak çalıştıklarını gözledim. Kullandığım meteryalleri kısaca özetlersek:
  • Mikrodenetleyici: PIC16F628A
  • Programlama Dili: C
  • Derleyici: CCS C
  • Simülasyon programı: Proteus
Başlangıçta size gerekli olanlar, CCS C derleyici programı ve Proteus elektronik devre simülasyon programıdır. Bu programları bilgisayarınıza kurduktan sonra robotiğe ilk adımınızı atmış olacaksınız.

7. Dış Kesme Uygulaması



/***** Dış Kesme Uygulaması Yazan: Burak TASASIZ *****/
/************************************************
YAZILIMIN İŞLEVİ: A0 bacağına bağlanmış olan bir
led program tarafından 750 ms aralıklarla yanıp
sönecek şekilde sürülüyor. Bu arada B0 dış kesme
bacağına bağlanmış bir button vasıtasıyla programa
müdahale ediliyor ve program dış kesme fonksiyonuna
gönderiliyor.
************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

int i;

#int_EXT //Kesme fonsiyonunun tanımlanması
void EXT_isr(void)
{
/* Program dış kesme fonksiyonuna girdiğinde
a0 bacağının değeri 5 defa 250 ms aralıklarla
lojik-1 ve lojik-0 olacaktır. */
for(i=0;i<5;++i)
{
output_a(0x01);
delay_ms(250);
output_a(0x00);
delay_ms(250);
}
}



void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

/*Port giriş-çıkış bacaklarının belirlenmesi
ve port temizlemesi yapılması*/
set_tris_a(0x00);
output_a(0x00);

set_tris_b(0x01);
output_b(0x00);

while(1)
{
/* a0 bacağının değeri 750 ms aralıklarla
lojik-1 ve lojik-0 yapılıyor. */
output_a(0x01);
delay_ms(250);
delay_ms(250);
delay_ms(250);
output_a(0x00);
delay_ms(250);
delay_ms(250);
delay_ms(250);
}

}

7. Kesme mantığı ve kesme çeşitleri

Kesme: Mikrodenetleyicinin değişik kaynaklardan gelen sinyaller vasıtasıyla koşan ana programı yarıda bırakıp, kesme programını icra etmesi ve bu icra bittikten sonra da ana programa geri dönüp kaldığı yerden devam etmesi işlemine kesme denir.

Yoklama: Mikrodenetliyicinin belirli aralıklarla sürekli olarak bacaklarını aynı şekilde denetlemesi işlemine yoklama denir.

Kesmenin yoklama dan üstünlüğü: Yoklama yapmak yerine kesme kullanılırsa sistemde aynı anda birden fazla iş yapılabilir. Kesme kullanarak daha verimli ve esnek programlar yazabiliriz.

Kesme çeşitleri

Bazı kesme çeşitleri şunlardır:

1. RBO harici kesmesi

2. RB4-RB7 pinlerindeki değişiklik kesmesi

3. Timer birimleri taşma kesmesi

4. A/D çevrimi yapıldığında meydana gelen kesme

5. CCP modülleri kesmesi

6. Paralel Porttan veri gelme kesmesi

7. Seri Porttan veri gelme kesmesi

8. SPI veya I2C iletişimi sırasında veri geldiğinde oluşan kesme

9. EEPROM’a veri yazma işlemi sonlandığında oluşan kesme

CCS C de kesme işlemleri

int_xxx //xxx yerine ilgili kesme ismi yazılır

void fonksiyon_ismi ()

{

Komut veya komutlar;

}

v Kesmeyi aktif hale getirmek için,

#enable_interrupt(kesme ismi);

v Kesmeyi pasif hale getirmek için,

#disable_interrupt(kesme ismi);

v Aktif hale getirilen kesmelere izin vermek için,

#enable_interrupt(GLOBAL);

v Aktif edilen kesmelere izin vermemek için,

#disable_interrupt(GLOBAL);

v Kesmeler arasında öncelik atamak için,

#priority kesme ismi,kesme ismi…

6.b - Dc motor hız kontrolü (PWM)


/***** DC-MOTOR HIZ KONTROLÜ Yazan: Burak TASASIZ *****/
/************************************************
YAZILIMIN İŞLEVİ: B portunun RB0, RB1
bacakları L293D entegresinin sırasıyla IN1, IN2
bacaklarına bağlanıyor. Ayrıca
Mikrodenetleyicinin RA7 bacağına buton bağlanıyor.
Böylelikle butona basılmadığı zaman dc-motor
%70 doluluk oranı ve 100 Mhz'lik PWM ile sürülüyor,
butona basıldığı zaman ise %90 doluluk oranı ve
100 Mhz'lik PWM ile sürülüyor.
************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); /*B Portunun tüm bacakları çıkış olarak ayarlanıyor.*/
output_b(0x00); //Port temizlemesi

set_tris_a(0xFF); /*A Portunun 7. bacağı giriş olarak ayarlanıyor.*/
output_a(0x00); //Port temizlemesi

While(1)//Sonsuz döngü
{
if(input(pin_a7))//Butona basılmışsa,
{
output_b(0x01);
delay_ms(9);
output_b(0x00);
delay_ms(1);
/*%90 doluluk oranı ve 100 Mhz'lik PWM*/
}
else//Butona basılmamışsa,
{
output_b(0x01);
delay_ms(7);
output_b(0x00);
delay_ms(3);
/*%70 doluluk oranı ve 100 Mhz'lik PWM*/
}
}

}

6.a - Dc motor yön kontrolü


/***** DC-MOTOR YÖN KONTROLÜ Yazan: Burak TASASIZ *****/
/************************************************
YAZILIMIN İŞLEVİ: B portunun RB0, RB1, RB2 ve RB3
bacakları L293D entegresinin sırasıyla IN1, IN2,
IN3 ve IN4 bacaklarına bağlanıyor. Ayrıca
Mikrodenetleyicinin RA7 bacağına buton bağlanıyor.
Böylelikle butona basılmadığı zaman motorlarımız
saat yönünün tersine, butona basıldığı zaman ise
saat yönüne dönüyor.
************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); /*B Portunun tüm bacakları çıkış olarak ayarlanıyor.*/
output_b(0x00); //Port temizlemesi

set_tris_a(0xFF); /*A Portunun 7. bacağı giriş olarak ayarlanıyor.*/
output_a(0x00); //Port temizlemesi

While(1)//Sonsuz döngü
{
if(input(pin_a7))//Butona basılmışsa,
output_b(0x05);
/* L293D için in1=1,in2=0 ve in3=1,in4=0 ayarlanıyor.
Böylelikle iki motorda saat yönüne döner. */
else//Butona basılmamışsa,
output_b(0x0A);
/*L293D için in1=0,in2=1 ve in3=0,in4=1 ayarlanıyor.
Böylelikle iki motorda saat yönünün tersine döner. */
}

}

Robot Nedir ?

Robotlar; çevresinden topladıkları bilgileri, önceden kendisine dikte edilen komutlar sayesinde yorumlayıp, bu komutlara göre belirlenen tepkiler veren elektro-mekanik makinelerdir. Bir robot şekilde de görüldüğü üzere dış dünyadan gelen etkileri, duyargaları sayesinde farkeder ve bu etkileri mikrodenetleyici dediğimiz entegrelere gönderir. Bu mikrodenetleyiciler de kendilerine gömülen kodları kullanarak, gelen etkiye karşı eyleyiciler vasıtasıyla bir tepki üretilmesini sağlar. Bu bahsettiğim etki-tepki mekanizması insanda da bir bakıma böyle çalışır.
Günümüzde robotlar daha çok endüstri ve hizmet alanında kullanılırlar. Bunun sebebi robotların insanlara göre üretim ve rutinlik konusunda çok daha başarılı olmasıdır. Zira;
  • Bir robot insanın kaldıramayacağı şeyleri kolaylıkla kaldırır.
  • İnsanın yapamayacağı hassasiyette ince işçilik yapabilir.
  • Bir insandan çok daha hızlı bir şekilde %100 konsantrasyonla sadece işini yapar.
  • Asla yorulmaz, uykusu gelmez, 24 saat çalışabilir. Çalışamadığı tek zaman, bakım zamanıdır.
  • Monotonluk tam ona göredir. Yaptığı işten asla şikayet etmez. Motive edip üretimi arttırma gibi bir derdiniz olmaz.
  • Maaş almaz dolayısıyla zam istemez, grev yapmaz.
Robotların insanlara göre bu tip monoton işlerde çok büyük avantajları vardır. Ama;
  • Robotlar, karşılarına kendisine önceden dikte edilmemiş bir sorun çıktığında, çoğu zaman bocalar ve hata verir.
  • Bir robot yeni üretim tekniği geliştiremez, sadece kendisine öğretilen tekniği uygular.
  • Bazen bir robota göre çok karmaşık olan bir olay insana göre çok basittir. (Merdiven çıkma, dengede durma, etraftaki engellere çarpmadan koli taşıma, insanlarla iletişim vs…)
Robotlar, dikkat etmişseniz bir çok insan mesleğini yapabilir hale gelmeye başlamıştır . Zaman ilerledikçe bu mesleklerde artış olması kaçınılmazdır. Bu da insanların mesleklerini seçerken, robotlarla da mücadele edeceği anlamına geliyor. Peki robotlar hangi meslekleri yapabilir?
  • Bankacılık hizmetleri ( Atmler gibi )
  • Üretim elemanı
  • Garsonluk
  • Öğretmenlik
  • Muhasebecilik
  • Hizmetçilik
  • Polislik
  • Sokak ve ev temizliği
  • Hemşirelik
  • Askeriye
  • Her türlü satış ve pazarlama ( Kola otomatları gibi )
  • Şoförlük vb…
Robotların bu kadar geniş alanda meslek sahibi olabilmelerinin ana sebebi monotonluktur. Bir çok insanın hayatının önemli bir kısmı monoton işler yaparak geçer. Aslında bir açıdan baktığımızda, robotlar insanları çok büyük yükten kurtarır. Monotonluk… Monotonluk; insanın beynini kemirir, mutsuz eder ve hayatı sorgulamasına izin vermez. İnsan, monotonluklarından sıyrıldığı kadar özgürdür. Monoton işlerin robotlara yıkılması, insanların yaratıcılıklarını kullanabilecekleri daha çok zeka gerektirecek işlere yönelmesini sağlar. Tasarımcılık, mühendislik, sanatçılık, yazarlık, bilim insanlığı ve filozofluk insanların zekasını ve yaratıcılığını diri tutan en önemli mesleklerdir. Robotların bu meslekleri icra edebilmeleri mümkün değildir.

Asla unutulmamalıdır ki robotlar varlıklarını sorgulayıp, hiçbir zaman NEDEN sorusunu soramazlar…

5. Karar verme ve Döngü İşlemleri

IF

İf deyimi bir veya birden fazla şartın gerçekleşmesine bağlı olarak bir komut veya komut bloğunun çalışmasını sağlar.

if (şart)

Komut;

if(şart)

{

Komut ve/veya komutlar;

……..

}

IF ELSE

İf(şart)

{

Komut veya komutlar;

}

Else

{

Komut veya komutlar;

}

Parantez içindeki şart doğru ise parantezden sonraki komut bloğu çalışır. Yanlış ise, else den sonraki komut bloğu çalışır.

if(şart)

{

Komut veya komutlar;

}

else if(şart)

{

Komut veya komutlar;

}

else if(şart)

{

Komut veya komutlar;

}

else

{

Komut veya komutlar;

}

SWITCH – CASE

Verilen ifade veya değişken aldığı değerlere göre programın akışını istenen seçeneklere yönlendirmek için kullanılır.

switch (değişken veya ifade)

{

case sabit1:

Komut ve komutlar;

break;

case sabit2:

Komut ve komutlar;

break;

case sabitN:

Komut ve komutlar;

break;

default:

Komut ve komutlar;

break;

}

FOR

For deyimi verilen şartların doğru olduğu sürece belirtilen işlemlerin tekrarlanmasını sağlar.

for(başlangıç ; şart ; adım)

{

Komut ve komutlar;

}

WHILE

While döngüsü, verilen şart doğru olduğu sürece belirtilen işlemleri tekrarlamak için kullanılır.

while(şart)

{

Komut ve komutlar;

}

DO-WHİLE

do {

Komut ve komutlar;

} while(şart);

3. Pin ve Port Giriş Komutları

INPUT() Komutu

İstenen giriş pininin lojik olarak değeri okunur.

değişken ismi = input(pin ismi);

Veri11=input(pin_a2);

INPUT_X() Komutu

Bu komut ile istenen giriş portu tümüyle okunur.

Değişken ismi=input_port ismi();

Veri=input_b();

4. Önişlemci fonksiyonları

#DEFINE

Bu komut ile sabit tanımlaması yapılır.

#define PI 3.14 //Program her PI gördüğü yere 3.14 yazar

#FUSES

Bu komut ile kullanılan mikro denetleyici ile ilgili konfigürasyon bitlerinin durumu belirtilir.

#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD

#INCLUDE

#include <16f628a.h>

#USE DELAY

#use delay(clock=4000000)

#USE FAST_IO()

#use fast_io(a)

set_tris_a(0x00);

5.b- Karaşimşek Devresi

/**** Karaşimşek Devresi Yazan: Burak TASASIZ ****/
/************************************************
YAZILIMIN İŞLEVİ: B portuna bağlı ledlerin sırayla
teker teker yanması sağlanır. Son lede geldiğinde
sıranın yönü değişir.
*************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
unsigned int i,BD=1;

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); /*B portu çıkış olarak ayarlanıyor.*/
output_b(0x00); //Port temizlemesi

DONGU:
for(i=0;i<7;++i) bd="BD<<1;" i="0;i<7;++i)" bd="BD">>1;
delay_ms(100);
}
goto DONGU;

}

5.a - Buton ile Sayıcı Uygulaması

/**** BUTON İLE SAYICI UYGULAMASI Yazan: Burak TASASIZ ****/
/************************************************
YAZILIMIN İŞLEVİ: A0 pinine bağlanmış butona
basılmasıyla, B portunun değeri her defasında bir
arttırılır. Böylelikle B portuna bağlanmış ledler,
her butona basıldığında binay modunda bir üst sayıyı
gösterir.
*************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
unsigned int BD=0; // BDnin başlangıç değeri 0

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); /*B portu çıkış olarak ayarlanıyor.*/
output_b(0x00); //Port temizlemesi

set_tris_a(0x01); /*A0 pini giriş olarak ayarlanıyor.*/
output_a(0x00); //Port temizlemesi

DONGU:
output_b(BD);
if(input(pin_a0))
{
delay_ms(50);/*Buton arkını önlemek amaçlı bekleme konuluyor.*/
BD++;
}
goto DONGU;

}

3.b- Buton ile led kontrolü

/**** BUTON İLE LED KONTROLÜ Yazan: Burak TASASIZ ****/
/************************************************
YAZILIMIN İŞLEVİ: A0 pinine bağlanmış ledin B0 pinine
bağlanmış bir buton yardımıyla yakıp söndürülmesi
sağlanır.
*************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x01); //B0 pini giriş olarak ayarlanıyor.
output_b(0x00); //Port temizlemesi

set_tris_a(0x00); //A0 pini çıkış olarak ayarlanıyor.
output_a(0x00); //Port temizlemesi

DONGU: //Etiket belirlendi

if(input(pin_b0)) /*B0 pini lojik-1 olduğunda bu koşul gerçekleşiyor.*/
{
output_high(pin_a0); //A0 pini lojik-1 yapılıyor.
}
else /*Eğer if koşulu gerçekleşmediyse bu koşul gerçekleşiyor*/
{
output_low(pin_a0); //A0 pini lojik-0 yapılıyor.
}
goto DONGU; //Program DONGU etiketine gider
}

3.a- Port giriş-çıkış uygulaması

/***** PORT GİRİŞ UYGULAMASI Yazan: Burak TASASIZ *****/
/************************************************
YAZILIMIN İŞLEVİ: B portunun bacaklarındaki lojik
değişimleri A portunun çıkışına atanır. Böylelikle A
portunun 8 pinine bağlanmış 8 ledin, B portuna bağlı
8 butonun durumuna göre yanması veya sönmesi sağlanır.
*************************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
unsigned int Deger; //deger değişkeninin tanımlanması
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0xFF); /*B Portunun tüm bacakları giriş olarak ayarlanıyor.*/
output_b(0x00); //Port temizlemesi

set_tris_a(0x00); /*A Portunun tüm bacakları çıkış olarak ayarlanıyor.*/
output_a(0x00); //Port temizlemesi

DONGU: //Etiket belirlendi

deger=input_b(); /*B portunun lojik değeri, deger değiskenine aktarılıyor.*/
output_a(deger); /*Deger degiskeninin degeri A portuna atanıyor.*/

goto DONGU; //Program DONGU etiketine gider
}

2. Operatör kullanımı uygulaması

/***** OPERATÖR KULLANIMI UYGULAMASI Yazan: Burak TASASIZ *****/
/*******************************************
YAZILIMIN İŞLEVİ: B portuna, herhangi bir operatör vasıtasıyla
değiştirilmiş değişkenin değeri atanır. Böylelikle B portunun
8 pinine bağlanmış 8 ledin bu değerlere göre yanması veya
sönmesi sağlanır.
********************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{
unsigned int a,b,c; //a,b ve c değişkenlerinin tanımlanması
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); //Port giriş-çıkış ayarları
output_b(0x00); //Port temizlemesi

a=0x85; //a'nın değeri 1000 0101 olarak atandı
b=0x47; //b'nin değeri 0100 0111 olarak atandı

DONGU: //Etiket belirlendi
c=a+b;
output_b(c); //B portunun çıkışı "a+b" olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
c=~a;
output_b(c); //B portunun çıkışı "a'nın değili" olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
c=a|b;
output_b(c); //B portunun çıkışı "a veya b" olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
c=a&b;
output_b(c); //B portunun çıkışı "a ve b" olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
c=a<<1;
output_b(c); //B portunun çıkışı "b nin bir sola ötelenmişi" olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
goto DONGU; //Program DONGU etiketine gider
}

1.d Port çıkış uygulaması

/***** PORT ÇIKIŞ UYGULAMASI Yazan: Burak TASASIZ *****/
/*******************************************
YAZILIMIN İŞLEVİ: B portuna çeşitli heksadesimal değerler
gönderilip, B portunun 8 pinine bağlanmış 8 ledin bu
değerlere göre yanması veya sönmesi sağlanır.
********************************************/

#include <16f628a.h>
#FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use delay(clock=4000000)

void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

set_tris_b(0x00); //Port giriş-çıkış ayarları
output_b(0x00); //Port temizlemesi

DONGU: //Etiket belirlendi
output_b(0xFF); //B portunun çıkışı 1111 1111 olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
output_b(0x27); //B portunun çıkışı 0010 0111 olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
output_b(0x34); //B portunun çıkışı 0011 0100 olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
output_b(0x98); //B portunun çıkışı 1001 1000 olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
output_b(0x55); //B portunun çıkışı 0101 0101 olarak ayarlandı
delay_ms(500); //Mikrodenetleyici 500ms bekler
goto DONGU; //Program DONGU etiketine gider
}