Arduino Eğitim Kiti – Tüm Yıl İçin Arduino Müfredatı: Ders 31 İleri Düzey Uygulamalar/Kronometre Programı için isterseniz sunu şeklinde alt taraftaki kutucuğu büyüterek takip edebilir, isterseniz de tüm sunu sayfalarının makale haline dönüştürülmüş versiyonu takip edebilirsiniz. İçerikler büyük oranda aynıdır. Sınıf ortamında kolaylık olması açısından sunu şeklinde de sunulmuştur.

Ders İçeriği:

İleri Düzey Uygulamalar

Ders Kazanımları:

  • Joystick İle L9110 Fan Modülü Kontrolü programını yardım almadan başarılı bir şekilde tasarlar.
  • Kronometre programını yardım almadan başarılı bir şekilde tasarlar.

Oluşabilecek Hatalar:

Aşağıdaki programları çalıştırırken birtakım hatalarla karşılaşabilirsiniz. Bu hataların kodların yazımında meydana gelen hatalar dışında başka sebeplerle ortaya çıkması muhtemeldir. Bu hatalardan sık karşılaşılanlara aşağıda değinilmiştir.

Kart Seçilmesinden Kaynaklı Hata:

Arduino kurulumu gerçekleştirildikten sonra araçlar menüsünden doğru kartın seçilmesi gerekmektedir. Kart seçilmediğinde “Karta yüklenirken bir sorun oluştu.” benzeri bir hata alabilirsiniz.

USB Portun Seçilmesiyle İlgili Hatalar:

Arduino kurulumu gerçekleştirildikten sonra araçlar menüsünden doğru portun seçilmesi gerekmektedir. Bu port Arduino Uno’nun bilgisayara bağlandığı usb porttur. Farklı şekilde bilgisayarınızda usb driver yüklenmemiş olabilir. Bu gibi hatalarda “Port bulunamadı.” gibi hatalar almanız muhtemeldir.


Uygulama 1: Joystick Modül İle L9110 Fan Kontrolü

Kullanılacak Malzemeler:

Bağlantı Şeması:

Bağlantılar şekildeki gibi yapılır.

  1. Arduino üzerindeki 5V pini breadboard üzerinde “+” hatta, GND pini ise breadboard üzerinde “-” hatta bağlanır.
  2. L9110 Fan Modülünün VCC hattı “+” hatta, GND hattı “-” hatta, INA pini 5 nolu pine, INB 8 nolu pine bağlanır.
  3. Joystick modülün VCC pini “+” hatta, GND pini “-” hatta, VRx pini ise A0‘a bağlanır.

Kodlar:

Uygulamanın “.ino” dosyasını (kod dosyasını) buradan indirebilirsiniz.

int xPin = A0; // A0-A5 analog pinlerinden herhangi birine bağlanabilir.
int DIR = 8; // A0-A5 analog pinlerinden herhangi birine bağlanabilir.
int PWM = 5; // PWM PİNİ ARDUINO'nun 5 nolu PWM PININE
int xPozisyonu = 0; //
//int yPozisyonu = 0;
int bekleme = 0;
int durum=0;
void setup() {
Serial.begin(9600);
pinMode(xPin, INPUT);
//pinMode(yPin, INPUT);
pinMode(DIR, OUTPUT);
pinMode(PWM, OUTPUT);
}
void loop() {
xPozisyonu = analogRead(xPin); // A0'A BAGLI VRX PINI OKUNUYOR
durum = map(xPozisyonu,0,1023,0,255); // 0-1023 ARASINDA GELEBILECEK DEGERE KARSILIK 0-255 ARASI DEGER VERIR
bekleme = durum;
if(durum==128){ // JOYSTICK ORTA NOKTADA ISE
digitalWrite(DIR,LOW);
digitalWrite(PWM,LOW);
Serial.print("DURUM: ");
Serial.println("MOTOR DURUYOR");
Serial.print("Durum: ");
Serial.println(durum);
delay(1000);
}
else if(durum<128){ // ILERI HAREKETTE ISE
digitalWrite(DIR,HIGH);
analogWrite(PWM,bekleme); // PWM PININE BEKLEME SURESINDE TETIKLER (PWM SINYALI URETIR)
Serial.print("X Pozisyonu: ");
Serial.println(xPozisyonu);
Serial.print("BEKLEME SURESI: ");
Serial.println(bekleme);
Serial.print("durum: ");
Serial.println(durum);
}
else if(durum>128){ // GERI HAREKETTE ISE
digitalWrite(DIR,LOW);
analogWrite(PWM,bekleme); // PWM PININE BEKLEME SURESINDE TETIKLER (PWM SINYALI URETIR)
Serial.print("X Pozisyonu: ");
Serial.println(xPozisyonu);
Serial.print("BEKLEME SURESI: ");
Serial.println(bekleme);
Serial.print("durum: ");
Serial.println(durum);
}
}

  • Yukarıdaki bağlantı yapıldığında ve kodlar Arduino Uno’ya yüklendiğinde çalışma tamamlanmış olacaktır.
  • Bu uygulamada Fan Modülü’ nün hızını Joystick Modül ile kontrol edebilirsiniz.
  • Ayrıca fanın hareket yönünü, Joystick Modülü ileri geri hareket ettirerek belirleyebilirsiniz.

