Phoniebox

Liebes Forum,
im August baute ich meinem Kind eine Phoniebox, weil mir die Kommerzielle Version einfach viel viel zu teuer in Anschaffung und neuen Figuren war.

Das Internet ist voll mit Ideen und Umsetzungen dazu, trotzdem habe ich ein wenig meine eigene Note dazu gedichtet.

Der Scetch funktioniert eigentlich super, nur in der Stromversorgung habe ich wohl irgendetwas verhauen.

Ziel war die Versorgung über eine eingebaute Powerbank und die automatische Abschaltung.
Deshalb wollte ich keinen einfachen menchanischen Schalter.

Im Anhang habe ich gemalt, was ich irgendwie zusammengelötet habe.

Die Plus- Leitungen gehen direkt an den DFPlayer, einen ServoMotor (er soll mal Augen bewegen) und einem Relaismodul mit 2 Wechslern.
Vor dem Arduino Nano musste ich eine Diode schalten, da sonst Störgeräusche aus dem DF Player kommen. Die kommen immer wenn beide Geräte an einer Stromquelle sind. Mit einer Diode am Arduino funktioniert es aber auch.

Die GND Seite ist die Steuerung.
Wenn ich S1 drücke, fließt der GND durch die Diode auf den IN1 des Relais, der ist auf GND gejumpert und lässt R1 anziehen, dann hält er sich selbst und versorgt die anderen Geräte mit GND.

Die Schalter S2 und S3 sind um Lauter und Leiser zu schalten und gehen auf D2 und D3 am Arduino.
Nach S1 geht es auch zum Arduino D7, getrennt durch eine Diode um den Schalter für Play/ Pause nutzen zu können.

Nicht aufgezeichnet habe ich die Verbindung Arduino D8 zum IN2 des Relais, der hebt die Selbsthaltung von Relais 1 wieder auf. Die habe ich mit einem Kondensator zu Plus unterstützt, da die Selbsthaltung sonst zu kurz unterbrochen war und sich noch hielt.

Die restliche Verdrahtung ergibt sich aus dem Sketch oder ist nicht wichtig.

#include <SPI.h>
#include <MFRC522.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Servo.h>
Servo myservo;
int pos = 0;

#define RST_PIN   9    
#define SS_PIN    10 

SoftwareSerial mySoftwareSerial(6, 4); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz des MFRC522 erzeugen

bool helfer = LOW; 
bool starter = LOW;
bool musikLaeuft = LOW;
bool aus = LOW;
long standby = 1;
long ruhezeit = 60000;

