Lesen einer Vielzahl von analogen Sensoren in Echtzeit

17

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 Strings.

Das funktioniert folgendermaßen: Es gibt 3 lange Streifen aus doppelseitigem Kupferband (0,5 cm breit, so lang wie der Hals), die an die Stromversorgung angeschlossen sind (3,3 V oder 5 V, wahrscheinlich, spielt für den Moment keine Rolle). Auf diesen Streifen befindet sich eine Velostatschicht, die den spezifischen Widerstand abhängig vom Druck ändert. Auf dem Velostat befindet sich eine weitere Schicht aus Reihen oder Zellen aus Kupferband, die mit etwas verbunden ist, das einen Spannungswert über die Velostatschicht ausgibt. Da der Hals ca. 40 cm lang ist, gibt es mindestens 80 Reihen.

Wenn Sie sich die unteren 3 Kupferstreifen als Spalten eines Diagramms entlang des Halses vorstellen, sind die Sensoren je nach Messmethode entweder Zellen oder Zeilen (ich dachte, man könnte die Spalten dann auch multiplexen) es könnte Reihen geben.) Es gibt jedoch einige spezielle Bedingungen, die dies erleichtern könnten: Da es sich um einen gitarrenähnlichen Controller handelt, muss nicht jede Interaktion gemessen werden! Es kommt nur auf die Berührung an, die dem Körper des Controllers am nächsten liegt. Auch eine Auflösung von 8 Bit sollte genau genug sein. 255 Druckstufen sind wahrscheinlich mehr als nötig.

Nun die schwierigen Teile:

Die Messung muss Echtzeit-Y-genug sein, um Hammer-Ons usw. zu erkennen (keine Ahnung, wie hoch die Abtastrate sein muss - geschätzt auf mehrere kHz für eine gute Messung und Abspielbarkeit), und der digitale Ausgang des Controllers sollte auch so 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 mir nicht die richtigen Werkzeuge für den Job vorstellen. Was ich jedoch weiß, ist: Es ist möglich. Es gibt einen ähnlichen, aber unterschiedlichen Controller, der eine sehr ähnliche Technik verwendet (die ich praktisch rückgängig gemacht 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). Man nennt ihn ROLI Küste.

TL; DR:

  • ungefähr 240 Sensoren

  • kann in 80er Gruppen aufgeteilt werden, die über dieselbe Leitung mit Strom versorgt werden

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

Vielen Dank im Voraus, ich weiß, dass es viel zu lesen gibt. Ich bin dankbar für jeden Vorschlag und würde mich sehr freuen, wenn Sie mir dabei helfen könnten, das schreckliche Durcheinander zu schaffen, das ich anrichten wollte!

Dinge, an die ich bisher gedacht habe:

Multiplexen von Zeilen und Spalten, Lesen jeder Zelle mit einem MCP3008 oder einem größeren ADC und Verketten von (verketteten oder baumartigen) AT-Megas, die nur die positionsmäßig niedrigste Wechselwirkung zum endgültigen Signal führen, aber nach meinen Berechnungen, die möglicherweise durch einen Engpass verursacht werden könnten der Kommunikationsaufwand. Ein früheres Modell enthielt auch Farbbandpotentiometer, die ich verworfen habe, weil das Design schlecht war (mehrere Versuche waren nicht cool genug).

EDIT / UPDATE:

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

