Bir cümlelik özet
Bir pinin yalnız açık/kapalı değil, arada kalan tüm değerleri de okuyabilmesi için analogRead komutuyla 0 ile 1023 arasında bir sayı elde ederiz.
Neden önemli?
Bir önceki derste dijital giriş öğrendik: bir buton ya basılıdır ya da değildir, digitalRead bize yalnız HIGH veya LOW verir. Ama dünyanın çoğu şeyi böyle keskin değildir. Sıcaklık yavaşça artar, oda yarı karanlık olabilir, bir düğmeyi biraz ya da sonuna kadar çevirebiliriz.
İşte bu "arada" değerleri ölçmek için analog okuma kullanırız. Potansiyometre (ayar düğmesi), ışık sensörü, nem sensörü, ses sensörü gibi birçok parça Arduino'ya bir gerilim gönderir. Arduino bu gerilimi bir sayıya çevirir ve biz de o sayıya göre karar veririz: lambayı ne kadar parlatalım, motoru ne hızda döndürelim, karanlık oldu mu?
Bu ders, sensör modülleriyle çalışmanın temelidir. Bir sensörü okuyamazsan ona göre bir şey yaptıramazsın.
Analog sinyal ve ADC
Dijital ile analog arasındaki fark
Dijital sinyalin yalnız iki değeri vardır: açık (HIGH, ~5 volt) ve kapalı (LOW, 0 volt). Bir ışık anahtarı gibi düşün: ya yanar ya söner.
Analog sinyal ise 0 ile 5 volt arasında herhangi bir değeri alabilir: 1.2 volt, 3.7 volt, 4.95 volt... Bir kısılabilen (dimmer) lamba düğmesi gibi: aydınlığı kademesiz ayarlarsın.
ADC: gerilimi sayıya çeviren çevirici
Arduino'nun A0–A5 diye adlandırılan analog pinleri içinde ADC adı verilen bir devre bulunur. Açılımı Analog-Dijital Çevirici (Analog-to-Digital Converter). Görevi, pindeki gerilimi Arduino'nun anlayacağı bir tam sayıya dönüştürmektir.
Arduino Uno'nun ADC'si 10 bitliktir. Bu şu demek:
- 0 volt →
0 - 5 volt →
1023 - Aradaki her gerilim → 0 ile 1023 arasında bir sayı
Yani analogRead bize her zaman 0 ile 1023 arasında bir değer verir. 5 voltu 1024 basamağa böldüğü için her basamak yaklaşık 4.9 milivolttur. Gerilimi kabaca hesaplamak istersen:
gerilim = analogRead değeri × 5 / 1023
Potansiyometre okumak
Potansiyometre, çevirdikçe direnci değişen bir ayar düğmesidir. Üç bacağı vardır: iki uçtaki bacaklar güce (5V) ve toprağa (GND) bağlanır, ortadaki bacak ise A0 pinine gider. Düğmeyi çevirdikçe orta bacaktaki gerilim 0V ile 5V arasında değişir.
İlk sketch sadece değeri okuyup Seri Monitör'e yazsın:
const int potPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int deger = analogRead(potPin); // 0 - 1023
Serial.println(deger);
delay(200);
}
Düğmeyi bir uca çevirdiğinde ekranda 0'a yakın, diğer uca çevirdiğinde 1023'e yakın sayılar görürsün. (Seri Monitör'ü bir sonraki derste ayrıntılı öğreneceğiz; şimdilik değerlerin değiştiğini görmek yeterli.)
Okuduğun değeri kullanmak: LED parlaklığı
Okuduğumuz sayıyı bir işe yaratalım. Bir LED'in parlaklığını potansiyometreyle ayaralım. Ama bir sorun var: analogRead 0–1023 verir, analogWrite ise yalnız 0–255 aralığını kabul eder. map komutu bu iki aralığı birbirine eşler:
const int potPin = A0;
const int ledPin = 9; // PWM (~) pini
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
int deger = analogRead(potPin); // 0 - 1023
int parlaklik = map(deger, 0, 1023, 0, 255);
analogWrite(ledPin, parlaklik);
delay(10);
}
Bağlantı: LED'in uzun bacağı (+) 220 ohm direnç üzerinden 9 numaralı pine, kısa bacağı GND'ye gider. Düğmeyi çevirdikçe LED kısılıp parlar. Günlük hayattaki kısılabilir salon lambası ya da müzik setinin ses düğmesi tam olarak bu mantıkla çalışır.
Işık sensörü (LDR) okumak
LDR (ışığa bağlı direnç), üzerine düşen ışık arttıkça direnci azalan bir parçadır. Tek başına gerilim üretmez; bir sabit dirençle birlikte gerilim bölücü kurarız.
Bağlantı:
- LDR'nin bir bacağı 5V'a
- LDR'nin diğer bacağı hem
A0'a hem de 10k ohm direnç üzerinden GND'ye - LED: 8 numaralı pin → 220 ohm direnç → LED → GND
Şimdi karanlık olunca yanan bir gece lambası yapalım:
const int ldrPin = A0;
const int ledPin = 8;
const int esik = 400; // isik esigi
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int isik = analogRead(ldrPin);
Serial.println(isik);
if (isik < esik) {
digitalWrite(ledPin, HIGH); // karanlik: LED yak
} else {
digitalWrite(ledPin, LOW); // aydinlik: LED sondur
}
delay(200);
}
Odandaki gerçek ışığa göre esik değerini değiştirmen gerekebilir: önce Seri Monitör'de aydınlık ve karanlık değerlerini oku, sonra ikisinin ortasına yakın bir sayı seç. Sokak lambalarının akşam kendiliğinden yanması da aynı fikirdir.
Mini uygulama
Elinde bir potansiyometre varsa şu görevi dene: potansiyometreyle bir LED'i üç kademeye ayarla. Değer düşükse LED sönük kalsın, ortadaysa yarı parlak yak, yüksekse tam parlak yak.
const int potPin = A0;
const int ledPin = 9;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int deger = analogRead(potPin);
if (deger < 341) {
analogWrite(ledPin, 0); // sonuk
} else if (deger < 682) {
analogWrite(ledPin, 128); // yari parlak
} else {
analogWrite(ledPin, 255); // tam parlak
}
delay(50);
}
Sonra dene: delay yerine millis() kullanarak değeri her 200 milisaniyede bir yazdırırken LED'i kesintisiz güncelleyebilir misin? Bu, delay'in programı beklettiği, millis()'in ise beklemeden zaman ölçtüğü farkını görmen için iyi bir alıştırmadır.
Uygulama laboratuvarı: Analog Okuma
Analog Okuma konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Analog sinyal ve ADC ile ADC: gerilimi sayıya çeviren çevirici arasındaki ilişkiyi kullanarak bağlantı şeması, derlenebilen Arduino kodu, seri monitör kaydı ve test sonucu hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: mesafeye göre ses aralığı değişen park sensörü. Dersin ana hedefi “analogRead ile potansiyometre veya sensörden 0–1023 değeri okumayı öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Kartın 5 V veya 3,3 V çalışma sınırı doğru mu?
- Pin numaraları kod ve devrede eşleşiyor mu?
- Seri monitör ölçümü beklenen aralıkta mı?
- Motor veya servo karttan doğrudan aşırı akım çekiyor mu?
- Güç kesildiğinde sistem güvenli duruma dönüyor mu?
“Analog Okuma” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın mesafeye göre ses aralığı değişen park sensörü senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Analog sinyal ve ADC ve ADC: gerilimi sayıya çeviren çevirici ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
analogRead ile digitalRead'i karıştırmak
analogRead(A0) 0–1023 arası sayı verir. digitalRead(A0) yalnız HIGH/LOW verir. Sensörden kademeli değer bekliyorsan analogRead kullanmalısın.
analogWrite'a 255'ten büyük değer vermek
analogWrite 0–255 arasını kabul eder. analogRead'den gelen 0–1023'ü doğrudan verirsen sonuç yanlış olur. Araya mutlaka map koy.
Gerilim bölücüyü unutmak
LDR'yi tek başına A0 ile 5V arasına bağlarsan sabit ve anlamsız bir değer okursun. Sensörün diğer ucunda mutlaka bir direnç ve GND bağlantısı olmalı.
pinMode gereksizliği ile analog pini karıştırmak
Analog okuma için pinMode'a gerek yoktur; ama aynı sketch'te bir LED'i çıkış olarak kullanıyorsan onun için pinMode(ledPin, OUTPUT) yazmayı unutma.
Güvenlik notu
- Arduino'yu yalnız USB kablosu veya uygun pil paketiyle çalıştır; asla priz/şebeke elektriğine bağlama. Bu devreler düşük gerilimlidir ve güvenlidir.
- LED'lerde her zaman akım sınırlayıcı direnç (220 ohm) kullan; direnç olmadan LED ve pin zarar görebilir.
- Motor, pompa veya fan sürmek istiyorsan bunları asla doğrudan Arduino pininden besleme. Ayrı bir güç kaynağı ve motor sürücü modülü gerekir; motoru düşük hızda başlat.
- Sensörlerle su veya nemin bulunduğu bir deney yapıyorsan elektronik parçaları sudan uzak tut ve bir yetişkinle birlikte çalış.
Ders özeti
- Analog sinyal, dijitalin aksine 0 ile 5 volt arasında herhangi bir değeri alabilir.
analogReadbir pindeki gerilimi ADC devresiyle 0–1023 arasında bir sayıya çevirir.- Potansiyometre ve LDR gibi parçalar Arduino'ya kademeli bir gerilim gönderir.
- Okunan değeri
mapile başka bir aralığa çeviripanalogWritegibi komutlarda kullanabiliriz. - Bir eşik (threshold) belirleyerek "karanlık olunca yak" gibi kararlar verebiliriz.
Kontrol soruları
analogReaden küçük ve en büyük hangi değerleri döndürür?- ADC'nin açılımı ve görevi nedir?
- Potansiyometrenin orta bacağı hangi pine bağlanır ve neyi taşır?
analogRead'den gelen değeri neden doğrudananalogWrite'a veremeyiz?- LDR ile gece lambası yaparken
if (isik < esik)satırı ne işe yarar?
Cevaplar
- En küçük
0(yaklaşık 0 volt), en büyük1023(yaklaşık 5 volt). - Analog-Dijital Çevirici (Analog-to-Digital Converter); pindeki analog gerilimi Arduino'nun anlayacağı bir tam sayıya çevirir.
- Analog bir pine (örneğin
A0) bağlanır ve düğmenin konumuna göre değişen gerilimi taşır. - Çünkü
analogRead0–1023,analogWriteise 0–255 aralığında çalışır; iki aralığımapile eşlememiz gerekir. - Okunan ışık değeri eşiğin altına düştüğünde (ortam karardığında) LED'i yakan koşuldur; aksi halde LED sönük kalır.
Kaynak ve doğrulama notu
“Analog Okuma” dersi için doğrulama odağı Analog sinyal ve ADC ile ADC: gerilimi sayıya çeviren çevirici arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Arduino uyumlu kartlarda pin, gerilim ve akım sınırları modele göre değişebilir. Kod derlense bile devre güvenli olmayabileceğinden, motor ve servo gibi yükler uygun sürücü ve harici besleme ile kullanılmalıdır.
Sonraki ders
Seri Monitör: Arduino'nun bize sayılar ve mesajlar göndererek ne yaptığını göstermesini ve sensör değerlerini gerçek zamanlı izlememizi sağlayan pencere.