Uygulama 2: Kronometre

 

Kullanılacak Malzemeler:

Bağlantı Şeması:

Bağlantılar şekildeki gibi yapılır.

  1. Arduino üzerindeki 5V pini breadboard üzerinde “+” hatta, GND pini ise yine breadboard üzerinde “-” hatta bağlanır.
  2. LCD ekranın 4 pini aşağıdan yukarı doğru sırasıyla, breadboard üzerinde “-” hatta, breadboard üzerinde “+” hatta, A4 pinine ve A5 pinine bağlanır.
  3. Buton şekildeki gibi breadboard üzerine yerleştirilir. Bir bacağına direnç şekildeki gibi bağlanır. Direncin boşta kalan bacağı “-” hatta, diğer bacağı 7 nolu dijital pine bağlanır. Butonun boşta kalan bacağı ise “+” hatta bağlanır.

Kodlar:

Uygulamanın “.ino” dosyasını (kod dosyasını) buradan indirebilirsiniz.

/*Tur zamanlarını kaydedebilen kronometre devresinin arduino programıdır.
* Mekanik bir buton yardımıyla kronometre başlatılır durdurulur ve resetlenir.*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int butonPin=7;//Butonun bağlanacağı pin numarası
long tBaslangic=0;//Kronometre ilk başlatıldığında millis()
//sayacı bu değişkene kaydedilir.Program süresince
//bu değer referans alınarak süreler hesaplanır.
int durum=0;/*Kronometrenin başlangıç konumunda mı, ilerliyor mu yoksa durdurulmuş
mu olduğunu ifade eden durum numarası bu değişkende tutulur. Durum 0 ise
kronometre başlangıç için 00:00:00 konumdadır ve başlamaya hazırdır.
Durum 1 ise kronometre başlatılmış ve ilerliyordur, bu aşamada tur
zamanları kayıt edilebilir ve bir daha butona basıldığında kronometre duracaktır.
Durum 2'de ise butona basılmış süre durdurulmuştur, bu durumda
kaydedilen tur süreleri incelenebilir, kronometre butna basıldığı takdirde sıfırlanacaktır.*/
int secmebutonu=0;//Bounce etkisi giderildikte sonra butonun durumunun tutulduğu değişken
int secmebutondurumu=0;//Butona basıldığında bir önceki anda butonun hangi durumda olduğunu gösteren değişken
long anlikSure=0;//İstenilen andaki sürenin kaydedildiği değişken
int sonOlculenSure=0;//Tur zamanı kaydedilirken kullanılacak olan bir değişken
void setup() {
pinMode(butonPin,INPUT);
lcd.begin();
lcd.print("Butona Basiniz");
while(!digitalRead(butonPin));
lcd.clear();
}
void loop() {
//Bounce etkisinin giderildiği kısım
if(digitalRead(butonPin)==HIGH){
if(durum==0){ //durum 0 olduğu takdirde başlangıç süresi referans olarak tBaslangic'a kaydedilir.
tBaslangic=millis();}
delay(30);
if(digitalRead(butonPin)==HIGH){secmebutonu=1;}
}
else{secmebutonu=0;}
//"durum" değişkeninin içeriğine göre yapılacak işlemler switch/case yapısı ile belirlenir.
switch(durum){
//0 durumunda yapılacak işlemler buradadır.
case 0:
if(secmebutondurumu==0 && secmebutonu==1){//Daha önce basılmıyor iken şuanda butona basılmışsa yapılacak işlemler bu if fonksiyonun altındadır.
anlikSure=millis()-tBaslangic;//Anlık süre millis() program süre sayacının, başlangıç süresinden çıkarılması ile bulunur.
SureGoster(anlikSure,0,0);//Anlık süre süre gösterme fonksiyonuna kursör koordinatlarıyla birlikte girilir ve lcd'ye yazdırılır.
durum=1;//durum 1 yapılarak bir sonraki duruma geçilir.
secmebutondurumu=1;
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
//Bu koşullar altında kronometre başlangıç koşulunda saklanır.
secmebutondurumu=0;
break;
//1 durumunda yapılacak işlemler buradadır.
case 1:
if(secmebutondurumu==0 && secmebutonu==1){//Daha önce basılmıyor iken şuanda butona
//basılmışsa yapılacak işlemler bu if fonksiyonun altındadır.
anlikSure=millis()-tBaslangic;
SureGoster(anlikSure,0,0);//Basılan andaki süre son kez lcd'ye yazılır ve süre duruyor ilen bu hep kalır.
secmebutondurumu=1;
durum=2;//durum 2 yapılarak bir sonraki duruma geçilir.
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
secmebutondurumu=0;
anlikSure=millis()-tBaslangic;
SureGoster(anlikSure,0,0);}//Süre ilerliyor iken butona basılmadığı takdirde
//program sürekli buradan geçerek yeni süreyi gösterir
break;
//2 durumunda yapılacak işlemler buradadır.
case 2:
if(secmebutondurumu==0 && secmebutonu==1){//Süre durmuş iken butona bir daha basıldığında
//yapılacak işlemler bu if fonksiyonun altındadır.
lcd.clear();//LCD ekranı temizlenir.
lcd.setCursor(0,0);
lcd.print("Kronometre icin");
lcd.setCursor(0,1);
lcd.print("butona basiniz");
while(digitalRead(butonPin));
durum=0;//Durum 0'lanır
secmebutondurumu=1;
sonOlculenSure=0;
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
//Süre durmuş iken ve butona basılmıyor iken bu kısım gerçekleştirilir.
secmebutondurumu=0;
}
break;
}
lcd.clear();
}
}
/*Bu fonksiyon program boyunca milisaniye olarak kaydedilen değeri uygun bir şekilde kronometre
(Dk:Sn:Sl) formatına dönüştürür, girilen kursör satır ve sütun
bilgisine göre istenilen yere yazdırır.Süre ilk olarak 10'a bölünerek saliseye çevirilir.
Salise olarak kaydedilmiş toplam sürenin mod 100'ünü alırsak gereken
salise hanesini elde ederiz. Mod 6000'nini alıp 100'e bölersek sayının 0'dan sonraki kısmı
tabana yuvarlanacağı için saniye hanesini, aynı şekilde toplam
süreyi 6000'e bölersek de dakika hanesini bulmuş oluruz. Her haneyi 10'a böldüğümzde onlar
basamağını, her hanenin mod 10'unu alırsak da birler basamağını
buluruz. Bu şekilde her karakteri tek tek lcd'ye kolayca yazdırabiliriz.*/
void SureGoster(long sure,int kursorSutun,int kursorSatir){
sure=sure/10;
int salise=sure%100, saliseOnlar=salise/10, saliseBirler=salise%10;
int saniye=(sure%6000)/100, saniyeOnlar=saniye/10, saniyeBirler=saniye%10;
int dakika=sure/6000, dakikaOnlar=dakika/10, dakikaBirler=dakika%10;
lcd.setCursor(kursorSutun,kursorSatir);lcd.print(dakikaOnlar);
lcd.setCursor(kursorSutun+1,kursorSatir);lcd.print(dakikaBirler);
lcd.setCursor(kursorSutun+2,kursorSatir);lcd.print(":");
lcd.setCursor(kursorSutun+3,kursorSatir);lcd.print(saniyeOnlar);
lcd.setCursor(kursorSutun+4,kursorSatir);lcd.print(saniyeBirler);
lcd.setCursor(kursorSutun+5,kursorSatir);lcd.print(":");
lcd.setCursor(kursorSutun+6,kursorSatir);lcd.print(saliseOnlar);
lcd.setCursor(kursorSutun+7,kursorSatir);lcd.print(saliseBirler);
}

  • Yukarıdaki bağlantı yapıldığında ve kodlar Arduino Uno’ya yüklendiğinde çalışma tamamlanmış olacaktır.
  • Bu uygulamada butona basıldığında LCD ekranda kronometre saymaya başlayacaktır.
  • Tekrar basıldığında kronometre duracak ve hesaplanan süreyi gösterecektir.
  • Butona tekrar basıldığında kronometre başa dönecektir.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz