Die i2C-Blinkbox

i2c – Lichtsteuerung für den Robot

Der Rollstuhl den ich als Basis für die ganze Geschichte nehme hat eine fast komplette “Lichtsignalanlage” (schönes Wort). Blinker und Licht (Vorne und Hinten). Bremslichter gibt es leider nicht.

Es musste also eine Lösung her um das Licht (und evtl. noch andere “Großverbraucher”) schalten zu können. Das Licht läuft auf 24Volt, also wiedereinmal ein wenig viel um das direkt an den Arduino anzuklemmen. Lösungen sind da entweder Relais oder MosFETs. Ausserdem muss das ganze in ein ordentliches Gehäuse verpackt werden. Die Ansteuerung und die Versorgung soll über den I2C-Bus erfolgen. Das braucht nur 4 Kabel und spart einen UART-Port.

 

Die i2C-Blinkbox

Die i2C-Blinkbox

Was steckt drin

Als Basis dient ein JeeNode Mikrokontroller welchen ich bereits in einigen anderen Projekten wie den “Zitronenwächter” einsetze.

Sämtliche Komponenten gibt es im Jeelabs-Shop (Link ganz unten auf der Seite)

Was kann die Kiste

Im Prinzip ist es eine Schaltbox mit 6 Schaltausgängen. Aktuell sind 4 MosFET-Ausgänge und 2 potenzialfreie Relaisausgänge verbaut. Jeder Ausgang kann AN/AUS geschaltet werden. Dazu gibt es noch eine automatische Schaltfunktion. Dazu wird dem Ausgang ein Zeitinterval übermitteln. In diesem Interval wird dann umgeschaltet bis ein andere Befehl dieses Interval abschaltet oder überschreibt. An zwei MosFET-Ausgängen kann ausserdem PWM genutzt werden um z.B. Lampen zu dimmen.

Die Software

Die aktuelle Software für die Switchbox gibt es in meinem Github-Repo:

https://github.com/sysrun/gardenbot/blob/master/relayslave/switch_slave_i2c_v2/switch_slave_i2c_v2.ino

Das Protokoll

Aktuell ist das Protokoll “unidirektional”. Das bedeutet das die Steuerunk nur Befehle entgegennimmt aber keine Statusinformationen (“Welcher Port ist aktuell an/aus etc.”) zurückgibt.

Ein Schaltbefehl besteht aus mindestens 2 Bytes: Dem Befehl und dem Ausgang. Bei zwei Befehlen wird noch ein drittes Byte gesendet. Dieses gibt entweder das Blinkinterval oder den PWM-Wert vor.

Kommandos (Byte 1)

Folgende Kommandos können genutzt werden. Das RESET Kommando setzt sämtliche Stati der Ports zurück. Alle Intervalle werden gelöscht, alle Ports schalten auf AUS.

Commands Byte 3
0x00 AUS
0x01 AN
0x02 TOGGLE Interval (x * 20ms)
0x03 PWM 0-255
0xFF RESET

Ports (Byte 2)

Das zweite Byte nach dem Kommando gibt den Port an der Adressiert werden soll. Eine Kombination ist möglich, so das mehrere Ports mit einem Befehl gesteuert werden können. Will man z.B. die Ports 1 und 2 (also 0x01 und 0x02) gleichzeitig ansteuern übergibt man den Wert 0x03.

BITS Info
7 6 5 4 3 2 1 0 JN PORT HEX
0 0 0 0 0 0 0 1 P1 / D 0x01
0 0 0 0 0 0 1 0 P1 / A 0x02
0 0 0 0 0 1 0 0 P2 / D 0x04
0 0 0 0 1 0 0 0 P2 / A 0x08
0 0 0 1 0 0 0 0 P3 / D 0x10
0 0 1 0 0 0 0 0 P3 / A 0x20
0 1 0 0 0 0 0 0 P4 / D 0x40
1 0 0 0 0 0 0 0 P4 / A 0x80

Zusatzzahl (Byte 3)

Das dritte Byte muss nur bei den Kommandos TOGGLE und PWM gesetzt werden. Im Togglemodus übergibt man hierbei einen Wert von 1-254 (o wäre das selbe wie AUS). Dieser Wert wird mit 20 Millisekunden multipliziert. Das ergibt die Intervalzeit. Dadurch sind Werte von 20 Millisekungen bis 5 Sekunden möglich. Beim PWM Kommando wird der PWM-Wert gesetzt.

Beispielcode

Hier ein kleiner Beispielcode eines Masters um Port 1 im Abstand von 2 Sekunden umzuschalten.

 

Links

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">