Jump to content

DIY Ambilight with RPi2 and WS2801-LED-stripe

This is not a guide but rather a documentation of my approach to the DIY Ambilight
If you want further details feel free to comment below
I am no professional when it comes to electrics so do not take my word for anything mentioned here

 

So, since there aren't too many of these projects documented on here I thought I might do a little write-up of my recently built DIY Ambilight version.
You don't know what an Ambilight is? Well, basically it's a RGB-backlight for your monitor (in many cases TVs) that changes color depending on the currently presented image.

 

Most of you should be aware of controllable RGB-LEDs so that's the first half of a solution for this.
Now the question arises - how do you get afore mentioned image into your controlling unit?
To be honest, there is no perfect way, they all come with some negative aspects.

  1. For one you could use color-sensitive light-sensors and stick them on your screen - that is obviously the ugliest way possible.
  2. Secondly you could use some screen-capture software and send the signal to a connected device such as an Arduino via USB - however this requires an operating system on your outputting device capable of such software (for example Ambibox) so it's more of a Windows-PC-solution than for a TV.
  3. And as the third option you could split the HDMI-signal, convert it to composite-video and then use one of those good old USB-videograbber-solutions to get your image into an external box - this obviously restricts the usage to external HDMI-devices only.

My approach is based on option number three and utilizes my unused Raspberry Pi 2 as the controlling unit - note here that a RPi1 would be too slow to process the signal in realtime, so if you decide to do the same get a RPi2 or 3 or do the entire thing with an Arduino, however this documentation is based on the RPi and Raspbian (Jessie). Also this is based on the WS2801-LED-controller although a APA102 works just as fine (more LEDs). For single-RGB-LEDs or other controllers such as the WS2812 you might want to take a look at other guides or projects.


So to get the hardware-part running we need to do the wiring/soldering for power and signal, which in my case was just a powerplug for the PSU, an adaptor-cable from the LED-plug to the GPIO-pins of the RPi, 2 cables for DC-power to the LED-stripe and the corner-wiring for the stripe itself.
The whole video-signal section is done by common HDMI-cables.

 

