Ses sensörleri; ortam sesini sayısal olarak ölçmek veya ortam sesinin önceden tanımlanmış bir eşik değerinin üzerinde olup olmadığını kontrol etmek için kullanılır. Sensörülerin üzerinde, eşik değerini ayarlamak için potansiyometre bulunur.
Sensörler genellikle 3 veya 4 pinli olarak iki çeşittir.
- DO (Digital Output) pini; ortam sesi eşik değerinin altındaysa HIGH, üzerindeyse LOW çıkış verir.
- G (Ground) pini toprak pinidir.
- V (Voltage) pini +5V gerilim hattına bağlanır.
- AO (Analog Output) pini ortam sesinin değerini sayısal olarak verir. Bu pin Arduino üzerinde analog girişlerden birine bağlanarak 0-1024 arasında değer okunabilir. 3 pinli ses sensörlerinde bu pin mevcut değildir.
Malzemeler
- 1 adet Arduino
- 1 adet 4 pin ses sensörü
Bağlantı şeması
Bu örnek, 4 pin ses sensörü içindir. 3 pin sensör kullanılarak uygulanırsa Arduino’ nun A0 pinine giden hat kullanılmayacak, diğer bağlantılar aynı kalacaktır.
Kaynak kod
Arduino için kaynak kod:
void setup() { pinMode(7,INPUT); Serial.begin(9600); } void loop() { // Ses seviyesini analog olarak oku (analog pin) int deger = analogRead(A0); // Gürültü miktarını 0-1023 arasında oku Serial.println(deger); delay(100); // Bir sonraki okuma için 0,1 saniye bekle }
Kaynak kod yüklendiğinde Arduino seri port ekranında ortamın ses seviyesi aşağıdaki şekilde görünür.
Seri porta iletilen bu veriyi Python ile okuyup bir numpy dizisine yazarak bunun grafiğini çıkarmak için aşağıdaki kaynak kod kullanılır.
import serial import time import matplotlib.pyplot as plt import numpy as np plt.close('all') # açık tüm plot pencerelerini kapat plt.figure() # yeni plot oluştur plt.ion() # interaktif plot modu açık plt.show() # plot ekranını aç veri = np.array([]) # seri porttan okunan verinin kaydedileceği dizi i=0 while i<200: d = serial.Serial("/dev/cu.usbserial-1410", 9600, timeout=1) oku = d.readline() oku.decode() i = i+1 try: oku_float = float(oku[0:8]) # seri porttan okunan veriyi float'a dönüştür veri = np.append(veri, oku_float) # float'a dönüştürülen veriyi diziye ekle plt.cla() # plotu temizle plt.plot(veri) # veriyi çiz plt.pause(0.01) # kısa süre pause veriyoruz. aksi halde plot yapılmaz except: print("hata") d.close()
Burada dikkat edilmesi gereken, Arduino seri port bilgisinin Python’da doğru girilmesidir. Bunun için Arduino programının araçlar menüsündeki port bilgisi, yukarıdaki d = serial.Serial("/dev/cu.usbserial-1410", 9600, timeout=1)
kod satırındaki çift tırnak içindeki alana doğru şekilde girilmelidir. Python kodu bilgisayarda çalıştırıldığında 200 defa (while i<200:
) seri port verisi okunup aşağıdaki şekilde grafiği çizilir.