adım adım arduino projeleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Merhabalar arkadaşlar,
Önceki yazılarımızda lcd konularına girmiş, örnekler vermiş ve lcd kütüphane fonksiyonları üzerinde durmuştuk.Bu yazımıza ise grafik lcd ler üzerinde duracağız.

Daha önce kullanmış olduğumuz lcd ekranlar 2 satır içerirken grafik lcd ekran ise daha fazla piksel ile bize hizmet sunmaktadır.Üzerinde barındırdığı her bir piksel ile bize kullanıcı arayüzümüz için bir tuval olmaktadır.

Bu projemizde samsungun KS0108 GLCD sini kullanacağız.

Arduino ide tarafında yapmamız gereken arduino sitesine giderek GLCDks0108 kütüphanesini ide mize eklemek.

Peki bu kütüphane bizlere hangi fonksiyonları sağlar ?

Init(bool inverted): kütüphanemizi başlamaya hazır hale getirir.

ClearScreen() : grafik lcd ekranı tamamen temizler

DrawBitmap(bitmap,int x,int y,color) : x ve y koordinatları ile belirtilen noktaya bitmap uzantılı resmi ekler

SelectFont(font) : önceden tanımlı olan fontlar arasından seçim yapmamıza olanak tanır

PutChar(char c) : işaretçinin son kaldığı noktaya karakter yazdırır

GotoXY(int x, int y) : işaretçiyi x ve y ile belirtilen koordinata çeker

PrintNumber(long n) : ekranda son kalınan noktaya sayı yazdırır.

Puts(string t) : ekranda son kalınan noktaya string yazılmasını sağlar

DrawLine(int x1,int y1,int x2, int y2, color) : x1 y1 ve x2 y2 koordinatları başlangıç ve bitiş noktaları olacak şekilde ekrana çizgi çeker

DrawVertLine(int x,int y,long length , color) : x ve y koordinatıdan başlayarak length kadar uzunlukta bir dikey çizgi çeker

DrawHoriLine(int x,int y,long length , color) : x ve y koordinatıdan başlayarak lenght kadar uzunlukta yatay bir çizgi çeker

DrawRect(int x, int y, int width, int height) : x ve y koordinatlarından başlayarak width ile verilen genişlik ve height ile verilen yükseklikte bir dikdörtgen çizer

InvertRect(int x, int y, int width,int radius, int height) : x ve y koordinatlarından başlayarak widht ile verilen genişlik ve height ile verilen yükseklik kadar dikdörtgen alanın piksellerini tersine çevirir.

DrawRoundRect(int x, int y, int width, int height, color) : x ve y koordinatlarından başlayarak width ile verilen genişlik ile height ile verilen yükseklik kadar bir dikdörtgen çizer.Ancak verilen radius kadar dikdörtgenin köşelerini ovalleştirir.

FillRect(int x, int y, int width, int height, color) : x ve y koordinatlarından başlayarak width ile verilen genişlik ve height ile verilen yükseklik kadar alanı dikdörtgen şeklinde doldurur.

DrawCircle(int x, int y, int radius, color) : Dairenin merkezi x ve y ile verilen koordinatlarda yer alacak şekilde ve radius ile belirtilen yarıçapta bir daire çizer

SetDot(int x, int y, color) : x ve y koordinatları ile verilen tek bir pikseli doldurur

Bu devrede kullanacağımız malzeme listesi : 

1 adet arduinı mega
1 adet glcd
1 adet parlaklık ayarı için potansiyometre
1 adet 10k ohm direnç fazla akımı engellemek için

Gelelim devre şemamıza



Gelelim Ardunino kodlarımıza

#include <ks0108.h>

int x=0;  // x eksen koordinatımızı sıfırladık
int y=0; // y eksen koordinatımızı sıfırladık

void setup ()
{
    GLCD.Init(NON_INVERTED); // grafik lcd mizi beyaz bir şekilde başlattık
    GLCD.ClearScreen(); // başlamak için lcd mizi önce temizledik
}
void loop()
{
    GLCD.DrawCircle(63,31,5,BLACK); // 63-31 merkezli 5 yarıçaplı siyah bir daire çizdik
    delay(1000); // 1 sn kadar gecikme
    GLCD.ClearScreen(); // ekranı temizledik
    GLCD.DrawRoundRect(30,30,20,20,5,BLACK); //sol alt köşesi 30-30 koordinatında 20 genişlik ve 20 uzunlukta ve herbir köşesi 5 birimlik ovalleştirilmiş bir siyah dikdörtgen çizdirdik
    delay(1000); // 1 sn lik gecikme
     GLCD.ClearScreen(); // ekranı temizledik
     GLCD.FillRect(30,30,30,10,BLACK); // 30-30 koordinatına 30 genişlik 10 yüksekliğe sahip içi siyah dikdörtgen çizdirdik
    delay(1000); // 1 snlik gecikme
     GLCD.ClearScreen();// ekranı temizledik
   
}

Yukarıdaki örnekte sırası ile ekrana daire ,oval köşeli dörtgen ve içi siyah diktörgen sırası ile 1 er sn aralıkla çizdirelecek ve her sekil arasındaki 1 sn lik zaman aralığından sonra ekran temizlenecektir.
Merhabalar,
Bir önceki yazımızda arduino ile paralel olarak lcd kontrolü ve kütüphanesinden bahsetmiştik.
Bu yazımızda ise seri ve paralel kontrolün farkından ve seri olarak lcd ekranın kontrol edilmesinden bahsedeceğiz.

Nedir paralel ve seri lcd kontrol arasındaki farklılıklar ?

Paralel olarak lcd ekran kontrolünde hatırlarsanız lcd ekrana veri gönderimi için 4 adet pin kullanmıştık ve bu 4 adet pin üzerinden verilerimizi ekrana göndermiştik.Seri ekran kontrolü sırasında ise arduino ile seri haberleşebilen lcd ekran arasında aynı hat üzerinde bitlik seriler halinde haberleşme sağlanır.Böylece arduino pinlerinden tasarruf sağlanmış olur.

Arduino ide bize serLcd kütüphanesi ile seri olarak lcd ekran kontrolü sağlamamızı sağlamaktadır.İsterseniz bu kütüphanenin bize sunduğu fonksiyonları ele alalım.

serLCD(int pin) : pin ile tx pinini tanımlıyoruz ve seri ekranı bu pin ile birlikte belirtiyoruz.

clear() : ekran üzerindeki tüm verileri temizler

clearLine(int satır) : int ile belirtilen satırı temizler

selectLine(int satır) : işaretçimizi satır ile belirliediğimiz konuma getirir

setBrightness(int deger): lcd ekranın kontrast değerini deger ile int olarak vermemizi sağlar

home(): işaretçinin lcd ekran üzerinde sol en üst köşeye gelmesini sağlar

print(data): Verinin ekrana bastırılmasını sağlamaktadır

setSplash(): ilk 2 satırı ekranın başlangıç ekranı olarak atar.

toggleSplash(): splash ekranı aktif ya da deaktif etmemize olanak tanır

leftToRight(): ekranda veri akışının soldan sağa doğru olacağını belirtmeye yarar

rightToLeft(): ekranda veri akışının sağdan sola doğru olacağını belirtmeye yarar

blink(): işaretçinin ve üzerinde olduğu karakterin yanıp sönmesine olanak tanır

noBlink(): işaretçinin yanıp sönmesini engeller

cursor(): işaretçinin yerini belirtir.İşaretçinin üzerinde bulunan karakter altında alt çizgi belirir

noCursor(): işaretçinin gizlenmesine olanak tanır

display(): ekranı açar.Son olarak kalan veri tekrar ekrana gelir

noDisplay(): ekranı kapatır ve ekranda son olarak kalan veri display fonksiyonu için kayıt altına alınır

setCursor(int satır,int sütun): işaretçiyi satır ve sütun numarasına götürür

Örnek uygulamamızda seri olarak lcd ekran kullanımın yanı sıra lcd ekran üzerinde sıcaklık sensöründen almış olduğumuz verileri ekrana yazdıracağız.



DS18B20 sıcaklık sensörü üzerinde dijital olarak alacağımız sıcaklık verisini lcd ekran üzerine bastıracağız.


Gelelim kodlarımıza :

#include <SoftwareSerial.h>// yazılımsal olarak seri pin kütüphanemizi ekliyoruz
#include <serLCD.h>// seri lcd ekran kütüphanemizi ekliyoruz
#include <OneWire.h>// Sıcaklık sensörü ile tek hat üzerinden haberleşeceğiz
#include <DallasTemperature.h>// kullanacağımız sıcaklık sensörü kütüphanesi

serLCD ekran(12); // lcd ekranı tanımladık ve bunu 12 nolu pin üzerinden haberleşeceğimizi belirttik
OneWire oneWire(ONE_WIRE_BUS); // tek hat haberleşme belirttik
DallasTemperature sensor(&oneWire);// sıcaklık sensörünü belirledik ve bunu tek hat haberleşmeye bağladık

void setup(void)
{
   Serial.begin(9600);// 9600 baudrate ile seri haberleşme başlattık
   sensor.begin();//tek hat üzerinden haberleşeceğimiz sensörü başlattık
   ekran.clear(); // ekranımızı temizledik
}

void ekrana_sıcaklık_bastır() // tek hat üzerinden sıcaklık bilgisi almak için fonksiyon tanımladık
{
   ekran.clear();// lcd ekranı temizledik
   float sıcaklık=sensor.getTempCByIndex(0);// float küsürlü olarak santigrat değeri olarak sıcaklığı aldık
   ekran.setCursor(0,0);// işaretçiyi 0. satır ve 0. sütuna yani sol en üst köşeye aldık
   ekran.print("sıcaklık =");// ekranın başına sıcaklık= stringini bastırdık
   ekran.print(sıcaklık,1);//aldıgımız sıcaklık degerini ekrana ekledik
}