The hardware I bought for this (german Amazon, for US etc you'll have to look it up yourself):

 

Wiring examples from a german guide

Spoiler

bauplan_schema_anschluss_ambilight_hdmi_

steckplatine_bauplan_ambilight_ws2801_ra

 

When applying the LEDs to your screen make sure to turn the LED-segment into the right direction since this is a series circuit and the controller will only pass the signal in one direction.
On most stripes this is indicated by an arrow and/or input/output marks on the solderpoints - if not simply remember that each LED-segment starts with the controller and ends with the resistors.

 

LEDs

Spoiler

3.jpg
4.jpg
5.jpg
6.jpg

 

 

Luckily the WS2801-LED-stripe, the RPi and the HDMI-splitter (which summarize all the actively powered devices in this setup) all use 5V (there are 12V versions of the LED-stripe) so I used a 5V 8A PSU and wired them all together - resulting in a single powerplug for the whole setup. To prevent additional cablemess I glued and screwed all the small devices to a piece of cork I had laying around.


The LED-stripe requires power (in this case 5V), ground, the clockspeed also known as baudrate and a datasignal. The first is directly wired to the PSU as mentioned. Ground is wired to the PSU and GPIO pin 9 to ground the whole setup as a total. Clockspeed is wired to GPIO pin 23 and the datasignal to pin 19. These pins are part of the SPI-bus which can be used by the RPi. (see the wiring example above)

DO NOT PLUG THE 5V POWER-CABLE FROM THE LED-CONNECTOR INTO THE GPIO!

Insulate or trim it down, you won't need it. The RPi runs a 3.3V logic on the GPIO, a 5V input would most likely result in tears..


Note that stripe-lengths larger than ~3.5 meters may result in dimm lights at the other end since the LEDs are in a series circuit - connect power and ground to both ends of the stripe in such cases. I also connected both ends although it wouldn't be needed in my case (2.8 meters of LEDs) but the stripe already had cables soldered onto it so I just did it for a cleaner setup.

 

Wiring

Spoiler

1.jpg
2.jpg
7.jpg
12.jpg
13.jpg

 

 

Moving on to the software side of things..
As the operating system I use Raspbian in which you can find the system-configuration under "/boot/config".
Here you need to enable the SPI-bus with "dtparam=spi=on" and set "max_usb_current=1" to power the videograbber.
Optionally this is also where you can overclock your RPi if you experience some lag between color-changes - not the case for me so far.

 

To control the LEDs I use a software called "Hyperion" which you can install by downloading and executing the script located at https://raw.githubusercontent.com/tvdzwan/hyperion/master/bin/install_hyperion.sh.
To configure this you should use the corresponding software "HyperCon" which you can find here https://hyperion-project.org/wiki/HyperCon-Information.
You can either run it on your PC and send the config-file to your RPi via FTP or you can run it directly on the RPi after installing the java runtime.
Here you set your LED-counts, the direction of the stripe and your starting offset. You can also change the baudrate if needed and the color-smooting.

 

HyperCon

Spoiler

9.jpg

 


To test your LED-stripe you can use the command

hyperion-remote -c <color>

 where <color> can be a name such as black, red, white etc or a RGB-hex value such as C3C3C3, FFFFFF, 000000 etc etc.

Hyperion needs to be running in order for this to work:

systemctl start hyperion

Note that all mentioned commands and the ones that follow might require admin-rights and as such need to be executed either as root or with

sudo <command>

(recommended)..

 

If this doesn't work try to load the hyperion-service-file with

systemctl daemon-reload

and start again.


As of the latest update you now can setup your videograbber within HyperCon as well - small hint: the  grabbed image contains black borders which you should crop with corresponding values in HyperCon.

To check the image you can use the command

hyperion-v4l2 -d /dev/video0 -f 2 -s 1 --crop-left 15 --crop-right 16 --crop-top 11 --crop-bottom 13 --screenshot

 and just change the values of the crop-arguments (start with 0). The screenshot will be saved to your home-directory as a png-file.

 

Videograbber Screenshot without cropping

Spoiler

screenshot.png

 


After you're done you export the config to "/etc/hyperion/hyperion.config.json" and restart the service with

systemctl restart hyperion

 

My config

Spoiler

// Automatically generated configuration file for Hyperion ambilight daemon
// Notice: All values are explained with comments at our wiki: wiki.hyperion-project.org (config area) 
// Generated by: HyperCon (The Hyperion deamon configuration file builder)
// Created with HyperCon V1.03.1 (11.06.2016)

{
	// DEVICE CONFIGURATION 
	"device" :
	{
		"name"       : "Alex",
		"type"       : "ws2801",
		"output"     : "/dev/spidev0.0",
		"rate"     : 1000000,
		"colorOrder" : "rgb"
	},

	// COLOR CALIBRATION CONFIG
	"color" :
	{
		"channelAdjustment" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"pureRed" :
				{
					"redChannel"		: 255,
					"greenChannel"		: 0,
					"blueChannel"		: 0
				},
				"pureGreen" :
				{
					"redChannel"		: 0,
					"greenChannel"		: 255,
					"blueChannel"		: 0
				},
				"pureBlue" :
				{
					"redChannel"		: 0,
					"greenChannel"		: 0,
					"blueChannel"		: 255
				}
			}
		],
		"temperature" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"correctionValues" :
				{
					"red" 	: 255,
					"green"	: 255,
					"blue" 	: 255
				}
			}
		],
		"transform" :
		[
			{
				"id"   : "default",
				"leds" : "*",
				"hsl" :
				{
					"saturationGain"	: 1.0000,
					"luminanceGain"		: 1.0000,
					"luminanceMinimum"		: 0.0000
				},
				"red" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				},
				"green" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				},
				"blue" :
				{
					"threshold" 	: 0.0000,
					"gamma"     	: 2.5000
				}
			}
		],
	// SMOOTHING CONFIG
		"smoothing" :
		{
			"type"            : "linear",
			"time_ms"         : 200,
			"updateFrequency" : 20.0000,
			"updateDelay"     : 0
		}
	},

	// V4L2 GRABBER CONFIG
	"grabber-v4l2" : 
	{
		"device" : "/dev/video0",
		"input" : 0,
		"standard" : "PAL",
		"width" : -1,
		"height" : -1,
		"frameDecimation" : 2,
		"sizeDecimation" : 8,
		"priority" : 800,
		"mode" : "2D",
		"cropLeft" : 35,
		"cropRight" : 32,
		"cropTop" : 15,
		"cropBottom" : 18,
		"redSignalThreshold" : 0.1,
		"greenSignalThreshold" : 0.1,
		"blueSignalThreshold" : 0.1
	},

	// BLACKBORDER CONFIG
	"blackborderdetector" : 
	{
		"enable" : true,
		"threshold" : 0.0,
		"unknownFrameCnt" : 600,
		"borderFrameCnt" : 50,
		"maxInconsistentCnt" : 10,
		"blurRemoveCnt" : 1,
		"mode" : "default"
	},

	// BOOTEFFECT CONFIG
	"bootsequence" : 
	{
		"color" : [0,0,0],
		"effect" : "Color traces",
		"duration_ms" : 5000,
		"priority" : 700
	},

	// JSON SERVER CONFIG
	"jsonServer" : 
	{
		"port" : 19444
	},

	// PROTO SERVER CONFIG
	"protoServer" : 
	{
		"port" : 19445
	},

	// EFFECT PATH
	"effects" : 
	{
		"paths" : 
		[
			"/storage/hyperion/effects",
			"/usr/share/hyperion/effects"
		]
	},

	// NO FRAME GRABBER CONFIG
	// NO KODI CHECK CONFIG
	// NO BOBLIGHT SERVER CONFIG
	// NO JSON/PROTO FORWARD CONFIG

	// LED CONFIGURATION
	"leds" : 
	[
		{
			"index" : 0,
			"hscan" : { "minimum" : 0.5000, "maximum" : 0.5357 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 1,
			"hscan" : { "minimum" : 0.5357, "maximum" : 0.5714 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 2,
			"hscan" : { "minimum" : 0.5714, "maximum" : 0.6071 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 3,
			"hscan" : { "minimum" : 0.6071, "maximum" : 0.6429 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 4,
			"hscan" : { "minimum" : 0.6429, "maximum" : 0.6786 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 5,
			"hscan" : { "minimum" : 0.6786, "maximum" : 0.7143 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 6,
			"hscan" : { "minimum" : 0.7143, "maximum" : 0.7500 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 7,
			"hscan" : { "minimum" : 0.7500, "maximum" : 0.7857 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 8,
			"hscan" : { "minimum" : 0.7857, "maximum" : 0.8214 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 9,
			"hscan" : { "minimum" : 0.8214, "maximum" : 0.8571 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 10,
			"hscan" : { "minimum" : 0.8571, "maximum" : 0.8929 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 11,
			"hscan" : { "minimum" : 0.8929, "maximum" : 0.9286 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 12,
			"hscan" : { "minimum" : 0.9286, "maximum" : 0.9643 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 13,
			"hscan" : { "minimum" : 0.9643, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 14,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }
		},
		{
			"index" : 15,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }
		},
		{
			"index" : 16,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }
		},
		{
			"index" : 17,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }
		},
		{
			"index" : 18,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }
		},
		{
			"index" : 19,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }
		},
		{
			"index" : 20,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }
		},
		{
			"index" : 21,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }
		},
		{
			"index" : 22,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }
		},
		{
			"index" : 23,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }
		},
		{
			"index" : 24,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }
		},
		{
			"index" : 25,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }
		},
		{
			"index" : 26,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }
		},
		{
			"index" : 27,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }
		},
		{
			"index" : 28,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }
		},
		{
			"index" : 29,
			"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }
		},
		{
			"index" : 30,
			"hscan" : { "minimum" : 0.9643, "maximum" : 1.0000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 31,
			"hscan" : { "minimum" : 0.9286, "maximum" : 0.9643 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 32,
			"hscan" : { "minimum" : 0.8929, "maximum" : 0.9286 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 33,
			"hscan" : { "minimum" : 0.8571, "maximum" : 0.8929 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 34,
			"hscan" : { "minimum" : 0.8214, "maximum" : 0.8571 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 35,
			"hscan" : { "minimum" : 0.7857, "maximum" : 0.8214 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 36,
			"hscan" : { "minimum" : 0.7500, "maximum" : 0.7857 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 37,
			"hscan" : { "minimum" : 0.7143, "maximum" : 0.7500 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 38,
			"hscan" : { "minimum" : 0.6786, "maximum" : 0.7143 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 39,
			"hscan" : { "minimum" : 0.6429, "maximum" : 0.6786 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 40,
			"hscan" : { "minimum" : 0.6071, "maximum" : 0.6429 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 41,
			"hscan" : { "minimum" : 0.5714, "maximum" : 0.6071 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 42,
			"hscan" : { "minimum" : 0.5357, "maximum" : 0.5714 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 43,
			"hscan" : { "minimum" : 0.5000, "maximum" : 0.5357 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 44,
			"hscan" : { "minimum" : 0.4643, "maximum" : 0.5000 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 45,
			"hscan" : { "minimum" : 0.4286, "maximum" : 0.4643 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 46,
			"hscan" : { "minimum" : 0.3929, "maximum" : 0.4286 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 47,
			"hscan" : { "minimum" : 0.3571, "maximum" : 0.3929 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 48,
			"hscan" : { "minimum" : 0.3214, "maximum" : 0.3571 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 49,
			"hscan" : { "minimum" : 0.2857, "maximum" : 0.3214 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 50,
			"hscan" : { "minimum" : 0.2500, "maximum" : 0.2857 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 51,
			"hscan" : { "minimum" : 0.2143, "maximum" : 0.2500 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 52,
			"hscan" : { "minimum" : 0.1786, "maximum" : 0.2143 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 53,
			"hscan" : { "minimum" : 0.1429, "maximum" : 0.1786 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 54,
			"hscan" : { "minimum" : 0.1071, "maximum" : 0.1429 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 55,
			"hscan" : { "minimum" : 0.0714, "maximum" : 0.1071 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 56,
			"hscan" : { "minimum" : 0.0357, "maximum" : 0.0714 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 57,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0357 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
		},
		{
			"index" : 58,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.0000, "maximum" : 0.0625 }
		},
		{
			"index" : 59,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.0625, "maximum" : 0.1250 }
		},
		{
			"index" : 60,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.1250, "maximum" : 0.1875 }
		},
		{
			"index" : 61,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.1875, "maximum" : 0.2500 }
		},
		{
			"index" : 62,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.2500, "maximum" : 0.3125 }
		},
		{
			"index" : 63,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.3125, "maximum" : 0.3750 }
		},
		{
			"index" : 64,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.3750, "maximum" : 0.4375 }
		},
		{
			"index" : 65,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.4375, "maximum" : 0.5000 }
		},
		{
			"index" : 66,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.5000, "maximum" : 0.5625 }
		},
		{
			"index" : 67,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.5625, "maximum" : 0.6250 }
		},
		{
			"index" : 68,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.6250, "maximum" : 0.6875 }
		},
		{
			"index" : 69,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.6875, "maximum" : 0.7500 }
		},
		{
			"index" : 70,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.7500, "maximum" : 0.8125 }
		},
		{
			"index" : 71,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.8125, "maximum" : 0.8750 }
		},
		{
			"index" : 72,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.8750, "maximum" : 0.9375 }
		},
		{
			"index" : 73,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
			"vscan" : { "minimum" : 0.9375, "maximum" : 1.0000 }
		},
		{
			"index" : 74,
			"hscan" : { "minimum" : 0.0000, "maximum" : 0.0357 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 75,
			"hscan" : { "minimum" : 0.0357, "maximum" : 0.0714 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 76,
			"hscan" : { "minimum" : 0.0714, "maximum" : 0.1071 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 77,
			"hscan" : { "minimum" : 0.1071, "maximum" : 0.1429 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 78,
			"hscan" : { "minimum" : 0.1429, "maximum" : 0.1786 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 79,
			"hscan" : { "minimum" : 0.1786, "maximum" : 0.2143 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 80,
			"hscan" : { "minimum" : 0.2143, "maximum" : 0.2500 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 81,
			"hscan" : { "minimum" : 0.2500, "maximum" : 0.2857 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 82,
			"hscan" : { "minimum" : 0.2857, "maximum" : 0.3214 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 83,
			"hscan" : { "minimum" : 0.3214, "maximum" : 0.3571 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 84,
			"hscan" : { "minimum" : 0.3571, "maximum" : 0.3929 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 85,
			"hscan" : { "minimum" : 0.3929, "maximum" : 0.4286 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 86,
			"hscan" : { "minimum" : 0.4286, "maximum" : 0.4643 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		},
		{
			"index" : 87,
			"hscan" : { "minimum" : 0.4643, "maximum" : 0.5000 },
			"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
		}
	],

	"endOfJson" : "endOfJson"
}

 

 

Now you should be ready to go and get some results from your LED-stripe in accordance to your HDMI-signal.


If the colors do not correspond to the correct sides take another look at your stripe-direction and start-LED-offset in HyperCon.

 

Results

Spoiler

8.jpg
10.jpg
11.jpg

 

 

 

 

To improve color accuracy you can download the iOS or Android apps for Hyperion and tinker with the whitelevel, color-temperature etc. 
For optimal tuning you should use static images such as white, red, green, blue and a colorswirl for gamma values (see below for such images).
Keep in mind that to make such changes permanent you need to copy them to your config in HyperCon and restart Hyperion.


To make Hyperion start at boot you can use

systemctl enable hyperion

Feel free to tinker with the config to find your perfect setting.
Also there are a ton of additional "upgrade"-projects out there for instance controlling the Ambilight with your Kodi/xbmc-remote, switching video-sources on the fly, adding buttons to the RPi to control the LEDs by hand etc etc

 

Test images

Spoiler

01_white.png
02_red.png

03_green.png
04_blue.png
maxresdefault.jpg

 

 

 

That's it - I hope you enjoyed it at least a bit as much as I did and thank you for reading! :)

Bitfenix Phenom M White | ASUS RoG Maximus VIII Gene | Intel i7 6700K @4.6GHz | HyperX Savage 2800MHz CL14 DDR4 16GB | EVGA GTX1080 SC | Intel 750 Series PCIe SSD 400GB | EVGA SuperNova G2 550W | Windows 10 Professional x64 | Logitech G900, Corsair K70 RGB MXbrown O-ringed, BeyerDynamic DT880 (600 Ω) on Fiio E10K & Samson Meteor | Dell U2715H 27", Samsung SyncMaster P2450H 24", Samsung SyncMaster 931BF 19" | DIY Ambilight

Link to comment
Share on other sites

Link to post
Share on other sites

Well done.

 

I haven't read through most of this, but it's always nice to see tutorials on this forum.  As someone who has an Rpi2 and a Rpi zero, I'm always looking for more ways to integrate them into my apartment.  Thanks.

Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×