Strom über 18650 Battery Shield mit Überwachung

Hallo zusammen,

bin kürzlich im Netz über den Tonuino gestolpert und hab mir gleich bei AZDelivery alle Bauteile incl. dem 18650 Battery Shield V3 bestellt. Fliegende Verdrahtung + Tonuino DEV Version hat auf Anhieb geklappt - abgesehen von den Querelen mit dem GD3200B auf dem DFPlayer, da bastle ich noch am Code um mit ein paar häßlichen Hacks die gröbsten Probleme gebacken zu bekommen.

Zu meinem aktuellen Problem: Ich möchte gerne, dass der Tonuino bei niedrigem Ladezustand des Akkus eine Aufforderung ausgibt, das Gerät zu laden (Die Kollegen in der Arbeit meinten mal, LiIo Akkus leiden sehr am oberen und unteren Ende des Ladezustands… daher die Idee mit der Warnung). Idee ist, den 3V Ausgang des Battery Shield im Arduino zu überwachen und eine Warnung auszugeben, wenn die Spannung zu gering wird. Sollte klappen, da die 3V über einen Längsregler erzeugt werden, der am Ausgang unter 3V fällt, sobald die Akkuspannung nicht mehr hergibt. .

Zum Test-Setup:

  • Arduino hängt via USB am PC - Stromversorgung und Datenverbindung (hoffe das bringt keine Dreckeffekte mit sich)
  • Das Battery Shield ist mit einem 18650 LiIo Akku bestückt, der im mittleren Ladebereich ist (ca. 3.5V gemessen)
  • der 3V Ausgang des Battery Shield ist an Pin A0 des Arduino angeschlossen
  • das Programm auf dem Arduino gibt zyklisch die gemessene Spannung von Pin A0 aus:
   int analogvalue = analogRead(A0);
   float temp = (analogvalue * 5.0) / 1024.0;

Meine Fragen:

  • das Battery Shield erzeugt keine 3V am 3V-Ausgang, sondern (gemessen mit Multimeter) ca. 3.3V - kann das jemand bestätigen bzw. erklären?
  • Der Arduino wiederrum misst keine 3.3V an A0, sondern eher ca. 3.6V (Versorgung des Arduino via USB an PC, sonst ist das Auslesen eher aufwändig) - meine Interpretation: der 5V-Pin am Arduino liefert ca. 4.6V, nehme ich das als „5V-Referenz“ sind die 3.3V schon gute 3.5V (jetzt habe ich meine Frage wohl selbst beantwortet :smirk:)
  • Die gemessen Spannung an A0 zappelt ziemlich herum von 3.54V bis 3.67V - hätte ich nicht erwartet vom Battery Shield (hätte auch ein Screenshot anzubieten, nur keine Ahnung wie ich ihn hier reinbekomme) - gibt es da eine gute Erklärung?

Ich denke das Zappeln auf dem Messwert ist zwar recht hoch, sollte aber leicht zu entrauschen sein über mehrere Samples. Nur: warum zappelt es so? Ist der analoge Input grundsätzlich so verrauscht? Oder Kommt das Zappeln vom Battery Shield? :thinking:

Danke schonmal für den einen oder anderen Hinweis!

Für die tl;dr- Fraktion:

  • Gibt das Battery Shield 3.3V am 3V Ausgang aus?
  • Rauschen die analogen Eingänge des Arduino so heftig oder rauscht die 3V Versorgung des Battery Shield?

VG, Rob

Das Shield rauscht.

Ich habe es versucht und es ist quasi unmöglich den Ladezustand des Shields zu messen.

3,3V sind normal, das soll so.

hättest du die All in One Platine der Leiterkartenpiraten gekuaft, wäre es problemlos gegangen den Akku sauber zu messen.

Off Topic: Oder du bestellst dir - falls das mit den Modifikationen nicht klappt - alternativ den LKP Player, machst das Update auf v6.8 und solltest hoffentlich weniger Probleme haben.

Wow, ihr seid ja schneller als der Wachtmeister Dimpfelmoser erlaubt, herzlichen Dank für die schnellen und kompetenten Antworten!

Auf die Leiterkartenpiraten bin ich leider erst gestoßen als das ganze Material schon angekommen war, hatte den Tipp mit AZDelivery von Thorstens Seite … meine Info war wohl etwas veraltet :smirk:

Blockzitat
Das Shield rauscht.
Ich habe es versucht und es ist quasi unmöglich den Ladezustand des Shields zu messen.
3,3V sind normal, das soll so.
hättest du die All in One Platine der Leiterkartenpiraten gekuaft, wäre es problemlos gegangen den Akku sauber zu messen.

Bin mir nicht sicher, was du mit „quasi unmöglich“ meinst, ob das Rauschen zu hoch ist, oder ob der Abfall unterhalb der 3.3V nicht sichtbar ist. Jedenfalls bin ich einen Schritt weiter und habe das ganze mal geglättet - mein Multimeter scheint das auch zu machen, zeigt stabile 3.3V an. Meine Ausgabe jetzt auch:

