Ana içeriğe git
Konu: Dijital Ses Kontrolü (977 Kez okunmuş)

Ynt: Dijital Ses Kontrolü

Yanıt #15

@Mr_YAMYAM
Hocam bu resimlere bakarak hangi elemanları değiştirmem gerektiğini söyleyebilir misiniz?
Devre Şeması:

Ton Kontrol Cevabı:

BOUT (Bass Out) ve BIN (Bass in) kondansatörlerini değiştirebilirsin.
100nF için roll-off frekansı 100Hz olarak verildiğine göre bu kondansatörleri 220nF yapmak gerekecektir.
Entegre iç tasarımı hakkında bilgi olmadığı için kesin bir formül verilemez. Çünkü ROLL-OFF frekansı R-C formülüne göre hesaplanmaktadır.
Burada kullanılacak kondansatörler anlaşıldığı kadarıyla sinyal hattı üzerinde bulunan aktif komponentlerdendir.
Yani sinyaller o kondansatörler üzerinden akmaktadır. Bu sebeple bu kondansatörlerin tip ve özellikler son derece önemlidir.
Bilindik polyester tipli kondansatör kullanımı uygun olmayabilir. Benim önerim M-L (Multi-Layer) veya polypropilen denilen tiplerden kullanılması yönündedir.

Ynt: Dijital Ses Kontrolü

Yanıt #16
BOUT (Bass Out) ve BIN (Bass in) kondansatörlerini değiştirebilirsin.
100nF için roll-off frekansı 100Hz olarak verildiğine göre bu kondansatörleri 220nF yapmak gerekecektir.
Entegre iç tasarımı hakkında bilgi olmadığı için kesin bir formül verilemez. Çünkü ROLL-OFF frekansı R-C formülüne göre hesaplanmaktadır.
Burada kullanılacak kondansatörler anlaşıldığı kadarıyla sinyal hattı üzerinde bulunan aktif komponentlerdendir.
Yani sinyaller o kondansatörler üzerinden akmaktadır. Bu sebeple bu kondansatörlerin tip ve özellikler son derece önemlidir.
Bilindik polyester tipli kondansatör kullanımı uygun olmayabilir. Benim önerim M-L (Multi-Layer) veya polypropilen denilen tiplerden kullanılması yönündedir.

Hocam elimde sadece 4 tane ML 220nF kondansatör var, fakat ölçüm yaptığımda 180nF çıkıyor. Uygun olmaz derseniz polipropilen kondansatör temin edene kadar polyester kullanmak istiyorum.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #17
@Furkan41
Hocam kodu bitirdim.
Bir eksiklik, yanlışlık var ise düzeltmem adına yardımcı olursanız sevinirim.
Kod: [Seç]
#include <Wire.h>
byte volume = 30;
byte leftmute = 128;
byte rightmute = 160;
byte loud = 68;
byte bass = 111;
byte treble = 127;
int VolumeUp = 2;
int VolumeDown = 3;
int Mute = 4;
int Loudness = 5;
int BassUp = 6;
int BassDown = 7;
int TrebleUp = 8;
int TrebleDown = 9;
void setup() {
  pinMode(VolumeUp, INPUT);
  pinMode(VolumeDown, INPUT);
  pinMode(Mute, INPUT);
  pinMode(Loudness, INPUT);
  pinMode(BassUp, INPUT);
  pinMode(BassDown, INPUT);
  pinMode(TrebleUp, INPUT);
  pinMode(TrebleDown, INPUT);
  Wire.begin();
  Wire.beginTransmission(128);
  Wire.write(volume);
  Wire.write(leftmute);
  Wire.write(rightmute);
  Wire.write(loud);
  Wire.write(bass);
  Wire.write(treble);
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(128);
  if (VolumeUp == HIGH, volume < 60) {
    volume++;
    Wire.write(volume);
  } else if (VolumeUp == HIGH, volume == 60) {
    volume = 60;
    Wire.write(volume);
  }
  if (VolumeDown == HIGH, volume > 0) {
    volume--;
    Wire.write(volume);
  } else if (VolumeDown == HIGH, volume == 0) {
    volume = 0;
    Wire.write(volume);
  }
  if (Mute == HIGH) {
    leftmute = 159;
    rightmute = 191;
    Wire.write(leftmute);
    Wire.write(rightmute);
  } else {
    leftmute = 128;
    rightmute = 160;
    Wire.write(leftmute);
    Wire.write(rightmute);
  }
  if (Loudness == HIGH) {
    loud = 64;
    Wire.write(loud);
  } else {
    loud = 68;
    Wire.write(loud);
  }
  if (BassUp == HIGH, bass == 104) {
    bass = 104;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 111, bass >= 104) {
    bass--;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass == 102) {
    bass + 9;
    Wire.write(bass);
  } else if (BassUp == HIGH, bass <= 102, bass >= 96) {
    bass++;
    Wire.write(bass);
  }
  if (BassDown == HIGH, bass == 96) {
    bass = 96;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass > 96, bass <= 102) {
    bass--;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass == 111) {
    bass - 9;
    Wire.write(bass);
  } else if (BassDown == HIGH, bass <= 111, bass >= 104) {
    bass++;
    Wire.write(bass);
  }
  if (TrebleUp == HIGH, treble == 120) {
    treble = 104;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 127, treble >= 120) {
    treble--;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble == 118) {
    treble + 9;
    Wire.write(treble);
  } else if (TrebleUp == HIGH, treble <= 118, treble >= 112) {
    treble++;
    Wire.write(treble);
  }
  if (TrebleDown == HIGH, treble == 112) {
    treble = 96;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble > 112, treble <= 127) {
    treble--;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble == 127) {
    treble - 9;
    Wire.write(treble);
  } else if (TrebleDown == HIGH, treble <= 127, treble >= 120) {
    treble++;
    Wire.write(treble);
  }
  Wire.endTransmission();
}

