De meest gebruikte Arduino is waarschijnlijk de Arduino Uno. Met een voedingspanningsbereik van 7-12 [V] (aanbevolen) is de Arduino Uno prima bruikbaar voor batterij gevoedde toepassingen. Veelal kies je daarbij voor een 9 [V] blok-batterij (types 6R61, MN1604) of voor een zestal AA-penlights (types LR 6, MN1500).
Deze laatste hebben significant meer opslagcapaciteit en geven dus meer gebruiksduur. Een eenmalig experiment met alleen de Arduino Uno en de “blink” sketch, dus zonder extra hardware zoals shields, sensoren, LEDs of motoren, bleek uit te komen op een gebruiksduur van ruim 50 uur. Da’s op zich niet onaardig maar het kan veel beter, in deze blog leg ik uit hoe!
Stap 1: Reduceer de klokfrequentie en de voedingsspanning.
Een standaard Arduino Uno gebruikt een ATmega328p microcontroller van Atmel die draait op een klokfrequentie van 16 [MHz] en een voedingsspanning van 5 [V]. Zoals bijgaand figuur laat zien is het stroomverbruik bij die waardes ca 9.5 [mA]. Prima als je die 16 [MHz] nodig hebt vanwege ‘zware’ berekeningen, of wanneer je de 5 [V] nodig hebt vanwege de aangesloten sensoren, actuatoren of shields. Maar als je zou kunnen volstaan met bijv 8 [MHz] en 3.3 [V] dan kun je daarmee het stroomverbuik met ruim een factor 3 reduceren tot ca 3 [mA].
Stap 2: Optimaliseer het voedingscircuit en het aantal batterijen
De Arduino Uno gebruikt een standaard 7805 als voedingsspanningsregulator voor de 5 [V]. Voor veel toepassingen een prima oplossing maar met een aantal beperkingen voor batterij gevoedde systemen. Zo is de ruststroom van deze 7805 regulaar relatief hoog. Een Arduino Uno (in Idle mode) verbruikt daardoor al ca 10 [mA]. Verdere heeft de 7805 een redelijk grote drop-out voltage (=Vin-Vout) wat resulteert in onnodige warmteverliezen.
Voor batterij gevoedde toepassingen heeft Sparkfun daarom de Arduino Pro ontwikkeld. Deze Pro versie maakt gebruik van een MIC5205 regulator. Voordelen van deze regulator zijn een aanmerkelijk lagere ruststroom en een aanmerkelijk lagere drop-out voltage. Verder is de Arduino Pro ook in een 8 [MHz], 3.3 [V] versie verkrijgbaar. Een Arduino Pro kan daardoor gevoed worden met slechts 3 AA penlights of met een (oplaadbare) 3.7 [V] Lithium-Polymere batterij (LiPo).
Stap 3: Reduceer het energieverbruik mbv de “Sleep-mode” van de microcontroller
De Atmel microcontroller beschikt over zgn “sleep-mode” functies waarmee ongebruikte delen van de microcontroller (tijdelijk) uitgeschakeld kunnen worden. Het stroomverbruik van de microcontroller wordt hierdoor (tijdelijk) ook lager. Zodra de microcontroller daarna weer in aktie moet komen dan zal deze uiteraard eerst weer ‘wakker gemaakt’ moeten worden, bijvoorbeeld middels een ‘timer’ of ‘UART’-interrupt.
Een typische toepassing voor dit mechanisme is data acquisitie; het vergaren van meetsignalen. Hierbij worden op gezette tijden een of meer sensoren afgetast en vervolgens worden de meetwaardes lokaal opgeslagen of opgestuurd naar een centrale verzamelplaats. In de tussenperiodes heeft de microcontroller eigenlijk niets te doen en wordt er onnodig stroom verbruikt. Je zou de microcontroller op die tussenmomenten beter tijdelijk kunnen uitschakelen en met vaste intervallen weer kunnen inschakelen.
De grootste reductie in stroomverbruik wordt bereikt met “SLEEP_MODE_PWR_DOWN” modus. Hiermee wordt vrijwel de gehele microcontroller in slaapstand gebracht. Alleen een watchdog timer interrupt (of een harde reset) kan de microcontroller nu nog doen ontwaken. Een watchdog timer heeft vele functies. Een daarvan is het generen van een interrupt nadat een vooraf ingesteld interval is verstreken. Ideaal dus voor het eerder genoemde data acquisitie voorbeeld.
Experiment
Om de invloed van de ‘sleep-mode’ op het stroomverbruik te kunnen meten heb ik een eenvoudige Arduino sketch geschreven; een low-power variant op de standaard “blink” sketch. Ook nu wordt LED13 met vaste intervallen uit- en weer aangeschakeld. Maar nu worden om-en-om de standaard “delay()” functie (met een stroomvretende softwareteller), en de “SLEEP_MODE_PWR_DOWN” functie (waarbij de watchdog timer de Arduino na de ingestelde wachttijd weer ontwaakt) gebruikt, zie onderstaand plaatje. Er zijn achtereenvolgens 4 toestanden te onderscheiden:
- Arduino SW-delay en LED13 aan (2 [sec]) : 5.6 [mA]
- Arduino sleep-mode en LED13 aan (1 [sec]) : 2 [mA]
- Arduino SW-delay en LED13 uit (2 [sec]) : 4.4 [mA]
- Arduino sleep-mode en LED13 uit (1 [sec]) : 0.6 [mA]
Duidelijk waarneembaar is het verschil in stroomverbruik tussen de ‘delay()’-mode en de “sleep-mode”. Merk op dat voor deze test een Arduino-pro 8 [MHz], 3.3 [V] toegepast is omdat het effect bij een Arduino Pro beter meetbaar is dan bij een Arduino Uno vanwege het eerder besproken voedingscircuit. Tenslotte is de rode power-on LED op de Arduino Pro zeer waarschijnlijk de reden voor de resterende 0.6 [mA] in sleep-mode.
Referenties
[ref 1] Batterijen: https://nl.wikipedia.org/wiki/Batterij_(elektrisch)
[ref 2] ATmega328p: https://www.atmel.com/devices/atmega328.aspx
[ref 3] Arduino Uno: https://arduino.cc/en/Main/ArduinoBoardUno
[ref 4] Arduino Pro: https://arduino.cc/en/Main/ArduinoBoardPro
[ref 5] Regulator with low dropvoltage and low quiescent current: https://www.micrel.com/_PDF/mic5205.pdf
[ref 6] Lithium-Polymeer batterijen: https://learn.adafruit.com/li-ion-and-lipoly-batteries
[ref 7] Arduino sleep modes: https://playground.arduino.cc/Learning/ArduinoSleepCode
[ref 8] Arduino watchdog timer: https://www.youtube.com/watch?v=BDsu8YhYn8g
[ref 9] Experiment sketch: https://www.felixdonkers.nl/downloadables/blinkWithSleepMode.zip
[ref 10] Nog een “sleeping Arduino” voorbeeld: https://donalmorrissey.blogspot.nl/2010/04/sleeping-arduino-part-5-wake-up-via.html