back to top

PicoBricks ile Piyano Projesi

PicoBricks ile Piyano Projesi

Elektronik Teknolojisinin gelişmesiyle beraber üretimi zor, pahalı kaliteli ses veren müzik aletleri dijital ortama taşınmıştır. Piyanolar da bu enstrümanlardan biridir. Dijital piyanoların her bir tuşu farklı frekanslarda elektrik sinyalleri üreterek 88 farklı nota çalabilmektedirler. Dijital müzik aletlerin gecikme süreleri, hoparlörlerinin kalitesi, ses çözünürlüğü gibi faktörler kalitelerini etkileyen faktörlerdir. Elektro gitarlarda butonlar yerine tellerdeki titreşimler dijitalleştirilir. Nefesli çalgılarda ise ses çıkışına entegre edilen yüksek çözünürlüklü mikrofonlar ile çalınan notalar elektrik sinyallerine dönüştürülerek kaydedilebilir. Elektronik teknolojisindeki bu inovasyon, maliyeti yüksek olan müzik aletlerine erişimi kolaylaştırmıştır.

Bu projemizde PicoBricks kullanarak 7 farklı nota çalabilen basit bir piyano yapacağız. Piyanon hoparlörü olarak bir buzzer ve tuşları olarak ultrasonik sensör kullanacağız.

Detaylar ve Algoritma

Bu projede PicoBricks üzerinde bulunan HC-SR04 Ultrasonik mesafe sensörü ve buzzer kullanarak piyano yapacağız. Kullanacağımız mesafe sensöründen gelen verilere göre buzzer’ın farklı notalar çalmasını sağlayacağız. Ayrıca mesafe ve çalınan notaların OLED ekranda anlık olarak gösterilmesini sağlayacağız.

Bileşenler

1x PicoBricks

1x HC-SR04 Ultrasonik Mesafe Sensörü

Jumper Kablolar

Bağlantı Kabloları

Devre Şeması

Devre Şeması

Yapım Aşamaları

Yapım Aşamaları

MicroBlocks Kodları

MicroPython Kodları

from machine import Pin, PWM, I2C
from utime import sleep
import utime
from picobricks import SSD1306_I2C
import _thread

# Define the libraries
buzzer = PWM(Pin(20, Pin.OUT))
trigger = Pin(15, Pin.OUT)
echo = Pin(14, Pin.IN)

# Define the input and Output pins
WIDTH = 128
HEIGHT = 64

# OLED screen settings
sda = machine.Pin(4)
scl = machine.Pin(5)
i2c = machine.I2C(0, sda=sda, scl=scl, freq=1000000)

# Initialize digital pin 4 and 5 as an OUTPUT for OLED communication
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
measure = 0

def getDistance():
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(5)
    trigger.low()
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
    timepassed = signalon - signaloff
    distance = (timepassed * 0.0343) / 2
    return distance

def airPiano():
    global measure
    while True:
        if 5 < measure < 11:
            buzzer.duty_u16(4000)
            buzzer.freq(262)
            sleep(0.4)
        elif 10 < measure < 16:
            buzzer.duty_u16(4000)
            buzzer.freq(294)
            sleep(0.4)
        # ... [Kodun geri kalanı bu şekilde devam ediyor]

# Play the tone determined by the value of the distance sensor
while True:
    measure = int(getDistance())
    oled.text("Distance " + str(measure) + " cm", 5, 30)
    oled.show()
    sleep(0.01)
    oled.fill(0)
    oled.show()

Arduino C Kodları

#include <Wire.h>
#include "ACROBOTIC_SSD1306.h"
#include <NewPing.h>
#define TRIGGER_PIN 15
#define ECHO_PIN 14
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
#define T_C 262
#define T_D 294
#define T_E 330
#define T_F 349
#define T_G 392
#define T_A 440
#define T_B 493
const int Buzzer = 20;

void setup() {
    pinMode(Buzzer,OUTPUT);
    Wire.begin();
    oled.init();
    oled.clearDisplay();
    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
    clock_prescale_set(clock_div_1);
    #endif
}

void loop() {
    delay(50);
    int distance = sonar.ping_cm();
    if(distance > 5 & distance < 11) {
        tone(Buzzer, T_C);
    }
    // ... [Kodun geri kalanı bu şekilde devam ediyor]
    oled.clearDisplay();
    oled.setTextXY(2, 4);
    oled.putString("Distance: ");
    oled.setTextXY(4, 6);
    String string_distance = String(distance);
    oled.putString(string_distance);
    oled.setTextXY(4, 8);
    oled.putString("cm");
}

Son Çıkan Yazılar

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz