Geschrieben am

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("");
}

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

  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

    1. Hey Martin,
      vielen Dank für dein Lob! Wenn’s soweit ist: Fotos! 🙂
      LG
      Götz

  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

    1. Markus, dir auch vielen Dank! 🙂
      Das klingt doch noch recht überschaubar! 😉
      VG
      Götz

  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

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

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

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

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

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

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

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

      1. Die Baudrate muss in jedem Fall identisch mit der in deinem Arduino-Sketch sein damit es keine Fehler gibt!

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

  9. 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?

    1. Hast du überprüft dass im Sketch und in der MIDI to Serial Bridge die gleiche Übertragungsgeschwindigkeit eingetragen ist?

  10. Ja, dass habe ich gemacht. Leider ohne Erfolg.

    1. Poste doch mal deinen Sketch – vielleicht finden wir den Fehler im Code.

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

    1. 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! 🙂

  12. 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?

    1. 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:

  13. 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;
    }
    }
    }

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

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

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

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

  16. Mr i can veri“ thanks with you, if you send the sket is good and ready to playing thank you sir. gx.extrim@gmail.com

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

    1. Please post your sketch here!

    1. 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…

  18. Hi,

    ich baue mir grade einen großen Controller aber ich stehe vor einem problem. Wie viele IC´s kann ich maximal hintereinander schalten und wie sieht es mit signal verstärkung aus?
    ich würde gerene 20 endlos encoder benutzen und 20 push buttons.
    Für die Digital inputs habe ich zwei von den 74HC165 im momenten kleinen versuch.
    http://www.pic-upload.de/view-29174747/IMAG0160.jpg.html

    und hier ist mein aktueller code
    http://paste2.org/gH4YfIxN

  19. 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]

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

    1. Hallo Andi,
      schau dir dazu mal das Schaltbild aus der letzten Folge an sowie die Folge 18. Da wird alles erklärt.

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

Kommentar verfassen