Fyzikální kabinet FyzKAB

Vernier Go!Temp + Arduino na 2 tužkové baterie

V minulých článcích věnovaným připojení USB teploměru Vernier Go!Temp k modulu Arduino jsme se již seznámili s možností načítání teplotních dat z tohoto čidla, stejně tak i zobrazení naměřené teploty na displeji. Dnes se společně zaměříme na posun celého projektu směrem k praktické použitelnosti celého zapojení. Stále totiž je naší motivací vytvořit zobrazovací modul, který dokáže načítat teplotu z USB teploměru Go!Temp a zobrazit ji na displeji. Takovýto doplněk USB teploměru by měla být nejen poměrně „malá“ krabička, ale pochopitelně by asi neměla být napájená přes USB port, kde kterému jsme zatím měli celé zařízení připojené, ale baterií.

Dnes se tedy zaměříme na bateriové napájení… A pochopitelně s tím i spojeným monitoringem stavu nabití baterie.

Řešíme bateriové napájení

Dříve než vezmeme do ruky několik tužkových baterií, kus drátu a modul Arduino s odhodláním vytvořit bateriově napájený projekt, trochu se podíváme na napájení modulu Arduino UNO obecně.

Napájení modulu Arduino UNO

Modul Arduino může být zpravidla napájen několika způsoby. Pochopitelně záleží na daném typu modulu Arduino. V případě modulu Arduino UNO je napájení možné:

  • napájení přes souosý konektor – toto napájení umožňuje použít rozsah napětí 6–15 V. Vstupní napětí je upravováno napájecím obvodem na požadované hodnoty 5 V (a 3,3 V). I když někdy specifikace originálního modulu Arduino UNO uvádí hodnotu až 20 V a proud 1 A, byl bych v tomto směru opatrnější – zejména v případě levných klonů, kde je právě výkonově slabý napájecí díl jejich Achillovou patou. Na vstupu napájecího obvodu je dioda, která chrání desku proti nechtěnému přepólování. Díky nejen možnosti použití různého napájecího napětí, ale i určité ochraně proti přepólování, je to asi nejbezpečnější metoda napájení.
  • napájení přes dvojici pinů VIN a GND – tato možnost je velmi podobná napájení přes souosý konektor, jediný rozdíl je jen v absenci ochranné diody. To se může hodit právě při napájení Arduina z baterie, kdy při napájení přes souosý konektor zbytečně ztrácíme na diodě napětí asi 0,5–0,7 V. Napěťové a i proudové limity jsou v tomto případě tedy obdobné napájení přes souosý konektor. Musíme ale dát pozor, abychom napájení nepřepólovali, tím bychom modul Arduino definitivně zničili.
  • napájení přes USB port – pokud máme Arduino, které na sobě má USB převodník (např. Nano, Uno, Mega), pak tuto variantu napájení určitě využíváme při programování. Klidně ji můžeme použít i pro finální instalaci, kdy budete Arduino napájet např. pomocí powerbanky. Rozsah napájecího napětí, který je v tomto případě použitelný je 4,75–5,25 V. Maximální proud, který může Arduino odebírat přes USB konektor, je 500 mA. Je to kvůli pojistce, která je na desce modulu a která především chrání připojený počítač před případnými zkraty v připojeném projektu.

Modul Arduino UNO má napájecí díl poměrně chytře vyřešen, takže lze některé způsoby napájení i kombinovat. Například můžeme modul mít připojený k USB, tedy ke zdroji, který ale může být slabý a tedy nedokáže napájet všechny moduly, které máte k Arduinu připojené. Tak lze zároveň použít silnější zdroj, který zapojíte přes souosý konektor, tedy USB využíváte pouze k programování (tedy ne k napájení). Řešení napájecího obvodu je takové, že Arduino pozná, zda je kromě USB zdroje připojen i jiný zdroj napětí na souosém konektoru (popř. VIN a GND) a pokud je dostatečný, odpojí napájení přes USB port. Pokud Vás problematika napájení modulu Arduino zajímá více, doporučujeme následující článek: Vše o napájení Arduina.

