Odczytywanie ogromnej liczby czujników analogowych w czasie rzeczywistym

17

Próbuję zbudować kontroler podobny do MIDI, który ma szyję jak gitara. Na szyi znajduje się ogromna matryca czujników ciśnienia. Kontroler będzie emulował 3 ciągi.

Działa to tak: Są 3 długie paski dwustronnej taśmy miedzianej (o szerokości 0,5 cm, tak długiej jak szyjka), które są podłączone do zasilania (prawdopodobnie 3,3 V lub 5 V, na razie nie ma to znaczenia). Na tych paskach znajduje się warstwa Velostatu, która zmienia oporność w zależności od ciśnienia. Na szczycie velostatu będzie kolejna warstwa rzędów lub ogniw taśmy miedzianej, połączona z czymś, co wyrzuca odczyt napięcia przez warstwę velostatu. Ponieważ szyja ma około 40 cm długości, będzie co najmniej 80 rzędów.

Jeśli wyobrażasz sobie 3 dolne paski taśmy miedzianej jako kolumny wykresu wzdłuż szyi, czujniki będą albo komórkami, albo rzędami, w zależności od metody pomiaru (myślałem, że można również zmultipleksować kolumny, to mogą istnieć rzędy.) Istnieje kilka specjalnych warunków, które mogą to ułatwić: Ponieważ jest to kontroler podobny do gitary, nie każda interakcja musi być mierzona! Liczy się tylko dotyk znajdujący się najbliżej korpusu kontrolera. Również rozdzielczość 8 bitów powinna być wystarczająco dokładna. 255 poziomów ciśnienia i tak jest prawdopodobnie więcej niż jest to potrzebne.

Teraz trudne fragmenty:

Pomiar musi być w czasie rzeczywistym wystarczający do wykrycia uderzeń młotka itp. (Nie mam pojęcia, jak wysoka musi być częstotliwość próbkowania - oszacowana na kilka kHz dla dobrego pomiaru i grywalności), a wyjście cyfrowe kontrolera powinno być albo MIDI (na 3 osobnych kanałach - po jednym na ciąg) lub sygnał cyfrowy, który można przetwarzać za pomocą Raspberry Pi.

Teraz, gdy moja wiedza jest naprawdę ograniczona, nie mogłem wymyślić odpowiednich narzędzi do pracy. Wiem jednak, że: Jest to możliwe. Istnieje podobny, ale inny kontroler, który wykorzystuje bardzo podobną technikę (którą praktycznie odtworzyłem, dopóki nie zauważyłem, że mają patent, a informacja o tym, jak to robią, nie jest tak tajemnicza, jak myślałem), nazywa się to ROLI Wybrzeże.

TL; DR:

  • około 240 czujników

  • można podzielić na grupy po 80, które są zasilane tą samą linią

  • jest to aplikacja działająca w czasie rzeczywistym, muszę wywierać nacisk z każdego czujnika, gdy zostanie dotknięty (niektóre warunki mają zastosowanie, patrz wyżej)

Z góry dziękuję, wiem, że to dużo do przeczytania. Jestem wdzięczny za wszelkie sugestie i byłbym bardzo zadowolony, gdybyś mógł mi pomóc w pokonaniu strasznego bałaganu, który postanowiłem wywołać!

Rzeczy, o których do tej pory myślałem:

Multipleksowanie wierszy i kolumn, odczytywanie każdej komórki za pomocą MCP3008 lub większego ADC i łączenie łańcuchów ATmegas (łańcuchowych lub drzewiastych), które tylko popychają pozycję względem najniższej interakcji do końcowego sygnału, ale z moich obliczeń, które mogą być wąskie gardło koszty ogólne komunikacji. Również wcześniejszy model zawierał potencjometry wstęgowe, które odrzuciłem, ponieważ projekt był zły (kilka prób nie było wystarczająco fajnych).

EDYCJA / AKTUALIZACJA:

Dzięki za dobre sugestie do tej pory! Dzięki nim mogę teraz wyrazić mój problem znacznie wyraźniej:

Mam matrycę 80 rzędów * 3 kolumny czujników ciśnienia. Kiedy człowiek wchodzi w interakcję z matrycą czujników, kilka czujników w pobliżu odbierze dotyk, ale tylko wzdłuż kolumny. Kolumny są mechanicznie oddzielone. Czujniki mają rezystancję między 100 Ohm a 1 kOhm. Wszystkie te czujniki muszą być odczytywane z głębokością 8 bitów, przetwarzane, a wyniki muszą być przesyłane z częstotliwością co najmniej 1 kHz. Tak więc pojedynczy odczyt / przetwarzanie musi zająć mniej niż milisekundę. Ostateczne wyjście na kolumnę musi wynosić: 4 bajty dla float32 i 1 bajt dla uint8. Pływak32 wskaże uśrednioną pozycję pierwszej interakcji wzdłuż kolumny. Interakcja jest definiowana jako kolejne skupisko czujników o ciśnieniu powyżej pewnego progu. Tutaj przetwarzanie wchodzi w skład miksu: kolumna będzie przesuwana w dół, aż odczyt przekroczy próg. Będzie to wtedy liczone jako początek interakcji. Ciśnienie i położenie każdego czujnika są zapamiętywane aż do pierwszego czujnika, który spadnie poniżej progu przy maksymalnie (prawdopodobnie) 4 kolejnych czujnikach. Ze wszystkich czujników zarejestrowanej interakcji będą przetwarzane tylko dwa czujniki - ten, który odczytuje najwyższe ciśnienie (najniższy opór) i najwyższy bezpośrednio powyżej lub poniżej niego. Pozycja zmiennoprzecinkowa jest obliczana przez uśrednienie dwóch pozycji czujnika ważonych ich ciśnieniami. Ogólny nacisk interakcji będzie po prostu dodaniem obu ciśnień zaciśniętych między 0 a 255 (dodaj oba ciśnienia jednostki 8 do uint16 i podziel przez 2 bez zaokrąglania, odrzuć niepotrzebne bity - powinno to być szybkie). To musi się zdarzyć dla każdej kolumny. Wynik o wielkości 15 bajtów zostanie następnie przesłany przez SPI do małego komputera (Raspberry Pi B3), który działa jak syntezator. Nie jestem nastawiony na metodę transmisji. Jeśli SPI nie jest odpowiednim narzędziem do tego zadania, jestem gotów zastosować dowolną metodę komunikacji, którą poradzi sobie Raspberry Pi. Ponieważ jest to aplikacja muzyczno-interaktywna, opóźnienie ma kluczowe znaczenie.

Moje dokładne pytania: czy można to rozwiązać za pomocą jednego mikrokontrolera bez rozbijania banku? Nie stać mnie na zakup układów scalonych o wartości kilkuset dolarów na projekt hobbystyczny. Jaki sprzęt polecasz? Czy są jakieś nieoczywiste zastrzeżenia, których muszę się wystrzegać?

Podejście, które do tej pory czerpałem z odpowiedzi, polegało na zasilaniu każdej kolumny osobno, a następnie odczytywaniu wierszy za pomocą 5 16-kanałowych ADC (ADS7961) podłączonych do Arduino przez SPI. Martwię się, że może to nie być najłatwiejsze / najtańsze podejście lub zbyt szybkie, aby osiągnąć częstotliwość> 1 kHz.

Oświadczenie: Jestem chemikiem teoretycznym i strasznym amatorem w dziedzinie elektrotechniki, wszystko, co wiem, jest samoukiem i nie ma żadnego profesjonalnego zaplecza (co z kolei jest powodem, dla którego szukam pomocy od bardziej kompetentnych ludzi). Ale znam się na oprogramowaniu. Jeśli chodzi o oprogramowanie, dowiem się z wystarczającą ilością czasu. Poza tym jestem Niemcem, więc proszę wybaczcie sporadyczne błędy gramatyczne.

d.oelert
źródło
tylko pomysł… może być poprawa prędkości, jeśli multipleksy są przeplatane… mux0 skanuje próg 0,8,16,24 itd.… mux1 - 1,9,17,25 ... do mux7 (lub wyższej) ... w ten sposób pierwsze 8 progów jest odczytywanych jednocześnie przez 8 muxów, a następnie kolejnych 8 progów ... itd.
jsotola
2
Termin „w czasie rzeczywistym” może nie być właściwy. Oznacza to, że dane opuszczają system z taką samą szybkością, w jakiej wchodzą (jedna próbka do środka, jedna próbka do środka). Ale nie mówi nic o opóźnieniu - czas potrzebny na jego przetworzenie. Do użytku muzycznego potrzebujesz całkowitego opóźnienia (w tym czasu na syntezę / odtwarzanie końcowego dźwięku) na mniej niż 10-15 ms, najlepiej na mniej niż 5.
Schizomorph
Jaka jest różnica w oporności pomiędzy wciśnięciem i nie wciśnięciem?
Trevor_G
od 10 do 1000 omów (z grubsza)
d.oelert
Wymagania są w pewnym stopniu pomieszane z proponowanym wdrożeniem. Być może już odpowiedziałeś na te pytania. Czy wykonawca będzie w stanie wykonać poślizg, dzięki czemu instrument będzie w stanie wykryć zakres pozycji między sąsiednimi progami? Czy musisz być w stanie obsługiwać instrument bezprogowy, czy progi mogą stanowić część rozwiązania?
Wayne Conrad

