SBUS und dfPlayer am Mega 2560

Hallo zusammen,

ich habe ja bereist eure fantastische Hilfe bei meinem beiden anderen Post (1. SBUS, 2. df Player) bekommen.

Jetzt versuche ich, beides miteinander zu „verheiraten“. Leider, wie ich befürchtete, ohne Erfolg.

Der serielle Monitor gibt nichts aus, ich denke, das liegt daran, das ich zwei serielle Schnittstellen verwende. Ton wird auch nicht abgespielt.

Jedenfalls habe ich folgendes vor:

Wenn ich einen bestimmten Wert über einen definiteren Kanal empfange, möchte ich, dass Lied 1 abgespielt wird. Das gleiche bei Lied 2-6.

Wenn ich den Beispiel Sketch vom SBUS verwende, kann ich diese Werte auch ermitteln. Diese frage ich in meinem Sketch auch ab.

Beides alleine funktioniert grundsätzlich: SBUS abfragen (und Servo steuern, aber das ist ein anderer Sketch und hat hier erstmal nichts mit zu tun) oder Lieder abspielen mit dem Beispiel Sketch von df player

#include "sbus.h"
#include <SoftwareSerial.h>
#include "DFRobotDFPlayerMini.h"

bfs::SbusRx sbus_rx(&Serial3);

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

#define FPSerial Serial2
void setup() {
  Serial.begin(9600);
  sbus_rx.Begin();
  FPSerial.begin(9600);
  delay(1);
  myDFPlayer.volume(10);
  delay(20);
}

void loop() {

  if (sbus_rx.Read()) {

    bfs::SbusData data = sbus_rx.data();
    data = sbus_rx.data();

    for (int8_t i = 0; i < data.NUM_CH; i++) {
      Serial.print(data.ch[i]);
      Serial.print("\t");
    }

    Serial.print(data.lost_frame);
    Serial.print("\t");
    Serial.println(data.failsafe);

    if (data.ch[12] == 221) {
      myDFPlayer.play(1);
    }
    if (data.ch[12] == 541) {
      myDFPlayer.play(2);
    }
    if (data.ch[12] == 862) {
      myDFPlayer.play(3);
    }
    if (data.ch[12] == 1183) {
      myDFPlayer.play(4);
    }
    if (data.ch[12] == 1504) {
      myDFPlayer.play(5);
    }
    if (data.ch[12] == 1824) {
      myDFPlayer.play(6);
    }
    delay(100);
  }
}

Kann mir wer helfen!!

Vielen lieben Dank im Voraus!

Gruß, Christoph

Hier ein BIld vom Aufbau. Sieht etwas wild aus, aber für alleine funktioniert es. Nur halt nicht in Kombination...

Der Mega hat 3 weitere serielle Schnittstellen, da brauchst du SoftwareSerial nicht zu verwenden.
Allerdings ist dein Slketch nicht verständlich, wie du die seriellen Schnittstellen jeweils zugewiesen hast. Das solltest du unbedingt aufräumen und für uns auch kommentieren, damit jeder erkennen kann, was du damit erreichen möchtest.

Hallo,
da fehlt meines Erachtens auch noch die Zeile
myDFPlayer.begin(FPSerial);

schau Dir das Beispiel aus der DF Player lib noch mal an

Okay und besten Dank! Kann ich rausnehmen, aber sollte eigentlich auch so funktionerien. Kommt noch aus dem Beispiel Sketch.
Und die seriellen habe ich wie folg zugewiesen(steht auch im Sketch)

sbus_rx(&Serial3)

#define FPSerial Serial2

hab im setup stehen:
FPSerial.begin(9600);

Ich kann das im setup auch noch ergänzen

Jupp, da könntest Du recht haben. Ich teste das gleich mal

Nur sieht man in drinem Sketch nichts davon.
Ok, habs nu gesehen. :wink:

Also warum noch SoftwareSerial?

War noch vom Beispiel..

Hab den Sketch jetzt geändert:

#include "sbus.h"
#include "DFRobotDFPlayerMini.h"

bfs::SbusRx sbus_rx(&Serial1);

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

#define FPSerial Serial2
void setup() {
  Serial.begin(9600);
  sbus_rx.Begin();
  FPSerial.begin(9600);
  delay(1);
  myDFPlayer.volume(10);
  delay(20);
  myDFPlayer.begin(FPSerial);
}

