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.
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.
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:
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:
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:
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:
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:
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:
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.