İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Arduino Analog Okuma Nasıl Yapılır? analogRead() Mantığı

arduino-analog-okuma-nasil-yapilir-analogread
Bu yazıda neler var?
  1. Analog mu dijital mi okumalısın? Üç soruluk karar çerçevesi
  2. Potansiyometreyi Arduino'ya nasıl bağlarsın? Üç bacak, üç görev
  3. analogRead() kodunu satır satır okuyalım
  4. Seri monitörde ne göreceksin? Değerin anlamı ve kartlar arası fark
  5. Değer neden sabit kalıyor? Sırayla kontrol et
  6. Sonraki adım: potansiyometreden gerçek sensöre geçmek
  7. Sık Sorulan Sorular

Arduino'da analog okuma üç adımdan oluşur: sensörü kartın analog giriş pinine bağlarsın, kodda analogRead() ile o pindeki gerilimi okursun, sonucu Serial.println() ile seri monitörde izlersin. analogRead() pindeki gerilimi kartın ölçebildiği bir sayı aralığına çevirip tam sayı olarak döndürür. Potansiyometreyi çevirdikçe gerilim değişir, ekrandaki sayı da onunla birlikte değişir. Bu yazıda önce analog mu dijital mi okuman gerektiğine karar verecek, ardından potansiyometreyle ilk okumanı yapacaksın.

Analog mu dijital mi okumalısın? Üç soruluk karar çerçevesi

Sensörün sana vereceği bilgiye bakarak karar verebilirsin. Şu üç soruyu sırayla sor:

  1. Bilgi iki durumlu mu, aralıklı mı? "Var ya da yok", "basılı ya da değil" gibi iki seçenek varsa iki durumludur. "Ne kadar?" sorusunun cevabı bir ölçek üzerindeyse aralıklıdır.
  2. Aradaki ara değerler işine yarıyor mu? Kapının açık ya da kapalı olması yeterliyse ara değer anlamsızdır. Işığın ne kadar güçlü olduğunu bilmek istiyorsan ara değerler asıl bilgidir.
  3. Sensör çıkışı gerilim olarak mı değişiyor? Çıkışı 0 volt ile besleme gerilimi arasında kayan bir sensör analog girişe uygundur.

Buton ve kapı sensörü ilk iki soruda iki durumlu çıkar. Potansiyometre, ışık sensörü ve birçok sıcaklık sensörü ise gerilimi sürekli değiştirerek aralıklı bilgi verir.

Dijital giriş pindeki durumu yalnızca iki kategoriye ayırır: yüksek ya da düşük. Analog giriş ise pindeki gerilimi ölçer ve bir sayı aralığına çevirir. Kartın içindeki analog-dijital çevirici (ADC) bu işi yapar. Sonuçta gerilimin "ne kadar" olduğunu bir sayıyla okursun.

Potansiyometreyi Arduino'ya nasıl bağlarsın? Üç bacak, üç görev

Potansiyometreyi Arduino'ya nasıl bağlarsın? Üç bacak, üç görev

Bu yazıdaki örneklerde Arduino Uno R3 kullanıyoruz. Bu kartta analog giriş pinleri A0'dan A5'e kadar adlandırılmıştır ve kart 5V ile çalışır. Potansiyometrenin üç bacağının her birinin ayrı bir görevi var:

  1. Bağlantıları yapmadan önce kartın USB bağlantısını çıkar.
  2. Potansiyometrenin bir dış bacağını kartın 5V pinine bağla. Bu bacak beslemeyi getirir.
  3. Diğer dış bacağı GND pinine bağla. Bu bacak toprak hattıdır.
  4. Orta ucu (wiper) A0 pinine bağla. Okuyacağın değer bu uçtan gelir.
  5. Kartı USB ile yeniden bağla.

Dış bacakların yerini değiştirirsen devre bozulmaz, yalnızca dönüş yönü ters çevrilir. Daha önce düğmeyi sağa çevirdikçe artan değer, şimdi sola çevirdikçe artar.

Orta uç neden okunan uçtur? Potansiyometrenin içinde iki direnç parçası vardır ve düğmeyi çevirdikçe bu iki parçanın oranı değişir. Orta uç, besleme ile toprak arasındaki bu oranı gerilim olarak verir. Buna gerilim bölücü denir. Düğme besleme tarafına yaklaşınca orta uçtaki gerilim yükselir, toprak tarafına yaklaşınca düşer. A0 pini bu gerilimi okur.

