Ana Sayfa · Akademi · Robotik ve Kodlama · Arduino · Analog Okuma

Analog Okuma

analogRead ile potansiyometre veya sensörden 0–1023 değeri okumayı öğren.

DERS PUSULASI

Bu sayfayı ne için kullanacaksın?

Ana fikir

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.

Üretilecek kanıt

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) {…

Kontrol tuzağı

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ç…

Sonraki bağlantı

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.

Modül kaynakları: Python Tutorial · Arduino Learn

SeviyeBaşlangıç
Yaş10–16
Süre30–45 dk
Ön koşulDijital Giriş ve Çıkış
İçerikStandart ders · 1.455 kelime
Son güncelleme

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 A0A5 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:

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ı:

Ş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.

  1. Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
  2. En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
  3. Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
  4. Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
  5. 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

“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

Ders özeti

Kontrol soruları

  1. analogRead en küçük ve en büyük hangi değerleri döndürür?
  2. ADC'nin açılımı ve görevi nedir?
  3. Potansiyometrenin orta bacağı hangi pine bağlanır ve neyi taşır?
  4. analogRead'den gelen değeri neden doğrudan analogWrite'a veremeyiz?
  5. LDR ile gece lambası yaparken if (isik < esik) satırı ne işe yarar?

Cevaplar

  1. En küçük 0 (yaklaşık 0 volt), en büyük 1023 (yaklaşık 5 volt).
  2. Analog-Dijital Çevirici (Analog-to-Digital Converter); pindeki analog gerilimi Arduino'nun anlayacağı bir tam sayıya çevirir.
  3. Analog bir pine (örneğin A0) bağlanır ve düğmenin konumuna göre değişen gerilimi taşır.
  4. Çünkü analogRead 0–1023, analogWrite ise 0–255 aralığında çalışır; iki aralığı map ile eşlememiz gerekir.
  5. 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.

Quiz’i BaşlatArduino bölümüne dön
SORU HAVUZU

Bu dersi 10 soruyla pekiştir

Bu ders için 20 soruluk bir havuz hazırlandı. Her başlangıçta 10 soru ve seçenekler yeniden karıştırılır.