Redesign Tonuino für eine maximale Standby-Zeit

Hallo zusammen,

Da ich aktuell „Corona-Urlaub“ habe und somit etwas mehr Freizeit als erwartet, habe ich mir bzw. für meine beiden Töchter auch einen Tonuino nachgebaut. Leider ist mir dann aufgefallen, dass die Powerbank (10Ah) zu schnell leer geht. Ich habe dann mal ein paar unterschiedliche Dinge ausprobiert.

Normaler Stromverbrauch im Betrieb: 60-70mA
Stromverbrauch im Standby: 30mA
Sollte der Tonuino also garnicht verwendet werden, ist er nach ca. 13 Tagen leer, in der Regel war es eine starke Woche.

Ich habe dann zum einen mir den Code angeschaut und dann die einzelnen Komponenten. Dabei ist mir aufgefallen dass der DFplayer nicht richtig einschläft, bzw. im Sleep-Mode nur 2mA weniger benötigt. Also wusste ich, dass ich hier etwas verbessern kann. Außerdem gibt es bei der verwendeten Library des DFplayer keine Wake-Funktion. Da ich die Powerbank komplett in der Box verbaut habe und nicht durch einen extra Schalter trennen wollte, hab ich mir darüber auch ein paar Gedanken gemacht.

Ich verwende einen Arduino Nano. Bei diesem ist gibt es 2 Interrupt Pins um den Deep-Sleep-Mode Hardware-seitig zu unterbrechen. Leider sind Pin 2 und 3 schon belegt. Also musste ich hier etwas am Schaltplan ändern. Um den DFPlayer auch stromsparender zu bekommen, habe ich die Masse (GND) über einen Transistor gesteuert. Dieser wird nun von Pin 8 angesteuert. Somit kann der DFplayer komplett ausgeschaltet werden. Leider kann ich das RFID-Shield nicht auch über die Selbe weise deaktivieren, weil es irgendeine Verbindung zu den Bussen gibt und somit GND unterbrechen nicht das Shield komplett deaktiviert. Außerdem gibt es sehr unschöne Störgeräusche beim DFplayer.

Zusammengefasst ist nun bei mir:
DFplayer RX - Pin 6
DFplayer TX - Pin 5
Schalter zum Deaktivieren des Deep-Sleep - Pin 2
Transistor für DFplayer GND - Pin 8

Wenn nun alles schläft, dann komme ich auf 8mA. Da ich eine Powerbank habe, die sich nicht deaktivert bei <25mA, komme ich nun so auf ca. 50 Tage Standby-Zeit.

Ich musste natürlich auch ein paar Zeilen im Quellcode anpassen. Da muss ich aber noch einmal genau schauen, was ich alles umgebaut habe.

Fazit:
Ich habe nun eine 3x so lange Standby-Zeit und kann mit dieser Lösung über einen Knopf den Tonuino wieder anschalten. Theoretisch wäre es auch möglich über diesen Taster den Deep-Sleep manuell zu aktivieren.

Anbei habe ich einen Schaltplan angehängt wie es nun bei mir aufgebaut ist.

Bei Fragen und Anregungen stehe ich gerne zur Verfügung.

Gruß und schöne Ostern
Felix

6 „Gefällt mir“

Super Sache. Das wird dem ein oder anderen sicher helfen. Alternativ hättest du auch einen Kippschalter zum Unterbrechen der Stromversorgung einbauen können oder? Ist natürlich fraglich, ob die lieben Kinder dann auch immer die Box brav ausgeschaltet hätten :wink:

Ich habe die Powerbank direkt über den USB Anschluss des Nano verbunden. Somit hätte ich ein USB Kabel auftrennen müssen und die Leitungen sind auch schön dünn. So ist es natürlich eine Alternative.

Hier noch die Änderungen am Code die ich durchgeführt habe:

Zeile 8 hinzugefügt:

#define INT_PIN 2

