16Bit DMX Kanäle

Hallo liebe Entwickler,

momentan haben wir ja „nur“ 8bit DMX Kanäle. Es wäre jedoch super, wenn wir DMX mit 16Bit ansteuern könnten.

Ein DMX Kanal hat immer 8 Bit, das ist klar.
In fast allen heutigen Lichtsteuerungen kann ich 16Bit Kanäle verwalten.

Für einen 16Bit Kanal braucht man 2 x 8Bit Kanäle.

Klar könnte man das jetzt auch mit einem Script lösen, aber die Funktion „Zeit“ im DMX funktioniert wunderbar, und das zu scripten wäre sehr aufwendig.

Wie genau die beiden 8Bit Kanäle zu einem 16Bit Kanal werden, weiß ich leider nicht bis ins Detail.

Aus folgenden gründen wünsche ich mir die 16Bit Kanäle sehr :

Bei 100% Dimmer habe ich 256 einzelne Schritte…das geht auch bei 10 Sekunden Fades sehr gut.
Allerdings dimmen wir das DMX gesteuerte Licht abends beim Fernsehen gerne mal auf 10%.
Jetzt haben wir nur noch 25,6 einzelne Schritte und selbst bei 3 Sekunden Fade geht das „gezitter“ los.

Ein 16Bit Kanal hat 65.536 Schritte…also bei 10% Helligkeit wären das dann noch stolze 6553 Schritte !!!
Jetzt kann man auch getrost einen 2 Minuten Farbwechsel bei 10% laufen lassen.
Na wem das dann nicht reicht…

Das klingt jetzt übertrieben…ist es eventuell auch…allerdings sind 25,6 Schritte bei 10% sehr dürftig.
Und 12Bit hat sich in der DMX Technik nie durchgesetzt…warum auch…einen 2. 8Bit Kanal braucht man sowieso.

Hardware in 16Bit gibt es genug, die Belegung wäre dann für einen 4 Kanal LED Stripe folgende :

Kanal 1: Rot/grob, Kanal 2 Rot/fein, Kanal 3 Grün/grob, Kanal 4 Grün/fein usw.

Man benötigt also die doppelte Kanalzahl und bekommt die 256fache Auflösung…keine schlecht ausbeute…

Und mal ehrlich…wer von uns hat gerade über 256 von 512 Kanälen am laufen ?
Außerdem sollen die 8Bit Instanzen je sehr gerne bleiben.
Ich hatte nur gehofft, es würde noch eine 16Bit Instanz dazukommen :slight_smile:
Das ganze natürlich auch für ArtNet :slight_smile:
Apropos „ArtNet“ :
Nochmal an dieser Stelle VIELEN Dank für die einbindung von selbigen !!! Ganz großes Tennis !!!

So…was meint ihr ?
Fragen ? Anregungen ? Vernichtungen ? Glückwünsche ? Folterwünsche ?

Mit leuchtenden Grüßen
Sascha

Das klingt gut. Ich wusste nicht dass es das gibt. Ich kann den Zittereffekt beim Dimmen auf geringe Stufen nachvollziehen. Da ich gerne mehr als weniger LEDs verbaue, kommt es an Abend öfter mal vor im kleinen Prozentbereich dimmen zu wollen.
+1
(Ich hoffe DMX4All und meine Dimmer können das auch…)

I would like to vote for this feature too.

Achieving smooth color fades with LED fixtures and 8-bit color depth per channel is only possible by using a DMX controlled LED driver with interpolation capability. I am using several EldoLED PowerDrive DC and LinearDrive DC LED drivers, which provide very smooth fades thanks to interpolation. Recently I bought some less expensive EldoLED EcoDrive 45D drivers, which to my surprise lack interpolation. They do support 16-bit resolution though.

I have written a 16-bit colour fader which works quite well. There is a tiny bit of flickering sometimes but the fading is much smoother than the 8-bit fader.

In my opinion there is no need to increase the precision of the parameters that control the fader. I would be happy to still use 8-bit values as input for the resulting intensity levels of the channels at the end of the fade. The problem is with the steps between consecutive frames, which are too coarse.

Here is my script:

<?php
/**
 * Created by PhpStorm.
 * User: femme
 * Date: 01/06/15
 * Time: 19:08
 */

/** Provides a dmx fader with deep colour depth and exponential fade curve using two 8-bit dmx channels per colour
  */
class DmxDeepColorFader
{
	private $frameRate = 40; // Number of dmx frames per second

	/** Converts 24-bit true colour integer to 8-bit rgb channel values
	  * @param int $value: 24-bit colour value
	  * @return array|bool: array containing red, green and blue values, false if invalid value given
	  */
	public function getRgbValuesFromInt($value)
	{
		$rgb = false;

		if (is_numeric($value))
		{
			$red = round($value / 256 / 256 % 256);
			$green = round($value / 256 % 256);
			$blue = round($value % 256);

			$rgb = array('red' => $red, 'green' => $green, 'blue' => $blue);
		}

		return $rgb;
	}

	/** Converts 8-bit rgb channel values to 24-bit true colour integer
	  * @param int $red: 8-bit value for red channel
	  * @param int $green: 8-bit value for green channel
	  * @param int $blue : 8-bit value for blue channel
	  * @return int
	  */
	public function getIntValueFromRgb($red, $green, $blue)
	{
		return ($red * 256 * 256) + ($green * 256) + $blue;
	}

	/** Performs a dmx fade with deep colour depth using two 8-bit channels per colour
	  * @param int $objectId: id of IP Symcon dmx instance
	  * @param int $colourStart: 24-bit integer for colour at the start of the fade sequence
	  * @param int $colourEnd: 24-bit integer for colour at the end of the fade sequence
	  * @param float $duration: duration of fade in seconds
	  */
	public function fadeRgb($objectId, $colourStart, $colourEnd, $duration)
	{
		// Calculate 8-bit rgb channel values
		$rgbStart = $this->getRgbValuesFromInt($colourStart);
		$rgbEnd = $this->getRgbValuesFromInt($colourEnd);

		// Calculate 16-bit rgb channel values
		$rgbStartDeepColour = array('red' 	=> $rgbStart['red'] * 256,
									'green'	=> $rgbStart['green'] * 256,
									'blue'	=> $rgbStart['blue'] * 256);

		$rgbEndDeepColour 	= array('red' 	=> $rgbEnd['red'] * 256,
									'green'	=> $rgbEnd['green'] * 256,
									'blue'	=> $rgbEnd['blue'] * 256);

		$rgbDiffDeepColour	= array('red'	=> $rgbEndDeepColour['red'] - $rgbStartDeepColour['red'],
									'green'	=> $rgbEndDeepColour['green'] - $rgbStartDeepColour['green'],
									'blue'	=> $rgbEndDeepColour['blue'] - $rgbStartDeepColour['blue']);

		// Calculate frame duration in milliseconds
		$frameDuration = 1000 / $this->frameRate;
		$frameCount = $duration * $this->frameRate;

		for ($frameNumber = 1; $frameNumber <= $frameCount; $frameNumber++)
		{
			$red = $this->getFrameValue($frameNumber, $frameCount, $rgbStartDeepColour['red'], $rgbDiffDeepColour['red'], true);
			$green = $this->getFrameValue($frameNumber, $frameCount, $rgbStartDeepColour['green'], $rgbDiffDeepColour['green'], true);
			$blue = $this->getFrameValue($frameNumber, $frameCount, $rgbStartDeepColour['blue'], $rgbDiffDeepColour['blue'], true);

			$redSplit = $this->getDmxChannelValues($red);
			$greenSplit = $this->getDmxChannelValues($green);
			$blueSplit = $this->getDmxChannelValues($blue);

			DMX_SetChannel($objectId, 1, $redSplit['coarse']);
			DMX_SetChannel($objectId, 2, $redSplit['fine']);
			DMX_SetChannel($objectId, 3, $greenSplit['coarse']);
			DMX_SetChannel($objectId, 4, $greenSplit['fine']);
			DMX_SetChannel($objectId, 5, $blueSplit['coarse']);
			DMX_SetChannel($objectId, 6, $blueSplit['fine']);

			IPS_Sleep($frameDuration);
		}
	}

	/** Calculates channel value for specific frame in the fade sequence
	  * @param int $frameNumber: number of the frame in the fade sequence for which colour must be calculated
	  * @param int $frameCount: total number of frames in the fade sequence
	  * @param int $fadeStartValue: value of channel at the start of the fade sequence
	  * @param int $fadeEndDifference: difference between value of channel at the start and end of the fade sequence
	  * @param bool $exponentialCurve: use exponential fade curve if set to true, use linear curve if false
	  * @return int
	  */
	private function getFrameValue($frameNumber, $frameCount, $fadeStartValue, $fadeEndDifference, $exponentialCurve = true)
	{
		$valueLinear = $fadeStartValue + ($fadeEndDifference / $frameCount * $frameNumber);

		return $exponentialCurve ? $this->getValueExponential($valueLinear) : round($valueLinear);
	}

	/** Converts 16-bit channel value for linear intensity curve to equivalent value for exponential intensity curve
	  * @param int $valueLinear: 16-bit linear intensity value
	  * @return int
	  */
	private function getValueExponential($valueLinear)
	{
		return round(65536 / pow(65536, 1.5) * pow($valueLinear, 1.5));
	}

	/** Returns 8-bit coarse and fine channel values for a 16-bit channel value
	  * @param int $value: 16-bit channel value
	  * @return array: array containing 8-bit values for coarse and fine channels
	  */
	private function getDmxChannelValues($value)
	{
		$coarseChannelValue = floor($value / 256);
		$fineChannelValue 	= $value - ($coarseChannelValue * 256);

		return array(	'coarse' 	=> $coarseChannelValue,
						'fine'		=> $fineChannelValue);
	}
}

Then do something like this:



$dmxFader = new DmxDeepColorFader();

$objectId = 19150  /*[Zones\Facilitair\Schakelruimte\Dmx controllers\DMX11 Gastenverblijf slaapkamer beganegrond trekbalkspots]*/;

$valueStart = $dmxFader->getIntValueFromRgb(255, 0, 128);
$valueEnd = $dmxFader->getIntValueFromRgb(64, 0, 128);

$dmxFader->fadeRgb($objectId, $valueStart, $valueEnd, 30);

$valueStart = $dmxFader->getIntValueFromRgb(64, 0, 128);
$valueEnd = $dmxFader->getIntValueFromRgb(255, 64, 0);

$dmxFader->fadeRgb($objectId, $valueStart, $valueEnd, 30);

$valueStart = $dmxFader->getIntValueFromRgb(255, 64, 0);
$valueEnd = $dmxFader->getIntValueFromRgb(255, 0, 128);

$dmxFader->fadeRgb($objectId, $valueStart, $valueEnd, 30);

The fader doesn’t run asynchronously, you would have to call it in a seperate script using IPS_RunScriptEx() if you want to fade multiple fixtures at the same time.

Ja 16 Bit Kanäle währen schon super.
Die Implementierung ist total Simpel die 16 Bit werden einfach in der Mitte geteilt. Der 1. Kanal überträgt die Höherwertigen und der zweite Kanal die letzten 8 Bit.
„Moderne“ Geräte die mit DMX angesteuert werden verwenden fast ausschließlich 16 Bit für Dimmer und Positionen.
Aber auch die Selbstbauvarianten mit einem Mikrocontroller sind ab werk schon für 10 Bit ausgelegt währe schön die mit einem einfachen „Fade“ ansteuern kann (natürlich 16 Bit).

Die 8 Bit DMX-Kanäle müssen natürlich erhalten bleiben.

Möchte das gerne auch befürworten, 16Bit wäre echt genial grade bei LEDs, das ist mir in der letzten Zeit auch öfter mal durch den Kopf gegangen. :wink:

Wäre gut wenn es noch zu IPS 4 klappen könnte, das wäre ein Highlight

LG
Sven

Sag mal da ich mir gerade heute DMX Komponenten angeschaut habe (DMX4ALL) und ich adressierbare Strips (LPD8806 und WS2811B) interessant finde die Frage: Kann ich mit IPS "Ohne einen Pixelcontroller mit SD Speicher) lediglich mit einem DMX zu WS2812b einzelne Pixel steuern? Oder könnte ich nur Programme die sich auf einem Controller befinden aufrufen? Oder gibt es die Möglichkeit das ganze noch mit externer Software zu verbinden? Macht das zufällig jemand? Irre bunte adressierbare DMX konstruktionen ? :smiley:

darf ich das noch mal zärtlich anstubsen ?

Darf man sich auf 16bit DMX Kanäle freuen ?

Liebe Grüße
Sascha

Hallo liebe Entwickler,

heute kamen meine 16 Bit LED Treiber…

Wann darf ich die denn einsetzen ? :slight_smile:

Liebe Grüße
Sascha

