Startseite>Raspberry Pi als intelligenter Wecker
Aus Raspberry Pi Geek 04/2015

Raspberry Pi als intelligenter Wecker

© Rgbspace, Fotolia

RasPi Sunrise

Martin Mohr

Auch wenn sich die Sonne hinter den Wolken versteckt: Der Raspberry Pi springt als intelligenter Wecker ein, um Sie mit einem traumhaften Sonnenaufgang sanft aus den Träumen zu holen und auf den Tag vorzubereiten.

Warum sollte man sich nicht einen eigenen Wecker bauen? Klar, Wecker gibt es schon – aber ein richtiger Raspberry-Pi-Bastler lässt sich von solchen Details nicht abhalten. Obendrein kann der RasPi-Wecker deutlich mehr als eine 08/15-Alarmuhr: Unser RasPi holt uns sanft mit unserer Wunschmusik aus dem Schlaf, bietet ein Webfrontend und simuliert sogar über ein LED-Leuchtband einen Sonnenaufgang.

Diese Anleitung demonstriert den Aufbau des Weckers Schritt für Schritt. Den Anfang macht das über den PWM-Controller des Raspberry Pi angesteuerte LED-Band; anschließend geht es um die eigentliche Aufgabe, das Wecken. Da der PWM-Controller sich um das LED-Band kümmern muss, benötigen wir dafür eine zusätzliche Soundkarte. Zu guter Letzt steht dann das Einrichten der benötigten Dienste an, wie MySQL und Apache. Eine Reihe kleiner Skripte schnürt dann das Gesamtpaket intelligent zusammen.

LED-Band ansteuern

In Bastelläden und im Versandhandel finden sich diverse LED-Bänder im Angebot. Sie unterscheiden sich hauptsächlich durch die Anzahl der LEDs pro Meter und den jeweils verwendeten Controller. Die hier verbaute Variante verfügt über 60 LEDs pro Meter und nutzt den WS2812B [1] als Controller. Jedes der LED-Elemente lässt sich getrennt voneinander ansteuern und kann 16 Millionen Farbwerte annehmen. Dazu kombiniert jedes Element das Licht dreier integrierter LEDs in den Grundfarben Rot, Grün und Blau. Die notwendige Datenübertragung erfolgt seriell über ein spezielles Protokoll, bei dem es auf das richtige Timing ankommt. Die pfiffige Bibliothek Wiring Pi hilft beim Ansteuern via Software [2].

Hinweis

Theoretisch macht es keinen Unterschied, ob Sie den RasPi-Wecker auf Basis eines Raspberry Pi der ersten Generation oder auf einem neuen RasPi 2 aufbauen. In der Praxis jedoch funktioniert aktuell (Stand Mitte Mai 2015) aufgrund eines Bugs [4] die WS281X-Bibliothek [5] nicht mit dem Raspberry Pi 2.

Bezugsquelle

Am günstigsten bekommen Sie microcontrollergesteuerte LED-Bänder über Portale wie Ebay oder AliExpress direkt aus China. Möchten Sie nicht vier Wochen auf den Versand nach Deutschland warten, müssen Sie sich nach lokalen Lieferanten erst mal umsehen. Eine von Hardware-Bastlern gern genutzte Anlaufstelle ist beispielsweise der Electronic Experience Store eXs [6].

Das für diesen Artikel ausgewählte LED-Band misst in der Länge 5 Meter. Leuchtet jede LED mit maximaler Helligkeit, zieht es somit stattliche 18 Ampere Strom: 5 Meter x 60 LED-Module/Meter x 3 LEDs/Modul x 20 mA/LED. Der Hersteller gibt eine maximale Leistungsaufnahme von 90 Watt an, was 18 Ampere bei 5 Volt entspricht. Selbstredend überfordert ein derartiger Leistungshunger den GPIO-Port des Raspberry Pi, Sie benötigen also zwangsläufig ein externes Netzteil.

Bei ersten Tests mit einem Labornetzteil lag der Strombedarf mit dem Beispielprogramm strandtest.py aus der WS281X-Bibliothek zwar erheblich niedriger, trotzdem sollten Sie sich an die Vorgaben des Herstellers halten und ein entsprechend dimensioniertes Netzteil verwenden. Außerdem empfiehlt es sich, das LED-Band von beiden Seiten mit Spannung zu versorgen: Ansonsten leuchten die LEDs am Ende des Bandes erheblich dunkler. Das ist auch der Grund, warum der RasPi-Wecker später die LEDs nicht mit maximaler Intensität strahlen lässt.