byte daten [][11] = {  
/*
 * [*] [0] = zugehörige Liednummer
 * [*] [1-11] = UID
 */

{2, 0x04, 0xE0, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Michelin   
{1, 0x04, 0xDC, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Eule
{3, 0x04, 0xD8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Spongebob
{4, 0x04, 0xE8, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Hai 
{5, 0x04, 0xED, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Leo Lausemaus
{6, 0x04, 0xF2, 0x2A, 0xDA, 0xAB, 0x5C, 0x80}, // Benjamin
{0}                                            // Zum Beenden der While
};

void setup() {
  pinMode(13,OUTPUT);   //kontroll LED
  pinMode(8,OUTPUT);    //Selbstmord
  pinMode(7,INPUT);     //Aus-Taste gedruekt?
  digitalWrite(7,HIGH);
  pinMode(2,INPUT);     //Lauter-Taste gedruekt?
  digitalWrite(2,HIGH);
  pinMode(3,INPUT);     //Leiser-Taste gedruekt?
  digitalWrite(3,HIGH);

  digitalWrite(8,HIGH);
  digitalWrite(13,LOW);
  
  myservo.attach(5);
  myservo.write(112);
  
  standby = ruhezeit;
  
  Serial.begin(115200);
  SPI.begin();
  mfrc522.PCD_Init();
  mySoftwareSerial.begin(9600);   //Kommunikation mit DFPlayer
  
  Serial.println();
  Serial.println(F("PhonieBox startet"));
  Serial.println(F("Initializing DFPlayer ... "));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Die Verbindung nochmals prüfen"));
    Serial.println(F("2.Bitte SD- Karte einlegen"));
    while(true){
      delay(0);
    }
  }
  Serial.println(F("DFPlayer Mini ist bereit."));
  
  myDFPlayer.volume(15);  //Lautstärke einstellen
  delay(2000);
}
void loop() {

  if (digitalRead(7) == HIGH) (starter = HIGH);    //damit man nicht beim Einschalten gleich das Ausschalten auslöst
  
   if (millis() % 1000 <= 10 ) {   //etwa jede Sekunde mal schauen ob die Musik läuft
   
    if (myDFPlayer.readState()== 513) {
     musikLaeuft = HIGH;
    }
    else {
      musikLaeuft = LOW;
    }
   }

  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    Serial.print("Gelesene UID:");
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    } 
    Serial.println();


   // UID Vergleichen
   int h = 0;
    do {
    helfer = true;

    for (int j=1; j<10; j++) {
      
      if (mfrc522.uid.uidByte[j-1] != daten [h] [j]) {
        helfer = false;
        break;
      }
      
    }
    if (helfer) {
      Serial.print(h);
      Serial.print(" erkannt");
      Serial.println();
        for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    } 
      if (daten [h][0] == 0 ) break; 
       myDFPlayer.play(daten [h] [0]);
      Serial.println();
      Serial.print ("Spielt Lied Nummer ");
      Serial.print (daten [h] [0]);
      Serial.println() ;
       break ;     //Schleife verlassen wenn er etwas gefunden hat
      }
      h = h +1;
    } while ( daten [h][0] != 0);

   // Hörer aufgelegt
   byte visa [] = { 0x04, 0x0B, 0x29, 0xDA, 0xAB, 0x5C, 0x81};
    
   // UID Vergleichen
     helfer = true;
    for (int j=1; j<7; j++) {
      if (mfrc522.uid.uidByte[j] != visa [j]) {
        helfer = false;
      }
    }
    if (helfer) {
      Serial.print("Hörer erkannt");
      Serial.println();
      aus = HIGH; 
      }

    // Versetzt die gelesene Karte in einen Ruhemodus
    mfrc522.PICC_HaltA();
    delay(1000);
  }

  if (digitalRead(3) == LOW) {   //Taster für Lauter
    Serial.print("Lauter"); 
     myDFPlayer.volumeUp(); 
     
    delay(200);   // bei gedrücktem Taster alle 0,2 Sekunden lauter
  } 
  
  if (digitalRead(2) == LOW) {   // Taster für Leiser
    Serial.print("Leiser"); 
    myDFPlayer.volumeDown();
    delay(200);  
  } 

  if (musikLaeuft == HIGH) (standby = millis()+ruhezeit);  // Wenn die Musik läuft, kann "Ruhezeit" ausgeschalten werden.
  //Serial.print("Standby: ");
  //Serial.println(standby); 
  //Serial.print("Millis: ");
  //Serial.println(millis());
  
  if (millis() >= standby) (aus = HIGH); // Lief die Musik "Ruhezeit" nicht, wird der Strom genommen


  
  if (digitalRead(7) == LOW && (starter == HIGH)) {    //Play/Pause
    if (myDFPlayer.readState()==513){
      myDFPlayer.pause();
    }
    else{
      myDFPlayer.start(); 
    }
    helfer = true;
     for (int i = 0; i <= 300; i++) { // wird der 3 sekunden nicht losgelassen
      if (digitalRead(7)== HIGH) {
        helfer = false;
        break;   // Abbrechen wenn innerhalb 3 Sekunden losgelassen wurde
        }
      delay(10);
     }
     if (helfer) {aus = HIGH;}  //Selbstmord
    
  }

  if (aus){
    myDFPlayer.pause();
    myservo.write(134);
    delay(200);
        digitalWrite(8, LOW);
        delay(10000);
     standby = millis()+ruhezeit;
     aus = LOW;
  }

}

}

Wie gesagt, der Sketch funktioniert, auch die Stromsache funktioniert. Aber die Sache ist instabil. Etwa im Sekundentakt flakert die D13 LED, auch der Servo zuckt im selben Takt obwohl er noch nicht wirklich was zu tun hat.
Und manchmal startet der Arduino einfach neu, meist wenn die Musik recht laut ist, aber auch mal wenn sie leiser ist. Dies merke ich nicht an der Musik, die läuft weiter. Aber eine stehende Figur wird neu erkannt und das Lied beginnt von Vorne.
Die selben "Ausfallerscheinungen" treten auch auf, wenn ich S2 oder S3 drücke, die Musik wird lauter/leiser, aber ich habe das Gefühl dem Arduino damit kurzzuschliesen.

Seit August läuft die Box mit diesen Meisen, ich würde sie gerne dann noch perfektionieren. Seht ihr einen groben Fehler in meiner Bastelei?

Liebe Grüße
Stefan

Leider ist dein Schaltbild sehr unverständlich.
Ich kann nicht erkennen, wie das funktioniert.

Und wenn du den Nano aus USB über die die Diode betreibst, kommen da nur noch ca. 4 Volt an, das kann zu wenig sein und den zum Absturz bringen, wenn dein DFPlayer bei lauter Musik auch Strom zieht.

So kann es nicht stabil laufen.

HotSystems:
Lider ist dein Schaltbild sehr unverständlich.
Ich kann nicht erkennen, wie das funktioniert.

Und wenn du den Nano aus USB über die die Diode betreibst, kommen da nur noch ca. 4 Volt an, das kann zu wenig sein und den zum Absturz bringen, wenn dein DFPlayer bei lauter Musik auch Strom zieht.

So kann es nicht stabil laufen.

Weil ich nicht so gut gezeichnet habe, dachte ich dass meine Worte es besser beschreiben was ich mir dabei gedacht habe.

Aber er spinnt ja ab und an auch mal bei leiser Musik rum. Das Bewegen des servos sogar immer.

Kann ich den Arduino auch mit 3,3 betreiben? Dann setze ich noch einen Spannungsregler mit rein.Oder muss ich dann alles mit 3,3 Volt betreiben?

Nein, den Nano kannst du nicht mit 3,3 Volt betreiben. Das entspricht nicht der Spezifikation. Es kann funktionieren, ist aber sehr ungewiss.

Du kannst statt des Nano einen Arduino Pro mini einsetzen, den gibt es auch für 3,3 Volt. dann kannst du auch den DFplayer mit 3,3V betreiben.
Allerdings funktioniert der Servo wohl nicht mehr.

Hast du einen Widerstand 1k in der Datenleitung zwischen Nano und DFplayer ?

Das mit deinen Relais verstehe ich aber nicht. Die verbrauchen doch viel zu viel Strom bei Betrieb.
Das könnte man mit Transistoren besser lösen.

Hi

Zu den Relais - Uwe hatte heute Read-Relais verlinkt (Reichelt), Die direkt am Arduino betrieben werden können und so einen pot.freien Kontakt bieten.

Ich geh Mal Suchen.

MfG

Edit
Der Einwand von HotSystems in #6, daß Wechsler verbaut sind, schließt Reed-Relais wohl aus - Nicht desto Trotz habe ich den Link zum Reed-Relais gefunden - allerdings nicht den Post, wo Der genannt wurde.
ReedRelais, 5V, Reichelt

HotSystems:
Nein, den Nano kannst du nicht mit 3,3 Volt betreiben. Das entspricht nicht der Spezifikation. Es kann funktionieren, ist aber sehr ungewiss.

Du kannst statt des Nano einen Arduino Pro mini einsetzen, den gibt es auch für 3,3 Volt. dann kannst du auch den DFplayer mit 3,3V betreiben.
Allerdings funktioniert der Servo wohl nicht mehr.

Hast du einen Widerstand 1k in der Datenleitung zwischen Nano und DFplayer ?

Das mit deinen Relais verstehe ich aber nicht. Die verbrauchen doch viel zu viel Strom bei Betrieb.
Das könnte man mit Transistoren besser lösen.

Hallo Dieter,
den 1k habe ich in der Datenleitung, aber er hilft nicht gegen das Brummen.
Auf den Servo könnte ich dann wohl verzichten, wenn es dafür dann richtig funktioniert. Aber vielleicht versuche ich vorher mal die Diode zu brücken, dann brummt zwar die Musik, aber ich sehe ob die Fehler dann verschwinden.

Die Relais-Lösung habe ich, weil ich es verstehe. Ich habe in meiner Ausbildung Schützschaltungen von oben bis unten durchgenommen, da sind die Relais in der Funktion einfach näher. Die Transistor-Geschichten sind mir einfach zu hoch.
Ich habe eine 10000mAh Powerbank dran, die schafft Musik und Relais eine ordentliche Zeit, über das Nachladen musste ich mich noch nicht aufregen.

Liebe Grüße

Hallo Postmaster-ino,

der TO nutzt "einem Relaismodul mit 2 Wechslern", da wird das kleine Readrelais wohl nicht reichen.

raznz_snasna:
den 1k habe ich in der Datenleitung, aber er hilft nicht gegen das Brummen.
.....

Die helfen auch nicht gegen das Brummen.
Die schützen den DFPlayer, der an den Datenlaitungen nur 3,3 Volt verträgt.

Versuche doch mal die Schaltung besser zu zeichnen, dann können wir auch eine Transistorschaltung besser vorschlagen.

Hallo Dieter,
Das habe ich mal schnell gemalt und per Handy geschrieben.
Liebe Grüße Stefan

raznz_snasna:
Hallo Dieter,
Das habe ich mal schnell gemalt und per Handy geschrieben.
Liebe Grüße Stefan

Prima, dass du es nochmal versucht hast, allerdings werde ich nicht schlau daraus, sorry.

Das einzige, was ich erkennen kann, du schaltest den GND vom Arduino. Das ist ein NO GO.
Man darf/sollte keinen GND einer elektronischen Baugruppe schalten. Damit kannst du den u.U. zerstören.

Evtl. ist es besser, wenn du noch mal verständlich beschreibst, was du mit den Taster und Relais erreichen möchtest.
Wenn du dann die Bezeichnungen der jeweiligen Kontakte mit nennst, können wir das evtl. mit der Schaltung verbinden.

Ok Dieter,
Mal sehen ob meine 1000 Worte jetzt mehr sagen als 2 Bilder....
Die Grundidee war eine Selbsthaltung, um wirklich aus zu sein.
Dafür habe ich mir ein Bauteil geholt, das 2 relais mit je einem Wechsler schaltet.
Die Haltung beginnt mit einem Druck auf S1, über den geschlossenen K2 wird relais 1 angezogen und hält sich selbst. S1 kann ich los lassen.
Irgendwann kommt aus dem arduino der Befehl über D8 das relais 2 anzuziehen. Dies öffnet die Selbsthaltung von relais 1 und alles schaltet sich aus.

Die Diode und der Eingang D7 am arduino habe ich genommen, um den Schalter S1 weiterhin zu nutzen. Trotz angezogenem K1, erkennt der arduino einen Druck auf S1.
Ich habe mich irgendwann dazu entschlossen GND zu schalten, ich glaube um am S1 den internen pullup nutzen zu können.
Die Schalter S2 und S3 schalte ich ebenfalls ab, damit nicht im aus Betrieb einer drauf drückt und über die Eingänge ein GND an den arduino kommt.
Nun nachvollziehbar?

Nochmal.....du darfst keinen GND von elektronischen Modulen schalten.
Das bringt dir Probleme bishin zur Zerstörung der Teile.

Ich schau gleich mal nach einer Selbsthalteschaltung mit Transistoren, die sich bewährt hat und weniger Strom braucht.
Das mit GND schalten, solltest du dir abgewöhnen.

