Arduino Joystick Tutorial – DIY MIDI Controller E17

arduino-joystick-tutorial-deutsch-anschliessenEinen Joystick an den Arduino anschließen? Kein Problem mit diesem Tutorial. Wir schauen uns die Hardware an und programmieren verschiedene Möglichkeiten um MIDI-Daten zu erzeugen und unseren Synthesizer damit zu steuern. Nach der letzten kurzen Folge, heute mal wieder länger und ganz ausführlich.

Hier gibt’s den Programm-Code:

int joyX = 0; //Pitch Bend
int joyY = 0; //CC1 und CC20

int pitchBend = 0;
int controllerWert = 0;

int button = LOW;
int buttonAlt = LOW;
int schalter = 0;

void setup() {
 Serial.begin (9600);
 pinMode (8, INPUT_PULLUP);
}


void loop() {
 joystickAbfragen();
 buttonAbfragen();
}


void joystickAbfragen() {
 joyX = analogRead(A0);
 if (joyX > 530) {
 pitchBend = map(joyX,530,1023,65,127);
 sendeMIDI(224,0,pitchBend);
 }
 if (joyX < 520) {
 pitchBend = map(joyX,0,520,0,63);
 sendeMIDI(224,0,pitchBend);
 }
 else if ((joyX > 520 && joyX < 530) && pitchBend != 64) {
 pitchBend = 64;
 sendeMIDI(224,0,pitchBend);
 }
 
 joyY = analogRead(A1);
 if (joyY > 530) {
 controllerWert = map(joyY,530,1023,0,127);
 sendeMIDI(176,1,controllerWert);
 }
 else if (joyY < 520) {
 controllerWert = map(joyY,520,0,0,127);
 sendeMIDI(176,20,controllerWert);
 }
}


void buttonAbfragen() {
 button = digitalRead(8);

 if (button == LOW && buttonAlt == HIGH) {
 if(schalter == 0){
 sendeMIDI(176, 64, 127);
 schalter = 1;
 }
 else {
 sendeMIDI(176, 64, 0);
 schalter = 0;
 }
 }
 buttonAlt = button;
}


void sendeMIDI(int statusByte, int dataByte1, int dataByte2) {
 Serial.write(statusByte);
 Serial.write(dataByte1);
 Serial.write(dataByte2);
}

Beteilige dich an der Unterhaltung

13 Kommentare

  1. Hallo Götz,

    als Erstes vielen Dank für Deine netten und guten Videos.
    Ich habe ein bischen mitgebaut und möchte am Ende einen Midi Controller mit 9 Fadern, 8 Potis und 17 Schaltern haben.
    Bei mir funktioniert die Klättung der Potis nicht. Ich sende dauert midi- Signale.

    Hier mein Sketch:

    \\
    int controlChange = 176; //Midi Kanal 1

    int potiPin[] = {A0,A1,A2,A3,A4,A5};
    int controllerNummer[] = {21,22,23,24,25,26};
    int controllerWert[] = {0, 0, 0, 0, 0, 0};
    int controllerWertAlt[] = {0, 0, 0, 0, 0, 0};
    int potiWert[] = {0, 0, 0, 0, 0, 0};

    int i = 0;

    int smoothWert = 0;

    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    for (i = 0; i <6; i++) {
    potiWert[i] = analogRead(potiPin[i]);
    smoothWert = 0.4 * smoothWert + 0.6 * analogRead (potiPin[i]);
    controllerWert[i] = map(smoothWert,0,1023,0,127);

    if (controllerWert[i] != controllerWertAlt[i]){

    Serial.write(controlChange);
    Serial.write(controllerNummer[i]);
    Serial.write(controllerWert[i]);
    }
    controllerWertAlt[i] = controllerWert[i];

    }
    }
    \\

    Hast Du eine Idee?

    Zu mir, ich bin ganz neu in ARDUINO, habe aber schon einige Röhrenverstärker für Gitarre gebaut, von 5 (EL84) bis 100 (4*EL34) Watt.

    Mach weiter
    Gruß,
    Peppi

  2. Hy Götz,

    etwas unübersichtlich hier.
    Mein neuer Sketch geht ein bisschen besser, alles gut so?

    int controlChange = 176; //Midi Kanal 1

    int potiPin[] = {A0,A1,A2,A3,A4,A5};
    int controllerNummer[] = {21,22,23,24,25,26};
    int controllerWert[] = {0, 0, 0, 0, 0, 0};
    int controllerWertAlt[] = {0, 0, 0, 0, 0, 0};
    int potiWert[] = {0, 0, 0, 0, 0, 0};
    int smoothWert[] = {0, 0, 0, 0, 0, 0};

    int i = 0;

    //int smoothWert = 0;

    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    for (i = 0; i <3; i++) {
    potiWert[i] = analogRead(potiPin[i]);
    smoothWert[i] = 0.8 * smoothWert[i] + 0.2 * analogRead (potiPin[i]);
    controllerWert[i] = map(smoothWert[i],0,1023,0,127);

    if (controllerWert[i] != controllerWertAlt[i]){

    Serial.write(controlChange);
    Serial.write(controllerNummer[i]);
    Serial.write(controllerWert[i]);
    }
    controllerWertAlt[i] = controllerWert[i];

    }
    }

    Gruß,
    Peppi

  3. Hi Peppi,
    du brauchst „smoothWert“ UND „potiWert“ nur beide, wenn du wie ich im Film auch beide Werte miteinander vergleichen willst. D.h. du brauchst nur:
    potiWert[i] = 0.8 * smoothWert[i] + 0.2 * analogRead (potiPin[i]);
    VG
    Götz

  4. Ja, solange es ein einfaches kapazitives Touchpad ist mit dem du nur einen einzelnen Finger erfassen kannst ist es eigentlich nicht schwieriger als den Joystick anzuschließen.

  5. Ja so einer könnte gehen oder aus ein Novation midi controller ich habe so ein kann ich ja mal testen ob das geht

  6. Hallo und HILFE! Habe vergeblich versucht Joysticks mit deinem Code in mein Projekt zu integrieren aber es scheitert daran das fortlaufend MIDI signale gesendet werden obwohl ich den joystick nicht bewege… Kannst du bitte den sketch updaten mit einem smooth befehl und einem Multiplexer array (oder wie man das auch nennt) damit man den code einfach kopieren kann? Leider bin ich des programmieren nicht mächtig genug um mir selbst zu helfen… Mein projekt liegt deshalb zurzeit leider auf eis und ich würde mich sehr über deine hilfe freuen!!

Schreib einen Kommentar

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