Jak provozovat "Arduino" na baterky

Odpovědět
Uživatelský avatar
fulda
Příspěvky: 1359
Registrován: 04 led 2016, 17:18

Jak provozovat "Arduino" na baterky

Příspěvek od fulda »

Pokračování vlákna Re: "Arduino" s procesorem LGT8F328P po té, co se začalo odchylovat od subjectu.
daton píše: 17 dub 2021, 18:34 Omlouvám se ale za polední dny jsem pracovně tak vytížen že jsem neměl na projekt žádný volný čas a tedy jsem nijak nepokročil a asi to nedopadne ani zítra.
Jen několik rychlých dopovědí, ano desky napájím vždy z 5V vstupu nikoliv přes VIN který je volný.
Znovu zopakuji odkaz do datasheetu prakticky každého lineárního regulátoru na větu "reverse bias". Někteří výrobci jí opisují velmi opatrně a píšou, že pokud je pin "ve vzduch", ale později připouštějí, že vstupní kondenzátor v případě reverzního napájení v podstatě znamená propojení na zem, protože kondenzátor se nemá z čeho nabít. Proto jako alespoň minimální prevence pokud už opravdu chceme napájet arduino výstupem +5V, tak máme stejné napájení připojit také na vstup Vin.
Hodně lidí to podceňuje, ale zrovna v případě, že hodláte šetřit každou mikroampéru, tak není čas na hrdinství.
daton píše: 17 dub 2021, 18:34 Kabel do PC má vypínání 5V a napájení je realizováno z laboratorního regulovatelného zdroje AXIO AX 3005DS.
Tady jen taková drobnost - opravdu platí, že když přestřihneš červný drát v USB kabelu, že dojde k oddělení napájení? Já neznám přesnou odpověď, ale velmi často se setkáváme s tím, že může docházet k přetékání proudu pomocí "clamp diod". Někdo na to dokonce spoléhá ve své konstrukci. Jestli to dělá konkrétní USB čip nevím a dohledávat to v dokumentaci se mi nechce.
daton píše: 15 dub 2021, 07:38 To že si arduino nepamatuje výsledky myslím tím že pokud provádám nějaký výpočet jehož výsledky jsou vstupem pro další práci tak oba moduly mi pracovaly vždy jako by se spustily znovu a mezivýsledky se kterými se pracuje prostě nebyly k dispozici potom jsem to zkoušel na jednoduchém příkladu přičítání jedničky v každém cyklu probuzení a výsledkem byly stále jen jedničky tedy tak.
S tím tedy může souviset i tato vlastnost. Za normálních okolností existuje kondenzátor mezi výstupem DTR převodníku a vstupem RST na procesoru. Je tedy možné procesor vyrsetovat pomocí převodníku. V případě, kdy převodník a procesor pracují s jiným napájením, je celkem možné, že k tomu resetu dochází samovolně, prostě proto, že se převodníku mění úroveň napájení. Takže bych byl poněkud opatrný k tvrzení, zda se procesor probouzí ze spánku, nebo je vyresetován převodníkem, nebo obojí v rychlém sledu za sebou.

Trochu bych se snažil začít s měřením, které bude schopné podávat reálnější výsledky.

Generálně se mi zdá jako naprostý nesmysl uvažovat o použití arduina s USB převodníkem pro bateriový provoz. Poohlédni se po nějakém bez něj - zpravidla Pro Mini nebo náhražky.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Jak provozovat "Arduino" na baterky

Příspěvek od DavidO »

fulda píše: 20 dub 2021, 11:09 Tady jen taková drobnost - opravdu platí, že když přestřihneš červný drát v USB kabelu, že dojde k oddělení napájení? Já neznám přesnou odpověď, ale velmi často se setkáváme s tím, že může docházet k přetékání proudu pomocí "clamp diod". Někdo na to dokonce spoléhá ve své konstrukci. Jestli to dělá konkrétní USB čip nevím a dohledávat to v dokumentaci se mi nechce.
Odkaz na projekt v odkazovaném článku už není aktivní, ale dá se najít v archivu. Doporučuju - je zajímavý nejen těma clamp diodama.

Doplnění: Tady je aktuální blog autora: https://gregdavill.com/ Pěkný posun od té doby...

Doplnění 2: Když už je tohle téma "... na baterky", tak tady je zajímavý test AA baterek: https://hackaday.io/project/178881-batt ... es/details Ever wondered if your batteries are any good? I built a tester with data logging and tested every battery I could get my hands on.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Jak provozovat "Arduino" na baterky

Příspěvek od daton »

Zdravím tak dnes jsem se konečně dostal k pokračování a měření.
Tak že LG se chová ne uplně tak jak jsem si představoval.
Při komunikaci po seriovém portu je to při 5V kolem 27mA. V příadě odpojení usb kabelu jako celku je to 23mA ale v případě zapojení desky s převodníkem bez komunikace s PC už je to jen 16mA.
Myslel jsem že něco naženu odpojením napájení na převodníku USB-LGT (pin 16) ale není tomu tak. Tento čip se při zapojení desky bez přítomnosti \PC chová jako mrtví brouk a odpojením jeho napájení se naopak proud zvýší, asi LG hledá svůj převodník a to dost brutálně až na 50mA.
Tak že nejlepší výsledky jsou pokud se zapne deska bez pc pak jsou spotřeby
napětí normal mod spánek
5V cca 17mA 9mA
4,5V 15 mA 8mA
4 V 13 mA 6mA
3,5 V 11mA 4mA

Spánek je v režimu programu z knihovny příkladů PMU autoweekap. Změnou frekvence dle Fuldy na 8MHz se spotřeby příliš nezměnily. Tak že zařadit spánek se jeví jako výhodná věc, jenže se deska přestane uspávat, jakmile se vloží čtení z analogoého portu, tedy po zadání příkazu např
(analogRead(A0))
se prostě deska neuspí a tedy nejde ani do nízké spotřeby.

Jinak omlouvám se za nepřesnosti které jsem zde uvedl, jako že program zapomíná ve spánku, na vině byla chybička v programu, za což se omlouvám ( pamatuje si lišák :-) ) .
Jinak jsem zkoušel jaký rozdíl je v napájení na 5V pin s odpojeným VIN vstupem a s VIN na napájecím napětí a nezaznamenal jsem změnu v odběru.

Potřeboval bych ale poradit zda lze nějak vyřešit to uspávání i když snímám hodnoty z analogových vstupů. Je to možné nějak vyřešit?
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Jak provozovat "Arduino" na baterky

Příspěvek od DavidO »

daton píše: 23 dub 2021, 13:25 Myslel jsem že něco naženu odpojením napájení na převodníku USB-LGT (pin 16) ale není tomu tak. Tento čip se při zapojení desky bez přítomnosti \PC chová jako mrtví brouk a odpojením jeho napájení se naopak proud zvýší, asi LG hledá svůj převodník a to dost brutálně až na 50mA.
To zvýrazněné musel být asi vtip, jinak bych si pomyslel, že zkoušíš naši trpělivost :roll:
Nicméně, to se zvýšením odběru - co si myslíš, že se stane, když převodníku odpojíš jen pin VDD a přitom neodpojíš GND a všechny ostatní piny, zejména ty, na kterých se komunikuje? Vždyť mu tam skzr ně tlačíš napětí! Jak to asi může dopadnout? Blbě. To platí zcela obecně, ale je to napsané i zcela konkrétně v datasheetu HT42B534: napětí na vstupním pinu NESMÍ být vyšší, než VDD+0.3V. Když VDD je odpojený a na vstupním pinu máš připojený výstup USARTu z LG, kolikpak Voltíků tam je v idle stavu, aha?
daton píše: 23 dub 2021, 13:25 Spánek je v režimu programu z knihovny příkladů PMU autoweekap. Změnou frekvence dle Fuldy na 8MHz se spotřeby příliš nezměnily. Tak že zařadit spánek se jeví jako výhodná věc, jenže se deska přestane uspávat, jakmile se vloží čtení z analogoého portu, tedy po zadání příkazu např
(analogRead(A0))
se prostě deska neuspí a tedy nejde ani do nízké spotřeby.
Potřeboval bych ale poradit zda lze nějak vyřešit to uspávání i když snímám hodnoty z analogových vstupů. Je to možné nějak vyřešit?
Tohle zase souvisí spíš s tím konkrétním procesorem, než s tím, jak provozovat Arduino na baterku, takže by to spíš mělo být v jiném vlákně. Stručná odpověď je: ano. Ono těžko radit lépe, když jsi nám zase neukázal program. Hádám, že asi budeš mít zase chybičku.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Jak provozovat "Arduino" na baterky

Příspěvek od daton »

Ahoj
jo tohle dává smysl
co si myslíš, že se stane, když převodníku odpojíš jen pin VDD a přitom neodpojíš GND a všechny ostatní piny, zejména ty, na kterých se komunikuje? Vždyť mu tam skzr ně tlačíš napětí!
Zjímavé ale je ... a ted už se to bojím napsat abych zase nedostal potupné komentáře.. že to zvýšení proudu se projeví jen v určitém režimu při odpojení toho napájení. Jinak je proud nižší. Je možné že to souvisí s komunikací.

Ten program je poměrně jednoduchý a využívá ten příklad z knihovny PMU jak jsem psal.

Kód: Vybrat vše

#include <PMU.h>

volatile uint8_t g_LastState;
volatile uint8_t g_IntFlag;
int a=0;
void setup()
{
  Serial.begin(9600);

  pinMode(2,INPUT);
  digitalWrite(2, HIGH);

  attachInterrupt(0, donothing, FALLING);
  g_LastState = digitalRead(2);
  g_IntFlag = 0;
}

void loop(){
 Serial.println (analogRead(A0));
   Serial.println ("  tak znovu");
   delay(500);
   spanek();  
}

 
void spanek()
{
    Serial.write("hello, I am working!\n");
  
   
    // power/down mode 
    if(g_LastState == HIGH)
    {
      Serial.println("Change to falling");
      attachInterrupt(0, donothing, FALLING);      
    }
    else
    {
      Serial.println("Change to rising");
      attachInterrupt(0, donothing, RISING);      
    }

    Serial.flush();
  
    PMU.sleep(PM_POFFS0, SLEEP_8S);  
    g_LastState = digitalRead(2); 
}

void donothing()
{
    //g_IntFlag = 1;
}

Tak doufám že zde chybičku nemám, jde o to že pokud se čte analogový vstup tak se to na 8s neuspí a pokud se řádek s čtením zakomentuje tak je s uspáváním vše ok tak nevím.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Jak provozovat "Arduino" na baterky

Příspěvek od DavidO »

Odpovím, aniž bych to příliš podrobně zkoumal, ale je tam pár věci, ke kterým se umím i bez zkoumání vyjádřit:
daton píše: 24 dub 2021, 19:44 Ahoj
jo tohle dává smysl
co si myslíš, že se stane, když převodníku odpojíš jen pin VDD a přitom neodpojíš GND a všechny ostatní piny, zejména ty, na kterých se komunikuje? Vždyť mu tam skzr ně tlačíš napětí!
Zjímavé ale je ... a ted už se to bojím napsat abych zase nedostal potupné komentáře..
Čím dýl budeš ignorovat dokumentaci Arduina, datasheety použitých obvodů, naše rady a selský rozum, tím potupnější budou ;) (*)
daton píše: 24 dub 2021, 19:44 že to zvýšení proudu se projeví jen v určitém režimu při odpojení toho napájení. Jinak je proud nižší. Je možné že to souvisí s komunikací.
To mi smysl dává: USART má v idle stavu vysokou úroveň. Tím, že to strkáš do toho převodníku, tak ti vyjde vysoký odběr. Když začneš komunikovat (ve tvém kódu je těch "Serial.println" hromada), tak určitě nějaké bitíky budou nula, tím pádem na tvém Tx pinu připojeném na vstup převodníku nebude po dobu toho nulového bitu to nepřiměřené napětí a tím pádem tam ta spotřeba na dobu trvání toho bitu klesne. Měřákem neuvidíš, že to chvilkově kleslo, ale zprůměruje ti to, takže čím víc nul, tím míň Adidas proudu skrz převodník.
daton píše: 24 dub 2021, 19:44 Ten program je poměrně jednoduchý a využívá ten příklad z knihovny PMU jak jsem psal.
Tak určitě bych psal místo pinMode(2,INPUT); digitalWrite(2, HIGH); tohle: pinMode(TLACITKO,INPUT_PULLUP);, tj. jednak si ten pin pojmenovat, a pak hlavně ho nastavovat metodicky a ne prasácky. Ale tím to nebude, to je jen taková z neznalosti běžná chyba (důvod: pokud chceš zapnout pin na vstupní s pullupem, tak na to je INPUT_PULLUP. Že se to na nějakém konkrétním Arduinu (teda všech s AVR) dá udělat přepnutím pinu na vstup a zapsáním vysoké úrovně, to je sice možný, ale na jiných Arduinech to tak nemusí být. Bohužel ti co píšou příklady a knihovny, jsou prasata a neumí programovat kulturně, a pak to od nich lidi kopírujou. Na jiném Arduinu to může být úplně jinak, a pak bys tímhle postupem ten pullup třeba nezapnul (i když, vzhledem k přístupu autorů Arduina bych se vůbec nedivil, kdyby to autor toolchainu pro tu jinou platformu speciálně ošetřil, protože by věděl, že programátoři jsou prasata a uživatelé tuponi a takhle to prostě kopírujou, takže by na takovouhle konstrukci udělal spěšl háček... no ale to je spekulace hodná konspiračních odhalovačů) Tady s tím tvým LG ti to ale projde, jednak se to snaží být kopií AVR kde to tak je, ale hlavně v datasheetu se jasně o téhle kombinaci píše 内部上拉模式).
daton píše: 24 dub 2021, 19:44 Tak doufám že zde chybičku nemám, jde o to že pokud se čte analogový vstup tak se to na 8s neuspí a pokud se řádek s čtením zakomentuje tak je s uspáváním vše ok tak nevím.
Zdá se mi, že si věšíš donothing na reset interrupt, to je správně? (možná jo, jestli to je example z knihovny, ale když se v dokumentaci Arduina píše "not recommended" tak možná autoři Arduina tušej, proč)
Pak si taky zkontroluj, jak to je s watchdogem, který ten PMU.sleep používá, a jak je v této souvislosti implementované AnalogRead na LG, jestli to třeba nezapíná do free run, který by to pak nějak probouzel. Nevím, tohle najdeš v kódu Arduina pro LG a abych pravdu řekl, to už se mi zkoumat nechce.

(*) Navíc to obvykle nemyslíme zle, ale snažíme se tě přimět k prozření "to sem ale trumpeta, vždyť je to táák jasnýýý" :mrgreen:
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Jak provozovat "Arduino" na baterky

Příspěvek od daton »

Jasně chápu tohle měl být rychlý projekt před započetím letních prací, už ted se mi to protáhlo a ty tvoje rady mi prostor pro práci rozhodně nedávají tak že celkově všem dík ale vyřeším to po svém protože jsem v podstatě nijak nepokročil. kdyby jsem zprovoznil to uspávání možná by to trochu pomohlo ale to je asi pase tak že prostě budu pracovat s tím co mám a co zmůžu. ;)
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Jak provozovat "Arduino" na baterky

Příspěvek od DavidO »

Upřesňuji:
daton píše: 24 dub 2021, 19:44

Kód: Vybrat vše

...
  attachInterrupt(0, donothing, FALLING);
...
DavidO píše: 24 dub 2021, 21:27 Zdá se mi, že si věšíš donothing na reset interrupt, to je správně? (možná jo, jestli to je example z knihovny, ale když se v dokumentaci Arduina píše "not recommended" tak možná autoři Arduina tušej, proč)
Tady to byla ode mě nesprávná úvaha, funkce donothing zde NENÍ pověšená na reset interrupt. Pro poučení podávám elaborát, jakou chybu v úvaze jsem udělal:

Reset interrupt má číslo 0 (to tak je jak na AVR, tak na LG8Fxx a v tom chyba ještě není). Volání attachInterrupt s číslem interruptu 0 tak jak to je napsané nahoře proto ve mě vzbudilo dojem, že ta funkce má reagovat na reset, obzvlášť když první věta popisu (v oficiální dokumentaci Arduina) říká "The first parameter to attachInterrupt() is an interrupt number."
Ale to bylo chybné pochopení (moje). attachInterrupt má jako ten parametr sice opravdu číslo interruptu, ale to je číslo externího interruptu, nikoli interruptu jako takového. "Interrupt 0" je něco jiného, než "Externí interrupt 0", rozdíl asi jako mezi aktem a pietním aktem nebo socialismem a reálným socialismem.

Nicméně i tak ten program cos vzal jako příklad ke knihovně není napsaný správně. Dokumentace k attachInterrupt říká zcela natvrdo hned v prvním odstavci toto:
Normally you should use digitalPinToInterrupt(pin) to translate the actual digital pin to the specific interrupt number. For example, if you connect to pin 3, use digitalPinToInterrupt(3) as the first parameter to attachInterrupt().
Neboli, volat attachInterrupt(0, cokoli dalšího) je nesprávně.

Následně, v odstavci Syntax, se ještě jednou píše:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) (recommended)
attachInterrupt(interrupt, ISR, mode) (not recommended)
attachInterrupt(pin, ISR, mode) (Not recommended. Additionally, this syntax only
works on Arduino SAMD Boards, Uno WiFi Rev2, Due, and 101.)
Opět, důležité jsou ty závorky na koncích řádků, "recommended" versus "not recommended", to jsem myslel tím "když se v dokumentaci píše "not recommended" tak možná autoři Arduina tušej, proč". NIKDY se nespoléhej na cokoli, co je "not recommended" - to je ten selský rozum.

Jenže autoři knihoven jsou prasata a píšou to jak se jim chce a ne jak to má být. V tomhle případě měl autor napsat něco jako attachInterrupt(digitalPinToInterrupt(D2), donothing, FALLING);.

Nicméně, to není ten problém, je to sice napsané hnusně, nedoporučeným způsobem, ale připojení obslužné rutiny donothing na vnější interrupt 0, který je obsluhován na AVR pinem D2, by takto fungovat mohlo.

Následná otázka je, jestli to je stejně i na LG8Fxx. Možná ano, možná ne. Nevím, to je schované v dokumentaci implementace Arduina pro LG8Fxx (pokud vůbec existuje, pochybuju), dokumentaci samotného kontroleru LG8Fxx a ve zdrojákách knihovnen pro LG8Fxx, nikoli v dokumentaci Arduina pro AVR a knihovnách pro AVR.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Odpovědět