void loop()
{
   sensor.requestTemperatures();// sensörden sıcaklık verisi talep ettik
   ekrana_sıcaklık_bastır();// aldığımız sıcaklık verisini ekrana yazdırdık
   delay(2000);// her sıcaklık yazdırmamız arasına 2 sn lik gecikme verdik
}

Bir sonraki yazımızda grafik lcd kontrolü ile yeniden karşınızda olacağız.
Merhabalar,
Adım adım arduino derslerimizde bu yazımızda arduino ile lcd ekran sürme işleminden bahsedeceğiz.
Arduino Ide içerisinde lcd ekranları sürmemizi sağlayan liquidcrystal lcd kütüphanesi bulunmakadır.
Peki bu kütüphane bize neleri sağlamakta ve hangi fonksiyonları barındırmaktadır? isterseniz buna bir gözatalım

begin(int kolon,int sıra) : begin fonksiyonu bizim ne kadarlık bir lcd kullanacağımızı programsal olarak tanımlamamıza olanak tanır.Kullandığımız lcd kaç satır ve sütunu destekliyorsa kolon ve sıra ile bunu belirtmemiz gerekmektedir.

clear() : ingilizcesinden de kolayca anlaşılabileceği üzere lcd ekran üzerinde herşeyi temizleyen fonksiyonumuz

home() : lcd ekran üzerinde işaretçinin lcd ekranın başlangıç noktası yani en yukarı ve sol köşesine gitmesi sağlar

setCursor(int kolon,int sıra): işaretçimizin fonksiyon içerisinde girilmiş olan kolon ve sıra numarasına ilerlemesini sağlar

write(byte değer): işaretçini lcd ekran üzerinde bulunduğu yere değeri yazdırmaktadır.Burada değer 1 adet karakteri yani char belirmektedir.

print(veri): ekrana string olarak veri değerini yazdırmaya yarayan fonksiyonumuz

cursor(): işaretçinin altında çizginin belirlemesini sağlamaktadır.

noCursor(): işaretçinin ekran üzerinde görünmemesini sağlar.

blink(): işaretçinin yanıp sönmesine olanak tanır.

noBlink(): işaretçinin yanıp sönmesini iptal eder

display(): ekranın kapanmasını sağlayan noDisplay fonksiyonun tersini sağlayarak ekrana verilen son verinin geri getirilmesini sağlar

noDisplay(): ekranı kapatma fonksiyonudur.

scrollDisplayLeft(): ekrandaki veriyi bir karakter boşluk ile sola kaydırır

scrollDisplayRight(): ekrandaki veriyi bir karakter boşluk ile sağa kaydırır

autoscroll():her karakter girildiğinde otomatik olarak önceki karakteri sola ya da sağa kaydırır

noAutoscroll(): otomatik scroll komutunu devre dışı bırakır.

leftToRight(): verinin ekrana soldan sağa doğru akacak şekilde yazılmasını sağlar

rightToLeft():verinin ekrana sağdan sola doğru akacak şekilde yazılmasını sağlar

Fonksiyonlarımızı inceledikten sonra gelelim lcd ekranımızı nasıl arduinomuza bağlayacağımıza

şemada 68 ohm değerindeki direnç lcd ekranımızın arduino üzerinden çekilen akımını sınırlamak için kullanılmıştır.

Yukarıda arduino ile lcd ekran arasındaki bağlatı noktaları listenmiştir.Burada dikkatinizi çekeceği üzere arduino üzerinden veriler 4 bit olarak ekrana gönderilmektedir ve db4-7 üzerinde arduinonun d2-5 arasında bağlantı sağlanmıştır.Potansiyometre lcd ekranımızın kontrast yani netleğini ayarlamak amacı ile devreye eklenmiştir.


Gelelim arduino kodlarımıza

#include <LiquidCrystal.h> // lcd kütüphanemizi ekledik

LiquidCrsytal lcd(12,11,5,4,3,2); // lcd ekranımızın bağlantı noktalarını tanımladık 12,11 register ve enable pinleri iken 5-2 pinleri ise data pinlerimiz

void setup()
{
   lcd.begin(16,2);// lcd ekranımızın 2 satırlık ve 16 sütunluk olduğu programa belirtiyoruz
   lcd.print("Arduino");// lcd ekranın en üst sol köşesinden başlayarak arduino yazdırdık.
   lcd.setCursor(0,1);// lcd ekran üzerinde işaretçimizi 2. satır ve 0. sütuna yani 2. satır başlangıcına çekiyoruz
   lcd.print("LCD display");// 2. satırımıza verimizi yazdırdık.
}
void loop()
{
}