Blockzitat
Voltage= 3.62 Volts from reading 734 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 746 from Pin A0
Voltage= 3.62 Volts from reading 747 from Pin A0
Voltage= 3.62 Volts from reading 739 from Pin A0
Voltage= 3.62 Volts from reading 751 from Pin A0
Voltage= 3.62 Volts from reading 751 from Pin A0
Voltage= 3.62 Volts from reading 729 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 732 from Pin A0
Voltage= 3.62 Volts from reading 741 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 736 from Pin A0
Voltage= 3.62 Volts from reading 750 from Pin A0
Voltage= 3.62 Volts from reading 747 from Pin A0
Voltage= 3.62 Volts from reading 744 from Pin A0
Voltage= 3.62 Volts from reading 730 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 730 from Pin A0
Voltage= 3.62 Volts from reading 743 from Pin A0
Voltage= 3.62 Volts from reading 751 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 735 from Pin A0
Voltage= 3.62 Volts from reading 749 from Pin A0
Voltage= 3.62 Volts from reading 740 from Pin A0
Voltage= 3.62 Volts from reading 748 from Pin A0
Voltage= 3.62 Volts from reading 731 from Pin A0
Voltage= 3.62 Volts from reading 729 from Pin A0
Voltage= 3.62 Volts from reading 742 from Pin A0

Ermittelt mit

/*************************************************************
 * measure Bat Shield Voltage
 *************************************************************/

#define ALPHA ((float)0.03125)
static float voltage=4.2; // start voltage estimation from 4.2V 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
    int analogvalue = analogRead(A0);
    float temp = (analogvalue * 5.0) / 1024.0;  // Scale to real value with 5V reference
    voltage = ALPHA*(temp-voltage)+voltage;     // smoothing with first order recursive filter
    Serial.print("Voltage= ");                 
    Serial.print(voltage);
    Serial.print(" Volts from reading ");
    Serial.print(analogvalue);
    Serial.println(" from Pin A0");
    delay(1000);
}

Jetzt schau ich mal, was unterhalb 3.3V passiert …

Und wenn der GD3200B mich noch länger ärgert …

Blockzitat
Off Topic: Oder du bestellst dir - falls das mit den Modifikationen nicht klappt - alternativ den LKP Player, machst das Update auf v6.8 und solltest hoffentlich weniger Probleme haben.

Dann mach ich das :smiley: Die Elternzeit hat ja gerade erst begonnen, wenn das Ding in 2 Jahren läuft reicht das für meinen Kleinen - da hab ich noch ein wenig Zeit zum Basteln :wink:

Danke nochmal und einen schönen Abend euch beiden!

Rob

Du musst die Akkuspannung am Akku messen.
Bin mir nicht sicher ob der 3V Auagang nicht auch geregelt ist, dann ist die Messung dort für die Katz.

Keine Ahnung ob dir das hilft. Das sind die bisher hier im Forum diskutierten Anpassungen nach Problem sortiert, die ich mir mal zusammengesammelt habe.

spielt den mp3-Ordner (Ansagen) nicht ab

  • zusätzliche Zeichen hinter den Zahlen entfernen (Bericht hier)
  • einen anderen Ordner für die Ansagen verwenden Link

ermittelt immer Anzahl der Tracks des aktuell abgespielten Ordners

  • etwas aus dem Ordner abspielen, bevor die Anzahl der Tracks ermittelt wird (Beispiel für die Codeanpassung)
  • Es ist auch möglich anstatt eine stille mp3 abzuspielen vorher die Lautstärke auf 0 zu setzen, dann abzuspielen und hinterher die Lautstärke wieder zu erhöhen. (Codebeispiel)

sendet ein TrackFinish-Event nach einem Advert

  • TrackFinish abfangen, wie hier beschrieben

Hm, da hast du im Prinzip Recht. Habe hier ein wenig Info zum Battery SHield gefunden: SEGOR-electronics GmbH - 18650 Battery Shield Nachdem der 3V Ausgang über einen Längsregler realisiert ist, sieht man die Akkuspannung wenn sie unter 3.3V fällt am Ausgang des Längsreglers (siehe auch https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Ser_stab.svg/640px-Ser_stab.svg.png, U_A = U_E wenn U_CE ~ 0, und das sollte der Fall sein unterhalb 3.3V).

Jedenfalls mal ausprobiert, und es funktioniert ziemlich gut zusammen mit dem entrauschten Messwert. Muss nur noch richtig kalibriert werden, da die „5V“ Arduino-intern nur 4.67V sind wenn mit USB versorgt.

Ich habe das ganze mit einer State Machine verknüpft um Restrauschen/Lastschwankungen zu stabilisieren. Geht ganz ordentlich bei meinem Setup:


Jetzt muss ich das „nur noch“ mit dem Tonuino verheiraten :wink:

Der Code dazu wird etwas zu lang um ihn hier zu posten, kann ich bei Interesse aber gerne weiterleiten :slight_smile:

VG, Rob

Top, danke! Das sollte helfen :grin: Und falls ich die Geduld verliere steige ich auf den LKP Player um …

VG, Rob

Das Shield schaltet von selbst ab bei zu niedriger Spannung.

Du wirs nach dem Regler keine zuverlässige Auswertung hin bekommen, aber probiers.

  • ja, das passiert an der Tiefentladeschwelle, um den Akku vor massivem Schaden zu bewahren. Allerdings ist es ratsam, den Akku nicht soweit zu entladen, da er schon vorher leidet und langfristig degradiert
  • ist es netter, frühzeitig per Ansage zu erfahren, dass der Akku leer wird, anstatt mitten im Betrieb unvermittelt hart abzuschalten.

Funktioniert schon wie oben beschrieben.

VG, Rob

1 „Gefällt mir“

sehr gut! da war meine Skepsis wohl fehl angebracht.