auch bei 16 bit bleibt das Problem, dass man damit kein vernünftiges Fading hinbekommt, da man die Werte
nicht schnell genug über DMX (max. 44/s) in den Dimmer bekommt.
Die Lösung kann nur im Dimmer selbst ablaufen wenn dieser die Werte zwischen zwei empfangenen DMX Packets
interpoliert. Dann reichen auch die DMX 8 bit und im Dimmer intern 11bit.

J.

Da nun mein 25. Jahr als Lichttechniker und mein 18. Jahr als Lichtoperator anbricht, kann ich dieses Problem leider nicht nachstellen.

16Bit Dimmer + 16Bit Ansteuerung = Alles toll (oder zu mindestens seit ein paar Jahrzehnten bei mir und meinen Kollegen)

„Schneller“ muß das DMX Protokoll auch nicht werden, da es für die 16Bit Ansteuerung eben einen zweiten 8Bit Kanal verwendet.

Da deine Aussage aber gründlich recherchiert zu sein scheint, bedarf es einer für alle Fakten offene Diskussion :slight_smile:

LG
Sascha

DMX kann im Idealfall nur max 44 Werte pro Sekunde übertragen (1/ 512 Frames x 44µs).
Selbst bei nur 8bit braucht ein Fading bei dem alle Werte übertragen werden schon 5,7s.
Um alle 16bit Werte (65635) zu übertragen schon 24 Minuten, deshalb bringt 16bit hier keine Vorteile.
Um feiner einzustellen sind 16bit natürlich von Vorteil…

Wenn man ein Fixture sagen wir mal in 3s von 0 auf 255 faden will muss man bei 8bit schon Werte überspringen, da
man in 3s nur ca. 130 Werte durch DMX übertragen bekommt. Ob das jetzt 8bit oder 16bit Werte sind ist gleichwertig.
Und diese Sprünge sieht man halt bei LEDs recht deutlich (Flicker) wenn man im LED Dimmer keine Vorkehrungen dagen trifft. Zumindest gehört hier eine Gamma Korrektur hinein, welche die DMX/PWM Kurve dem Auge anpasst.
Besser wird es aber nur wenn man intern z.B. mit 11bit Auflsöung fährt, und die Werte zwischen zwei DMX packets
interpoliert.

Hier auch noch ein interssanter Ansatz:
https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0ahUKEwjxhpytoobOAhWIVhQKHXAYAHgQFggyMAQ&url=http%3A%2F%2Fpatentimages.storage.googleapis.com%2Fpdfs%2FUS8330392.pdf&usg=AFQjCNGwhZJA4r0H4DRFlo1vxyFS4gzq0g&cad=rja

LG
Jürgen

@Sascha: Hast du so einen Dimmer übrig, sodass du ihn uns mal für ein/zwei Wochen leihen könntest?

paresy

Ich kann Ihnen ein EldoLED PowerDrive DC und EcoDrive DC leihen.

Gerne. Prinzipiell reicht ein Gerät womit in Ruhe ausprobieren kann. Magst du es einfach an die Kontakt Adresse senden? Und am besten einen Zettel mit deiner Adresse dazu tun damit ich es auch zurück schicken kann :slight_smile:

Vielen Dank,
paresy

paresy

haben die Teile denn 16bit (2 DMX Kanäle) Ansteuerung?
So weit ich weiß, arbeiten die auch intern mit 15bit für ihre HydraDrive Algorithmen zum flickerfreien
dimmen und faden.

Jürgen

Die PowerDrive DC und EcoDrive haben 8bit und 16bit Ansteuerung. PowerDrive DC verfügt auch über Interpolierung, so im Praktik brauchst Man kein 16bit Ansteuerung um ein vernünftiges Fading ze bekommen. Interpolierung und eind logarithmische Dimmkurve fehlen am EcoDrive DC. Ohne 16bit Ansteuerung ist das Teil nutzlos für langsame Fades.

Die Geräte sind unterwegs :slight_smile: .

Geräte sind angekommen. Ich hoffe, dass ich nächste Woche dazu komme :slight_smile:

paresy

Ich würde auch mal einen meiner Dimmer schicken :slight_smile:

Liebe Grüße
Sascha

Vielen Dank für die Geräte. Ich habe soeben eine neue Version der 4.1 hochgeladen, die den Support für die 16 Bit Gerät dabei hat. Habt ihr noch Geräte zum Testen da, damit ich für Fehler ggf. eure Geräte noch ne Woche behalten kann?

paresy

Kein Problem.

Ich habe zu Hause einige 16 Bit DMX-Geräte und ich kann der neue 4.1 am Wochenende testen.