@Mr_YAMYAM
Hocam bu resimlere bakarak hangi elemanları değiştirmem gerektiğini söyleyebilir misiniz?
Devre Şeması:

Ton Kontrol Cevabı:


Merhaba, Şuan köyde olduğum için ve internet doğru düzgün cekmediği için. acele olarak yazıyorum.

Kodunda gördüğüm ilk hata if şartlarına yazdığın şart if şartının icinde " , " Virgül olmaz. sen orada örnek veriyorum volume arttırma tuşuna basılmışsa ve volum 60 dan düşük ise volumeyi arttır demişsin. fakato virgül ile olmaz  && (VE) işareti ile olur örnek bir yazım göstermek gerekirse.

if(volbutton==HIGH && volume < 60 ) // volume butonuna basılmışsa ve volume küçük ise 60 dan.
{
// buradaki işlemleri yap
}

olucak. sen AND , OR  gibi mantıksal işlemlerede göz at lazım olacak.  mantıksal operatörler diye araştır internette.

ve entegreyi alıp denemelere başla. denemelerde kodu komple yazma ilk volume kısmını test et başarılı şekilde iletişim kur baktın bu işi kaptın komple kodu yazmaya başlarsın. böyle bir hata yaparsan uğraşır durursun.

soruna gelicek olursak 100kbit/s   100KHz lik iletişim demektir. yani senin SERİAL CLOCK 'un 100khz olucak. ben arduino ile pek takılmıyor. o yüzden hangi fonksiyon ile bunu ayarlıyorsun bilmiyorum ama I2C protokolünü başlattığın fonksiyonda iletişim hızını ister hangisi istiyorssa 100khz yapıştır.

şimdi baktım. İletişim hızını ayarlaman icin WireSetClock(iletişim hızı); fonksiyonu nu kullanacaksın.
https://www.arduino.cc/en/Reference/WireSetClock
bu sayfada anlatışmış. I2Cprotokolünü kurarken bunuda ayarla 100khz e.

bir diğer sorularına gelelim.

Arduino'da da start ve stop bitlerini ayarlamak gerekiyor mu?
Wire.beginTransmission(128);
Bununla iletişimi başlatıp,
Wire.endTransmission();
bununla bitirmiyor muyuz?

Start ve stop bitlerini ayarlamana gerke yokk arduino platformunu oluşturan kişiler bunları fonksiyonların icinde yapıyor yani sen Wire.endTransmission(); dediğinde aslında arka tarafta stop biti gönderiliyor. buraları kafana takma fonksiyonlar hallediyor.

son olarak gördüğüm diğer şey ise şu . Yazma işlemin hatalı yazma işlemini söyle yaptır.

void Datagonder(unsigned char byte)
{
Wire.beginTransmission(cihaz adresini buraya gir.);
  Wire.write(byte);
Wire.endTransmission();
}

bu fonksiyonu arduinoda setup kısmındna önce tanımla yani oraya kopyala. ve şimdide bunu programda nasıl kullanacağını göstereyim.

if(volumebutton == HIGH && volume < 60)
{
volume++;  volume değişkenini 1 arttır.
Datagonder(volume);  // volume değerini slave cihaza gönder.
}