Dann Zeile 26 die Pins für RX und TX geändert:

SoftwareSerial mySoftwareSerial(5, 6); // RX, TX

Zeile 642 hinzugefügt:

#define externalPin 8

Dann eine Funktion hinzugefügt für den Interrupt:

void INT_PINisr(void) {
  detachInterrupt(0);
}

Die Funktion checkStandbyAtMillis() sieht nun so aus:

void checkStandbyAtMillis() {
  if (sleepAtMillis != 0 && millis() > sleepAtMillis) {
    Serial.println(F("=== power off!"));
    // enter sleep state
    digitalWrite(shutdownPin, HIGH);
    delay(500);

    // http://discourse.voss.earth/t/intenso-s10000-powerbank-automatische-abschaltung-software-only/805
    // powerdown to 27mA (powerbank switches off after 30-60s)
    mfrc522.PCD_AntennaOff();
    mfrc522.PCD_SoftPowerDown();
    mp3.sleep();

    //Verbindung für externe Shields deaktivieren
    digitalWrite(externalPin, LOW);



    attachInterrupt(0, INT_PINisr,LOW);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
   //cli();  // Disable interrupts*
    sleep_mode();
   sleep_disable();
    //Verbindung für externe Shields aktivieren
    digitalWrite(externalPin, HIGH);
    mfrc522.PCD_SoftPowerUp();
    mfrc522.PCD_AntennaOn();
    mp3.reset();
    mp3.setVolume(volume);
    
    setstandbyTimer(); 
  }
}

Die die Setup-Funktion müssen folgende Sachen eingefügt werden:
Zeile 739:

//externe Shields anschalten
digitalWrite(externalPin, HIGH);

Zeile 763:

//Transistor-Pin für externe Shields
pinMode(externalPin, OUTPUT);

Zeile 816:

pinMode(INT_PIN, INPUT);
digitalWrite (INT_PIN, HIGH);

Das sollte es schon gewesen sein.
Wenn gewünscht, kann ich auch den ganzen Sketch zur Verfügung stellen.

Gruß
Felix

1 „Gefällt mir“

Den RFID Leser kennst du auch per Software schlafen schicken, der Verbrauch liegt dann bei wenigen uA.

Wie das geht steht im Datenblatt. (Ich weiß es leider gerade nicht mehr ausgeführt und Datenblatt an Handy lesen ist nicht so einfach)

Ja, korrekt!

Auszug aus dem Datenblatt von AZ-Delivery.

Danke,
Ich schau es mir morgen nochmal an.
Gruß

Hallo zusammen,

Ich habe es mir nun mit dem Hard-Power-Down angeschaut. Leider scheint es so zu sein, dass der NRSTPD-Pin nicht so einfach ran kommt. Auf Seite 7 sieht man den verwendeten Chip und es ist auch beschrieben, dass der NRSTPD Pin hart auf High gelegt ist. Also ist das nicht so einfach mal umgebaut. Und Software-mäßig lässt sich der RC522 leider nicht weiter herunter fahren.

Oder habe ich etwas falsch verstanden?

Gruß

Ich hatte behauptet, dass der nRST Pins der „Normale“ Reset Pin ist.
Wenn du den dauerhaft auf High setzt, ist der Chip im Power Down.

Und auch Software seitig gibt es ein Power Down Flag, dass aber nicht so viel Energie spart wie der Pins.

Cool Ef_von_Iks. Ich habe ein kleine Variation gebastelt, damit ich mit der Play-Taste die Tonuino wieder aufwachen kann und dazu keine extra Taste brauche. Dazu habe ich einfach der Play-Taste von A0 nach D5 umgestellt. Weil ich ein Arduino Nano Every benutze kann ich auch von D5 interrumpieren und noch immer Thorstens Platine verwenden. Mit der klassische Nano sollte es aber auch ueber D2 oder D3 gehen.

Der code (auf basis von der alternative firmware) findet man hier:

