Langdurig op batterij draaien. [ATMEGA328]

Hi allen

Ik ben bijna klaar met een project, waarbij ik de aanwezigheid van personen in een ruimte controleer, door middel van een ToF (time of flight) sensor. Deze elektronica zit in een kastje welk vrij op te hangen is, werkt op batterij(9V blok) en verstuurt zijn data middels RF (433MHz)

Nu heb ik een probleem, wat mij wat verraste, ik heb het prototype begin deze week afgerond, echter, na het controleren op de batterijduur bleek dat de batterij na 24 uur al op was. Dat is niet de bedoeling. Het zou immers op zijn minst een aantal weken moeten kunnen werken.

Ik weet dat er wat standby mogelijkheden zijn, zowel voor de ToF sensor als voor de AtMega. Echter, ik weet niet hoe ik ervoor zorg dat de AtMega/ToF ook weer snel uit zijn standby komt. De ToF sensor stuurt elke 50ms een andere waarde waardoor er nooit een constante waarde is als er niemand in de ruimte is, wat geen probleem is voor de werking maar wel de apparatuur wakker houdt. (denk aan millimeters verschil constant)

Zouden jullie misschien eens naar het schema en code willen kijken?
Please be aware: I'm not using the adafruit ToF sensor!!! instead I'm using the ST-VL53L1X

datasheet ToF sensor: https://www.st.com/resource/en/datasheet/vl53l1x.pdf
datasheet LM7805: https://asset.conrad.com/media10/add/160267/c1/-/en/000179205DS01/data…
datasheet MCP1700: https://docs.rs-online.com/5b2b/0900766b80dd189b.pdf

SCHEMA: https://imgur.com/a/K3L4A8Q

code:


/* THEBULB. THE SO-LOO-TION SENSOR */

#include <Wire.h>
#include <VL53L1X.h>

VL53L1X sensor;


void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(12, OUTPUT); 
 
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Let op: de sensor wordt momenteel niet gedetecteerd. Controleer aansluitingen. ");
    while (1);
  }
  
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);
  sensor.startContinuous(100);

}

void loop()
{  
  Serial.print(sensor.read());

  if (sensor.readRangeContinuousMillimeters () <=1000 ) {  //schakelafstand wordt hier ingevoerd. Onder deze waarde is de schakeling actief. 
    digitalWrite (LED_BUILTIN, HIGH);
    digitalWrite (7, HIGH);
    digitalWrite (12, HIGH); 
    }else {                                              //hoger dan de schakelafstand.      
    digitalWrite (LED_BUILTIN, LOW);
    digitalWrite (7, LOW);
    digitalWrite(12, LOW);  
    }

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT");}
  Serial.println();
}
bprosman

Golden Member

Het eerste wat me opvalt (zonder ook maar naar stand-by opties gekeken te hebben) is de 9V batterij die in een 7805 gaat.
Dat is energietechnisch natuurlijk wel een hele "dure"oplossing.
Kun je niet iets met een 3.7V batterij ?

De jongere generatie loopt veel te vaak zijn PIC achterna.

Een 9v batterij is niet echt een goede keuze... (2x AA of een CR2477 is daar veel beter geschikt voor)
Maar binnen een dag leeg is wel heel erg. Data veel minder vaak versturen en zendvermogen van de 433 module zo laag als mogelijk zetten...

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

De 7905 trekt zelf al max 6 mA. Dat is 144 mAh per dag.

De AtMega328 op 5V full speed trekt 10 mA.

En de TOF sensor trekt 16 mA tijdens 'ranging'. De AtMega staat voortdurend de sensor uit te lezen, dus die staat continue in 'ranging'

Dus samen 32 mA ofwel 768mAh per dag. Best wel knap van die batterij.

Kun je eens meten wat het stroomverbruik is?
En dan inderdaad een andere voeding.

Beste is direkt uit een lithium batterij 3V6.

En in de loop() een delay inbouwen met een sleep mode.
Of een lagere frequentie voor de AtMega. Dan heb je nog altijd een delay nodig om de sensor stroom te verlagen, maar de Atmega hoeft dan niet meer in Sleep mode. (Op 3V6 en 1 MHz heeft die genoeg aan 1 mA)

PS:
Een 9Volt blok batterij heeft een capaciteit van 500 .. 1000 mAh
Een 18650 Lithium batterij haalt 3000 mAh

Ik dacht dat een 9V batterij maar ca 300mAh had anders zou in Wh de capaciteit van beide gelijk zijn

3,4 x 3000 = 10,2Wh
9 x 1000 = 9Wh

En dat kan niet

Kijk eens naar de LowPower library.

Ik maak zelf gebruik van die library, 328p en sensor. Daarmee haal ik tijden van ongeveer een jaar op 1 3.7V batterij.

Je kunt je sensor in sleep mode zetten en op interrupt wakker later worden, dan je ding doen en weer gaan slapen.
Mijn IR sensor werkt op die wijze.

Hangt er vanaf.

Er is nogal veel verschil tussen de verschillende merken en uitvoeringen. 1000 mAh is voor alkaline Wikipedia). Een oplaadbare komt niet veel verder dan 200 of 300 mAh

hennep

Golden Member

Iets wat je heel snel kunt uitproberen, die 3.7V cell die al is genoemd en ook de klok omlaag. Bij 5V is de supply current wel ongunstig te noemen.
De sensor werkt al vanaf 2.6V dus de voedingsspanning van de controller kan nog iets lager, maar doe dat dan met een schakelende regelaar ipv. een lineaire.

Zie dit knipsel uit de datasheet:

Dank! Ik heb de L7805 verwijderd, ik draai nu direct op 3V.
Als ik meet dan gebruik ik constant 15-18mA, wanneer de sensor actief is zit ik op 28mA tot 30mA. Bij constant aan zit ik dan op 66u. Dat is best aardig, maar meer is beter :)

De lowPower library heb ik ook toegevoegd, echter, ik merk niet heel veel verschil. Dat komt hoogstwaarschijnlijk omdat ik dat (ook) niet goed doe.

Het liefst zou ik willen dat de setup gaat slapen als er niemand is in de ruimte.

Echter, doordat de sensor constant wisselt in waarde is het lastig om een trigger te maken waar mee hij wakker wordt, evenals dat het lastig is om de setup te laten lopen

Dit is mijn code momenteel

code:


/* THEBULB. THE SO-LOO-TION SENSOR */
#include <Wire.h>
#include <LowPower.h>
#include <VL53L1X.h>

VL53L1X sensor;


void setup()
{
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000); // use 400 kHz I2C

  pinMode(LED_BUILTIN,OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(12, OUTPUT); 
 
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Let op: de sensor wordt momenteel niet gedetecteerd. Controleer aansluitingen. ");
    while (1);
  }
  
  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);
  sensor.startContinuous(100);

}

void loop()
{  
  LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
  Serial.print(sensor.read()); 

  if (sensor.readRangeContinuousMillimeters () <=1000 ) {  //schakelafstand wordt hier ingevoerd. Onder deze waarde is de schakeling actief. 
    digitalWrite (LED_BUILTIN, HIGH);
    digitalWrite (8, HIGH);
    digitalWrite (12, HIGH); 
    }else {                                              //hoger dan de schakelafstand.      
    digitalWrite (LED_BUILTIN, LOW);
    digitalWrite (8, LOW);
    digitalWrite(12, LOW);
 
    }

  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT");}
  Serial.println();
}

Op 17 juni 2020 13:17:06 schreef wvdakker:
Kijk eens naar de LowPower library.

Ik maak zelf gebruik van die library, 328p en sensor. Daarmee haal ik tijden van ongeveer een jaar op 1 3.7V batterij.

Je kunt je sensor in sleep mode zetten en op interrupt wakker later worden, dan je ding doen en weer gaan slapen.
Mijn IR sensor werkt op die wijze.

