- Gerekli malzemeler:
- Devre şeması:
- Şemalar ve Açıklama:
- Anlamak
- Arduino'da piyano tonlarının çalınması:
- Arduino'nun Programlanması:
- Oynatın, Kaydedin, Tekrar Oynatın ve Tekrarlayın! :
Arduino, elektronik geçmişi olmayan insanlar için kolayca bir şeyler inşa etmek için bir nimet olmuştur. Harika bir prototip oluşturma aracı oldu ya da harika bir şey denemek için, bu projede Arduino'yu kullanarak küçük ama eğlenceli bir Piyano yapacağız. Bu piyano sadece 8 düğme ve zil ile oldukça sade. Hoparlörde çeşitli piyano notaları oluşturmak için Arduino'nun ton () işlevini kullanır. Biraz renklendirmek için projeye kayıt özelliğini ekledik, bu bize bir melodi kaydı çalmamızı ve gerektiğinde tekrar tekrar çalmamızı sağlıyor. Doğru ilginç ses !! Öyleyse inşa etmeye başlayalım….
Gerekli malzemeler:
- Arduino Uno
- 16 * 2 LCD Ekran
- Buzzer
- Giyotin 10k
- SPDT anahtarı
- Basma düğmesi (8 Adet)
- Dirençler (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Breadboard
- Bağlantı telleri
Devre şeması:
Tam Arduino Piyano Projesi, bazı bağlantı kabloları ile bir devre tahtasının üzerine inşa edilebilir. Projenin breadboard görünümünü gösteren fritzing kullanılarak yapılan devre şeması aşağıda gösterilmiştir.
Sadece devre şemasını takip edin ve kabloları buna göre bağlayın, bir PCB modülü ile kullanılan basma düğmeleri ve sesli uyarıcı, ancak gerçek donanımda sadece anahtar ve zil kullandık, aynı tip pin çıkışına sahip oldukları için sizi çok fazla karıştırmamalı.. Bağlantılarınızı yapmak için aşağıdaki donanım resmine de başvurabilirsiniz.
Soldan dirençlerin değeri aşağıdaki sırayla 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k ve 10k şeklindedir. Aynı DPST anahtarına sahip değilseniz, yukarıdaki devre şemasında gösterildiği gibi normal geçiş anahtarını kullanabilirsiniz. Şimdi neden aşağıdaki bağlantıları yaptığımızı anlamak için projenin şemalarına bakalım.
Şemalar ve Açıklama:
Yukarıda gösterilen devre şeması için şemalar aşağıda verilmiştir, aynı zamanda Fritzing kullanılarak yapılmıştır.
Anlamamız gereken ana bağlantılardan biri , 8 düğmeyi Analog A0 pini aracılığıyla Arduino'ya nasıl bağladığımızdır. Temel olarak 8 giriş butonuna bağlanabilen 8 giriş pinine ihtiyacımız var, ancak bunun gibi projeler için mikrodenetleyicinin 8 pinini sadece butonlar için kullanamayız çünkü daha sonra kullanmak için ihtiyacımız olabilir. Bizim durumumuzda arayüzlenecek LCD ekranımız var.
Bu yüzden Arduino'nun analog pinini kullanıyoruz ve devreyi tamamlamak için değişen direnç değerlerine sahip potansiyel bir bölücü oluşturuyoruz. Bu şekilde, her düğmeye basıldığında Analog pin'e farklı bir analog voltaj sağlanacaktır. Yalnızca iki dirençli ve iki basmalı düğmeli örnek bir devre aşağıda gösterilmiştir.
Bu durumda ADC pini, butonlara basılmadığında + 5V alacaktır, ilk butona basıldığında potansiyel bölücü 560R direnci ile tamamlanır ve eğer ikinci butona basılırsa potansiyel bölücü 1.5 kullanılarak rekabet eder. k direnci. Bu şekilde, ADC pini tarafından alınan voltaj, potansiyel bölücü formüllerine bağlı olarak değişecektir. Potansiyel bölücünün nasıl çalıştığı ve ADC pimi tarafından alınan voltaj değerinin nasıl hesaplanacağı hakkında daha fazla bilgi edinmek istiyorsanız, bu potansiyel bölücü hesaplayıcı sayfasını kullanabilirsiniz.
Bunun dışında tüm bağlantılar düzdür, LCD 8, 9, 10, 11 ve 12 numaralı pinlere bağlanır. Buzzer, pin 7'ye ve SPDT anahtarı, Arduino'nun pin 6'sına bağlanır. Tam proje, dizüstü bilgisayarın USB bağlantı noktasından güç alır. Arduino'yu DC jakı üzerinden 9V veya 12V beslemeye de bağlayabilirsiniz ve proje yine aynı şekilde çalışacaktır.
Anlamak
Arduino, bir zil kullanarak farklı sesler üretmek için kullanılabilen değişken frekans sinyalleri üretmek için kullanılabilen kullanışlı bir ton () işlevine sahiptir. Öyleyse fonksiyonun nasıl çalıştığını ve Arduino ile nasıl kullanılabileceğini anlayalım.
Ondan önce bir Piezo zilinin nasıl çalıştığını bilmeliyiz. Okulumuzda Piezo kristalleri hakkında bir şeyler öğrenmiş olabiliriz, mekanik titreşimleri elektriğe çeviren bir kristalden başka bir şey değildir veya tersi. Burada kristalin titreştiği ve böylece ses üreten değişken bir akım (frekans) uyguluyoruz. Bu nedenle, Piezo zilinin biraz gürültü yapmasını sağlamak için Piezo elektrik kristalini titreştirmek zorundayız, ses perdesi ve tonu kristalin ne kadar hızlı titreştiğine bağlıdır. Bu nedenle ton ve perde, akımın frekansını değiştirerek kontrol edilebilir.
Tamam, peki Arduino'dan nasıl değişken bir frekans elde ederiz? Tone () işlevi burada devreye girer. Tone (), belirli bir pin üzerinde belirli bir frekans oluşturabilir. Zaman süresi de gerekirse belirtilebilir. Tone () için sözdizimi
Sözdizimi tonu (pin, frekans) ton (pin, frekans, süre) Parametreler pin: ton frekansının oluşturulacağı pin: tonun hertz cinsinden frekansı - işaretsiz int süresi: milisaniye cinsinden ton süresi (isteğe bağlı1) - imzasız uzun
Pin değerleri dijital pininizden herhangi biri olabilir. Burada 8 numaralı pini kullandım. Üretilebilecek frekans, Arduino kartınızdaki zamanlayıcının boyutuna bağlıdır. UNO ve diğer birçok yaygın kartlar için üretilebilecek minimum frekans 31Hz ve üretilebilecek maksimum frekans 65535Hz'dir. Ancak biz insanlar sadece 2000 Hz ile 5000 Hz arasındaki frekansları duyabiliyoruz.
Arduino'da piyano tonlarının çalınması:
Tamam, daha bu konuya başlamadan önce nota veya piyano konusunda acemi olduğumu açıkça belirtmeme izin verin, bu nedenle bu başlık altında bahsedilen herhangi bir şey anlamsızsa lütfen beni affedin.
Artık Arduino'daki ton işlevini bazı sesler üretmek için kullanabileceğimizi biliyoruz, ancak aynı şeyi kullanarak belirli bir notanın tonlarını nasıl çalabiliriz. Bizim için şanslıyız ki, Brett Hagman tarafından yazılmış "pitches.h" adlı bir kütüphane var . Bu kütüphane, hangi frekansın bir piyanodaki hangi notaya eşdeğer olduğu hakkında tüm bilgileri içerir. Bu kütüphanenin gerçekte ne kadar iyi çalışıp bir piyanoda neredeyse her notayı çalabildiğine şaşırdım, aynısını Karayip Korsanları, Çılgın Kurbağa, Mario ve hatta titanic'in piyano notalarını çalmak için kullandım ve kulağa harika geliyordu. Oops! Burada biraz konu dışına çıkıyoruz, bu yüzden bununla ilgileniyorsanız Arduino projesini kullanarak melodileri çalmaya bakın. Ayrıca bu projede pitches.h kütüphanesi hakkında daha fazla açıklama bulacaksınız.
Projemizde yalnızca 8 basma düğmesi vardır, böylece her düğme yalnızca belirli bir müzik notasını çalabilir ve böylece toplamda yalnızca 8 nota çalabiliriz. Bir piyanoda en çok kullanılan notaları seçtim, ancak herhangi bir 8'i seçebilir veya hatta daha fazla düğme ile projeyi genişletebilir ve daha fazla not ekleyebilirsiniz.
Bu projede seçilen notalar sırasıyla 1'den 8'e kadar olan tuşlar kullanılarak çalınabilen C4, D4, E4, F4, G4, A4, B4 ve C5 notalarıdır.
Arduino'nun Programlanması:
Yeterince teori, Arduino'yu programlamanın eğlenceli kısmına geçmemize izin verin. Tam Arduino Programı hevesli eğer aşağı atlamak ya da nasıl kod çalıştığını anlamak için daha fazla okuyabilir bu sayfanın sonunda verilmiştir.
Arduino programımızda analog voltajı A0 pininden okumalı ve ardından hangi düğmeye basıldığını tahmin edip o düğme için ilgili tonu çalmalıyız. Bunu yaparken kullanıcının hangi düğmeye bastığını ve ne kadar süreyle bastığını da kaydetmeliyiz, böylece kullanıcı tarafından çalınan tonu daha sonra yeniden oluşturabiliriz.
Mantık kısmına geçmeden önce hangi 8 notayı çalacağımızı belirtmeliyiz. Notaların ilgili frekansı daha sonra pitches.h kütüphanesinden alınır ve aşağıda gösterildiği gibi bir dizi oluşturulur. Burada C4 notasını çalma frekansı 262'dir ve bu böyle devam eder.
int not = {262, 294, 330, 349, 392, 440, 494, 523}; // C4, D4, E4, F4, G4, A4, B4 için frekansı ayarlayın,
Daha sonra , LCD ekranın hangi pimlere bağlı olduğunu belirtmeliyiz. Yukarıda verilen şemaların aynısını takip ediyorsanız, burada hiçbir şeyi değiştirmenize gerek yoktur.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // LCD'nin bağlı olduğu pinler LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Ardından, kurulum işlevimizin içinde, hata ayıklama için sadece LCD modülünü ve seri monitörü başlatıyoruz. Ayrıca, işlerin planlandığı gibi çalıştığından emin olmak için bir giriş mesajı da görüntüleriz. Sonra , ana döngü fonksiyonunun içinde iki while döngüsümüz var.
SPDT anahtarı daha fazla kayda yerleştirildiği sürece bir while döngüsü yürütülür. Kayıt modunda kullanıcı gerekli tonları ödeyebilir ve aynı zamanda çalınmakta olan ton da kaydedilecektir. Yani while döngüsü aşağıdaki gibi görünür
while (digitalRead (6) == 0) // Geçiş anahtarı kayıt modunda ayarlanmışsa {lcd.setCursor (0, 0); lcd.print ("Kayıt.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Fark etmiş olabileceğiniz gibi while döngüsü içinde iki işleve sahibiz. İlk işlev Detect_button () , kullanıcının hangi düğmeye bastığını bulmak için kullanılır ve ikinci işlev Play_tone () ilgili tonu çalmak için kullanılır. Bu işlevin dışında Detect_button () işlevi de hangi düğmeye basıldığını kaydeder ve Play_tone () işlevi düğmeye ne kadar süreyle basıldığını kaydeder.
İçinde Detect_button () fonksiyonu biz pim A0 analog voltaj okuma ve preslenmiş olan düğme bulmak için bazı önceden tanımlanmış değerlerle karşılaştırmak. Değer, yukarıdaki voltaj bölücü hesaplayıcı kullanılarak veya her düğme için hangi analog değerin okunduğunu kontrol etmek için seri monitör kullanılarak belirlenebilir.
void Detect_button () { analogVal = analogRead (A0); // A0 pinindeki analog voltajı oku pev_button = buton; // (analogVal <550) button = 8 ise kullanıcı tarafından basılan önceki düğmeyi hatırlayın ; eğer (analogVal <500) button = 7; eğer (analogVal <450) button = 6; eğer (analogVal <400) button = 5; eğer (analogVal <300) button = 4; eğer (analogVal <250) button = 3; eğer (analogVal <150) button = 2; eğer (analogVal <100) button = 1; eğer (analogVal> 1000) button = 0; / **** Basılan düğmeleri bir dizide kaydedin *** / eğer (düğme! = pev_button && pev_button! = 0) { registered_button = pev_button; button_index ++; kaydedilen_düğmesi = 0; button_index ++; } / ** Kayıt programının sonu ** / }
Söylendiği gibi, bu işlevin içinde düğmelere basılma sırasını da kaydediyoruz. Kaydedilen değerler, registered_button adlı bir dizide saklanır . Önce yeni bir buton olup olmadığını kontrol ederiz, eğer basılıysa sonra da buton 0 olup olmadığını kontrol ederiz. Burada buton 0 hiçbir şey değildir ama butona basılmaz. İf döngüsünün içinde, button_index değişkeni tarafından verilen indeks konumunda değeri saklarız ve daha sonra bu indeks değerini aynı yere fazla yazmamak için arttırırız.
/ **** Basılan düğmeleri bir diziye kaydedin *** / if (button! = Pev_button && pev_button! = 0) { registered_button = pev_button; button_index ++; kaydedilen_düğmesi = 0; button_index ++; } / ** Kayıt programının sonu ** /
Play_tone () işlevinin içinde, birden çok if koşulu kullanarak basılan düğme için ilgili tonu çalacağız. Ayrıca, içinde düğmeye basıldığı süreyi kaydedeceğimiz kaydedilen_zaman adlı bir dizi kullanacağız. İşlem, her bir düğmeye ne kadar süre basıldığını belirlemek için milis () işlevini kullandığımız ve ayrıca değişkenin boyutunu düşürmek için değeri 10'a böldüğümüz için düğme sırasını kaydetmeye benzer. herhangi bir şeye basmak, aynı süre boyunca ton çalmaz. İşlevin içindeki kodun tamamı aşağıda gösterilmiştir.
void Play_tone () { / **** Bir dizideki her düğmeye basılması arasındaki zaman gecikmesini kaydedin *** / if (düğme! = pev_button) { lcd.clear (); // Sonra temizleyin note_time = (milis () - başlangıç_süresi) / 10; kaydedilen_zaman = not_süresi; time_index ++; başlangıç_süresi = milis (); } / ** Kayıt programının sonu ** / if (button == 0) { noTone (7); lcd.print ("0 -> Duraklat.."); } if (düğme == 1) { ton (7, notalar); lcd.print ("1 -> NOTE_C4"); } if (düğme == 2) { ton (7, notalar); lcd.print ("2 -> NOTE_D4"); } if (button == 3) { ton (7, nota); lcd.print ("3 -> NOTE_E4"); } if (düğme == 4) { ton (7, notalar); lcd.print ("4 -> NOTE_F4"); } if (button == 5) { ton (7, notalar); lcd.print ("5 -> NOTE_G4"); } if (button == 6) { ton (7, notalar); lcd.print ("6 -> NOTE_A4"); } if (button == 7) { ton (7, notalar); lcd.print ("7 -> NOTE_B4"); } if (button == 8) { ton (7, notalar); lcd.print ("8 -> NOTE_C5"); } }
Son olarak, kayıttan sonra kullanıcının kaydedilen tonu çalmak için DPST'yi diğer yöne çevirmesi gerekir. Bu yapıldığında, program önceki while döngüsünden kopar ve daha önce kaydedilmiş bir süre boyunca basılan düğmeler sırasına göre notaları çaldığımız ikinci while döngüsüne girer. Aynısını yapmak için kod aşağıda gösterilmiştir.
while (digitalRead (6) == 1) // Geçiş anahtarı Oynatma modunda ayarlanmışsa { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Şimdi Oynatılıyor.."); for (int i = 0; i <sizeof (kaydedilen_button) / 2; i ++) { gecikme ((kaydedilen_zaman) * 10); // Bir sonraki melodiyi ödemeden önce bekleyin if ( registered_button == 0) noTone (7); // kullanıcı kuvvetiyle dokunmatik herhangi bir tuşa başka tonu (7, notları - 1)]); // kullanıcının dokunduğu düğmeye karşılık gelen sesi çalın } } }
Oynatın, Kaydedin, Tekrar Oynatın ve Tekrarlayın!:
Donanımı gösterilen devre şemasına göre yapın ve kodu Arduino kartına ve gösterilen zamanına yükleyin. SPDT'yi kayıt modunda konumlandırın ve seçtiğiniz tonları çalmaya başlayın, her düğmeye basmak farklı bir ton üretecektir. Bu mod sırasında, LCD " Kaydediliyor…" gösterecek ve ikinci satırda, aşağıda gösterildiği gibi, o anda basılmakta olan notun adını göreceksiniz.
Tonunuzu çaldıktan sonra, SPDT anahtarını diğer tarafa getirin ve LCD'de “ Şimdi Yürütülüyor..” görüntülenmeli ve ardından az önce çaldığınız tonu çalmaya başlamalıdır. Geçiş anahtarı aşağıdaki resimde gösterilen konumda tutulduğu sürece aynı ton tekrar tekrar çalınacaktır.
Projenin tam çalışması aşağıdaki videoda bulunabilir. Umarım projeyi anladınız ve inşa etmekten keyif aldınız. Bu oluşturmada herhangi bir sorun yaşarsanız, bunları yorum bölümünde yayınlayın veya projenizle ilgili teknik yardım için forumları kullanın. Ayrıca aşağıda verilen tanıtım videosunu kontrol etmeyi unutmayın.