egy mobil robot építésének története

Robotkocsi

Robotkocsi

Akkumulátor monitorozása

2018. szeptember 28. - dralisz82

Az előző posztban létrehoztam egy, az akku feszültségének mérésére használható szenzort. Nézzük, hogyan és mire is lesz ez használható azon túl, hogy a távirányítóról lekérdezhető az értéke.

Li-Po ismétlés

Ahogy arról a Ha kell egy kis energia című posztban írtam, a LiPo akkumulátorok nagyon megsínylik, ha túlmerítik őket. Az autóba épített akkumulátorcsomag nem tartalmaz semmilyen védőáramkört, így nekünk, felhasználóknak kell gondoskodnunk róla, hogy az akkumulátor mélykisütése soha ne következzen be.

Cellánként 3 V-os feszültséget tehát nem szabad elérnünk, sőt, mivel az autó motorjai nagy áramokat vesznek fel, 3.2 V-nál is magasabban kell meghúzni a határt, mivel amikor az akkumulátorban már csak kevés töltés van, drasztikus gyorsasággal kezd zuhanni a kapocsfeszültség. Mérnöki hasra ütve cellánként 3.4 V, azaz összesen 10.2 V biztonságos határnak tűnik. Mivel (egyelőre, az analóg bemenetekkel való spórolás miatt) nem mérem külön a cellák feszültségét, csak a teljes akkucsomagét, így jó eséllyel akkor sem lesz gond, ha az egyes cellák picit eltérő mértékben merülnek. Tapasztalatok alapján 1-2 tizednyi különbség lehet a cellák feszültsége között normális esetben.

Monitor

Egy nagyon egyszerű függvényt írtam, ami kiolvassa az akkufeszültséget mérő szenzor értékét, és ha alacsonynak találja, akkor letiltja az autó mozgatását, ha újra elegendőnek (pl. működés közbeni töltés esetén, amire jelenleg nincs a robot felkészítve), akkor pedig ismét engedélyezi. Itt érdemes arra kitérni, hogy muszáj szétválasztani az alacsony, valamint az elegendő akkufeszültség határát, különben amikor a merülés határán lenne az akku, a vezérlés folyamatosan felváltva letiltana és engedélyezne. Ezt hívják hiszterézisnek.

void checkBattery() {
    Sensor *s = sensors->getSensor("vBatt");
    printf("Checking battery...");
    if(s == NULL) {
        printf("[error]\n");
        return;
    }
    if(s->readValue() < 10.2f) {
        printf("[low]\n");
        drive->setEnabled(false);
        lights->hazardLightsOn();
        normalLED = 1; // off
        heartbeatLED = &errorLED;
        BT.printf("Battery low, drive disabled.\n");
    } else {
        printf("[ok]\n");
    }
    if(s->readValue() > 11.2f) {
        drive->setEnabled(true);
        lights->hazardLightsOff();
        errorLED = 1; // off
        heartbeatLED = &normalLED;
        BT.printf("Battery charged, drive enabled.\n");
    }
}

Ezt az egyszerű függvényt pedig percenként meghívom egy programszálból. Egyelőre a két másodperces ciklusidejű heartbeat szálat választottam ki a célra. Ebben minden egyes körben léptetek egy számlálót, és amikor annak értéke osztható 30-al, akkor lefuttatom a fenti függvényt.

void hbThreadMain(void const *argument) {
    int timer = 0;
    heartbeatLED = &normalLED;
    while (true) {
        *heartbeatLED = 0; // on
        Thread::wait(100);
        *heartbeatLED = 1; // off
        Thread::wait(1900);

        if(timer % 30 == 0)
            checkBattery(); // once in every 60 seconds
        timer++;
    }
}

Most tehát, ha egy határ alá merül az akkumulátor, a nagy áramfogyasztók tiltásra kerülnek, az autó kiteszi a vészvillogót, pirosra vált a heartbeat LED zöldről és kap egy üzenetet a felhasználó a távirányító felületén.

Ezzel a LiPo akkut már védjük a mélykisüléstől, robusztusabbá téve a rendszert. Hamarosan újabb szenzorok integrálásával folytatódik a történet.

A bejegyzés trackback címe:

https://robotkocsi.blog.hu/api/trackback/id/tr4214265071

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása