Arduino: Pomiar pojemności baterii

Bateria… taka prosta rzecz. W szczególności popularny paluszek, czyli R6, AA. Cechy charakterystyczne: cylindryczna obudowa, 1.5V i cena od mniej niż złotówki do kilku złotych za sztukę. Podobno te droższe, których reklamy możemy oglądać w telewizji mają większą pojemność, starczają na dłużej i ogólnie są lepsze. O tyle lepsze, że opłaca się wydać kilka razy więcej pieniędzy i kupić właśnie je zamiast tanich zamienników.

Czy rzeczywiście? Jakoś nigdy nie byłem do tego taki przekonany. Oczywiście, najdroższa bateria powinna być wielokrotnie lepsza od najtańszego „chińskiego badziewia”. Tego nie negowałem. Ale co z tańszymi odpowiednikami ze średniej półki? Różnica w jakości jest aż tak duża, że usprawiedliwia różnicę w cenie? Zagraniczne projekty dowodzą, że zdecydowanie nie. Wystarczy popatrzeć na wyniki opublikowane na Battery Showdown. Różnica w koszcie jednej Ah potrafi być wielokrotnie różna. I nie zawsze najdroższa bateria jest tą najlepszą. Podobne wnioski płyną z lektury artykułu Denisa Hennessyego. Szkoda tylko, że testy nie uwzględniały baterii dostępnych na naszym rodzimym rynku.

A szczęście, kolega Denis jest na tyle sympatycznym i otwartym człowiekiem, że cały swój kod umieścił na GitHubie. A ja, zainspirowany jego projektem postanowiłem go zrealizować w naszych rodzimych realiach. Z kilkoma zmianami. Po pierwsze, całość została maksymalnie uproszczona. Zrezygnowałem z LCD, pomiaru temperatury i tak dalej.

Układ elektryczny też został uproszczony i oprócz obwodu z baterią obciążoną żarówką o oporze 3.2Ohma posiada jeszcze tylko LED informujący o trwającym pomiarze:

W kodzie zostało praktycznie tylko to co istotne dla pomiaru pojemności baterii w dżulach (J) i miliwatogodzinach (mWh).Jak to policzyć? Dość prosto. Wystarczy co sekundę wykonać następujący kod:

voltage = 5.0 * ((float) analogRead(V_METER)) / 1024.0;

float current = voltage / R_LOAD;
joules += voltage * current;
float wattHours = (joules / 3600.0) * 1000.0;

Czyli:

  1. obliczamy napięcie na podłączonej baterii (zmienna voltage) (Arduino zwraca wartość wejść analogowaych jako liczba w zakresie 0-1023, więc jest potrzebne trochę dzielenia i mnożenia),
  2. obliczamy aktualne natężenie (current) prądu ze wzoru I = U / R.  U znamy, bo właśnie je obliczyliśmy, R jest stałe i u mnie wynosi 3.2Ohma, więc obliczenie prądu nie stanowi najmniejszego problemu,
  3. zwiększamy licznik dżuli (joules) o iloczyn napięcia i natężenia (P = U * I),
  4. przeliczamy dżule na miliwatogodziny dzieląc przez 3600 (liczba sekund w godzinie) i mnożąc przez 1000 (przejście z Wh na mWh).

I to tyle. Uruchamiając powyższy kod co sekundę zwiększamy licznik dżuli tak długo, jak napięcie na baterii nie spadnie poniżej wartości krytycznej. Ja przyjąłem 0.2V jako wartość krytyczną, ale chyba ją podniosę do dużo bardziej użytecznej wartości 0.8V w następnych pomiarach.

Wracając do tematu porównania baterii dostępnych na naszym rynku. Badania trwają. Nie będę zdradzał wyników częściowych, powiem tylko tak: jest ciekawie, a liderem jest znana marka raczej nie kojarzona z dobrymi bateriami. Więcej spoilerów nie będzie. Zamiast tego wykres pokazujący różnicę w charakterystyce rozładowania baterii alkalicznej i akumulatora NiMH.

Już na pierwszy rzut oka widać, że teoretyczna przewaga zwykłej baterii nad akumulatorem polegająca na wyższym napięciu (1.5V kontra 1.2V) nie starcza na zbyt długo. Krzywa napięcia dla akumulatora ma bardziej płaski przebieg i w efekcie dłużej dostarcza on wyższe napięcie niż bateria w tych samych warunkach.

Cała dokumentacja projektu, czyli kod źródłowy, schemat podłączeniowy i biblioteki są dostępne na GitHubie.

5 comments

  1. A jak zmienić ten kod, żeby Arduino określało pojemność baterii/akumulatorka w mAh?

  2. Coś chyba nie tak z tymi obliczeniami. Moja żarówka ma 2,6 Ohma, napięcie zasilania 5V. Ze wzoru I=U/R, wynika, że prąd powinien wynosić 1,92A. Dokonałem pomiaru miernikiem i prąd wynosi 0,3A. Ktoś może mi to wyjaśnić?

  3. Obliczenia są błędne. Nie można przyjąć, że żarówka ma 3,2Ohma. Tyle to może i miała, ale bez obciążenia kiedy nie świeciła. Po zapaleniu żarówka ma całkiem inną, dużo większą oporność. Na początku popłynie więc duży prąd, który potem się zmniejszy. Dane pomiarowe z arduino są więc błędne. Tak samo jak błędne jest używanie żarówki jako odbiornika. Nie wiemy jaką oporność będzie miała żarówka w miarę zmniejszania się napięcia. Lepiej użyć jako odbiornik rezystor(y).

  4. Przeananalizowałem kod 100 razy i nie wiem skąd takie stwierdzenie:
    „Uruchamiając powyższy kod co sekundę zwiększamy licznik (…)”
    Nigdzie nie widze kawałka kodu, który zwiększa o sekundę licznik licznik zwiększa się po każdej pętli. Owszem, jest wyliczany czas każdej pętli t=now()-startTime, ale to tylko do wydruku na serial. A czas wykonania pętli nie musi być (i nie będzie) równy jednej sekundzie. Tym samym wyliczenie pojemności obarczone jest błędem, bo opiera się na sekundowym naliczaniu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany.