Gerçek zamanlı olarak çok sayıda analog sensörü okuma


17

Gitar gibi boynu olan MIDI benzeri bir kontrolör inşa etmeye çalışıyorum. Bu boyunda büyük bir basınç sensörü matrisi var. Denetleyici 3 dize taklit edecektir.

Bu şekilde çalışır: Güce bağlanan (muhtemelen 3.3V veya 5V, şu an için önemli değil) 3 uzun çift taraflı bakır bant şeridi (boyun kadar 0.5 cm genişliğinde) vardır. Bu şeritler üzerinde, basınca dayanarak direnci değiştiren bir Velostat tabakası vardır. Velostatın üstünde, velostat katmanı boyunca voltajın okunmasını sağlayan bir şeye bağlı başka bir sıra veya bakır bant hücreleri olacaktır. Boyun yaklaşık 40 cm uzunluğunda olduğundan, en az 80 sıra olacaktır.

Alttaki 3 bakır bant şeridini boyun boyunca bir grafiğin sütunları olarak hayal ederseniz, ölçüm yöntemine bağlı olarak sensörler hücreler veya satırlar olacaktır (birinin sütunları da çoğaltabileceğini düşündüm, sonra Ancak bunu kolaylaştırabilecek birkaç özel koşul vardır: Bu gitar benzeri bir kontrolör olduğundan, her etkileşimin ölçülmesi gerekmez! Yalnızca denetleyicinin gövdesine en yakın dokunuş önemlidir. Ayrıca 8 bitlik bir çözünürlük yeterince doğru olmalıdır. 255 basınç seviyesi muhtemelen gerekenden daha fazladır.

Şimdi zor bitler:

Ölçüm, darbeleri vb. Algılamak için gerçek zamanlı olarak yeterli olmalıdır (örnek hızının ne kadar yüksek olması gerektiği hakkında hiçbir fikriniz yoktur - iyi ölçüm ve oynatılabilirlik için birkaç kHz'de tahmin edilir) ve kontrolörün dijital çıkışı MIDI (3 ayrı kanalda - dize başına bir tane) veya bir Raspberry Pi ile işlenebilen dijital bir sinyal.

Artık bilgim gerçekten sınırlı olduğundan, iş için doğru araçları düşünemedim. Ama bildiğim şu: Mümkün. Çok benzer bir teknik kullanan (fark edene kadar neredeyse tersine mühendislik yaptığım, bir patentleri olduğunu ve nasıl yaptıklarıyla ilgili düşündüğüm kadar gizli olmadığını) benzer ama farklı bir denetleyici var, buna ROLI deniyor Seaboard.

TL; DR:

  • kabaca 240 sensör

  • aynı hattan güç alan 80 gruba ayrılabilir

  • Bu gerçek zamanlı bir uygulamadır, dokunduğumda her sensörden basınç almam gerekiyor (bazı koşullar geçerlidir, yukarıya bakın)

Şimdiden teşekkürler, okunacak çok şey olduğunu biliyorum. Herhangi bir öneri için minnettarım ve üretmek için yola çıkan korkunç karışıklığı başarmama yardımcı olabilirseniz çok sevinirim!

Şimdiye kadar düşündüğüm şeyler:

Satırları ve sütunları çoğaltarak, her hücreyi bir MCP3008 veya daha büyük ADC ile okuyarak ve zincirleme (papatya zinciri veya ağaç gibi) yalnızca konum sinyaline en düşük etkileşimi nihai sinyale iten ancak hesaplamalarımdan, muhtemelen iletişim yükü. Ayrıca daha önceki bir model, tasarım kötü olduğu için attığım şerit potansiyometreleri içeriyordu (birkaç deneme, yeterince serin değildi).

DÜZENLEME / GÜNCELLEME:

Şimdiye kadarki iyi öneriler için teşekkürler! Onlar sayesinde artık sorunumu daha açık bir şekilde ifade edebiliyorum:

80 satır * 3 sütun basınç sensörü matrisim var. Bir insan sensör matrisi ile etkileşime girdiğinde, yakınlardaki birkaç sensör dokunuşu alır, ancak sadece bir sütun boyunca. Kolonlar mekanik olarak ayrılmıştır. Sensörler 100 Ohm ile 1 kOhm arasında bir dirence sahiptir. Tüm bu sensörlerin 8 bit derinlikte okunması, işlenmesi ve sonuçların en az 1 kHz hızında gönderilmesi gerekir. Bu nedenle, tek bir okuma / işlemenin milisaniyeden daha az sürmesi gerekir. Sütun başına son çıktı: bir float32 için 4 bayt ve bir uint8 için 1 bayt olmalıdır. Float32, kolon boyunca ilk etkileşimin ortalama pozisyonunu gösterecektir. Etkileşim, belirli bir eşiğin üzerinde bir basınç ile ardışık bir sensör kümesi olarak tanımlanır. İşlemin karışıma girdiği yer: bir okuma bir eşik değeri aşana kadar sütun aşağı doğru hareket ettirilir. Bu daha sonra bir etkileşimin başlangıcı olarak sayılacaktır. Her sensörün basıncı ve konumu, maksimum (muhtemelen) 4 ardışık sensörle eşiğin altına düşen ilk sensöre kadar hafızaya alınır. Kaydedilen etkileşimin tüm sensörlerinden sadece iki sensör işlenir - en yüksek basıncı (en düşük direnç) ve en yüksek olanı doğrudan üstünde veya altında okuyan sensör. Kayan nokta konumu, basınçlarına göre ağırlıklandırılmış iki sensör konumunun ortalaması alınarak hesaplanır. Etkileşimin genel basıncı sadece 0 ile 255 arasında sıkıştırılmış her iki basıncın eklenmesi olacaktır (birim8'in her iki basıncını bir uint16'ya ekleyin ve yuvarlamadan 2'ye bölün, gereksiz bitleri atın - bu hızlı olmalıdır). Bunun her sütun için olması gerekir. 15 bayt büyüklüğünün sonucu daha sonra SPI üzerinden sentezleyici görevi gören küçük bir bilgisayara (Raspberry Pi B3) gönderilir. İletim yöntemine bağlı değilim. SPI iş için doğru araç değilse, bir Raspberry Pi'nin ele alabileceği herhangi bir iletişim yöntemini almaya hazırım. Bu müzikal-etkileşimli bir uygulama olduğundan gecikme çok önemlidir.

Tam sorularım: Bu, bankayı kırmadan tek bir mikrodenetleyici ile çözülebilir mi? Bir hobi projesi için birkaç yüz dolar değerinde IC satın almaya gücüm yetmiyor. Hangi donanımı önerirsiniz? Dikkat etmem gereken açık olmayan uyarılar var mı?

Şimdiye kadar cevaplardan elde ettiğim yaklaşım, her sütuna ayrı ayrı güç vermek, ardından SPI üzerinden bir Arduino'ya bağlı 5 16 kanallı ADC (ADS7961) ile satırları okumaktı. Bunun en kolay / en ucuz yaklaşım olmayacağından veya> 1 kHz'lik bir hıza ulaşmak için yeterince hızlı olmayacağından endişeliyim.

Feragatname: Elektrik mühendisliği söz konusu olduğunda normalde teorik bir kimyager ve korkunç bir amatörüm, bildiğim her şey kendi kendine öğretilir ve herhangi bir profesyonel arka plana sahip değildir (bu da daha bilgili insanlardan yardım istememin sebebidir). Yine de yazılım etrafında yolumu biliyorum. Yazılım ile ilgili her şeyi, yeterli zaman ile anlayacağım. Ayrıca, ben Almanım, bu yüzden lütfen zaman zaman dilbilgisi kusurlarını affedin.


sadece bir fikir .... eğer muksiler serpiştirilirse bir hız iyileştirmesi olabilir .... mux0 0,8,16,24, vb perde tarama ... mux1 - 1,9,17,25 ... Mux7 (veya daha yüksek) değerine kadar ... bu şekilde ilk 8 perdeye aynı anda 8
muxe okunur

2
'Gerçek zamanlı' terimi tam olarak doğru olmayabilir. Bu, verilerin sistemi girdiği hızda bıraktığı anlamına gelir (Bir örnek girişi, bir örnek çıkışı). Ancak gecikme hakkında hiçbir şey söylemez - onu işlemek için geçen süre. Müzikal kullanım için, toplam gecikmenin (son sesi sentezleme / çalma süresi dahil) 10-15 ms'den az, tercihen 5'ten az olması gerekir
Schizomorph

Preslenmiş ve preslenmemişler arasındaki direnç farkı nedir?
Trevor_G

10 ile 1000 ohm arasında (kabaca)
d.oelert

Gereksinimler, önerilen uygulama ile biraz karışıktır. Bu soruları daha önce yanıtlamış olabilirsiniz. Sanatçı, cihazın bitişik perdeler arasındaki bir dizi konumu algılayabilmesi için bir slayt gerçekleştirebilecek mi? Perdesiz bir aleti destekleyebilmeniz mi gerekiyor, yoksa perdeler çözümün bir parçası olabilir mi?
Wayne Conrad

Yanıtlar:


7

Fiyat aralığınıza bağlı olarak, Ahududu Pi ve ADC'ler arasında, tanıtım amaçlı FPGA geliştirici kartı olarak iyi desteği olan DE0-Nano Board gibi bir FPGA kullanmayı düşünebilirsiniz . Bu çözüm, birden çok / çok sayıda ADC'yi aynı anda saatlendirecek ve verilerinizi Raspberry Pi tarafından sunulacak şekilde biçimlendirecek kod yazmanıza izin verme avantajına sahiptir.

MCP3008'i düşündüğünüzü söylemiştiniz. Bu çip SPI'dır, bu nedenle aynı CS'ye birkaç CS'yi farklı veriyolu pinleriyle bağlayabilirsiniz. Bir veriyoluna üç çip bağladığınızı varsayalım, böylece 6 pin başına 24 ADC kanalı (üç veri hattı ve üç CS hattı) verir. Bu, 60 pin için 240 kanal anlamına gelir, bu da FPGA'nın kapasitesi dahilindedir.

MCP3008 saat hattını maksimum 2MHz frekansında çalıştırırsanız, (15 saat / kanal) * (8 kanal / yonga) * (3 yonga / veri yolu) * (1/2000000 saniye / saat) = 0,18 ms 5.56kHz örnekleme hızına karşılık gelen 240 sensörün tamamını okuyun.


inanılmaz havalı bir yaklaşım gibi geliyor! kesinlikle buna bakacağım. FPGA'larla ilgili hiçbir deneyimim yok, bu yüzden bu benim için çok fazla olabilir ... Öte yandan her zaman FPGA'lara girmek için bir bahane arıyordum ...
d.oelert

Birden fazla SPI hattı olan bir ARM çipi kullanabilirsiniz. Bu şekilde FPGA maliyetinden kaçınır ve örnek oranını üç katına çıkarırsınız (3 SPI denetleyiciniz varsa). Dahili işleme (MCU içindeki okumaları Pi'nin alabileceği bir yere taşıma) ve MCU-> Pi iletişimleri nedeniyle gecikmeyi yönetmeniz gerektiğini unutmayın.
Ronan Paixão

Bu arada, PI'nin bir SPI denetleyicisi de var.
Ronan Paixão

FPGA'nın arkasındaki fikir, diyelim ki, 10 ayrı SPI denetleyicisi (sağladığım örnekteki numarayı kullanarak) yapabilmeniz ve bunları kolayca mükemmel şekilde çalıştırabilmenizdir. Ve evet, Pi'nin bir SPI denetleyicisi var, ancak bir FPGA'nın oluşturabileceği kadar hızlı veya paralel değil.
Billy Kalfus

Tamponlanmamış girişlere sahip bir FPGA veya CPLD bulabilirseniz, 80: 1 analog MUX bile oluşturabilirsiniz. Zor bir ihtimal, ama belki işe.
Caleb Reister

10

Açık cevap muxing, bu da elektrik yolunu dinamik olarak yaptığınız anlamına gelir. Bu nedenle, tüm matrisi, her seferinde bir tane veya sahip olduğunuz kadar çok ADC (Analog - Dijital Dönüştürücü) girişi yineleyin.

3 ADC'niz varsa, her seferinde bir satır okuyabilirsiniz, ardından girişleri bir mux ve voilla olarak değiştirirsiniz, şimdi ikinci satırı okuyorsunuz ve devam ediyorsunuz. Bu kurulumdaki sorun, 80 satırınız olması ve farkında olduğum 80: 1 (bir girişe seksen giriş) mux olmamasıdır. Ancak 16 * 5 = 80 giriş almak için bir araya getirebileceğiniz 16: 1 mux'ler vardır.

Bunun gibi bir şey olurdu:

row  0-15 [16:1 mux]____________ 5 inputs in [8:1 mux]-ADC
row 16-31 [16:1 mux]_| | | |
row 32-47 [16:1 mux]___| | |
row 48-63 [16:1 mux]_____| |
row 64-79 [16:1 mux]_______|

16: 1 muksilere 4 giriş sinyali birbirine bağlanabilir.

Sonunda, bu modelde kontrol sinyalleri olan bir baytınız var:

Grouped up:
0, 3 bits for the 8:1 mux, 4 bits for the 16:1 mux

Bit for bit:
0,8:1 MSB, 8:1 LSB+1, 8:1 LSB, 16:1 MSB, 16:1 LSB+3, 16:1 LSB+2, 16:1 LSB+1, 16:1 LSB

Bu, 5 × 16: 1 mux ve bir 8: 1 mux = 6 IC'ye ihtiyacınız olacağı anlamına gelir,

Bir kerede bir satır okumak isteyebileceğiniz için bunu 3 ile çarpın.

Bu 18 IC, 7 kontrol sinyaline sahip olacağınız anlamına gelir. Analog giriş sayısını artıracaksanız IC sayısını azaltabilirsiniz. Sadece 3 analog girişi olan 18'dir.

Bunun yerine 240/16 = 15 IC kullandıysanız, 15 × 16: 1 muxlerden 15 analog çıkışınız olur. Sonra 16: 1 mux veya 16: 8 mux ile kademelendirebilirsiniz. Sonunda 16: 1 mux ile "optimize" ederseniz 16 IC olurdu. Ancak bu, yazılım çözümünüzün yukarıdaki gibi zarif olmayacağı, çapraz ve modüllü ve diğer şeyler olacağı anlamına gelecektir, ancak hey, 2 IC'den tasarruf edersiniz.

10.8ms=1.25kHz

Mümkün, ama iyi bir tasarım değil .

Bunu başka bir yerde çözelim ... daha fazla yer ve para tasarruflu bir şekilde.

* 20 dakika sonra * Hmmm ... bulduğum tüm çözümleri kurmak çok zor ve / veya bazı gelişmiş kalibrasyonlar gerektiriyor ...

Oh, o zaman tasarımınızın elinizdeki göreve uygun olduğunu varsayıyorum.

İyi şanslar.


Diğer çözümlerin ne olduğunu merak ediyorum. Paylaşmak ister misiniz? - pandalion98

OP pozisyonu ve baskıyı ölçmek istiyor. Bu iki parametre. Bu, bu bilgiyi bir voltaj sinyalinin içine paketlememiz gerektiği anlamına gelir, böylece okuyabilir ve deşifre edebiliriz. Ya da ohm, endüktans, kapasitans gibi başka bir üniteye paketlememiz gerekir.

İşte sadece bir sütun hakkında düşündüğüm bazı fikirlerim. Sadece fikri 3 ile çarpın ve 3 sütunlu gitar için tüm çözümünüz var.

İlk fikir:

Gitarın altından gitarın boynuna giden iki paralel kablo (düşük direnç) kullanın. Zemini gitarın altındaki tellerden birine bağlayın. LR ölçüm sistemi yapın ve diğer telden gelen indüktansı ve direnci de altta ölçün.

Her iki kabloya parmağınızla dokunduğunuzda, iki kabloyu bağlayacaksınız ve burada bir miktar endüktans olacaktır . Gitar ne kadar fazla dokunduğunuzda, devre o kadar uzun olacak ve daha fazla endüktans ölçeceksiniz. Ne kadar sert basarsanız, iki tel arasında daha fazla yüzey alanı olur ve direnci o kadar az olur.

İki "kablo" olmak zorunda değildir, iki iletken bant veya başka bir şey olabilir.

Bunu neden daha önce paylaşmadım: Bunun güvenilir olması için, herkesin cildinde farklı miktarda direnç olduğu için sensörleri her bir birey için kalibre etmeniz gerekir. Ne zaman oynarsanız terlersiniz ve bunun için direnci daha da azaltırsınız, bu yüzden bunu telafi etmeniz gerekir. Herkes farklı terler, bu da kişi başına kalibre edilmelidir.

Yani endüktans => parmağın konumu. Direnç => ne kadar sert bastığınızı.

Ölçeceğiniz değerlerin sapması nano Ω ve nano H'de olacaktır, bu da CMRR ve SNR hakkında bazı doğru bilgilere ihtiyacınız olacağı anlamına gelir. Aksi takdirde, iç mekanda yapıldığını varsayarak, tüm göreceğiniz şebeke voltajı olacaktır. Veya wifi veya lambalardan veya diğer bazı gürültü kaynaklarından diğer bazı frekanslar. Bu yüzden belki de uygun bir dijital filtreye ihtiyaç duyulacaktır. Ve ... muhtemelen OP'nin yetenekleri ve kabul edilebilir zihinsel çaba kapsamı dışında. Bu fikir atılır.

İkinci fikir:

Gitarın yere bağlı düz bir iletken yüzey yapın.

Bir tel veya iletken bant veya sadece düz bir iletken kullanın. Üzerine iletken olmayan bir boya veya üzerine iletken olmayan bir bant koyun.

Gitarın altından gitarın boynuna asın. Gitarın altındaki teli yüzlerce MHz aralığında yüksek frekanslara bağlayın. Şimdi göze çarpan yansımalar almaya başlayacaksınız. Çünkü teknik olarak .... sadece bir tarafýn korumalý olduđu bir iletim hattý var.

Böylece kısa bir kare dalga darbesi gönderecek ve parmağınızın yalıtılmış telin üstünde olması nedeniyle yansıma nedeniyle geri gelmesinin ne kadar zaman alacağını ölçeceksiniz. Ve sonra gitarın altındaki yansıyan sivri genliğini ölçersiniz. Böylece seyahat süresi => parmağın konumu. Yansımanın genliği => ne kadar zor bastığınız.

Kurulumu en kolay şey bu değil ... eğer ne yaptığınızı bilmiyorsanız. Dolayısıyla, bu OP'nin üstesinden gelmek için çok fazla çaba olabilir. Bu fikir atılır.


Bunun gibi bir şey olurdu:

resim açıklamasını buraya girin

Karakteristik empedansı 150 Ω, yani çok kötü bir iletim hattı olarak kabul ettim. Gerçekte daha kötü olabilir, bunu hiç yapmadığımı bilmiyorum.

İşte birinin etrafı karıştırmak istemesi durumunda bağlantı .

En zor kısımlardan biri, uç noktaları bir dirençle eşleştirmek olacaktır, çünkü bunun için bir osiloskop veya başka bir pahalı alete ihtiyacınız olabilir.

Diğer zor kısım TOF'u (uçuş zamanı) ölçmek olacak, orada bazı IC'ler var, ama ucuz değiller ... ama her zaman sadece sabit bir akım kaynağı yapabilir ve küçük bir kapasitör doldurabilir ve sonra sadece gerilimi okuyun.

Buradaki fikir, bir parmak telin yakınına geldiğinde, parmağınızın devrenin bir parçası olacağı ve bir kondansatör görevi göreceği. Parmağınız ne kadar yakınsa, o kadar kapasitif olur. Bu yüzden parmak noktasındaki direnç azalacaktır.

https://en.wikipedia.org/wiki/Transmission_line biraz aşağı kaydırır ve kapasitif parametrenin paydanın bir parçası olduğunu görürsünüz.

Tel üzerindeki bir nokta yanlış eşleştiğinde, bir yansıma olur ve bunu sinyalin kaynaklandığı "çıkışta" okuyabilirsiniz. Hiçbir yerde yansıma yoksa, sinyaliniz uç noktalardan birinde sonlandırılacaktır.

Ne kadar sert basarsanız, parmağınızın o kadar fazla alanı düzleşecektir => alandan dolayı daha fazla kapasitans. Ayrıca, tel ile parmağınız arasında iletken olmayan herhangi bir malzeme, kapasitansı daha da arttırmak için çok az sıkılır.

Üçüncü fikir:

Bir gitarı gitarın içine sokun ve frekans ve genliği ölçün. Bir theremin ne vereceğini tam olarak bilmiyorum, ama elbette bir şey kullanılabilir.

Bu noktada fikirlerim tükeniyor ve 20 dakika geçirdim diyorum. Gerçekte belki de 10 harcadım. Oh iyi. Şimdi bunu yazmak için 10 dakika daha harcadım, bu yüzden her şey toplanıyor.


1
15 IC'yi 80 sensörün 3 setine bağlamaya ilişkin hata ayıklamanın önemli olabileceğini hissediyorum. Ayrıca, sensör dizisinden sarkan yüzlerce tel nedeniyle, kesinlikle bu şey kullanılacak kadar sağlam olmayacaktır.
BeB00

Bunun aslında oldukça uygun olduğunu düşünüyorum ve eğer düzgün yapılırsa gerekli olan kablolama miktarını azaltır.
pjc50

Diğer çözümlerin ne olduğunu merak ediyorum. Paylaşmak ister misiniz?
PNDA

1
@ pandalion98 Hmmm ... belki ikinci fikir bundan sonra o kadar da kötü bir fikir değildi. Oh iyi.
Harry Svensson

6

Üç fikir:

1. Besleme tarafında biraz çoğullama yapın

Etkili bir şekilde, tanımladığınız devre, her biri bir ucu besleme voltajına ortak olan çok sayıda değişken dirençtir. Tüm direnç değerlerini okumak istiyorsunuz ve diğer yanıtlar şimdiye kadar çoğunlukla analog taraftaki sinyalin çoğullanması için önerilen yaklaşımları önerdi.

Ancak , arz 'rayı' n bölümlerine bölerek , arz tarafındaki bu çoğullamanın bir kısmını veya tamamını da yapabilirsiniz . Her biri farklı bir besleme rayına sahip n sensör pedi setlerini birbirine bağlayın . Şimdi her seferinde sadece bir besleme rayına enerji verin ve her bir ped setini okumak için bir ADC girişi kullanın. (Bilgisayar klavyesini okuyan devre genellikle bu şekilde çalışır ve anahtarların kablolama şekline genellikle 'çapraz nokta anahtarı' denir.) Nihayetinde, tüm 'raylara' bağlı tek bir ADC kullanabilirsiniz. sırayla her bir pede güç bağlayarak tüm çoğullama.

Tek yakalama, diğer tüm pedlerin güç rayından izole edilmesi gerektiğidir, toprağa bağlı değildir, bu da her biri için bir dijital çıkış kullandıysanız durum böyle olacaktır. Her bir pedi bir diyot, bipolar transistör veya FET üzerinden kablolama da dahil olmak üzere bunu çözmenin birkaç yolu vardır veya - Pratikte ne kadar hızlı yapılabileceğini bilmiyorum, ancak prensip olarak - bir giriş çıkış pimini kullanarak ve yüksek empedansa sahip olması gerektiğinde yüksek çıkış veya giriş olarak ayarlanması.

Sensörlerinizi bu teknikle ölçmenin doğruluğu, tek bir sabit voltaj kaynağı ve yüksek kaliteli analog çoklayıcılar kullanmaya kıyasla mükemmel olmayabilir, ancak özellikle basınç sensörlerinin üzerinde tolerans göstereceğinden emin olacağımdan şüpheleniyorum. dirençleri - yine de bir referans kuvvet kullanarak bunu her sensör için kalibre etmeniz gerekebilir.

2. Çok sayıda ADC girişi olan bazı mikrodenetleyiciler kullanın

Örneğin, PICAXE 40X2 , analog olarak kullanılabilen 27 pime sahiptir, böylece ihtiyaçlarınızı 9 tanesiyle karşılayabilirsiniz. Basit bir BASIC dilinde programlanmıştır ve i2c slave olarak işlev görebilir - böylece 9 yongayı bir başka mikrodenetleyici ile okuyabilirsiniz - ya da her bir çipten çıkışı seri veri olarak gönderebilir ve ana bilgisayara okuyabilirsiniz. seri-USB dönüştürücüler aracılığıyla. Tam olarak ne kadar hızlı gideceğine söz veremem ama PICAXE'yi maksimum hızda (16 MHz harici rezonatör kullanarak 64 MHz) saatliyorsanız, tamamlanması gerektiğini düşünüyorum. Elbette C'deki mikrodenetleyici programlamasından memnunsanız, aynı şeyi PICAXE'nin dayandığı PIC18F45K22 ile yapabilirsiniz.

3. Hazır analog giriş birimlerini kullanın

Son olarak, zaman kazanmak için para harcamanın sakıncası yoksa ve taşınabilirlik yüksek bir öncelik değilse - örneğin, aletin bazı kalın kablolarla bir ekipman rafına bağlanması uygun değilse - yeterince yüksek satın alabilirsiniz. tüm sensörleri bir kerede ölçmek için kanal sayımlı analog giriş cihazları. Örneğin Measurement Computing USB-2633, 1k $ 'ın biraz üzerinde 64 analog giriş okur.


4

Bir kaba kuvvet sinyal koşullandırması (belki de pasif) ve ardından her biri 16 veya daha fazla MUX'd ADC girişine sahip ufacık ADC'ler veya MCU / ADC'yi dikkate almaya değer olabilir. Bu sadece 40 fiş. Çalışabilecek bir yonga örneği, otomatik artış kanalı moduna ve 16 girişe sahip ADS7961QDBTRQ1'dir .

4kHz örnek hızında ve örnek başına 240 baytta bile toplam veri hızı yaklaşık 1MB / s'dir, bu çok korkutucu değildir. Belki de kölelerle iletişim kuran 10MHz veya 20MHz SPI veriyoluna sahip bir ana CPU. Bant genişliği yoksa 2 SPI veri yolu kullanın. Yukarıda belirtilen kısım 20MHz'de çalışır, böylece tek bir SPI yapacaktır.

Ya da belki tek bir TI yongası kullanabilirsiniz - 64 kanallı eşzamanlı örnekleme ve 256 girişe sahip DDC2256AZZF .. ama özellikle ucuz değil (yaklaşık 350 $) ve 14x14mm 323-pin LFBA dizisinde geliyor, bu yüzden beyaz pano breadboard ile çalışmak.


3

Gerçek zamanlı bir insan arayüzü uygulaması için, multi-khz genel bir örnekleme hızı yüksek görünüyor. 50Hz muhtemelen yeterlidir ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Bu, tüm sensörleri <20 ms cinsinden örneklemeniz gerektiği anlamına gelir, böylece sensör başına 80us. Bu çok zor değildir ve temel olarak tüm normal 8 bit mikrodenetleyiciler tarafından yönetilebilir (yani Atmega88 bunu <30us'ta yapabilir).

Tüm etkileşimleri de ölçebilir ve daha sonra ihtiyacınız olmayanları atabilirsiniz, hepsini ölçmek teknolojik olarak zor değildir. Sorun çoğullamadan kaynaklanıyor. Gönderinizde biraz kafam karıştı, çünkü sensörlerin bir seferde 80 gücüne sahip olduğunu söylüyor? Yapmanız gereken olağan şey, dediğiniz gibi, multipleks sütunlar ve satırlardır. Bunu yapmazsanız, cihazınızdan çıkan 80 tel ile uğraşmanız gerekir, bu gerçekten harika bir fikir değildir. Bir matrise bölmenin bir yolunu bulmanız gerekir, böylece 30 kablo (hala çok olan) elde edersiniz. Onları çoklayabilirsin, ama ben olsaydım birden fazla mikrodenetleyicim olurdu ve bir ustaya bağlatırdım. Köle MCU'ları yerine özel bir ADC kullanabilirsiniz, ancak ben şahsen MCU'lara bağlı kalırım.

İletişimin bir sorun olabileceğini doğru bir şekilde belirlediniz, ancak bu en azından MCU'lar arasında büyük bir sorun değil. 8MHz'de bir Atmega 2MHz'de SPI yapabilir, böylece tüm sensör verilerinin gönderilmesi <1ms sürecektir. O zaman soru, ana MCU'ya sahip olduktan sonra bu verilerle ne yapmak istediğinizdir.


2
Tek bir girişe tepki verirken 50 Hz genellikle genel GUI terimleriyle "yeterli" olarak kabul edilir, ancak ses kartları ile kendi deneyimimden 200 ms gecikme ile müzik çalmak hiç hoş bir deneyim değildir (konuşma sıkışmasını düşünün). Değişken 0-200 ms'lik bir gecikmenin enstrümanı neredeyse oynanamaz hale getireceğini düşünüyorum, çünkü herhangi bir ritim duygusu kesinlikle ölecekti. Yaklaşık bir kHz'lik bir yoklama frekansı, iyi bir başlangıç ​​noktası minimum değeri olacaktır.
Dampmaskin

1
@Dampmaskin 50 Hz = 20ms, 200ms değil. 20ms muhtemelen daha makul
Steven Waterman

1
Benim hatam. 20 ms, tutarlı bir 20 ms ise kullanılabilir, ancak daha az gecikme her zaman daha iyidir. Zaten sinyal zincirinde her zaman daha fazla gecikme olacaktır.
Dampmaskin

@Dampmaskin tarif edilen yaklaşımla gördüğüm sorun tam olarak bu. Ahududu pi synth bağlamak için çalışıyorum ve ideal olarak toplam gecikme 15-20ms altında kalmak istiyorum gibi "daha sonraki bileşenler için mümkün olduğunca gecikme kaydetmek" gerekir. Kumanda zaten 20 ms sürüyorsa, boş alan kalmadı.
d.oelert

@StevenLowes 20ms çoğu müzisyen için çok uzun. Bu, bazı sesler için Haas mesafesinin dışında bile. Şahsen ben 10 ms gecikmeden daha fazla başa çıkamıyorum ve sadece 6 ms gecikmeye uymayan bir piyanist biliyorum.
Todd Wilcox

3

En basit yöntem, her şeyi pedlerin her bir sütununa ayrı ayrı güç vermek için esnekliğe dağıtılmış paralel kayıtlara seri olarak 10 sekiz bit açık kollektör zinciri ile uzun bir esnek devre üzerine inşa etmek olabilir.

Bunları, tüm sütunlardaki her sütunu aynı anda sürmek ve ortak dönüş hatlarını ADC'nize çoğaltmak için kullanabilirsiniz. Dönüş hatlarının uygun pull-up'lara ihtiyacı olacaktır, böylece düğme direnci ile bir direnç bölücü voltajı elde edersiniz.

şematik

bu devreyi simüle et - CircuitLab kullanılarak oluşturulan şematik

Kontrol eden mikro daha sonra, kayıt zincirine bir tekli sıfır bit gönderir, böylece zaman olarak sadece bir sütun güçlendirilir. Kalan bağlantılar yüzer.


1

Bunu yapmanın bariz yolu (her bir ipte sadece tek bir dokunuş görmeniz gerektiğini görmek) perdeleri bir voltaj bölücüye bağlamak ve daha sonra her bir teldeki voltajı ölçmektir.

size dokunma yeri söyleyecektir.

dokunma basıncı elde etmek için topraktan her perdeye bir kondansatör yerleştirin ve her teldeki AC direncini ölçün.

bu yaklaşımın alt tarafı, dizelerin daha yüksek dokunuşlara tepki vermesidir


2
yanlış anladıysanız özür dilerim ama gerçek gitar boynu ve ip yok. gerçek bir perdeli tahtada kullanacağınız oyun tarzını taklit eden bir basınç sensörü matrisi olan ahşap bir tahtadır. Yine de girdi için teşekkürler, ben gelecekteki projeler için bunu akılda tutabilir!
d.oelert

Yukarıdaki perdeler ve dizelerle, sorunuzda bahsettiğiniz bakır şeritleri kastediyorum,
Jasen

Ah şimdi ne demek istediğini anlıyorum, üzgünüm yoğun. notalar çalınırken bu yaklaşım kırılabilir, çünkü o zaman kaçınılmaz olarak aynı tel üzerinde birden fazla dokunuş olacaktır. sadece en düşük konular
d.oelert

Ayrıca yaklaşımınızı gerçekten sevdiğimde, bu orijinal soruma cevap vermiyor, bu da bir kişinin gerçek zamanlı olarak işlenmesi gereken çok sayıda analog sensörle nasıl başa çıkacağıdır.
d.oelert

kameralar çok sayıda analog sensöre sahiptir ...
Jasen

0

Gitarın uzunluğu için 100 ohm ile 100 K arasında bir yerde inç başına makul derecede düzgün bir dirence sahip bir tel elde ederseniz, boynu, yüzey direnci ile orta derecede iletken bir malzemeden çıkarabilirsiniz. basınçla azalır ve daha sonra boyun ile her ipin her bir ucu arasındaki direnci ölçer. Dirençlerin toplamı, bir ipin direnci eksi, temas noktasının direncinin iki katını gösterir. Temas noktası direncini ölçülen her dirençten çıkardıktan sonra, kalan dirençlerin oranı boyundaki temas noktasını gösterecektir.

Bu yaklaşımın her üç dizede de eşzamanlı baskıları algılayabileceğini, ancak bir dizeye birden çok yerde basılabiliyorsa işe yaramayacağını unutmayın. Bir gitarda, böyle bir tasarım barre akorlarının kullanımını engelleyecektir - oldukça ciddi bir sınırlama - ancak diğer enstrümanlar birden fazla noktada tellere dokunmayı gerektirmeyebilir.


" Eğer gitar uzunluğu için 100 ohm ve 100 K arasında bir yerde inç başına makul bir düzgün dirence sahip bazı tel alabilirsiniz " - Ben o tür bir tel bulabiliriz şüpheliyim.
Harry Svensson

Katılmıyorum; Ofisimde 1717 ohm / m'lik direnç telim var, bu yüzden bulmak zor olmamalı. Çalışmanın kolay olduğunu söylemiyorum, bunun Ø50 µm tel olduğunu görüyorum, ancak elde etmek zor değil.
MrGerber

@MrGerber: Nikrom telin direncinin daha soğuk sıcaklıklarda daha sıcak olanlardan daha düşük olduğunu unutmuştum ve bu nedenle devrenin 10 ohm'a daha yakın bir şey üzerinde çalışacak şekilde değiştirilmesi daha iyi olurdu, ancak temel kavram işe yarayabilir. Alternatif olarak, boynun zayıf iletken bir malzeme olması ve iplerin de işe yarayabilecek şekilde bağlantı yapmasını sağlamak.
supercat

Bu NiCr değil, FeCrAl'dir ve direnç sıcaklıkta çok fazla değişmez. Sahip olduğum tip yaklaşık% 8'den 100 C'den 1300 C'ye değişiyor . Ref: Kanthal D (Ve hayır, E-cigs
yapmıyorum

@ MrGerber: Tamam, bu kötü değil. Önceki yoruma yanıt olarak bazı tablolara baktım ve sıcaklıkla birlikte büyüklükte artan dirençler gördüm.
supercat

0

Bu yazıyı gördüm ve tek bir yonga ile mümkün olabileceğini düşünüyordum. Ucuz bluepill board gibi bir çeşit mikrodenetleyici kartı almanızı isterdim. 10 ADC kanalının kullanımı ücretsiz olan bir ARM M3'e sahiptir. Sütunları 3 dizeden oluşan 3 kümeye koyarsanız, bunları 9 boş ADC kanalına bağlayın. Toplam 63 'perdelik' için pin sıralarını değiştirmek için diğer 21 pimi kullanın. connection matrix, resistors are the velostat cells, the gpio drives at 3.3v or is in input mode, the ADC pins measure the voltage drop across the velostat cell Mikrodenetleyici, 2Msps'yi desteklemek için faz gecikmesi ile kullanılabilen iki adet 1 Msps 12 bit ADC'ye sahiptir; Bence USB bağlantısını kullanabilir ve her şeyi bir USB midi denetleyicisi gibi çalıştırabilirsiniz. Daha fazla giriş için daha büyük bir mikrodenetleyici kullanabilirsiniz, ancak 30'dan fazla perdeyle 'perde' aralığını nasıl yöneteceğinizi görmüyorum, yoksa bir dokunmatik ekran gibi mi olacak?

Bu velostat tabakalarının nasıl çalıştığını tam olarak bilmiyorum, ancak daha büyük bir sayfanın altına küçük sonlandırma noktaları gibi koyamıyor ve parmağın yerini ve basıncını birden fazla noktadaki voltajla ilişkilendiremiyor musunuz? O zaman muhtemelen çok daha az algılama ile uzaklaşabilir ve virajlar ve vibrato gibi şeyleri destekleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.