DFPlayer Adkey1-Kontakt mit Arduino Nano schalten, aber wie?

Guten Tag liebe Community,

mein Name ist Cortes. Ich benötige eure Hilfe, da ich leider keine Lösung finde.

Ich möchte einen DFPlayer Mini (Adkey1-Pin) mit einem Arduino steuern.

Der Adkey1-Pin des DFPlayer muss auf GND gelegt werden, um einen Sound zu spielen.

Der Ausgang des Arduino liefert High-Pegel.

Immer wenn vom Arduino ein High-Pegel kommt, soll der Masse-Kontakt (Adkey1-Pin) am DFPlayer hergestellt werden.

Zwei Versuche habe ich bereits unternommen.

Versuch 1 mit NPN Transistor (BC547):

Digital-Pin vom Arduino über einen 10K Widerstand an die Basis. Collektor an Adkey1-Pin und Emitter an GND. KEIN Erfolg

Versuch 2 mit Quad Bilateral Switch (CD4016)

Pin 7 an GND und Pin 14 an +5 Volt

Digital-Pin vom Arduino an Pin 13 (CD4016 Control A) , Pin 1 (CD4016) an Adkey1 ( DFPlayer) , Pin 2 (CD4016) an GND.

Leider kein Erfolg

Was mache ich falsch, oder was übersehe ich?

Vielen lieben Dank im Voraus

Wozu willst Du da Transistoren einsetzen?
Laufen die beide an selber Versorgung? Ja?
Mache Dir einen Widerstand so um die 10-15K von adkey1 nach +5V.
Ach der wird ja schon HIGH gezogen.
Also nur:
Zwischen dem Nano und dem dfplayer verbinde die GND.
Den Arduino-Pin verbinde ebenfalls mit adkey1

Dann schreib in Deinem Code digitalWrite(arduinopin, LOW) wenn Du den adkey1 runterziehen willst.

Grundsätzlich stellt sich die Frage, warum Du das machen möchtest, da Du mit der seriellen Schnittstelle die volle Kontrolle über den Player haben könntest.

Nur für den Fall, Du wüstest das nicht.

Beachte dabei, der DFPlayer arbeitet intern mit 3,3Volt. Da kann es schnell passieren, dass du den mit 5Volt aus einem Arduino killst. Also doch besser mit einem Transistor ansteuern. Da läufst du keine Gefahr, den DFPlayer zu zerschießen.
Oder du steuerst den wie üblich per serieller Schnittstelle an.

@my_xy_projekt

Vielen Dank für deine Antwort

Der Nano und der DFPlayer ist mit GND verbunden.

Leider funktioniert das nicht, ich habe es soeben getestet.

@agmue

Vielen Dank für deine Antwort

Da ich in der Zukunft 8 DFPlayer ansteuern möchte.

HotSystems

Auch vielen Dank für deine Antwort

Leider funktioniert es bisher nicht.

Wenn Du GND mit adkey1 direkt verbindest, funktioniert es wie es soll?
Es könnte evtl. mit dem Spannungsteiler ein Problem sein.
Dann brauchst einen elektronischen Schalter mit sehr geringem Widerstand um sicherzustellen, das der Pegel an ad1 garantiert GND und nicht 0,xxV wird.

Ja, wenn Adkey1 direkt mit GND verbunden ist funktioniert es.

Leider aber nicht mit dem Arduino, deswegen der Test mit BC547 und CD4016.

Ich kann mir nicht erklären wieso es nicht funktioniert.

Dann zeige doch mal die Schaltung, wie du den Transistor einsetzt.
Ich vermute da deinen Fehler.
Dies hier könnte eine Hilfestellung für dein Vorhaben sein.

Ich möchte hier mal den Hintergrund meines Vorhabens näher erläutern.

Ich habe eine Drum Machine (Behringer RD6), welche ich über MIDI (UART) mit dem Arduino Nano, über einen Optokoppler, verbunden habe. Ich werte dabei drei MIDI Bytes aus (StatusByte, DataByte1, DataByte2), was auch wunderbar funktioniert.

Jetzt möchte ich, wenn die Bass Drum (MIDI Kanal10 Note 36) = (statusByte == 153 && dataByte1 == 36) sind, der Ausgang 4 des Arduino auf LOW-Pegel schaltet und somit den DFPlayer (Adkey1) triggert.

Leider scheint der DFPlayer (Adkey1 Eingang) nicht schnell genug schalten zu können, um das Sample abspielen zu können. Ein Test mit einer LED funktionierte problemfrei.

