Forum: Mikrocontroller und Digitale Elektronik Arduino MIDI Controller mit 128 Analog-Eingängen


von Heiko K. (heiko_k)


Lesenswert?

Hallo!

Kurz vorweg, bin Noob, habe mir gerade einen Arduino Mega gekauft, und 
plane, damit einen MIDI-Controller für Erwachsene zu bauen, er soll 
unter anderem 128 Drehregler bekommen.

Dafür brauche ich 8 Stück 4067 16-Kanal-Multiplexer. Nun könnte ich die 
4 Digitaleingänge pro Multiplexer direkt an die Digitalausgänge des 
Arduino hängen, dadurch würde ich aber 32 Ausgänge verbraten - also 
dachte ich, es muß doch möglich sein, die Multiplexer so zu verschalten, 
daß ich stattdessen nur 7 Ausgänge brauche.

Ich dachte an so etwas: Die 4 Eingänge jedes 4067 auf die ersten 4 
Ausgänge des Arduino. Die nächsten 3 Ausgänge auf die 3 Eingänge eines 
4051 8-Kanal-Multiplexers. An dessen Common-In 5V. Dessen Ausgänge 
jeweils über ein 7404 NOT-Gate an die Inhibit-Eingänge der 4067er.

Fragen:

1.) Kann das so funktionieren?
2.) Wenn nein, warum nicht?
3.) Geht's einfacher?

Nehme begeistert jeglichen Tip, Rat oder Schelte entgegen. Danke im 
Voraus!

von The D. (thedaz)


Lesenswert?

Ich würde eher einen 74138 zur Generierung der 8 enable Signale für die 
Multiplexer benutzen. Das erfordert 3 Portbits vom Arduino.

von tommy_v (Gast)


Lesenswert?

Alle A,B,C,D der 4067 parallel schalten und den entspr. 4067
per Inhibit auswählen = 12 Leitungen

von Heiko K. (heiko_k)


Lesenswert?

Jap, das ist beides schöner. Danke!

von Eric B. (beric)


Lesenswert?

Heiko K. schrieb:
> Kurz vorweg, bin Noob, habe mir gerade einen Arduino Mega gekauft, und
> plane, damit einen MIDI-Controller für Erwachsene zu bauen, er soll
> unter anderem 128 Drehregler bekommen.

Hast du dir schon gedanken gemacht, wie die Daten der 128 Controllern in 
das MIDI Protokoll passen sollen?

EDIT: NPRN bietet sich an, erfordert aber mindestens 3 MIDI Nachrichten 
pro Wertänderung pro Drehregler...

: Bearbeitet durch User
von The D. (thedaz)


Lesenswert?

Eric B. schrieb:
> Heiko K. schrieb:
>> Kurz vorweg, bin Noob, habe mir gerade einen Arduino Mega gekauft, und
>> plane, damit einen MIDI-Controller für Erwachsene zu bauen, er soll
>> unter anderem 128 Drehregler bekommen.
>
> Hast du dir schon gedanken gemacht, wie die Daten der 128 Controllern in
> das MIDI Protokoll passen sollen?
>
> EDIT: NPRN bietet sich an, erfordert aber mindestens 3 MIDI Nachrichten
> pro Wertänderung pro Drehregler...

Wenn man auf die reservierten controller Nummern 120 - 127 keine 
Rücksicht nehmen muss würden die 128 controller doch alle in die control 
change message Bx passen.

von leeer (Gast)


Lesenswert?

Wenn die Haptik nicht nervig werden soll, muss der Controller die Kanäle 
ganz schön flott abarbeiten.

Angenommen jeder Eingang soll 50 Mal pro Sekunde gelesen werden:

1s/(50*128) = 1s/6400 = 156µS pro Wandlung.

Wenn du 8 auf einmal einliest werden daraus 156µS*8 = 1,25mS.

