Go Down

Topic: Ambilight simpliste (avec Freebox v6) (Read 2044 times) previous topic - next topic

Vortof

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.

Code: [Select]

/* 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
}



Artouste


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


Bonjour
preambule
tu es bien sur d'avoir de dispo les signaux RVB et pas simplement de la sortie composite ou du Y/C (S video) ?
les mini din en general , c'est pour sortir en composantes separées

Vortof

#2
Mar 29, 2012, 01:45 pm Last Edit: Mar 29, 2012, 01:48 pm by Vortof Reason: 1
Ah oui je suis bien certain, le système fonctionne parfaitement comme ça, c'est juste pas très jolie a regarder pour l'instant.

J'ai transféré 4 images sur le serveur, pour le réglage des valeurs min et max:
une blanche (255/255/255)
une rouge (255/0/0)
une verte (0/255/0)
une bleue (0/0/255)

quand je les sélectionne, l'éclairage ce fait bien avec ces couleurs là.

Vortof

Voici le câblage dispo sur la mini-DIN du player:

      G D
RG VID VE CL
GND    BL CR

GND: masse (pins 4, 14, 18, 20, 5, 9, 13, 17 péritel)
VID: video composite + synchro (pin 20 péritel)
CL : commutation lente (pin 8 péritel)
CR: commutation rapide (pin 16 péritel)
RG: rouge (pin 15 péritel)
VE: vert (pin 11 péritel)
BL: bleu (pin 7 péritel)
G: audio gauche (pin 6 péritel)
D: audio droite (pin 2 péritel)

Artouste

#4
Mar 29, 2012, 01:55 pm Last Edit: Mar 29, 2012, 02:07 pm by Artouste Reason: 1

Voici le câblage dispo sur la mini-DIN du player:

     G D
RG VID VE CL
GND    BL CR

GND: masse (pins 4, 14, 18, 20, 5, 9, 13, 17 péritel)
VID: video composite + synchro (pin 20 péritel)
CL : commutation lente (pin 8 péritel)
CR: commutation rapide (pin 16 péritel)
RG: rouge (pin 15 péritel)
VE: vert (pin 11 péritel)
BL: bleu (pin 7 péritel)
G: audio gauche (pin 6 péritel)
D: audio droite (pin 2 péritel)

oui
j'ai fait un rapide google
http://cjoint.com/12ma/BCDn2msapgV_pining.jpg

le (ton) probleme vient surement du fait que l'excursion (je n'ai pas verifié) des canaux RVB dispo et comprise entre 0 et 1V  chargé sous 75 Ohms (norme video) et que toi tu échantillonne sur 0-->5V
voir a utiliser le pin Aref sur l'arduino

edit : j'ai vu que tu avais pris ça en compte de maniere soft
Code: [Select]
*  on récupère le signal 0/1.35V de la péritel sur les entrées analogiques 0/5V


Vortof

Je prenais ça en compte dans la première version mais ça me faisait faire une double conversion
en entrée : 0/1.35V -> 0/5V
ensuite les divers réglages (offset...)
pour le pilotage du strip : valeur (0/5V) -> 0/255 PWM

Alors que cette version fait 0/1.35 -> réglages -> 0/255

Mais ça manque de fluidité :-(

Artouste

#6
Mar 29, 2012, 03:26 pm Last Edit: Mar 29, 2012, 03:28 pm by Artouste Reason: 1

Je prenais ça en compte dans la première version mais ça me faisait faire une double conversion
en entrée : 0/1.35V -> 0/5V
ensuite les divers réglages (offset...)
pour le pilotage du strip : valeur (0/5V) -> 0/255 PWM

Alors que cette version fait 0/1.35 -> réglages -> 0/255

Mais ça manque de fluidité :-(

normal c'est de la dispersion/restriction d'étendue
voir ça déjà pour augmenter le pas selon le Vmax entrée ana  :
http://arduino.cc/en/Reference/AnalogReference?from=Reference.AREF

sans oublier l'integration faite par la R et C 

Vortof

#7
Mar 29, 2012, 04:16 pm Last Edit: Mar 29, 2012, 05:57 pm by Vortof Reason: 1
donc si je suis sur que la tension d'entrée ne dépassera pas 1.1V
je peux utiliser dans le setup()
  analogReference(INTERNAL)
du coup j'échantillonne 1.1V sur 1024 pas.

sinon, je dois appliquer une tension sur AREF suivant la formule suivante:
(tension à appliquer) * 32 / (32 + 5) = AREF
donc pour AREF 1.35V, je dois appliquer 1.56V.

sans oublier analogReference(EXTERNAL)

edit: on dépasse bien les 1.1V

Artouste


donc si je suis sur que la tension d'entrée ne dépassera pas 1.1V
je peux utiliser dans le setup()
  analogReference(INTERNAL)
du coup j'échantillonne 1.1V sur 1024 pas.

sinon, je dois appliquer une tension sur AREF suivant la formule suivante:
(tension à appliquer) * 32 / (32 + 5) = AREF
donc pour AREF 1.35V, je dois appliquer 1.56V.

sans oublier analogReference(EXTERNAL)

edit: on dépasse bien les 1.1V

Sous reserves d'infirmation, mais je ne crois pas me "planter"  8)
les entrees ana pour un uno (et d'autres) sont  5V+ tolerant quel que soit l'AREF utiilisé
Dans ton cas avec un analogReference(INTERNAL) tout ce qui sera au dessus de 1.1 V (dans la limite des specs maximum rating)  retournera 1023.

compte tenu de la relative précision de ce que tu veux acquerir, je ne m'emm....ais pas beaucoup plus loin au moins pour affiner.

Vortof

Oui j'ai testé, je me retrouve avec beaucoup de 1023. :0
Je vais voir ce que je peux faire avec l'ancienne méthode.

Artouste


Oui j'ai testé, je me retrouve avec beaucoup de 1023. :0
Je vais voir ce que je peux faire avec l'ancienne méthode.

le probleme c'est que tu a un 1µF qui fait une grosse integration de smaple and hold et comme tu echantillone n'importe quand sans te preoccuper de la synchro image , ce n'est pas etonnant que recupere beaucoup de 1023, ton condo une fois chargé aura beaucoup de mal à se decharger .

fais un test sans condo avec des image test


Vortof

Ok je vais tester sans les condos pour voir.

Go Up