Elektronik teknolojisinin gelişmesiyle birlikte üretimi zor, pahalı ve kaliteli ses üreten müzik aletleri dijital ortama taşınmıştır. Piyanolar da bu enstrümanlardan biridir. Dijital piyanoların her tuşu farklı frekansta elektrik sinyalleri üretir. Böylece hoparlörlerinden 88 farklı nota çalabilmektedir. Dijital enstrümanların tuşlarının gecikme süresi, hoparlörün kalitesi, sesin çözünürlüğü gibi faktörler kaliteyi etkileyen faktörler olarak karşımıza çıkmıştır. Elektro gitarlarda tuşlar yerine tellerdeki titreşimler dijitalleştirilir. Nefesli çalgılarda ise ses çıkışına takılan yüksek çözünürlüklü mikrofonlar sayesinde çalınan notalar elektrik sinyallerine dönüştürülerek kaydedilebilmektedir. Elektronik teknolojisindeki bu gelişme, yüksek maliyetli müzik aletlerine erişimi kolaylaştırmış, müzik eğitimi daha geniş bir çeşitlilik kazanmış ve daha geniş kitlelere yayılmıştır.
Bu projemizde PicoBricks ile 7 nota çalabilen basit bir piyano yapacağız. Bu piyanonun hoparlörü zil. Ultrasonik sensör piyanonun tuşları görevi görecektir.
Ayrıntılar ve Algoritma
Bu projemizde PicoBricks üzerinde bulunan HC-SR04 Ultrasonik mesafe sensörü ve buzzer modülünü kullanarak piyano uygulaması yapacağız. Mesafe sensöründen gelen değerlere göre zilin farklı notalar çalmasını sağlayacağız ve elimizi sensöre yaklaştırıp uzaklaştırarak melodiler oluşturacağız. Ayrıca mesafe ve çalınan nota bilgilerini de anlık olarak ekrana yazdıracağız. OLED ekran.
Bileşenler
1X PicoBrick
1X HC-SR04 Ultrasonik Sensör
Atlama Kabloları
Kolay Bağlantı Kabloları
Bağlantı şeması
Picobricks modüllerini kablolama olmadan kodlayabilir ve çalıştırabilirsiniz. Modülleri panodan ayırarak kullanacaksanız modül bağlantılarını grove kablolarla yapmalısınız.
Projenin İnşaat Aşamaları
PicoBricks'in MicroBlock Kodları
Projenin Microblocks kodlarına görseli Microblocks Run sekmesine sürükleyerek veya butonuna tıklayarak ulaşabilirsiniz. düğme.
PicoBricks'in MicroPython Kodları
makineden içe aktarma Pin, PWM, I2C
utime içe aktarma uykusundan
kullanım süresini içe aktar
picobricks'ten SSD1306_I2C'yi içe aktar
_thread'i içe aktar
# Kütüphaneleri tanımlayın
buzzer = PWM(Pin(20, Pin.OUT))
tetikleyici = Pin(15, Pin.OUT)
echo = Pin(14, Pin.IN)
# Giriş ve Çıkış pinlerini tanımlayın
GENİŞLİK = 128
YÜKSEKLİK = 64
# OLED ekran ayarları
sda = makine.Pin(4)
scl = makine.Pin(5)
i2c = makine.I2C(0, sda=sda, scl=scl, frek=1000000)
# OLED iletişimi için dijital pin 4 ve 5'i ÇIKIŞ olarak başlatın
oled = SSD1306_I2C(GENİŞLİK, YÜKSEKLİK, i2c)
ölçü = 0
def getDistance():
tetikleyici.düşük()
utime.sleep_us(2)
tetikleyici.yüksek()
utime.sleep_us(5)
tetikleyici.düşük()
while echo.value() == 0:
signaloff = utime.ticks_us()
while echo.value() == 1:
signalon = utime.ticks_us()
geçen süre = sinyal açık - sinyal kapalı
mesafe = (geçen süre * 0,0343) / 2
dönüş mesafesi
def airPiano():
küresel ölçü
Doğru iken:
eğer 5 < ölçü < 11 ise:
buzzer.duty_u16(4000)
buzzer.freq(262)
uyku(0,4)
elif 10 < ölçü < 16:
buzzer.duty_u16(4000)
buzzer.freq(294)
uyku(0,4)
# ... [Kodun geri kalanı bu şekilde devam ediyor]
# Mesafe sensörünün değerine göre belirlenen tonu çalın
Doğru iken:
ölçü = int(getDistance())
oled.text("Mesafe " + str(ölçü) + " cm", 5, 30)
oled.show()
uyku(0,01)
oled.fill(0)
oled.show()
PicoBricks'in Arduino C Kodları
#include
#include "ACROBOTIC_SSD1306.h"
#include
#define TRIGGER_PIN 15
#define ECHO_PIN 14
#define MAX_DISTANCE 400
YeniPing sonarı(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
#define T_C 262
#tanımla T_D 294
#define T_E 330
#tanımla T_F 349
#tanımla T_G 392
#tanımla T_A 440
#tanımla T_B 493
const int Buzzer = 20;
geçersiz kurulum() {
pinMode(Buzzer,OUTPUT);
Wire.begin();
oled.init();
oled.clearDisplay();
#if tanımlanmış(__AVR_ATtiny85__) && (F_CPU == 16000000)
watch_prescale_set(clock_div_1);
#endif
}
geçersiz döngü () {
gecikme(50);
int mesafe = sonar.ping_cm();
if(mesafe > 5 & mesafe < 11) {
tone(Buzzer, T_C);
}
// ... [Kodun geri kalanı bu şekilde devam ediyor]
oled.clearDisplay();
oled.setTextXY(2, 4);
oled.putString("Mesafe: ");
oled.setTextXY(4, 6);
String string_distance = String(mesafe);
oled.putString(string_distance);
oled.setTextXY(4, 8);
oled.putString("cm");
}
GitHub Sayfası