Bu yazımızda sizlerle paralel bağlantılı lcd ekranların arduino ile kullanımından bahsettik.Bir sonraki yazımızda seri olarak haberleşen lcd ekran ile uygulama üzerine sizlerle birlikte olacağız.

Merhabalar arkadaşlar,
Bu yazımızda ultrasonik sensörlerden ve bu sensörlerin arduino ile kullanılmasından bahsedeceğiz.
Ultrasonik sensörleri alarm sistemi olarak,engelden kaçan robot yapımında,mesafe uzaklığı ölçmede kullanabilirsiniz.

Nedir bu ultrasonik sensör ve nasıl çalışır ?

Ultrasonik sensörler, ultrasonik ses dalgaları göndererek bu dalgaların geri döünşleri yani eko yapmalarını beklerler.Bekleme süreleri sırasında eğer ki bir cisimden ses dalgası geri dönüyorsa bize geri bildirimde bulunurlar.Ultrasonic sensör içerisinde bulunan işlemci ile sesin ne kadar sürede geri döndüğü bilgisi tutulur ve bu bilgi bize pwm yani pulse olarak geri döndürülür.




Projemizde parallax ping sensörü üzerinden cisimlerin mesafe bilgilerini alacağız.Bunun için 7 numaralı pinimizi hem input hemde output olarak kullanacağız.Parallax ultrasonik sensör üzerinden veri okuyabilmemiz için, sensöre 5 mikrosaniye kadar dijital 1 yani HIGH değeri göndermemiz gerekiyor.Akabinde 7 numaralı pinimizi input pini olarak tanımlayacağız ve pulseIn() fonksiyonu dönen pulse süresi ile sensörün geribildirimi mesafe olarak alacağız.


const int sinyal=7; // sinyalimizin bize geleceği pini seçtik

void setup()
{
}
unsigned long ping()// sensörden dönen bilgiyi bize mesafe olarak döndürecek olan fonksiyonumuzu tanımladık
{
     pinMode(sinyal,OUTPUT);//sinyal pinimizi çıkış olarak atadık
    digitalWrite(sinyal,LOW);// 7 numaralı pinimize dijital 0 gönderdik
    delayMicroseconds(2);// 2 mikro saniye gecikme
    digitalWrite(sinyal,HIGH);// 7 numaralı pinimize dijital 1 gönderdik
    delayMicroseconds(5);
    digitalWrite(sinyal,LOW);//5 mikrosaniye boyunca sensöre dijital 1 verdik ve ölçüm yapmasını istedik.
    pinMode(sinyal,INPUT);//7 numaralı pinimizi giriş olarak değiştirdik
    digitalWrite(sinyal,LOW);// pinimizi dijital 0 yaptık ve pulse bekliyoruz
    return pulseIn(sinyal,HIGH);//7 numaralı pinin lowdan high olana kadar olan zaman yani sensör değeri
}
void loop()
{
    int range =ping() / 29;// sensörden dönen pulse süresini aldık
    delay(50);//50 ms gecikme
}

Yukarıdaki koddar 29 ile neden böldüğümüz aklınıza gelebilir.Parallax sensörün bizen döndürdüğü her pulse 29 microsaniyesi 1 cm ye denk gelmektedir.Bizde gelen süreyi cm ye çevirmek için gelen değeri 29 ile bölmekteyiz.
Bu yazımızda servo motoru arduino üzerinden sürme projesinden bahsedeceğiz.
Servo motorlarının üzerinde 1 adet power,1 adet ground ve 1 adette kontrol ya da sinyal ucu olmak üzere toplamda 3 adet pin bulunmaktadır.
Yandaki resimde tipik bir servo motor görülmektedir.Peki servo motor nasıl çalışır ?
Servo motorlar sinyal uçlarına gönderilen pulse ile çalışırlar ve bu pulse ile servo motorun 0 ile 180 derece arasında açıda dönmesini sağlar.Arduino tarafından gönderilecek olan pulse her 20 mili saniyede bir tekrarlanmalıdır aksi halde step motorumuz başlangıç değerine geri dönecektir.

Servo motoru 1ms ile 2ms pulse değerlerimizle 0-180 derece aralığında kontrol etmeye çalışacağız ve bunun içinde arduino servo motor kontrol kütüphanesini kullanacağız.


Arduino Servo motor kütüphanesi nasıl çalışır ? (<Servo.h>)

Servo kütüphanesini bir derleyici ile açtığınızda karşınıza kütüphane içerisinde tanımlı fonksiyonlar çıkacaktır ki bu fonksiyonları arduino ide içerisinde kullanacağız.İsterseni gelin bu fonksiyonlara bir göz atalım :

Servo : arduino ide içerisinde servo ile değişken tanımlayarak bir servo motor objesi oluşturmaya yarar.

