Hausbus auf I2C- und ATtiny-Basis: Home2L Brownies

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Einleitung

Das "Home2L Brownies"-Projekt verfolgt das Ziel, eine einfache, effiziente und dennoch robuste Plattform zu schaffen für einen Hausbus mit vernetzter Selbstbau-Hardware. Die Hauptziele sind:

  • einfache, transparente Hardware
  • hohe Zuverlässigkeit und Langzeit-Stabilität
  • offene, dokumentierte und erweiterbare Software
  • gute Wartbarkeit
  • geringer Standby-Stromverbrauch (Ziel: eine Größenordnung / Faktor 10 weniger als ein KNX-System)

Als Sensor/Aktor-Knoten kommen ATtiny84/85/861-Mikrocontroller zum Einsatz - die Knoten werden hier als Brownies bezeichnet (vgl. Wikipedia: Brownie (folklore)). Die Brownies werden über 4-adrige Kabel (z.B. KNX/EIB) mit einem Linux-Hostrechner vernetzt. Dort werden alle Ressourcen (Sensor-Werte, Aktor-Zustände) wahlweise über eine C++-API, Python-API oder ein Kommandozeilen-Tool zugänglich gemacht.

Dieser Artikel gibt (nur) einen Überblick über das Projekt. Details sind auf der GitHub-Seite zum Home2L-Projekt zu finden. Dort finden sich auch die Dokumentation zum gesamten Home2L-Projekt (Home2L Book) sowie ein ausführliches Schritt-für-Schritt-Tutorial mit Beispiel-Schaltungsaufbau.

Messdaten einer realen Beispiel-Installation

  • Linux-Host mit zwei ARM-Cortex-A9-CPUs und I²C-Schnittstelle (CubieTruck)
  • 25 Brownies an einem Bus-Baum, die insgesamt u.a. bedienen:
    • 43 Reed-Kontakte für 22 Fenster
    • 20 Rollläden (40 Relais)
    • 20 Temperatursensoren
  • 4 primäre Hubs, einzelne Unter-Hubs (insgesamt drei Bus-Ebenen)
  • Leistungsaufnahme insgesamt: ca. 250 Milliwatt (50 mA * 5 V) (ohne Linux-Host)
  • Kommunikationsstatistik über 6 Tage: 44,3 Mio Nachrichtenwechsel, nur 11 korrigierte Übertragungsfehler (0,000025%)

Warum 8-Bit-Mikrocontroller?

Für die Auswahl der ATtiny-Typen sprechen die folgenden Gründe:

  • Sie sind simpel, robust und ausgereift.
  • Sie sind in DIP-Gehäusen verfügbar - sehr gut für Selbstbauprojekte!
  • Es ist sehr wenig externe Beschaltung nötig: Zwei Widerstände, ein obligatorischer Abblockkondensator und der Mikrocontroller selbst reichen aus, um einen Brownie-Knoten aufzubauen. Die Frage nach einem käuflichen (Eval-)Board stellt sich damit nicht - man braucht keins.
  • Der Stromverbrauch ist gering, selbst bei 5V Versorgungsspannung. So lassen sich zum Beispiel ohne weitere Spannungswandler sowohl der Controller als auch Relais betreiben.
  • Die Rechenleistung und der Speicher sind für gängige Sensorik wie Fensterkontakte oder Temperaturfühler völlig ausreichend.

Aufgrund der einfachen Beschaltung und der DIP-Gehäuse ist es zum Beispiel möglich, handgelötete Schaltungen auf einer Lochrasterplatine aufzubauen, die dennoch klein genug sind, um in einer Unterputz-Dose Platz zu finden - manchmal nützlich bei Selbstbauprojekten.

Der Home2L-Bus

Der Home2L-Bus basiert auf I²C. Da der Takt explizit durch das SCL-Signal vorliegt, können die ATtinys mit ihrem internen Takt arbeiten, ein Quarz ist nicht nötig. Auf zusätzliche Transceiver-Bausteine, wie bei CAN oder RS485 üblich, kann ebenso verzichtet werden.

Die Spannungsversorgung beträgt 5V. Jeweils am Master befinden sich Pull-Up-Widerstände von 1 kOhm an SDA/SCL sowie jeweils auf Master- und Slave-Seite Serienwiderstände von 100 Ohm. Letztere begrenzen den Umschaltstrom insbesondere bei langen Leitungen.