V tomto článku je pro nás však uvedena ještě jedna důležitá informace. A to, že bychom nikdy neměli modul Arduino napájet přes piny 5V a GND! Ve výše uvedeném článku je (pro zájemce) jasně vysvětlen důvod, včetně elektronického schéma celé napájecí části. Jelikož asi nemá cenu zde opakovat to, co je tam jasně uvedeno, uzavřeme toto řešení tedy jen slovy: „I Když se to občas v různých zapojeních objevuje, my to používat nebudeme!“

Napájíme z baterií AA

Ze samé podstaty napájení modulu Arduino (viz dříve) vidíme, že máme několik možností. Asi nejčastěji používaným řešením je využití pětivoltové powerbanky a USB konektoru modulu Arduino (popř. pinů VIN a GND). Výhodou je jasně definovaný výstup, poměrně velká kapacita a standardní způsob nabíjení. Naopak nevýhodou zpravidla bývají větší rozměry powerbanky, tedy i problém se zabudováním powerbanky do projektu. Také je třeba vyřešit způsob nabíjení powerbanky při trvale připojeném modulu Arduino a podobně.

My se zde pokusíme náš projekt napájet pomocí dvojice tužkových baterií (AA), což odpovídá vstupnímu napětí 3 V. To je pod hranicí minimálního povoleného napětí nejen modulu Arduino, ale i USB teploměru Vernier Go!Temp. Proč se tedy o takovou věc snažíme? Přece bychom mohli například použít čtveřici AA baterií, která by poskytla napětí cca 6 V, které bychom připojili k modulu Arduino (patrně přes souosý napájecí konektor nebo pinů VIN a GND) a bylo by hotovo.

Především nám jde nejen o velikost celého projektu, ale budeme potřebovat i určité definování a stabilizaci vstupního napětí. V některém z dalších článků se totiž pokusíme převést projekt připojení USB teploměru Go!Temp k menšímu provedení modulu Arduino, které nedisponuje stejným napájecím obvodem jako má Arduino UNO. Bylo by tedy nešťastné pak zjistit, že celkové zmenšení projektu se zbytečně zkomplikuje díky velikosti napájecích baterií a vsazením na nevhodný způsob napájení. Takže už nyní již cílíme na budoucí velikost projektu a pochopitelně zohledňujeme i potřebu budoucích potřeb později použitého menšího modulu Arduino.

Námi navržené a dále popsané řešení zatím pro modul Arduino UNO ilustruje obrázek č. 1.

Napájení pomocí dvojice AA baterií
Obr. č. 1 – Napájení modulu Arduino UNO s připojeným USB teploměrem Vernier Go!Temp z dvojice tužkových (AA) baterií.

Z obrázku č. 1 již asi podstatu řešení začínáme tušit. K dvojici AA baterií je připojen malý tištěný spoj, který je zakončen USB konektorem, ke kterému je modrým USB kabelem připojen modul Arduino. Klíčovým v našem řešení je tedy (na obrázku č. 1 červeně svíticí) tištěný spoj step-up měniče, který z 3 V připojených baterií vytváří stabilizované napětí 5 V.

Step-up měnič

Step-up měniče umí zvýšit nižší stejnosměrné napětí na požadovanou hodnotu. Step-up měnič je v podstatě DC-DC měnič, který přeměňuje nižší vstupní napětí na vyšší výstupní napětí. To se hodí v řadě aplikací. Třeba zrovna v našem případě, kdy máme baterii s nižším napětím a potřebujeme napájet zařízení, které vyžaduje vyšší napětí.

step-up měniče s výstupním napětím 5V
Obr. č. 2 – Step-up měniče s výstupním napětím 5V (s USB konektorem a v miniaturním provedeni)

