Sensörler(Algılayıcılar) ve Mikroişlemciler-1
Bu yazı dizisinde voltaj, sıcaklık, basınç, ivme, jiroskopik etki, ses şiddeti, manyetik yön, dokunma, mesafe, global komumlama gibi öğeleri ilgili sensörler yardımıyla mikroişlemcimizle tanımaya ve hissetmeye çalışacağız. Bunu yaparken mikroişlemci programla tekniginin cok derinine inmeyeceğiz. Amacımız, daha pratik olarak bazı sensorlerin nasıl kullanılacağını göstermek.
Bu aydan itibaren yeni bir yazı dizisine başlamak istiyorum. Bu yazı dizisinin konusu gerek robotik gerekse elektroniğin her alanında ortamı hissetmek ve tanımak için kullandığımız sensörlerin mkikroişlemcilere nasıl tanıtıldığını diğer bir deyişle nasıl programlandığını ve nasıl kullanıldığını incelemek.
Bu yazı dizisi komple bir proje yazı dizisi olamayacak.Daha çok projelerinde belirli tip sensörleri kullanacaklara bir kaynak niteliği taşımasını istedim.Benim proje bazlı yazı yazdığımı bildiğiniz için herhangi bir hayal kırıklığına yol açmamak için bu noktayı baştan belirtmek istedim J
Bu yazı dizisinde voltaj, sıcaklık, basınç, ivme, jiroskopik etki, ses şiddeti, manyetik yön, dokunma, mesafe, global komumlama gibi öğeleri ilgili sensörler yardımıyla mikroişlemcimizle tanımaya ve hissetmeye çalışacağız,bunu yaparken mikroislenci programla tekniginin cok derinine inip ders vermek degil amacim,daha pratik olarak bazi sensorlerin nasil kullanilacagini gostermek.
Bunu gerçekleştirirken size yuakarıda listelediğim öğelerden hangisini inceliyorsak o öğeyi hissetmek için kullanacağımız sensör hakkında bilgi verip kısa bir mikroişlemci koduyla naıl algılanacagını anlatacağım. Eğer sensör bir firmanın ürünü ise sensörle ilgili datahseet yani sensör bilgi formunu da vereceğim. Burada örnek olarak kullanacağım mikroişlemci PIC serisinden PIC16F877 olacak ve derleyici olarakta PICBASIC PRO kullanacağım.
PIBASIC PRO’yu www.melabs.com sitesinden demo versiyonu olarak indirebilirsiniz.Demo versiyonu ile karmaşık programlar yazamayabilirsiniz ama baslangıç için yeterli uzunlukta program yazmanıza izin vermekte. Aynı sitede bu programın ingilizce el kitabı da pdf formatinda bulunmakta.
Bu programi seçmemin sebebi Türkiye de oldukça popüler olması ve assembler’a göre kullanım kolaylığı olan bir dil olması. Örnek programlar komple bir program veya proje kodu olmaktan ziyade kendi projelerinizde kullanacağınız subroutine’ler şeklinde olacak. Tabii Pic Basic Pro kullanmak istemeyenler çok basit bir program dili yapisina sahip PICbasic pro kodunu inceleyip bunu C veya benzeri derleyicilere taşıyabilecekler.
PIC16F877’yi işlemci olarak seçmemin sebebi çok kolay bulunabilmesi ve hem hafıza hemde peripheral girişleriyle bize daha çok imkan tanıması. En onemli özelliği ise Analog/Dijital çevirici girişinin bulunması. İnceleyeceğimiz birçok sensör algıladıkları değerleri mikroişlemciye aktarirken bunu voltaj olarak yapmakta. Bu da bir ADC Analog Dijital çeviriciyi gerektirmekte.
Bu ay bu sensörlerden en basitini Voltaj sensörünü inceleyeceğiz. PIC içindeki Analog Dijital dönüştürücü zaten +5Volta kadar bu işi yapmakta o zaman ne gerek var bunu incelemeye diye düşünebilirsiniz. Var sayalım bir el aleti tasarlıyoruz ve 9 voltluk batarya kullanmak istiyoruz. Bu durumda bataryanın voltajını okuyup hala el aletimizi çalıstırmaya yetecek kadar enerjiye sahip mi diye görmek istediğimiz de bunu yalnızca ADC giriş portuna verip yapamayız. Burada problem +5Volta kadar ADC bize hep +5 volt iletir halbuki +5Voltö 9Voltluk bir bataryanin neredeyse bitme noktasıdır. Peki ne yapacağız bu durumda?
9 Voltluk bataryanın voltajını bir şekilde PIC ADC girişinin rahatlıkla görebileceği değere yani 0 ile 5 Volt arasında olacak bir değere indirmemiz gerekecek. Bunu yapmak icinde yukarıdaki çizimde görüldüğü gibi bir voltaj bölücü kullaniriz. Bu voltaj bölücü görüleceği gibi üç adet 10 Kilo ohmluk direncin seri olarak bağlanması ile oluşmakta. Bu direnç grubunun en alt ucunu şaseye en üst ucunu da bataryamızın +9Volt ucuna bağlarız. Şekilde görüldüğü noktadan çıkış alıp PIC ADC girişine verdiğimizde PIC kabaca giriş batarya voltajının 1/3’u kadar bir değer görür. Bu durumda eger 9 Voltluk batarya kullanıyorsak yaklaşık 3 volt görür. 3 Volt maximum girişvoltajı olan 5 Volttan az olduğundan PIC bunu rahatca okur. Bu direnç bölücü takımıyla 15 volta kadar voltajları okuyabilirsiniz.15 volt üzerini okumak isterseniz o zaman bölücü direnö değerleri ile oynayabilirsiniz. Tabii bu bölücüyü iki dirençle de yapmak mümkün bu durumda üstteki iki direnci 20 kiloohmluk tek bir direncle degiştirmeniz lazim.Ama 20 kilohmluk standart direnç zor bulunacağı için üç adet 10 kiloohm ile yapmak daha hassas ve kolay. Dirençlerin toleransları eğer düşük toleranslı direnç kullanmazsanız çok değişken olabilir bu da ölçüm sonuçlarını etkiler.%1 lik toleranslı dirençler ile her ortam sıcaklık değerinde kararlı bir okuma yapabilirsiniz.
Iyi de PIC ne okur? PIC ADC girişine gelen voltajı 3 volt yada 5 volt olarak gormez,sadece karsiligi olan dijital değeri görür. Örneğin ADC girişine 5 Volt girdiğimizi varsayalım, bu durumda ADC registeri olan ADRESH’yi okursak bize 255 rapor eder. Bu şu anlama gelir. Eğer bana 5 volt girersen ben sana 255 decimal sayısını veririm. PIC içindeki ADC var sayılan olarak Vref yani Referans voltajı olarak 5 Volt yani besleme voltajını kullanır. Bu da 0 ile 5 Volt arasındaki girişlerin 5 volt ile karsılastırılacağı anlamını taşır. PIC 10 bitlik ADC kullanabilsede biz şimdilik 8 bitlik bir okuma üzerine yoğunlaşalim. 8 Bitlik bir sayı 0 ile 255 arasindaki bir sayıdır.Yani voltaj girişi 0 ile 5 Volt arasında bir değer olabilir ve 0 Volt 0 Decimal +5Volt ise 255 decimal karşılığıdır. Şimdi +5Volt’u 255’e bölersek her bir decimal artışına karşılık 19.6 milivoltluk bir artış buluruz. Yani girişte voltaja karşılık ADRESH=100 decimal okuyorsa ADC girişinde 100 x 19.6 = 1960 milivolt veya 1.960 Volt vardır.Aynı mantıkla eğer ADRESH 255 sayısını görüyorsa o zaman
255 x 19.6 = 4998 milivolt veya 4.998 milivoltdur. Burada dikkat edeceğiniz gibi tam olarak 5000 milivolt elde edemedik ama oldukça yakın yaklaşık 2 milivolt düşük bir sonuç elde ettik,bunun nedeni tam sonuç 5/255 = 0.019607843 Volt yada 19.607843 milivolttur halbuki biz yuvarlayıp sadece 19.6 kısmını aldık bu da bize sonuçta bir yuvarlama hatası olarak yansıdı. Peki neden tamamını almadık da sayının yalnızca yuvarlayıp aldık. Bunun sebebi PIC programımız içindeki işlemi basit tutabilmek icin fedakarlık edip sonucu yuvarladık.
Şimdi giriş voltajına karşılık bir decimal değeri PIC bize iletti ve varsayalım ki bizimde bir LCD gostergemiz var ve voltaj değerini göstermek istiyoruz kullanıcıya peki bunu nasıl yapacağız?
Biliyoruz ki her decimal adıma karşılık 19.6 milivolt elde ediyoruz. Şimdi gene 100 decimal değerini okuduk diyelim bu durum da programımız şu işlemleri uygular:
V = 100 * 196 = 19600 sayısını elde ederiz. Daha sonra bunu 19600 /10 ‘a bölerek = 1960 milivolt elde ederiz. Burada kaba bir tabirle kullandığımız üç kağıt direk olarak 19.6 ile çarpmadık ta bu sayıyı önce 10 ile çarpıp sonucu 10’a böldük. Bunun guzelligi PIC gibi matematik fakiri bir işlemciyi ondalık kesirli işlemlerle oyalamamak.
Bu noktadan sonra bunu voltaj olarak gostermek kolay,pic basic pro icindeki DIG komutu ile 1960 degerinde ki her bir rakamı bir değişkene atayıp istediğimiz şekilde LCD’ye yazdırabiliriz. Örneğin 1.960 Volt gibi.
Iyi de biz sadece 5 volta kadar gosterdik voltajı bizim 9 voltluk batarya voltajını nasıl göstereceğiz? Biliyorsunuz 9 voltluk batarya voltajını 3’e bölmüştük bölücü direnç grubumuzla. Yani artık o 9 volt değil 3 volt ADC girişinde ve ADC bunu decimal 153 olarak kaydetti.
V = 153 x 196 = 29998 bu da eşittir 29998 / 10 = 2998 milivolt. Şimdi bunu dirençlerle 3’e böldüğümüze göre tekrar batarya voltajını elde etmek için 3 ile çarpmamız lazım. 2998 * 3 = 8994 milivolt bizim batarya voltajımıza karşılık gelen değerdir.Bu noktadan sonra gene PBPro’nun DIG komutu ile bu değeri hanelerine parçalayıp istediğiniz gibi gösterebilirsiniz veya batarya bitim noktasını kontrol etmek için kullanabilirsiniz.
Aşagıda bu yaptığımız işlemleri gösteren PBPro ornekleri:
—————————————————————————————
‘ADC portunu hazirla,bunu en basta bir kere yap:
TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %00000010 ' Set PORTA analog
TRISA = %0000001
PORTA = 0
—————————————————————————————-
‘8 bitlik olcme satiri:
Batt VAR Byte
ADCIN 0, Batt ' ADC0’i Batt ‘ a ata
—————————————————————————————
‘9 volt pil Voltaji donusturme matematigi:
‘Degisken Deklarasyonu
Volt VAR Word
V1 VAR Byte
V2 VAR Byte
V3 VAR Byte
Volt = Batt * 196 '5 Volt VDD icin
Volt = Volt / 10
Volt = Volt * 3
V1 = Volt1 DIG 3
V2 = Volt1 DIG 2
V3 = Volt1 DIG 1
Lcdout $fe, 1, "BATARYA VOLTAJI "
Lcdout $fe, $C0, #V1,".",#V2,#V3," VOLT"
Devre Şemasının PDF dosyasına ulaşmak için tıklayınız.
Başarılar,
Barbaros