Bu projede bazı melodileri çalmak için piezoelektrik bir zil (buzzer) kullanacağız. Notaların frekanslarını öğrenip 8 bitte daha dün annemizin dinleyeceğiz.
Arduino melodisi, tanınabilir notlara benzeyen frekanslar oluşturmak için bir piezo zil (buzzer) kullanır. Arduino IDE arayüzünü, belirli bir melodiyi çalmak için notaların sıralamasını, oranını ve süresini belirlemek için kullanırız.
Piezo (buzzer), küçük oyuncaklarda sıklıkla kullanılan ucuz ses çıkaran parçadır. Plastik gövdesi olmayan bir piezo elemanı, pozitif (tipik olarak kırmızı) ve negatif (tipik olarak siyah) telleri olan altın metalik bir disk gibi görünür. Bir piezo sadece voltaj uygulayarak yarattığımız bir klik sesini çıkarabilir. Piezo'nun belirli bir frekansta saniyede yüzlerce kez ses çıkarmasını sağlayarak tanınabilir notlar oluşturabiliriz, bu yüzden ilk önce istediğimiz farklı tonların frekansını bilmemiz gerekir.
Tablo notaları ve bunlara karşılık gelen frekansları göstermektedir. Periyot, frekansın oluşturulduğu mikrosaniye cinsinden sürenin süresidir. Notayı oluşturmak için kodda kullanılan timeHigh değerini almak için periyot değerini yarıya indiririz.
NOTA | FREKANS | PERİYOT | TIMEHIGH |
---|---|---|---|
C | 261 Hz | 3,830 | 1915 |
D | 294 Hz | 3,400 | 1700 |
E | 329 Hz | 3,038 | 1519 |
F | 349 Hz | 2,864 | 1432 |
G | 392 Hz | 2,550 | 1275 |
A | 440 Hz | 2,272 | 1136 |
B | 493 Hz | 2,028 | 1014 |
C | 523 Hz | 1,912 | 956 |
int speakerPin = 9; // buzzer bağlantı pini int length = 15; // toplam nota sayısı char notes[] = "ccggaagffeeddc "; // sondaki boşluk es vermek için int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; int tempo = 300; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); delayMicroseconds(tone); } } // TimeHigh değerini belirli notlara ayarlama void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; for (int i = 0; i < 8; i++) { // Notaya karşılık gelen ses tonu if (names[i] == note) { playTone(tones[i], duration); } } } void setup() { pinMode(speakerPin, OUTPUT); } // melodiyi çalalım void loop() { for (int i = 0; i < length; i++) { if (notes[i] == ' ') { delay(beats[i] * tempo); // Bekleme yani es verme } else { playNote(notes[i], beats[i] * tempo); } delay(tempo / 2); // notalar arası bekleme süresi } }