Princip činnosti pulzních měničů spočívá v cyklickém spínání a vypínání proudu tlumivkou. Energie uložená v cívce se uvolní při odpojení napájení a napětí cívky se přičítá ke zdrojovému napětí. Měnič tak zvýší napětí na zadanou určitou úroveň. Aby se zabránilo kolísání výstupního napětí, a tím nestabilnímu provozu připojených obvodů, používají se na výstupu vyhlazovací kondenzátory. Někdy je výstup měniče osazen stabilizátorem. Provoz měniče napětí většinou řídí řídicí integrovaný obvod. Tranzistor MOSFET zodpovědný za klíčování umožňuje vést i velmi vysoké proudy s prakticky nepostřehnutelnými energetickými ztrátami. Impulsní měniče napětí se tak vyznačují vysokou účinností 70 % až 95 %. V praxi to znamená, že většina vstupního výkonu je k dispozici na výstupu. Při výběru měničů zvyšujících napětí je, stejně jako u každého napájecího zdroje, třeba věnovat zvláštní pozornost rozsahu zdrojového napětí a rozsahu výstupního napětí. Pochopitelně dalším technickým parametrem je i maximální výstupní proud.

Hardwarové řešení tedy máme poměrně rychle vyřešené. Modul Arduino UNO připojíme k dvěma AA bateriím prostřednictvím step-up měniče s výstupní napětím 5V. Pro první zkoušky použijeme typ zakončený USB konektorem, kterým budeme modul Arduino napájet přes USB konektor. Později přejdeme na miniaturní provedení, kterým budeme napájet zvolený typ modulu Arduino Mini přes jeho piny RAW a GND.

Napájení modulu Arduino pomocí 2x AA baterií
Obr. č. 3 – Napájení modulu Arduino pomocí 2x AA baterií a step-up měniče

Řešíme kontrolu stavu baterie

Jakmile začneme nějaké zařízení provozovat na baterie, je dobré současně vyřešit i monitoring stavu baterie. Asi není nic horšího, než se bez jakéhokoliv varování dočkat vybití baterie. Problematice sledování napětí napájecí baterie jsme se například věnovali v článku Arduino měří své napájecí napětí, kde jsme využívali informace, že v řadě AVR čipů je vnitřní napěťová reference 1,1 V, kterou lze využít pro zlepšení přesnosti standardní funkce analogRead() modulu Arduino. Tam popisované řešení měřilo napájecí napětí 5 V a předpokládali jsme, že tato hodnota přímo odpovídá napětí na baterii. Zde máme ale situaci trochu jinou! Stav baterií se nám díky použití step-up měniče moc do výsledného napětí nepromítá. Tedy přesněji řečeno projevuje se, ale až na samém konci, kdy je stav baterií již tak nízký, že použitý step-up měnič nedokáže dosáhnout stanoveného výstupního napětí. A to už by bylo opravdu pozdě!

Chceme-li tedy stav baterie sledovat (a zobrazovat), nemůžeme nyní sledovat stav napájecího napětí, ale skutečné napětí na samotných AA bateriích. K tomu můžeme zcela pohodlně využít některého a z analogových pinů modulu Arduino. Je třeba si ale uvědomit, že vstupní napětí nyní nebude v rozmezí 0–5 V, ale jen 0–3 V (možná trochu více při plně nabitých bateriích).

Napájení modulu Arduino pomocí 2x AA baterií
Obr. č. 4 – Monitoring napájecích AA baterií

Jelikož měřené napětí baterií je menší než 5 V, můžeme jeho velikost rovnu měřit na některém analogovém vstupu, například na A0. Následující ukázka kódu představuje proceduru, která načte napětí baterie a rovnou vrátí její stav v procentech. Aby tato procedura byla trochu obecnější, nejsou do ní přímo dosazeny některé konstanty. Ty je třeba nastavit pro překlad na začátku programového kódu.

// stav baterie je nacitan analogovym pinem
#define ANALOGIN A0

// napajeci pro vypocet stavu baterie
#define UCC 4.9      // pro UNO 5.0 a pro MiniPRO 3.3
#define BAT_MAX 3.0
#define BAT_MIN 0.7
//----------------------

