Wireless Midi - So ganz geht's noch nicht...

Hallo zusammen!

Ich hab da ein Problem und komme gerade echt nicht weiter.

Ich habe mit zwei Nanos und zwei NRF24L01 eine Funk-Midi-Strecke gebaut. Auf dem Steckbrett funktionierte das Ganze sogar.
Nachdem ich die Hardware nun je in ein Gehäuse gepackt habe, kommt am Midi-Ausgang entweder gar nichts oder nur Schrott an.
Das Merkwürdige ist, dass wenn ich mit 9600 Baud am Serial Monitor lese plausible, richtige Daten ankommen. Ich vermute also, dass der (Funk-)Sender (Midi-Empfänger) vernünftig funktioniert und das Problem am (Funk-)Empfänger (Midi-Sender) liegt

Ich habe mittlerweile mehrfach die Midi Buchse mit Widerständen gewechselt, drei verschiedene Nanos ausprobiert, aber nichts hilft - ich weiß grade nicht mehr, wo ich weiter Fehler suchen soll.

Vielleicht bin ich gerade Betriebsblind und übersehe etwas total simples - daher hoffe ich, dass euer Blick vielleicht nochmal etwas Frische in die Fehlersuche bringt.

Also - Das Schema ist Folgendes:

Midi-Gerät-Out ==> [Midi-In=>Arduino=>NRF-Senden] ==> [NRF-Empfang=>Arduino=>Midi-Out] ==> Midi-Gerät-In

Die Schaltpläne habe ich angehangen.

Und hier noch der Code:

Wireless Sender:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(31250);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  if (Serial.available() > 0){
    for (int i = 0; i <= Serial.available(); i++){
      byte data = Serial.read();
      radio.write(&data, 1);
    }
  }
}

Wireless Empfänger:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

byte data;

void setup() {
  Serial.begin(31250);
  //Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    radio.read(&data, 1);
    //Serial.println(data); 
    Serial.print(data);
  }
}

Dir fehlen Stützkondensatoren an der NRF Stromversorgung (2 - 10 μF),
möglicherweise ist eine eigene 3.3V Versorgung für die NRFs nötig.

Deine loop des Senders ist sehr merkwürdig.

void loop() {
  if (Serial.available() > 0){
    for (int i = 0; i <= Serial.available(); i++){
      byte data = Serial.read();
      radio.write(&data, 1);
    }
  }
}

warum nicht einfacher, dafür aber mit Interesse am Ergebnis?

void loop() {
  if (Serial.available() > 0){
     byte data = Serial.read();
     if (!radio.write(&data, 1)) {
       Serial.print(F("tx failed"));
     }
  }
}

Warum willst du überhaupt jedes Byte einzeln in einem 32 Byte Paket verschicken?

Whandall:
Dir fehlen Stützkondensatoren an der NRF Stromversorgung (2 - 10 μF),
möglicherweise ist eine eigene 3.3V Versorgung für die NRFs nötig.

Okay. Die Übertragung funktioniert aber ja. Es kommen beim Empfänger ja vernünftige Daten an.

Whandall:
warum nicht einfacher, dafür aber mit Interesse am Ergebnis?

void loop() {

if (Serial.available() > 0){
    byte data = Serial.read();
    if (!radio.write(&data, 1)) {
      Serial.print(F("tx failed"));
    }
  }
}

Stimmt - die for-Schleife ist noch ein Überbleibsel aus der ersten Testphase. Dort wollte ich zunächst immer eine komplette Midi Nachricht am Stück übertragen (normalerweise zwei oder drei Byte - bei Systemexklusiven Nachrichten kann das aber schonmal mehr werden - die müsste man dann separat abfangen.)

Das letzte "Serial.print" bringt mir ja nichts, da an der Seriellen Schnittstelle ja Midi hängt.

Whandall:
Warum willst du überhaupt jedes Byte einzeln in einem 32 Byte Paket verschicken?

Ich wollte die Funkstrecke eigentlich so transparent wie möglich halten. Ich wollte halt weder am Sender, noch am Empfänger eine Auswertung des Midi-Protokolls machen, damit ich das ganze in ein Funkpaket verpacken kann.

Jetzt wäre die Gegenfrage:
Wie kann ich denn ein Byte einzeln übertragen?

Viele Grüße,
Ingo

Jetzt wäre die Gegenfrage:
Wie kann ich denn ein Byte einzeln übertragen?

Du solltest dir mal im Datenblatt das Kapitel zum Shockburst Protokoll ansehen.
Dort sind deine Möglichkeiten beschrieben.

gitarero:
Wie kann ich denn ein Byte einzeln übertragen?

void RF24::enableDynamicPayloads()

Enable dynamically-sized payloads

This way you don't always have to send large packets just to send them once in a while. This enables dynamic payloads on ALL pipes.