Thursday, August 28, 2014

Disket Sürücüsü ile Müzik Çalmak

Herkese merhaba, ilk defa üniversite son sınıftayken youtube üzerinde gördüğüm floopy diskler(disket sürücü) ile müzik çalma işlemini uzun zamandır yapmak istiyordum. Bugün bahsedeceğim konu bu. Hatta yaklaşık 3 ay gibi bir süre Hermes İletişim'de part-time çalıştığım vakit, bu konuyu anlattığım ve aramızda ilk önce kim yapacak diye ufak bir iddiaya tutuştuğum Aşkın Yollu'ya armağan ediyorum bu yazıyı. Öncelikle ihtiyacımız olan malzemelerin listesini vereyim.

1 - Arduino UNO

2 - Kullanılmayan Bir Disket Sürücüsü (Yazıda 3.25 inchlik 34-pine sahip sürücü kullanıyorum, birden fazla kullanabilirsiniz)

3 - Kullanılmayan Bir ATX Güç Kaynağı (Şart değil, gereken akımı Arduino üzerinden de alabilirsiniz)

4 - CAT5 UTP Kablolar (Sürücü ve Arduino arasındaki bağlantılar için)

5 - Breadboard

Yukarıdaki malzemelerimiz tam ise, sürücümüzü müzik çalar hale getirmeye başlayabiliriz. Öncelikle eğer güç kaynağı kullanacaksanız, güç kaynağımızın aşağıdaki resimde görüldüğü gibi yeşil ve herhangi bir siyah kablosunu kısa devre yaptırıyoruz. Bu sayede güç kaynağımız sabit 5 voltluk bir enerji verecektir. Bu enerji ise disket sürücüsünü çalıştırmak için yeterlidir.



Disket sürücümüzün çalışabilmesi için güç kaynağından çıkan 4'lü Female-to-Female kablomuzu sürücümüze bağlamamız gerekiyor. Yazının sonlarına doğru güç kaynağını devreden çıkarıp akımı nasıl Arduino üzerinden disket sürücüsüne geçireceğinizi de anlatacağım.


Şimdi sıra disket sürücümüzün step ve direction motorlarını yöneten pinleri Arduino ile bağlamaya geldi. Fakat bunun öncesinde aşağıdaki resmi ardından tabloyu incelemekte fayda var. Resimde disket sürücüsünün pinlerinin numaralandırılışı bulunmaktadır. Tablomuz ise hangi pinlerin sürücümüz üzerinde neye etki ettiğini göstermektedir.



Bizim ihtiyacımız olan ise 12, 18 ve 20 numaralı pinler. Bu pinleri açıklamak gerekirse, 12 numaralı pin 13 numaralı pin ile kısa devre yapılıp disket sürücüsüne güç kaynağından enerji gelmesi sağlanacak. 18 numaralı pin disket sürücüsünün direction motorunu yöneten pin ve 19 numaralı pin ise direction motorunun toprağı konumunda. Son olarak 20 numaralı pin sürücünün step motorunu kontrol eden pin ve 21 numaralı pin ise step motorunun toprağıdır. Genelde çift numaralı pinler akımın giriş yaptığı, tek numaralı pinler ise bu akımın çıkış(topraklama) yaptığı pinlerdir.


Bağlantı işlemini aşağıda bulunan resimdeki gibi yaptıktan sonra güç kaynağını fişe takıp sürücünün çalışıp çalışmadığını kontrol edebilirsiniz. Eğer sürücümüzün ışığı yanıyorsa buraya kadar olan işlemi doğru yapmışız demektir. Görsel aynı zamanda sürücü ile Arduino arasındaki bağlantıları nasıl yapacağımızı da göstermektedir.




Eğer sisteme başka bir disket sürücü daha yerleştirmek istiyorsak, yukarıdaki işlemlerin aynısını gerçekleştiriyoruz. Sadece yeni eklenen sürücünün direction motorunu yöneten 18 numaralı pin Arduino'nun 5 numaralı dijital pinine, yeni eklenen sürücünün step motorunu yöneten 20 numaralı pin Arduino'nun 4 numaralı dijital pinine gidecektir. Her eklenen yeni sürücünün direction ve step motor pinleri Arduino'da boşta kalan ardışık dijital pinlere yerleştirilmelidir.

Ben şimdiki projeyi tek sürücü ile yaptım, 2 sürücü ile yapmaya çalıştığım vakit, sistem 2 sürücünün aynı anda çalışmaya başladığı zaman kısa devre yapmasıyla sonlandı.

Gerekli bağlantıların hepsini yaptık, buraya kadar olan kısım mekanik kısımdı. Bundan sonraki kısım ise programlama ağırlıklı olacak. Öcelikle proje için ihtiyacımız olan her şeyi sırasıyla indirmeliyiz.

Gerekli Yazılımlar

1 - Arduino Software - Arduino'nun resmi sitesinden indirebilirsiniz.

2 - JDK 7u4 with NetBeans 7.4 - NetBeans'in resmi sitesinden indirebilirsiniz.

3 - Moppy Software (Java/Arduino Code) - Program SammyIAm tarafından geliştirilmiştir. Sizin için derlediğim versiyonu buradan indirebilirsiniz. SammyIAm Github adresindeki versiyonu indirmek için ise buraya tıklayınız.

Gerekli kurulumları yapıp benim sizler için derlediğim Moppy Software versiyonunu indirdiğinizi varsayarak devam ediyorum. İndirdiğimiz Moppy Software arşiv dosyasını WinRAR ya da benzeri bir programla açıyoruz.

Şimdi sırasıyla;

1 - Öncelikle Arduino için yazılmış olan "Moppy.ino" dosyasını cihaza upload etmek için "TimerOne" kütüphanesine ihtiyaç duyarız. Bu kütüphane indirdiğimiz arşiv dosyasında "MUSICAL_FLOPPY\Arduino\library" yolunda bulunmaktadır. Bu kütüphaneyi Arduino kütüphanelerinin arasına eklemeliyiz.

2 - Arduino için yazılmış olan ve dijital pinlerden disket sürücüsünün step ve direction motorlarına sinyal yollayan kodu Arduino'muza yüklüyoruz. Bu kodun bulunduğu yer "MUSICAL_FLOPPY\Arduino\Moppy" klasörünün altındaki "Moppy.ino" dosyasıdır. Bu dosyayı Arduino Software ile açıp cihazımıza upload ediyoruz. Burada kodun her bir satırını açıklamayı düşünmüyorum. Fakat spesifik olarak anlamadığınız bir nokta olursa ve yardım almak isterseniz yorum yapabilirsiniz. Elimden geldiğince yardımcı olmaya çalışırım.


3 - "MoppyDesk" projesini Netbeans kullanılarak açıyoruz. İlk başta bazı kütüphanelerin bulunamadığını söyleyen hatalar alacağız. Bunların üstesinden gelmek için eksik kütüphaneleri projeye import etmeliyiz. Olası eksik kütüphanelerin hepsi "MUSICAL_FLOPPY\Java\library" klasörünün altında bulunmaktadır. Özellikle "rxtx-2.1-7-bins-r2" kütüphanesi için sisteminize uygun versiyonu seçmelisiniz. Linux, Windows veya 32-Bit, 64-Bit sistemler için farklı versiyonlar bulunmaktadır.

NOT: "RXTXcomm.jar" dosyası sisteminizde yüklü olan Java'nın "\jre\lib\ext" klasörü altına, "rxtxSerial.dll" dosyası sisteminizde yüklü olan Java'nın "\jre\bin" klasörü altına kopyalanmalıdır. RXTXcomm kütüphanesi projeye "\jre\lib\ext" yolundan import edilmelidir.

4 - Projeyi "Run" ettiğimiz vakit "java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver" hatası ile karşılaşabiliriz. Bu hatayı gidermek için NetBeans'te projeye sağ tıklayıp menuden "Properties" seçeneğine tıklayarak açılan pencereden "Run" kategorisini seçip "VM Options" kısmı için link dosyasının yolunun doğruluğunu kontrol etmemiz gerekli. Şimdi her şeyi halletmiş bulunmaktayız. Tekrar "Run" dediğimiz vakit program çalışacaktır.


Program doğru bir şekilde çalışıyorsa, önce uygun porttan Arduino ile bağlantımızı gerçekleştiriyoruz. Ardından çaldıracağımız parçanın MIDI dosyasını "Load Sequence" butonuna basarak seçiyoruz. Daha önce indirmiş olduğunuz projenin içinde örnek parçalar bulunmaktadır. Bu parçalara "MUSICAL_FLOPPY\Java\MoppyDesk\samplesongs" yolundan ulaşabilirsiniz. Parçamızı da seçtikten sonra "Start" butonuna basıp müziği dinleyebiliriz.




Karşılaşılan Sorunlar ve Çözümler

Sorun 1 - Güç kaynağı kullanarak yaptığım modelde proje sadece tek disket sürücüsü ile çalışmaktadır. Fakat 2.sürücüyü eklediğim vakit, MIDI dosyası Arduino tarafından sürücülere sinyal şeklinde yollanırken 2 sürücüye de aynı anda sinyal gidince sistem kısa devre yapmaktadır.

Çözüm - İlk sorunu güç kaynağını ortadan kaldırarak çözdüm. Güç kaynağı yerine enerjiyi direkt olarak Arduino üzerinden aldım. Bu sayede sistemde varolan kısa devre sorunu hallolmuş oldu. Ancak 2 sürücü ile yapılan denemede de çalınan parça kulağıma pek hoş gelmedi. Hatta tek sürücü ile çalınan parça daha temizdi. Arduino'ya yüklediğimiz "Moppy.ino" kodunda birkaç optimizasyon yapılmalı gibime geliyor ya da disket sürücülerim çok eski olduğu için istediğim performansı veremiyor olabilir.

Sorun 2 - Arduino için yazılan .ino uzantılı kod, Arduino'nun 2.'den 17.'i dijital pinine kadar hepsinin disket sürücülerinin direction ve step motorlarına bağlandığı varsayılarak yazılmış. Ve hepsi için sinyal üreten bir kod. Yani eğer tek bir disket sürücünüz var ise bazı notaların eksik çıktığını göreceksiniz. Aslında notalar eksik değil hiç olmayan disket sürücülerinin step ve direction motorlarına sinyal olarak gönderiliyor. Bu yüzden çalınan müzik kulağa pek hoş gelmiyor. Bunun nedeni belki disket sürücüsünün eski olması da olabilir.

Çözüm - İlk sorunun çözümünde bahsettiğim gibi bu sorun için "Moppy.ino" kodunda değişiklik yapılmalı ya da işlem daha yeni disket sürücüler ile denenmeli.

Disket Sürücüsünü Arduino Üzerinden Beslemek

Aslında yukarıda yaptığımız şey önce güç kaynağını sisteme 5 volt veren basit bir kaynak haline getirip onun üzerinde bulunan 4'lü Female-to-Female bağlantı noktası aracılığı ile sürücüye gereken akımı güç kaynağı üzerinden dağıtmaktı. Şimdi ise Arduino üzerinde hali hazırda bulunan 5 voltluk pin ve herhangi bir Ground pini aracılığı ile bu akımı dağıtacağız. Bunun için aşağıdaki görseller size yardımcı olacaktır.


Arduino'dan aldığımız 5 voltu disket sürücümüzde normalde 4'lü Female-to-Female bağlantısında kırmızı kabloya denk gelen pine, yine Arduino'dan aldığımız groundu 4'lü Female-to-Female bağlantısında siyah kablolardan hernagi birisine bağlayarak güç kaynağına olan bağımlılığımızdan kurtulabiliriz. Benim yaşadığım ve yukarıda bahsettiğim sistemdeki kısa devre sorunundan bu sayede kurtuldum.


Eğer her şeyi doğru yaptıysanız, disket sürücünüz istediğiniz parçayı çalacaktır. Yeterince uzun bir yazı oldu, sizlere veda etmeden önce çalışmanın resimlerini ve videolarını paylaşıyorum. Bir sonraki yazıya kadar kendinize iyi bakın.




Proje için 2 video çektim. İlk videoda tek disket sürücüsü çalışırken ikinci videoda 2 disket sürücüsü çalışmaktadır. Tek disket sürücüsü ile daha iyi sonuç alındığını gözlemledim. 2 disket sürücüsü olunca sürücüler arası ses değişimi sorunlara sebep oluyor. Bu benim sürücülerimden ya da bağlantılardan kaynaklanıyor olabilir. Bu arada görüntüler pek kaliteli değil. 


8 comments:

  1. Merhabalar elimde iki disket surucu var fakat hic bir sekilde isiklari yanmiyor elektrik alamiyorlar arduinodanda denedim yine olmadi baglantidami hata yapiyorum disket suruculerin calisir durumda olup olmadiklarini nasil anliya bilirim

    ReplyDelete
  2. Elektrik bağlantıları doğru mudur? En soldaki pin 12V, ortadaki ikisi topraklama (-), en sağdaki ise, 5V.

    ReplyDelete
  3. iyi günler linki tekrar upload yapabilir misiniz

    ReplyDelete
  4. Exception in thread "main" Java Result: 1
    hatası nedir

    ReplyDelete
  5. Exception in thread "main" Java Result: 1

    ReplyDelete
  6. Moopyui.java hatası veriyor hocam

    ReplyDelete
  7. Yalnız ardunodan güç çekmek daha sıkıntılı çünkü motorlar fazla akım çekebilir ve bu arduinoyu yakabilir.
    Bu nedenle on gücünü güç kaynağından almak en mantıklısı.

    Yazılım konuduna gelirsek aynen o konu sıkıntılı. Bende yazılım arayışındayım . aslında temelde gerek yok verilen sinyal çıkış değerine göre nota çıktığından arduinodaki pinlere verilen frekansı değiştirmek ywterli ama onu kodlamak her müzik için çile bu nedenle ara bir yazılım lazım.
    Biraz daha araştırmalı.
    Ama yazı güzel olmuş 👍👍👍

    ReplyDelete