Konkrétně se jedná o definici ANALOGIN, tedy vstupního pinu, na kterém se stav baterií bude načítat – zde A0. Dále je to definice UCC, která odpovídá napájecímu napětí modulu, které při převodu napěťové hodnoty na analogovém pinu slouží jako referenční napětí. Teoreticky by zde měla být pro modul Arduino UNO nastavena hodnota 5,0 V. Jak však je ve výše uvedeném článku věnovanému měření napájecího napětí, je u použitých napěťových stabilizátorů modulu Arduino UNO trochu problém s přesnou hodnotou konkrétního stabilizovaného napětí. V případě, že chceme měřit vstupní napětí na analogovém pinu aspoň trochu přesně, doporučuje se na pinu +5V změřit skutečnou hodnotu napájecího napětí voltmetrem, pak ji používat jako výchozí hodnotu pro referenci (dosadit za hodnotu reference – v ukázce je nastavena hodnota 4.9). Pochopitelně lze stav baterie načíst i samotným modulem Arduino, způsob je popsán v článku Arduino měří své napájecí napětí. Ale jak uvidíme dále, ono to s tou přesností měření napětí baterie zase nemusí být tak přesné. 😊

Poslední dvě definice hodnot BAT_MAX a BAT_MIN udávají napěťové hodnoty, které udávají maximální napětí baterie, která bude prezentována jako 100% nabití, a minimální hodnoty baterie, při které ještě step-up měnič dokáže vygenerovat napětí pro chod modulu Arduino – to nám bude zastupovat hodnotu 0 %, tedy úplného vybití baterie. Zde se jedná o hodnoty 3.0 V a 0.7 V, ale rozhodně se vyplatí zvláště v případě dolní napěťové hranice si konkrétní hodnotu vyzkoušet podle použitého modulu step-up měniče.

Máme-li definované potřebné konstanty, které se při překladu do programu dosadí, můžeme se pustit do procedury vracející stav baterie v procentuální podobě.

int StavBaterie() {
    float a = 100 / (BAT_MAX - BAT_MIN);
    float b = BAT_MIN * a;
    int stavBat = 0;
    int Suma = 0;
    for (int i = 1; i <= 10; i++ ) {
       int analog_value = analogRead(ANALOGIN);
       float input_voltage = (analog_value * UCC) / 1024;
       stavBat = round(a * input_voltage - b);
       if (stavBat < 0) { stavBat = 0; }
       if (stavBat > 100) { stavBat = 100; }
       Suma += stavBat;
    }
    stavBat = round(Suma / 10);

   return stavBat;
}

Princip výše uvedené procedury je poměrně jednoduchý. Především jde o načtení napěťové hodnoty na vstupním analogovém pinu, která je pak lineárním vztahem převedena do intervalu 0–100 reprezentující procenta nabití baterie.

Všimněme si, že hodnota napětí je načítána 10× a poté je spočítána výstupní hodnota jako průměr. Toto řešení je zvoleno kvůli zabránění zbytečného kolísání výsledků, ke kterému docházelo při jediném měření. Pokud budeme stav baterie nějak graficky prezentovat, například na zobrazovacím displeji, jistě by nevypadalo pěkně, kdyby se ukazatel stavu baterie neustále drobně měnil.

Za zmínku též stojí podmínka if (stavBat > 100) { stavBat = 100; }, která řeší případ „čerstvých“ baterií, které mohou mít počáteční napětí vyšší, než je stanovená hranice 3 V. Stav baterie by pak odpovídal hodnotě větší než je 100 %. To asi není úplně ideální, zvláště když „čerstvé“ baterie vcelku rychle pak klesnou na nominální hodnotu 3 V, na které poměrně dlouho vydrží. Hodnota větší než 100 % je tedy touto podmínkou uměle stažena na maximální výstupní hodnotu 100.

Podobně podmínka if (stavBat < 0) { stavBat = 0; } fixuje výstupní hodnotu 0 pro nižší hodnoty, než je minimální napěťová hodnota baterií.

Po načtení stavu baterie pomocí procedury StavBaterie() je třeba tuto hodnotu nějak vizualizovat na displeji naší zobrazovací jednotky USB teploměru Vernier Go!Temp. Při použití dvoubarevného OLED displeje se asi nejlépe nabízí pravý roh horního žlutého „stavového“ řádku. Stav baterie budeme zobrazovat pomocí ikony v podobě obdélníčku, jehož zaplnění bude odpovídat stavu baterie. Výsledné řešení ukazuje následující obrázek č. 5.

zobrazení stavu napájecích AA baterií na OLED displeji
Obr. č. 5 – Zobrazení stavu napájecích AA baterií na OLED displeji

Jestliže vytvoříme ikonu stavu baterie z obdélníčku o délce 10 pixelů, je jasné, že lze stav baterie zobrazovat v 10 různých stavech, které odpovídají stavům 0, 10, 20 … 100 %. To je pro zobrazení stavu baterie dostačující, zároveň odpadá zbytečně často měnící se stav baterie, pokud by se stav baterií změnil například o jediné procento.

Program pro načtení teploty z USB teploměru Vernier Go!Temp a jeho zobrazení na OLED displeji najdeme v předešlém článku Displej pro Vernier Go!Temp pomocí modulu Arduino. Nyní jej tedy jen rozšíříme o následující části:

  1. přidání definic konstant stavu baterií
  2. proceduru načtení stavu baterie
  3. vykreslení stavu baterie na OLED displej

První dvě části programu jsme si již představili, zbývá tedy jen samotné vykreslení ikony baterie.

Změna programu bude v oblasti hlavní smyčky loop, konkrétně v hlavním bloku oled.firstPage(); do {…} while(oled.nextPage()); vykreslování teploty na displej. Nejdříve musíme změnit vykreslení hlášky „T E P L O T A“, aby se zobrazovala neprokládaně a byla více vlevo.

// maly nadpis
oled.drawStr(0, 0, "TEPLOTA");     // vypis nadpisu

Tím se na žluté stavové řádce vpravo vytvoří místo pro ikonu, kterou vykreslíme přidáním následujících řádek:

// stav baterie
oled.drawStr(86, 0, "BAT");     // popisek
oled.drawFrame(115,2,12,10);     // oramovani
oled.drawFrame(113,4,2,6);     // cudlik baterie
if (stavBA > 0) { oled.drawBox(126-stavBA,2,stavBA,10); }    // stav baterie

Ještě je třeba doplnit, že proměnná stavBA je hodnota stavu baterie v pixelech, tedy hodnota stavu baterie (0–100 %) vydělená 10. Stav baterie je nejlepší načíst ještě před začátkem vykreslování, tedy před strukturou oled.firstPage(); do {…} while(oled.nextPage());

Načtení hodnoty stavBA provedeme následujícím způsobem:

int stavBA = round(StavBaterie()/10);

Asi by se zde nyní slušelo uvést celý nový kód programu.

Výjimečně to však dnes neuděláme!

Proč?

Protože nechceme, abyste vše zde pořád dostávali jak na stříbrném podnose. Cílem nejen tohoto článku, ale celého seriálu o načítání teploty z USB teploměru Vernier Go!Temp, není pouhé předložení námi vyvinutého řešení, ale především snaha trochu „navnadit“ ostatní bastlíře k samostatné činnosti. Takže pokud jste se dočetli až sem (a stále tušíte, o čem tu běží řeč), jistě bude začlenění detekce stavu baterie do dříve prezentovaného programu Vaším „milým“ samostatným domácím úkolem. 😉

Věříme, že se Vám jistě podaří úkol zvládnout. A přejeme hodně zábavy při jeho samostatném řešení!

A co nás čeká příště?

Asi se konečně s tímto projektem vydáme na tolikrát slibovanou rozměrově menší desku Arduino Mini.

Autor článku: M.P. & Martin Křepelka

Článek je součástí následující série článků:
UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!