Ich habe eine Matrix von 80 Zeilen * 3 Spalten mit Drucksensoren. Wenn ein Mensch mit der Sensormatrix interagiert, nehmen mehrere Sensoren in der Nähe die Berührung auf, jedoch nur entlang einer Säule. 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 benötigt also weniger als eine Millisekunde. Die endgültige Ausgabe pro Spalte muss sein: 4 Byte für ein float32 und 1 Byte für ein uint8. Der float32 zeigt die gemittelte Position der ersten Interaktion entlang der Spalte an. Eine Interaktion ist definiert als eine aufeinanderfolgende Ansammlung von Sensoren mit einem Druck über einer bestimmten Schwelle. Hier kommt die Verarbeitung ins Spiel: Die Spalte wird nach unten durchlaufen, bis ein Messwert einen Schwellenwert überschreitet. Dies gilt dann als Beginn einer Interaktion. Der Druck und die Position jedes Sensors werden bis zum ersten Sensor gespeichert, der mit maximal (wahrscheinlich) 4 aufeinanderfolgenden Sensoren die Schwelle unterschreitet. Von allen Sensoren der aufgezeichneten Interaktion werden nur zwei Sensoren verarbeitet - der mit dem höchsten Druck (niedrigster Widerstand) und der mit dem höchsten direkt darüber oder darunter. Die Gleitkommaposition wird berechnet, indem die beiden Sensorpositionen gemittelt werden, gewichtet durch ihre Drücke. Der Gesamtdruck der Wechselwirkung ist nur die Addition beider Drücke zwischen 0 und 255 (beide Drücke der Einheit 8 zu einer Einheit 16 addieren und ohne Rundung durch 2 teilen, die nicht benötigten Bits verwerfen - dies sollte schnell sein). Dies muss für jede Spalte geschehen. Das Ergebnis der Größe von 15 Bytes wird dann über SPI an einen kleinen Computer (Raspberry Pi B3) gesendet, der als Synthesizer fungiert. Ich bin nicht auf die Übertragungsart eingestellt. Wenn SPI nicht das richtige Werkzeug für den Job ist, bin ich bereit, jede Kommunikationsmethode zu wählen, die ein Raspberry Pi beherrscht. Da es sich um eine musikalisch-interaktive Anwendung handelt, ist die Latenz von entscheidender Bedeutung.

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ürdest du empfehlen? Gibt es nicht offensichtliche Vorbehalte, vor denen ich mich hüten muss?

Der Ansatz, den ich aus den bisherigen Antworten ableitete, 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 waren. Ich mache mir Sorgen, dass dies möglicherweise nicht der einfachste / billigste Ansatz ist oder nicht schnell genug, um eine Rate von> 1 kHz zu erreichen.

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

d.oelert
quelle
nur eine Idee ... es kann eine Geschwindigkeitsverbesserung geben, wenn die Multiplexer verschachtelt sind ... mux0 scannt den Bund 0,8,16,24, etc ... mux1 - 1,9,17,25 ... bis mux7 (oder höher) ... auf diese Weise werden zuerst 8 Bünde gleichzeitig von 8 Muxen gelesen ... dann die nächsten 8 Bünde ... usw.
jsotola
2
Der Begriff "Echtzeit" ist möglicherweise nicht genau der richtige. Dies bedeutet, dass die Daten das System mit der gleichen Rate verlassen, mit der sie eingehen (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
Was ist der Unterschied im Widerstand zwischen gedrückt und nicht gedrückt?
Trevor_G
zwischen 10 und 1000 Ohm (ungefähr)
d.oelert
Die Anforderungen sind irgendwie mit der vorgeschlagenen Implementierung verwechselt. Möglicherweise haben Sie diese Fragen bereits beantwortet. Kann der Darsteller ein Dia ausführen, sodass das Instrument in der Lage sein muss, einen Positionsbereich zwischen benachbarten Bünden zu erkennen? Müssen Sie in der Lage sein, ein fretless Instrument zu stützen, oder können die Bünde ein Teil der Lösung sein?
Wayne Conrad

Antworten:

7

Abhängig von Ihrer Preisspanne können Sie ein FPGA zwischen Ihrem Raspberry Pi und den ADCs verwenden , z. B. das DE0-Nano-Board , das als FPGA-Einführungs- Entwicklungsboard eine gute Unterstützung bietet. Diese Lösung bietet den Vorteil, dass Sie Code schreiben können, mit dem mehrere / viele ADCs gleichzeitig getaktet werden, und Ihre Daten so formatieren können, dass sie für den Raspberry Pi sichtbar sind.

Sie haben erwähnt, dass Sie über den MCP3008 nachdenken. Dieser Chip ist SPI, so dass Sie einige Geräte mit verschiedenen CS-Pins am selben Bus miteinander verbinden können. Angenommen, Sie haben drei Chips an einen Bus angeschlossen, sodass Sie 24 ADC-Kanäle pro 6 Pins (drei Datenleitungen und drei CS-Leitungen) erhalten. Dies bedeutet 240 Kanäle für 60 Pins, was innerhalb der Möglichkeiten des FPGAs 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 bis dauern Lesen Sie alle 240 Sensoren, entsprechend einer Abtastrate von 5,56 kHz.

Billy Kalfus
quelle
klingt nach einem unglaublich coolen Ansatz! Ich werde das auf jeden Fall untersuchen. Ich habe keine Erfahrung mit FPGAs obwohl, so dass dies zu viel für mich sein könnte Griff ... auf der anderen Seite habe ich immer nach einer Ausrede gesucht , in FPGAs zu bekommen ...
d.oelert
Sie können einen ARM-Chip mit mehreren SPI-Leitungen verwenden. Auf diese Weise vermeiden Sie die FPGA-Kosten und verdreifachen die Abtastrate (wenn Sie 3 SPI-Controller haben). Beachten Sie, dass Sie die Verzögerung aufgrund der internen Verarbeitung (Verschieben von Messwerten in der MCU an einen Ort, an den der Pi gelangen kann) und der Kommunikation zwischen MCU und Pi verwalten müssen.
Ronan Paixão
Übrigens hat der PI auch einen SPI-Controller.
Ronan Paixão
Die Idee hinter dem FPGA ist, dass Sie beispielsweise 10 separate SPI-Controller (unter Verwendung der Nummer aus dem Beispiel, das ich bereitgestellt habe) herstellen 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.
Billy Kalfus
Wenn Sie einen FPGA oder CPLD mit ungepufferten Eingängen finden, können Sie möglicherweise sogar einen 80: 1-Analog-MUX erstellen. Es ist ein langer Schuss, aber es könnte funktionieren.
Caleb Reister
10

Die offensichtliche Antwort ist Muxing. Dies bedeutet, dass Sie den elektrischen Pfad dynamisch erstellen. Durchlaufen Sie also einfach die gesamte Matrix nacheinander oder so viele ADC-Eingänge (Analog-Digital-Wandler), wie Sie haben.

Wenn Sie 3 ADCs haben, können Sie jeweils eine Zeile lesen, dann ändern Sie die Eingänge in Mux und Voilla, Sie lesen jetzt die zweite Zeile und fahren dann fort. Das Problem bei diesem Setup ist, dass Sie 80 Zeilen haben und mir kein 80: 1-Mux (achtzig Eingänge zu einem Eingang) bekannt ist. Es gibt jedoch 16: 1-Multiplexer , die Sie zusammenstellen können, um 16 * 5 = 80 Eingänge zu erhalten.

Es würde ungefähr 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-Multiplexer können miteinander verbunden 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

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

Multiplizieren Sie dies mit 3, da Sie möglicherweise jeweils eine Zeile lesen möchten.

Dies bedeutet, dass Sie 18 ICs und 7 Steuersignale haben. Sie können die Anzahl der ICs verringern, wenn Sie die Anzahl der Analogeingänge erhöhen möchten. 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-Multiplexern. Dann könnten Sie es mit einem 16: 1-Multiplexer oder einem 16: 8-Multiplexer kaskadieren. Am Ende wären es 16 ICs, wenn Sie sie mit 16: 1-Multiplexern "optimieren" würden. Aber das würde bedeuten, dass Ihre Softwarelösung nicht so ... elegant wie oben ist, sondern kreuz und quer, mit Modulen und anderem Material, aber hey, Sie sparen 2 ICs.

10.8ms=1,25kHz

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

Lösen wir das auf eine andere ... platz- und kosteneffizientere Weise.

* 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 ja, 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 will Position und Druck messen. Das sind zwei Parameter. Dies 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 gesamte Lösung für eine 3-Säulen-Gitarre.

Erste Idee:

Verwenden Sie zwei parallele Drähte (niedriger Widerstand), die vom unteren Ende der Gitarre zum Hals der Gitarre führen. Verbinden Sie die Masse mit einem der Kabel unten an der Gitarre. Machen Sie ein LR-Messsystem und messen Sie die Induktivität und den Widerstand des anderen Kabels, ebenfalls unten.

Wenn Sie beide Drähte mit einem Finger berühren, verbinden Sie die beiden Drähte, und hier tritt eine gewisse Induktivität auf. Je höher die Gitarre, die Sie berühren, desto länger wird der Stromkreis und desto mehr Induktivität werden Sie messen. Je stärker Sie drücken, desto größer ist die Oberfläche 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 jede Person kalibrieren, da jeder Mensch einen unterschiedlichen Widerstand in seiner Haut hat. Wann immer Sie spielen, schwitzen Sie und reduzieren dadurch den Widerstand weiter, sodass Sie dies ausgleichen müssen. Jeder schwitzt unterschiedlich stark, 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 zu messenden Werte ist in nano Ω und nano H angegeben. Dies bedeutet, dass Sie über die richtigen Kenntnisse in Bezug auf CMRR und SNR verfügen müssen. Andernfalls wird nur die Netzspannung angezeigt, sofern dies in Innenräumen erfolgt. Oder andere Frequenzen von WLAN oder Lampen oder andere Geräuschquellen. Also wird vielleicht ein richtiger digitaler Filter benötigt. Und ... es liegt wahrscheinlich bereits außerhalb des Rahmens der Möglichkeiten von OP und der akzeptablen mentalen Anstrengung. Also wird diese Idee weggeworfen.

Zweite Idee:

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

Verwenden Sie einen Draht oder ein leitendes Band oder nur einen Flachleiter. Legen Sie eine nichtleitende Farbe oder ein normales nichtleitendes Klebeband darüber.

Ziehen Sie es von unten bis zum Hals der Gitarre über die 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 du technisch gesehen eine .... schlechte Übertragungsleitung hast, bei der nur eine Seite abgeschirmt ist.

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

Dies ist nicht die einfachste Sache, wenn Sie nicht wissen, was Sie tun. Auch dies ist möglicherweise zu aufwändig, als dass das OP dies in Angriff nehmen könnte. Also wird diese Idee weggeworfen.


Es würde ungefähr so ​​aussehen:

Bildbeschreibung hier eingeben

Ich habe die charakteristische Impedanz als 150 Ω angenommen, mit anderen Worten, eine sehr schlechte Übertragungsleitung. In Wirklichkeit könnte es schlimmer sein, ich weiß nicht, dass ich das noch nie gemacht habe.

Hier ist der Link für den Fall, dass jemand herumspielen möchte.

Am schwierigsten ist es, die Endpunkte auf einen bestimmten Widerstand abzustimmen. Dazu benötigen Sie möglicherweise ein Oszilloskop oder ein anderes teures Instrument.

Das andere schwierige Teil wird sein, die TOF (Flugzeit) tatsächlich zu messen, es gibt einige ICs da draußen, aber sie sind nicht billig. Aber Sie können immer nur eine konstante Stromquelle herstellen und einen kleinen Kondensator auffüllen und dann einfach Lesen Sie die Spannung ab.

Die Idee dabei ist, dass, wenn sich ein Finger dem Draht nähert, Ihr Finger Teil des Stromkreises wird und als Kondensator fungiert. Je näher Ihr Finger ist, desto kapazitiver. Dies ist der Grund, warum der Widerstand am Fingerpunkt abnimmt.

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.

Wann immer ein Punkt auf dem Draht nicht übereinstimmt, gibt es eine Reflexion, und Sie können diese an dem "Ausgang" ablesen, 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 flacher wird Ihr Fingerbereich => mehr Kapazität aufgrund der Fläche. Außerdem wird das zwischen Draht und Finger befindliche nichtleitende Material leicht zusammengedrückt, um die Kapazität weiter zu erhöhen.

Dritte Idee:

Stecke ein Theremin in die Gitarre und messe Frequenz und Amplitude. Ich weiß nicht genau, was ein Theremin ausgeben wird, aber sicher kann etwas verwendet werden.

An diesem Punkt gehen mir die Ideen aus und ich sage, dass ich 20 Minuten verbracht habe. In der Realität habe ich vielleicht 10 verbracht. Na ja. Jetzt habe ich sicher noch 10 Minuten damit verbracht, das zu schreiben, also summiert sich alles.

Harry Svensson
quelle
1
Ich bin der Meinung, dass das Debuggen beim Anschließen von 15 ICs an 3 Sätze mit je 80 Sensoren von Bedeutung sein könnte. Aufgrund der Hunderte von Drähten, die an der Sensoranordnung hängen, wird dieses Gerät mit Sicherheit niemals robust genug sein, um verwendet zu werden.
BeB00
Ich denke, das ist eigentlich ziemlich machbar, und wenn es richtig gemacht wird, reduziert sich der Verdrahtungsaufwand, der sonst erforderlich wäre.
pjc50
Ich frage mich, was diese anderen Lösungen sind. Möchtest du teilen?
PNDA
1
@ pandalion98 Hmmm ... vielleicht war die zweite Idee doch keine so schlechte Idee. Naja.
Harry Svensson
6

Drei Ideen:

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

Tatsächlich ist die von Ihnen beschriebene Schaltung eine große Anzahl variabler Widerstände, deren eines Ende einer Versorgungsspannung gemeinsam ist. Sie möchten alle Widerstandswerte auslesen und die anderen Antworten haben bisher meist Lösungsansätze zum Multiplexen des Signals auf der analogen Seite vorgeschlagen.

Sie können dieses Multiplexing aber auch ganz oder teilweise auf der Angebotsseite durchführen , indem Sie die Versorgungsschiene in n Abschnitte aufteilen. Verbinden Sie Sätze von n Sensor-Pads, die jeweils eine andere Versorgungsschiene haben. Schalten Sie jetzt jeweils nur eine Versorgungsschiene ein und verwenden Sie einen ADC-Eingang, um jeden Pad-Satz zu lesen. (So ​​funktioniert normalerweise die Schaltung, die eine Computertastatur liest, und die Art und Weise, wie die Schalter verkabelt sind, wird häufig als "Crosspoint-Schalter" bezeichnet.) Letztendlich könnten Sie nur einen einzigen ADC verwenden, der an alle "Schienen" angeschlossen ist, und dies tun das ganze Multiplexen durch Anschließen der Stromversorgung an jedes Pad nacheinander.

Der einzige Haken ist, dass alle anderen Pads von der Stromschiene isoliert und nicht mit Masse verbunden sein müssen, was der Fall wäre, wenn Sie nur für jeden einen digitalen Ausgang verwenden würden. Es gibt verschiedene 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 - über den Eingangs- / Ausgangs-Pin von a Mikrocontroller ein und stellen Sie ihn entweder als High-Ausgang oder als Eingang ein, wenn er eine relativ hohe Impedanz haben soll.

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 dies gut genug sein wird, zumal ich mir sicher bin, dass die Drucksensoren eine gewisse Toleranz aufweisen werden ihr Widerstand - möglicherweise müssen Sie diesen für jeden Sensor mit einer Referenzkraft kalibrieren.

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

Zum Beispiel verfügt die PICAXE 40X2 über 27 Pins, die als Analogeingänge verwendet werden können, sodass Sie Ihren Bedarf mit 9 davon decken können. 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 die Ausgabe von jedem Chip einfach als serielle Daten senden und zum Host-Computer einlesen über Seriell-zu-USB-Konverter. Ich kann nicht genau sagen, wie schnell das gehen wird, aber ich denke, es sollte funktionieren, wenn Sie die 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 dies natürlich auch mit dem PIC18F45K22 tun, auf dem die PICAXE basiert.

3. Verwenden Sie handelsübliche Analogeingabegeräte

Wenn es Ihnen nichts ausmacht, Geld auszugeben, um Zeit zu sparen, und Portabilität keine hohe Priorität hat - wenn beispielsweise das Instrument mit einigen dicken Kabeln an einem Gerätegestell befestigt werden kann -, können Sie einfach genug High-End-Geräte kaufen. Analoge Eingabegeräte mit Kanalanzahl zum gleichzeitigen Messen aller Sensoren. Zum Beispiel liest der Measurement Computing USB-2633 64 analoge Eingänge für etwas mehr als US $ 1k.

nekomatisch
quelle
4

Es könnte sich lohnen, eine Brute-Force-Signalaufbereitung (möglicherweise passiv) zu erwägen, 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 möglicherweise funktioniert, ist der ADS7961QDBTRQ1 , der über einen Kanalmodus mit automatischer Inkrementierung und 16 Eingängen verfügt.

Die Gesamtdatenrate selbst bei einer Abtastrate von 4 kHz und 240 Byte pro Abtastung beträgt etwa 1 MB / s, was nicht allzu beängstigend ist. Möglicherweise 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, so dass ein einzelner SPI ausreicht.

Oder Sie können einen einzelnen TI- Chip verwenden - den DDC2256AZZF mit 64-Kanal-Simultanabtastung und 256 Eingängen. Er ist jedoch nicht besonders günstig (ca. 350 USD) und wird in einem 14 x 14 mm großen 323-poligen LFBA-Array geliefert, sodass dies nicht der Fall ist Arbeit mit einem weißen Steckbrett Steckbrett.

Spehro Pefhany
quelle
3

Für eine Echtzeit-Benutzeroberflächenanwendung 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 ). Dies 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).

