22 Ağustos 2013 Perşembe

Arduino - LCD Ekran Uygulaması

LCD uygulamaları mikroişlemciler ile yapılan uygulamalar için önemli bir temel taş. Çünkü ölçülmesini istediğimiz (mesafe ölçümü,hız ölçümü vs.) birimleri aynı anda ekranda görebilme imkanımız bulunmakta.

Öncelikle LCD ekrandan bahsetmek istiyorum.Gereksiz bilgi ama açılımı Liquid-Cyrstal Display. Piyasada çok çeşidi var hatta Arduino için üretilmiş olanları bile var.Fakat ben LCD ekranımı Arduino'yu almadan çok çok önce aldığım için biraz farklı ve bağlantıları resimden de anlaşılacağı üzere biraz karmaşık oldu.







Bu karmaşıklığı LCD numaralarını göstererek daha basite indirgeyebiliriz. Yan tarafta LM016'nın numaralandırılmış hali var.Fakat sorunlar burda da bitmiyor. LCD üreticisi firmalar bu numaraları sıralı bir şekilde üretmeyebiliyor.





 Ben 1-16 arasında numaralandırılmış olan kısmı lehimleme tercihinde bulundum.

Ekran parlaklığını potansiyometre ile ayarlıcaz.Bunu da VDD-VSS arasında potansiyometre koyarak yapcaz. Yani LCD'nin 3 numaralı kısmı potansiyometrenin orta bacağına takılı olcak. 2 numara VDD ve potansiyometrenin uç bacağı, 1 numara VSS ve o da  potansiyometrenin diğer uç bacağına bağlı olacak.

LCD 4 numaralı pin data girişi yeri, 5 numaralı pin toprağa bağlı ekrana datayı yazacak ve 6 numaralı pin de sinyal aktifliği yeri.Daha çok bilgiyi aşağıdaki adresten LM016L'nin datasheetinden edinebilirsiniz.


http://pdf1.alldatasheet.com/datasheet-pdf/view/146552/HITACHI/LM016L.html



Kodlarımız;



#include <LiquidCrystal.h> // Kütüphane Gerekli
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Arduino pinleri LCD için

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 ilk sütununa.
  
lcd.print("arduinotik"); // İmlecten itibaren bu yazı yazılacak
  lcd.setCursor(0,1); // 2.satırın ilk sütunundayız şimdi de
  lcd.print("dunyasi"); // 2.satıra bu yazı yazılacak
  delay(15000); //Bu kısım LCD'lerin frekans çalışma aralığı yüzünden giriliyor.
}


Yüklediğim resim biraz karışık bunun için özür dilerim.O yüzden bağlantıları tek tek yazdım devrenin kurulumunun kolay olması için. LCD'nin pinlerini esas aldım.

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



24 Temmuz 2013 Çarşamba

Arduino - Analog Girişler (Voltmetre)

Hayatta herşeyin "1" ve "0" lardan oluşmadığından bahsetmiştik.Hayat analog değerlerle kaynıyor :D. Bu yazımda bunu daha iyi anlıcaz. Maksimum 5V'a kadar ölçüm yapabilen bir voltmetre yapıcaz.

Arduino analog girişleri 10bitliktir. 2^10= 1024 matematiksel hesabından, okunan her analog değer 1024 örneğe ayrılır.Bu ayrılan örneklere göre de okunma işlemi yapılır yani her değer 0-1023 değerleri ve bu değerler arasında ki en yakın tamsayı değerine atanır. Aslında daha önce bahsetmem gerekiyordu (Analog çıkışlarda) bu ADC olayından , geç kaldığım için özür dilerim.


Bizim analog gerilim değerimiz maksimum 5V  olacak. Bu 5V'luk değer 0-1023 değerleri arasında atanacak. Bu, seri haberleşme portunu kullanıp değer okurken küçük bir matematiksel formüle ihtiyacımız olacağını gösteriyor bize.



Öncelikle potansiyometrenin bir ucu 5V'ta, bir ucu toprakta, orta ucu da A1 pininde olmak üzere şekildeki gibi devremizi bağlıyoruz.Analog girişi üzerinde Analog yazan pinlerden yapıyoruz.



void setup ()
{ Serial.begin(9600);} //9600 baud hızında seri haberleşme komutu

void loop () {
int  analogdeger = analogRead(A1); //A1'den okunan analog değerleri atadık
  
  float gerilim = analogdeger * (5.0 / 1023.0);  // Bu kısmı aşağıda açıklıcam
  
  Serial.println(gerilim);  //Ekranda gerilim değerini gösteriyoruz.
  delay(50); //2 ölçüm arasında geçen zaman dilimi (ms)
  }


A1 pininden okunan değerler 0 ile 1023 arasında değişen değerler olacak. Temel Ölçme dersinde öğrendiğimiz analog ölçüm formülünü bu kısımda kullandık, kullandık ki seri haberleşme sayesinde ekrana yazdıracağımız değer volt biriminde olsun.

Gerilim = Okunan Skala Değeri x ( Maksimum Okunabilen Değer / Maksimum Skala )




Analog olarak değer okumak bizim için çok mühim  olacak çünkü aklıma gelen örnek Helikopterler,Multikopterler vb.  araçları kullanırken yapacağımız kumanda sistemlerinde kullanabiliriz bu analog değer okumayı.

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.




22 Temmuz 2013 Pazartesi

Arduino - Analog Çıkışlara Hükmetmek (PWM & Ledler)

Daha önce dijital çıkışlara hakim olmuştuk. "1" ve "0" mantığı ile ledimizi yakmış ve söndürmüştük.Fakat hayatta ki ölçülebilen değerler sadece "1" ve "0" lardan oluşmuyor. Bu yazımda analog çıkışlarla ilgili çalışma yapacağız. Arduino UNO ve türevleri bu özelliği barındırmakta.




Bu özellik elbette ki tüm çıkış pinlerinde yok. Üzerinde ~ işareti bulunan pinleri kullanırsak analog özelliğini de kullanabiliriz.

Dijital çıkışlarda " digitalWrite(10, HIGH ), digitalWrite(10, LOW) " komutunu kullanıyorduk. Çıkışımız ya "1" ya da "0" oluyordu. Analog özelliğini kullanabilmemiz için ise aşağıdaki komuta ihtiyacımız olacak.

analogWrite( )

Öncelikle devremizi aşağıdaki gibi kuruyoruz.Tabi siz isterseniz üzerinde "~" işareti bulunan herhangi bir pini de kullabilirsiniz.

Kodlar ve açıklaması :


int led=9;
  
void setup()
{
  pinMode(led, OUTPUT);

}
void loop()
{
  int parlaklik;
  {
  for (parlaklik=0;parlaklik<=255;parlaklik+=5)
  {analogWrite(led,parlaklik);
  delay(100);
  }
  for(parlaklik=255;parlaklik>=0;parlaklik-=5)
  {
    analogWrite(led,parlaklik);
    delay(100);
  }
}
}


  • 9. pinimizi çıkış olarak ayarladık
  • Parlaklık ismiyle integer bir değer okuttuk.Bu değerimiz analog çıkış almamızı sağlayacak.
  • 8 bitlik dijital değeri analog değere çevirmiş olduk 2^8=256 formülünden analog çıkışımız 0-255 arasında değişecek.
  • Biz bu değeri 5'er 5'er 255'e kadar arttırdık ve sonra da 255'ten 5'er 5'er azalttık.
  • Böylece analog olarak ledimizin parlaklığını arttırmış ve azaltmış olduk.




17 Temmuz 2013 Çarşamba

Arduino - Dijital Çıkışlara Hükmetmek (Led Yakma)

Elektronik dünyasına giriş için bir mikroişlemci seçmemiz gerektiğinden bahsetmiştim . Tercihimi Arduino UNO'dan yana kullandım. Elimde PIC programlayıcım var fakat hazır bir launchpadi olan Arduino ile bu dünyaya giriş yapmak bana daha cazip geldi. 

Ardunio, kodların yazıldığı sayfaya sketch adını veriyor yani karalama.Setup() ve Loop() bölümeri bu karalamalarda mutlaka olmak zorunda.

void setup ()
          { ilk değerler ve ilk başta bir kere çalışacak kodlar 
      }
         void loop() 
      {
// devamlı tekrarlanarak sırasıyla çalışacak  kodları burada yazıyoruz     } 

Bu yazımda Arduino'nun çıkışlarına led bağlayarak, bir kaç örnekle çıkışlara hükmedeceğiz.Yazımda yapacağımız uygulamalardaki malzemeler ise şunlar:

- 4 adet Led (Farklı renklerde olursa güzel olur.)
- Jumper Kablolar
- Direnç (İsteğe bağlı ben şahsen kullanmadım.)


Öncelikle her mikroişlemciye girişte olduğu gibi klasik bir giriş ile yani led flaşör ile giriş yapalım.

Launchpad 10.pinini çıkış olarak aldım ve oraya bir led bağladım. Dileyen ledin önüne direnç de koyabilir.

İsteğimiz şu olacak, led 1 saniye yanacak ve 1 saniye sönecek. Kodlar ve şeması;


void setup() {                
  // Pinler Çıkış olarak belirleniyor
  pinMode(10, OUTPUT);       // MAVI LED
}
void loop() {
  digitalWrite(10, HIGH);    // LED yanik
  delay(500);                // 500mS bekle 
  digitalWrite(10, LOW);     // LED sonuk
  delay(500);                // 500ms bekle

}







Biraz daha görsel tabiri caizse cix birşey yapalım :) . 4 adet ledi yanyana sırayla yakalım ve 4'ü aynı anda yanmadan hiçbiri sönmesin. Kodlar ve Şema :

int led1=7;
int led2=8;
int led3=9;
int led4=10;

void setup() 
{
  pinMode(led1, OUTPUT); //7.pin led1
  pinMode(led2,OUTPUT);  //8.pin led2
  pinMode(led3,OUTPUT);  //9.pin led3
  pinMode(led4,OUTPUT); //10.pin led4
}
int i;
void loop() {

 for(i=0;i<=1;i++) 
 {
   digitalWrite(led1,HIGH); //1.ledi yak
   delay(250);              // 0.25 saniye bekle
   digitalWrite(led2,HIGH); //2.ledi de yak
   delay(250);              // 0.25 saniye bekle
   digitalWrite(led3,HIGH); // 3.ledi de yak
   delay(250);              // 0.25 saniye bekle  
   digitalWrite(led4,HIGH); // 4.ledi de yak
   
 }
for(i=0;i<=1;i++) 
 {
   digitalWrite(led1,LOW); //1.ledi söndür
   delay(250);             //0.25 saniye bekle
   digitalWrite(led2,LOW); //2.ledi de söndür
   delay(250);             //0.25 saniye bekle
   digitalWrite(led3,LOW); //3.ledi de söndür
   delay(250);             //0.25 saniye bekle
   digitalWrite(led4,LOW); //4.ledi de söndür
   

}}

Videosunu şu linkten izleyebilirsiniz. 





Arduino ile güzel bir giriş yaptığımızı düşünüyorum ve umuyorum ki bu konuda daha hızlı ilerleyeceğiz.