mikroişlemci etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
mikroişlemci etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

15 Mart 2014 Cumartesi

Arduino - LM35 Sıcaklık Sensörü ve LCD ile Termometre Uygulaması


Bu yazımda geçen yazıda yaptığımız termometre uygulamasında kullandığımız seri haberleşme yerine LCD ekranı kullanarak yine aynı projeyi yaptım.

Bu projeyi PCB karta işlerken elbette seri haberleşme portu yerine portatif olan LCD'yi kullanmak durumunda kalırız. Bu yüzden LCD'yi de öğrenmek mühim. Zaten Seri Haberleşmeyi tam olarak öğrenebilirsek LCD'yi de kullanmak zor olmayacaktır.

Burda sadece LCD Ekran kullanımı ve LM35 Termometre projelerini birleştirdim ve aşağıdaki kodu koştum. LCD Bağlantılarını tekrar yazacağım uğraşmak istemeyenler için :).








LCD'nin
1 - VSS (Toprak)
2-  +VDD
3-  Potansiyometrenin Ortası
4-  Arduino 7.pinine
5-  Toprak
6-  Arduino 8.pinine

11- Arduino  9.pinine
12- Arduino 10.pinine
13- Arduino 11.pinine
14- Ardunio 12.pinine
15- +VDD   
16-  Toprak

***Şemada 15. ve 16.pinlerin yerlerini ters yazmışım çok özür diliyorum. 15 VDD, 16 Toprağa bağlı olmalı. Potansiyometrenin



Sağ Bacak Toprak, Sol Bacak +VDD

Kodlarımız :

#include <LiquidCrystal.h> // Kütüphane Gerekli
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Arduino pinleri LCD için
float sicaklik; //Analog değeri dönüştüreceğimiz sıcaklık 
float analoggerilim; //Ölçeceğimiz analog değer

void setup(){
  lcd.begin(16,2); 
}

void loop(){
  lcd.clear(); 
  lcd.setCursor(0,0); //komutu ile imleci istediğimiz karakter kutusunda konumlanmasını sağlıyoruz.İlk satırın 6.sütununa.
  analoggerilim = analogRead(A1); //A1'den değeri ölç
  analoggerilim = (analoggerilim/1023)*5000;//değeri mV'a dönüştr 
  sicaklik = analoggerilim /10,0; // mV'u sicakliğa dönüştür

  lcd.print("Sicaklik Degeri"); // İmlecten itibaren bu yazı yazılacak
  lcd.setCursor(0,1); // 1.satırın ilk sütunundayız 
  lcd.print(sicaklik); // Ardndan Bu değişken değer yazılacak
  lcd.print(" Derece"); //Değer ardından da bu yazı yazılacak
  lcd.setCursor(1,7);  //Derece yazısının yeri (2.satır,7.sütun)
  delay(1000); //Bu kısım LCD'lerin frekans çalışma aralığı yüzünden giriliyor.

}


Videomuz :








11 Mart 2014 Salı

Arduino - Matematiksel İşlemler

Arduino matematiksel işlemler yapmak için matematiksel operatörleri kullanır. Bu operatörleri birlikte kullanarak karmaşık matematik işlemleri, arduinoya yaptırabilir sensörlerden elde ettiğimiz değerleri(V,mV) istediğimiz değerlere çevirebiliriz (K,C,metre vs.). 

Bu operatörlere örnek vermek gerekirse,

c= a + b  //  a değeri ile, b değerini toplayıp c değerine atar.
c= a - b  //  a değerinden b değerini çıkartıp c değerine atar.
c= a * b  //  a değeri ile, b değeriniçarpıp c değerine atar.
c= a / b  //  a değerini  b değerine bölüp c değerine atar.
c = a%b //  a değerinin b ye bölümünden kalanı c değerine atar, bu ifadeyi kullanmıştık.


Ledlerin veya butonların hangi pinlere bağlı olduğunu belirtmek için int değerini kullanmıştık.
Bu int değeri bizim belirttiğimiz sayının veya çıkışın tamsayı istendiği anlamına gelmekte.


Eğer bu istenen çıkışın veya girişin ondalık sayı olması isteniyorsa değer int olarak değil float ile girilir. Örneğin ;

int a=5;
float b=5,6;
float c=a+b;
int d= a+b;

Burda sadece olayın nasıl işlediğini anlatmak istiyorum yoksa bu kodlar direkt çalışmaz elbette ki :).

Sonuçlarda  float olarak girilen c değeri 10,6, int olarak girilen d değeri de 11 olarak çıkar.

ÜS Alma işlemi x üssü alınacak sayı, n üs olmak üzere;

 pow(x,n)   olarak alınır.

KAREKÖK alma işlemi x sayısı için de ;

 sqrt(x)           olarak alınır.

MUTLAK  değer alma işlemi yine x sayısı için;

 abs(x)       olarak alınır.

TRİGONOMETRİK ifadeler de  x RADYAN olmak üzere ;

sin(x),cos(x),tan(x) gibi bizim bildiğimiz ifadelerle alınabilir.


NOT : Genellikle radyan değerlerle değil açılarla direktman çalıştığımız için açıları otomatikman radyana çevirebiliriz. Bunun için arduinoda tanımlı DEG_TO_RAD ifadesini kullanabiliriz. Örnek vermek gerekirse açıyı dışardan okuduğumuzu farz edelim ve bunun karesini alalım. aci_d ifadesi dışardan okunuyor olsun.

aci_r = aci_d * DEG_TO_RAD;

y= pow(aci_d,2);

Bu kod ile açı olarak okunulan aci_d ifadesi radyana dönüştürülmüş olur.


BÜYÜK ve KÜÇÜK Olanı Bulma;

x ve y kıyaslanan 2 değer olsun,

max(x,y); // büyük olan hangisiyse çıkış o olur.

min(x,y); // küçük olan hangisiyse çıkış o olur.

7 Mart 2014 Cuma

Arduino - Buton ile Çıkışları Değiştirme

Butonların öneminden daha önceki yazımda bahsetmiştim. Burada da yine bir öncekine benzer bir uygulama yapacağız. Bu uygulamanın yapılış amacını aslında 7 segment display uygulamalarına giriş için yaptığımızı düşünebiliriz.

Kısaca uygulamadan söz etmek gerekirse amacımız burda 1 sayısal giriş ile  2 sayısal çıkışı yönetmek olacak. Butona her bastığımızda çıkışın yeri değişecek. Yani çıkış olarak kullandığımız yeşil ve turuncu ledleri sırayla butona basarak yanmasını sağlayacağız.

Bu uygulamaya geçmeden önce size aritmetik bir operatör olan " mod " almayı anlatacağım.

Arduino'da ve bir çok C tabanlı dilde mod  " % " ifadesi ile alınmakta. Yani biz herhangi bir integer değerin herhangi bir sayı modunda almak istersek şu şekilde kullanmamız gerekiyor.



Integer değeri= sayi , mod=5 olsun;

" sayi%5 " 

Uygulamamızda  bu kavramın daha iyi anlaşılacağını düşünüyorum.

int led1=8;  //yeşil led
int led2=7;  //turuncu led
int buton=4;
int ledsirasi=0; //modunu alacağımız sayi

void setup () {
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(buton,INPUT_PULLUP);}
  
void loop () {
    int butondurumu=digitalRead(buton);
    if (butondurumu==0)
    {ledsirasi=ledsirasi+1;}
    
    if (ledsirasi%2==0)
    {digitalWrite(led1,HIGH);
     digitalWrite(led2,LOW);}
     else
     {digitalWrite(led2,HIGH);
     digitalWrite(led1,LOW);}
     
     delay(100);
}

Programda çıkışları seçmeyi (aslında 1 olanı seçmeyi) mod2ye bağlı olarak ledsirasi integer değerine göre seçtim. ledsirasi 0'dan başlamak üzere her butona basıldığında 1 artacak ve mod2ye göre de ya "1" ya da "0" olacak. Buna göre de ya yeşil led ya da kırmızı led in yanması sağlanmış olacak.




Bir sonraki uygulamamızda 7 segmentli gösterge ile 0-9 arası sayıcı yapacağız. Daha önce CMOS 4026 entegresi ile hazır olarak bunu yapmıştım bu sefer arduinoyu kendimiz programlayarak bunu yapacağız.