attach(): bu fonksiyon servo motorumuzun bağlı olduğu pine servo motor kontrolünü bağlamamızı sağlayacak.

write(): tanımladığımız servo motora istediğimiz açı değerini göndermemizi sağlayacak olan fonksiyonumuz.

writeMicroseconds(): Servo motorumuza göndereceğimiz pulse değerimizin sıklığını ayarlayacak olan fonksiyonumuz.

read(): En son gönderilen açı değerini bize döndürecek olan fonksiyonumuz.

readMicroseconds():Servo motora gönderilen pulse değerinin sıklığını bize geri döndüren fonksiyonumuz.

attached(): Yukarıda belirtmiş olduğumuz attach fonksiyonun işlevini yerine getirmesi sonucu true ya da servo motorun yazılımsal olarak bağlı olmadığı durumda ise false döndüren fonksiyonumuz.

detach(): Yazılımsal olarak servo motoru programımızdan çıkaran yani attach foknsiyonu ile servo motoru bağladığımız pini yazılımsal olarak boşa çıkaran fonksiyonumuz.


Gelelim kodlarımıza :

#include<Servo.h>// servo kütüphanemizi ekledik

Servo motor;// motor adında bir servo objesi oluşturduk
int poz=0;//motorumuzun pozisyonunu içerisinde tutacağımız değişkenimiz.

void setup()
{
    motor.attach(9);// servo motorumuzu 9 numaralı pwm pini üzerinden kontrol edeceğimizi belirttik
}
void loop()
{
   for(poz=0;poz<180;poz++)//motorumuzun açısını sıfırdan başlatarak for içerisinde 180e kadar arttıracağız
   {
      motor.write(poz);//servo motora açısını gönderiyoruz.
      delay(15);//15ms gecikme gönderiyoruz
   }
   for(poz=180;poz>0;poz--)//motorumuzun açısından 180 dereceden 0 dereceye indiriyoruz
   {
      motor.write(poz);// motorumuza açısını gönderiyoruz
      delay(15);//15 ms bir gecikme gönderiyoruz
   }
}


Programı çalıştırdığınızda servo motorun önce 0 dan 180 dereceye, sonrasında ise 180 dereceden 0 dereceye doğru hareket ettiğini göreceksiniz.
Merhabalar arkadaşlar,
Bu yazımızda arduino ile basit bir dc motor kontrolü nasıl sağlanır ondan bahsedeceğiz.

Projemizde 1 adet npn transistör ile rölemizi sürerek motorumuzun hareket etmesini sağlayacağız.



Şemada da görüldüğü üzere 13 nolu dijital pin üzerinden npn transistörümüzün base ucuna bağlandık.13 numaralı pinimizi dijital 0 yaptığımız anda npn transistörü iletime geçecek ve rölemizin bobin ucuna 5V luk bir gerilim uygulanarak kontağının çekmesi sağlanacak burada D1 diyotu ters akımı engellemek amacı ile kullanılmaktadır.Sonrasında rölemizin kontağı üzerinden de VCC gerilimimiz motora uygulanmış olacaktır.

Burada dikkat edilmesi gereken bu devre standart arduino röle kartı ile de gerçekleştirilebilirdi zaten yapmış olduğumuz devre standart röle kartının iç mimarisinden bir parça konumunda ve motor sürmek için uygun  bir elektronik devre.

Gelelim arduino kodları tarafına :

int transistor_pini 13; // 13 numaralı pine transistor_pini adını verdik
void setup()
{
   pinMode(transistor_pini,OUTPUT);// 13 numaralı transistor pinini output yani çıkış olarak ayarladık
}
void loop()
{
   digitalWrite(transistor_pini,LOW); // pinimize dijital 0 gönderdik
   delay(5000);//5 sn lik bir gecikme verdik
   digitalWrite(transistor_pini,HIGH);//pinimize dijital 1 gönderdik
   delay(5000);//5sn lik bir gecikme verdik
}

Programımızı çalıştırdığımızda motorumuzun 5 sn çalışır durumda ve 5 sn ise durur konumda kalacağını göreceğiz.
Merhabalar,

Eski yazılarılarımızda arduino üzerinde dijital giriş ve çıkışlardan bahsetmiştik.Bu yazımızda ise artık analog dünyasına giriş yapacağız.

Analog nedir ?
Analog değer zamana bağlı olarak gerek voltaj ve akım olarak değişkenlik gösteren bir veridir.Bir sıcaklık sensörü ele alalım bu sensör bize çıkışında analog veri olarak 0-10V aralığında veri veriyor ve sıcaklık sensörümüzün çalışma aralığı da 0 - 80 derece olsun.Bu durumda bu sıcaklık sensörü bize 0 derecede 0 voltaj ve 80 derecede ise 10 V değerini verecektir.Yani bize analog değerlerini gönderecektir.

Elinizde bir arduino var ise modeline göre sayısı değişebilir A0 dan başlayarak devam eden pinleriniz sizin analog değer okuma amacı ile kullanabileceğiniz pinlerdir(bu pinler aynı zaman dijital giriş çıkış birimi olarak da kullanılabilmektedir.)

Gelelim can alıcı soruya ?
Bize analog değer geldi peki bunu arduino nasıl algılar ve bize nasıl iletir?

Bu noktada ADC ler devreye girer.Analog to digital converter yani analog dijital çeviriciler, girişlerine gelen analog değerleri çözünürlükleri doğrultusunda dijital veriye çevirerek bizim kullanabileceğimiz hale getirirler.Burada dikkat edilmesi gereken husus çözünürlükleri doğrultusunda lakin birçok çözünürlüke ADC entegreleri bulunmakta ve arduino uno üzerinde 10 bit çözünürlüğe sahip bir ADC bulunmaktadır.

Peki nedir bu 10 bit olayı ?

Sıcaklık sensörü örneğimizi tekrar ele alaım :)
0-80 derece aralığında bize 0-10V veren sensörümüz adc tarafında okunduğunda 10V olarak 80 derecenin adc nin girişine gelmesi ile birlikte adc bunu 10 bitlik veri düzeninde 1024 olarak bize sunacaktır.Bit değeri ne kadar artar ise analog verinin dijitale çevrimi o kadar hassaslaşır.

Bugun örneğimizde ise bir potansiyometre üzerinden analog girişimize gelen veriyi nasıl işleriz konusunu ele alacağız.


Yukarıdaki şekilde potansiyometre çeşitleri görülmektedir.Potansiyometre ayarlanabilir probu ile direnci değiştirilebilen bir elemandır.Kendisinin bir maksimum değeri vardır ve bu değer ile satın alınılır.Ayarlanabilir probu ile de kedisinin maksimum değerine kadar direnci arttırabilir ya da minimum değere kadar azaltabilirsiniz.

Biz potansiyometre üzeriden 5V değerimizi geçireceğiz ve prob üzerinden verdiğimiz her değişimde analog girişte farklı bir voltaj ve dolayısı ile adc üzerinden farklı dijital değerler okumayı ve yorumlamayı amaçlayacağız.



Yukarıdaki şemada görüldüğü üzere 5V potansiyometre üzerinden geçirildi ve arduinomuzun A0 analog pinine bağlandı.

Arduino Ide analog pine gelen değeri okuyabilmemiz için analogRead() fonksiyonunu bulundurmaktadır.Bu fonksiyon içerisinde okumak istediğimiz analog pin tanımı yazarak, o analog pine gelen verinin dijital halini adc üzerinde 0-1024 değeri aralığında okuyabilir hale geliriz.

Biz bu örneke analogRead(A0); ile veriyi okumaya çalışacağız.

Gelelim kodlarımıza

int sensor_degeri=0;// sensörden gelen verimizi içinde tutacağımız değişken

void setup()
{
     Serial.begin(9600);// aynı zamanda verileri seri ekrana bastırıp buradan da izlemeyi amaçlıyoruz.
}

void loop()
{
   sensor_degeri=analogRead(A0);// adc üzerinden sensör değerini aldık ve sensor_degeri değişkenine atadık
   Serial.print("sensor degeri:");// seri ekrana sensor degeri: yazdırdık
   Serial.println(sensor_degeri);//seri ekrana okuduğumuz sensör değerini yazdırdık.
   delay(100);//daha iyi görebilmek ve anlık değişimleri göz ardı etmek adına 100ms gecikme tanımladık.
}

Bir sonraki yazımızda piezoelektrik uygulaması ile yeniden karşınızda olacağız.
Merhabalar,
Adım adım arduino köşemizde 2. projemizde bir önceki projemize buton ekleyerek,interrupt yani kesiciler kavramından bahsedeceğiz.


Bir önceki öğreniğimizden farklı olarak bu projemizde 2 nolu pinimizi dijital giriş olarak tanımlayarak bu pine buton bağlayacağız.

Butonumuza bastığımız anda 2 nolu pinimize R6 direnci üzerinden bir voltaj gelecek ve programımız içerisinde interrupt yani kesicimiz aktif hale gelerek ledlerin kontrolünü sağlayacağız.

Yukarıdaki şemayı dikkatli incelerseniz butonun açık olan ucunun 5V diğer ucununda R6 direnci üzerinden 2 nolu pine bağlandığını göreceksiniz.Bu durumda butona bastığımız anca 2 nolu dijital pin üzerinde bir voltaj oluşacak ve bizde butonun konumunu program içerisinde kontrol edebilir hale geleceğiz.Burada R6 direncini kullanmamızdaki amaç 2 nolu pinimizi yüksek gerilimden ve açırı akım çekiminden korumak.Önceki projemizde olduğu gibi her bir ledimizin önüne birer direnç koyarak fazla akım çekiminin önüne geçmeyi amaçlamıştık.