Odpowiedzi:

7

W zależności od przedziału cenowego możesz rozważyć użycie FPGA między Raspberry Pi i ADC, takimi jak płyta DE0-Nano , która ma dobre wsparcie jako wstępna płyta deweloperska FPGA. Rozwiązanie to ma tę zaletę, że umożliwia pisanie kodu, który będzie taktował wiele / wiele ADC jednocześnie i sformatuje twoje dane w sposób, który można zaprezentować Raspberry Pi.

Wspomniałeś, że zastanawiasz się nad MCP3008. Ten układ jest SPI, więc możesz połączyć kilka urządzeń na tej samej magistrali z różnymi pinami CS. Załóżmy, że podłączyłeś trzy układy do magistrali, co daje 24 kanały ADC na 6 pinów (trzy linie danych i trzy linie CS). Oznacza to 240 kanałów dla 60 pinów, co z łatwością mieści się w możliwościach FPGA.

Jeśli uruchomisz linię zegara MCP3008 z maksymalną częstotliwością 2 MHz, zajmie to (15 zegarów / kanał) * (8 kanałów / układ) * (3 układy / magistralę) * (1/2000000 sekund / zegar) = 0,18 ms do odczytać wszystkie 240 czujników, co odpowiada częstotliwości próbkowania 5,56 kHz.

Billy Kalfus
źródło
brzmi jak niesamowicie fajne podejście! na pewno się temu przyjrzę. jednak nie mam doświadczenia z układami FPGA, więc może to być dla mnie zbyt wiele do zrobienia ... z drugiej strony zawsze szukałem wymówki, aby dostać się do układów FPGA ...
d.oelert
Możesz użyć układu ARM z wieloma liniami SPI. W ten sposób unikniesz kosztu FPGA i potroisz częstotliwość próbkowania (jeśli masz 3 kontrolery SPI). Pamiętaj, że musisz zarządzać opóźnieniem z powodu wewnętrznego przetwarzania (przenoszenie odczytów wewnątrz MCU do miejsca, w którym Pi może dostać) i komunikacji MCU-> Pi.
Ronan Paixão
Nawiasem mówiąc, PI ma również kontroler SPI.
Ronan Paixão
Ideą FPGA jest to, że można stworzyć, powiedzmy, 10 oddzielnych kontrolerów SPI (używając numeru z przykładu, który podałem) i łatwo obsługiwać je idealnie równolegle. I tak, Pi ma kontroler SPI, ale nie jest tak szybki lub równoległy, jak FPGA umożliwiłby stworzenie.
Billy Kalfus
Jeśli możesz znaleźć FPGA lub CPLD z niebuforowanymi wejściami, być może uda Ci się stworzyć analogowy MUX 80: 1. To długa szansa, ale może się udać.
Caleb Reister
10

Oczywistą odpowiedzią jest muxowanie, co oznacza, że ​​dynamicznie tworzysz ścieżkę elektryczną. Więc po prostu iteruj przez całą macierz, pojedynczo lub tyle wejść ADC (przetwornik analogowo-cyfrowy), ile masz.

Jeśli masz 3 ADC, możesz czytać jeden wiersz na raz, następnie zmieniasz dane wejściowe na multiplekser i voilla, czytasz teraz drugi wiersz, a następnie kontynuujesz. Problem z tą konfiguracją polega na tym, że masz 80 wierszy i nie ma żadnego multipleksera 80: 1 (osiemdziesiąt wejść na jedno wejście), o którym wiem. Ale istnieją multipleksy 16: 1 , które można połączyć, aby uzyskać 16 * 5 = 80 wejść.

Wyglądałoby to tak:

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]_______|

4 sygnały wejściowe do multiplekserów 16: 1 można połączyć razem.

W końcu masz bajt z sygnałami sterującymi w tym wzorze:

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

Oznacza to, że będziesz potrzebował multiplekserów 5 × 16: 1 i jednego multipleksera 8: 1 = 6 układów scalonych,

Pomnóż to przez 3, ponieważ możesz chcieć czytać jeden wiersz na raz.

Oznacza to, że będziesz mieć 18 układów scalonych, 7 sygnałów sterujących. Możesz zmniejszyć liczbę układów scalonych, jeśli zwiększysz liczbę wejść analogowych. To 18 z zaledwie 3 wejściami analogowymi.

Jeśli zamiast tego użyłeś 240/16 = 15 układów scalonych, masz 15 wyjść analogowych z multiplekserów 15 × 16: 1. Następnie można go kaskadować z multiplekserem 16: 1 lub 16: 8. Na koniec byłoby 16 układów scalonych, gdybyś „zoptymalizował” go za pomocą multiplekserów 16: 1. Ale to oznaczałoby, że twoje oprogramowanie nie byłoby tak ... eleganckie jak powyżej, byłoby krzyżowaniem, modułem i innymi rzeczami, ale hej, oszczędzasz 2 IC.

