Jul.31

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 !

Teasing V3 sur Facebook

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 Sourire


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 !

HDfury  

NeTV

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€) :

Ligawo ® HDMI Composite / S-Vidéo

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€) :

Neet® - Répartiteur HDMI 2 ports 1x2 (1 entrée, 2 sorties) - 1080p Full HD - Amplificateur actif

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.

EasyCap DC60  

Enfin le cœur du système sera basé sur un Rapsberry Pi que l’on ne présente plus :

 

Rapsberry Pi

Mon schéma du prototype final :

Schéma Slightbox V3

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 :

POC Slightbox V3Test avec une PS3

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)

 

Script Slight

Proof of Concept validé ! Ne reste plus qu’à packager cette usine à gaz Sourire

POC Slightbox V3

 

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 :

 Rack 1U 19 pouces

Ce rack en ABS facilite l’usinage :

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

Rack 1U

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 Clignement d'œil).

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 :

Installation des interrupteurs

Un récepteur IR 38kHz pour le pilotage de Slighbox par votre télécommande comme on le verra plus tard :

 Récepteur IR 38kHz Installation du récepteur IR 38kHz Installation du récepteur IR 38kHz

 

Quelques photos de l’assemblage :

CablageInstallation du PSUInstallation des embasesAssemblage

Installation des PCBCablage HDMI

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.

SlightBox V3 en cours de programmationSlightBox V3 en cours de programmation

Vue intérieureVue intérieureVue intérieure

 

Version finale :

 

SlightBox V3 (avant)SlightBox V3 (arrière)

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  Clignement d'œil

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 :

Ecran LCD RBG

C’est un écran LCD HD44780. J’utilise les GPIO 17/21/22/23/24 et 25 pour l’affichage :

Cablage du LCD HD44780

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 :

Ecran LCD RDB Circuit de contrôle du contraste, luminosité et couleur

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).

Ajout de pin sur la socket P5Cablage

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.

Embases HDMI & RJ45

Vous avez ainsi la possibilité de piloter la couleur des LEDs derrière votre écran sans nécessairement avoir votre TV allumée.

Pilotage de la couleur manuellement par une interface Web

De plus, l’interface Web permet de configurer votre Slightbox plus facilement :

Page de configuration

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.

 Récepteur IR 38kHz pour le pilotage par télécommande

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.

Apprentissage des codes de télécommande

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 Sourire

 Circuit de relais Cablage du circuit de relaisInstallation du circuit de relais

Schéma du circuit de relais

 

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 Sourire).

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 :

Schéma de la SlightBox V3

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 Sourire

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,

HighTech,.NET,Domotique,SlightBox
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(12)

  1. Nicolas Koziel
    141 days ago

    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

  2. Fred MARTIN
    141 days ago

    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.

  3. Christian Hougardy
    141 days ago

    Super projet Seb
    Dommage que je sois trop manche pour réaliser ca moi même.
    Bonne continuation

    Christian

  4. Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals

  5. Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals - Tech key | Techzone | Tech data

  6. Jon
    139 days ago

    I saw your project on Hack-a-Day, nice work and good packaging, it looks great. Thanks for sharing your project.

  7. Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals | Ad Pub

  8. Trackback: SlightBox : Une système Ambilight à base de Raspberry Pi | Toufa

  9. Trackback: Raspi Ambilight Integrated in a 19″ Rack Packs Lots of Peripherals | Hack The Planet

  10. Ashley
    134 days ago

    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?

  11. Victo
    125 days ago

    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

  12. Swatmorpheus
    60 days ago

    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 ;)

Leave a comment

Comment