Auslesen einer großen Anzahl analoger Sensoren in Echtzeit

Ich versuche, einen MIDI-ähnlichen Controller zu bauen, der einen Hals wie eine Gitarre hat. An diesem Hals befindet sich eine riesige Matrix von Drucksensoren. Der Controller emuliert 3 Saiten.

Das funktioniert so: Es gibt 3 lange Streifen doppelseitiges Kupferband (0,5 cm breit, so lang wie der Hals), die an Strom angeschlossen sind (3,3 V oder 5 V wahrscheinlich, ist jetzt egal). Auf diesen Streifen befindet sich eine Schicht Velostat, die den spezifischen Widerstand je nach Druck ändert. Auf dem Velostat befindet sich eine weitere Schicht aus Reihen oder Zellen aus Kupferband, die mit etwas verbunden sind, das einen Messwert der Spannung durch die Velostatschicht ausspuckt. Da der Hals etwa 40 cm lang ist, ergeben sich mindestens 80 Reihen.

Wenn Sie sich die unteren 3 Kupferbandstreifen als Säulen eines Diagramms entlang des Halses vorstellen, sind die Sensoren je nach Messmethode entweder die Zellen oder Reihen (ich dachte, man könnte dann auch die Spalten multiplexen es könnte Reihen geben.) Es gibt jedoch ein paar spezielle Bedingungen, die dies erleichtern könnten: Da dies ein gitarrenähnlicher Controller ist, muss nicht jede Interaktion gemessen werden! Nur die Berührung, die dem Körper des Controllers am nächsten ist, zählt. Auch eine Auflösung von 8 Bit sollte ausreichend genau sein. 255 Druckstufen sind wohl sowieso mehr als nötig.

Jetzt die schwierigen Stellen:

Die Messung muss in Echtzeit genug sein, um Hammer-Ons usw. zu erkennen (keine Ahnung, wie hoch die Abtastrate sein muss - geschätzt auf mehrere kHz für ein gutes Maß und Spielbarkeit) und der digitale Ausgang des Controllers sollte es auch sein MIDI (auf 3 separaten Kanälen - einer pro Saite) oder ein digitales Signal, das mit einem Raspberry Pi verarbeitet werden kann.

Jetzt, da mein Wissen wirklich begrenzt ist, konnte ich nicht an die richtigen Werkzeuge für den Job denken. Was ich aber weiß ist: Es ist möglich. Es gibt einen ähnlichen, aber anderen Controller, der eine sehr ähnliche Technik verwendet (die ich praktisch zurückentwickelt habe, bis ich bemerkte, dass sie ein Patent haben und die Informationen darüber, wie sie es tun, nicht so geheimnisvoll sind, wie ich dachte), er heißt ROLI Küste.

TL;DR:

  • rund 240 Sensoren

  • können in Gruppen von 80 getrennt werden, die von der gleichen Leitung versorgt werden

  • Dies ist eine Echtzeitanwendung, ich muss den Druck von jedem Sensor erfassen, wenn er berührt wird (es gelten einige Bedingungen, siehe oben).

Danke im Voraus, ich weiß, es ist viel zu lesen. Ich bin für jeden Vorschlag dankbar und würde mich sehr freuen, wenn Sie mir helfen könnten, das schreckliche Chaos zu schaffen, das ich mir vorgenommen habe!

Dinge, an die ich bisher gedacht habe:

Zeilen und Spalten multiplexen, jede Zelle mit einem MCP3008 oder größeren ADC lesen und ATmegas verketten (Daisy-Chain oder baumartig), die nur die positionsmäßig niedrigste Wechselwirkung zum endgültigen Signal schieben, aber nach meinen Berechnungen könnte dies möglicherweise zu Engpässen führen der Kommunikationsaufwand. Auch ein früheres Modell enthielt Bändchenpotentiometer, die ich verworfen habe, weil das Design schlecht war (mehrere Versuche, war nicht cool genug).

BEARBEITEN/AKTUALISIEREN:

Danke für die guten Vorschläge bisher! Dank ihnen kann ich mein Problem jetzt viel klarer formulieren:

Ich habe eine Matrix von 80 Zeilen * 3 Spalten von Drucksensoren. Wenn ein Mensch mit der Sensormatrix interagiert, nehmen mehrere Sensoren in der Nähe die Berührung auf, aber nur entlang einer Spalte. Die Säulen sind mechanisch getrennt. Die Sensoren haben einen Widerstand zwischen 100 Ohm und 1 kOhm. Alle diese Sensoren müssen mit einer Tiefe von 8 Bit gelesen, verarbeitet und die Ergebnisse mit einer Rate von mindestens 1 kHz gesendet werden. Ein einzelnes Lesen/Verarbeiten muss also weniger als eine Millisekunde dauern. Die endgültige Ausgabe pro Spalte muss sein: 4 Byte für ein Float32 und 1 Byte für ein uint8. Float32 zeigt die gemittelte Position der ersten Interaktion entlang der Spalte an. Eine Interaktion ist definiert als eine aufeinanderfolgende Gruppe von Sensoren mit einem Druck über einem bestimmten Schwellenwert. Hier kommt die Verarbeitung ins Spiel: die Säule wird nach unten durchquert, bis ein Messwert einen Schwellenwert überschreitet. Dies gilt dann als Beginn einer Interaktion. Der Druck und die Position jedes Sensors wird gespeichert bis zum ersten Sensor, der die Schwelle mit maximal (wahrscheinlich) 4 aufeinanderfolgenden Sensoren unterschreitet. Von allen Sensoren der aufgezeichneten Interaktion werden nur zwei Sensoren verarbeitet - derjenige, der den höchsten Druck (geringster Widerstand) liest und der höchste direkt darüber oder darunter. Die Gleitkommaposition wird durch Mittelung der beiden mit ihren Drücken gewichteten Sensorpositionen berechnet. Der Gesamtdruck der Interaktion ist nur die Addition beider Drücke, die zwischen 0 und 255 geklemmt sind (addieren Sie beide Drücke von unit8 in eine uint16 und dividieren Sie durch 2 ohne Rundung, verwerfen Sie die nicht benötigten Bits - dies sollte schnell gehen). Dies muss für jede Spalte geschehen. Das 15 Byte große Ergebnis wird dann über SPI an einen kleinen Computer (Raspberry Pi B3) gesendet, der als Synthesizer fungiert. Ich bin nicht auf den Übertragungsweg festgelegt. Wenn SPI nicht das richtige Werkzeug für den Job ist, bin ich bereit, jede Kommunikationsmethode zu verwenden, die ein Raspberry Pi verarbeiten kann. Da es sich um eine musikalisch-interaktive Anwendung handelt, ist Latenz entscheidend.

Meine genauen Fragen sind: Kann dies mit einem einzigen Mikrocontroller gelöst werden, ohne die Bank zu sprengen? Ich kann es mir nicht leisten, ICs im Wert von mehreren hundert Dollar für ein Hobbyprojekt zu kaufen. Welche Hardware würdet ihr empfehlen? Gibt es nicht offensichtliche Vorbehalte, vor denen ich mich hüten muss?

Der Ansatz, den ich aus den bisherigen Antworten abgeleitet habe, bestand darin, jede Spalte einzeln mit Strom zu versorgen und dann die Zeilen mit 5 16-Kanal-ADCs (ADS7961) auszulesen, die über SPI mit einem Arduino verbunden sind. Ich mache mir Sorgen, dass dies möglicherweise nicht der einfachste / billigste Ansatz oder nicht schnell genug ist, um eine Rate von> 1 kHz zu erreichen.

Haftungsausschluss: Ich bin normalerweise ein theoretischer Chemiker und ein schrecklicher Amateur, wenn es um Elektrotechnik geht. Alles, was ich weiß, ist Autodidakt und ohne beruflichen Hintergrund (was wiederum der Grund ist, warum ich Hilfe von erfahreneren Leuten suche). Allerdings kenne ich mich mit Software aus. Alles, was Software betrifft, werde ich mit genügend Zeit herausfinden. Außerdem bin ich Deutscher, entschuldigen Sie bitte gelegentliche Grammatikfehler.

nur eine Idee .... es kann eine Geschwindigkeitsverbesserung geben, wenn die Muxes verschachtelt sind .... mux0 würde Bund 0,8,16,24 usw. scannen ... mux1 - 1,9,17,25 ... bis Mux7 (oder höher) ... so werden zuerst 8 Bünde gleichzeitig von 8 Muxen gelesen ... dann die nächsten 8 Bünde ... usw.
Der Begriff „Echtzeit“ ist vielleicht nicht ganz der richtige. Dies bedeutet, dass die Daten das System mit der gleichen Rate verlassen, mit der sie es eingeben (eine Probe rein, eine Probe raus). Aber es sagt nichts über die Latenz aus - die Zeit, die es braucht, um es zu verarbeiten. Für die musikalische Verwendung muss die Gesamtlatenz (einschließlich der Zeit zum Synthetisieren/Wiedergeben des endgültigen Tons) weniger als 10–15 ms betragen, vorzugsweise weniger als 5.
Wie groß ist die Widerstandsvariation zwischen gedrückt und nicht gedrückt?
zwischen 10 und 1000 Ohm (ungefähr)
Die Anforderungen sind irgendwie mit der vorgeschlagenen Implementierung vermischt. Vielleicht haben Sie diese Fragen bereits beantwortet. Wird der Interpret in der Lage sein, einen Slide zu spielen, so dass das Instrument in der Lage sein muss, eine Reihe von Positionen zwischen zwei benachbarten Bünden zu erkennen? Müssen Sie in der Lage sein, ein bundloses Instrument zu unterstützen, oder können die Bünde Teil der Lösung sein?

Antworten (9)

Abhängig von Ihrer Preisklasse sollten Sie die Verwendung eines FPGA zwischen Ihrem Raspberry Pi und ADCs in Betracht ziehen, z. B. das DE0-Nano Board , das als einführendes FPGA-Entwicklungsboard eine gute Unterstützung bietet. Diese Lösung hat den Vorteil, dass Sie Code schreiben können, der mehrere/viele ADCs gleichzeitig taktet und Ihre Daten so formatiert, dass sie für den Raspberry Pi darstellbar sind.

Sie haben erwähnt, dass Sie den MCP3008 in Betracht ziehen. Dieser Chip ist SPI, sodass Sie einige Geräte auf demselben Bus mit unterschiedlichen CS-Pins verbinden können. Angenommen, Sie haben drei Chips an einen Bus angeschlossen, sodass Sie 24 ADC-Kanäle pro 6 Pins erhalten (drei Datenleitungen und drei CS-Leitungen). Das bedeutet 240 Kanäle für 60 Pins, was leicht innerhalb der Möglichkeiten des FPGA liegt.

Wenn Sie die MCP3008-Taktleitung mit ihrer maximalen Frequenz von 2 MHz betreiben, würde dies (15 Takte/Kanal) * (8 Kanäle/Chip) * (3 Chips/Bus) * (1/2000000 Sekunden/Takt) = 0,18 ms dauern Lesen Sie alle 240 Sensoren, was einer Abtastrate von 5,56 kHz entspricht.

klingt nach einem unglaublich coolen Ansatz! das werde ich auf jeden Fall prüfen. Ich habe allerdings keine Erfahrung mit FPGAs, also könnte das zu viel für mich sein, um damit fertig zu werden ... andererseits habe ich immer nach einer Ausrede gesucht, um in FPGAs einzusteigen ...
Sie können einen ARM-Chip mit mehreren SPI-Leitungen verwenden. Auf diese Weise vermeiden Sie die FPGA-Kosten und erhalten die dreifache Abtastrate (wenn Sie 3 SPI-Controller haben). Denken Sie daran, dass Sie Verzögerungen aufgrund der internen Verarbeitung (Verschieben der Messwerte innerhalb der MCU an einen Ort, an den der Pi gelangen kann) und der MCU-> Pi-Kommunikation bewältigen müssen.
Übrigens hat der PI auch einen SPI-Controller.
Die Idee hinter dem FPGA ist, dass Sie beispielsweise 10 separate SPI-Controller herstellen (unter Verwendung der Nummer aus dem von mir bereitgestellten Beispiel) und diese problemlos perfekt parallel betreiben können. Und ja, der Pi hat einen SPI-Controller, aber er ist bei weitem nicht so schnell oder parallel, wie es ein FPGA ermöglichen würde.
Wenn Sie ein FPGA oder CPLD mit ungepufferten Eingängen finden könnten, könnten Sie vielleicht sogar einen 80:1-Analog-MUX erstellen. Es ist ein langer Weg, aber es könnte funktionieren.

Die offensichtliche Antwort ist Muxing, das bedeutet, dass Sie elektrische Pfade dynamisch erstellen. Iterieren Sie also einfach die gesamte Matrix einzeln oder so viele ADC-Eingänge (Analog-Digital-Wandler), wie Sie haben.

Wenn Sie 3 ADCs haben, können Sie jeweils eine Reihe lesen, dann ändern Sie die Eingänge in Mux und Voilla, Sie lesen jetzt die zweite Reihe und fahren dann fort. Das Problem bei diesem Setup ist, dass Sie 80 Zeilen haben und es keinen 80: 1-Mux (achtzig Eingänge zu einem Eingang) gibt, den ich kenne. Aber es gibt 16:1-Muxes , die Sie zusammenstellen können, um 16 * 5 = 80 Eingänge zu erhalten.

Es würde in etwa so aussehen:

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

Die 4 Eingangssignale der 16:1 Muxes können zusammengeschaltet werden.

Am Ende haben Sie also ein Byte mit Steuersignalen in diesem Muster:

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

Das bedeutet, dass Sie 5 × 16: 1-Mux und einen 8: 1-Mux = 6 ICs benötigen.

Multiplizieren Sie das mit 3, weil Sie vielleicht eine Zeile nach der anderen lesen möchten.

Das bedeutet, dass Sie 18 ICs, 7 Steuersignale haben. Sie können die Anzahl der ICs reduzieren, wenn Sie die Anzahl der analogen Eingänge erhöhen würden. Es ist 18 mit nur 3 analogen Eingängen.

Wenn Sie stattdessen 240/16 = 15 ICs verwenden, erhalten Sie 15 analoge Ausgänge von den 15 × 16: 1-Muxen. Dann könnten Sie es mit einem 16: 1-Mux oder 16: 8-Mux kaskadieren. Am Ende wären es 16 ICs, wenn Sie es mit 16: 1-Muxen "optimieren" würden. Aber das würde bedeuten, dass Ihre Softwarelösung nicht so ... elegant wie oben wäre, sie wäre kreuz und quer und Modulus und anderes Zeug, aber hey, Sie sparen 2 ICs.

