SlightBox V3 : La version “HDMI”
Il y a un an jour pour jour (le 31 Juillet 2013), je publiais sur Facebook une photo “teaser” de ma version 3 de Slightbox (la version “HDMI”) et pourtant par manque de temps je ne l’ai jamais dévoilée !
Alors forcément depuis le temps, nombreux sont les projets qui pullulent sur Internet reprenant le même principe à l’image de Light Berry.
Mieux vaut tard que jamais et avec mes excuses pour toutes les personnes qui m’ont souvent relancées pour publier cet article, voici la présentation de ma dernière version de Slightbox, la V3
Retour sur SlightBox
Pour ceux qui ne connaissent pas mon projet, SlightBox est un système type Ambilight permettant de produire des effets lumineux derrière votre écran en fonction de la vidéo qui vous visionnez !
Quand j’ai démarré ce projet, c’était en Février 2013, je voulais une solution fonctionnant avec n’importe quel périphérique HDMI mais devant l’ampleur de la tache j’ai décidé de procéder étape par étape, prototype par prototype !
Ainsi les deux premières versions ne sont compatibles qu’avec un PC. Le principe est simple : un logiciel Windows calcule les couleurs moyennes de zone de votre écran et pilote des bandes de LEDs. Le 1er prototype fut développé avec des modules .NET Gadgeteer et la version 2, plus industrielle, avec une puce USB/SPI (une MPC2210).
Pour en savoir plus :
Le résultat du système en vidéo :
La promesse HDMI : Le POC
Comme voulu, l’idée finale de Slight était de pouvoir fonctionner avec n’importe quelle source vidéo et pas seulement avec un PC. Pour cela il fallait s’interfacer en HDMI; l’idéal étant de faire une sorte de proxy/passerelle HDMI pour l’analyse du flux vidéo.
Il y a très longtemps sur ce blog, en Février 2006 (déjà 8 ans déjà !!!), je vous parlais du HDCP (lire ici), le système cryptographique visant à crypter les flux HDMI pour lutter contre les copies. Bien que depuis 2010, les fameuses MasterKey ont été dévoilées mettant à mal ce système, il est quasiment impossible de décoder en temps réel un flux HDMI pour analyser le flux vidéo, surtout avec de petit système embarqué comme le Raspberry.
Les 1eres versions de Slight m’ont permis de comprendre comment piloter des bandes de LED et comment analyser les frames d’une vidéo pour produire de beaux effets lumineux. Dans ces 2 versions la source n’est autre que des captures d’écran réalisées avec DirectX. Dans cette version HDMI, il me fallait récupérer des captures d’écran du flux HDMI tout en contournant les protections HDCP.
Je me suis d’abord tourner vers des systèmes d’acquisition HDMI tel que Elgato, le Diamond GC1000, Roxio, Hauppage, etc… Mais ces produits ne peuvent décrypter les flux protégés HDCP. Sinon il y a le HDfury mais très cher pour un prototype, ou le très prometteur NeTV qui, avec le firmware “HDMI stripper” permettait de supprimer la protection HDCP. Mais ces systèmes sont onéreux et difficilement intégrable !
C’est quelques jours plus tard que la réponse me fut inspirée par mon père : le Analog Hole ! (lire : le trou analogique).
En effet, un flux HD sur HDMI peut être crypté en HDCP ou non. Si c’est le cas, impossible d’exploiter son contenu si on n’a pas une clé de décryptage ! De plus pour un système Ambilight, un flux HD serait trop couteux en termes de performance !
L’idée est donc de ”downgrader” le flux HDMI en un flux analogique (en S-Video par exemple) permettant d’une part de faire sauter la protection HDCP et d’autre part de baisser la résolution de l’image pour faciliter le traitement. C’est ce qu’on appelle le trou analogique !
Après une étude de marché mon choix s’est porté sur le “Ligawo ® HDMI Composite / S-Vidéo” supportant les flux cryptés HDCP (environ 60€) :
Bien entendu, pour rendre le système transparent, nous utiliserons un splitter HDMI permettant de dupliquer le flux HDMI de votre source (Xbox, PS3, Freebox, etc..) en deux flux : un flux pour votre TV et un autre pour la SlightBox. Pour cette pièce mon choix s’est porté sur le “Neet® – Répartiteur HDMI 2 ports 1×2 (1 entrée, 2 sorties) – 1080p Full HD – Amplificateur actif” supportant les flux HDCP/1080p (environ 30€) :
Une fois notre signal vidéo analogique capturé, une simple clé d’acquisition USB/SVideo fera l’affaire pour pouvoir exploiter l’image depuis un système informatique tel qu’un Raspberry. Pour cela j’ai utilisé la clé EasyCap DC60 achetée il y a quelques années sur un site chinois pour moins de 10€. Sur ce point plusieurs copies chinoises existent avec différentes puces (voir http://linuxtv.org/wiki/index.php/Easycap). La STK1160 fonctionne parfaitement sur RPi/Linux. J’ai également testé une clé avec la puce Somagic (SM-USB 007) mais sans succès et je n’ai aucune idée de la compatibilité des Empia ou UTV. Donc essayez de trouver des clés Easycap DC60 équipées de la puce STK1160.
Enfin le cœur du système sera basé sur un Rapsberry Pi que l’on ne présente plus :
Mon schéma du prototype final :
Les 1er tests ont été réalisé avec un PS3 qui crypte la sortie HDMI en HDCP et offre donc un bon device de test ! On retrouve le splitter HDM NEET, le convertisseur HDMI/SVideo, la carte d’acquisition EasyCAP, le Raspberry et un écran HD LED HD44780 :
Côté logiciel, Slight est écrit en Python et utilise la librairie OpenCV pour l’analyse de l’image.
Au démarrage du service, l’initialise mon device SPI utilisé pour piloter les LEDs et OpenCV sur le device /dev/video0 pour l’analyse du flux vidéo de la carte EasyCAP.
Enfin, pour sélectionner la bonne source vidéo d’EasyCap (disposant d’une entrée SVideo et composite) ainsi que le format de l’image (SECAM), j’utilise V4l2 (Video For Linux 2) pour paramétrer la source s’acquisition vidéo :
1 2 3 4 5 6 7 8 9 | print "Initializing SPI device .." dev = "/dev/spidev0.0" spidev = file(dev,"wb") print "Initializing video capture from /dev/video0 .." capture = cv.CaptureFromCAM(0) cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH, 720) cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT, 576) print"Configuring video capture (V4L2) ..." os.system("v4l2-ctl -d /dev/video0 -i 5 -s 4 --set-fmt-video=width=720,height=576,pixelformat=4") |
Le programme Python boucle ensuite à l’infini pour capturer l’image du flux vidéo et l’analyse pour piloter les LEDs avec le port SPI
OpenCV permet de capturer l’image avec la fonction “QueryFrame()” et analyse ensuite les pixels de la capture avec la fonction “Get2D”. Il ne reste plus alors qu’à porter l’algorithme C# développé pour SLightBox V1/V2 en sur cette version Python.
En simplifiant, voici la boucle principale :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | while True: # Capture frame frame = cv.QueryFrame(capture) width = frame.width height = frame.height # Init data array data = bytearray(NUM_OF_LEDS * 3 + 1) for x in range(NUM_OF_LEDS): i = x * 3 data[i + 0] = MASK data[i + 1] = MASK data[i + 2] = MASK # Process zones for z in range(NUM_OF_ZONES): avg_pixel = CalculateAvgColorOfZone(z, frame) i = LEDS_ON_START * 3 + (3 * (NUM_OF_ZONES - 1)) data[i + 0] = gamma[int(avg_pixel[1])] # G data[i + 1] = gamma[int(avg_pixel[2])] # R data[i + 2] = gamma[int(avg_pixel[0])] # B # Write data on SPI port spidev.write(data) spidev.flush() time.sleep(0.001) |
Proof of Concept validé ! Ne reste plus qu’à packager cette usine à gaz
Le Packaging
Pour faire de ce POC un véritable produit autonome, j’ai sélectionné un rack 1U 19pouces vendu une 20aine d’euro chez Farnell ou Selectronic :
Ce rack en ABS facilite l’usinage :
On y trouve :
- 3 interrupteurs en façade ainsi qu’une fenêtre pour l’écran LCD et un petit trou pour le capteur IR
- A l’arrière, les deux ports HDMI (In et Out), une embase RJ45 et l’arrivée du 220V
L’idée étant d’avoir l’alimentation embarquée dans la “box” (ci-dessous matérialisée en papier pour avoir l’idée de la taille ).
En façade trois interrupteurs : un Master pour l’arrivée du 220V (avec LED témoin) et deux autres 5V pour le RPi et le convertisseur HDMI :
Un récepteur IR 38kHz pour le pilotage de Slighbox par votre télécommande comme on le verra plus tard :
Quelques photos de l’assemblage :
J’ai également ajouté des radiateurs (heatsinks) sur le splitter HDMI, le convertisseur HDMI et sur le Raspberry pour faciliter la dissipation de la chaleur.
Version finale :
Les inscriptions en façade et sur l’arrière ont été réalisé avec des “Lettres Transfert” de marque SENO.
Les fonctionnalités
Comme vous avez pu le voir dans les photos ci-dessus, cette Slighbox renferme une alimentation 220v vers 5V en 10A avec un Raspberry comme cœur du système, une clé de capture SVideo EasyCAP, un splitter HDMI NEET, un convertisseur HDMI/Svideo Ligawo, un écran LCD HD44780 des embases 220v/RJ45/HDMI et quelques interrupteurs.
Un système Ambilight pour toutes vos sources HDMI
Au démarrage du système (basée sur Raspbian), le service “Slight” initialise la capture via V4L2 et OpenCV comme montré lors du POC et pilote les LEDs en fonction du flux vidéo HDMI. Le fameux MVP du produit
Le pilotage des LED LPD8806 se fait par le port SPI en utilisant les GPIO 10 (sortie MOSI) et 11 (Clock). Le Raspberry est directement alimenté en 5V sur les GPIO 2 (5V) et 6 pour le Ground.
A noter qu’il vous faudra dé-commenter la ligne “blacklist spi-bcm2708” dans le fichier /etc/modprobe.d/raspi-blacklist.conf de façon à activer le port SPI sur votre Raspberry.
L’écran LCD
Le programme reporte son statut et performance (notamment le nombre de FPS) directement sur l’écran LCD en façade :
C’est un écran LCD HD44780. J’utilise les GPIO 17/21/22/23/24 et 25 pour l’affichage :
Dans sa version finale, SLightbox utilise un écran RGB permettant de choisir vous-même la couleur de l’écran en façade. De plus j’ai ajouté le contrôle du contraste et de la luminosité directement dans le code.
Pour cela, j’ai fabriqué un circuit de contrôle par PWM permettant de gérer le contraste, la luminosité et la couleur (RGB) de l’écran :
Enfin, pour stabiliser le signal PWM sur Raspberry, j’ai utilisé pi-blaster recompilé de façon à générer un signal PWM seulement sur les GPIO de la socket P5 (Gpio 28/29/30 et 31 car par défaut, il utilise toutes les sorties).
La (slight) box connectée
A l’arrière vous avez aussi remarqué le port RJ45 permettant de rendre la SlighBox “connectée”. Elle expose via Flask une interface responsive permettant de piloter la SlightBox depuis votre smartphone, tablette ou simple ordinateur.
Vous avez ainsi la possibilité de piloter la couleur des LEDs derrière votre écran sans nécessairement avoir votre TV allumée.
De plus, l’interface Web permet de configurer votre Slightbox plus facilement :
La télécommande infrarouge
Equipée d’un récepteur IR 38kHz, la Slightbox est capable d’apprendre de vos télécommandes. Vous pouvez ainsi utiliser des touches inutiles de vos télécommandes pour piloter votre Slightbox : la mettre en route, la passer en mode couleur, etc…
Le récepteur est alimenté par la sortie 3,3V du Raspberry (fils rouge & noir) et l’entrée (fil gris) est connectée sur la GPIO 4.
C’est toujours au travers l’interface Web de la Slightbox que vous pouvez configurer tout cela afin d’associer des codes IR à des actions de la Slightbox. Techniquement, j’utilise LIRC pour l’interprétation des signaux IR par le récepteur.
Le “soft-hard-reboot” des équipements
A l’utilisation, il se peut que le signal vidéo soit perdu. En général à cause du splitter HDMI et/ou du convertisseur HDMI/SVideo qui "plante" ! Ne reste qu’une seule solution : le hard-reboot du périphérique.
Pour automatiser cette tache, j’ai fabriqué une petite carte avec deux relais permettant de contrôler l’alimentation de ces deux équipements depuis le code sur le Raspberry. L’interface Web de pilotage de la SLightBox offre donc la possibilité de faire un “hard-reboot” du splitter et/ou du convertisseur
Conclusion
Et voilà, après un an dans les cartons, je publie enfin cet article sur ma dernière version du système Slightbox. Je l’ai ressorti et réinstallé à la maison après avoir déménagé fin 2013/début 2014 (ce qui explique la latence dans la publication de mes projets ).
La Slightbox V3 traite environ 7 à 10 frames par seconde ce qui est convenable pour produire un bel effet et fonctionne avec mes différentes sources HDMI (Chromecast, Intel NUC, Numéricâble, etc …)
Pour résumer, le schéma de la bête :
Vous savez maintenant comment monter votre propre SlightBox et si vous avez besoin de quoi que ce soit, n’hésitez pas à utiliser les commentaires
Pour plus de photos sur le montage de la Slightbox V3, consulter l’album photo sur Facebook : https://www.facebook.com/slightbox
Longue vive à SlightBox,
Nicolas Koziel
Bonjour,
C’est un projet que je trouve vraiment intéressant ! Je cherchais à faire la même chose mais les solutions avec des éléments dissociés et les câbles qui vont avec ne m’intéressent pas trop.
Vous avez pensé à l’industrialiser ?
Cdt
Nicolas
Fred MARTIN
Bonjour Sébastien,
tout d’abord de grosses félicitations pour ce magnifique travail.
Je suis en train de tester actuellement le produit LIGHTBERRY qui tourne actuellement via:
– un convertisseur HDMI->RCA MINI HDMI2AV acheté sur AMAZON
whttp://www.amazon.fr/livraison-rapide-Composite-Convertisseur-soutien/dp/B00LO8OEX6/ref=sr_1_1?s=electronics&ie=UTF8&qid=1406816052&sr=1-1&keywords=mini+HDMI+AV+CVBS
pour info, il n’a fonctionné que quelques jours. En attendant d’en trouver un mieux, j’ai dû relier le grabber à la sortie RCA PAL de mon démodulateur Canalsat.
– un grabber EasyCAP DC60 acheté sur le site LIGHTBERRY avec un ruban 56 Leds pour TV 55″ à 60″
– un RPI sous RaspBMC+HYPERION.
Le convertisseur est sur la sortie HDMI 2 de mon ampli HC, donc je n’ai pas besoin de Splitter.
ça fonctionne bien, mais cette solution ne me plait guère, car elle est tributaire de XBMC qui alourdit le système, et qui selon un témoignage, a cessé de fonctionner suite à une mise à jour de XBMC.
La solution proposée ici semble répondre en tout point à ce que je recherche. Mais en version de base, sans alim, boitier, driver LCD et écran LCD. Juste un convertisseur, grabber et RPI.
Aussi j’aimerais savoir si une distribution RPI peut être proposé sous forme de fichier ISO.
D’autre part, comment peut-on configurer le système (nombre et positionnement des LEDs, zones de l’image attribuées à chaque LED, réglage des couleurs,…).
Nous allons très certainement ce soir mettre en place une communauté « lightberry » ou équivalent sur google+, qui permettra de regrouper toutes les informations utiles et les questions.
Et un sujet a été ouvert sur la communauté Domotique Info au sujet de votre article.
Vous remerciant par avance.
Christian Hougardy
Super projet Seb
Dommage que je sois trop manche pour réaliser ca moi même.
Bonne continuation
Christian
Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals
Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals - Tech key | Techzone | Tech data
Jon
I saw your project on Hack-a-Day, nice work and good packaging, it looks great. Thanks for sharing your project.
Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals | Ad Pub
Trackback: SlightBox : Une système Ambilight à base de Raspberry Pi | Toufa
Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals | Hack The Planet
Ashley
Awesome project i have mine running from PC currently. I would love to make the above. Do you have all the scripts and codes available or conversely would you look at selling these?
Victo
Félicitation pour cette belle réalisation et intégration très propre. Par contre, le signal composite ne délivrant au max que du 480p, et le splitter hdmi étant auto-synchronisé, je me demande si de ce fait la résolution n’est pas baissé à 480p sur l’autre sortie hdmi du splitter. Par conséquent, la résolution sur la TV ne peut être qu’au maximum de 480p. Pouvez-vous ou non éclairer ces propos.
Merci d’avance
Swatmorpheus
Félicitation pour ce boitier et les explications qui nous laissent à tous la possibilité de le réaliser.
Victor pour répondre à ta question, concernant la résolution il me semble que la S-video est au format 480i synchronisé à 525/59,94 Hz en NTSC ou PAL-M, ou format 576i synchronisé à 625/50 Hz.
Ici, il utilise un duplicateur de signal HDMI donc par conséquent le signal qui va à la TV sera toujours de la même résolution que la source.
Seb tu me reprends si j’ai dit une bêtise hein 😉
Mat
Super projet!
Je suis actuellement en train de faire une liste de tout ce qu il me faut pour faire ce projet, mais avant d acheter le rack, … je souhaite tester le systeme. Est ce qu il serai possible d avoir une image de la carte sd de la raspberry pi? plutot que d utiliser une raspberry pi je pensais utiliser une banana pi. Est ce que le systeme est gourmant en ressource cpu?
Nick
Nice!!!!
I would like to ORDER!!!
NeoID
Hi,
Are you sharing the source code for your project? Would love to build it myself for personal use. I have most of the parts lying around myself. 🙂
Romain
Salut,
Super projet, est-ce que tu vas faire un tuto sur comment le programmer ou donner le code? J’aimerai bcp me lancer dans se projet mais je n’y connais pas grand chose en code python, et tous le reste d’ailleurs.
Trackback: S-Sound : la solution audio multi-room connectée dans la Constellation - Sebastien.warin.fr
Trackback: Zelf Ambilight bouwen voor je TV | Viletung
Dopphil
Bonjour,
Une campagne Kicksarter pour une production ,moi je suis preneur.
Pas assez caler pour le réaliser moi même.
cdtl