Skip to main content

Kommunikation mit dem Lüftercontroller

Diese Dokumentation führt Sie durch die technischen Details der Verbindung und Kommunikation mit dem Lüftercontroller. Es gibt Bibliotheken, die diese Arbeit bereits für Sie übernehmen, aber wenn Ihr Mikrocontroller diese Bibliotheken nicht unterstützt oder Sie selbst Hand anlegen möchten beim Low-Level-Protokoll, ist dieser Artikel für Sie.

Der I2C-Bus

Der Controller verwendet den weit verbreiteten I2C-Bus für die Kommunikation. Alles, was für dieses Protokoll benötigt wird, ist eine gemeinsame Masseleitung zwischen dem VanTurtle Lüftercontroller (in dieser Dokumentation als die Platine bezeichnet) sowie eine SCL- (Takt) und SDA- (Daten) Leitung, die auf Low gezogen werden können.

Verbinden Sie GND mit der Masse Ihres Mikrocontrollers und VCC mit einer 5V- oder 3,3V-Quelle. Verbinden Sie dann SDA und SCL mit den Pins an Ihrem Mikrocontroller, die diese unterstützen. Normalerweise können fast alle Pins verwendet werden, und Sie können per Software festlegen, welche genutzt werden.

Der Bus benötigt einen Pull-up-Widerstand (PUR) sowohl auf der Takt- als auch auf der Datenleitung. Bei einigen Mikrocontrollern wie dem Raspberry Pi sind diese bereits integriert. Falls Ihr Mikrocontroller diese nicht eingebaut hat, befinden sich bereits PURs auf der Platine, die jedoch standardmäßig nicht aktiviert sind. Das liegt daran, dass der PUR die Spannung auf VCC setzt, was höher sein kann als der Mikrocontroller erwartet. Wenn Sie sicher sind, dass Ihre zugeführte VCC nicht höher als die maximale Eingangsspannung Ihres Mikrocontrollers ist, können Sie den PUR aktivieren, indem Sie die beiden Lötpunkte auf der Unterseite der Platine mit der Beschriftung “PUR” verbinden. Sie können etwas Lötzinn auftragen, um sie dauerhaft zu verbinden. Danach sollten Sie eine Spannung zwischen GND und SDA messen können.

Die Adresse finden

Jeder VanTurtle Lüftercontroller belegt eine einzelne 7-Bit-I2C-Adresse, die über die drei Hardware-Adresspins auf der Platine ausgewählt wird. Sie finden diese auf der Rückseite der Platine mit der Beschriftung “I2C ADDR”. Die Pins sind mit A0, A1 und A2 beschriftet. Durch das Verbinden dieser Pins bestimmen Sie, auf welche Adresse die Platine auf dem I2C-Bus reagiert.

Die Standardadresse bei nicht verbundenen Pins ist 27. Sie können beliebige Kombinationen der drei Pins verbinden (“brücken”) oder trennen, um die Adresse zu ändern. Dies ermöglicht die Verwendung mehrerer verschiedener Platinen am selben Bus. Hier sind die möglichen Adressen:

A0 A1 A3 Adresse
Gebrückt Gebrückt Gebrückt 0x20
Nicht verbunden Gebrückt Gebrückt 0x21
Gebrückt Nicht verbunden Gebrückt 0x22
Nicht verbunden Nicht verbunden Gebrückt 0x23
Gebrückt Gebrückt Nicht verbunden 0x24
Nicht verbunden Gebrückt Nicht verbunden 0x25
Gebrückt Nicht verbunden Nicht verbunden 0x26
Nicht verbunden Nicht verbunden Nicht verbunden 0x27

Bevor Sie mit der Kommunikation beginnen, stellen Sie sicher, dass Sie wissen, welche Adresse Ihre Platine verwendet, und dass Ihr Mikrocontroller denselben Wert nutzt. Falls die Kommunikation fehlschlägt, sollten Sie zuerst die Adressauswahl überprüfen. Auf den meisten Plattformen können Sie die Adresse auch durch einen I2C-Bus-Scan bestätigen und beobachten, welche Adressen antworten.

Initialisierung der Platine

Sobald die Platine physisch angeschlossen ist und die korrekte I2C-Adresse bekannt ist, besteht der nächste Schritt darin, den I/O-Expander auf der Platine zu initialisieren. Die Initialisierung setzt fast alle Pins in den Schreibmodus und den Auto-Hold-Sensor in den Eingabemodus.

Der Expander stellt zwei unabhängige 8-Bit-Ports bereit, wobei jeder Port einem Lüfter entspricht. Bei der Initialisierung müssen beide Ports identisch konfiguriert werden. Dies ist eine Liste aller relevanten Register:

Register Adresse Beschreibung
Eingang Lüfter 1 0x00 IO-Zustand auslesen, nützlich für Auto-Hold
Eingang Lüfter 2 0x01
Ausgang Lüfter 1 0x02 Ausgang auf Low oder High setzen
Ausgang Lüfter 2 0x03
Konfiguration Lüfter 1 0x06 Festlegen, welche Pins Eingänge und welche Ausgänge sind
Konfiguration Lüfter 2 0x07

Zunächst wird empfohlen (wenn auch nicht zwingend erforderlich), zu überprüfen, ob die Platine auf dem Bus antwortet. Dies kann durch Auslesen eines beliebigen Registers vom Gerät erfolgen, beispielsweise eines der Konfigurationsregister. Ein erfolgreicher Lesevorgang zeigt an, dass Adresse und Verkabelung korrekt sind.

LESEN VON
0x06
ERGEBNIS
00000000

Wenn das funktioniert – herzlichen Glückwunsch! Sie kommunizieren mit der Platine.

Als Nächstes müssen wir die Richtung jedes Pins konfigurieren. Auf beiden Ports wird Pin 7 als Eingang verwendet, um den Zustand der Auto-Hold-LED zu erfassen, während alle anderen Pins als Ausgänge dienen, um Tastendrücke zu simulieren. Um dies zu erreichen, schreiben Sie den Wert 0x01 in beide Konfigurationsregister. In Binärdarstellung entspricht dies 00000001, was bedeutet, dass Bit 0 ein Eingang ist und alle anderen Bits Ausgänge sind.

SCHREIBEN AN
0x06
DATEN
00000001
SCHREIBEN AN
0x07
DATEN
00000001

Die LEDs auf der Platine sollten von schwach leuchtend auf vollständig aus wechseln. Dies signalisiert, dass die Platine konfiguriert wurde. Sie können einen einfachen Befehl testen, indem Sie eine LED des Lüfters einschalten:

SCHREIBEN AN
0x02
DATEN
00000010

Tastendruck simulieren

Jede Interaktion mit dem Lüfter erfolgt durch Simulation physischer Tastendrücke über die Ausgangspins. Jede Taste entspricht einem bestimmten Bit im Ausgangsregister für den ausgewählten Lüfter. Ein Tastendruck wird dargestellt, indem der zugehörige Ausgangspin für eine kurze Zeit auf High gesetzt und dann wieder auf Low zurückgesetzt wird.

Die Ausgangsregister sind 8 Bit breit, wobei jedes Bit eine Funktion steuert. Bit 0 wird als Auto-Hold-LED-Eingang verwendet und sollte immer auf Low bleiben. Die übrigen Bits sind wie folgt zugeordnet:

Bit RJ45-Funktion RJ11-Funktion
0 Ungültig
Dies ist der Auto-Hold-Eingangspin
Ungültig
Dies ist der Auto-Hold-Eingangspin
1 Lüfteraktivitäts-LED
Auf dem VanTurtle-Controller, nicht am Lüfter
Lüfteraktivitäts-LED
Auf dem VanTurtle-Controller, nicht am Lüfter
2 Auto
Temperatur halten, schaltet den Lüfter auch aus dem Ruhezustand ein
Ungültig
Pin bei RJ11-Verbindung unbeschaltet
3 Ein / Aus
Luftstromrichtung umkehren
Ein / Geschwindigkeit
Schaltet ein, dann wechselt Geschwindigkeiten 1-2-3-4
4 Ein / Aus Deckel schließen
5 Schneller Deckel öffnen
6 Langsamer Aus
7 Piepton
Löst nur einen Piepton am Lüfter aus
Ungültig
Pin floatend bei RJ11-Verbindung
5 UND 6 Öffnen / Schließen
Nur bei einigen Modellen
Ungültig
Stattdessen Bits 4 und 5 verwenden

Um einen Tastendruck zu simulieren, muss zunächst der aktuelle Wert des Ausgangsregisters gelesen, nur das Bit der gewünschten Taste geändert und anschließend der aktualisierte Wert zurückgeschrieben werden. Diese Read-Modify-Write-Sequenz ist wichtig, da mehrere Ausgänge gleichzeitig aktiv sein können und das Schreiben eines festen Wertes unbeabsichtigt den Zustand anderer Pins ändern könnte. Aktuellen Status von Lüfter eins lesen:

LESEN VON
0x02
ERGEBNIS
00000000

Dann muss das Bit der gewünschten Funktion auf High gesetzt und die LED eingeschaltet werden. Es ist wichtig, die LED im selben Schreibvorgang einzuschalten, damit die LED immer leuchtet, wenn eine Taste am Lüfter gedrückt wird. Wenn eine Taste am Lüfter gedrückt gehalten wird, ignoriert er jede andere Eingabe – auch am Bedienfeld des Lüfters selbst. Daher ist es für die Fehlersuche bei Lüfterproblemen wichtig, dass man den LEDs vertrauen kann.

In diesem Beispiel wollen wir die Luftstromrichtung des Lüfters umkehren. Ein / Aus ist Bit 3 zugeordnet, also setzen wir Bit 3 auf High und stellen sicher, dass auch Bit 1, die Aktivitäts-LED, auf High gesetzt ist:

SCHREIBEN AN
0x02
DATEN
00001010

Dann müssen wir kurz warten. Der MaxxAir pollt in regelmäßigen Abständen, möglicherweise alle 50 Millisekunden. Es wird empfohlen, die Taste mindestens 150 Millisekunden gedrückt zu halten, um sicherzustellen, dass der Tastendruck registriert wird.

Wenn die Wartezeit vorbei ist, das Ausgangsregister erneut lesen:

LESEN VON
0x02
ERGEBNIS
00001010

Dies sollte hoffentlich dieselben Daten sein, die wir gelesen haben, aber falls während unserer Wartezeit irgendwelche Bits geschrieben wurden, wollen wir diese nicht überschreiben. Um den Ausgang wieder auszuschalten, nehmen wir das Leseergebnis 00001010 und setzen unser Bit 3 wieder auf 0. Wenn alle Bits außer Bit 1 wieder 0 sind, können wir die LED an Bit 1 wieder ausschalten auf:

SCHREIBEN AN
0x02
DATEN
00000000

Je nach Lüftermodell muss Ein / Aus länger gehalten werden (ca. 750 ms), um zuverlässig erkannt zu werden. Zusätzlich kann das Senden von ein oder zwei kurzen (150ms) Beep-Tastendrücken unmittelbar vor dem Drücken von Ein / Aus die Zuverlässigkeit bei diesen Modellen erheblich verbessern.

Auslesen des Auto-Hold-Status

Neben dem Tastendruck simulieren ermöglicht die Platine auch das Auslesen des Auto-Hold-Status, der anzeigt, ob sich der Lüfter aktuell im Automatik-Modus („halten zum Einstellen“) befindet.

Jeder Lüfter stellt diese Information über einen Eingangspin am I/O-Expander bereit. Wie bereits beschrieben, ist Pin 0 jedes Ports als Eingang konfiguriert und elektrisch mit der Auto-Hold-LED am Lüfter verbunden. Diese LED wird vom Lüfter selbst angesteuert, nicht von der Platine.

Um den Auto-Hold-Status zu lesen, müssen Sie das Eingangsregister des entsprechenden Lüfters auslesen:

LESEN VON
0x00
ERGEBNIS
00000001

Das Register enthält den Status aller acht Pins am Port, aber nur Bit 0 ist für die Auto-Hold-Erkennung relevant. Der Status ist invertiert und wird auf 1 gesetzt, wenn Auto-Hold aus ist, und auf 0, wenn sich der Lüfter im Automatik-Modus befindet. In diesem Fall ist Bit 0 auf 1 gesetzt, was bedeutet, dass die Auto-Hold-LED aus ist.

Sie können Auto-Hold verwenden, um den Lüfter in einen Zustand zu „resetten“, den Ihr Mikrocontroller kennt, da das Einschalten von Auto-Hold den Lüfter immer einschaltet, aber niemals ausschaltet. Sie können dann Ein / Aus auslösen und sicher sein, dass der Lüfter aus ist.