Gelişen yapay zeka ve robotik teknolojileri, yaratıcı projelerin önünü açmaya devam ediyor. Bu blog yazısında, yapay zeka desteğiyle müzik aleti çalabilen bir sistem oluşturmanın adımlarını paylaşacak ve Arduino kartı ile servo motorları kullanarak nasıl bir şarkıyı çalabileceğinizi anlatacağız. Haydi, adım adım bu etkileyici projeyi gerçekleştirelim!
Kullanılan Malzemeler
Proje için gerekli olan temel malzemeler ve detayları şu şekildedir:
- PCA9685 16 Kanal I2C PWM/Servo Sürücü Kartı (Klon)
Özellikle birden fazla servo motoru kolayca kontrol edebilmek için kullanılır. - SG90 RC Mini (9gr) Servo Motor
Hafif yapısı ve hassas kontrol imkanı ile tuşlara basılması için idealdir. - USB Yazıcı Kablosu (1.5 Metre)
Arduino UNO R3’ü bilgisayara bağlamak için kullanılır. - Arduino UNO R3 (CH340 USB Chip)
Projede servoların hareketini kontrol etmek için temel kontrol kartı. - 40 Pin Ayrılabilen Dişi-Erkek Jumper Kablo (200 mm)
Bağlantıları kolayca yapabilmek için kullanılır. - 40 Pin Ayrılabilen Erkek-Erkek Jumper Kablo (200 mm)
Devre için gerekli ek bağlantıları sağlamak için tercih edilir.
Projede, servo motorlar müzik aletinin tuşlarına basarak bir melodiyi canlandırıyor. Motorlar, Arduino ile senkronize bir şekilde hareket ederek belirlenen şarkının notalarına uygun bir performans sergiliyor. Şarkının notaları daha önceden tanımlanıyor ve sistem, her bir notaya karşılık gelen tuşa basılmasını sağlıyor. Bu sayede, müzik aleti adeta kendi kendine çalıyormuş gibi bir etki oluşturuyor.