niye böyle yaptığımıza gellirsek. eğer data katoloğunu incelersen. iletişime her başlarken ilk cihaz adresini gönder daha sonra N +1 kadar byte gönder demiş yani stoplamassan istediğin kadar peş peşe data yolla demiş. bizde bir fonksiyon kurduk. o fonksiyon yazma işi yapıyor.  Datagonder fonksiyonana bakarsan ilk cihaz adresini gönderip ileitşimi kuruyor daha sonra gidecek datayı yazdırıyor. daha sonra iletişimi bitiriyor. sağlıklı bir ileitşim oluyor. kodunu bu anlattıklarıma göre yeniden şekillendir.

ve muhakkak Mantıksal operatörrleri incele. ayiretten bit düzeyinde mantıksal işlemlerede bak. kesinlikle bak. madem ilgi duyuyorsun bir şeyler yapmaya calışıyorsun. ben sana yardımcı olurum ama sende araştır. öğren. takıldığın yerde gel.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #18
Ve son olarak. devreyi kurarsan. arduinonun GND si ile amfiyi beslediğin beslemenin gnd sini sakın ortak yapma. arduinonun GND sini entegrenin DJGGND kısmına bağla. yeter.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #19
Ve son olarak. devreyi kurarsan. arduinonun GND si ile amfiyi beslediğin beslemenin gnd sini sakın ortak yapma. arduinonun GND sini entegrenin DJGGND kısmına bağla. yeter.
Hocam sizin yazdığınız gibi yaptım ancak hata verdi.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #20
...
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #21
byte kelimesini değişken ismi olarak kullanamassın byte yerine  " veri " yaz.  
Wire.write(); icinede veri yaz.

void Datagonder(unsigned char veri)
{
Wire.beginTransmission(128);
  Wire.write(veri);
Wire.endTransmission();
}

bu fonksiyonu setup kısmının icine yazma dedim. dışına yaz


Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #22
son olarak gördüğüm diğer şey ise şu . Yazma işlemin hatalı yazma işlemini söyle yaptır.

void Datagonder(unsigned char byte)
{
Wire.beginTransmission(cihaz adresini buraya gir.);
  Wire.write(byte);
Wire.endTransmission();
}

bu fonksiyonu arduinoda setup kısmındna önce tanımla yani oraya kopyala. ve şimdide bunu programda nasıl kullanacağını göstereyim.
byte kelimesini değişken ismi olarak kullanamassın byte yerine  " veri " yaz.  
Wire.write(); icinede veri yaz.

void Datagonder(unsigned char veri)
{
Wire.beginTransmission(128);
  Wire.write(veri);
Wire.endTransmission();
}

bu fonksiyonu setup kısmının icine yazma dedim. dışına yaz


İki mesajın çelişmesi :D
Neyse. Yaptım ama yine de aynı hatayı veriyor.
Ekleme:
Evet, sanırım son dediğiniz doğruymuş :D
Şimdi LCD için kod eklemeye gidiyorum, bir saat sonra dönerim :)
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #23
Entegre varmı ? deneme yaparak mı gidiyorsun ?

LCD 2x16 ise bari menülü bir şey yapmaya calış
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #24
Entegre varmı ? deneme yaparak mı gidiyorsun ?

LCD 2x16 ise bari menülü bir şey yapmaya calış
Yok hocam entegre gelince hepsini toptan deneyeceğim :)
LCD 4x20 kullanacağım. Büyük ekran olsun ki LCD'nin kötü görüntüsünü bastırsın :D
Normalde OLED ekran kullanacaktım ama LCD başlangıç için daha kolay olur diye düşündüm.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #25
İyi bakalım hadi kolay gelsin.
Mekatronik Teknikeri.
Elektrik-Elektronik Teknisyeni.

Ynt: Dijital Ses Kontrolü

Yanıt #26
Hatalar olsa da program çok özenli yazılmış Serhat. Kaynak kodunun formatlanma şekli neticede işlemcide çalışan makina kodunu etkilemese de, programcının işini severek yaptığını ve dağınık birisi olmadığını gösterir. Ayrıca özenli yazılmış bir programda hata analizi yapmak çok daha kolaydır.
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #27
Ben de birkaç tavsiyede bulunayım.

1) Mekanik butonlar, özellikle de yaylı olanlar, durum değiştirirken kontaklar üzerinde birkaç kez sekebilir. Eğer program da buton durumunu yeterince sıklıkta okuyorsa her bir sekmeyi görecektir ve sanki buton birkaç kez basılmış gibi işlem yapacaktır. O yüzden butonu "debounce" etmen lazım. Bunu da basitçe şöyle yapabilirsin: Butonun bir önceki durumunu da takip edersin ve buton son 10 kez (veya kaç kez gerekiyorsa sorunu çözmek için) aynı değerde kaldı ise butona basılmış kabul edersin.