Der Bus erfüllt den I²C-Standard bis auf die folgenden beiden Ausnahmen:

  1. Der maximale Strom liegt bei 5 mA, und die Leitungskapazitäten überschreiten in der Regel die Vorgaben des I²C-Standards.
  2. Es gibt eine Protokoll-Erweiterung, mit der sich Bus-Slaves gegenüber dem Master bemerkbar machen können (Host Notification).

Die Host Notification ist optional, sodass bei entsprechender elektrischer Beschaltung die Brownies vollkommen I²C-konform kommunizieren können.

Experimente beim Autor des Home2L-Projektes haben gezeigt, dass eine Kommunikation über 100 Meter KNX-Kabel mit ca. 30 kBit/s praktisch übertragungsfehlerfrei funktioniert, ohne dass zum Beispiel spezielle Bustreiber nötig wären. Um dennoch mit elektrischen Störungen, die bei langen Leitungen auftreten können, umgehen zu können, sind eine Reihe von Techniken implementiert:

  • Brownies können als Hub-Knoten arbeiten und Datenverkehr tranparent an einen Unterbus und zurück durchleiten. So kann der Hausbus in einen Baum von Unterbussen aufgeteilt werden. Lange Leitungen können so in kleinere Segmente aufgeteilt werden. Hubs können beliebig tief kaskadiert werden, und jeder Hub kann prinzipiell beliebig viele eigene Slaves bedienen. Die einzige Limitierung ist die Zahl der verfügbaren Busadressen.
  • Die Bitrate ist in der Regel gegenüber I²C reduziert, bei 1 MHz CPU-Takt sind aktuell etwa 30 KBit/s brutto möglich. Sie kann außerdem für kritische Unterbusse bei Bedarf weiter reduziert und so an die physikalischen Gegebenheiten angepasst werden.
  • Das Protokoll definiert sehr kurze Nachrichten, sodass in der Regel keine allzu hohen Bitraten notwendig sind. Das Nachrichtenpaar (Request/Reply) für typische Wertabfragen hat zusammen 6 Bytes inklusive Adressierungen und Prüfsummen.
  • CRC-Prüfsummen erlauben die Erkennung von Fehlern. Der Linux-Treiber implementiert Wiederholungsstrategien und sammelt Fehlerstatistiken, um eventuelle Problemstellen im Bus-Netz zu identifizieren zu können.

Die Firmware

Die Brownie-Firmware ist konfigurierbar. Sie enthält einige Basis-Funktionalität sowie eine Auswahl an Feature-Modulen für verschiedene Sensor- oder Aktor-Typen. Sowohl die Feature-Auswahl als auch der Controller-Typ (aktuell ATtiny84, ATtiny85 oder ATtiny861) sind konfigurierbar.

Der 8 KB Flash-Speicher wird in zwei Bereiche zu 2,5 KB und 5,5 KB aufgeteilt. Der vordere, kleinere Bereich enthält eine minimale Maintenance-Firmware, der andere Bereich die Haupt-Firmware für den operativen Betrieb. Mit beiden Firmwares ist es möglich, die jeweils andere neu zu flashen. Somit sind Updates im Feld möglich, was sehr nützlich ist, wenn die Controller zum Beispiel an schwer zugänglichen Stellen, wie in Unterputz-Dosen, verbaut sind.

Die Basis-Funktionalität der Firmware umfasst:

  • den Kommunikations-Stack für den Bus (Slave-Seite),
  • Lesen und Schreiben der Konfiguration (inklusive ID und Bus-Adresse),
  • Lesen der Firmware-Kennung, -Version und -Features,
  • Lesen und Schreiben (sofern erlaubt) aller Speicher (Flash, RAM, EEPROM),
  • Firmware-Updates,
  • Reset des Controllers,
  • Wechseln und Starten der Maintenance- bzw. operativen Firmware,

Zum Ansteuern von Sensoren und Aktoren stehen aktuell die folgenden Feature-Module zur Verfügung:

  • GPIO: beliebige digitale Ein- und Ausgänge
  • Temperaturfühler per ZACwire-Protokoll (für TSiC 206/306)
  • Matrix: Abfrage von Schaltern, die auch als Diodenmatrix verschaltet sein dürfen (z.B. Fenster-Kontakte, Tastenfelder). Bei Fensterkontakten ist eine "geöffnet/gekippt"-Erkennung in verschiedenen Varianten möglich.
  • Rollläden (Shades): Ansteuerung von elektrischen Rollläden per Relais-Paar und Taster-Paar; intelligente Steuerung: aktuelle Position wird per Zeitmessung verfolgt, Rolläden bleiben auch bei Kommunikationsverlust steuerbar.