Projeyi hayata geçirmek için öncelikle servo motorların hareketini kontrol eden bir sistem kuruyoruz. Ardından, belirlediğimiz şarkıya ait notaların hangi tuşlara denk geldiğini tanımlıyoruz. Bu bilgiler, Arduino ile motorlara iletiliyor ve her nota, servo motorlar yardımıyla bir fiziksel harekete dönüştürülüyor.
Projenin en heyecan verici yanı, teknolojinin müzikle buluştuğu noktada yarattığı etkileşimi deneyimlemek. Tuşlara basan servo motorları izlemek ve ortaya çıkan melodiyi dinlemek, teknolojinin yarını neler getirebileceğini anlamamıza yardımcı oluyor.
Phyton Kodu:
import google.generativeai as genai
import PIL.Image
import os
import re
import serial
import time
current_dir = os.getcwd()
ser = serial.Serial("COM3",9600)
def goruntuyu_isle(dosya_dizini):
resim_dosya_=".jpg"
resim_yolu = os.path.join(dosya_dizini, resim_dosya_)
print(f"Görsel işleniyor: {resim_yolu}")
try:
img = PIL.Image.open(resim_yolu)
model = genai.GenerativeModel(model_name="gemini-1.5-flash")
response = model.generate_content(["List the notes in this piece in order. Only notes (do, re, mi, fa, sol, la, si)", img])
response2 = model.generate_content(["Carefully examine the provided sheet music and list only the note durations (e.g., 1/4, 1/8, 1/2, etc.) in the exact order they appear, with no additional information.", img])
if response2.text:
text2 = response2.text
listevurus = text2.split()
for i in listevurus:
i = i.lower()
if i == "1/4":
vurus = 1
elif i == "1/2":
vurus = 2
elif i == "1/8":
vurus = 0.5
elif i == "1/16":
vurus = 0.25
if response.text:
text = response.text
print(f"Algılanan metin: {response.text}")
liste = text.split()
x=0
for i in liste:
i = i.lower()
print(i)
print(f"\nvurus: {listevurus[x]}\n")
x+=1
if i == 'do':
ser.write(b'c')
elif i == 're':
ser.write(b'd')
elif i == 'mi':
ser.write(b'e')
elif i == 'fa':
ser.write(b'f')
elif i == 'sol':
ser.write(b'g')
elif i == 'la':
ser.write(b'a')
elif i == 'si':
ser.write(b'b')
elif i == 'do#' or i == 'reb':
ser.write(b'x')
elif i == 're#' or i == 'mib':
ser.write(b'o')
elif i == 'fa#' or i == 'solb':
ser.write(b's')
elif i == 'sol#' or i == 'lab':
ser.write(b'j')
elif i == 'la#' or i == 'bb':
ser.write(b'l')
time.sleep(0.1)
else:
print(f"bulunamadı.")
except Exception as e:
print(f"resim işlenirken bir hata oluştu: {e}")
pass
if __name__ == "__main__":
genai.configure(api_key="")
goruntu_klasoru = f'{current_dir}\\'
goruntuyu_isle(goruntu_klasoru)
Arduino Kodu:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN 150
#define SERVOMAX 600
void setup() {
Serial.begin(9600);
Serial.println("PCA9685 Servo Test");
pwm.begin(); // PWM sürücüyü başlat
pwm.setPWMFreq(50); // Frekansı 50 Hz olarak ayarlayın (servo motorlar için uygun)
delay(10);
pwm.setPWM(0, 0, (SERVOMIN + SERVOMAX) / 2);
pwm.setPWM(1, 0, (SERVOMIN + SERVOMAX) / 2);
pwm.setPWM(2, 0, (SERVOMIN + SERVOMAX) / 2);
pwm.setPWM(3, 0, SERVOMIN);
pwm.setPWM(6, 0, SERVOMIN);
pwm.setPWM(4, 0, SERVOMIN);
pwm.setPWM(5, 0, SERVOMIN);
}
void loop()
{
if (Serial.available())
{
char veri = Serial.read();
if (veri == 'c')
{
// Servo motoru 0 dereceye hareket ettir
pwm.setPWM(0, 0, SERVOMIN);
delay(300);
// Servo motoru 90 dereceye hareket ettir
pwm.setPWM(0, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
}
else if(veri == 'd')
{
pwm.setPWM(1, 0, SERVOMIN);
delay(300);
pwm.setPWM(1, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
}
else if(veri == 'e')
{
pwm.setPWM(2, 0, SERVOMIN);
delay(300);
pwm.setPWM(2, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
}
else if(veri == 'f')
{
pwm.setPWM(3, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(3, 0, SERVOMIN);
delay(300);
}
else if(veri == 'g')
{
pwm.setPWM(6, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(6, 0, SERVOMIN);
delay(300);
}
else if(veri == 'a')
{
pwm.setPWM(4, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(4, 0, SERVOMIN);
delay(300);
}
else if(veri == 'b')
{
pwm.setPWM(5, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(5, 0, SERVOMIN);
delay(300);
}
//diyez bemol
else if(veri == 'x') //c# db
{
pwm.setPWM(7, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(7, 0, SERVOMIN);
delay(300);
}
else if(veri == 'o') //d# eb
{
pwm.setPWM(8, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(8, 0, SERVOMIN);
delay(300);
}
else if(veri == 's') //f# gb
{
pwm.setPWM(9, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(9, 0, SERVOMIN);
delay(300);
}
else if(veri == 'j') //g# ab
{
pwm.setPWM(10, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
pwm.setPWM(10, 0, SERVOMIN);
delay(300);
}
else if(veri == 'l') //a# bb
{
pwm.setPWM(11, 0, SERVOMIN);
delay(300);
pwm.setPWM(11, 0, (SERVOMIN + SERVOMAX) / 2);
delay(300);
}
}
}
Devre Şeması:

Servo motorların turuncu kablosu PCA9685 kartının kanal sinyal pinine, kırmızı kablosu V+ pinine, kahverengi kablosu ise GND pinine bağlanır. PCA9685 kartın SDA ve SCL pinleri, Arduino’nun A4 ve A5 pinlerine bağlanarak I2C protokolü ile haberleşir. Harici güç kaynağı PCA9685’e bağlanır ve Arduino’nun GND’si ile ortaklandır. Bu bağlantılar, servo motorları hassas bir şekilde kontrol etmemizi sağlar.
Bu sistem, müzik ve teknolojinin yarattığı eşsiz bir deneyim sunarken, hem robotik kodlamaya ilgi duyanlar için ilham kaynağı oluyor hem de teknolojinin sanatla birleştirilmesine güzel bir örnek oluşturuyor. Siz de bu yaratıcı projeyi yakından incelemek ve detayları öğrenmek için videomuzu izleyebilirsiniz!
Youtube Videosu: