
Dijital Pinleri Giriş Olarak Belirlemek
Arduino'da dijital pinleri giriş olarak kullanmak, buton okumaktan sensör verisi almaya kadar birçok etkileşimli projenin temelidir. Arduino'da bir dijital pini giriş olarak kullanmak için öncelikle o pinin giriş (INPUT) modunda olduğunu belirtmemiz gerekir. Bunu setup() fonksiyonu içinde, yani Arduino kartınız her başladığında bir kez çalışan bölümde yaparız.
0 ve 1 pinleri Rx ve Tx iletişim pinleridir. Arduino USB üzerinden iletişim için bu pinleri kullanır. Ayrıca bu pinleri kullanabilmemiz için dışarıya da çıkarılmıştır. Bu pinleri dijital giriş/çıkış için kullanabiliriz ama bu pinler usb iletişim için de kullanıldığı için Arduino'ya program yüklerken yada seri monitör kullanırken bu pinlerin boş olması gerekir. Yoksa usb iletişiminde yada bu pinlere bağlanan komponentlerin çalışmasında sorunlar çıkabilir.
Dijital pinler üzerinden maximum 40mA'i geçmelidir.
Dijital pinleri giriş olarak kullanmak için 2 yol vardır:
- pinMode() Fonksiyonu İle
- Yön Kayıtçısına Erişim İle
1. pinMode() Fonksiyonu İle Pinleri Giriş Olarak Belirlemek
Bir pini giriş olarak ayarlamak için pinMode() fonksiyonunu kullanırız. Şu şekilde:
pinMode(pinNumarası, MOD);
pinNumarası : Ayarlamak istediğiniz dijital pinin numarasıdır (örneğin 2, 3, 13 vb.).
MOD : Pin'in çalışma modunu belirtir. Giriş için INPUT (büyük harflerle) kullanırız.
Örnek:
void setup()
{
pinMode(7, INPUT); // Pin 7'yi giriş olarak ayarla
}
void loop()
{
// Buraya kodunuzu yazacaksınız
}
2. Yön Kayıtçısına Erişim İle Pinleri Giriş Olarak Belirlemek
Arduino'da pinlerin giriş olarak belirlenmesi için "yön kayıtçısı" nı kullanabiliriz. Bunlar:
DDRB : Port B yön kayıtçısı
DDRC : Port C yön kayıtçısı
DDRD : Port D yön kayıtçısı
Bu kayıtçılara yükleyeceğimiz değerler ile Arduino portlarını giriş olarak belirleyebiliriz. Aşağıdaki örnekteki gibi:
DDRD = B00000000; : Arduino D portunun tüm pinleri giriş yapıldı. Binary sayı kullanıldı.
DDRD = 0b00000000; : Arduino D portunun tüm pinleri giriş yapıldı. Binary sayı kullanıldı.
DDRD = 0x00; : Arduino D portunun tüm pinleri giriş yapıldı. 16 lık yani hexedecimal sayı kullanıldı.
Dijital Pinlerden Değer Okumak
Pini giriş olarak ayarladıktan sonra, o pinden yüksek (HIGH) veya düşük (LOW) bir voltaj değeri okuyabiliriz. Bunun için 2 yol vardır:
- digitalRead() Fonksiyonu İle
- Port Kayıtçısına Erişim İle
1. digitalRead() Fonksiyonu
Dijital bir pinden değer okumak için digitalRead() fonksiyonunu kullanırız. Şu şekilde:
okunan_deger = digitalRead(pinNumarası);
pinNumarası : Değer okumak istediğiniz dijital pinin numarası.
okunan_deger : Pinden okunan değerin atandığı değişken. Okunan değer ya "HIGH - 1" yada "LOW - 0" olur.
Örnek: Pin 2'den gelen değeri okuyup seri monitöre yazdırmak:
void setup()
{
Serial.begin(9600); // Seri iletişimi başlat
pinMode(2, INPUT); // Pin 2'yi giriş olarak ayarla
}
void loop()
{
int butonDurumu = digitalRead(2); // Pin 2'den değeri oku
Serial.println(butonDurumu); // Okunan değeri seri monitöre yazdır
delay(100); // Kısa bir bekleme
}
2. Port Kayıtçısına Erişim İle Pinlerden Değer Okuma
Arduino'da pinlerden değer okumak için "port kayıtçısı" nı kullanabiliriz. Bunlar:
PINB : Port B kayıtçısı
PINC : Port C kayıtçısı
PIND : Port D kayıtçısı
Bu kayıtçılardan okuyacağımız değerler ile Arduino pinlerindeki değerleri okuyabiliriz. Aşağıdaki örnekteki gibi:
port_oku = PINB; : PortB'ye ait tüm pinlerin değeri decimal olarak port_oku değişkenine atandı.
port_deger = (PINB & bit (3)); : PortB'ye ait 3. pinin decimal değeri port_deger değişkenine atandı.
1. Örnek Program Kodları
int buton = 0;
void setup()
{
pinMode(2, INPUT);
pinMode(12, OUTPUT);
}
void loop()
{
buton = digitalRead(2);
if(buton==1)
{
digitalWrite(12,HIGH);
}
else if(buton==0)
{
digitalWrite(12,LOW);
}
}
1. Örnek Program Devre Şeması
2. Örnek Program Kodları
int port = 0;
void setup()
{
Serial.begin(9600);
DDRB = B00000000; //Arduino B portu giriş yapıldı.
DDRD = B11111111; //Arduino D portu çıkış yapıldı.
}
void loop()
{
port = PINB; //PortB'ye ait pinlerin değeri port değişkenine atandı.
Serial.print("PortB = ");
Serial.println(port); //PORTB'nin decimal değeri ekrana yazdırıldı.
Serial.print("PortB'nin 4. pin değeri= ");
Serial.println(port & bit(4)); //PORTB'nin 4. bitinin decimal değeri ekrana yazdırıldı.
delay(1000);
}
2. Örnek Program Devre Şeması
Arduino Giriş Pinlerinde Pull-up ve Pull-down Durumları
Pull-up ve pull-down dirençleri, elektronik devrelerde, özellikle mikrodenetleyicilerle çalışırken dijital giriş pinlerinin kararlı bir durumda olmasını sağlamak için kullanılan temel bileşenlerdir. Pinlerin "havada kalmasını" (floating state) ve belirsiz değerler okumasını engellerler.
Havada Kalma (Floating State) Nedir?
Bir dijital giriş pini ne HIGH (yüksek voltaj, mantıksal 1) ne de LOW (düşük voltaj, mantıksal 0) seviyesine aktif olarak bağlanmadığında "havada kalır". Bu durumda, pin çevreden gelen elektriksel gürültüden etkilenebilir ve rastgele, tutarsız değerler okuyabilir. Bu da devrenizin beklenmedik şekilde çalışmasına neden olabilir. İşte pull-up ve pull-down dirençleri bu sorunu çözmek için kullanılır.
1. Pull-Up Bağlantısı
Pull-up direnci, bir dijital giriş pinini varsayılan olarak yüksek mantıksal seviyede (HIGH) tutmak için kullanılır. Direncin bir ucu genellikle VCC'ye (devrenin pozitif güç kaynağına, örneğin 5V veya 3.3V) bağlanırken, diğer ucu dijital giriş pinine bağlanır.
Nasıl Çalışır?
Normal Durum (Butona Basılmadığında): Pull-up direnci sayesinde dijital giriş pini sürekli olarak VCC'ye bağlı kalır ve HIGH (mantıksal 1) değerini okur. Direnç, VCC'den pine akan akımı sınırlar.
Aktif Durum (Butona Basıldığında): Genellikle bir buton veya anahtar, bu pini doğrudan veya dolaylı olarak GND'ye (toprak, 0V) bağlar. Butona basıldığında, pin VCC yerine GND'ye çekilir ve mikrodenetleyici bu pini LOW (mantıksal 0) olarak okur. Akımın çoğu GND'ye yönlendirilir ve direnç sayesinde VCC'den GND'ye doğrudan bir kısa devre oluşumu engellenir.
2. Pull-Down Bağlantısı
Pull-down direnci, bir dijital giriş pinini varsayılan olarak düşük mantıksal seviyede (LOW) tutmak için kullanılır. Direncin bir ucu genellikle GND'ye (toprak, 0V) bağlanırken, diğer ucu dijital giriş pinine bağlanır.
Nasıl Çalışır?
Normal Durum (Butona Basılmadığında): Pull-down direnci sayesinde dijital giriş pini sürekli olarak GND'ye bağlı kalır ve LOW (mantıksal 0) değerini okur. Direnç, pinin GND'ye bağlanmasını sağlar.
Aktif Durum (Butona Basıldığında): Genellikle bir buton veya anahtar, bu pini doğrudan veya dolaylı olarak VCC'ye (pozitif güç kaynağı) bağlar. Butona basıldığında, pin GND yerine VCC'ye çekilir ve mikrodenetleyici bu pini HIGH (mantıksal 1) olarak okur.
Pull-up ve Pull-down Direnç Değerleri
Pull-up ve pull-down dirençleri için genellikle 1kΩ ile 10kΩ arasında değerler kullanılır. Bu değerler, devrenin ihtiyaçlarına, akım tüketimine ve elektriksel gürültüye karşı hassasiyetine göre seçilir.
Çok düşük bir direnç değeri, gereksiz yere daha fazla akım çekilmesine neden olabilir.
Çok yüksek bir direnç değeri ise, pini gürültüye karşı daha hassas hale getirebilir ve pinin durumunu net bir şekilde belirleyememesine yol açabilir.
Arduino Dahili Pull-up
Arduino'da INPUT_PULLUP kullanımı, dijital giriş pinlerini daha basit ve etkili bir şekilde kontrol etmenizi sağlayan çok önemli bir özelliktir. Temel olarak, harici bir direnç bağlama ihtiyacını ortadan kaldırır.
Arduino'nun çoğu mikrodenetleyicisi (örn. ATmega328P gibi), dahili olarak yapılandırılabilen çekme (pull-up) dirençlerine sahiptir. Bu dirençler, dijital bir pini giriş olarak ayırdığınızda etkinleştirilebilir ve pinin varsayılan olarak HIGH (yüksek) mantık seviyesinde olmasını sağlar. Şu şekilde kullanılır:
pinMode(buton, INPUT_PULLUP);
Örnek Programlama Kodları
Dahili pull-up ile 2 nolu pine sürekli 1 gelir. Pin toprağa götürüldüğünde ekrana "butona basıldı" yazısı yazdırılır.
#define buton 2
void setup()
{
Serial.begin(9600);
pinMode(buton, INPUT_PULLUP); //porta sürekli 1 geldiği durum.
}
void loop()
{
if (digitalRead(buton) == 0)
{
while(digitalRead(buton) == 0)
{
Serial.println("butona basıldı.");
delay(500);
}
}
}
Devre Şeması
______________________________________________________________________________________________________________________________________________________