Sie lesen also eine Zeile, verarbeiten sie, gehen dann zur nächsten Zeile, verarbeiten sie, dann die nächste usw. Wenn Sie jeder Zeile 10 µs geben, werden Sie 80 Zeilen in 0,8 ms ausführen 1 0,8 m s = 1.25 k H z , das ist in dem Bereich, an den Sie gedacht haben.

Es ist möglich, aber es ist kein gutes Design.

Lassen Sie uns dies auf eine andere Weise lösen ... platz- und geldeffizienter.

*20 Minuten später* Hmmm ... alle Lösungen, die ich mir ausgedacht habe, sind entweder zu schwierig einzurichten und / oder erfordern eine fortgeschrittene Kalibrierung ...

Na gut, dann gehe ich davon aus, dass Ihr Design für Ihre Aufgabe geeignet ist.

Viel Glück.


Ich frage mich, was diese anderen Lösungen sind. Möchtest du teilen? – pandalion98

OP möchte Position und Druck messen. Das sind zwei Parameter. Das bedeutet, dass wir diese Informationen in ein Spannungssignal packen müssen, damit wir sie lesen und entschlüsseln können. Oder wir müssen es in eine andere Einheit packen, wie Ohm, Induktivität, Kapazität.

Hier sind einige meiner Ideen, bei denen ich nur an eine Spalte denke. Multiplizieren Sie einfach die Idee mit 3 und Sie haben die vollständige Lösung für eine 3-Säulen-Gitarre.

Erste Idee:

Verwenden Sie zwei parallele Drähte (niedriger Widerstand), die von der Unterseite der Gitarre zum Hals der Gitarre gehen. Verbinden Sie Masse mit einem der Drähte an der Unterseite der Gitarre. Machen Sie ein LR-Messsystem und messen Sie die Induktivität und den Widerstand vom anderen Draht, ebenfalls unten.

Wenn Sie beide Drähte mit einem Finger berühren, verbinden Sie die beiden Drähte und hier entsteht eine gewisse Induktivität. Je weiter oben Sie die Gitarre berühren, desto länger wird die Schaltung und desto mehr Induktivität werden Sie messen. Je stärker Sie drücken, desto mehr Oberfläche befindet sich zwischen den beiden Drähten und desto geringer ist der Widerstand.

Es müssen nicht zwei "Drähte" sein, es können zwei leitfähige Bänder oder etwas anderes sein.

Warum ich das vorher nicht geteilt habe: Damit dies zuverlässig ist, müssen Sie die Sensoren für jeden Einzelnen kalibrieren, da jeder einen unterschiedlichen Widerstand in seiner Haut hat. Wenn Sie spielen, werden Sie schwitzen und dadurch den Widerstand weiter reduzieren, also müssen Sie dies kompensieren. Jeder schwitzt unterschiedlich viel, daher muss dies auch pro Person kalibriert werden.

Also die Induktivität => Position des Fingers. Der Widerstand => wie stark Sie gedrückt haben.

Die Abweichung der Werte, die Sie messen, liegt im Nano-Ω und im Nano-H, was bedeutet, dass Sie einige angemessene Kenntnisse in Bezug auf CMRR und SNR benötigen. Andernfalls sehen Sie nur die Netzspannung, vorausgesetzt, dies geschieht in Innenräumen. Oder einige andere Frequenzen aus dem WLAN oder Lampen oder andere Geräuschquellen. Vielleicht wird also ein richtiger digitaler Filter benötigt. Und ... es liegt wahrscheinlich bereits außerhalb des Rahmens der Fähigkeiten und der akzeptablen mentalen Anstrengung von OP. Also wird diese Idee verworfen.

Zweite Idee:

Machen Sie eine flache leitfähige Oberfläche auf der Gitarre, die mit Masse verbunden ist.

Verwenden Sie einen Draht oder ein leitfähiges Band oder nur einen flachen Leiter. Tragen Sie etwas nichtleitende Farbe oder ein normales nichtleitendes Klebeband darüber auf.

Binden Sie es von unten über die Gitarre bis zum Hals der Gitarre. Verbinden Sie das Kabel an der Unterseite der Gitarre mit hohen Frequenzen im Bereich von Hunderten von MHz. Jetzt werden Sie merkliche Reflexionen bekommen. Weil Sie technisch gesehen eine ... schlechte Übertragungsleitung haben, bei der nur eine Seite abgeschirmt ist.

Sie senden also einen kurzen Rechteckwellenimpuls und messen, wie lange es dauert, bis er aufgrund der Reflexion zurückkommt, weil sich Ihr Finger auf dem isolierten Draht befindet. Und dann misst du die Amplitude der reflektierten Spitze an der Unterseite der Gitarre. Also die Fahrzeit => Position des Fingers. Die Amplitude der Reflexion => wie stark Sie gedrückt haben.

Dies ist nicht die einfachste Einrichtung ... wenn Sie nicht wissen, was Sie tun. Auch dies könnte für OP zu viel Aufwand sein. Also wird diese Idee verworfen.


Es würde in etwa so aussehen:

Geben Sie hier die Bildbeschreibung ein

Als Wellenwiderstand habe ich 150 Ω angenommen, also eine sehr schlechte Übertragungsleitung. In Wirklichkeit könnte es schlimmer sein, ich weiß nicht, ich habe das noch nie gemacht.

Hier ist der Link , falls jemand herumspielen möchte.

Einer der schwierigsten Teile wird es sein, die Endpunkte an einen gewissen Widerstand anzupassen, dafür benötigen Sie möglicherweise ein Oszilloskop oder ein anderes teures Instrument.

Der andere schwierige Teil wird sein, die TOF (Time of Flight) tatsächlich zu messen, es gibt einige ICs da draußen, aber sie sind nicht billig Spannung ablesen.

Die Idee dabei ist, dass, wenn ein Finger in die Nähe des Drahtes kommt, Ihr Finger ein Teil des Stromkreises wird und als Kondensator fungiert. Je näher Ihr Finger ist, desto kapazitiver. Aus diesem Grund sinkt der Widerstand an der Fingerspitze.

https://en.wikipedia.org/wiki/Transmission_line scrollen Sie etwas nach unten und Sie werden sehen, dass der kapazitive Parameter ein Teil des Nenners ist.

Immer wenn ein Punkt auf dem Draht nicht übereinstimmt, kommt es zu einer Reflexion, die Sie am "Ausgang" ablesen können, von dem Ihr Signal stammt. Wenn es nirgendwo eine Reflexion gibt, wird Ihr Signal an einem der Endpunkte beendet.

Je stärker Sie nach unten drücken, desto mehr Fläche Ihres Fingers wird flach => mehr Kapazität aufgrund der Fläche. Außerdem wird jedes nichtleitende Material, das Sie zwischen dem Draht und Ihrem Finger haben, ganz leicht zusammengedrückt, um die Kapazität weiter zu erhöhen.

Dritte Idee:

Stecken Sie ein Theremin in die Gitarre und messen Sie Frequenz und Amplitude. Ich weiß nicht genau, was ein Theremin ausgeben wird, aber sicherlich kann etwas verwendet werden.

An diesem Punkt gehen mir die Ideen aus und ich sage, dass ich 20 Minuten verbracht habe. In Wirklichkeit habe ich vielleicht 10 ausgegeben. Na ja. Jetzt habe ich sicherlich weitere 10 Minuten damit verbracht, dies zu schreiben, also summiert sich alles.

Ich habe das Gefühl, dass das Debuggen beim Anschließen von 15 ICs an 3 Sätze von 80 Sensoren … erheblich sein könnte. Außerdem wird dieses Ding sicherlich nie robust genug sein, um verwendet zu werden, da Hunderte von Drähten von der Sensoranordnung hängen.
Ich denke, das ist eigentlich ziemlich machbar, und wenn es richtig gemacht wird, reduziert sich die Menge an Verkabelung, die sonst erforderlich wäre.
Ich frage mich, was diese anderen Lösungen sind. Möchtest du teilen?
@pandalion98 Hmmm... vielleicht war die zweite Idee doch gar nicht so schlecht. Nun ja.

Drei Ideen:

1. Führen Sie ein Multiplexing auf der Angebotsseite durch

Tatsächlich besteht die von Ihnen beschriebene Schaltung aus einer großen Anzahl variabler Widerstände, von denen jeder an einem Ende mit einer Versorgungsspannung verbunden ist. Sie wollen alle Widerstandswerte auslesen und die anderen bisherigen Antworten haben meistens Ansätze vorgeschlagen, das Signal auf der analogen Seite zu multiplexen.

Sie können dieses Multiplexing aber auch ganz oder teilweise auf der Versorgungsseite durchführen, indem Sie die Versorgungsschiene in n Abschnitte unterteilen. Verbinden Sie Sätze von n Sensorpads, die jeweils eine andere Versorgungsschiene haben. Schalten Sie nun jeweils nur eine Versorgungsschiene ein und verwenden Sie einen ADC-Eingang, um jeden Satz von Pads zu lesen. (So ​​funktioniert normalerweise die Schaltung, die eine Computertastatur liest, und die Art und Weise, wie die Schalter verdrahtet sind, wird oft als „Kreuzpunktschalter“ bezeichnet.) Letztendlich könnten Sie einfach einen einzelnen ADC verwenden, der mit allen „Schienen“ verbunden ist, und tun das gesamte Multiplexing durch Anschließen der Stromversorgung an jedes Pad der Reihe nach.

Der einzige Haken ist, dass alle anderen Pads von der Stromschiene isoliert und nicht mit Masse verbunden werden müssen, was der Fall wäre, wenn Sie nur einen digitalen Ausgang für jedes Pad verwenden würden. Es gibt mehrere Möglichkeiten, dies zu lösen, einschließlich der Verdrahtung jedes Pads über eine Diode, einen Bipolartransistor oder einen FET oder - ich weiß nicht, wie schnell dies in der Praxis möglich ist, aber es ist im Prinzip möglich - die Verwendung des Eingangs-Ausgangs-Pins von a Mikrocontroller und Einstellen entweder auf High-Ausgang oder auf Eingang, wenn er eine relativ hohe Impedanz haben sollte.

Die Genauigkeit der Messung Ihrer Sensoren mit dieser Technik ist möglicherweise nicht perfekt im Vergleich zur Verwendung einer einzelnen Festspannungsquelle und hochwertiger analoger Multiplexer, aber ich vermute, dass sie gut genug sein wird, zumal ich sicher bin, dass die Drucksensoren eine gewisse Toleranz haben werden ihren Widerstand - möglicherweise müssen Sie diesen ohnehin für jeden Sensor mit einer Referenzkraft kalibrieren.

2. Verwenden Sie einige Mikrocontroller mit vielen ADC-Eingängen

Beispielsweise hat der PICAXE 40X2 27 Pins, die als analoger Eingang verwendet werden können, sodass Sie Ihren Bedarf mit 9 davon abdecken könnten. Es ist in einer einfachen BASIC-Sprache programmiert und kann als i2c-Slave fungieren - Sie könnten also die 9 Chips mit einem weiteren Mikrocontroller auslesen - oder Sie könnten wahrscheinlich einfach die Ausgabe von jedem Chip als serielle Daten senden und in den Host-Computer einlesen über Seriell-zu-USB-Konverter. Ich kann nicht genau versprechen, wie schnell das gehen wird, aber ich denke, es sollte funktionieren, wenn Sie den PICAXE mit maximaler Geschwindigkeit takten (von 64 MHz, mit einem externen 16-MHz-Resonator). Wenn Sie mit der Mikrocontroller-Programmierung in C zufrieden sind, können Sie natürlich dasselbe mit dem PIC18F45K22 tun, auf dem der PICAXE basiert.

3. Verwenden Sie analoge Eingangseinheiten von der Stange

Schließlich, wenn es Ihnen nichts ausmacht, Geld auszugeben, um Zeit zu sparen, und Portabilität keine hohe Priorität hat – zum Beispiel, wenn es in Ordnung ist, wenn das Instrument mit dicken Kabeln an ein Geräterack angebunden wird – könnten Sie einfach genug kaufen High- analoge Eingangsgeräte mit Kanalzahl, um alle Sensoren gleichzeitig zu messen. Zum Beispiel liest das Measurement Computing USB-2633 64 analoge Eingänge für etwas mehr als 1.000 US-Dollar.

Es könnte sich lohnen, eine Brute-Force-Signalkonditionierung (möglicherweise passiv) in Betracht zu ziehen, gefolgt von kleineren ADCs oder MCU / ADC mit jeweils 16 oder mehr MUX-ADC-Eingängen. Das sind nur 40 Chips. Ein Beispiel für einen Chip, der funktionieren könnte, ist der ADS7961QDBTRQ1 , der einen Kanalmodus mit automatischer Inkrementierung und 16 Eingänge hat.

Die Gesamtdatenrate selbst bei einer Abtastrate von 4 kHz und 240 Bytes pro Abtastung beträgt etwa 1 MB/s, was nicht allzu beängstigend ist. Vielleicht eine Master-CPU mit einem 10-MHz- oder 20-MHz-SPI-Bus, der mit den Slaves kommuniziert. Verwenden Sie 2 SPI-Busse, wenn die Bandbreite nicht vorhanden ist. Der oben erwähnte Teil arbeitet mit 20 MHz, sodass ein einzelner SPI ausreicht.

Oder vielleicht können Sie einen einzelnen TI-Chip verwenden – den DDC2256AZZF , der über 64 Kanäle simultanes Sampling und 256 Eingänge verfügt … aber er ist nicht besonders günstig (ca Arbeiten Sie mit einem weißen Steckbrett.

Für eine Echtzeit-Human-Interface-Anwendung scheint eine Gesamtabtastrate von mehreren kHz hoch zu sein. 50 Hz sind wahrscheinlich genug ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Das bedeutet, dass Sie alle Sensoren in <20 ms abtasten müssen, also 80 us pro Sensor. Dies ist nicht allzu schwierig und kann im Grunde von allen normalen 8-Bit-Mikrocontrollern verwaltet werden (dh Atmega88 kann dies in <30us tun).

Sie können genauso gut alle Wechselwirkungen messen und dann die nicht benötigten einfach verwerfen, da es technologisch nicht schwierig ist, alle zu messen. Das Problem kommt vom Multiplexing. Ich bin bei Ihrem Beitrag etwas verwirrt, weil dort steht, dass die Sensoren 80 gleichzeitig mit Strom versorgt werden? Das Übliche ist, wie Sie sagen, Spalten und Zeilen zu multiplexen. Wenn Sie das nicht tun, müssen Sie sich mit >80 Drähten auseinandersetzen, die aus Ihrem Gerät kommen, was wirklich keine gute Idee ist. Sie müssen einen Weg finden, es in eine Matrix aufzuteilen, sodass Sie 30 Drähte erhalten (was immer noch viel ist). Sie könnten sie dann multiplexen usw., aber wenn ich Sie wäre, würde ich nur mehrere Mikrocontroller haben und sie an einen Master anschließen. Sie könnten einen dedizierten ADC anstelle der Slave-MCUs verwenden, aber ich persönlich würde bei den MCUs bleiben.

Sie haben richtig erkannt, dass die Kommunikation ein Problem sein könnte, aber das ist keine große Sache, zumindest zwischen den MCUs. Ein Atmega mit 8 MHz kann SPI mit 2 MHz ausführen, sodass das Senden aller Sensordaten <1 ms dauert. Die Frage ist dann, was Sie mit diesen Daten machen wollen, nachdem die Master-MCU sie hat.

Wenn Sie auf eine einzelne Eingabe reagieren, werden 50 Hz in allgemeinen GUI-Begriffen normalerweise als "ausreichend" angesehen, aber nach meiner eigenen Erfahrung mit Soundkarten ist das Abspielen von Musik mit einer Latenz von 200 ms überhaupt keine angenehme Erfahrung (denken Sie an Sprachstörung). Ich stelle mir vor, dass eine variable Latenz von 0-200 ms das Instrument praktisch unspielbar machen würde, da jedes Gefühl für Rhythmus sicherlich totgeschwiegen würde. Eine Abfragefrequenz von etwa einem kHz wäre ein guter Ausgangspunkt, denke ich.
@Dampmaskin 50 Hz = 20 ms, nicht 200 ms. 20 ms ist wahrscheinlich vernünftiger
Mein Fehler. 20 ms können wahrscheinlich brauchbar sein, wenn es sich um übereinstimmende 20 ms handelt, aber weniger Latenz ist immer besser. Später in der Signalkette wird es sowieso immer mehr Latenz geben.
@Dampmaskin das ist genau das Problem, das ich bei dem beschriebenen Ansatz sehe. Ich muss so viel Latenz wie möglich für die späteren Komponenten in der Kette "sparen", da ich versuche, einen Himbeer-Pi-Synthesizer anzuschließen, und idealerweise möchte ich unter 15-20 ms Gesamtlatenz bleiben. Nimmt der Controller bereits 20ms in Anspruch, ist kein Headroom mehr vorhanden.
@StevenLowes 20 ms sind für die meisten Musiker viel zu lang. Das ist bei einigen Geräuschen sogar außerhalb der Haas-Distanz. Ich persönlich komme mit mehr als 10ms Latenz nicht wirklich zurecht und kenne einen Pianisten, der 6ms Latenz einfach nicht aushält.

Ihre einfachste Methode besteht möglicherweise darin, das Ganze auf einer langen Flex-Schaltung mit einer Kette von 10 8-Bit-Open-Collector-Seriell-zu-Parallel-Registern aufzubauen, die über die Flex verteilt sind, um jede Spalte von Pads einzeln mit Strom zu versorgen.

Sie können diese verwenden, um jede Spalte in allen Zeilen gleichzeitig anzusteuern und die gemeinsamen Rückleitungen zu Ihrem ADC zu multiplexen. Die Rückleitungen würden entsprechende Pull-ups benötigen, damit Sie mit dem Knopfwiderstand eine Widerstandsteilerspannung erhalten.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Das steuernde Mikro würde dann ein einzelnes Nullbit die Registerkette hinuntersenden, sodass nur eine Spalte gleichzeitig mit Strom versorgt wird. Die verbleibenden Verbindungen würden erdfrei sein.

Der offensichtliche Weg, dies zu tun (da Sie nur eine einzige Berührung auf jeder Saite sehen müssen), besteht darin, die Bünde an einen Spannungsteiler anzuschließen und dann die Spannung an jeder Saite zu messen

das wird Ihnen sagen, wo Sie sich berühren.

Um Berührungsdruck zu erhalten, legen Sie einen Kondensator von Masse zu jedem Bund und messen Sie den Wechselstromwiderstand an jeder Saite.

Die Kehrseite dieses Ansatzes ist, dass die Saiten auf höhere Berührungen reagieren

Tut mir leid, wenn Sie es falsch verstanden haben, aber es gibt keinen echten Gitarrenhals und auch keine Saiten. Es ist nur ein Holzbrett mit einer Drucksensormatrix darauf, das den Spielstil nachahmt, den Sie auf einem echten Bundbrett anwenden würden. Danke für den Input, das könnte ich mir für zukünftige Projekte merken!
Mit Bünden und Saiten oben meine ich die Kupferstreifen, die Sie in Ihrer Frage erwähnen.
Ah, jetzt verstehe ich, was du meinst, sorry, das war schwer. Dieser Ansatz kann brechen, wenn Noten legato gespielt werden, da es dann zwangsläufig zu mehreren Berührungen auf derselben Saite kommt. aber nur das niedrigste zählt
Auch wenn mir Ihr Ansatz sehr gefällt, beantwortet dies nicht meine ursprüngliche Frage, wie man normalerweise mit einer großen Anzahl analoger Sensoren umgehen würde, die in Echtzeit verarbeitet werden müssen.
Kameras haben viele analoge Sensoren...

Wenn Sie einen Draht mit einem einigermaßen gleichmäßigen Widerstand pro Zoll haben, der für die Länge der Gitarre zwischen 100 Ohm und 100 K liegt, können Sie den Hals möglicherweise einfach aus einem mäßig leitfähigen Material mit einem Oberflächenwiderstand herstellen die mit Druck nachlässt, und messen Sie dann den Widerstand zwischen dem Hals und jedem Ende jeder Saite. Die Summe der Widerstände abzüglich des Widerstands einer Saite würde den doppelten Widerstand des Kontaktpunkts ergeben. Nach dem Subtrahieren des Kontaktpunktwiderstands von jedem gemessenen Widerstand würde das Verhältnis der verbleibenden Widerstände den Kontaktpunkt am Hals anzeigen.

Beachten Sie, dass dieser Ansatz in der Lage wäre, gleichzeitiges Drücken auf allen drei Saiten zu erkennen, aber nicht funktionieren würde, wenn eine Saite an mehreren Stellen gedrückt werden kann. Auf einer Gitarre würde ein solches Design die Verwendung von Barre-Akkorden ausschließen – eine ziemlich schwerwiegende Einschränkung –, aber andere Instrumente erfordern möglicherweise nicht das Berühren von Saiten an mehreren Stellen.

" Wenn Sie einen Draht bekommen können, der einen einigermaßen gleichmäßigen Widerstand pro Zoll hat, der irgendwo zwischen 100 Ohm und 100 K für die Länge der Gitarre liegt " - bezweifle ich, dass er / sie diese Art von Draht finden kann.
Ich bin nicht einverstanden; Ich habe in meinem Büro einen Widerstandsdraht mit 1717 Ohm / m, also sollte das überhaupt nicht schwer zu finden sein. Ich sage nicht, dass es einfach ist, damit zu arbeiten, da es sich um einen Ø50-µm-Draht handelt, aber es ist nicht schwer zu bekommen.
@MrGerber: Ich hatte vergessen, dass der Widerstand von Nichromdraht bei kälteren Temperaturen viel niedriger ist als bei wärmeren, und daher wäre es wahrscheinlich besser, die Schaltung so zu ändern, dass sie an etwas näher an 10 Ohm arbeitet, aber das Grundkonzept könnte bearbeitet werden. Alternativ könnte es auch funktionieren, wenn der Hals aus einem schwach leitfähigen Material besteht und die Saiten eine Verbindung dazu herstellen.
Dies ist nicht NiCr, sondern FeCrAl, und der Widerstand ändert sich nicht sehr stark über die Temperatur. Der Typ, den ich habe, ändert sich um ca. 8 % von 100 °C auf 1300 °C. Ref: Kanthal D (Und nein, ich mache keine E-Zigaretten.)
@MrGerber: Okay, das ist nicht schlecht. Als Antwort auf den früheren Kommentar hatte ich einige Tabellen nachgeschlagen und Widerstände gesehen, die mit der Temperatur um eine Größenordnung zunahmen.
@MrGerber Temperaturunabhängig?

Ich habe diesen Beitrag gesehen und dachte, es könnte mit einem einzigen Chip möglich sein. Ich würde Ihnen empfehlen, eine Art Mikrocontroller-Board zu nehmen, wie das billige Bluepill-Board. Es verfügt über einen ARM M3 mit 10 ADC-Kanälen zur freien Verwendung. Wenn Sie die Spalten in 3 Clustern mit 3 Strings platzieren, verbinden Sie diese mit 9 freien ADC-Kanälen. Verwenden Sie die anderen 21 Stifte, um die Stiftreihen umzuschalten, für insgesamt 63 „Bünde“.Verbindungsmatrix, Widerstände sind die Velostat-Zellen, das GPIO fährt mit 3,3 V oder befindet sich im Eingangsmodus, die ADC-Pins messen den Spannungsabfall über der Velostat-ZelleDer Mikrocontroller verfügt über zwei 12-Bit-ADCs mit 1 Msps, die mit Phasenverzögerung verwendet werden können, um 2 Msps zu unterstützen, was ausreichen sollte, um niemals einen Hammer zu verpassen oder eine Modulation zu bemerken. Ich denke, Sie können die USB-Verbindung verwenden und das Ding wie einen USB-Midi-Controller funktionieren lassen. Sie könnten einen größeren Mikrocontroller für mehr Eingaben verwenden, aber ich sehe nicht, wie Sie den Bundabstand mit mehr als 30 Bünden verwalten werden, oder wird es eher wie ein Touchscreen sein?

Ich weiß nicht genau, wie diese Velostat-Platten funktionieren, aber können Sie nicht wie kleine Endpunkte auf der Unterseite einer größeren Platte platzieren und die Position und den Druck des Fingers an mehreren Punkten mit der Spannung korrelieren? Dann können Sie wahrscheinlich mit viel weniger Sensibilität davonkommen und Dinge wie Bends und Vibrato unterstützen.