2024. április 20., szombat

Gyorskeresés

Arduino alapú akkuteszter építés

Nem tudtam akkutesztert venni. Az ötödik sikertelen rendelés után elhatároztam, hogy építek egyet...

[ ÚJ TESZT ]

Arduino és PC oldali szoftver

A szoftver nem volt nehéz, legalábbis az a része, hogy megfelelő parancsra induljon a mérés, majd küldje a mérési adatokat soros porton. Az alapot a Henry's Bench oldal fogyasztásmérő sketch-e adta, amit ezúton is köszi nekik. :) Az egyetlen gond a megfelelő számítással adódott. :D Az elsőre kitalált módszernek nem hittem, ám mivel nem volt mivel visszaellenőrizni az eredményeket, csak sorozatos mérésekkel tudtam tesztelni, és több más módszer esetén is csak a korábban (a kínai teszterrel) lemért akkuk újramérésére hagyatkozhattam. Aztán találtam egy oldalt, ami mAh-ból és időből áramot számol, és fordítva, és ez az általam mért eredményeket igazolta is. A furcsaságokat több dolog is okozhatta.

- a cella nem ugyanúgy merül különböző ohmos terhelésekkel, 300mA folyamatos kivételét tovább húzza, mint 450-et
- rossz állapotú cellákat választottam, amik nagyon hamar vesztik a töltést, így a kínaival való mérés előtt túl sokat állva kevesebb jött ki...

Mindenesetre miután vissza tudtam ellenőrizni, már biztos volt, hogy amennyire lehet, pontos eredményeket ad a mérés. Lehetne persze cifrázni a feszültségek mintavételezését, stb. (Kéne is, a következő verzióban...) A végeredmény az, hogy a convert-formula.com oda-vissza számított értékei max. 50mAh-val térnek el a mérttől, a kölcsön kínai teszterétől viszont nagyon sokkal. Ettől nem voltam nyugodt, de ha valamiből másfél órán át folyik ki 450mA, az nem lehet 300mAh-s akku, már csak tapasztalatilag sem. :D

Az Arduino sketch alant található. Vár, amíg a soros porton a végfeszültséget (pl. -e3.5) és/vagy a start parancsot nem kapja. A start után zárja a relét, és küldi a mérési eredményeket a soros portra. Ha elérte a végfeszültséget, nyitja a relét, és megáll, csak az Arduino resetelésével indul újra.

Fontos, hogy a program elején definiált icorrection és vcorrection értékeket egyedileg kell a MAX471 modulhoz és diódához belőni. Ezt a DEBUG-gal jelzett programrészek kommentségét megszüntetve lehet ellenőrizni, így már a setup() részben is történik mérés. A korrekciók százalékban értendők, ennyi százalékkal fog többet mérni a program a MAX által szolgáltatott értéknél. Érdemes egy, vagy több, lehetőleg pontos műszerrel is összehasonlítani a mért értékeket, 3 és 4V, valamint a tervezett áramfelvétel esetén is.

// Based on
// Henry's Bench
// MAX471 Power Meter Tutorial
//http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-max471-power-meter-tutorial/
// Other pages
//https://convert-formula.com/a-h-mAh
//https://www.convertworld.com/hu/ido/
//https://www.rapidtables.com/calc/electric/wh-to-mah-calculator.html
//https://electronics.stackexchange.com/questions/18612/how-to-measure-capacity-of-a-lithium-ion-battery

#define VT_PIN A1
#define AT_PIN A2
#define RELAY 13

float vcorrection = 4;
float icorrection = -5;
float ah = 0;
float flow = 0;
int vcc = 0;
int vt_read = 0;
int at_read = 0;
int t=0;
String input;
boolean started=false;
float endvoltage=3.3;
int i;
String s;
char char1[5];
float voltage=0;
float current=0;
float watts=0;
int milli=0;


void setup()
{
pinMode(RELAY,OUTPUT);
digitalWrite(RELAY,LOW);
Serial.begin(9600);
while (started == false) {

/* //for DEBUG
delay(200);
digitalWrite(RELAY,HIGH);
vt_read = analogRead(VT_PIN);
voltage = vt_read * (5.0 / 1024.0) * 5.0;
voltage=(voltage+((voltage/100)*(vcorrection)));
at_read = analogRead(AT_PIN);
current = at_read * (5.0 / 1024.0);
current=(current+((current/100)*icorrection));
Serial.print(voltage);Serial.println("V");Serial.println(" "); Serial.print(current);Serial.println("A");
*/

if (Serial.available()) {input=Serial.readString(); }

if (input.indexOf('start',0) > 0) {started=true; }

if (input.indexOf('-e',0) > 0) {
for (i=input.indexOf('-e',0);input.substring(i)!="";i++) {
}
s=input.substring((input.indexOf('-e',0)),i);
s=s.substring(1, s.length());
s.toCharArray(char1, sizeof(char1));
endvoltage=atof(char1);
//For DEBUG
//Serial.print(s);
//Serial.print("float : ");
//Serial.println(endvoltage);
}
}

digitalWrite(RELAY,HIGH);
delay(100);
vt_read = analogRead(VT_PIN);
voltage = vt_read * (5.0 / 1024.0) * 5.0;
voltage=(voltage+((voltage/100)*(vcorrection)));
at_read = analogRead(AT_PIN);
current = at_read * (5.0 / 1024.0);
current=(current+((current/100)*icorrection));

Serial.print("Battery tester end voltage is : ");
Serial.print(endvoltage);
Serial.println("V");

}

void loop()
{

while ((millis() % 1000) !=0 ) {}

while (voltage > endvoltage) {

while (((millis()+2) % 1000) !=0 ) {}


vt_read = analogRead(VT_PIN);
at_read = analogRead(AT_PIN);
t++;

voltage = (vt_read * (5.0 / 1024.0) * 5.0);
voltage=(voltage+((voltage/100)*(vcorrection)));
current = at_read * (5.0 / 1024.0);
current=(current+((current/100)*icorrection));
watts = voltage * current;
flow=flow+current;
ah=flow/3600;

Serial.print(" V:");
Serial.print(voltage, 3);
Serial.print("\t I:");
Serial.print(current,3);
Serial.print("\t P:");
Serial.print(watts,3);
Serial.print("\t Ah:");
Serial.print(ah,6);
Serial.print("\t t:");
Serial.print(t);
Serial.println();
if (Serial.available()) {input=Serial.readString(); }
if (input.indexOf('stop',0) > 0) {break; }

}

digitalWrite(RELAY,LOW);
Serial.print("Battery test finished at ");
Serial.print(ah,4);
Serial.println("Ah ");
Serial.print("In ");
Serial.print(t);
Serial.println("s");
Serial.println(""); Serial.println("");
Serial.println("Reset device to begin new test.");

while(true){
}

}

Szoftver a PC oldalon

A szoftver PC oldala elsőre egy egyszerű Bash script lett. Ugyan az Arduino Serial monitor is használható erre, de egy shell script kevesebb erőforrást fogyaszt (nálam az Arduino IDE néha elég rendes prociterhelést okoz). Annyi a dolga, hogy a paraméterként kapott végfeszültséget, és a start parancsot kiküldje a megadott soros portra, majd az érkező eredményeket egy dátumozott file-ba, és a standard out-ra küldje. Egyszer lehet, hogy írok egy .net vagy GTK+ felületet is, vagy teszek egy kijelzőt a teszterre.

A script használata amúgy ennyi :
sh batterytest_2.sh /dev/ttyUSB0 start -e3.3

A -e3.3 a végfeszültség, a start parancs indítja, a /dev/ttyUSB0 pedig az a soros port, amin az Arduino lóg. (A -e3.3 elhagyható, ha 3.3V-ig szeretnénk meríteni, mivel az Arduinon is ennyi az alapérték.)

Maga a script ennyi :

#Script for controlling USB battery tester
#Parameters : Serial device name, command (stop or start), -eendvoltage (otpional)
#
#example : sh batterytest.sh /dev/ttyUSB0 start -e3.3
#
#this starts a test on /dev/ttyUSB0 with end voltage of 3,3V
#the output is stored in the batterytest.txt file
#--help parameter or run without parameter prints help
#
#!/bin/sh
CURR=$(date +"%Y%m%d%H%M")
OUTFILE=$CURR"_batterytest.txt"
touch $OUTFILE
if [ "$1" = "--help" ] || [ $# -lt 1 ]; then
echo ' #Script for controlling USB battery tester '
echo ' #Parameters : Serial device name, command (stop or start), -eendvoltage (otpional)'
echo ' '
echo ' #example : sh batterytest.sh /dev/ttyUSB0 start -e3.3'
echo ' '
echo ' #this starts a test on /dev/ttyUSB0 with end voltage of 3,3V'
echo ' #the output is stored in the batterytest.txt file'
echo ' #--help parameter or run without parameter prints help'
fi


if [ "$2" = "start" ]; then
echo "$2 test at $1 "
stty -F /dev/ttyUSB0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo
sleep 1
echo $2 $3 > $1
tail -f /dev/ttyUSB0 |tee $OUTFILE
fi

if [ "$2" = "stop" ]; then
echo $2 > $1
fi

A script indítása előtt érdemes kinyitni az Arduino soros monitorát, mert az lereseteli a soros portot, enélkül sajnos nem mindig működik a stty parancs a scriptben - nem jöttem rá, miért.


A script futásának eredménye, persze a közepét kihagytam

A cikk még nem ért véget, kérlek, lapozz!

Azóta történt

  • Ventilátorvezérlő Arduinoból

    Szerettem volna a számítógépházam ventilátorait a CPU és GPU hőmérsékletek függvényében dinamikusan vezérelni.

  • Furcsa órák támadása :D

    Szokatlan kinézetű Arduino alapú órákat raktam össze többféle célzattal karácsonyi ajándék gyanánt.

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.