Sie können auch alle Interaktionen messen und die nicht benötigten einfach verwerfen, da das Messen aller Interaktionen technisch nicht schwierig ist. Das Problem kommt vom Multiplexing. Ich bin ein bisschen verwirrt über Ihren Beitrag, weil dort steht, dass die Sensoren jeweils 80 Mal mit Strom versorgt werden. Das Übliche ist, wie Sie sagen, Spalten und Zeilen zu multiplexen. Wenn Sie das nicht tun, müssen Sie mit mehr als 80 Kabeln aus Ihrem Gerät fertig werden, was wirklich keine gute Idee ist. Sie müssen einen Weg finden, um es in eine Matrix aufzuteilen, so dass Sie 30 Drähte erhalten (was immer noch viel ist). Sie könnten sie dann usw. multiplexen, aber wenn ich Sie wäre, hätte ich einfach mehrere Mikrocontroller und sie könnten an einen Master angeschlossen werden. Sie könnten einen dedizierten ADC anstelle der Slave-MCUs verwenden, aber ich persönlich würde mich an die MCUs halten.

Sie haben richtig erkannt, dass die Kommunikation möglicherweise ein Problem darstellt, aber dies ist zumindest zwischen den MCUs keine große Sache. 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 möchten, nachdem die Master-MCU sie hat.

BeB00
quelle
2
Wenn auf einen einzelnen Eingang reagiert wird, werden 50 Hz im Allgemeinen als "ausreichend" angesehen. Nach meinen Erfahrungen mit Soundkarten ist das Abspielen von Musik mit einer Latenz von 200 ms jedoch überhaupt kein angenehmes Erlebnis (denken Sie an Sprachstörungen). Ich stelle mir vor, dass eine variable Latenz von 0-200 ms das Instrument praktisch unspielbar machen würde, da jeder Sinn für Rhythmus mit Sicherheit tot wäre. Eine Abfragefrequenz von ungefähr einem kHz wäre ein gutes Startpunktminimum, denke ich.
Dampmaskin
1
@Dampmaskin 50 Hz = 20 ms, nicht 200 ms. 20ms ist wahrscheinlich vernünftiger
Steven Waterman
1
Mein Fehler. 20 ms können wahrscheinlich verwendet werden, wenn es sich um eine konsistente Zeit von 20 ms handelt, aber eine geringere Latenz ist immer besser. Später in der Signalkette wird es sowieso immer mehr Latenz geben.
Dampmaskin
@Dampmaskin das ist genau das Problem, das ich mit 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-synth anzuschließen und idealerweise unter 15-20 ms der gesamten latenz bleiben möchte. Wenn der Controller bereits 20 ms benötigt, ist kein Headroom mehr vorhanden.
d.oelert
@StevenLowes 20ms ist den meisten Musikern viel zu lang. Das ist für einige Geräusche sogar außerhalb der Haas-Distanz. Persönlich kann ich nicht mehr als 10 ms Latenz verarbeiten und ich kenne einen Pianisten, der eine Latenz von 6 ms einfach nicht einhalten kann.
Todd Wilcox
3

Ihre einfachste Methode könnte darin bestehen, das Ganze auf einer langen Flex-Schaltung mit einer Kette von 10 seriellen bis parallelen 8-Bit-Open-Collector-Registern aufzubauen, die über den Flex verteilt sind, um jede Pad-Spalte 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 müssten entsprechend hochgezogen werden, damit Sie eine Widerstandsteilerspannung mit dem Tastenwiderstand erhalten.

schematisch

simulieren Sie diese Schaltung - Schaltplan erstellt mit CircuitLab

Das steuernde Mikro würde dann ein einzelnes Null-Bit durch die Kette von Registern senden, so dass jeweils nur eine Spalte mit Strom versorgt wird. Die verbleibenden Verbindungen würden schweben.

Trevor_G
quelle
1

Der naheliegende 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 auf jeder Saite zu messen

Das zeigt Ihnen, wo Sie sich befinden.

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

Der Nachteil dieses Ansatzes ist, dass die Saiten auf höhere Berührungen reagieren

Jasen
quelle
2
Es tut mir leid, wenn Sie falsch verstanden haben, aber es gibt keinen wirklichen Gitarrenhals und auch keine Saiten. Es ist nur ein Holzbrett mit einer Drucksensormatrix oben, die den Spielstil emuliert, den Sie auf einem echten Griffbrett anwenden würden. Vielen Dank für den Input, ich werde das vielleicht für zukünftige Projekte berücksichtigen!
d.oelert
Mit Bünden und Streichern meine ich die Kupferstreifen, die Sie in Ihrer Frage erwähnt haben.
Jasen
ah ich verstehe was du jetzt meinst, sorry das war dicht Dieser Ansatz kann beim Spielen von Legato-Noten zum Erliegen kommen, da dann zwangsläufig mehrere Anschläge auf derselben Saite erfolgen. Nur das Niedrigste zählt
d.oelert
Auch wenn ich Ihren Ansatz wirklich mag, beantwortet dies nicht meine ursprüngliche Frage, wie man normalerweise mit einer großen Anzahl von analogen Sensoren umgeht, die in Echtzeit verarbeitet werden müssen.
d.oelert
Kameras haben eine große Anzahl von analogen Sensoren ...
Jasen
0

Wenn Sie einen Draht mit einem einigermaßen gleichmäßigen Widerstand pro Zoll erhalten, der zwischen 100 Ohm und 100 K für die Länge der Gitarre liegt, können Sie den Hals möglicherweise einfach aus einem Material herstellen, das mäßig leitfähig ist und einen Oberflächenwiderstand aufweist Das lässt mit dem Druck nach und misst dann den Widerstand zwischen dem Hals und jedem Ende jeder Saite. Die Summe der Widerstände abzüglich des Widerstandes einer Saite würde den doppelten Widerstand des Kontaktpunktes anzeigen. Nach Abzug 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 das gleichzeitige Drücken aller drei Saiten erkennen kann, jedoch nicht funktioniert, wenn eine Saite an mehreren Stellen gedrückt wird. Bei einer Gitarre würde ein solches Design die Verwendung von Barre-Akkorden ausschließen - eine ziemlich strenge Einschränkung -, aber bei anderen Instrumenten ist es möglicherweise nicht erforderlich, Saiten an mehreren Stellen zu berühren.

Superkatze
quelle
" Wenn Sie einen Draht mit einem einigermaßen gleichmäßigen Widerstand pro Zoll bekommen, der zwischen 100 Ohm und 100 K für die Länge der Gitarre liegt " - ich bezweifle, dass er diese Art von Draht finden kann.
Harry Svensson
Ich stimme dir nicht zu; Ich habe in meinem Büro einen Widerstandsdraht mit 1717 Ohm / m, so dass es nicht schwer sein sollte, ihn überhaupt zu finden. Ich sage nicht, dass es einfach ist, damit zu arbeiten, da es sich um einen Draht mit einem Durchmesser von 50 µm handelt, aber es ist nicht schwer, ihn zu erwerben.
MrGerber
@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 funktionieren. Alternativ könnte es auch funktionieren, wenn der Hals ein schwach leitfähiges Material ist und die Saiten eine Verbindung herstellen.
Superkatze
Dies ist nicht NiCr, sondern FeCrAl, und der Widerstand ändert sich nicht sehr stark mit der 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-Cigs.)
MrGerber
@ MrGerber: Okay, das ist nicht schlecht. Als Antwort auf den früheren Kommentar habe ich einige Tabellen nachgeschlagen und Widerstände festgestellt, die mit der Temperatur um eine Größenordnung zunahmen.
Superkatze
0

