Markdown source

#Pilotare un bus DMX-512 con una RS485 della CM3-Home

<abstract>
Il DMX512, spesso abbreviato a DMX (Digital MultipleX), è uno standard di comunicazione digitale 
usato principalmente per il controllo dell'illuminazione di scena nell'industria dello spettacolo, 
per controllare numerose luci ed effetti da una console di regia. Recentemente è stato introdotto 
anche in ambito civile per l'illuminazione architetturale
Questo sono i miei appunti per pilotare un dispositivo DMX512 da una delle porte RS485 della CM3-Home.
</abstract>

* [DMX512 su Wikipedia](https://it.wikipedia.org/wiki/Digital_MultipleX)

Il bus DMX512 essenzialmente è una seriale RS485 a 250.000 Kbps 8N2

Tramite questo programma Python sono riuscito a pilotare un dispositivo DMX-512 collegato
tramite un adattatore RS485 mappato su una porta USB in una configurazione molto simile a quella
che adotteremo per il controller [CM3-Home](/openhab).

## Prova in Python

Apre la porta seriale su cui è mappato l'adattatore RS485 ed invia tre sequenze di comandi 
a tutti i 512 possibili dispositivi indirizzabili su un bus DMX512. Il dispositivo 
che ho provato occupa 6 indirizzi ed è stato programmato dal suo pannello per rispondere 
dall'indirizzo 0 al 5 (A001)

Il dispositivo usato è questo [VDPL300CB User Manual](https://www.lemona.lt/LIUSE/NI/En/Pdf/vdpl300cba5v02.pdf)
ed il programma di prova accende in sequenza i led rosso, verde e blu. 

	import serial
	import time
	
	ser = serial.Serial("/dev/ttyUSB0")
	ser.baudrate = 250000
	ser.bytesize = serial.EIGHTBITS
	ser.parity = serial.PARITY_NONE
	ser.stopbits = serial.STOPBITS_TWO
	ser.xonoff = False

	def sendCmd(red,green,blue):
		ser.send_break(duration=0.25)
		ser.write(chr(0))
	
		ser.write(chr(0))
		ser.write(chr(red))
		ser.write(chr(green))
		ser.write(chr(blue))
		ser.write(chr(0))
		ser.write(chr(0))
	
		for i in range(512-6):
			ser.write(chr(0))
	
		ser.flush()
	
	while True:
		for red in range (0,255,50):
			sendCmd(red,0,0)
	
		for green in range (0,255,50):
			sendCmd(0,green,0)
	
		for blue in range (0,255,50):
			sendCmd(0,0,blue)
	
	ser.close()


@include='bio_sergio_tanzilli'