Zou je mijn code eens willen checken?

hennep

Golden Member

15 tot 18 mA is teveel voor alleen de atmega op 3V
Zou je het schema eens willen posten, waarschijnlijk zit er iets anders in dat die hoge stroom verklaart.

Hensz

Golden Member

Processor en zender kun je met veel slapen wel temmen tot een paar µA. Probleem zit 'm vooral in de sensor. Kennelijk gebruikt ie 20mW bij 10 Hz. Als je elke 50ms een meting doet, zal dat pakweg 40mW zijn. Een 9V blokbatterijtje houdt dat 2-3 dagen vol. Samen met de processor en de zendmodule kan het dus goed kloppen dat ie na een dag leeg was. Zou je de updatefrequentie verlagen tot 1Hz, dan nog gaat zo'n batterijtje maar 2 maanden mee. Ook een grote batterij gaan mensen vergeten op tijd te vervangen, dus ik zeg koperdraadjes erheen. Kun je hem daar ook aan ophangen. :)

Don't Panic!

Je kunt de voeding van alle randapparatuur (ook de sensor) toch uitzetten tijdens de sleep?

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 juni 2020 14:19:57 schreef hennep:
15 tot 18 mA is teveel voor alleen de atmega op 3V
Zou je het schema eens willen posten, waarschijnlijk zit er iets anders in dat die hoge stroom verklaart.

Aangepast schema: https://imgur.com/a/n0icMXb

Betreft de RF transmitter, dat is gewoon een afstandsbediening, uit elkaar gesloopt. heeft zijn eigen voeding.

Ik heb wel nu de reset een pullup gegeven, is ook niet per se nodig. Trek ik er ook uit.

hennep

Golden Member

Wat doet die 220 ohm weerstand?
Als dat een pullup is dan verlies je daar 14mA
Ik kan niet zien wat die aparte modules doen. Heb je die al afzonderlijk aan de voeding aangesloten om te zien wat het verbruik is?

Op 17 juni 2020 14:36:48 schreef hennep:
Wat doet die 220 ohm weerstand?
Als dat een pullup is dan verlies je daar 14mA
Ik kan niet zien wat die aparte modules doen. Heb je die al afzonderlijk aan de voeding aangesloten om te zien wat het verbruik is?

Ah sorry, die 220 ohm is een 10K, de VL53L1X heeft een XSHUT aansluiting.
In de datasheet heb ik gelezen wanneer deze een pullup krijgt dat hij automatisch in standby gaat. Echter, dat heb ik nog niet teruggezien.

Er is geen andere apparaten. De RF transmitter heeft een eigen 12v batterij'tje.

