Ladezustand Akku bei AiO möglich?

Moin zusammen!
Da es schon ein paarmal vorkam, dass der Tonuino mitten im Betrieb ausschaltete und ich jedes Mal nicht sicher war, ob es einfach nur der Akku oder doch ein anderes Problem war (kam auch vor, ließ sich durch Anschließen an die Arduino-IDE beheben), suche ich nach einer Möglichkeit, den Akkustand anzuzeigen/auszulesen. Ich habe den „Standard“-LiFePo4-Aku von Eremit verbaut.
Ich vermute, in Software geht das nicht, da der Arduino nicht mit der Ladeelektronik sprechen kann, richtig?
Gäbe es Hardware-Lösungen, die AiO-geeignet sind?

Das ist bei LiFePo4 nicht ganz so einfach. Schau mal den Beitrag von @Eremit_LiPos an:

1 „Gefällt mir“

Doch theoretisch geht das. Wie genau und gut das klappt, hängt davon ab wie man das implementiert (siehe Aspekte die Manu gepostet hat). Dafür sind allerdings dann mehrere Dinge Notwendig:

  1. Wir haben die Möglichkeit vorgesehen die Akkuspannung über einen Spannungsteiler an einem Analogen Pin einzulesen. Im Auslieferungszustand ist das allerdings nicht aktiviert. Dazu musst du links neben dem Prozessor den Solder Jumper „SJ1“ schließen (bei der v1.0). Bei der v1.1 ist dieser zusätzlich noch mit „EN_bat_meas.“ beschriftet.

  2. Damit der Analog Pin benutzt werden kann musst du manuell diesen Pull Request in dein lokales Board Support Package übernehmen. Das kannst du auch manuell machen indem du einfach die zwei Dateien entsprechend editierst.

  3. Der Spannungsteiler sieht so aus (AREF ist der Analog Pin zum messen, TPS_IN ist die Batteriespannung):

image

  1. Zum testen könntest du diesen Beispielsketch verwenden:
const float reference = 2.048;
const float steps = 4064;

void setup() {
  // keep board powered
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  // switch sd access off
  pinMode(A5, OUTPUT);
  digitalWrite(A5, LOW);

  // prepare battery measurement
  pinMode(A10, INPUT);
  analogReference(INTERNAL2V048);
  analogReadResolution(12);
  Serial.begin(115200);
}

void loop() {
  uint16_t value = analogRead(A10);
  Serial.print(value);
  Serial.print(" - ");
  Serial.print((value / steps) * reference);
  Serial.println("V");
  delay(500);
}

Da bekommst du dann ca. Werte zwischen 3210 (entspricht ca. 3.3V am Akku) und 2920 (ca. 3.0V). Die Volt Werte die das Programm ausgibt sind in dem Fall zwischen 1,6 und 1,4 V, was am. Spannungsteiler liegt. Wenn man das ganze irgendwie vernünftig kalibriert und sich beim auslesen was einfallen lässt (hysterese oder sowas) kann man damit bestimmt was basteln. Ich weiß das @Thomas-Lehnert in der Richtung schon mal etwas gebastelt hat. Oder Thomas?

1 „Gefällt mir“

Ja, das läuft sehr gut. Allerdings habe ich zusätzlich noch den Spannungsteiler verändert um den Messbereich bis 5V zu erweitern. Ist nicht unbedingt notwendig, aber ich wollte auch eine Messung im USB-Betrieb, was mit der Originaldimensionierung nicht möglich ist. In meinem Fork ist das implementiert. Man kann das ohne Probleme auch ohne den geänderten Spannungsteiler verwenden, muss aber den Korrekturwert im Scetch entsprechend anpassen. Wer sich das zutraut kann auch die Änderung des Spannungsteiler selbst machen, indem er einen 120kOhm SMD Widerstand huckepack auf R17 auflötet.

3 „Gefällt mir“

Kleine Korrektur. Hab mich mit dem Widerstandswert vertan. Nicht 120 kOhm, sondern 210 kOhm. Zahlendreher. Damit wäre die gemessene Spannung zu niedrig.

Eine ganz wichtige Sache ist das Glätten der Messwerte. Die Akkuspannung unterliegt relativ großen Schwankungen, abhängig von der gespielten Musik und der Lautstärke. Auch andere Faktoren wie z.B. Led-animationen wirken sich hier stark aus. Deshalb muss man eine relativ hohe Anzahl an Messungen in einem Pruefintervall machen und aus diesen einen Mittelwert errechnen. Dieser Wert ist dann relativ stabil, weil die kurzzeitigen Schwankungen nicht mehr ins Gewicht fallen. Die weitere Auswertung muss dann mit diesen Mittelwerten erfolgen. Ich habe z.B. in einem Pruefintervall von 1 Minute den Mittelwert aus 60 Einzelmessungen (1Messung je Sekunde) errechnet. Für die Batteriemessung reicht dieses Pruefintervall aus. Man könnte es sogar noch verlängern, und die Abstände der Einzelmessungen auch entsprechend . Zu beachten ist nur, dass dann die Aktualisierung z.B. einer Anzeige oder einer akustischen Meldung immer erst nach Ablauf des Pruefintervalls erfolgt.

1 „Gefällt mir“

Ich habe mir gerade deine Umsetzung angeschaut und überlege, für die Batterieüberwachung auf deinen Fork zu wechseln.

Auf was müsste ich denn den Korrekturwert setzen, wenn ich den Spannungsteiler nicht verändere? Geht es darum, die ausgegebenen 1,4 V auf die 2,92 V zu skalieren?

Ja, der Korrekturwert muss so angepasst werden, das im der Konsole die gleiche Spannung angezeigt wird, wie mit dem Multimeter direkt am Akku gemessen. Allerdings ist das nicht ganz so einfach. Bei Anschluss des Computers an die USB Buchse der AiO wird nicht die richtige Spannung angezeigt, weil die 5 V vom Computer dort Anliegen. Um die genaue Spannung zum Eichen des Korrekturwertes zu erhalten musst du einen serial zu USB Adapter (FTDIAdapter) an RX ,Tx, und Ground an der Erweiterungsleiste der AiO Platine anschließen, und dort den PC am USB anschließen. Den Jumper auf dem FTDI Adapter auf 3,3V Pegel stecken. RX und Tx über Kreuz anschließen.
Und ganz wichtig, die Erweiterung in das BSP für das Board einarbeiten, siehe obiger Link im Post von Stephan.

Super, vielen Dank. Das ist dann nicht ganz so einfach, wie erhofft, aber das sollte ich hinbekommen.

(Die Erweiterung binde ich vorher ein, das ist mir bewusst)