10.8ms=1.25kHz

Jest to możliwe, ale to nie dobry projekt.

Rozwiążmy to w inny ... bardziej efektywny sposób na oszczędność miejsca i pieniędzy.

* 20 minut później * Hmmm ... wszystkie rozwiązania, które wymyśliłem, są zbyt trudne do skonfigurowania i / lub wymagają zaawansowanej kalibracji ...

No cóż, więc zakładam, że twój projekt jest odpowiedni do twojego zadania.

Powodzenia.


Zastanawiam się, jakie są te inne rozwiązania. Chcesz się podzielić? - pandalion98

OP chce zmierzyć pozycję i ciśnienie. To dwa parametry. Oznacza to, że musimy spakować te informacje wewnątrz sygnału napięciowego, abyśmy mogli je odczytać i odszyfrować. Lub musimy spakować go do innej jednostki, takiej jak om, indukcyjność, pojemność.

Oto niektóre z moich pomysłów, w których myślę tylko o jednej kolumnie. Po pomnożeniu pomysłu przez 3 masz całe rozwiązanie dla gitary 3-kolumnowej.

Pierwszy pomysł:

Użyj dwóch równoległych drutów (niski opór) biegnących od dołu gitary do szyi gitary. Podłącz masę do jednego z przewodów na spodzie gitary. Stwórz system pomiarowy LR i zmierz indukcyjność i rezystancję z drugiego drutu, również na dole.

Po dotknięciu oba przewody z palca, można podłączyć dwa przewody i nie będzie jakiś indukcyjność tutaj. Im wyżej na gitarze się dotkniesz, tym dłuższy będzie obwód i tym większa będzie indukcyjność. Im mocniej naciskasz, tym większa jest powierzchnia między dwoma drutami i tym mniejszy jest ich opór.

Nie muszą to być dwa „przewody”, mogą to być dwie przewodzące taśmy lub coś innego.

Dlaczego nie podzieliłem się tym wcześniej: Aby było to niezawodne, musisz skalibrować czujniki dla każdej osoby, ponieważ każdy ma inną odporność na skórę. Za każdym razem, gdy grasz, pocisz się, a zatem jeszcze bardziej zmniejszasz opór, więc musisz to zrekompensować. Wszyscy pocą się inaczej, więc będzie to musiało zostać skalibrowane na osobę.

Indukcyjność => pozycja palca. Opór => jak mocno naciskałeś.

Odchylenie mierzonych wartości będzie dotyczyło nano Ω i nano H, co oznacza, że ​​będziesz potrzebować odpowiedniej wiedzy na temat CMRR i SNR. W przeciwnym razie wszystko, co zobaczysz, to napięcie sieciowe, zakładając, że zostanie to wykonane w pomieszczeniu. Lub niektóre inne częstotliwości z Wi-Fi lub lamp lub innych źródeł hałasu. Być może potrzebny będzie odpowiedni filtr cyfrowy. I ... prawdopodobnie jest już poza zakresem możliwości OP i akceptowalnego wysiłku umysłowego. Więc ten pomysł jest odrzucony.

Drugi pomysł:

Wykonaj płaską powierzchnię przewodzącą na gitarze, która jest podłączona do ziemi.

Użyj jednego drutu lub taśmy przewodzącej lub tylko płaskiego przewodu. Nałóż na nią trochę nieprzewodzącej farby lub zwykłą nieprzewodzącą taśmę.

Zapnij pasek na gitarze od dołu do szyi. Podłącz przewód u dołu gitary do wysokich częstotliwości w zakresie setek MHz. Teraz zaczniesz otrzymywać zauważalne odbicia. Ponieważ technicznie masz ... złą linię transmisyjną, w której tylko jedna strona jest osłonięta.

Wyślesz więc impuls o krótkiej fali prostokątnej i zmierzysz, ile czasu potrzeba, aby powrócił z powodu odbicia od palca znajdującego się na izolowanym przewodzie. A następnie mierzysz amplitudę odbijanego szczytu w dolnej części gitary. Czas podróży => pozycja palca. Amplituda odbicia => jak mocno naciskałeś.

Nie jest to najłatwiejsza do skonfigurowania ... jeśli nie wiesz, co robisz. Ponownie więc może to być zbyt duży wysiłek dla OP. Więc ten pomysł jest odrzucony.


Wyglądałoby to tak:

wprowadź opis zdjęcia tutaj

Przyjąłem impedancję charakterystyczną jako 150 Ω, innymi słowy bardzo złą linię przesyłową. W rzeczywistości może być gorzej, nie wiem, że nigdy tego nie zrobiłem.

Oto link na wypadek, gdyby ktoś chciał się zepsuć.

Jedną z najtrudniejszych części będzie dopasowanie punktów końcowych do pewnego oporu, do tego może być potrzebny oscyloskop lub inny drogi instrument.

Inną trudną częścią będzie pomiar TOF (czas przelotu), są tam niektóre układy scalone, ale nie są tanie ... ale zawsze możesz po prostu stworzyć stałe źródło prądu i napełnić mały kondensator, a następnie po prostu odczytać napięcie.

Chodzi o to, że gdy palec zbliży się do drutu, palec stanie się częścią obwodu i będzie działać jak kondensator. Im bliżej jest twój palec, tym bardziej pojemnościowy. Dlatego opór w punkcie palca spadnie.

https://en.wikipedia.org/wiki/Transmission_line przewiń nieco w dół, a zobaczysz, że parametr pojemnościowy jest częścią mianownika.

Ilekroć punkt na przewodzie będzie niedopasowany, pojawi się odbicie, które można odczytać na „wyjściu”, z którego pochodzi sygnał. Jeśli nigdzie nie ma odbicia, twój sygnał zostanie zakończony w jednym z punktów końcowych.

Im mocniej naciskasz, tym więcej obszaru palca się wyrówna => większa pojemność z powodu obszaru. Ponadto każdy nieprzewodzący materiał, który dostaniesz między drut a palec, zostanie lekko ściśnięty, aby jeszcze bardziej zwiększyć pojemność.

Trzeci pomysł:

Trzymać Theremin wewnątrz gitary i pomiaru częstotliwości i amplitudzie. Nie wiem dokładnie, co wygeneruje tammin, ale na pewno coś można użyć.

W tym momencie brakuje mi pomysłów i mówię, że spędziłem 20 minut. Kiedy w rzeczywistości może wydałem 10. No cóż. Teraz z pewnością spędziłem kolejne 10 minut, żeby to napisać, więc wszystko się sumuje.

Harry Svensson
źródło
1
Wydaje mi się, że debugowanie związane z podłączeniem 15 układów scalonych do 3 zestawów 80 czujników może być ... znaczące. Ponadto, z pewnością setka drutów zwisających z matrycy czujników nigdy nie będzie wystarczająco wytrzymała.
BeB00
Myślę, że jest to w rzeczywistości całkiem wykonalne, a jeśli zostanie wykonane właściwie, zmniejsza ilość okablowania, która w innym przypadku byłaby wymagana.
pjc50
Zastanawiam się, jakie są te inne rozwiązania. Chcesz się podzielić?
PNDA
1
@ pandalion98 Hmmm ... może drugi pomysł wcale nie był taki zły. No cóż.
Harry Svensson,
6

Trzy pomysły:

1. Wykonaj multipleksowanie po stronie podaży

Skutecznie obwód, który opisałeś, jest dużą liczbą zmiennych rezystancji, z których każdy ma jeden koniec wspólny z napięciem zasilającym. Chcesz odczytać wszystkie wartości rezystancji, a inne dotychczasowe odpowiedzi głównie sugerowały podejścia do multipleksowania sygnału po stronie analogowej.

Ale możesz również wykonać część lub całość tego multipleksowania po stronie podaży , dzieląc „szynę” zasilania na n sekcji. Połącz razem n zestawów czujników, z których każdy ma inną szynę zasilającą. Teraz zasilaj tylko jedną szynę zasilającą na raz i użyj jednego wejścia ADC do odczytu każdego zestawu elektrod. (W ten sposób zwykle działa obwód odczytujący klawiaturę komputerową, a sposób, w jaki przełączniki są okablowane, jest często nazywany „przełącznikiem krzyżowym”.) Ostatecznie możesz po prostu użyć pojedynczego ADC podłączonego do wszystkich „szyn” i zrobić wszystkie multipleksowanie poprzez podłączanie zasilania kolejno do każdego padu.

Jedynym haczykiem jest to, że wszystkie pozostałe pady muszą być odizolowane od szyny zasilającej, niepołączone z ziemią, co miałoby miejsce, gdyby po prostu użyć wyjścia cyfrowego dla każdego z nich. Istnieje kilka sposobów rozwiązania tego problemu, w tym okablowanie każdego padu za pomocą diody, tranzystora bipolarnego lub FET, lub - nie wiem, jak szybko można to zrobić w praktyce, ale jest to w zasadzie możliwe - za pomocą styku wejściowego i wyjściowego mikrokontroler i ustawienie go na wysoką moc wyjściową lub na wejście, gdy powinna mieć stosunkowo wysoką impedancję.

