Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:tech:gardenled

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
de:tech:gardenled [2022/11/14 13:58] – [Spenden] bullarde:tech:gardenled [2022/11/14 15:56] (aktuell) bullar
Zeile 47: Zeile 47:
 {{ :tech:gardenled_schematic.png?direct&400 |}} {{ :tech:gardenled_schematic.png?direct&400 |}}
  
-Der LED Boot Driver ist identisch zur Originalversion und nur durch die PWM-Ansteuerung ergänzt. Da ich bei den ersten Versuchen ein paar Hardwareausfälle (ATTINY85 + BP1808) wegen Überspannung hatte, wird das PWM Signal galvanisch mit einem Optokoppler (OC1) getrennt. An der RS485 Schnittstelle sind auch optional die Abschlusswiderstände vorgesehen (R1,R3,R4). Der MAXIM Baustein arbeitet im Halb-Duplex, daher steuern wir die Richtung (Empfangen oder Senden) auch über den ATTINY85. Der letzte freie Ausgang an der CPU steuert eine Status-LED (LED1). Die hilft beim Debuggen und der Inbetriebnahme, vor allem wenn man die POWER-LED abgeklemmt lässt.+Der LED Boot Driver ist identisch zur Originalversion und nur durch die PWM-Ansteuerung ergänzt. Da ich bei den ersten Versuchen ein paar Hardwareausfälle (ATTINY85 + BP1808) wegen Überspannung hatte, wird das PWM Signal galvanisch mit einem Optokoppler (OC1) getrennt. An der RS485 Schnittstelle sind auch optional die Abschlusswiderstände vorgesehen (R1,R3,R4). Der MAXIM Baustein arbeitet im Halb-Duplex, daher steuern wir die Richtung (Empfangen oder Senden) zusätzlich über den ATTINY85. Der letzte freie Ausgang an der CPU steuert eine Status-LED (LED1). Die hilft beim Debuggen und der Inbetriebnahme, vor allem wenn man die POWER-LED abgeklemmt lässt. 
  
 ==== PCB ==== ==== PCB ====
Zeile 59: Zeile 60:
 {{ :tech:garden_led_real_pcb.png?direct&500 |PCB fron & back side}} {{ :tech:garden_led_real_pcb.png?direct&500 |PCB fron & back side}}
  
-Um die Platine elektrisch isoliert in das Gehäuse einzubauen drucke ich aus flexiblem TPU ein zweiteiliges Cover. An beiden Enden über die Platine geschoben bleibt dann alles vor ungewollten Kurzschlüssen geschützt. Das STL File ist im Downloadbereich zu finden.+Um die Platine elektrisch isoliert in das Gehäuse einzubauendrucke ich aus flexiblem TPU ein zweiteiliges Cover. An beiden Enden über die Platine geschoben bleibt dann alles vor ungewollten Kurzschlüssen geschützt. Das STL File ist im Downloadbereich zu finden.
  
 {{ :tech:gardenled_case.png?direct&300 |Case}} {{ :tech:gardenled_case.png?direct&300 |Case}}
- 
  
  
 ===== Firmware ===== ===== Firmware =====
  
-Den physikalischen Layer haben wir mit RS485 gewählt aber wir brauchen noch einen Data Link Layer der die Fehlerfreiheit der Übertragung erhöht, schließlich sollen die Spotlights nicht flackern nur weil auf dem Bus gerade eine unerlaubte Signalparty stattfindet. Im Netz fand ich eine schlanke Lösung, die auch eine Python Version für den PC beinhaltet. Sie heißt [[https://github.com/min-protocol/min|MIN (Microcontroller Interconnect Network )]]. Der Payload läßt sich frei definieren und der Inhalt ist über eine 32-bit CRC abgesichert.+Den physikalischen Layer haben wir mit RS485 festgelegt aber wir brauchen noch einen Data Link Layerder die Fehlerfreiheit der Übertragung erhöht, schließlich sollen die Spotlights nicht flackern nur weil auf dem Bus gerade eine unerwünschte Signalparty stattfindet. Im Netz fand ich eine schlanke Lösung, die auch eine Python Version für den PC beinhaltet. Sie heißt [[https://github.com/min-protocol/min|MIN (Microcontroller Interconnect Network )]]. Der Payload läßt sich frei definieren und der Inhalt ist über eine 32-bit CRC abgesichert.
  
 In meiner Implementierung besteht ein Frame aus 13 Bytes: In meiner Implementierung besteht ein Frame aus 13 Bytes:
-  * drei Header Bytes (0xAA) +  * 3x Header Bytes (0xAA) 
-  * des ID Bytes (0..15) +  * 1x ID Bytes (0..15) 
-  * drei Bytes Payload+  * 3x Bytes Payload
     * Function (0...255)     * Function (0...255)
     * Value (0...255)     * Value (0...255)
     * Delay (0...255)     * Delay (0...255)
-  * vier CRC Bytes (32-bit) +  * 4x CRC Bytes (32-bit) 
-  * ein EOF Byte (0x55)+  * 1x EOF Byte (0x55)
  
-der je nach Funktion vom Spotlight beantwortet wird. Bei Broadcastbefehlen erfolgt keine Antwort der Gegenseite. Hier die kurze Befehlsübersicht:+der je nach Funktion vom angesprochenen Spotlight beantwortet wird. Bei Broadcastbefehlen erfolgt keine Antwort von der Gegenseite. Hier die kurze Befehlsübersicht:
  
 <code> <code>
Zeile 110: Zeile 110:
  
 In den Spotlights lassen sich auch individuelle Helligkeits- und Fadewerte abspeichern, die dann bei Broadcast Befehlen unterschiedliche Helligkeiten ermöglichen. Im Module ''min.c'' ist das Protokoll implementiert. Zusätzlich benötigen wir noch eine Software UART Emulation, da der ATTINY85 keine H/W Variante besitzt. Die Baudrate ist auf 9600 Baud festgelegt damit keiner ins Schwitzen kommt, die Framelänge liegt so bei ca. 14ms. Mit Hilfe der kostenlosen IDE MPLAB und der kostenfreien Variante des XC8 C-Compilers von MicroChip läßt sich die S/W kompilieren und auf den Chip bannen. In den Spotlights lassen sich auch individuelle Helligkeits- und Fadewerte abspeichern, die dann bei Broadcast Befehlen unterschiedliche Helligkeiten ermöglichen. Im Module ''min.c'' ist das Protokoll implementiert. Zusätzlich benötigen wir noch eine Software UART Emulation, da der ATTINY85 keine H/W Variante besitzt. Die Baudrate ist auf 9600 Baud festgelegt damit keiner ins Schwitzen kommt, die Framelänge liegt so bei ca. 14ms. Mit Hilfe der kostenlosen IDE MPLAB und der kostenfreien Variante des XC8 C-Compilers von MicroChip läßt sich die S/W kompilieren und auf den Chip bannen.
 +
  
 ==== Programmierung ==== ==== Programmierung ====
  
-In der Werkseinstellung des ATTINY85 ist das //debugWIRE// Interface ausgeschaltet und eine Programmierung nur über ISP möglich. Das bindet mehrere Pins des Prozessors und geht nicht on-board. Daher sollte man sich einen kleinen Programmieradapter (Sockel) für das Package SOIC8 (200mil) zulegen und die //Fuses// vor dem Bestücken damit programmieren. Danach läßt sich der Software auch über das 1-pin Interface //dWire// programmieren. +In der Werkseinstellung des ATTINY85 ist das //debugWIRE// Interface ausgeschaltet und eine Programmierung nur über ISP möglich. Das bindet mehrere Pins des Prozessors und geht nicht on-board. Daher sollte man sich einen kleinen Programmieradapter (Sockel) für das Package SOIC8 (200mil) zulegen und die //Fuses// vor dem Bestücken damit programmieren. Danach läßt sich die Software auch über das 1-pin Interface //dWire// programmieren. 
    
 {{ :tech:soic_adapter.png?direct&200 |SOIC8 Adapter}} {{ :tech:soic_adapter.png?direct&200 |SOIC8 Adapter}}
  
-Das Debug- und Programmingtool der ersten Wahl ist und bleibt //SNAP (PG164100)//. Alle diese Tools sind im Online Markt oder der Bucht einfach und für den DIY-Geldbeutel erschwinglich zu finden.+Das Debug- und Programmingtool der ersten Wahl ist und bleibt der //SNAP (PG164100)//. Alle diese Tools sind im Online Markt oder der Bucht einfach und für den DIY-Geldbeutel erschwinglich zu finden.
  
 {{ :tech:pg164100.png?direct&300 | SNAP (PG164100) Programer}} {{ :tech:pg164100.png?direct&300 | SNAP (PG164100) Programer}}
 +
  
 ===== Integration ===== ===== Integration =====
  
-Hat man die Spotlights wie oben beschrieben programmiert, können die LEDs schon über einen USB-RS485 Wandler mit dem PC angesprochen werden. Für das Protokoll steht auch eine Pythonvariante zur Verfügung. +Hat man die Spotlights wie oben beschrieben programmiert, können die LEDs schon über einen USB-RS485 Wandler mit dem PC angesprochen werden. Für das MIN Protokoll steht auch eine Pythonvariante zur Verfügung. 
  
-Mein Wunsch es aber die Spotlights in Home Assistant (HA) zu integrieren. Dazu brauchen wir ein Gateway dass die Spotlights als //Lights// in HA abbildet und zusätzlich einen UART Server damit wir auch beliebige Befehle an die LEDs senden können. Klingt kompliziert ist es aber mit ESPHome nicht.+Mein Ziel ist es aber die Spotlights in Home Assistant (HA) zu integrieren. Dazu brauchen wir ein Gateway, das die Spotlights als //Lights// in HA abbildet und zusätzlich einen UART Server beinhaltet, damit wir auch beliebige Befehle an die LEDs senden können. Klingt kompliziert ist es aber mit ESPHome nicht.
  
-Für den UART server gibt es schon [[https://github.com/oxan/esphome-stream-server|hier]] eine schicke Lösung im Netz. Den Code müssen wir nur leicht anpassen, in dem wir vor und nach dem Senden die Richtung des RS485 Driver anpassen. Die Zeilen mit **###** wurden in die Senderoutine zusätzlich eingebaut. Der gesamte veränderte Code ist im Downloadbereich zu finden.+Für den UART Server gibt es schon [[https://github.com/oxan/esphome-stream-server|hier]] eine schicke Lösung. Den Code müssen wir nur leicht anpassen, in dem wir vor und nach dem Senden die Richtung des RS485 Driver anpassen. Die Zeilen mit **###** wurden in die Senderoutine zusätzlich eingebaut. Der gesamte veränderte Code ist im Downloadbereich zu finden.
  
 <code C> <code C>
Zeile 147: Zeile 149:
 </code> </code>
  
-Für die Einbindung der LEDs als Lights schreiben wir wieder ein //custom component//. Das folgende C-Program ''garden-leds.h'' stellt einen //Float Output// für Home Assistant zur Verfügung und beinhaltet eine sehr schlanke Codierung des MIN Protokolls.+Für die Einbindung der LEDs als Lights schreiben wir wieder ein //custom component//. Das folgende C-Program ''garden-leds.h'' stellt einen //Float Output// für Home Assistant zur Verfügung und beinhaltet eine schlanke Codierung des MIN Protokolls.
  
 ++++ garden-leds.h | ++++ garden-leds.h |
Zeile 404: Zeile 406:
  
 Gegebenenfalls müssen die Pins ''tx_pin, rx_pin'' für die serielle Schnittstelle und der Richtungspin ''DIR_PORT'' in ''garden-leds.h'' für die eigene Hardware angepasst werden. Gegebenenfalls müssen die Pins ''tx_pin, rx_pin'' für die serielle Schnittstelle und der Richtungspin ''DIR_PORT'' in ''garden-leds.h'' für die eigene Hardware angepasst werden.
 +
 +
 ==== Hardware Gateway ==== ==== Hardware Gateway ====
  
Zeile 415: Zeile 419:
 | GND | GND | | GND | GND |
  
-Das Ganze dann auf einer Lochrasterplatine aufgelötet und verpackt in einem wasserfesten Gehäuse sieht dann so aus:+Das Ganze dann auf einer Lochrasterplatine aufgelötet und in einem wasserfesten Gehäuse verpackt sieht dann so aus:
    
 {{ :tech:gateway_hardware.png?direct&200 | Gateway hardware in waterproof housing}} {{ :tech:gateway_hardware.png?direct&200 | Gateway hardware in waterproof housing}}
 +
  
 ==== Gesamtverdrahtung ==== ==== Gesamtverdrahtung ====
  
-Zwischen den Spotlights und dem Gateway wird ein 4-adriges Kabel benötigt. Da ich Aussen in einem wasserdichten Rohr verlege, reicht mir eine PVC-Schlauchleitung H03VV-F4G0,75. Bei der Verdrahtung einfach die 12VAC und die beiden Signale A + B miteinander verbinden:+Zwischen den Spotlights und dem Gateway wird ein 4-adriges Kabel benötigt. Da ich Aussen in einem wasserdichten Rohr verlege, reicht mir eine PVC-Schlauchleitung H03VV-F4G0,75. Bei der Verdrahtung einfach die 12VAC und die beiden Signale A + B untereinander verbinden:
  
 ^  Gateway  ^  Spot 1  ^  Spot 2  ^  ...  ^  Spot n  ^ ^  Gateway  ^  Spot 1  ^  Spot 2  ^  ...  ^  Spot n  ^
Zeile 429: Zeile 434:
 |  B  |  B  |  B  |  ...  |  B  | |  B  |  B  |  B  |  ...  |  B  |
  
-Je nach Anzahl der Spots brauchen wir noch ein leistungsfähigen Trafo für ~230V auf ~12V. Hier kann man z.B. einen gebrauchten Halogentrafo wiederverwenden. Die finden sich zuhauf in Gebrauchtwarenmärkten. Meinen 200W Trafo inkl. Sicherungen gab es dort für 8,-€.   +Je nach Anzahl der Spots brauchen wir noch einen leistungsfähigen Trafo für ~230V auf ~12V. Hier kann man z.B. einen gebrauchten Halogentrafo wiederverwenden. Die finden sich zuhauf in Gebrauchtwarenmärkten. Meinen 200W Trafo von ABB inkl. Sicherungen gab es dort für 8,-€.   
  
  
 ===== Inbetriebnahme ===== ===== Inbetriebnahme =====
  
-Schliessen wir nun das fertig verdrahtete Konqlumerat an, steht uns das Licht mit DImmfunktion in Home Assistant zur Verfügung. Die Fadezeit kann dort festgelegt werden und steht standardmässig auf 1s. Durch den Stream-Server können wir aber auch mit z.B. einem PC auf die LEDs zugreifen. Dazu habe ich ein kleines Pythonprogramm geschrieben (Source Code im Downloadbereich).+Schliessen wir nun das fertig verdrahtete Konqlumerat an, steht uns das Licht mit DImmfunktion in Home Assistant zur Verfügung. Die Fadezeit kann auch dort festgelegt werden und steht standardmässig auf 1s. Durch den Stream-Server können wir aber auch mit z.B. einem PC auf die LEDs zugreifen. Dazu habe ich ein kleines Pythonprogramm geschrieben (Source Code im Downloadbereich).
  
 {{ :tech:gateway_python.png?direct&400 |}} {{ :tech:gateway_python.png?direct&400 |}}
de/tech/gardenled.1668434296.txt.gz · Zuletzt geändert: 2022/11/14 13:58 von bullar