Dienstag, 23. Juni 2015

Stand-by-Modus für den Arduino

In diesem Artikel geht es darum, welche verschiedenen Standy-by-Modi es für den Arduino gibt, und wie man sie verwendet. Dadurch verbraucht ein +Arduino  weniger Strom, wodurch ein längerer Batteriebetrieb möglich ist.


Die verschiedenen Stand-by Arten

Es gibt verschiedene Arten des Standy-by-Modus für den Arduino. Dadurch kann man dann Chips, beispielsweise für die USB/serial Kommunikation abstellen, oder eben nicht, wodurch sich zusätzlich Strom sparen lässt. Natürlich ist es auch möglich Funktionen einzeln abzustellen.
Vorneweg: Der Arduino (Uno) benötigt schon aufgrund seiner Power LED eine Menge Strom. Deshalb ist es sinnvolle die Schaltung erst mit dem Arduino auszuprobieren, und dann einen Mikrocontroller allein zu verwenden. Zusätzlich spart man sich Kosten, da das Arduinoboard mehr als der darin enthaltene Mikrocontroller kostet. 
  • SLEEP_MODE_IDLE
  • SLEEP_MODE_ADC
  • SLEEP_MODE_PWR_SAVE
  • SLEEP_MODE_STANDBY
  • SLEEP_MODE_PWR_DOWN
Das sind die fünf verschiedenen Standby Arten. Der IDLE Modus benötigt am meisten Strom, dafür funktioniert beispielsweise auch die serielle Kommunikation. Auch alle Interrupts werden unterstützt. Der Stromverbrauch wird dann bis zum PWR_DOWN Modus gedrosselt, wo nur einige Interrupts funktionieren. Diese sind auch dringend notwendig. Denn wie teilt man denn einem Mikrocontroller mit, dass er wieder aufwachen soll? Mit Interrupts!

Arduino in Stand-by-Modus schalten

Um den Arduino in einen SLEEP_MODE zu versetzen, sind ein paar Schritte und Bibliotheken notwendig. Zunächst einmal muss man sich entschieden, wie man den Arduino wieder aufwecken will. Das geht über die verschiedenen Interrupts. Also entweder über einen Button, über einen Timer, oder über einen Watchdoginterrupt. Theoretisch könnte man ihn auch über die serielle Verbindung aufwecken, wobei man in der Praxis selten einen PC angeschlossen haben wird, und wenn doch, dann  spielt der Stromverbrauch des Arduino sowieso keine Rolle, im Vergleich zu dem des PC. Ich werde im Folgenden exemplarisch das Blinken einer LED, sowie das Anschalten der LED, sobald ein Knopf gedrückt ist, mit einem Stand-by-Modus stromsparend realisieren.

Stand-by mit "Buttoninterrupt"

Am Anfang des Sketches muss man zwei Bibliotheken nachladen um die SLEEP_MODEs zu verwenden. Diese sind bereits mit der Arduino IDE mitinstalliert. Im Setupteil wird der Pin, an dem die LED angeschlossen ist, als OUTPUT definiert und der Interrupt an Pin 2 definiert. Im Loopteil wird die LED angeschaltet, drei Sekunden gewartet, und die LED wieder ausgeschaltet. Danach wird die Funktion enterSleep() aufgerufen. In dieser wird der Standbymodus gestartet. Sobald der Interrupt von Pin 2 ausgelöst wird, wird die Funktion des Interrupts aufgerufen. Nachdem diese leer ist, wird gleich die nächste Zeile ausgeführt. Das ist die Zeile in enterSleep(), die den Standbymodus deaktiviert. Dadurch landen wir dann wieder in der Hauptschleife, die die LED an und aus macht. Die LED ist an Pin 13 angeschlossen, und der Button an Pin 2, sowie den Ground und die 3.3V Spannung.

Stand-by mit Watchdoginterrupt

Mit einem Watchdoginterrupt lässt sich prima der Stand-by-Modus nach einer gewissen Zeit deaktivieren. Der Vorteil gegenüber dem Timer ist, dass der Watchdoginterrupt bis zu 8 Sekunden lang sein kann (Timer 4s). In diesem Fall wollen wir, dass eine LED alle 8 Sekunden ihren Status ändert, also sehr langsam blinkt. Dazu lassen wir bei jedem Programmneustart, verursacht durch den Watchdog, den Status ändern. Ein kleines Problem, dass aufgetreten ist, ist, dass der Watchdoginterrupt den Arduino neu startet. Dadurch ist die LED immer aus, weshalb sie immer auf HIGH gestellt wird. Ich habe das Problem gelöst, indem ich den aktuellen Status immer in den EEPROM schreibe. Dessen Inhalt bleibt auch ohne Strom bestehen. Genaues zur Verwendung des EEPROM. Der Sketch für diese Möglichkeit, den Arduino aus dem Stand-by-Modus zu holen, ist dieser:

Das sind zwei Möglichkeiten, wie man den Stand-by Modus mit dem Arduino verwendet.

Fragen und Anregungen einfach in die Kommentare schreiben.

Kommentare:

  1. Hallo,

    könntest du bitte diese Zeile erklären:

    attachInterrupt(0, interrupt, RISING); //festlegen des Interrupts an Pin 2

    Woher sehe ich das dies Pin 2 ist? Müsste es nicht Pin 0 sein?

    Viele Grüße
    Torsten

    AntwortenLöschen
    Antworten
    1. Hi,
      die Nummerierung der Interrupt Pins ist nicht gleich der normalen Nummerierung. Beim Arduino Uno ist Interrupt Pin 0 der "normale" Pin 2. Siehe auch:
      http://michaelsarduino.blogspot.de/2015/06/interrupts-mit-dem-arduino.html

      Löschen