Ich habe diesen Beitrag gesehen und dachte, es könnte mit einem einzigen Chip möglich sein. Ich würde sagen, Sie nehmen eine Art Mikrocontroller-Board, wie das billige Bluepill-Board. Es verfügt über einen ARM M3 mit 10 frei nutzbaren ADC-Kanälen. Wenn Sie die Spalten in 3 Gruppen von 3 Zeichenfolgen einfügen, verbinden Sie diese mit 9 freien ADC-Kanälen. Verwenden Sie die anderen 21 Stifte, um die Stiftreihen umzuschalten, sodass insgesamt 63 "Bünde" entstehen. Anschlussmatrix, Widerstände sind die Velostatzellen, der GPIO treibt mit 3,3 V oder ist im Eingangsmodus, die ADC-Pins messen den Spannungsabfall über der Velostatzelle Der Mikrocontroller verfügt über zwei 12-Bit-ADCs mit 1 Msps, die mit Phasenverzögerung zur Unterstützung von 2 Msps verwendet werden können. Dies sollte ausreichen, um niemals einen Hammer zu verpassen oder eine Modulation zu bemerken. Ich denke, Sie können den USB-Anschluss verwenden und das Ding wie einen USB-Midi-Controller arbeiten lassen. Sie könnten einen größeren Mikrocontroller für mehr Eingaben verwenden, aber ich verstehe nicht, wie Sie den "Bund" -Abstand mit mehr als 30 Bünden verwalten werden, oder wird er eher einem Touchscreen ähneln?

Ich weiß nicht genau, wie diese Velostat-Folien funktionieren, aber können Sie nicht wie kleine Endpunkte auf die Unterseite einer größeren Folie setzen und die Position und den Druck des Fingers an mehreren Punkten mit der Spannung in Beziehung setzen? Dann können Sie wahrscheinlich viel weniger sensibel davonkommen und Dinge wie Bend und Vibrato unterstützen.

Sap Chicken
quelle