Analog pin adları ve çalışma gerilimi karta göre değişir. Farklı bir kart kullanıyorsan pin adını ve besleme gerilimini kartının resmî Arduino dokümantasyon sayfasından kontrol et.

analogRead() kodunu satır satır okuyalım

Potansiyometrenin orta bacağı A0'a bağlıyken aşağıdaki sketch, pindeki gerilimi sayıya çevirip seri porta yazar:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int deger = analogRead(A0);
  Serial.println(deger);
  delay(200);
}

Satırların görevi şöyle:

  • Serial.begin(9600) seri haberleşmeyi saniyede 9600 bit hızıyla başlatır. Bu satır yalnızca bir kez, setup() içinde çalışır. Seri Monitör'de seçeceğin hız bu değerle aynı olmalı; uyuşmazlığın belirtilerini teşhis bölümünde göreceğiz.
  • analogRead(A0) A0 pinindeki gerilimi okur ve sonucu bir tam sayı (int) olarak döndürür. Pin numarasını parantez içine yazarsın.
  • int deger = bu sayıyı bir değişkene kaydeder. Böylece aynı değeri hem yazdırabilir hem de sonraki adımlarda koşullarda kullanabilirsin.
  • Serial.println(deger) sayıyı seri porta gönderir ve sonuna satır sonu ekler. Her okuma ayrı bir satırda görünür.
  • delay(200) döngüyü 200 milisaniye bekletir. Bu bekleme olmasa kart saniyede çok sayıda satır üretir ve ekrandaki akışı gözle takip edemezsin.

Beklenen çıktı: Potansiyometre yavaşça çevrilirken Seri Monitör'de buna benzer bir akış görürsün. Rakamlar örnektir, senin değerlerin milin konumuna göre değişir.

312
315
340
398
467
521

Seri monitörde ne göreceksin? Değerin anlamı ve kartlar arası fark

Seri monitörde ne göreceksin? Değerin anlamı ve kartlar arası fark

Sketch'i karta yükledikten sonra Arduino IDE'de Araçlar menüsünden Seri Monitör'ü aç. Pencerenin alt kısmındaki hız seçicisini koddaki Serial.begin() değerine, yani 9600'e getir. Hız eşleşirse sayılar alt alta akmaya başlar.

Potansiyometreyi bir uca doğru çevirdiğinde sayılar küçükten büyüğe akar, ters yöne çevirdiğinde azalır. Çünkü okunan sayı, pindeki gerilimle orantılıdır: gerilim arttıkça sayı artar.

En küçük ve en büyük değer kartın analog-dijital çevirici çözünürlüğüne bağlıdır. Örnek olarak Arduino Uno'yu alalım. Resmî Arduino dokümantasyonuna göre Uno'daki analogRead() 10 bitlik çözünürlükle çalışır: 0 V ile çalışma gerilimi olan 5 V arasını 0 ile 1023 arasındaki tam sayılara bölerek verir. Yani Uno'da mil bir uçtayken 0'a, diğer uçtayken 1023'e yakın değerler beklersin.

Başka bir kart kullanıyorsan bu aralığı Uno'dan kopyalama. Değer aralığı, analog pin adları ve referans gerilimi karta göre değişebilir. Kartının resmî Arduino sayfasındaki analogRead() açıklamasına bak.

Küçük bir not: Uçlarda tam sınır değerini her zaman görmeyebilirsin. Mil tam uca gelse bile 0 yerine 2, 1023 yerine 1021 gibi değerler okunabilir. Milini hiç oynatmasan da sayının bir iki birim oynaması da normaldir.

Mini deney

Potansiyometreyi bir uçtan diğerine yaklaşık beş saniyede çevir ve Seri Monitör'ü izle. Sayıların düzgün bir akışla mı yoksa sıçrayarak mı değiştiğini not et. Sonra milini yarı konumda sabit tutup değerin ne kadar oynadığına bak. Bu iki gözlem, ileride gerçek bir sensörden gelen veriyi yorumlarken işine yarayacak.

Değer neden sabit kalıyor? Sırayla kontrol et

Seri monitörde hep aynı sayıyı görüyorsan ya da ekrana anlamsız karakterler akıyorsa devre ile kod arasında bir kopukluk vardır. Önce şu dört noktaya bak:

  1. Besleme: Potansiyometrenin bir dış bacağı kartın besleme çıkışına bağlı olmalı.
  2. Toprak: Diğer dış bacak GND pinine gitmeli.
  3. Orta uç: Ortadaki bacak analog giriş pinine bağlı olmalı.
  4. Pin: Koddaki pin adı, orta ucun bağlandığı pinle aynı olmalı.