Zoals gezegd, alles uitzetten als de prcessor 'slaapt', dan spaar je enorm.
(een PIR sensor gebruiken voor bewegingsdetectie is ook veel zuiniger: die doet 't jaren op een 9v batterijtje)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Op 17 juni 2020 14:47:24 schreef Arco:
Zoals gezegd, alles uitzetten als de prcessor 'slaapt', dan spaar je enorm.
(een PIR sensor gebruiken voor bewegingsdetectie is ook veel zuiniger: die doet 't jaren op een 9v batterijtje)

Ik weet alleen niet hoe ik alles weer wakker krijg wanneer nodig..

Echter, doordat de sensor constant wisselt in waarde is het lastig om een trigger te maken waar mee hij wakker wordt,

Zou niet zo moeilijk moeten zijn je moet niet op een waarde focussen maar op een gemiddelde waarde. Als er geen beweging is zal de sensor toch een andere gemiddelde waarde afgeven dan als er beweging is. Dan ga je daar met je trigger net onder de laagste waarde zitten van een beweging maar boven de geen beweging.

Op 17 juni 2020 14:16:05 schreef DarthVader072:
[...]

Zou je mijn code eens willen checken?

Onderstaand is code voor mijn sensor incl sleep.

c code:



void setup() {
	transmit_init ();

	transmit_sleep();
  
	// delay execution of sketch for a min, to allow PIR sensor get stabilized
	delay(60000);
  
	reboot_message (IR_SENSOR, GIT_VERSION);
}

void loop() {
	if (PIRsensorState != lastPIRsensorState){
		ir_Alert (PIRsensorState);

		lastPIRsensorState = PIRsensorState;    // reset last interrupt state
	}

	intr_sleep(PINsensor, wakeUpNow);  // go to sleep - calling sleeping function
}

// Interrupt service routine or ISR
void wakeUpNow(){
  PIRsensorState = digitalRead (PINsensor);
}

void ir_Alert (bool bAct) {
    transmit_sensordata( 'i', (char *)(bAct ? "Act" : "Inact"));
}

en voor de sleepcode

c code:


// http://playground.arduino.cc/Learning/ArduinoSleepCode
void intr_sleep (int intPort, void (*userInter)(void)) {

	transmit_sleep(); // radio in sleep mode

	attachInterrupt(digitalPinToInterrupt(intPort), userInter, CHANGE);

	LowPower.powerDown (SLEEP_FOREVER, ADC_OFF, BOD_OFF);

	detachInterrupt(digitalPinToInterrupt(intPort));
}

het verschil met jou code is dat het in idle mode voor 8 seconden in sleep mode gaat (zie https://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-ard…).

Verder kan het zo zijn dat je sensor gewoon vol stroom trekt ondanks dat je ATMEGA in sleep is. Een vorige module van mij kon niet in sleep mode en heb daar dus een transistor tussen gezet die uit en aan schakelt bij het in sleep mode gaan van de atmega. Voor een interrupt sensor is dat lastiger.

Mijn sensor pakt in sleep mode ongeveer 45uA. Radio, IR en AT staan dan in sleep. de IR sensor detecteert in sleep mode nog wel beweging dus na detectie wordt de zaak wakker, zend een bericht en gaat weer in coma.

Hoe ik het heb aangepakt:
- begin met een minimaal systeem (dus zonder sensoren en leds), voor 328p zit die op ongeveer 4-5uA. Als je een 328 (zonder p) hebt is het stroomverbruik ook hoger. Verwis je dat je een 328p hebt.
- minimaliseer je stroomverbruik mbv lowpower library
- schakel element voor element bij, zo weet je waar de stroomverbruikers zitten.

Hensz

Golden Member

Op 17 juni 2020 14:54:15 schreef DarthVader072:
Ik weet alleen niet hoe ik alles weer wakker krijg wanneer nodig..

Ik heb niet de hele datasheet gelezen, c.q. ik krijg het niet gevonden, maar als je sensor in Software-standby staat, wordt ie dan niet vanzelf wakker?
Tis waarschijnlijk te mooi om waar te zijn dat 't ding met 9µA zinvolle metingen kan doen, dus dat zal het ook wel niet zijn.

Don't Panic!

Ik zou eerst meten of de sensor nu de grote verbruiker is (klinkt waarschijnlijk), en die dan met een P-channel MOSFET in zijn voeding uitzetten zolang je controller in sleep mode staat. Elke paar seconde heel even die sensor aan, meting doen, en direct die sensor weer uit.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Dat kan ook wel zonder Mosfet. Een pootje van de AtMega is sterk genoeg om zo een sensor te voeden.

Hensz

Golden Member

Pootje kan ook die sensor in diepe slaap zetten, dan gebruikt ie nog maar 5µA. Daar zit 't 'm niet in.
Vraag is vooral hoe vaak ie aan moet om gegevens te produceren waar je wat aan hebt. En hoeveel stroom vervolgens daarmee heen gaat.

Als ik dit tabelletje goed interpreteer én als 1x/sec meten voldoende is, dan zou je aan ong. 1,2mW gemiddeld verbruik kunnen komen.

Don't Panic!