24 Temmuz 2013 Çarşamba

Arduino - Dijital Girişler (Butonlar)

Butonlar mikroişlemcilerle yapılan her proje önemli elemanlardır. Yazılan programları çalıştırmada ya da çalışan programlara anında müdahele için butonlar kullanılmaktadır. Açıkçası yazılan program sonrası uygulamaya geçildiğinde ve butona basıldığında bir led in yanması bile ayrı bir zevk veriyor insana :).

Butonlar önemli çünkü mikroişlemciler ile yapacağımız herhangi bir robotik uygulamada, robota bu butonlar sayesinde yön verme gibi bir seçeneğimiz bulunmakta. Oyuncak arabalar için git/gel komutları gibi.

Arduino'dan önce kullanmış olduğum MSP430 Launchpad üzerinde kendi butonu bulunmaktaydı ve geriye sadece onu programa okutmak kalıyordu. Arduino UNO'da sadece reset butonu olduğu için bu butonu kendimiz harici olarak eklicez.





Butonu  şemada görüldüğü gibi +Vin ile toprak arasına  bir direnç ile birlikte bağlıcaz.


Arduino, PC ile seri haberleşme yapabilme özelliğine sahip bir mikroişlemci. Arduino programının üst menüsünde bulunan Tools kısmından Serial Monitor yazan yere tıklarsak seri haberleşmeyi gösterecek olan pencereyi görebiliriz. Elbette ki bu seri haberleşmeyi kullanmamız için gereken bir komutumuz olacak.Bir kez kullanacağımız için bu komutu void setup() içerisinde kullanıcaz.

Serial.begin(9600);

Şemamızdaki devreyi kurduktan sonra aşağıdaki komutları yükleyebiliriz artık mikroişlemcimize.

int buton = 2; // 2.pini isimlendirdik

void setup() {

  Serial.begin(9600); //9600 baud hızında seri haberleşme için
  
  pinMode(buton, INPUT_PULLUP); // 2.pinin giriş olduğunu belirttik
}

void loop() {
  
  int butondurumu = digitalRead(buton); //buton durum adında integer bir değeri programa okuttuk ve bunu da butonun durumu olarak belirledik (1 ya da 0)
  
  Serial.println(butondurumu); // Seri Haberleşme ile butonun durumu ekrana yansıtılıyor.
  delay(20);     // değer okunurken 2 değer arasında ki süre ms.   
}


INPUT_PULLUP komutunu kullandım çünkü sadece INPUT komutunu kullandığımda buton değerleri saçmaladı biraz. INPUT_PULLUP komutunu kullandığımda sonuçlarım daha sağlıklı oldu.

Mikroişlemcilerin tipine göre butonların okunması farklılık gösterebiliyor. Arduino'da butona bastığımızda "0", basılmadığında "1" sonucunu alıyoruz.


Seri haberleşme özelliği sayesinde butonun durumunu ekranda görebiliyoruz. 0 ise basılı , 1 ise basılı değil.

Küçük bir uygulama yapalım şimdi. Bir portu input, başka bir portu output olarak kullanalım. Çıkışa led bağlayalım,butona bastığımızda led yansın diğer koşulda da sönük halde kalsın. Devremizi aşağıdaki gibi bağlayalım.

2.pine buton, 4.pine de led bağladık.Komutlar :

int buton = 2; //buton'a 2 sayısı atandı

void setup() {
  
  Serial.begin(9600);  //Seri Haberleşme Kodu
  pinMode(buton, INPUT_PULLUP); //2.pin giriş oldu
  pinMode(4, OUTPUT); //4.pin çıkış oldu
}
void loop() {


  int butondurumu = digitalRead(buton); // butondan okunan sonuç butondurumuna atandı

     
  delay(20);     
  if (butondurumu == 0)
{ digitalWrite (4, HIGH);        
Serial.println("LED YANDI");}   //buton basılıysa led yanık halde                                 // ve ekrana yansıtılıyor
  else
  {digitalWrite (4, LOW);
Serial.println("LED SONDU");}   //buton basılı değilse led sönük halde ve ekrana yansıtılıyor
}


Videosu da burda.