fév 20

Ma télé n’étant pas un modèle très récent (comprendre écran cathodique de presque 10 ans), elle ne bénéficie pas de technos comme HDMI CEC (à vérifier) qui permettent de mettre en veille automatiquement plusieurs appareils en même temps.
C’est moche…
Or ma télé est connectée au Freebox Player et à un petit lecteur DVD (via la péritel) qui permet d’avoir un son acceptable. Le but est donc de trouver un moyen d’allumer et d’éteindre ces 3 appareils avec le moins d’actions possibles. Après quelques tests via le port USB du Freebox Player et un petit paramétrage de la gestion de l’énergie, il est possible d’obtenir les 5V du connecteur USB lorsque le player est allumé (et uniquement à ce moment là). Donc plusieurs solutions envisageables :
- utilisation d’un/deux relais pour alimenter la TV et le lecteur DVD directement pilotés par l’alim USB
- utilisation d’un ATtiny (ou autre) pour gérer en plus des relais, l’envoi du code IR qui va bien pour basculer le lecteur DVD en mode Péritel
- utilisation d’un ATtiny pour gérer les relais, diffuser un signal IR pour le lecteur DVD et une implémentation software USB HID pour émuler une navigation dans le menu du Freebox Player pour lancer automatiquement la TV ou autre (l’idée étant de lancer cette séquence d’émulation d’appuis sur les touches du clavier après la phase d’énumération…)
- utilisation d’un ATtiny (si toujours suffisant) pour gérer les relais, diffuser un signal IR pour le lecteur DVD, émuler des appuis claviers pour automatiser la navigation dans le Freebox Player et envoyer un signal (433MHz ?) qui pourrait servir à éteindre la chaine HiFi si elle est en fonctionnement (dans la même pièce, mais à l’opposé), cette opération nécessiterait une intervention dans la chaine : intégration d’un module de réception 433Mhz et d’un ATtiny, idéalement alimentés uniquement lorsque la chaine n’est pas en veille, et qui émuleraient (via un transistor) un appui sur le bouton de veille lors de la réception du signal paramétré…

Une très grosse source d’informations sur le sujet : http://nathan.chantrell.net/20121014/tinypcremote-an-attiny85-based-infrared-pc-remote-control/

1. Récupérer via Arduino le signal IR émis par la télécommande pour basculer le lecteur DVD en mode péritel (via https://github.com/nathanchantrell/TinyPCRemote/tree/master/TinyPCRemote_CodeReader)
–> Code for this button: 3225320451

2. Test de la reconnaissance par le Freebox Player du périphérique HID keyboard implémenté sur l’arduino en utilisant vusb for arduino et le sketch suivant :

#include “UsbKeyboard.h”

// IR sensor connected to PB4 = ATtiny85 physical pin 3
#define IRpin_PIN PIND
#define IRpin 0

#define MAXPULSE 5000 // max IR pulse length, default 5 milliseconds
#define NUMPULSES 100 // max IR pulse pairs to sample
#define RESOLUTION 2 // time between IR measurements

uint16_t pulses[NUMPULSES][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we’re storing
void setup() {
pinMode(0, INPUT);
}

void loop() {
//UsbKeyboard.update();
unsigned long irCode=listenForIR(); // Wait for an IR Code

// Process the pulses to get our code
for (int i = 0; i < 32; i++) {
irCode=irCode<<1;
if((pulses[i][0] * RESOLUTION)>0&&(pulses[i][0] * RESOLUTION)<500) {
irCode|=0;
} else {
irCode|=1;
}
}

// —————————————————————————————
// Enter IR codes and keystrokes to send below, see keyboard_commands.txt for list of keys
// —————————————————————————————

if (irCode==3225320451) { // Single character example, “1″
UsbKeyboard.sendKeyStroke(KEY_ENTER);
irCode = 0;
for (int i = 0; i < NUMPULSES; i++) {
pulses[i][0] = 0;
pulses[i][1] = 0;
}
// delay(2000);
}

} // loop end

// IR receive code
int listenForIR() {
currentpulse = 0;
while (1) {
unsigned int highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length

while (IRpin_PIN & _BV(IRpin)) { // got a high pulse
UsbKeyboard.update(); // needs to be called often
highpulse++;
delayMicroseconds(RESOLUTION);
if (((highpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES) {
return currentpulse;
}
}
pulses[currentpulse][0] = highpulse;

while (! (IRpin_PIN & _BV(IRpin))) { // got a low pulse
UsbKeyboard.update(); // needs to be called often
lowpulse++;
delayMicroseconds(RESOLUTION);
if (((lowpulse >= MAXPULSE) && (currentpulse != 0))|| currentpulse == NUMPULSES) {
return currentpulse;
}
}
pulses[currentpulse][1] = lowpulse;
currentpulse++;
}
}

Ayant eu des soucis il y a quelques années lorsque j’avais testé VUSB avec différentes versions de noyaux linux, je m’attendais à beaucoup tatonner… Que nenni : la reconnaissance en tant que HID se fait parfaitement (aux mauvais contacts de la breadboard près…) et le petit sketch permet de m’assurer que tout fonctionne correctement sur des ordi et sur le FBx Player. Je suis parti, pour ce sketch de test, du TinyPCRemote_ATtiny85 de Nathan Chantrell, que j’ai du modifier un peu (reset de pulses[][]), faute de quoi, sur un ordi et le FBx Player, après un seul appui sur la télécommande, le caractère “RETURN” était envoyé de multiple fois.

Donc pour le moment je suis capable :
- de savoir quel code IR envoyer au lecteur DVD pour commuter en péritel
- d’envoyer des codes de touche clavier au Freebox Player pour naviguer dans les menus

A suivre…

written by Mathias