Z.B. diese hier:
Ein_Auto_Aus.png

Es geht aber wenns muss auch einfacher. :wink:
Z.B. den R1, R3, C1 und Q2 weglassen und den S1 über den Q1 (Source und Drain) setzen.

Ein_Auto_Aus.png

Hi

Das Schalten von GND macht bei LED, Motoren, was-weiß-ich-für-Lasten Sinn.
Bei Elektroniken hast Du das Problem, daß durch diverse Schutz-Dioden irgend welche Potentiale irgendwo hin kommen, wo Die Nichts zu suchen haben.
So kann der Arduino dann auch anlaufen, wenn genug 'LOW' an irgend einem Pin anliegt - zumindest, bis die Schutzdiode, Die Das zu IHREM GND (Der in der Luft hängt) ableitet, verstorben ist.
Dem Arduino selber ist Es egal, woher der Potential-Unterschied zwischen Vdd und GND kommt, wenn's reicht, reicht's. Durch die dabei zusammen kommenden Ströme stirbt aber mit großer Wahrscheinlichkeit irgend etwas - und davor macht die Elektronik 'Unsinn' - oder zumindest nicht, was Du Dir gedacht hast.

MfG

Hallo alle zusammen und ein gesundes neues Jahr.

postmaster-ino:
Hi

Zu den Relais - Uwe hatte heute Read-Relais verlinkt (Reichelt), Die direkt am Arduino betrieben werden können und so einen pot.freien Kontakt bieten.

Ich geh Mal Suchen.

MfG

Edit
Der Einwand von HotSystems in #6, daß Wechsler verbaut sind, schließt Reed-Relais wohl aus - Nicht desto Trotz habe ich den Link zum Reed-Relais gefunden - allerdings nicht den Post, wo Der genannt wurde.
ReedRelais, 5V, Reichelt

Mein Modul hat zwar 2 Wechsler, ich nutze aber nur einen Schließer und am anderen einen Öffner. Leider gibt es deine Idee nicht als Öffner.

HotSystems:
Leider ist dein Schaltbild sehr unverständlich.
Ich kann nicht erkennen, wie das funktioniert.

Und wenn du den Nano aus USB über die die Diode betreibst, kommen da nur noch ca. 4 Volt an, das kann zu wenig sein und den zum Absturz bringen, wenn dein DFPlayer bei lauter Musik auch Strom zieht.

So kann es nicht stabil laufen.

Heute hat mein Kind angefangen zu drängen wann er seine Box wiederhaben kann.
Deshalb habe ich mal kurz mit einer einfachen Brücke versucht ob die Spinnereien verschwinden wenn ich die Diode brücke.
Die LEDs auf dem Arduino wurden heller, also die Brücke hat funktioniert. Allerdings hat es weiterhin gesponnen. Aber auch die Störgeräusche kamen nicht, die sonst immer auftraten.

HotSystems:
Nochmal.....du darfst keinen GND von elektronischen Modulen schalten.
Das bringt dir Probleme bishin zur Zerstörung der Teile.

Ich schau gleich mal nach einer Selbsthalteschaltung mit Transistoren, die sich bewährt hat und weniger Strom braucht.
Das mit GND schalten, solltest du dir abgewöhnen.

Z.B. diese hier:
Ein_Auto_Aus.png

Es geht aber wenns muss auch einfacher. :wink:
Z.B. den R1, R3, C1 und Q2 weglassen und den S1 über den Q1 (Source und Drain) setzen.

Beim GND schalten habe ich mir einfach nichts gedacht, wie gesagt ich fand es einfacher wegen den internen Pullups.

Ich gehe mal von aus dass ich dem Arduino schon kräftig einen mitgegeben habe mit meinen Experimenten.
Sie ist jetzt wieder zusammengebaut und spielt ihre Lieder.
Ich werde mich jetzt aber hinsetzen und die Geschichte nochmal neu planen, dieses mal mit der Unterprechung der 5V Leitungen. Die Diode für den Arduino werde ich auch erstmal drinnen lassen, ist erstmal weniger Aufwand. Sollte er sich da noch unterernährt verhalten, versuche ich mal einen Spannungswandler dazwischen zu schalten, der aus 5V 5V macht. Nur um Arduino und DFP zu trennen.