Im folgendem mein Sketch:

byte statusByte;
byte dataByte1;
byte dataByte2;

void setup(){
  pinMode(4, OUTPUT); // zum DFPlayer
  digitalWrite(4, HIGH);
  Serial.begin(31250); // MIDI Baud Rate
}

void loop(){
  empfangeMIDI();
  digitalWrite(4, HIGH);
}

void empfangeMIDI(){
  do {
    if (Serial.available()){
      
      statusByte = Serial.read();
      dataByte1 = Serial.read();
      dataByte2 = Serial.read();

     if (statusByte == 153 && dataByte1 == 36) { // Entspricht NoteOn MIDI Kanal 10 und Note Nr.36 (Bass Drum - Behringer RD6)
     
        digitalWrite(4, LOW);
        //delay(50);
      }
      
    }
  }
  while (Serial.available() > 2); //Ausführen, wenn mindestens 3 Bytes da sind
}

Das wird innerhalb von loop nie wieder HIGH.

Zum Testen Deiner Vermutung:

        digitalWrite(4, LOW);
        delay(50);  // diesen Wert variieren
        digitalWrite(4, HIGH);

Ich bitte um Entschuldigung, beim Bereinigen des Quelltextes für das Forum, habe ich die Zeile „digitalWrite(4, HIGH);“ , im Loop unterhalb „empfangeMIDI();“ übersehen.

Ich habe es oben angepasst....

Ich habe den Befehl natürlich in meinem Quelltext. Wie gesagt das Programm funktioniert fehlerfrei, das Problem liegt am DFPlayer.

Deine Routine Arbeit ohne delay(), da auskommentiert, evtl. reicht die Zeit nicht, dass der dfplayer hier ein Schaltsignal am Adkey1-Eingang erkennt. Der Impuls ist zu kurz.

Der Adkey-Eingang wird normalerweise mit verschiedenen Widerständen beschaltet, um diverse Funktionen auszulösen. Evtl. Liegt der Pegel knapp über GND, so dass nicht die 1. Sounddatei abgespielt wird, sondern eine andere.

Ich würde auch mal die empfangenen Midi-Bytes am seriellen Monitor anzeigen lassen, ob überhaupt etwas ankommt.

Ne falsch - das ist nicht das schalten ansich, sondern der Pegel, der vermutlich nicht passt.

Kannst Du mal bitte vom ad1 (also abgehen vom collector oder vom ad1 Pin) eine Verbindung zum A0 des Arduino herstellen und mal den Pegel messen?
(Wobei ich dein do while nicht gut finde...)
und mal folgenden Sketch laufen lassen?

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..:"));
  pinMode(4, OUTPUT);
}
unsigned long lastmillis = 0;
void loop()
{
  if (millis() - lastmillis > 1000)
  {
    lastmillis = millis();
    digitalWrite(4, !digitalRead(4));
  }
  Serial.println(analogRead(A0));
}

was kommt auf dem SerMon raus? (Geschwindogkeit beachten!)
@domapi war etwas schneller :wink:

Doch ein Fehler im Programm, denn der LOW-Impuls muß bei meinem Player (zusammen mit ESP32) größer 800 ms sein, damit die Musik startet.

@domapi

Ja, ich bin mir sehr sicher das der Impuls zu kurz ist.

Die drei MIDI Bytes werden richtig im seriellen Monitor angezeigt.

@my_xy_projekt

Vielen lieben Dank für den Sketch.

Die erste Messung ergab einen Wert von ca. 700, gemessen am Adkey1.
Die zweite Messung ergab einen Wert von ca. 19, gemessen am Collector des durchgesteuerten Transistor.

das passt mit meinem rudimentärem Aufbau.
Damit reicht es nicht.
Du bekommst den Pin nicht auf LOW gezogen.

Was könnte ich jetzt unternehmen?

Das kommt auf den Anwendungsfall an.
Ggfls. mit nem parallel laufenden Widerstand zwischen emitter und collector den Spannungsteiler kleiner machen.

 |
| |
| | interner R
| |
 |
-+-df.pin--+-----+
           |     |
          /  C  | |
ardu.Pin-|      | |
          \  E  | |
           |     |
           *     *
          GND   GND

Oder das ganze nicht mit nem BC sondern nem Logic-Level Fet.

Vielen lieben Dank für all eure Mühe und Zeit.

Ich werde weiter experimentieren und eventuell finde ich noch eine Lösung.

An welcher Stelle hakt es denn noch?