Hilfe bei Arduino MIDI

Das ist richtig.
Das auslesen funktioniert nach links und das schreiben nach rechts.
Darum ist das seitenverkehrt.
Das kann man ändern.
Ich will nur, dass erstmal alles funktioniert.
Die Anpassung der Schreib/Lese-Richtung ist dann das Sahnehäubchen.

Und hör auf mich zu siezen.

also die ersten 8 funktionieren tadellos , habe im Moment nicht mehr LED-s angesteckt

1 Like

Dann machen wir für heute Schluß.
Ich freue mich, dass die Idee funktioniert.
Morgen dann die Richtungsänderung und Du kannst Dich mit deinen restlichen LED beschäftigen.

Es hat mir Spaß gemacht.

freu mich schon , habe mir aus China Taster mit LED bestellt , dann kann ich morgen beginnen die Platinen zu zeichnen , habe das immer aufgeschoben da die Hauptplatine nicht funktioniert hat . Vielen Dank und Gute Nacht !

1 Like

Tausch mal:

void setLedState()
{
  Serial.println(F("LED-OUT Start"));
  Serial.print(F("LED-Data: "));
  digitalWrite(shiftClockPin, LOW);
  digitalWrite(out.dataPin, LOW);
  digitalWrite(out.latchPin, LOW);
  int chip = shiftRegs-1;
  int pin = pinsOnRegs-1;

  for (; chip >= 0 ; chip--)  // Zähle durch die Chips
  {
    for (; pin>=0; pin--)     // Zähle die Pins je Chip
    {
      Serial.print(out.ch[chip].outPinState[pin]);
      Serial.print(", ");
      digitalWrite(out.dataPin, out.ch[chip].outPinState[pin]);
      digitalWrite(shiftClockPin, HIGH);
      digitalWrite(shiftClockPin, LOW);
      digitalWrite(out.dataPin, LOW);
    }
  }

  Serial.println(F("\r\nLED-OUT END\r\n"));
  digitalWrite(out.latchPin, HIGH);
  digitalWrite(out.latchPin, LOW);
}

Kontrolliere die Ausgabe auf dem SerMon.


Guten Morgen , das ist das dritte Eingangsregister , die Ausgabe findet auf dem 1. Ausgangsregister statt (so wie die Reihenfolge jetzt ist stimmt dann auch mit der Reihenfolge auf auf meiner Platine das waere perfekt , denn auch mit diesem code vom ersten Post war es verkehrt ) , es funktioniert aber nur das dritte Eingangsregister , bei den anderen tut sich nichts


Entschuldigung war nur der untere Teil zu sehen , auf dem man nichts sehen kann. Meinetwegen kann der code auch so bleiben , das macht nichts aus ,da ich die Eingaenge und Ausgaenge je 8 separat herausgefuehrt habe , dann werden eben die Kabel passend angesteckt und gekreuzt . Schoenen Tag !

Huch..:eyes:
Ich steig in ner halben Stunde um, dann hab ich nen Moment Zeit.

:man_facepalming:alt:

  int chip = shiftRegs-1;
  int pin = pinsOnRegs-1;

  for (; chip >= 0 ; chip--)  // Zähle durch die Chips
  {
    for (; pin>=0; pin--)     // Zähle die Pins je Chip
    {

Neu:

  int chip = shiftRegs-1;
  
  for (; chip >= 0 ; chip--)  // Zähle durch die Chips
  {
    int pin = pinsOnRegs-1;
    for (; pin>=0; pin--)     // Zähle die Pins je Chip
    {

Habe gerade eine kleine Pause nach der Gartenarbeit eingelegt , es ist jetzt schon zu heiss draussen und habe den code veraendert . jetzt ist alles so wie es sein soll.


Habe heute am Morgen alle LED angeschlossen , es laeuft wie es soll jetzt , ich habe schon eine Variante des Tasterboards gezeichnet , will aber noch etwas daran aendern .Freue mich riesig dass ich die Schaltplatine doch verwenden kann fuer genau diese Steuerung .

ja , finde mich sehr gut zurecht !
Waere ,wenn es nicht geklappt haette auf was einfacheres mit Arduino Leonardo und 16 Tastern( ohne LED Anzeige leider ) umgestiegen , die Arduinos habe ich schon zu Hause geliefert bekommen.Vielen lieben Dank fuer die Zeit !

1 Like

Das hört sich super an.
Dann ist hier für die Nachwelt der Code komplett.
Wenn Du Fragen hast, dann frag.
Auch wenn sich später mal was ergibt, dass Du das erweitern willst.

#include "MIDIUSB.h"

constexpr uint8_t shiftRegs {3};                      // Anzahl ShiftRegister - IN und OUT sollen die gleiche Anzahl haben!
constexpr uint8_t pinsOnRegs {8};                     // Anzahl Pins am Register - Für beide gleich!

constexpr bool isPressed {LOW};                       // Vorbelegung Taste aktiv

constexpr bool ledOn {HIGH};
constexpr bool ledOff {!ledOn};

constexpr uint32_t debounceTime {50};                 // Entprellzeit in ms / Abfrageintervall

constexpr uint8_t midiChannel {0};
constexpr uint8_t anschlag {127};                     // MidiNote

struct CHIPIN                                         // Input Chip 4021 - was zusammengehört
{
  bool pinState[pinsOnRegs];                          // Zustand der Taste - HIGH/LOW
  bool lastPinState[pinsOnRegs];                      // Letzter Zustand der Taste
};

constexpr uint8_t shiftClockPin {2};                  // erklärt sich selbst

struct IN                                             // Input Kaskade
{
  static constexpr uint8_t latchPin {3};
  static constexpr uint8_t dataPin {4};
  uint32_t pinTime;                                   // Zeitpunkt letzte Abfrage

  CHIPIN ch[shiftRegs] =
  {
    {{0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, },},       // {pinStatus}, {lastPinStatus},
    {{0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, },},
    {{0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, },},
  };
} in;

struct CHIPOUT                                        // Output Kanal - was zusammengehört (und für die gleiche Darstellung im Code)
{
  bool outPinState[pinsOnRegs];                       // 8 PIN je Chip - jeweils 1 LED
  // HINWEIS: Ich habe mich gegen das durchzählen entschieden Es kann für jede Taste die Note festgelegt werden!
  const uint8_t note[pinsOnRegs];                     // Note die ausgegeben wird
};

struct OUT
{
  static constexpr uint8_t latchPin {5};
  static constexpr uint8_t dataPin {6};
  CHIPOUT ch[shiftRegs] =    // Wie IN
  {
    {{0, 0, 0, 0, 0, 0, 0, 0,}, {20, 21, 22, 23, 24, 25, 26, 27,},}, // {LED-Status}, {Note}
    {{0, 0, 0, 0, 0, 0, 0, 0,}, {28, 29, 30, 31, 32, 33, 34, 35,},},
    {{0, 0, 0, 0, 0, 0, 0, 0,}, {36, 37, 38, 39, 40, 41, 42, 43,},},
  };
} out;

void setup()
{
  Serial.begin(115200);
  MidiUSB.flush();                                     // Initialize the MIDIUSB library
  pinMode(shiftClockPin, OUTPUT);
  digitalWrite(shiftClockPin, HIGH);
  initShiftIn();
  initShiftOut();
}

void loop()
{
  if (millis() - in.pinTime > debounceTime)
  {
    getShiftInData();
    setShiftOutData();
  }

  // Mididaten wiederholen?
}

void initShiftIn()                                     // Initialisation und Vorbelegung
{
  pinMode(in.latchPin, OUTPUT);
  digitalWrite(in.latchPin, LOW);
  pinMode(in.dataPin, INPUT);
  getShiftInData();
}

void initShiftOut()
{
  pinMode(out.latchPin, OUTPUT);
  digitalWrite(out.latchPin, LOW);
  pinMode(out.dataPin, OUTPUT);
  digitalWrite(out.dataPin, LOW);
  setShiftOutData();
}

void shiftReadStart()                                  // Startsequenz zum lesen
{
  digitalWrite(shiftClockPin, HIGH);                   // Vorbereitung zum Takten
  digitalWrite(in.latchPin, HIGH);                     // Vorbereiten zum auslesen
  delayMicroseconds(20);
  digitalWrite(in.latchPin, LOW);
}

void shiftTakt()
{
  digitalWrite(shiftClockPin, LOW);                    // Takt zum schieben
  delayMicroseconds(2);
  digitalWrite(shiftClockPin, HIGH);
}

void getShiftInData()                                  // Liest alle Register ein
{
  shiftReadStart();

  for (uint8_t chip = 0; chip < shiftRegs; chip++)     // Zähle durch die Chips
    for (uint8_t pin = 0; pin < pinsOnRegs; pin++)     // Zähle die Pins je Chip
    {
      in.ch[chip].pinState[pin] = digitalRead(in.dataPin); // Status übernehmen
      shiftTakt();
    }

  in.pinTime = millis();                               // Auslesezeit merken
}                                                      // Alle Pins ausgelesen

void setLedState()
{
  Serial.println(F("LED-OUT Start"));
  Serial.print(F("LED-Data: "));
  digitalWrite(shiftClockPin, LOW);
  digitalWrite(out.dataPin, LOW);
  digitalWrite(out.latchPin, LOW);
  int chip = shiftRegs - 1;

  for (; chip >= 0 ; chip--)  // Zähle durch die Chips
  {
    int pin = pinsOnRegs - 1;

    for (; pin >= 0; pin--)   // Zähle die Pins je Chip
    {
      Serial.print(out.ch[chip].outPinState[pin]);
      Serial.print(", ");
      digitalWrite(out.dataPin, out.ch[chip].outPinState[pin]);
      digitalWrite(shiftClockPin, HIGH);
      digitalWrite(shiftClockPin, LOW);
      digitalWrite(out.dataPin, LOW);
    }

    Serial.println();
  }

  Serial.println(F("\r\nLED-OUT END\r\n"));
  digitalWrite(out.latchPin, HIGH);
  digitalWrite(out.latchPin, LOW);
}

void setShiftOutData()
{
  bool isNew = false;

  for (uint8_t chip = 0; chip < shiftRegs; chip++)                         // Zähle durch die Chips
  {
    for (uint8_t pin = 0; pin < pinsOnRegs; pin++)                         // Zähle die Pins je Chip
    {
      if (in.ch[chip].pinState[pin] != in.ch[chip].lastPinState[pin])      // Das BIT hat sich geändert?
      {
        if (in.ch[chip].pinState[pin] == isPressed)                        // Taste gedrückt?
        {
          out.ch[chip].outPinState[pin] = !out.ch[chip].outPinState[pin];

          if (out.ch[chip].outPinState[pin] == ledOn)                      // Ist nicht gesetzt ?
          { noteOn(midiChannel, out.ch[chip].note[pin], anschlag); }       // Note senden
          else                                                             // War gesetzt ?
          { noteOff(midiChannel, out.ch[chip].note[pin], 0); }             // Note löschen

          isNew = true;
        }
      }

      in.ch[chip].lastPinState[pin] = in.ch[chip].pinState[pin];           // Status merken
    }
  }

  if (isNew)
  { setLedState(); }
}

void controlChange(byte channel, byte control, byte value)
{
  byte chan = 0xB0 | channel;
  midiEventPacket_t event = {0x0B, chan, control, value};
  MidiUSB.sendMIDI(event);
  MidiUSB.flush();
}

void noteOn(byte channel, byte pitch, byte velocity)
{
  byte chan = 0x90 | channel;
  midiEventPacket_t noteOn = {0x09, chan, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
  MidiUSB.flush();
}

void noteOff(byte channel, byte pitch, byte velocity)
{
  byte chan = 0x80 | channel;
  midiEventPacket_t noteOff = {0x08, chan, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
  MidiUSB.flush();
}

Ich würd mich freuen, wenn Du den dann als gelöst kennzeichnest - da das auch ein Merkmal in der Artikelsuche ist :slight_smile:

1 Like

Habe es auch vorhin mit der Software der virtuellen Pfeifenorgel getestet , wird erkannt und schaltet wie es soll .

wie mache ich das ?
Nochmals vielen vielen Dank fuer die Zeit und Muehe !

Bei der passenden Antwort von my_xy_projekt hier klicken: grafik

1 Like

Danke und schoenen Nachmittag noch !

1 Like

Um auch anderen beim Nachbau behilflich zu sein fuege ich auch die PDF Dateien der Platine hinzu , sowie ein Bild mit Erklaerungen zur Bestueckung und Anschluesse an die Platine . Habe zwei PDF-s angehaengt , eines nur Kupferseite und anderes auch mit Bestueckung und Drahtbruecken , da die Forumssoftware keine EAGLE Dateien zulaesst. Vielen Dank !
PS : auch EAGLE Datei hinzugefuegt !


MIDI IN OUT BOARD Modificat.pdf (53.9 KB)
MIDI IN OUT BOARD Modificat 2.pdf (26.4 KB)
MIDI IN OUT BOARD Modificat.zip (11.0 KB)

Wäre in einem .zip-File gegangen :slight_smile:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.