Gelelim interrupt yapısı nedir bu interrupt?

Bir örnek ile açıklamaya çalışalım.Evimizdeki kapı zili mesela.Bizim kapıyı açma eylemimizi programlarımızda kullandığımız bir fonksiyon olarak kabul edelim.Kapı zilinin çalma durumunu da bizim programımızdaki butonun basılma durumu olarak ele alalım.Biz günlük hayatımızda asla kapıda biri var mıdır? diyerek kapıyı sürekli kontrol etmeyiz.Onun yerine kapı zili bizi kapıda birinin olduğu konusunda bizi uyarır ve bizde bu durumu anlayarak o anda ne yapıyorsak (Tv izleme , yemek yeme , uzanma vb.) mevcut işimizi yarıda kesip kapı açma fonksiyonunu yerine getiriyor ve sonrasında yarıda kalan eylemimize devam ediyoruz.

Programlarda da interrupt bu durumu özetler.Herhangi bir koşulda tetiklendiği anda program anlık olarak olduğu yerde durur, interrupt devreye girer yapması gerekeni yapar ve sonrasında program olağan akışına devam eder.

Peki arduinoda nasıl işler interrupt?

Arduino Ide bu konuda bize attachInterrpt() yani programa interrupt bağlama fonksiyonu ile yardımcı oluyor.
Program kodlarımızı açıkladıktan sonra interrupt konusuna yazımızın sonuna doğru biraz daha değineceğiz.

Bizde bu projemizde interrupt ile buton kontrolünü sağlayarak,interrupta bağlayacağımız fonksiyonu yerine getirip ledlerimiz kontrol edeceğiz.


Yukarıdaki resimde bir önceki projemize ek olarak 2 nolu pine butonun bağlanmış halini görmektesiniz.

Gelelim arduino kodlarımıza :

volatile int buton_durum=LOW;
int ledler[]={8,9,10,11,12};// ledlerimizin bağlı olduğu pinleri bir dizi şeklinde tanımladık
int sayac=0;//programda ledlerimizi sırası ile yakacağız ve bu sayaç bize yardımcı olacak
int zamanlama=75;// ledlerimizin belirli bir zaman için yanıp sönmesini istiyoruz
int duraksama=500;

void setup()// arduinonun başlangıç değerleri ve pin durumlarının tanımladığı standart fonksiyon
{
     for (sayac=0;sayac<5;sayac++)// ledimizin bağlı olduğu herbir pini output olarak tanımlıyoruz
    {
            pinMode(ledler[sayac],OUTPUT);
    }
    attachInterrupt(0,led_yak,RISING);// led_sondur fonksiyonu ile interrupt bağlıyoruz
}

void loop()
{
  if(buton_durum)
  {
     for(sayac=0;sayac<5;sayac++)
     {
          digitalWrite(ledler[sayac],HIGH);// ilgili led yakıldı
          delay(zamanlama);
     }
     delay(duraksama);
     for(sayac=0;sayac<5;sayac++)
     {
          digitalWrite(ledler[sayac],LOW);// ilgili led söndürüldü
          delay(zamanlama);
     }
     delay(duraksama);
  }
}

void led_yak()
{
      led_durum=!led_durum;
}

Burada dikkat etmemiz gereken husus 2 nolu pine dair bir işlem yapmadık.Peki arduino nasıl anlayacak 2 nolu pinde buton olduğunu?

attachInterrupt(0,led_yak,RISING); 

bu fonksiyona dikkat ettiğimizde arduinonun 2 nolu pinine 0 numaralı interrupt tanımlanmıştır ve biz fonksiyonumuzu yazmamızla birlikte 2 nolu pini interrupt olarak kullanacağımızı belirtmiş oluyoruz.

Yine bu fonksiyon içerisinde led_yak fonksiyon adını vererek, interrupt tetiklendiğinde bu fonksiyonun çağrılması gerektiğini söylüyoruz.

Son kısım ise RISING. Burada ise voltajın yükselmeye başladığı anda tetikleme olasını istediğimizi belirtmiş oluyoruz.Bunu FALLING olarak tanımlayarak voltajın düşme anında tetikleme yapmasını da sağlayabilirsiniz.

Programı çalıştırdığınızda ledler butona basmadığınız anda yanmayacaktır.Butona bastığınız anda ise interrupt tetiklenecek ve sonrasında led_yak fonksiyonu görevini yerine getirerek ledlerin sırası ile yanmasını sağlayacaktır.

Bir sonraki yazımıda arduino ile analog okuma ve çıkış işlemleri nasıl yapılıyor bunlardan bahsedeceğiz.
Merhabalar,
Bu bölümde arduinonun genel amaçlı dijital giriş çıkış pinlerini kullanarak sıralı led yakma projesi gerçekleştireceğiz.