void loop() {

  if (sbus_rx.Read()) {

    bfs::SbusData data = sbus_rx.data();
    data = sbus_rx.data();

    for (int8_t i = 0; i < data.NUM_CH; i++) {
      Serial.print(data.ch[i]);
      Serial.print("\t");
    }

    Serial.print(data.lost_frame);
    Serial.print("\t");
    Serial.println(data.failsafe);

    if (data.ch[12] == 221) {
      myDFPlayer.play(1);
    }
    if (data.ch[12] == 541) {
      myDFPlayer.play(2);
    }
    if (data.ch[12] == 862) {
      myDFPlayer.play(3);
    }
    if (data.ch[12] == 1183) {
      myDFPlayer.play(4);
    }
    if (data.ch[12] == 1504) {
      myDFPlayer.play(5);
    }
    if (data.ch[12] == 1824) {
      myDFPlayer.play(6);
    }
    delay(100);
  }
}

Also, das hat noch keine Besserung gebracht...

Hast du denn mal probiert, ob der DFplayer für sich funktioniert ?
Also die Pins manuell betätigt.

Hallo,
Mmmm..

ich würde das ja tauschen , wie willst Du denn die Lautstärke einstellen wenn der DF noch nicht gestartet ist.

und nun , geht immer noch nicht ?

ich hatte doch geschrieben "schau Dir das Beispiel noch mal an ". Darin ist auch eine Fehlerbehandlung für die Verbindung enthalten. Das muss Du natürlich für Deine Schnittstelle anpassen.

if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){

geht denn der DF Player ohne die Abfrage von dem SBus ? Damit man mal schrittweise vorgehen kann.

Serial.print(data.ch[i]);

kommt da was an.

ja, der geht. Wie letztes Mal auch. Nur die Ansteuerung über SBSU nicht...

Wenn ich den Beispielskecht get Start nehme, dann ja.
In diesem hier wird gar nichts ausgegeben...

Hab den noch etwas erweitert. Sollte dann auch die Leidnummer ausgeben.

#include "sbus.h"
#include "DFRobotDFPlayerMini.h"

bfs::SbusRx sbus_rx(&Serial1);

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

#define FPSerial Serial2
void setup() {
  Serial.begin(9600);
  sbus_rx.Begin();
  FPSerial.begin(9600);
  delay(1);
  myDFPlayer.volume(10);
  delay(20);
  myDFPlayer.begin(FPSerial);
}

void loop() {

  if (sbus_rx.Read()) {

    bfs::SbusData data = sbus_rx.data();
    data = sbus_rx.data();

    for (int8_t i = 0; i < data.NUM_CH; i++) {
      Serial.print(data.ch[i]);
      Serial.print("\t");
    }

    Serial.print(data.lost_frame);
    Serial.print("\t");
    Serial.println(data.failsafe);

    if (data.ch[12] == 221) {
      myDFPlayer.play(1);
      Serial.println("Lied_1");
    }
    if (data.ch[12] == 541) {
      myDFPlayer.play(2);
      Serial.println("Lied_2");
    }
    if (data.ch[12] == 862) {
      myDFPlayer.play(3);
      Serial.println("Lied_3");
    }
    if (data.ch[12] == 1183) {
      myDFPlayer.play(4);
      Serial.println("Lied_4");
    }
    if (data.ch[12] == 1504) {
      myDFPlayer.play(5);
      Serial.println("Lied_5");
    }
    if (data.ch[12] == 1824) {
      myDFPlayer.play(6);
      Serial.println("Lied_6");
    }
    delay(100);
  }
}

Dann must Du jetzt mal rausbekommen was das ist, Du hast ja da mehrere Serielle ausgaben drin, so wirst Du nicht wissen was was ist. Also schreib dir noch was an Text davor.

Nachtrag
was jetzt doch keine Ausgabe ?

Ich denke Du analysierst das mal gründlich und meldest Dich dann noch mal.
Wenns an dem SBus liegt dann muss ich passen, da hab ich keine Ahnung von.

Die Ausgabe war falsch. Nach reset kam nichts mehr...

Grundsätzlich funktioniert beides für sihc allein, nur nicht in Kombination

Solange das kein Ergebniss bringt stimmt was nicht mit dem SBus, bzw dem Sketch-Teil dazu.

ich habe die Zeile

// void printDetail(uint8_t type, int value); auskommentiert.
Jetzt sehe ich auch, was vom SBUS ankommt..

Die Werte von Channel 12 ändern sich auch und demnach auch die Ausgabe Lied_1 bis Lied_6

Ahh,

in dem Beispiel des DF Players gibt es eine Funktion

void printDetail(uint8_t type, int value){
..
.

}

ganz am Ende , die hast Du gar nicht mit drin, eigentlich sollte das einen Fehler beim Compilieren ergeben.

Du kannst Die Zeile weglassen solange der DF Player läuft ansonsten solltes die die Funktion aber mit reinkopieren.

Merke : beim kopieren denken und alles was benötigt wird richtig mit kopieren