Die Transistorschaltung klingt besser. Strom- und Platzsparend. Aber ich muss weder Platz,noch Strom sparen.
Außer Widerständen habe ich aber keine Grundausstattung in Transistoren oder Kondensatoren. Das Relais ist halt schon da.
Und mir gefällt dass ich den An-Schalter auch als Eingang am Arduino habe. Bei deiner Schaltung weiß ich nicht ob ich da nun mal schnell eine Diode einschummeln kann.

Ich werde euch auf jeden Fall einbeziehen bevor ich wieder versuche daran rumzuschrauben.

Liebe Grüße
Stefan

Mein Vorschlag zu deinem "unorganisiertem Gebastel", baue diese Schaltung einfach neu auf und versuche das besser und optimaler hin zu bekommen.
Dann hat dein "Kind" weiterhin was zum Spielen und du kannst am neuen Projekt in Ruhe lernen, es besser zu machen.

Danke Dieter,
Nüchtern betrachtet hast du wohl einfach recht.
Ich bestelle mir alles neu (und doppelt, eine Kollegin fragt immer mal ob ich ihr auch eine baue) und dann wird es neu und besser.

Der Strom kommt bisher aus einer zerlegten power bank.
In neu würde ich lieber
1PCS 5V 1A Micro USB 18650 type c Lithium Battery Charging Board Charger Module+Protection Dual Functions TP4056 18650|battery bt50|usb solar charger batterybattery hand - AliExpress Laderegler und einen liion Akku nehmen.
Die vorgeschlagene transistor schaltung wird es wohl nicht, ich werde mit Lochraster arbeiten, also keine smd.
Aber ich werde bei transistor weiter suchen, dann wird es halt ein taster nur zum einschalten und ein anderer für pause. Dafür ist der Rest dann aber sauber.
Dann werde ich noch solch eine Verlängerung für sd Karten versuchen, dann muss ich nicht alles öffnen um eine neue mp3 drauf zu spielen. Die nfc Chips kann ich im Code schon vorbereiten.

Dann noch eine Gefühls Frage an euch.
Ist der nano hier die richtige Wahl oder soll ich wechseln?

Liebe Grüße

Der Nano ist bestens geeignet soweit ich das überschauen kann.

Allerdings hast du was von einer Diode geschrieben, um Störungen loszuwerden, da würde ich eher einen Kondensator ausprobieren. Die Diode senkt wie schon gesagt die Spannung, wenn der Nano darüber versorgt wird. Wenn der volle und saubere 5V hat ist das Problem ja vielleicht schon weg.

raznz_snasna:
.....
Die vorgeschlagene transistor schaltung wird es wohl nicht, ich werde mit Lochraster arbeiten, also keine smd.
Aber ich werde bei transistor weiter suchen, dann wird es halt ein taster nur zum einschalten und ein anderer für pause. Dafür ist der Rest dann aber sauber.
.....

Auch die SMD-Transistoren bekommst du auf die Lochraster-Platinen drauf.
Ich mache das bei meinen Lochraster-Aufbauten jedenfalls so und die funktionieren auch.
Wie hier auf der Musterplatine zu sehen ist:

Hallo Dieter,
danke für das motivierende Bild, scheint ja irgendwie zu funktionieren und ich denke auch dass ich das in die Richtung schaffe.

Nun ist alles in China bestellt und es heißt delay(30Tage).

Dank an alle

Jo

Allerdings kannst Du ja auch im Privaten eher millis() nutzen und musst nicht stehen bleiben, bis der Chinese das delay() ausgekostet hat :wink:
Viele Chinesen haben mittlerweile deutsche Lager - Da geht der Versand meist auch reddeldigutz.

MfG