Mehr analoge Inputs für Arduino (IC 4051 Tutorial – MIDI Controller selber bauen Teil 10+11)

Wir verpassen unserem Arduino mehr analoge Eingänge und erweitern diese mit dem IC 4051. In dieser Folge schauen wir uns an wie das Teil funktioniert und wie man es mit dem Arduino verbindet. So können wir unseren MIDI-Controller später frei erweitern!
4051-arduino-anschliessen-schaltbildIm zweiten Teil schauen wir uns die Programmierung an: Wie genau lassen wir den Arduino den 4051 abfragen um über einen einzigen analogen Eingang mit dem IC acht Potis abfragen zu können?

Der komplette Programmcode

int potiWert = 0;
int zaehler = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void setup() {
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 Serial.begin(9600);
}

void loop () {
 for ( zaehler = 0 ; zaehler <= 7; zaehler++ ) {

  bit1 = bitRead(zaehler, 0);
  bit2 = bitRead(zaehler, 1);
  bit3 = bitRead(zaehler, 2);

  digitalWrite(2, bit1);
  digitalWrite(3, bit2);
  digitalWrite(4, bit3);

  potiWert = analogRead(A0);
 
  Serial.print(potiWert);
  Serial.print(" ");
 } 
 Serial.println("");
}

Beteilige dich an der Unterhaltung

