Energy Saving

English version.

Wer sein Arduino gerne mit einer Batterie oder einem Akkupack über längere Zeiträume betreiben will kennt das Problem: Wie versorge ich es ausreichend? Natürlich kann man ganz einfach ein sehr großes Akkupack nehmen, um dafür zu sorgen, dass der Mikrocontroller lange genug durchhält, doch eine wesentlich elegantere Methode ist, das Arduino – genauer gesagt den ATmega 328 – in einen Energiesparmodus zu setzen. Wie das geht, und welche Tricks es noch gibt findet man in diesem Beitrag.

Der Code

Die wenigen Zeilen Code befinden sich natürlich auf GitHub.

Was verbirgt sich dahinter? Zuerst möchte ich die Methoden erklären, wie man Energie sparen kann:

  • Alle ungenutzten Geräte abschalten, damit meine ich LED’s, Displays und Module. Hierfür muss jedoch die Hardware passend ausgelegt sein.
  • Alle ungenutzten Pins auf „INPUT“ setzen, da dies am ATmega am wenigsten Strom benötigt.
  • Die analog to digital conversion abschalten. Dies sollte man nur tun, wenn man diese auch wirklich nicht braucht.
  • Die Taktgeschwindigkeit reduzieren – das ist nur in der Hardware möglich, da der Takt vom Quarz erzeugt wird.
  • Brown-Out abschalten. Hierbei handelt es sich um die Erkennung sehr geringer Spannungen. Dafür muss eine sehr kleine Vergleichsspannung erzeugt werden, und dies verbraucht natürlich die kostbare Energie.
  • Das Arduino in den Energiesparmodus setzen.

Das Programm arbeitet mit Interrupts. Wird ein solcher Interrupt an einem Pin ausgelöst, so wird eine damit verbundene Funktion aufgerufen. In diesem Fall heißt die Funktion interruptHandler.

attachInterrupt(0, interruptHandler, RISING);

RISING bedeutet, dass die Funktion nur dann aufgerufen wird, wenn die Spannung am Pin vom logischen Level 0 zum logischen Level 1 wechselt, also von 0 nach 5 Volt.

Der Interrupt wird durch das Drücken eines Buttons ausgelöst. Dabei ist die Funktion so geschrieben, dass das Betätigen des Buttons den Energiesparmodus sowohl starten, als auch beenden kann.

Die Funktion sleepMode arbeitet alle nötigen Schritte ab, um den Mikrocontroller in der Energiesparmodus zu versetzen.

noInterrupts();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
interrupts();
sleep_cpu();

Die Interrupts müssen während der Initialisierung abgeschalten werden! Ansonsten könnte es passieren, dass ein solcher genau während dieses Zeitraums passiert. Die Folge wäre, dass der Controller nicht mehr aufwacht.

Im Großen und Ganzen war dies der gesamte Code. Die Funktion sleepMode kann natürlich an jeder beliebigen Stelle im Code aufgerufen werden, und muss nicht durch einen Interrupt aufgerufen werden.

Der Aufbau

Der Aufbau ist denkbar einfach. Einfach einen Button an den Pin 2 anhängen. Den 10kΩ Widerstand nicht vergessen!

Energy_Saving_Breadboard

Dieser Aufbau reicht, um das Arduino in den Energiesparmodus zu versetzen. Leider ist diese Methode nicht das Gelbe vom Ei. Der Grund ist, dass das Board an sich sehr viel Energie verbraucht. Vor allem für die serielle Kommunikation, aber auch der interne Spannungswandler verbrauchen sehr viel.

Die bessere Lösung ist, selbst ein Arduino zu bauen. Dies ist mit wenigen Handgriffen und günstigen Komponenten schnell erledigt. Allerdings gibt es in meiner Version keine Möglichkeit mehr für einen serielle Kommunikation. Die beiden folgenden Abbildungen zeigen den Aufbau.

 Energy_Saving_Standalone_Breadboard

 Energy_Saving_Standalone_Shematic

Für den Aufbau benötigt man folgende Komponenten:

An die USB-Buchse kann man nun sehr leicht eine Power-Bank anschließen, oder ein USB-Netzteil anschließen. So kann man ohne viel Aufwand ein Arduino standalone betreiben. Den Programmcode muss man hier etwas umständlich auf das ATmega übertragen: Zuerst entnimmt man dem Arduino seinen originalen Controller. Danach setzt man den zu bespielenden in das UNO ein. Danach startet man den Upload des Programms. Ist dies abgeschlossen, kann der neue Controller wieder entnommen werden, und in die Schaltung eingesetzt werden.

Der Vergleich

Hier möchte ich die Ströme auflisten, welche das Board in seinen unterschiedlichen Formen benötigt.

  • Das Arduino UNO benötigt in seiner unveränderten Form und ohne Energiesparmethoden etwa 50 mA, was schon eine ganze Menge ist.
  • Ist der Energiesparmodus aktiv, so benötigt das UNO zirka 34.5 mA. Siehe da, man hat etwas eingespart, aber nicht viel.
  • Das selbst gebaute Arduino benötigt, ohne Energiesparmethoden nur mehr 15.15 mA. Das ist eine schon recht gute Einsparung, da die serielle Kommunikation, die LED und der Spannungswandler wegfallen.
  • Und schaltet man dann noch den Energiesparmodus ein, dann verbraucht es nur mehr 0.6 μA ( = 0.006 mA ).

Würde man sein Arduino an eine Spannungsversorgung mit 0.05 Ah hängen, so würde es eine Stunde lang laufen, ehe der Akku leer ist. Das selbstgebaute Board würde im Energiesparmodus mit dem gleichen Akku 8333,3 Stunden lang laufen. Das sind etwa 347 Tage, also fast ein Jahr.

Bleibt nur mehr eines zu sagen: Happy Hacking!

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s