Weitere Feature-Module sind in Planung bzw. können einfach hinzugefügt werden.

Das Wartungs-Tool

Für den Linux-Host gibt es ein Wartungs-Tool (home2l-brownie2l). Dieses kann mit den einzelnen Brownies über eine beliebige I²C-Schnittstelle kommunizieren, die von Linux unterstützt wird (Kernel-Modul i2c-dev). Alternativ ist es auch möglich das "ELV USB-I2C"-Interface direkt zu verwenden, das sich unter Linux als serielle Schnittstelle meldet.

Mit dem Wartungs-Tool (home2l-brownie2l) kann man ...

  • ... eine aktuelle Liste der Brownie-Register und Konfigurationsparameter anzeigen (Online-Hilfe).
  • ... einen Bus-Scan durchführen, um alle verbundenen Knoten zu identifizieren.
  • ... eine Vorlage für eine Brownie-Datenbank (Datei brownies.conf) erzeugen. Die Datenbank ist eine Textdatei, die alle Brownies und deren Konfigurationsparameter enthält. Sie hilft bei der Wartung größerer Installationen und wird vom Ressourcen-Treiber (siehe unten) benötigt.
  • ... Brownie-Register lesen oder beschreiben.
  • ... Konfigurationsparameter lesen oder setzen.
  • ... beliebige Speicherinhalte eines Brownie auslesen und anzeigen.
  • ... Firmware flashen (aus ELF-Dateien).
  • ... den Brownie neustarten und dabei ggfs. die Firmware (Maintenance/operative) umschalten.
  • ... die Taktgenauigkeit messen und den internen Timer (das AVR OSCCAL-Register) kalibrieren.
  • ... einen Kommunikationstest durchführen.
  • ... Kommunikations- und Fehlerstatistiken sammeln und anzeigen.
  • ... bei Hubs: Den Unterbus ein- und ausschalten sowie Unterknoten, deren operative Firmware beim Starten abstürzt (warum auch immer ...), durch Umschalten auf die Maintenance-Firmware wiederbeleben (Resurrection).
  • ... einige dieser Vorgänge auch im Batch-Betrieb mehrfach ausführen, um zum Beispiel mit einem Kommando bei allen Knoten ein Firmware-Update durchzuführen.

Die Bedienung des Tools wird durch die Online-Hilfe erklärt:

   $ home2l brownie2l
   brownie2l> help
   ...

Zugriff auf Brownie-Features vom Linux-Host

Um die Ressourcen der Brownies, wie zum Beispiel die Zustände von GPIOs oder Temperaturwerte, auf dem Host-Rechner zur Verfügung zu stellen, wird die Resources-Bibliothek der Home2L-Projektes verwendet. Diese bietet eine einheitliche Schnittstelle zum Zugriff auf die Ressourcen. Zugriff auf die Ressourcen ist auf drei verschiedene Arten möglich:

  1. interaktiv oder per Shell-Skript mit dem Tool home2l-shell,
  2. in Python über die Python-API,
  3. in C/C++ über die C/C++-API.

Beispiele, insbesondere zur Verwendung der home2l-shell und der Python-API, sind im Home2L Book (Kapitel 2) zu finden.

Wer von der recht umfangreichen Home2L-Suite nur den Brownie-Treiber nutzen möchte, kann die Software mit den Kommandos

   make CFG=basic
   sudo make CFG=basic install
   /opt/home2l/bin/home2l-install -i

installieren und anschließend eine minimale Konfigurationsdatei /opt/home2l/etc/home2l.conf mit folgendem Inhalt anlegen:

   rc.config=""            # keine 'resources.conf'-Datei vorhanden/verwenden
   drv.brownies=1          # Brownies-Treiber aktivieren
   br.link=/dev/i2c-1      # i2c-Gerät definieren (entsprechend anpassen!)

Dazu muss dann noch die Datei /opt/home2l/etc/brownies.conf wie oben beschrieben angelegt werden.

Anschließend kann zum Beispiel mit home2l-shell auf die Ressourcen zugegriffen werden:

   $ home2l shell
   home2l> l /local/brownies/
   ...

Weitere Informationen

Das Home2L Book enthält die Dokumentation des Home2L-Projektes. Dort findet sich ein ausführliches Schritt-für-Schritt-Tutorial für den Einstieg.

Der Aufbau und die Inbetriebnahme einer einfachen Brownie-Schaltung auf dem Steckbrett ist dort im Abschitt Brownies: Integrating Do-It-Yourself Hardware beschrieben.

Downloads

Siehe auch