51 Kommentare

  1. Unglaublich, deine Begabung, schnell, übersichtlich, logisch, einfach und letztendlich top-professionell aufbereitet zu erklären… ! Einfach schön und lehrreich, zuzuschauen – auch als „Nicht-Anfänger“.
    Bin letzte Woche auf diese Reihe gestoßen und dadurch auf die Idee gekommen, mir einen großen, völlig individuell programmierbaren Midi-Foot-Controller für mein Gitarren-Rig zu bauen – und nicht 100e von Euros für eine letztlich eingeschränkte Kauf-Lösung auszugeben…
    Arduino ist schon da und erster Programmcode fertig. Hardware folgt 🙂
    Lg

  2. Da kann ich mich nur anschließen. Super verständlich und leicht nachvollziehbar. Danke.
    Jetzt liegt es nur noch an mir die Einzelteile zum großen Ganzen zusammen zu setzten. Sprich 1 Schieberegister, 10 Potis, 1 5-polige DIN Buchse, 1 programmierten Atmega 328p-pu und 2 4051.
    Mal sehen, ob meine Hirnsuppe auch noch funktioniert ;-))

    LG
    Marcus

  3. Lieber Götz,

    dank deines super Tutorials kann ich ein prima Gadget für eine Ausstellung bauen. Ich verwende richtig nette Arcade Buttons und mächtig fette Drehknöpfe aus Bakelit. Bisher hab ich 9 Buttons und 24 Drehpotis in Verwendung – es sollen aber noch mehr werden.. erstmal werd ich jetzt auf einen Arduino Mega umsteigen, sonst geh’n mir nämlich die Digitalen Eingänge aus!

    Herzlichen Gruß aus Graz,
    Johannes

  4. Lieber Johannes,
    vielen Dank! Also mit tollen Arcade-Buttons liebäugele ich auch schon die ganze Zeit! 🙂 Vielleicht werde ich die beim nächsten Projekt einsetzen.
    Viel Erfolg für Deine Ausstellung und Gruß aus Köln
    Götz

  5. Hallo Götz,
    Da sind ja einige wach geworden, ist ja auch genial gut was Du da präsentierst. Ich habe schon eine Platine mit sechs 4051 gelötet, auch das Gehäuse ist halb fertig. Bin schon sehr gespannt wie Buttons und Regler zusammen kommen. Ist es einfach zwei Pre-Sets (A und B) mit verschiedenen Controllern zu programmieren? Ich will gerne den Mixer für zwei verschiedene Instrumente einsetzen. Bräuchte dann nicht in den Arduino jedesmal ein anderes Programm zu laden.
    Ansonsten macht es richtig Spaß bei Dir mitzumachen.
    Grüße
    Christof

  6. Alles schön auf einer Europakarte (BP823) gelötet, bis auf die letzen Verbindungen. Wegen Platzmangel für einen Arduino Nano. Sehen?
    Freu mich schon auf Deinen nächsten Clip.
    Übrigens wenn Dein Kurs so schnell weitergeht, kannst Du gerne Deinen Mixer bei der Extraschicht (20Juni) sehen und hören.
    Grüße
    Christof

  7. hy götz,
    hab mir deine videos angesehen du erklärst das echt super.als totaler programieranfänger verständlich.
    kam vor kurzer zeit auf die idee einen kleinen controller so 8 potis zu basteln um ableton zu steuern. hab dann deine videos geschaut und mir über den multiplexer mal vorläufig vier potis angeschlossen so zum ausprobieren. beim hairless midi hab ich dann dauernd:
    error.got unexpected data byte 0x20 . beim arduino serieller monitor siehts aber gleich wie bei dir aus . nur die 5 potis die ich nicht angeschlossen habe , haben den wert 1023 nicht 0 wie bei dir aber der rest geht.
    hast du eine idee was das sein könnte?
    gruss
    ueli

  8. Hi Ueli,
    hast du denn alle nicht verwendeten analogen Inputs am 4051 auch auf ground gelegt? Das war bei meinem ersten Versuch auch nicht der Fall und der IC hat nur falsche Werte ausgegeben.
    VG
    Götz

  9. hy Götz,
    hab das nochmals genau überprüft und festgestellt, dass ich die nicht verwendeten analogen inputs am 4051 schon irgendwie auf ground gelegt aber tja mit dem falschen widerstand nämlich mit 10kohm. hab das aber grad korrigiert mit 220ohm widerstand aber die restlichen analogen inputs erscheinen am seriellen monitor von arduino 1.6.3 immer noch dauernd mit 1023, die angeschlossenen potis liefern aber den richtigen wert also es geht rauf wenn ich nach rechts drehe wie bei deinem video. aber beim hairless midi serial bridge 0.4 kommt irgendwie nix an punkt flackert nicht auf. vielleicht liegt das problem beim hairless midi. ich mach dann auch noch so ein usb to midi adapter ran wie du vorschlägst gute idee.
    hey danke für den input ich bleib dran und mach weiter so hast tolle videos.
    gruss
    ueli

  10. hy
    ups noch mehr fehler aufgefallen ich muss dass noch mal in ruhe überprüfen hab leere pins auf 5V und nicht auf ground gelegt. jetzt muss ich mich glaub mal auf ground legen. jedenfalls siehts im seriellen monitor vom arduino definitiv besser aus. mit dem hairless midi hab ichs noch nicht hingekriegt aber wenn ich die baud rate wechsle funzt da manchmal was aber nicht immer . ich muss das mal überschlafen vielleicht 4051 auswechseln denn hab ich genug geärgert.
    gruss
    ueli

  11. hy Götz
    ich habs nochmals überprüft und jetzt funktionierts wie bei dir. danke für die hilfe.
    ich warte schon sehnlichst auf deine nächste folge. jetzt probier ich grad diese werte in midi umwandeln da sie im hairless midi als (MIDI In:CH1:note48 on velocity 32) reinkommen, hab mir so ein usb to midi kabel gekauft aber da muss ich wohl noch bisschen üben
    danke für deine hilfe
    ueli

  12. Bei mir wandelt der Sketch die Poti-Signale nicht in Midi-Signale um. Ich sehe nur Zahlen, Symbole und Klein- und Großbuchstaben. Woran könnte das denn liegen?

  13. Mein Sketch im Folgendem:

    int controlChange = 176; //Midi Kanal 1
    int potiWert = 0;
    int midiWert = 0;
    int zaehler = 0;

    int bit1 = 0;
    int bit2 = 0;
    int bit3 = 0;

    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    Serial.begin(9600);
    }

    void loop () {
    for ( zaehler = 0 ; zaehler <= 7; zaehler++ ) {

    bit1 = bitRead(zaehler, 0);
    bit2 = bitRead(zaehler, 1);
    bit3 = bitRead(zaehler, 2);

    digitalWrite(2, bit1);
    digitalWrite(3, bit2);
    digitalWrite(4, bit3);

    potiWert = analogRead(A0);
    midiWert = map(potiWert,0,1023,0,127);

    Serial.write(controlChange);
    Serial.write(midiWert);
    Serial.write(" ");
    }
    Serial.println("");
    }

    Ich habe auch andere Varianten probiert aber nur Fehler erhalten. Dieser
    Sketch funktioniert wenigstens.
    Und noch eine Frage. Schau Dir doch mal das folgende Video auf youtube an.

    https://www.youtube.com/watch?v=​6cn-FboGjNE

  14. Drei kleine Fehler fallen mir auf, die verhindern, dass du valide MIDI-Daten bekommst:

    1. hast du die Controller-Nummer vergessen – die muss direkt nach „Serial.write(controlChange);“ kommen, also z.B. „Serial.write(21);“

    2. + 3. du sendest jetzt noch ein Leerzeichen „Serial.write(“ „);“ und einen Zeilenumbruch „Serial.println(„“);“ – die sind natürlich für die Darstellung im Serial-Monitor hilfreich, sind aber in den MIDI-Daten ein Fehler. Schmeiß‘ die beiden Zeilen einfach raus.

    Ich bin gespannt obs so klappt! 🙂

  15. Hallo Götz, erstmal vielen Dank für deine Hilfreichen Videos. Ich frage mich gerade ob ein solcher Controller, wenn über usb mit dem Computer verbunden, wie andere Minicontroller einfach und ohne Probleme in DAWs (Ableton, Cubase, usw.) erkannt wird und verwendet werden kann?

  16. Hallo Alex,
    ob man über den seriellen Treiber mehr als einen Arduino gleichzeitig anschließen kann weiß ich ehrlich gesagt gar nicht. Aber wir haben ja inzwischen verschiedene Möglichkeiten angeschaut, um „echtes“ MIDI über USB zu schicken. So kannst du auch mehr als einen Controller gleichzeitig anschließen:
    https://www.youtube.com/watch?v=Vs8wO7AX1n4

  17. Hallo Götz,
    vielen Dank für deine geniale Videoreihe. Ich habe bisher alles sehr gut umsetzen können. Es gibt nur eine Sache die ich nicht hin bekomme, und vielleicht kannst du mir da einen Tipp geben.
    Und zwar sendet mein Controller permanent Daten obwohl kein Poti bewegt wird. Die if Abfragen habe ich eingebaut. Hier mal mein Code für 16 Potis an zwei analogen Eingängen (Arduino Uno)

    int controlChange = 176; // Kanal 1
    int controllerWert = 0;
    int filter[] = {0,0,0,0,0,0,0,0};

    int controllerNummer1[] = {20,21,22,23,24,25,26,27};
    int controllerNummer2[] = {28,29,30,31,32,33,34,35};

    int potiPin[] = {A0,A1,A2,A3,A4,A5};
    int potiWert = 0;

    int bit1 = 0;
    int bit2 = 0;
    int bit3 = 0;

    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    Serial.begin(31250);
    }

    void loop () {
    schieberegister (2, 3, 4, potiPin[0]);
    schieberegister (5, 6, 7, potiPin[1]);
    }

    // schieberegister
    void schieberegister (int d1, int d2, int d3, int anaread) {
    for ( int i = 0 ; i = 3) {

    Serial.write(controlChange);
    if (anaread == A0) {
    Serial.write(controllerNummer1[i]);
    }
    else if (anaread == A1) {
    Serial.write(controllerNummer2[i]);
    }

    Serial.write(controllerWert);
    filter[i] = controllerWert;
    }
    }
    }

  18. Hallo Tom,
    vielen Dank!
    Ich kann keinen Fehler erkennen, aber dein Sketch ist ja auch nicht vollständig. Könnte es vielleicht sein, dass deine Potis selbst keine konstanten Werte ausgeben, sondern um +-1 zittern?
    In diesem Fall wäre die Folge am kommenden Sonntag etwas für dich.
    VG
    Götz

  19. Hallo Götz,
    vielen Dank für die Antwort.
    Komisch, der Code ist in der Tat nicht der den ich dachte gepostet zu haben.
    Das mit den zitternden Potis kann ich bestätigen.Das kompensier ich mittlerweile über einen Threshold:
    if (abs(filter[i] – controllerWert) >= 2) { …}
    Der Nachteil davon ist, das jetzt nur noch jeder zweite Wert übertragen wird.
    Ich bin sehr gespannt auf die kommende Folge zu diesem Thema 🙂

    VG
    Tom

  20. Hey Götz, vielen Dank für deine gute Arbeit.
    Ich spiele mit dem Gedanken ein paar Motorfader einzubauen, hast du eine Idee wie das gehen könnte? Da hakts bei mir gerade etwas, sonst sind deine Erklärungen echt top.

  21. Vielen Dank Jason,
    wo ganz genau hakt es denn? Hast du denn schon einmal ein Tutorial geggogelt bei dem du an einer bestimmte Stelle nicht weiter kommst?
    VG
    Götz

  22. Sir Im Question. why your skets code arduino, this test in midi heairless not stabile the controller number ex : if i select the potensiometer in analog(A0) show : – Controller 21 value 1 – Controller 22 value 2 – Controller 23 value 3 – Controller 25 value 4 – Controller 23 value 5 – Controller 21 value 6 showw why this controller number not static, why controller number looping, this is not ok

  23. Ja, ein absoluter Klassiker ist die sog. „resistor ladder“ – allerdings bin ich mir nicht sicher wie zuverlässig ich damit zwei gedrückte Tasten gleichzeitig erfassen kann. Muss man sich also für den jeweiligen Einsatzzweck immer gut überlegen…

  24. Hey Götz, vielen Dank für deine super Videos.
    Du erklarst alles wirklich sehr genau aber den noch so simple das jeder es versteht.
    Ich probier gerade denn 4051 einzubinden nur irgendwie vermischen sich mein Signale von meine 3 Potis bei NI Massive hab ich probiert jeden Poti an einem Poti in massive zu verbinden nur wen ich das mache vermischen sich die Signale also wen ich an Poti 2 drehe bewegt sich Poti 1 in massive. Hoffentlich kanst du mir helfen.

    Vielen dank schon mal und sorry Für mein schlechtes deutsch aber ich lebe seit ich 5 bin nicht mehr in Deutschland also hoffenlich verstehst du alles.

    Hier mein code.

    [code]
    int potiWert = 0;
    int zaehler = 0;

    int bit1 = 0;
    int bit2 = 0;
    int bit3 = 0;

    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    Serial.begin(9600);
    }

    void loop () {
    for ( zaehler = 0 ; zaehler <= 7; zaehler++ ) {

    bit1 = bitRead(zaehler, 0);
    bit2 = bitRead(zaehler, 1);
    bit3 = bitRead(zaehler, 2);

    digitalWrite(2, bit1);
    digitalWrite(3, bit2);
    digitalWrite(4, bit3);

    potiWert = analogRead(A0);
    controllerWert = map(potiWert, 0, 1023, 0, 127);

    if (controllerWert != controllerWertAlt) {
    Serial.write(controlChange);
    Serial.write(controllerNummer);
    Serial.write(controllerWert);
    }

    Serial.print(potiWert);
    Serial.print(" ");
    }
    controllerWertAlt = controllerWert;
    Serial.println("");
    }
    [/code]

  25. Hallo

    Ich habe ein Projekt mit 13 Multiplexer weiß aber leider nicht wie ich die nacheinander abfrage könntest du mir da einen Tipp geben

    Lg Andi

  26. int potiWert = 0;
    int zaehler = 0;
    int controllerWert = 0;
    int controllerWertAlt = 0;
    int controllerNummer = 21;
    int controlChange = 127;

    int bit1 = 0;
    int bit2 = 0;
    int bit3 = 0;

    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    Serial.begin(9600);
    }

    void loop () {
    for ( zaehler = 0 ; zaehler <= 7; zaehler++ ) {

    bit1 = bitRead(zaehler, 0);
    bit2 = bitRead(zaehler, 1);
    bit3 = bitRead(zaehler, 2);

    digitalWrite(2, bit1);
    digitalWrite(3, bit2);
    digitalWrite(4, bit3);

    potiWert = analogRead(A0);
    controllerWert = map(potiWert,0,1023,0,127);

    if (controllerWert != controllerWertAlt)

    {Serial.write(controlChange);
    Serial.write(controllerNummer);
    Serial.write(controllerWert);}

    controllerWertAlt = controllerWert;

    Serial.print(potiWert);
    Serial.print(" ");
    }
    Serial.println("");
    }

    Ich habe jetzt mal den code so geschrieben um 4 potis zu steuern mit dem multiplexer. elektronik funktioniert, aber ich bekomme das mit den ruheneden MIDIbotschaften nicht hin…… wäre toll, wenn jemand den fehler in meinem code findet…… vielen dank.

  27. Hey Götz,
    ich weiß das dieses Tutorial schon etwas älter ist, würde dich aber dennoch bitten den oben angegeben Schaltplan zu erneuern. Der is nämlich Fehlerhaft. Laut Schaltplan ist nämlich ein 220Ohm mit 5% verbaut und kein 10kOhm Wiederstand. Das führte bei mir leider dazu das es mir ein 4051 leider abgeraucht ist bzw nur noch wirres zeug aausgiebt. Dass man einen 10kOhm Wiederstand sagst du nämlich nur im Video.

    MfG

  28. Hallo Götz!

    Du machst wirklich großartige Videos, vielen Dank, dass du dein Wissen so verständlich weitergibst!

    Leider brauche ich nun trotzdem ein wenig Hilfe..
    Ich hab einen IC 4051 wie du erstmal mit drei Potis angeschlossen, im Serial Monitor klappt alles wie am Schnürchen aber nicht in der hairless serial bridge. Dort kommt die schon oft beschriebene Fehlermeldung „Error: got unexpected data byte…“ . Ich habe bereits alles überprüft, die baudrate stimmt, alle ungebrauchten Pins des ICs sind an ground gelegt, den IC hab ich auch getauscht und es auch mit 220 K Ohm Widerständen probiert.
    Trotzdem habe ich ihn mal mithilfe von der Serial Bridge und loopMIDI (da Windows) mit dem Musikprogramm FL Studio verbunden, dort wird er zwar angezeigt, reagiert aber nicht.
    Könntest du mir evtl. Tipps geben was ich jetzt machen könnte?

    Liebe Grüße und Danke im Vorraus!
    Nadine

  29. Hallo Nadine,
    viele senden mit serial.print – es muss aber serial.write sein, damit es mit der Hairless Bridge auch funktioniert. Könnte das bei dir vll.t auch der Fall sein?
    VG
    Götz

  30. Hallo, lässt sich die Darstellung der einzelnen Poti Werte im Serial Monitor ändern ?
    Zb untereinander ?
    Oder jeden wert einzeln zu benamen und darzustellen ?

  31. Hallo Lucien,
    kein Problem:

    Mit Serial.println(); erzeugst du nach der Ausgabe einen Zeilenumbruch.

    Mit Serial.print(„\t“); erzeugst du einen Tabulatorschritt.

    Mit Serial.print(„Mein Wert: „); und Serial.print(variable); kannst du Werte auch easy mit Text versehen.

    Viel Erfolg
    Götz

  32. Hallo Götz,
    ich wollte dich mal fragen ob du mal einen Code schreiben kannst für einen MidiController der Potis UND Encoder benutzt. Ich kriege es es echt nicht hin Encoder zu Multiplexxen. Würde mich sehr über ein Video oder eine Antwort mit Code hier im Blog freuen, danke.

    LG: Sketch

  33. Kann man nicht für den linken und den rechten pin jeweils einen Multiplexxer nehmen. Also so das du die gleichzeitig abfragtst. Und dann den Code einfach wieder mit einem Zähler machst der Gleichzeitig alles durchzählt. Wenn du das mal ausprobieren könntest mit Code hier im Blog fänd ich das echt toll, da ich es selber leider nicht ganz kapiert habe wie man in die Variable schreibt.

  34. Hi

    super tutorials!! ohne dich könnte ich heute GARNICHTS! 🙂
    ich müsste mal deinen Rat ersuchen:

    ich habe ein board mit 12x 4051.. an die ich jede menge 10K fader und potis angeschlossen habe. Es funktioniert alles bestens nur habe ich echt jede menge noise.. auch geht der wert der potis nie auf 0 wenn ich sie ganz runterschraube..

    ich habe GND und 3.3V in parallel verbunden mit dickeren solid-core-kabeln.. die data-pins sind mit diesem hauchdünnen flachbandkabel verbunden.. die data-kabel sind alle ca. 35cm lang.. könnte es daran liegen? .. sollte ich die IC’s entkoppeln?

    woran könnte es liegen? was wäre die best practice um noise zu vermeiden?

  35. Danke Andreas! 🙂 Ein decoupling Kondensator so dicht wie’s geht am IC wäre auf jeden Fall das erste, was ich versuchen würde. Ein 10uF an deiner Spannungsquelle und pro IC einen 0.1 uF so dicht es geht am IC wäre da der klassische Startpunkt. Wenn die Potis halt nicht genau auf 0 gehen kannst du das ruhig per Programmierung ausgleichen.
    Viel Erfolg!

  36. Hallo Götz,

    auch ich möchte mich für deine Videos und Hilfestellungen bedanken. Ich finde es klasse, dass man so in die Lage versetzt wird, dass man sich selbst einen Controller basteln kann. Allerdings habe ich derzeit ein Problem, welches ich nicht greifen kann.

    Ich nutze einen teensy 3.2 und will einen Controller mit 16 Potis bauen. Um das mit den Multiplexern wirklich zu verstehen und greifen zu können, habe ich für meinen Testaufbau einfach 3 Potis genommen. Den Sketch habe ich allerdings 1:1 von dir übernommen. Wenn ich den teensy nun anschließe und den serial-monitor öffne, habe ich 3 Poti-Werte wobei der eine bspw. nur bis 50 runter geht oder der andere nur 1000 ausgibt. Ich bekomme also leider nicht 0 bei geschlossenem oder 1023 bei voll geöffnetem Poti. Hinzukommt, dass du in deinem Sketch ja 8 Werte erwartest. Die Werte, die nach meinen 3 Potis kommen, sollten theoretisch ja 0 ausgeben. Ich bekomme allerdings auch hier 200-300 ohne, dass irgentetwas an den Eingängen hängen würde.

    Ich habe das Gefühl, dass da irgendetwas „streut“. Ich habe die Schaltung mehrfach neu aufgebaut und auch die Steckplätze gewechselt, ebenfalls den IC. Das Ergebnis bleibt das selbe. Ich habe auch einfach nur mal den Teensy angesteckt und den Monitor beobachtet. Dann fehlen logischerweise die Potiwerte, aber ich habe trotzdem permanent Werte von 200-400 . Beim Arduino UNO ebenfalls. Woran liegt das und was kann ich machen?

    Könntest du mir auch nochmal erklären, warum Widerstände eingesetzt werden? Warum der Pulldown bei dem IC? Ich steige da nicht so genau durch. Kannst du mir vielleicht eine Seite nennen, die das erklären kann? Google war mir bisher keine Hilfe.

    Vielen Dank und viele Grüße,
    Nils

  37. Danke für Deinen Code, damit konnte ich mit zwei Multiplexern 4067 (16 fach Multiplexer) für eine Erdbodenfeuchtigkeitsregelung von 16 Topfpflanzen nutzen. Dein Code gerade im Bereich der Bitaufschlüsselung zur Ansteuerung von S0 bis S3 war dazu sehr hilfreich und weniger kompliziert als bei den anderen Beispielen, die ich gefunden hatte.

  38. Hallo,

    erstmal vorweg: Geile Tutorials, waren sehr hilfreich.

    Ich habe mich allerdings gefragt, ob es möglich wäre an einen 4051 acht weitere 4051 anzuschließen. Wäre schön, wenn du mir da weiter helfen könntest.

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.