Sample Frequenz 156µS: 1/0.000156 = 6410Hz
Sample Frequenz 1,25mS: 1/0.00125 = 800Hz.


Ich glaube nicht, dass der ADC alle 8 aufeinmal samplen kann, also sind 
wir bei 6,41kHz. Da ist noch keine Mittelwertbildung drin, die Werte 
werden so ganz schön wackeln.
Entweder macht der Controller das dauerthaft nebenher oder man nimmt 
explizit X Wandlungen dafür. Dadurch würde sich die Sample Frequenz mit 
X multiplizieren.

Zwischen den Kanal-Wechseln muss auch jedes mal das 
Analog-Switch-Konstrukt bedient werden, was auch Zeit braucht.

Alles in allem eine ganz schöne Aufgabe, die du lösen willst...

von Heiko K. (heiko_k)


Lesenswert?

Eric B. schrieb:
> Hast du dir schon gedanken gemacht, wie die Daten der 128 Controllern in
> das MIDI Protokoll passen sollen?

Das tun sie, es gibt 128 Control Change Messages. Wenn ich nur die 
unregistrierten nehme (das sind so um die 30 glaube ich) gibt es immer 
noch 16 Kanäle. Also noch viel Luft nach oben.

Gedanken mache ich mir eher darum, ob bei der vielen Multiplexerei noch 
genügend Zeit für die einzelne AD-Wandlung bleibt...wenn ich mal 2 
Knöpfe gleichzeitig drehe, ob dann im PC noch eine sanfter An-/Abstieg 
oder eine Treppe ankommt...

von Heiko K. (heiko_k)


Lesenswert?

Zu langsam :-) ...ja, genau.

leeer schrieb:
> Entweder macht der Controller das dauerthaft nebenher oder man nimmt
> explizit X Wandlungen dafür. Dadurch würde sich die Sample Frequenz mit
> X multiplizieren.

Kannst du das etwas näher erläutern, den Punkt hab ich nicht verstanden.

von Jörg (Gast)


Lesenswert?

Warum denn immer dieser "ein uC" Ansatz? Nimm doch mehrere (z.B. 328) 
und lass sie über I2C oder SPI mit einem Master quatschen!? Der fragt 
reihum ab ob sich was geändert hat und schickt das dann raus.

von leeer (Gast)


Lesenswert?

Entweder du machst direkt drei (oder mehr) Wandlungen nacheinander, 
verrechnest diese und schreibst das Ergebnis irgendwohin:

Ergebnis = (Wandlung1 + Wandlung2 + Wandlung3) / 3



Oder aber du bildest nach jeder Wandlung den neuen Mittelwert:

Ergebnis = (Ergebnis + Wandlung) / 2

von Jörg (Gast)


Lesenswert?

Heiko K. schrieb:

> ob dann im PC noch eine sanfter An-/Abstieg oder eine Treppe ankommt...

Analog-Freaks würden sagen mit MIDI 7-Bit Controller Events kommt da 
immer eine Treppe an... ;-)

Es kommt ja drauf an, was Du steuern möchtest. Ein Vorteil der NPRNs ist 
ja auch die höhere Auflösung.

von leeer (Gast)


Lesenswert?

Jörg schrieb:
> Warum denn immer dieser "ein uC" Ansatz? Nimm doch mehrere (z.B. 328)
> und lass sie über I2C oder SPI mit einem Master quatschen!? Der fragt
> reihum ab ob sich was geändert hat und schickt das dann raus.

Der 328 hat aber nur in TQFP 8 ADC Kanäle, damit man einfach rechnen 
kann, sollte man schon 8 haben. 6 ist das suboptimal und 4 verlangsamt 
alles nur unnötig.

Ein einzelner mega8 sollte damit nicht überfordert sein.

Der Hardwareaufwand kommt doch aufs selbe raus. X Controller oder X 
Analog-Switches. Der Preis wird allerdings steigen, wenn man nicht nur 
einen nackten Controller ohne Cs und Quarz einbauen will.
ISP Stecker, Quarz, Reset-Taster, evtl. Diagnose-LEDs, ..., ...

von Jörg (Gast)


Lesenswert?

Kannst ja trotztdem einen 4067 dazu packen. Bei 128 Knöppen macht das 
den Kohl nun nicht soo fett und die Dinger haben genug Zeit zum 
Rechnen...

von The D. (thedaz)


Lesenswert?

Man könnte ja auch Drehencoder statt Potis nehmen und sich den ganzen 
lahmen ADC Kram sparen. Natürlich muss da entprellt werden, aber ich 
denke, insgesamt wäre das schneller abzufrühstücken.

von Stefan S. (mexakin)


Lesenswert?

straf mich lügen, aber Drehencoder kann man nicht multiplexen? Hab da 
wenig Erfahrung, aber ich brauche doch die capture compares der 
Timereingänge um die decoder zu berechnen, und da hat kein uC 128 Stück 
sondern eher so Größenordnung 10-20.

Insgesamt schönes Projekt, aber sobald es um Timing und Zeitgenau Dinge 
geht, muss man selber ran, und weg vom arduino, würd ich jetzt denken, 
aber als Start klappt der sicher gut.

von leeer (Gast)


Lesenswert?

Encoder kann man auch pollen. Das geht schätze ich ca. 10x schneller als 
die ADC-Kanäle lesen.

Hier im Wiki gibt es guten Stoff zum Thema Drehencoder.

von Jörg (Gast)


Lesenswert?

Deswegen ja mehrere uCs...

Ich würd' erstmal 16 Potis über einen 4067 an den Mega hängen und gucken 
was passiert und wie es sich anfühlt. Dann kann man immer noch 
weitersehen in welche Richtung sich das Konzept entwickelt...

von Heiko K. (heiko_k)


Lesenswert?

leeer schrieb:
> Ergebnis = (Wandlung1 + Wandlung2 + Wandlung3) / 3
> Ergebnis = (Ergebnis + Wandlung) / 2

Danke. Ich hab mich schon gefragt, ob es bei der AD-Wandlung von 
Spannung aus billigen Potis nicht zum Zittern der Werte kommt, und was 
man dagegen tun könnte...

von Jonas B. (jibi)


Lesenswert?

Hallo,

>>Ergebnis = (Wandlung1 + Wandlung2 + Wandlung3) / 3

Du willst NICHT durch 3 teilen auf einem atmega...

Wenn daraus ein Shift werden soll nehm ein Vielfaches von zwei...

GRUSS J

: Bearbeitet durch User
von Heiko K. (heiko_k)


Lesenswert?

The D. schrieb:
> Man könnte ja auch Drehencoder statt Potis nehmen

Könnte man. Hab ich auch schon überlegt.

Vorteil: Schneller und genauer, und man kann in der DAW den Wert nach 
oben und unten verändern, ohne komplett woanders hin zu springen und den 
Originalwert zu verlieren.

Nachteil: Kein fühl- und sichtbarer Anschlag, kein optisches Feedback, 
und Drehencoder sehen auf den ersten Blick komplizierter zu bauen und 
programmieren aus...

von m.n. (Gast)


Lesenswert?

Heiko K. schrieb:
> Danke. Ich hab mich schon gefragt, ob es bei der AD-Wandlung von
> Spannung aus billigen Potis nicht zum Zittern der Werte kommt, und was
> man dagegen tun könnte...

Bei sauberem Aufbau zittert da garnichts - ratiometrische Messung 
vorausgesetzt!

Heiko K. schrieb:
> Nachteil: Kein fühl- und sichtbarer Anschlag, kein optisches Feedback,
> und Drehencoder sehen auf den ersten Blick komplizierter zu bauen und
> programmieren aus...

... keine absolute Position, schlechte Auflösung bei Billigversionen und 
auf keinem Fall mit nur einem µC zu erfassen.

von Jonas B. (jibi)


Lesenswert?

>Nachteil: Kein fühl- und sichtbarer Anschlag, kein optisches Feedback,
>und Drehencoder sehen auf den ersten Blick komplizierter zu bauen und
>programmieren aus...

Gibt welche mi Raster. Code gibts von Peter, Strippen brauchst du 2 pro 
Encoder.

GRuß J

von leeer (Gast)


Lesenswert?

m.n. schrieb:
> Bei sauberem Aufbau zittert da garnichts - ratiometrische Messung
> vorausgesetzt!

Das ist auch meine Erfahrung. Nur selbst die besten Potis/Fader geben 
irgendwann den Geist auf. Aber das ist mit Encodern nicht besser.

Potis kann man zur Not auch fast immer zerlegen und reinigen. Bei 
Encodern wird's da schwieriger.

Heiko K. schrieb:
> Kein fühl- und sichtbarer Anschlag, kein optisches Feedback,
> und Drehencoder sehen auf den ersten Blick komplizierter zu bauen und
> programmieren aus...

Der Sichtbare Anschlag lässt sich mit LEDs realisieren:
http://physicalcomputing.at/WebRoot/Store2/Shops/f46ab952-295a-4f65-8ffa-38a4b8eec267/5412/B5FB/0AD0/8BDA/9E0A/0A48/3508/21F0/Bildschirmfoto_2014-09-19_um_15.26.09.png

Encoder sind nicht aufwendiger Aufzubauen und zu Erfassen als Potis.

Ein Controller kann auch 128 Encoder (semi-)gleichzeitig erfassen. Das 
sind 256 Leitungen, die man z.B. über Shift-Register einlesen kann.

Bei 16MHz AVR gehen 8MHz SPI. Mit jedem Clock wird ein Bit übernommen:
1s/8MHz = 125nS pro Bit.
125nS * 128 = 16µS um alle Encoder einmal abzufragen. Ergibt 62,5kHz 
maximale Samplerate für alle Encoder.
Das ist deutlich schneller als es sein muss.

Daraus folgere ich: Mehrere Controller steigern den Aufwand nur unnötig.

Haben die Encoder noch Buttons dauert es halt nochmal um 1/3 länger => 
immernoch schnell genug.

m.n. schrieb:
> und
> auf keinem Fall mit nur einem µC zu erfassen.

Lüge?

von Heiko K. (heiko_k)


Lesenswert?

leeer schrieb:
> Der Sichtbare Anschlag lässt sich mit LEDs realisieren:

Wow sehen die stylisch aus, das würde mir gefallen...sprengt nur leider 
das Budget :-)

Hm. Vielleicht ein Ring für alle Encoder. Oder ne LCD-Anzeige...

von m.n. (Gast)


Lesenswert?

leeer schrieb:
> Lüge?

Nein.

> Bei 16MHz AVR gehen 8MHz SPI. Mit jedem Clock wird ein Bit übernommen:
> 1s/8MHz = 125nS pro Bit.
> 125nS * 128 = 16µS um alle Encoder einmal abzufragen. Ergibt 62,5kHz
> maximale Samplerate für alle Encoder.
> Das ist deutlich schneller als es sein muss.

Milchmädchenrechnung.

von The D. (thedaz)


Lesenswert?

m.n. schrieb:
> leeer schrieb:
>> Lüge?
>
> Nein.
>
>> Bei 16MHz AVR gehen 8MHz SPI. Mit jedem Clock wird ein Bit übernommen:
>> 1s/8MHz = 125nS pro Bit.
>> 125nS * 128 = 16µS um alle Encoder einmal abzufragen. Ergibt 62,5kHz
>> maximale Samplerate für alle Encoder.
>> Das ist deutlich schneller als es sein muss.
>
> Milchmädchenrechnung.

Pro Encoder 2 Bit, also kann man 4 Encoder pro read operation in einem 
Takt samplen. Insgesamt sind also 32 reads nötig, macht 32 Takte nur um 
die Rohdaten zu lesen. Dazu kommt das Umschalten der Multiplexer, macht 
zusätzlich 32 write Operationen. Wir sind dann bei 64 Takten pro 
Durchgang wenn ich mich nicht irre. Jetzt müssen die Rohdaten natürlich 
noch durch eine Entprellung und anschließend dekodiert werden. Für die 
Entprellung nehme ich einfach mal 100 msec an, das heißt, 10 mal pro 
Sekunde gibts von allen Encodern neue Werte die jetzt nur noch dekodiert 
werden müssen. Das alles belastet den Prozessor lächerlich wenig (im 
Promille Bereich) und kann im Hintergrund von einer Timer-Routine 
erledigt werden.

Man möge mich berichtigen, falls ich hier einem Denkfehler unterliege.

von m.n. (Gast)


Lesenswert?

The D. schrieb:
> Man möge mich berichtigen, falls ich hier einem Denkfehler unterliege.

Gerne.
Mit 10 Abtastungen/s bekommst Du die Drehung der Drehgeber schon 
garnicht mehr mit. Zudem sollten die Drehgeber eine Auflösung von >= 64 
haben, um an die Auflösung der Potis heranzukommen. Solche Drehgeber 
würde ich nicht unter 5 kHz abtasten.
Und großer Schreck, wenn die dann noch alle Zittern.

Viel Spaß beim Bitschuppsen ;-)

von The D. (thedaz)


Lesenswert?

m.n. schrieb:
> The D. schrieb:
>> Man möge mich berichtigen, falls ich hier einem Denkfehler unterliege.
>
> Gerne.
> Mit 10 Abtastungen/s bekommst Du die Drehung der Drehgeber schon
> garnicht mehr mit. Zudem sollten die Drehgeber eine Auflösung von >= 64
> haben, um an die Auflösung der Potis heranzukommen. Solche Drehgeber
> würde ich nicht unter 5 kHz abtasten.
> Und großer Schreck, wenn die dann noch alle Zittern.
>
> Viel Spaß beim Bitschuppsen ;-)

Sorry, aber das hat ja niemand behauptet. Natürlich muss viel öfter 
gesampelt werden. Das ist bei 64 usec Dauer für das Samplen auch 
problemlos möglich. Ich habe lediglich gesagt, daß MIT ENTPRELLEN 
letztlich alle 100msec ein neuer Satz Werte verfügbar ist. Und damit ist 
die gefühlte Reaktionszeit akzeptabel.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Encoder sind ja für viele Anwendungen schön, aber sie behalten ihre 
Stellung nach dem Ausschalten nicht. Man muss also entweder die 
Stellungen in ein EEPROM oder SRAM speichern oder man hat nach dem 
Einschalten nicht den letzten Zustand wieder. Die Kosten für den LED 
Kranz sind auch nicht zu unterschätzen.
Da sind Potis doch einfacher zu handhaben.
Mit einer nicht so komplizierten ISR für den AD Wandler sollte es auch 
möglich sein, die 128 Kanäle im Hintergrund in ein Array zu speichern. 
Die ISR könnte auch auf Gleichheit mit dem vorherigen Wert vergleichen 
und Flags setzen, damit die Hauptschleife den Controllerwert senden 
kann.

: Bearbeitet durch User
von _Gast (Gast)


Lesenswert?

Hm,


warum gleich die volle Ladung?

Beginne doch einfach erst einmal mit 8 Potis und bringe die ganze Sache 
zum laufen.

Wenn das zufriedenstellend läuft, fange an das Projekt zu erweitern...

Hier kannst du ja auch schon erste Versuche mit der Erweiterung machen, 
z.b. die 8 Potis dann über einen Mulitplexer einlesen, oder einen 
zweiten Arduino über eine der seriellen Schnittstellen mit dem Master zu 
verbinden.

mfg
Gast

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.