Dördü de tamamsa belirtiye göre sırayla ilerle:

  1. Orta uç yanlış bacakta. Ne görürsün: Düğmeyi çevirsen de değer hep en düşükte ya da hep en yüksekte kalır. Ne yaparsın: Orta bacağı bul ve analog pine taşı. Dış bacak girişe takılıysa kabloyu değiştir.
  2. Kod ile devredeki pin farklı. Ne görürsün: Düğmeyi çevirirken değer hiç tepki vermez. Ne yaparsın: Kodda A0 yazıyorsa kablonun gerçekten A0 pinine takılı olduğunu kontrol et, ikisini eşitle.
  3. Ortak toprak eksik. Ne görürsün: Değerler tutarsızdır. Devrede ayrı bir besleme kullanıyorsan bu daha olasıdır. Ne yaparsın: Tüm bileşenlerin GND hattını Arduino'nun GND pinine bağla. Devre tek bir referansta buluşsun.
  4. Seri monitör hızı uyuşmuyor. Ne görürsün: Sayı yerine bozuk karakterler. Ne yaparsın: Koddaki Serial.begin() değeri ile seri monitördeki hız seçimini aynı yap.
  5. Yanlış kart, yanlış port ya da tamamlanmamış yükleme. Ne görürsün: Yükleme hatası ya da kodu değiştirdiğin hâlde eski davranışın sürmesi. Ne yaparsın: Araçlar menüsünden doğru kartı ve portu seç, yüklemenin bittiğini bildiren mesajı bekle.
  6. Bağlantı boşta. Ne görürsün: Değer sabit değildir, rastgele gezinir. Sabit kalma ile dalgalanma farklı belirtilerdir. Ne yaparsın: Orta ucun havada kaldığını düşün, kablo ve breadboard temasını kontrol et.

Her seferinde yalnız tek şeyi değiştirip sonucu izlemek, hata ayıklamanın temelidir. Hepsini birden değiştirirsen neyin işe yaradığını anlayamazsın. Bu yaklaşım aslında sorunu parçalara bölüp adım adım düşünme becerisidir; algoritmik düşünme testiyle bu beceriyi kodsuz bir şekilde de deneyebilirsin.

Sonraki adım: potansiyometreden gerçek sensöre geçmek

Okuma mantığı değişmez: analog çıkış veren her sensör aynı yolla okunur. Işığa duyarlı direnç gibi bir sensörde yalnız devre farklıdır, analogRead() satırı aynı kalır.

Denemek için okuduğun değeri başka bir aralığa dönüştürebilir ya da bir LED'in parlaklığına bağlayabilirsin. Bir eşik değer belirleyip ışık azaldığında LED'i yakan basit bir gece lambası da iyi bir ikinci projedir. Başka konulara bakmak istersen blog arşivindeki diğer makalelere göz atabilirsin.

Sık Sorulan Sorular

analogRead() her pinde çalışır mı?

Hayır. analogRead() yalnızca analog giriş olarak tanımlı pinlerde çalışır. Bu pinlerin adları ve sayısı karttan karta değişir. Kartının pin şemasına ve resmî Arduino dokümantasyonuna bakarak doğru pini seç.

analogRead() değeri neden 0'dan başlıyor ve en yüksek değeri kartıma göre nasıl öğrenirim?

Sıfır, pindeki gerilimin en düşük seviyesine karşılık gelir. En yüksek değer ise kartın analog-dijital çevirici çözünürlüğüne bağlıdır. Kartının resmî Arduino dokümantasyonundaki analogRead() sayfasını ve kart sayfasını kontrol et. Bazı kartlarda çözünürlük ayarlanabilir.

Potansiyometre değeri neden küçük küçük titriyor?

Elektriksel gürültü, gevşek temas ve küçük gerilim dalgalanmaları okumanın birkaç birim oynamasına yol açabilir. Önce kablo ve breadboard bağlantılarını sıkılaştır. Sonra birkaç okumanın ortalamasını almayı ya da okumalar arasına kısa bir bekleme koymayı dene.

Analog okuma bir kez oturduğunda sensör ve devre değişse de aynı düşünce yolu işe yarar: bağla, oku, izle, gerekirse tek tek kontrol et.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara