Merhaba. Ben İTÜ Türk Musıkisi Devlet Konservatuvarı Müzik Teknolojileri bölümünde lisans öğrencisiyim. Önümüzdeki yıl mezun olmayı planlıyorum. Çok az miktarda elektronik ve bilgisayar programlama bilgim var. Bitirme projesi olarak, mikroişlemci tabanlı bir kontrol cihazı yapmayı düşünüyorum. Düşündüğüm cihaz, analog olarak gelen voltajı 24bit ADC ile dijitale çevirdikten sonra WiFi vasıtasıyla bilgisayara iletecek bir kontrolcü. Hem WiFi hem de ADC çiplerini SPI ile Arduino’ya bağlayabileceğimi öğrendim. Dolayısıyla en az iki SS(SlaveSelect) pin’ine ihtiyacım var.Araştırdığım Arduino modelleri arasında en yüksek işlemci hızı ve bit çözünürlüğünün Arduino Due modelinde olduğunu gördüm. Ayrıca Arduino Due modelinde beş adet SS pin’i var. Düşündüğüm ADC çipi Texas Instruments’ın ADS1278 modeli. WiFi olarak da ya standart WiFi Shield’ı(Due uyumluymuş) ya da Sparkfun’ın Wifly(Tx ve Rx pin’leri ile bağlanıyor) modelini kullanacağım. Harici ADC çipi kullanmamın sebebi ise Arduino’ların 12bit ADC çözünürlüğünün olması. Bu da cihaz için yeterli olmayacak bir çözünürlük. Ancak, işe girişmeden önce, son kez teyid etmek isterim; Arduino Due, düşük gecikme(tahammül edebileceğim en fazla gecikme 5ms civarında) ile, ADC’den gelen 8 kanallı 24bit veriyi WiFi ile bilgisayara aktarmaya muktedir bir cihaz mı? Yoksa başka bir cihaza mı yönelmeliyim?
seçtiğiniz malzemelerin arduinoda yazılmış driverlerı olduğunu araştırdınız mı? sadece spi bağlantı olması yeterli olmayabilir, standart spi 8 bit in/out çalışır, bazı durumlarda 8bit in/16bit out gerekebilir hatta 16bit out/16bit in olması da gerekebilir ki bunun için başka bir spi lib gerekir, kullanacağınız spi cihazın setup ve capture formatlarını ve transfer yöntemleri için driver yazmak gerekebilir. mesela seçtiğiniz adc chip saniyede toplam 122bin okuma yapabiliyor 4 kanal için, ortalama kanal başına 30k saniye veya tek kanal 120bin okumayayı yakalaybilir, seçilen ADC spi nin gelişmiş modu 4 bit paralel çıkışta verebildiğinden spi driver da bu özellikleri de aramanız gerekir. wifi olması gerekli mi ? wifi da paketler yaklaşık 1.5K lık paketlere bölünerek atılır tcp de aldım verdim derken gecikme olur bunu da yönetmeniz gerekecek. belki usb üzerinden sürmek de çözüm olabilir… due nin piyasaya çıkışı bir kaç ay oldu kullanacağınız muhtemel kodlar hazır olmayabilir, kendiniz yazmayı da göze almanız lazım.
Ben ADC çipinin en verimli olduğu modu kullanacağım. O modda, 58kSPS’de çalışıyor. ADS1278’in dökümanını inceledim ancak veri paketlerinin kaç bitlik olduğunu göremedim. Biraz daha bakmam gerekiyor olabilir. Bugün elektronik mühendisi bir arkadaşımla buluşacağım. Ona da sorarım. Bir bilgiye daha ulaştım; MISO çıkışından gönderdiği bilgi, paralel olarak, diferansiyel 8 çıkışa(Digital Out) gönderiliyor. Bir şekilde aradaki clock bağlantısını hallettiğimi varsayarsak, bu sekiz dijital çıkışı, Arduino’nun dijital girişlerine bağlamak mümkün olur mu acaba?
senkronizasyonu sağlarsan okursun da dediğim gibi kendi driverini yazman lazım, çoğu arduino kütüphanesi verimli değil belki intrrupt kullanman gerekir o bile çok verimsiz genel amaçlı yazılmış. due de bilmiyorum ne kadar düzeltilmiş o işler, sonuçta arm işlemcilerin interruptlarla iyi başa çıkabilen bir yapısı var.
Driver derken library’yi kastediyorsunuz değil mi?
evet evet
işi iyi bilenler performans için fpga kullanmanı isteyeceklerdir ama çok ayrı bir dal ve gidişat, yapabilsen keşke.
FPGA’yı araştırıyorum. Performanstan kastınız nedir? Hız mı? Bu arada, FPGA bir çip türü imiş. Ve anladığım kadarıyla benim FPGA’e aldığım bilgiyi yine Arduino’ya aktarmam için SPI’a falan ihtiyacım olacak. O yüzden FPGA anlamını yitiriyor. Ben SPI konusunu araştırmaya devam edeyim.
fpga da gecikmeler birkaç nanosaniye mertebesinde olur, programınızın donanımda lojik kapılara dönüştürülüp donanımsal olarak bu dönüşümün yapılmasını ve iletişimin neredeyse kayıpsız sağlar, 200-400mhz hızlara çok rahat çıkabilirler, gelişmiş fpga lara artık 2-4 arm core (32 arm core lu modellerde çıktı) ve birkeaç milyon lojik kapı adc dac opamp lcd sürücü veya hdmi çıkış koyabiliyorlar.
Anladım. FPGA, dediğiniz gibi en mantıklı çözüm. Arduino Due ve TI’ın ADC çipini sipariş edeceğim. Toplam maliyet, 100 dolar civarında oluyor. Eğer hız yeterli gelmezse, o zaman FPGA çözümünü denerim. FPGA’e hemen geçmememin asıl sebebi maliyet. Araştırdığım FPGA’ler bin dolarlar mertebesinde fiyatlı. Bir de, Arduino gelene kadar, dili çözmek adına, emülatör kullanmak ne derece mantıklı olur? Bir kaç emülatör yazılım buldum. Mesela; http://www.arduinodev.com/arduino-simulator/ http://emulare.sourceforge.net/ http://virtronics.com.au/Simulator-for-Arduino.html
Bu arada, hız demişken, ben, Arduino içinde gelen dijital bilgiye herhangi bir sinyal işleme yapmayacağım. Gelen float bilgiyi, OSC protokolüyle, WiFi üzerinden bilgisayara göndereceğim. Yine de gecikme yaşar mıyım acaba?
Merhaba, Yapmak istedigin is icin birtane ses karti (Cogu artik 24bit cozunurlukte ve 192kbps hizda stereo data verebilmekte) ve Raspberry Pi kullanmak en mantiklisi. Sonucta sanirim bu konularda yenisiniz ve tek seferlik bir proje olucak. En basit yontemle yapmaniz mantikli olucaktir. Raspberry Pi sonucta normal bir bilgisayar ve kod gelistirme cok daha rahat. Bunun yaninda fiyat olarak Arduino Due’den daha ucuz. Raspberry Pi elinize ulasana kadar da Linux kurulu herhangi bir bilgisayarda denemelerinizi yapabilirsiniz. Raspberry Pi ses kartini normal bir sekilde taniyacak. Portaudio benzeri bir kutuphane ile de ses kartindan sinyalleri alip, yine Raspberry Pi’a USB uzerinden takacaginiz bir wifi adaptoru ile TCP/IP uzerinden stream edersiniz. Host bilgisayar/cihaz da bu sinyallere mumkun olan minimum gecikmeyle ulasir. Kolay gelsin ihsan.
Ses kartı benim işimi görmeyecek çünkü 8 kanal ADC’ye ihtiyacım var. Ayrıca sesin kendisini değil, sadece genliğini aktarmak istiyorum. Yani 44.1kHz örnekleme hızına da ihtiyacım yok. Muhtemelen 1kHz bile yeterli olacaktır. Neyse, dün Beagleboard ve ADS1278’i SPI ile birbirine bağlayıp tüm işimi Linux üzerinde çözmeye karar verdim. Hatta Beagle üzerinde belki Pure Data falan derleyip dışarıya sinyal göndermeye gerek kalmadan doğrudan PD’den ses çıkışı da alabilirim.