2) Senin yaptığın gibi her bir butonu test edip ona göre I2C ye veri yazacağına, butonların durumunu test edip volume, mute, bass, treble, loudness değişkenlerini güncelle. loop'un sonunda da bütün değişkenleri entegreye yaz. Bu şekilde program daha sağlam olur. Örneğin bazan statik elektrik nedeniyle entegrenin kafası karışabilir, ama sen her döngü sonunda güncel değerleri yazdığını için kafa karışıklığı çok kısa sürer ve döngü sonunda entegre kendine gelir :)
Elektrik sayacı döndürücüsü ...

Ynt: Dijital Ses Kontrolü

Yanıt #28
Hatalar olsa da program çok özenli yazılmış Serhat. Kaynak kodunun formatlanma şekli neticede işlemcide çalışan makina kodunu etkilemese de, programcının işini severek yaptığını ve dağınık birisi olmadığını gösterir. Ayrıca özenli yazılmış bir programda hata analizi yapmak çok daha kolaydır.
Hocam çok teşekkür ederim. Bu tip övgüler beni işimi yapmaya sevk etse de bazı sebepler canımı sıkıyor. Ben nasıl bu kadar düzenli bir kod yazdığıma dair bir fikre sahip değilim. Zira atölyem bayağı karışık, bütün parçalar birbirinden alakasız yerlerde, o yüzden ben de şaşırmaktayım :)
Ben de birkaç tavsiyede bulunayım.

1) Mekanik butonlar, özellikle de yaylı olanlar, durum değiştirirken kontaklar üzerinde birkaç kez sekebilir. Eğer program da buton durumunu yeterince sıklıkta okuyorsa her bir sekmeyi görecektir ve sanki buton birkaç kez basılmış gibi işlem yapacaktır. O yüzden butonu "debounce" etmen lazım. Bunu da basitçe şöyle yapabilirsin: Butonun bir önceki durumunu da takip edersin ve buton son 10 kez (veya kaç kez gerekiyorsa sorunu çözmek için) aynı değerde kaldı ise butona basılmış kabul edersin.

2) Senin yaptığın gibi her bir butonu test edip ona göre I2C ye veri yazacağına, butonların durumunu test edip volume, mute, bass, treble, loudness değişkenlerini güncelle. loop'un sonunda da bütün değişkenleri entegreye yaz. Bu şekilde program daha sağlam olur. Örneğin bazan statik elektrik nedeniyle entegrenin kafası karışabilir, ama sen her döngü sonunda güncel değerleri yazdığını için kafa karışıklığı çok kısa sürer ve döngü sonunda entegre kendine gelir :)
Hocam birinci öneriniz konusunda açık ve net söylemek gerekirse hiçbir fikrim yok.
İkinci önerinizi yarın uygulayıp kodu özelden gönderirim. Şeklini almış son kodu paylaşmak istemiyorum.
Dijital Ses Kontrolü : %90 Tamamlandı
TEA2025B Ampli : %70 Tamamlandı
LM1875 2.1 Ampli : %40 Tamamlandı
Transistörlü Ampli v1.0 : Hazırda Bekliyor
Sırada : STK4191II Ampli

Ynt: Dijital Ses Kontrolü

Yanıt #29
Hocam çok teşekkür ederim. Bu tip övgüler beni işimi yapmaya sevk etse de bazı sebepler canımı sıkıyor. Ben nasıl bu kadar düzenli bir kod yazdığıma dair bir fikre sahip değilim. Zira atölyem bayağı karışık, bütün parçalar birbirinden alakasız yerlerde, o yüzden ben de şaşırmaktayım :)

Sen bu işi severek yapmaya devam et, böyle yaparsan zaten hem görsel olarak hem de işlevsel olarak en iyi programı ortaya çıkarmaya çalışacaksın. 30 yıldan fazla süredir gömülü sistem programlama işindeyim, ve karışık kuruşuk, şekilsiz kod yazıp da programı iyi çalışan görmedim. Bir şiir gibi özenle formatlanmış, tertemiz program yazan ama yazdığı programlarda hep sorun çıkan da görmedim.

Hocam birinci öneriniz konusunda açık ve net söylemek gerekirse hiçbir fikrim yok.
İkinci önerinizi yarın uygulayıp kodu özelden gönderirim. Şeklini almış son kodu paylaşmak istemiyorum.

Neyse, senin şu ISDS osiloskop gelsin,  debounce ile ne demek istediğimi bizzat ekranda görebileceksin. Bu arada aynı osiloskoptan ben de ısmarladım. Onun bir incelemesini yapacağım inşallah.
Elektrik sayacı döndürücüsü ...