İhtiyacımız olan malzemeler :

1 adet arduino uno
birkaç adet led
birkaç adet min 175 ohm direnç
1 adet breadboard
yeterli miktarda atlama kabloları

Yukarıdaki şemada arduino ile ledlerimizin bağlatıları yer almaktadır.Dirençlerimizi arduino tarafından ledlerin fazla akım çekmesini engellemek amacı ile kullanıyoruz.Dijital pinlerimizden 8 den 12 ye kadar olan kısmı çıkış olarak atayacağız ve ledlerimizi bu dijital çıkışlar üzerinden kontrol edeceğiz.

Peki nedir dijital giriş çıkış?
Dijital çıkış programlama yapısı içerisinde çıkış olarak tanımladığınız pinin, sizin programlama içerisinde high (1) ya da low(0) yaptığınız anda çıkış olarak bir voltaj verip vermemesi durumudur.

Yine eğer ki ilgili pinimiz giriş olarak tanımladı ise bu durumda da girişi programsal olarak okuruz ve voltaj gördüğümüz anda logic 1 göremediğimiz anda ise logic 0 olarak pin durumunu almış oluruz.

Arduino genel olarak bazı pinlerini bizlere pwm olarak sunabildiği gibi (PWM nedir ileri zaman konularımızda işleyeceğiz) bu pinleri ister giriş, istersek de çıkış olarak tanımlamamıza olanak sağlamaktadır.

Peki bunu nasıl sağlarız?
Bir örnekle ele alalım :
8 nolu pinimizi dijital çıkış olarak atamak istiyoruz.Yani biz programda HIGH ol dediğimizde çıkışında voltaj versin,LOW ol dediğimizde ise çıkışında voltaj oluşmasın

Arduino bize bunun kontrolünü sağlamak için pinMode() fonksiyonunu veriyor.
PinMode(8,OUTPU);// 8 nolu pini output yap
PinMode(8,INPUT); // 8 nolu pini input yap

Peki input ve outpu olarak bir pinin nasıl tanımlanacağını öğrendik.Peki biz bu pinleri program içerisinde nasıl kontrol ediyoruz?
Yine arduino ide bize digitalWrite();  ve digitalRead(); fonsiyonları ile yardımcı oluyor.

digitalWrite(8,HIGH); // 8 nolu çıkış pinine 1 yazdır yani o pine voltaj ver
digitalWrite(8,LOW);// 8 nolu çıkış pinine 0 yazdır yani voltajı kes
digitalRead(8);// 8 nolu dijital giriş pinini oku

Burada dikkat edilmesi gereken dijital giriş pini okunurken digitalRead(); fonksiyonu size o pinin durumunu söyler.Buda ne demek siz buradan aldığınız veriyi bir değişken içerisine atarak kullanabilirsiniz.Bunu bir sonraki yazımızda bu yazımızdaki örneğimize buton kontrolü ekleyerek açıklayacağız.

Diğer dikkat edilmesi gereken husus ise siz bir pini giriş ya da çıkış olarak ayarlamak için void setup() fonksiyonu içerisinde pininizin durumunu pinMode() fonksiyonu ile belirtmeyi unutmamalısınız.

Bizim projemize gelecek olursak, biz pinlerimizi dijital çıkış olarak kullanacağız ve ledlerimizin kontrolünü sağlayacağız.


Yukarıdaki şema bize arduinonun fiziksel olarak bağlantı durumunu göstermektedir.
Gelelim kodlarımıza

int ledler[]={8,9,10,11,12};// ledlerimizin bağlı olduğu pinleri bir dizi şeklinde tanımladık
int sayac=0;//programda ledlerimizi sırası ile yakacağız ve bu sayaç bize yardımcı olacak
int zamanlama=75;// ledlerimizin belirli bir zaman için yanıp sönmesini istiyoruz

void setup()// arduinonun başlangıç değerleri ve pin durumlarının tanımladığı standart fonksiyon
{
     for (sayac=0;sayac<5;sayac++)// ledimizin bağlı olduğu herbir pini output olarak tanımlıyoruz
    {
            pinMode(ledler[sayac],OUTPUT);
    }
}

void loop()
{
     for(sayac=0;sayac<5;sayac++)
     {
          digitalWrite(ledler[sayac],HIGH);// ilgili led yakıldı
          delay(zamanlama);
          digitalWrite(ledler[sayac],LOW);// ilgili led söndürüldü
          delay(zamanlama);
     }
}

Yukarıdaki örnekte her 150ms de bir (75 ms yanık kalacak,75ms sönük kalacak) 8 nolu pinden 12 nolu pine kadar olan ledlerimiz sırası ile yanıp sönecektir ve void  loop bu durumun sürekliliğini sağlayacaktır.

Bir sonraki yazımızda bu örneğimize nasıl buton kontrolü ekleyeceğimizi göstereceğiz.
ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger