Alors voilà, je me suis aperçu que mon Freebox Player diffusait simultanément le signal vidéo sur le port mini-DIN (vers Péritel) et HDMI.
N'utilisant jusque là que le HDMI, j'ai fabriqué un cordon mini-DIN vers RJ45 puis RJ45 vers Péritel pour relier une autre télé.
Puis je me suis dit que ce ne serait pas mal d'essayer de faire un Ambilight monocanal.
J'ai dévié les signaux RGB pour les relier aux ports analogiques d'un Arduino (100kohms en série + 1uF entre chaque entrée et la masse).
J'ai écrit un court programme de test qui fonctionne mais est loin d'être parfait... très loin même.
Au départ, comme c'est un mélange de couleur, tout était très blanc.
J'ai donc établit un seuil au dessous duquel je ne prends pas en compte la couleur.
Il existe un offset aussi, c'est ce que détecte le port analogique quand rien n'est affiché (perturbation sans doute).
Le port analogique 5 sert à ralentir le rafraichissement quand il est relié au 5V.
J'ai commenté au maximum le code.
Si vous avez des solutions pour un affichage plus progressif ou autre, n'hésitez pas.
/* vortof@hotmail.com
* 2012/03/00
* Test pour Ambilight monocanal
* on récupère le signal 0/1.35V de la péritel sur les entrées analogiques 0/5V
*/
// Seuil sous lequel, on n'affiche pas la couleur
int seuil = 80;
// sélectionne la pin d'entrée analogique
int analogRed = 0;
int analogGreen = 1;
int analogBlue = 2;
// sélectionne la pin de sortie numérique
int ledPinRed = 9;
int ledPinGreen = 10;
int ledPinBlue = 11;
// variable pour stocker la valeur d'entrée
int valInRed = 0;
int valInGreen = 0;
int valInBlue = 0;
// variable pour stocker la valeur de sortie
int valOutRed = 0;
int valOutGreen = 0;
int valOutBlue = 0;
// valeur max de la couleur reçue sur analog
int limitRed = 202;
int limitGreen = 179;
int limitBlue = 202;
// valeur min de la couleur reçue sur analog
int offsetRed = 176;
int offsetGreen = 176;
int offsetBlue = 176;
// DEBUG - pour ralentir le rafraichissement
int analogT = 5; // sélectionne la pin d'entrée analogique
int time; // ne sert que pour les tests
void setup() {
Serial.begin(9600); // ouvre le port série à 9600 bauds
pinMode(ledPinRed, OUTPUT); // déclare ledPinX comme sortie
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinBlue, OUTPUT);
}
void loop() {
//DEBUG - si niveau haut, on ralentit
if (analogRead(analogT) > 1000){
time = 2000;
}
else {
time = 25;
}
valInRed = analogRead(analogRed) - offsetRed;
if (valInRed > seuil) {
valOutRed = map(valInRed, 0, limitRed, 0, 255); // Passe le signal 0~limit en 0~255
}
else {
valOutRed = 0;
}
analogWrite(ledPinRed, valOutRed);
valInGreen = analogRead(analogGreen) - offsetGreen;
if (valInGreen > seuil) {
valOutGreen = map(valInGreen, 0, limitGreen, 0, 255);
}
else {
valOutGreen = 0;
}
analogWrite(ledPinGreen, valOutGreen);
valInBlue = analogRead(analogBlue) - offsetBlue;
if (valInBlue > seuil) {
valOutBlue = map(valInBlue, 0, limitBlue, 0, 255);
}
else {
valOutBlue = 0;
}
analogWrite(ledPinBlue, valOutBlue);
// DEBUG - Affiche la valeur de l'entrée et de la sortie
// (ln pour le retour à la ligne, \t pour la tabulation)
Serial.print("R: "), Serial.print(analogRead(analogRed)), Serial.print("\t");
Serial.print(valInRed), Serial.print("\t"), Serial.println(valOutRed);
Serial.print("G: "), Serial.print(analogRead(analogGreen)), Serial.print("\t");
Serial.print(valInGreen), Serial.print("\t"), Serial.println(valOutGreen);
Serial.print("B: "), Serial.print(analogRead(analogBlue)), Serial.print("\t");
Serial.print(valInBlue), Serial.print("\t"), Serial.println(valOutBlue);
delay(time); // délai de x ms avant prochaine mesure
}