Ich werde demnaechst der Ausschaltung der MP3Player mit der Transistor ausprobieren.

1 „Gefällt mir“

Das wäre super, würde das gerne direkt vergleichen.

Ich habe das mit der hard power down mal ausprobiert und in mein git repo eingebaut. Das hat sich aber nicht gelohnt. Es funktioniert, aber spart soweit ich sehen kann kein Strom im Vergleich zu der ‚normale‘ soft power down. Laut Datasheet (https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf) sollte es auch nicht wirklich, auch in Soft power down sollte der Stromverbrauch nur 10 uA sein.

Ich hatte ebenfalls vor, den tonuino per Taste aufzuwecken. Das finde ich eleganter als einen eigenen Kippschalter, und so stelle ich sicher, dass das Abschalten nicht mal vergessen wird. Ich habe die Pause/Play-Taste genutzt, weil ich das für das einfachste Bedienkonzept halte.

Die Änderung dafür sind ziemlich einfach, wie von @Ef_von_Iks schön beschrieben, man muss lediglich Pin 2 (bei Verwendung des Nano) für die Aufwecken-Taste nutzen.
Ich habe den RX von Pin 2 auf 5 verlegt und Pause/Play von A0 auf 2. Sonst ist hardwareseitig nichts nötig. Danach die Interrupt-Prozedur und nach dem Sleep wieder „aufwachen“.

Aber: Mein MP3 Player funktioniert nach dem Aufwachen nicht mehr richtig. Habe einige Kombinationen probiert, das mp3.sleep() weg gelassen, vor dem Sleep nochmal reset durchgeführt usw.
Beim Verwendung von sleep() hatte ich Com error 2 und keine Funktion mehr. Ohne Sleep kommt nur Com error 126, wenn man eine Karte auflegt wieder Com error 126, und nach ca. drei Sekunden wird dann abgespielt, das ist dann für jeden neuen Vorgang so.

Ich habe im Code einige solcher Zeilen gefunden:

// mp3.sleep(); // Je nach Modul kommt es nicht mehr zurück aus dem Sleep!

Welche Player habt ihr im Einsatz? Funktioniert das zuverlässig?
Meine sind von AZDelivery, geliefert Ende November (einer war defekt - kein Ton aus dem Lautsprecher)

Ich habe das Konzept wegen des Player-Problems jetzt wieder fallen gelassen, und verwende die Abschaltung der Powerbank. Das Aufwachen funktioniert dann über die Powerbank-Taste… das führt halt zu einem vierten Button.

LG Ben

Ich bin mir nicht ganz sicher, aber ich denke, dass man die Pins des software serialports nicht so ohne weiteres umlegen kann. Die Kommunikation mit dem DF-Player läuft ja darüber. Vielleicht kommen deine Probleme ja daher. Vielleicht kann sich ja mal jemand dazu äußern, der da voll in der Materie steckt. Meine Programmierkenntnisse haben sich in den letzten Monaten zwar erheblich verbessert, aber manche dinge sind auch mir noch nicht 100% klar. Man lernt ja bekanntlich nie aus.

Nee nee da das ja SoftwareSerial ist, kannst du das auf (fast) jeden Pin umstellen. Die Probleme liegen beim df Player. Da sind halt oft bestimmte Funktionen nicht überall gleich implementiert. Grad die sleep Sache…

Das mit dem sleep des df Players kann ich aus eigener Erfahrung destätigen. Ich hatte noch KEINEN ! der sich über software wieder aufwecken ließ. Es war immer ein harter Reset durch trennen der Betriebsspannung nötig. Ich habe auch in meiner software die ganzen Mp3 sleep rausgeschmissen. Einzige Ausnahme beim Shutdown, da ja der Tonuino da ausgeschaltet wird und die Betriebspannung abgeschaltet. Achtung wenn am USB Port vom PC, muss trotzdem kurz der USB Stecker gezogen werden. Oder das mp3 sleep ganz deaktivieren.