10
Oca
2022

Arduino ve Python ile ortam ses seviyesi grafiği çizme

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.

%d blogcu bunu beğendi: