Markdown source

#Dali - Implementazione del protocollo in bit banging

<abstract>
DALI, Digital Appliance Lighting Interface, is a standard wired communications protocol used for Home & Building lighting applications. 
The interface was originally specified to support connectivity for fluorescent light ballasts, but has also been designed to 
support other lighting technologies. 
</abstract>

## Comandare dispositivi DALI da OpenHAB

In OpenHAB non esiste un binding specifico per il protocollo DALI. Per questo è stato usato il programma di test [daly.py](https://github.com/tanzilli/cm3-utilities/blob/master/dali.py) aggiungendo i valori RGB come parametri di ingresso

<pre class="terminal">
if len(sys.argv)==4:
	RedV = int(sys.argv[1])
	GreenV = int(sys.argv[2])
	BlueV = int(sys.argv[3])
	if RedV > 254: RedV = 254
	if GreenV > 254: GreenV = 254
	if BlueV > 254: BlueV = 254
	
	if RedV < 0: RedV = 0
	if GreenV < 0: GreenV = 0
	if BlueV < 0: BlueV = 0

	send_color_red(int(sys.argv[1]))
	send_color_green(int(sys.argv[2]))
	send_color_blue(int(sys.argv[3]))
</pre>

e definendo delle funzioni specifiche

<pre class="terminal">
def send_color_red(value):
	global LED_RED
	
	print(LED_RED)
	print(value)
	send_start()
	send_short_address(LED_RED)
	send_value(value)
	send_stop()
	send_stop()
	time.sleep(0.001)
	
def send_color_green(value):
	global BIT_DELAY
	global GPIO_TX_LINE
	
	send_start()
	send_short_address(LED_GREEN)
	send_value(value)
	send_stop()
	send_stop()
	time.sleep(0.001)
	
def send_color_blue(value):
	global BIT_DELAY
	global GPIO_TX_LINE
	
	send_start()
	send_short_address(LED_BLUE)
	send_value(value)
	send_stop()
	send_stop()
	time.sleep(0.001)
</pre>

Con una regola si può interpretare lo stato di un item che restituisce i valori HSB del colore selezionato e li invia come parametri al programma python per impostare il colore scelto.

<pre class="terminal">
var HSBType hsb
var red = 0
var green = 0
var blue = 0
var Cmd="/home/openhabian/dali.py"

rule "HSBtoRGB"
    when
        Item DaliColor changed
    then
        hsb = DaliColor.state as HSBType
        red   = (hsb.red * 2.55).intValue
        green = (hsb.green * 2.55).intValue
        blue  = (hsb.blue * 2.55).intValue
        
        val results = executeCommandLine(Cmd+"@@"+red+"@@"+green+"@@"+blue,5000)
    	logInfo("Exec",results)
end
</pre>

## Prove di trasmissione in bit banging con Raspberry

* [daly.py](https://github.com/tanzilli/cm3-utilities/blob/master/dali.py)

Linee usate:

* TX - GPIO 31
* [DALI commands](./dali_commands.pdf)

<img src="./raspberry_pinout.jpg" class="img-responsive center-block" width="50%"/>


## Bus e protocollo

The physical interface consists of 2 wires, DALI Power and DALI Data. The DALI system consists of one DALI Control module with up to 63 DALI devices.

* DALI Power line provides the power only for the communication protocol of a maximum 22.5V and limits the current for the system to 250mA. 
* The DALI Data line provides the half duplex communication at a data rate of 1200 bits/second using a bi-phase (Manchester) decoding.

Bi-phase decoding is accomplished with the following: 

* a logical zero consist of sending a physical low signal for 416 µs immediately followed with a physical high signal for 416 µs. 
* a logical one consists of sending firstly a physical high signal for 416 µs followed by a physical low signal. 

A physical high signal on the DALI Data line is a voltage level between +9.5V and +22.5V. A physical low signal 
on the DALI Data line is a voltage level between -6.5V and +6.5V.

<img src="./figura7.jpg" class="img-responsive center-block"/>

The DALI digital layer consists of 2 frames, a forward frame and a backward frame. 

* A forward frame is a frame sent from a DALI controller to a DALI ballast. It is constructed by a START bit (always logical 1), followed by 1byte Address,1byte Command and two STOP bits (a high level with no transitions).
* A DALI ballast communicates back to the DALI control using only a 1byte backward frame consisting of a START bit,1byte,2 STOP bits.

<img src="./figura8.jpg" class="img-responsive center-block"/>

The DALI protocol allows a master controller options to address all ballasts by either broadcast to all, Groups of ballasts, 
and individual addressing. 

The most commonly used direct commands allow the controller to modify lighting brightness, scene 
settings for groups, fading capability and varying rates. Also including are Query command that request the ballast to send 
a backward frame with configuration data such as, power levels, scene levels, current address. 

Using “extended” Configuration 
command the DALI controls can modify addresses of each ballast thus eliminating manual configuration of the DALI system. 

The “extended” configuration command will follow immediately after a DALI controller sends an INITIALIZE ($A5) command, 
which informs all other DALI devices on the bus to ignore further commands until a TERMINATE command is observed 
or 30 s elapses in time.

<img src="./figura9.jpg" class="img-responsive center-block"/>


* [Articolo originale](http://www.ledsmagazine.com/articles/2005/11/microcontrollers-provide-connectivity-of-hb-led-lighting-products.html)

## Hardware

Questo è un tipo di alimentatore per il bus DALI usato in una delle schede di sviluppo citate nei link.

<img src="./DaliPWR.png" class="img-responsive center-block" width="50%"/>

Con questo circuito però la tensione sul bus è troppo dipendente dal carico. Come si vede nel grafico Vout comincia a scendere già prima di metà della tensione massima. La specifica DALI dice che ogni dispositivo non deve prelevare più di 2mA dal bus ma, studiando alcuni circuiti esistenti, è chiaro che molti superano queste specifiche. Inoltre, per sua natura, molti dei dispositivi consumano questa corrente costantemente. Questo tipo di alimentatore sarebbe quindi molto limitato nel numero di dispositivi collegabili.

<img src="./PWR-Transistor.png" class="img-responsive center-block" width="50%"/>

Usando un alimentatore integrato si riescono ad ottenere risultati molto migliori, con una regolazione della Imax molto più precisa e, soprattutto, con un ginocchio di intervento della protezione molto più netto. La tensione si mantiene molto stabile fino al limite del corto circuito.

<img src="./PWR-Enhanced.png" class="img-responsive center-block" width="50%"/>

Il sistema DALI è pensato per essere molto semplice, quindi è molto tollerante sia sull'alimentazione che sui segnali. Queste sono le specifiche:

<img src="./Dali-Spec.png" class="img-responsive center-block" width="35%"/>

Si è cercato di ottenere un segnale che fosse ampiamente entro le specifiche per essere in grado di tollerare anche un eventuale degrado in caso di connessioni non perfettamente a regola o carichi particolarmente reattivi.

Il banco di test è stato realizzato con un generatore di onda quadra con un duty cycle del 50% che inietta un segnale di 3.3V di ampiezza nell'ingresso TX. La misura avviene sull'uscita RX. Nel DALI TX e RX sono in loopback per definizione, essendo RX e TX in parallelo sugli stessi fili. I parametri del circuito sono stati determinati sperimentalmente per avere in uscita un segnale il più possibile simile a quello in entrata.

Come si vede nel grafico il segnale è a specifica anche ad una frequenza del doppio di quella di lavoro.

<img src="./2400.png" class="img-responsive center-block" width="50%"/>

All'estremo, portando il segnale a circa 10 volte la frequenza di lavoro, il segnale è ancora accettabile.

<img src="./10000.png" class="img-responsive center-block" width="50%"/>



* [Specifiche](https://www.artisticlicence.com/WebSiteMaster/User%20Guides/the%20dali%20guide.pdf)
* [Sistema DALI per il controllo digitale - Flyier Osram](http://www.zanino.it/downloadDB/Copia1_sistemadaliorsam.pdf)
* [ARPN Journal of Engineering and Applied Sciences](http://www.arpnjournals.com/jeas/research_papers/rp_2015/jeas_0915_2476.pdf) 
* Mikroel DALI Click
  * [Product description](https://shop.mikroe.com/dali-click)
  * [Schematic](https://download.mikroe.com/documents/add-on-boards/click/dali/dali-click-manual-v100.pdf)
* [Microchip USB to DALI interface](https://www.digikey.com/product-detail/en/microchip-technology/DM160215/DM160215-ND/4902423) 
* Atmel
  * [DALI Master with ATxmega32E5 Reference Design](http://www.atmel.com/tools/dali-master-with-atxmega32e5-reference-design.aspx?tab=documents) 

* Application Notes
	* [Microchip](http://ww1.microchip.com/downloads/en/AppNotes/01465A.pdf) 
	* [Renesas](https://www.eeweb.com/blog/renesas/dali-control-gear-software-solution)
	* [STM](https://www.digikey.com/en/articles/techzone/2013/aug/designing-wired-lighting-control-networks-to-dali-standard) 

* Esempi di schemi
	* [1](1.png)
	* [2](2.png)
	* [3](3.png)
	* [4](4.png)

@include='bio_guido_ottaviani'
@include='bio_sergio_tanzilli'




Le attività del TanzoLab si svolgono ogni mercoledi sera, salvo casi speciali, dalle ore 18:30 presso i locali della Acme Systems srl e consistono in:

  • Talk monotematici a cura di professionisti in vari settori tecnologici
  • Workshop pratici su elettronica embedded, produzione e informatica
  • Progettazione e realizzazione di nuovi prodotti embedded per l'IT

Le attività vengono coordinate tramite questo sito, in cui vengono pubblicati tutti i lavori svolti o in via di sviluppo, e tramite un gruppo Telegram con cui per interagire direttamente via chat con gli altri membri.