Dokładność pomiaru czujników za pomocą tej techniki może nie być idealna w porównaniu z użyciem pojedynczego stałego źródła napięcia i wysokiej jakości analogowych multiplekserów, ale podejrzewam, że będzie wystarczająco dobra, zwłaszcza że jestem pewien, że czujniki ciśnienia będą miały pewną tolerancję na ich rezystancja - może być konieczne skalibrowanie tego dla każdego czujnika przy użyciu siły odniesienia.

2. Użyj niektórych mikrokontrolerów z dużą ilością wejść ADC

Na przykład PICAXE 40X2 ma 27 pinów, które można wykorzystać jako wejście analogowe, dzięki czemu możesz zaspokoić swoje potrzeby za pomocą 9 z nich. Jest zaprogramowany w prostym języku BASIC i może działać jako urządzenie podrzędne i2c - dzięki czemu możesz odczytać 9 układów za pomocą jednego dodatkowego mikrokontrolera - lub prawdopodobnie możesz po prostu wysłać dane wyjściowe z każdego układu jako dane szeregowe i wczytać je do komputera hosta poprzez konwertery szeregowe na USB. Nie mogę obiecać dokładnie, jak szybko to pójdzie, ale myślę, że powinno działać OK, jeśli taktujesz PICAXE z maksymalną prędkością (64 MHz, używając zewnętrznego rezonatora 16 MHz). Oczywiście, jeśli jesteś zadowolony z programowania mikrokontrolera w C, możesz zrobić to samo z PIC18F45K22, na którym oparty jest PICAXE.

3. Użyj gotowych analogowych jednostek wejściowych

Wreszcie, jeśli nie masz nic przeciwko wydawaniu pieniędzy, aby zaoszczędzić czas, a przenośność nie ma wysokiego priorytetu - na przykład, jeśli OK może być przywiązany do stojaka na sprzęt grubymi kablami - możesz po prostu kupić wystarczająco dużo analogowe urządzenia wejściowe zliczające kanały do ​​pomiaru wszystkich czujników jednocześnie. Na przykład pomiarowy USB-2633 odczytuje 64 wejścia analogowe za nieco ponad 1 tys. USD.

nekomatic
źródło
4

Być może warto rozważyć warunkowanie sygnału brutalnej siły (być może pasywne), a następnie małe ADC lub MCU / ADC z 16 lub więcej wejściami MUX'd ADC każde. To tylko 40 żetonów. Jednym z przykładów układu, który może działać, jest ADS7961QDBTRQ1 , który ma tryb kanału z automatyczną inkrementacją i 16 wejściami.

Ogólna szybkość przesyłania danych nawet przy częstotliwości próbkowania 4 kHz i 240 bajtach na próbkę wynosi około 1 MB / s, co nie jest zbyt przerażające. Być może główny procesor z magistralą SPI 10 MHz lub 20 MHz komunikuje się z urządzeniami slave. Użyj 2 magistral SPI, jeśli nie ma tam przepustowości. Część wymieniona powyżej działa przy 20 MHz, więc wystarczy jeden SPI.

A może możesz użyć jednego układu TI - DDC2256AZZF , który ma 64-kanałowe jednoczesne próbkowanie i 256 wejść .. ale nie jest to szczególnie tanie (około 350 USD) i jest dostępne w matrycy LFBA 14x14 mm 323-pin, więc nie będzie pracować z białą płytką stykową.

Spehro Pefhany
źródło
3

W przypadku aplikacji interfejsu człowieka w czasie rzeczywistym ogólna częstotliwość próbkowania wielu kHz wydaje się wysoka. Prawdopodobnie wystarcza 50 Hz ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Oznacza to, że musisz próbkować wszystkie czujniki w <20ms, więc 80us na czujnik. Nie jest to zbyt trudne i może być zarządzane w zasadzie przez wszystkie normalne 8-bitowe mikrokontrolery (tj. Atmega88 może to zrobić w <30us).

Równie dobrze możesz zmierzyć wszystkie interakcje, a następnie po prostu odrzucić te, których nie potrzebujesz, ponieważ mierzenie ich wszystkich nie jest technologicznie trudne. Problem pochodzi z multipleksowania. Jestem trochę zdezorientowany na twoim stanowisku, ponieważ mówi, że czujniki są zasilane 80 na raz? Jak zwykle mówisz, multipleksowanie kolumn i wierszy. Jeśli tego nie zrobisz, będziesz musiał poradzić sobie z> 80 przewodami wychodzącymi z urządzenia, co naprawdę nie jest świetnym pomysłem. Musisz znaleźć sposób na podzielenie go na macierz, aby uzyskać 30 drutów (co wciąż jest dużo). Mógłbyś wtedy je multipleksować itp., Ale gdybym był tobą, miałbym po prostu wiele mikrokontrolerów i pozwoliłbym im podłączyć się do mistrza. Możesz użyć dedykowanego ADC zamiast podrzędnych MCU, ale ja osobiście trzymałbym się MCU.

Prawidłowo zidentyfikowałeś, że komunikacja może stanowić problem, ale nie jest to wielka sprawa, przynajmniej między MCU. Atmega przy 8 MHz może wykonywać SPI przy 2 MHz, więc przesłanie wszystkich danych z czujnika zajmie <1ms. Pytanie brzmi: co chcesz zrobić z tymi danymi po tym, jak master MCU je ma.

BeB00
źródło
2
Kiedy reaguje się na pojedyncze wejście, 50 Hz jest zwykle uważane za „wystarczające” w ogólnym ujęciu GUI, ale z mojego własnego doświadczenia z kartami dźwiękowymi, odtwarzanie muzyki z opóźnieniem 200 ms wcale nie jest przyjemnym doświadczeniem (myśl, że zagłuszanie mowy). Wyobrażam sobie, że zmienne opóźnienie 0-200 ms sprawiłoby, że instrument byłby praktycznie niemożliwy do grania, ponieważ jakiekolwiek poczucie rytmu z pewnością byłoby zabite martwe. Częstotliwość odpytywania wynosząca około jednego kHz byłaby dobrym punktem początkowym minimum.
Dampmaskin
1
@ Wilgotna maska ​​50 Hz = 20 ms, a nie 200 ms. 20ms jest prawdopodobnie bardziej rozsądne
Steven Waterman
1
Mój błąd. Prawdopodobnie 20 ms może być użyteczne, jeśli jest to zgodne 20 ms, ale zawsze mniejsze opóźnienie jest zawsze lepsze. I tak zawsze będzie więcej opóźnień w łańcuchu sygnału.
Dampmaskin
@Dampmaskin to dokładnie problem, który widzę w opisywanym podejściu. muszę „zaoszczędzić” jak najwięcej opóźnień dla późniejszych składników łańcucha, ponieważ próbuję podłączyć syntezator Raspberry Pi i idealnie chciałbym pozostać poniżej 15-20 ms całkowitego opóźnienia. Jeśli kontroler zajmuje już 20 ms, nie ma już miejsca na zapas.
d.oelert
@StevenLowes 20ms jest zbyt długi dla większości muzyków. To jest nawet poza odległością Haas dla niektórych dźwięków. Osobiście nie jestem w stanie poradzić sobie z opóźnieniem większym niż 10 ms i znam pianistę, który po prostu nie jest w stanie wytrzymać opóźnienia 6 ms.
Todd Wilcox,
3

Najprostszym sposobem może być zbudowanie całości na długim obwodzie elastycznym z łańcuchem 10 ośmiobitowych szeregowych szeregów otwartych kolektorów do równoległych rejestrów rozmieszczonych wzdłuż gięcia, aby zasilać każdą kolumnę pól osobno.

Możesz użyć ich do jednoczesnego sterowania każdą kolumną we wszystkich rzędach i multipleksowania wspólnych linii powrotnych do ADC. Linie powrotne wymagałyby odpowiednich podciągnięć, aby uzyskać napięcie dzielnika rezystora z oporem przycisku.

schematyczny

symulacja tego obwodu - Schemat utworzony za pomocą CircuitLab

Sterująca mikroprocesor wysyła następnie pojedynczy bit zerowy w dół łańcucha rejestrów, więc tylko jedna kolumna jest zasilana jako czas. Pozostałe połączenia byłyby zmienne.

Trevor_G
źródło
1

oczywistym sposobem na to (ponieważ wystarczy zobaczyć jedno dotknięcie na każdym sznurku) jest podłączenie progów do dzielnika napięcia, a następnie zmierzenie napięcia na każdym sznurku

poinformuje Cię o dotknięciu lokalizacji.

aby uzyskać nacisk dotykowy, umieść kondensator od ziemi do każdego progu i zmierz rezystancję prądu przemiennego na każdej strunie.

wadą tego podejścia jest to, że struny reagują na wyższe dotknięcia

Jasen
źródło
2
przepraszam, jeśli źle zrozumiałeś, ale nie ma w tym przypadku gryfów i strun. jest to po prostu drewniana deska z matrycą czujnika ciśnienia na górze, która naśladuje styl gry, który można zastosować na prawdziwej desce progowej. Dzięki za wkład, mogę mieć to na uwadze w przyszłych projektach!
d.oelert
przez progi i struny powyżej Mam na myśli paski miedzi, o których wspomniałeś w swoim pytaniu,
Jasen
Ach, rozumiem, co masz na myśli, przepraszam, że to było gęste. to podejście może się przerwać, gdy nuty są odtwarzane legato, ponieważ wtedy nieuchronnie wystąpi wiele dotknięć tego samego struny. tylko najniższe sprawy mają znaczenie
olert
także, chociaż bardzo podoba mi się twoje podejście, nie odpowiada to na moje pierwotne pytanie, a mianowicie, jak zwykle radziłby sobie z dużą liczbą czujników analogowych, które należy przetwarzać w czasie rzeczywistym.
d.oelert
kamery mają dużą liczbę czujników analogowych ...
Jasen
0

Jeśli możesz uzyskać drut o dość jednolitej rezystancji na cal, który wynosi między 100 omów a 100 K dla długości gitary, możesz być w stanie po prostu zrobić szyję z materiału, który jest umiarkowanie przewodzący, z opornością powierzchniową która zmniejsza się wraz z naciskiem, a następnie mierzy opór między szyją a każdym końcem każdego sznurka. Suma oporów, minus opór struny, wskazywałaby dwukrotnie opór punktu styku. Po odjęciu oporu punktu styku od każdego zmierzonego oporu, stosunek pozostałych rezystancji wskazywałby punkt styku na szyi.

Zauważ, że to podejście byłoby w stanie wykryć jednoczesne naciśnięcia na wszystkich trzech ciągach, ale nie zadziałałoby, gdyby ciąg mógł zostać naciśnięty w wielu miejscach. Na gitarze taki projekt wykluczałby stosowanie akordów barre - dość poważne ograniczenie - ale inne instrumenty mogą nie wymagać dotykania strun w wielu miejscach.

supercat
źródło
Jeśli możesz dostać drut o dość jednolitej rezystancji na cal, który wynosi od 100 omów do 100 K dla długości gitary ” - wątpię, czy on / ona może znaleźć ten rodzaj drutu.
Harry Svensson,
Nie zgadzam się; W moim biurze jest drut oporowy o wartości 1717 omów / m, więc nie powinno być trudno go znaleźć. Nie twierdzę, że łatwo jest z tym pracować, ponieważ jest to drut o średnicy 50 mm, ale nie jest trudny do zdobycia.
MrGerber
@MrGerber: Zapomniałem, że oporność drutu nichromowego jest znacznie niższa w niższych temperaturach niż w cieplejszych, więc prawdopodobnie lepiej byłoby zmienić obwód tak, aby działał na czymś bliższym niż 10 omów, ale podstawowa koncepcja mogłaby zostać zastosowana. Alternatywnie, posiadanie szyjki jako słabo przewodzącego materiału i połączenie sznurków z tym może również zadziałać.
supercat
To nie jest NiCr, ale FeCrAl, a rezystancja niewiele zmienia się w zależności od temperatury. Typ, który mam, zmienia się o około 8% ze 100 C na 1300 C. Ref: Kanthal D (I nie, nie robię e-papierosów.)
MrGerber
@MrGerber: Dobra, nie jest źle. W odpowiedzi na wcześniejszy komentarz przejrzałem kilka tabel i zobaczyłem opory, które rosły o rząd wielkości w zależności od temperatury.
supercat
0

Widziałem ten post i myślałem, że to możliwe z jednym chipem. Zaskoczę, że weźmiesz jakąś płytę mikrokontrolera, taką jak tania tablica bluepill. Ma ARM M3, z 10 darmowymi kanałami ADC. Jeśli umieścisz kolumny w 3 grupach po 3 ciągi, podłącz je do 9 wolnych kanałów ADC. Użyj pozostałych 21 szpilek, aby przełączyć rzędy szpilek, w sumie 63 „progów”. macierz połączeń, rezystory są ogniwami velostat, napędy GPIO o napięciu 3,3 V lub są w trybie wejściowym, piny ADC mierzą spadek napięcia na ogniwie Velostat Mikrokontroler ma dwa 1-MSP 12-bitowe przetworniki ADC, których można używać z opóźnieniem fazowym w celu obsługi 2Msp, co powinno wystarczyć, aby nigdy nie przegapić młota lub zauważyć żadnej modulacji. Myślę, że możesz użyć połączenia USB i sprawić, że będzie działać jak kontroler midi USB. Możesz użyć większego mikrokontrolera, aby uzyskać więcej danych wejściowych, ale nie rozumiem, jak poradzisz sobie z odstępami „progowymi” z ponad 30 progami, czy może będzie to bardziej ekran dotykowy?

Nie wiem dokładnie, jak działają te arkusze velostatu, ale czy nie możesz umieścić małych punktów końcowych na spodzie większego arkusza i skorelować położenie i nacisk palca z napięciem w wielu punktach? Wtedy prawdopodobnie możesz uciec z dużo mniej wyczuwania i wspierać takie rzeczy, jak zakręty i vibrato.

Kurczak Sap
źródło