Die Datenleitung schließen Sie für einen ersten Testaufbau (Abbildung 1) direkt an GPIO1 (Pin 12) des RasPi an, da nur dieser Ausgang echte PWM-Funktionen bietet. Abbildung 2 zeigt den Schaltplan dafür. Er enthält auch einen Schalter, der später zum Abschalten des Weckalarms dient. Der WS2812b kommt mit den 3,3 Volt hohen Pegeln des Raspberry Pi gut zurecht; bei den meisten anderen Controller-Bausteinen wäre eine zusätzliche Spannungspegelanpassung nötig.

Abbildung 1: Der erste Testaufbau gestaltet sich simpel.

Abbildung 1: Der erste Testaufbau gestaltet sich simpel.

Abbildung 2: Der Schaltplan bleibt bei diesem Projekt sehr übersichtlich.

Abbildung 2: Der Schaltplan bleibt bei diesem Projekt sehr übersichtlich.

Software einrichten

Steht einmal der erste Aufbau der Hardware, beginnen Sie mit der Installation der für das LED-Band benötigten Software (Listing 1). Grundsätzlich sollten Sie vor Bastelaktionen immer zuerst für ein aktuelles System sorgen (Zeile 1 und 2). Danach installieren Sie eine Reihe von Python-Werkzeugen sowie das Kommandozeilen-Frontend für Git (Zeile 3). Die Bibliothek für die Ansteuerung des WS2812b laden Sie im Quelltext herunter und bauen sie mit Scons [3] (Zeilen 6 bis 8). Danach erfolgt die Installation der entstandenen Wrapper für Python (Zeile 10).

Listing 1

 

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install build-essential python-dev git scons swig git-core
$ sudo apt-get install vorbis-tools mpg123
$ mkdir alarm && cd alarm
$ git clone https://github.com/jgarff/rpi_ws281x.git
$ cd rpi_ws281x
$ scons
$ cd python
$ sudo python setup.py install

Nach Abschluss der Installation der wichtigsten Software-Komponenten testen Sie das lose verdrahtete LED-Band mit dem Python-Skript strandtest.py aus dem Verzeichnis ~/alarm/rpi_ws281x/python/examples. Damit alle LEDs in Aktion treten, passen Sie vorher noch den Wert LED_COUNT im Skript an die Anzahl der LEDs an – im vorliegenden Fall also auf 300. Anschließend rufen Sie das Skript mit Root-Rechten auf:

$ sudo python strandtest.py

Da das LED-Band nicht als Lauflicht dienen soll, sondern der Wecker einen Sonnenaufgang simuliert, benötigen Sie nun vier kleine C-Programme für die entsprechenden Funktionen:

  • all_on schaltet die LEDs mit 100 Prozent Weiß an (Listing 2).
  • all_off schaltet die LEDs ab (Listing 3).
  • soft_on bringt die LEDs innerhalb von 5 Minuten von 0 auf 100 Prozent (Listing 4).
  • soft_off bringt die LEDs innerhalb von 5 Minuten von 100 auf 0 Prozent (Listing 5).

Listing 2

 

// all_on
int main(int argc, char *argv[]) {
  int ret = 0;
  setup_handlers();
  if (ws2811_init(&ledstring)) {
    return -1;
  }
  int i;
  for (i = 0; i < LED_COUNT ; i++) {
    ledstring.channel[0].leds[i] = 0x999999;
  }
  if (ws2811_render(&ledstring)) {
    ret = -1;
  }
  return ret;
}

Listing 3

 

// all_off
int main(int argc, char *argv[]) {
  int ret = 0;
  setup_handlers();
  if (ws2811_init(&ledstring)) {
    return -1;
  }
  int i;
  for (i = 0; i < LED_COUNT ; i++) {
    ledstring.channel[0].leds[i] = 0x000000;
  }
  if (ws2811_render(&ledstring)) {
    ret = -1;
  }
  return ret;
}

Listing 4

 

// soft_on
int main(int argc, char *argv[]) {
  int ret = 0;
  setup_handlers();
  if (ws2811_init(&ledstring)) {
    return -1;
  }
  long b;
  for (b = 0; b < 99 ; b++) {
    int i;
    long x=(b*65536l)+(b*256l)+b;
    for (i = 0; i < LED_COUNT ; i++) {
      ledstring.channel[0].leds[i] = x;
    }
    if (ws2811_render(&ledstring)) {
      ret = -1;
    }
  sleep(2);
  }
  return ret;
}
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 8 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland