Un secret du Père Noël

Apprenez à programmer votre propre télécabine du Père Noël.

Cabine téléphérique

Maintenant que la station de ski de Redon a terminé sa saison, il est temps de vous révélé un secret :

Comment fonctionne la cabine téléphérique du Père Noël ?

Comme tous les ans, l’atelier Lever Le Rideau nous a permis d’avoir plus qu’un marché de Noël à Redon : la Station des 5000, le plus grand domaine skiable de Bretagne.

Et cette année, la Vilaine Bidouille a eu le droit de jouer en participant au montage de la cabine téléphérique du Père Noël. Vous savez, la boîte rouge dans laquelle vous avez enregistrer vos messages au service SAV du vieux barbu.

Du côté des lutins, ça donnait ça :

Mais comment ça marche ?

C’est simple, le gros bouton rouge au milieu de la cabinet est connecté à une carte Arduino Leonardo. Elle se fait passer pour un clavier USB pour un PC caché dans un petit meuble. Ce PC dispose d’une caméra USB de PS3 pour prendre de la vidéo et du son.

Quand on appuie sur le bouton, la carte Leonardo “tape” les lignes de commande Linux pour enregistrer une vidéo de 30 secondes. Elle gère aussi les relais des éclairages rouge et vert indiquant aux victimes bénéficiaires du Père Noël quand ils peuvent parler.

Liste du matériel :

Câblage à réaliser :

Suivez ce câblage, ou bien, téléchargez le sur Fritzing.

Programme de la Leonardo :

A téléverser dans la carte depuis votre ordinateur grâce au langage Arduino. Si vous ne savez pas faire, inutile d’aller plus loin dans l’article. Vous allez vous ennuyer.)

// Uniquement pour une carte Leonardo connectee par USB a un PC sous linux avec Guvcview
 // Lance une commande d enregistrement d une video de quelques secondes
 include "Keyboard.h"
 const int modeClavier = 2;
 const int bpRec = 3;
 const int outRecEnCours = 13;
 const int getReady = 12;
 const int auSuivant = 11;
 int etatBp = 0;
 int etatClavier = 0;
 int ordreRec=0;
 char altKey=KEY_LEFT_ALT;
 char f4=KEY_F4;
 char ctrl=KEY_LEFT_CTRL;
 void setup() {
   // initialisation
 //entrees
   pinMode(modeClavier, INPUT);
   pinMode(bpRec, INPUT);
   //sorties
   pinMode(outRecEnCours, OUTPUT);
   pinMode(getReady, OUTPUT);
   pinMode(auSuivant, OUTPUT);
   // initialisation des lampes
   digitalWrite(outRecEnCours, LOW);
   digitalWrite(getReady, LOW);
   digitalWrite(auSuivant, HIGH);
 }
 void loop() {
   if (digitalRead(modeClavier)==HIGH && etatClavier==0) {
     etatClavier=1;
     delay(200);
     Keyboard.begin();
   }
   if (digitalRead(modeClavier)==LOW) {
     etatClavier=0;
     Keyboard.end();
   }
   if (digitalRead(bpRec)==HIGH && etatClavier==1) {
     // Lampe tenez vous prets
     digitalWrite(auSuivant, LOW);
     digitalWrite(getReady, HIGH);
     // appel de console
     Keyboard.press(KEY_LEFT_CTRL);
     delay(100);
     Keyboard.press(KEY_LEFT_ALT);
     delay(100);
     Keyboard.press('t');
     delay(100);
     Keyboard.releaseAll();
     delay(1000);
     // appel de commande
     // prise de vue
     Keyboard.write('g');
     delay(50);
     Keyboard.write('u');
     delay(50);
     Keyboard.write('v');
     delay(50);
     Keyboard.write('c');
     delay(50);
     Keyboard.write('v');
     delay(50);
     Keyboard.write('i');
     delay(50);
     Keyboard.write('e');
     delay(50);
     Keyboard.write('z');
     delay(50);
     Keyboard.write(' ');
     delay(50);
     Keyboard.write('6');
     delay(50);
     Keyboard.write('y');
     delay(50);
     Keyboard.write(' ');
     delay(50);
     Keyboard.write('#');
     delay(50);
     Keyboard.write(')');
     delay(50);
     Keyboard.press(KEY_RETURN);
     delay(100);
     Keyboard.releaseAll();
     //gestion de la lampe
     digitalWrite(getReady, LOW);
     digitalWrite(outRecEnCours,HIGH); // allumage du panneau lumineux
     delay(28500);
     for (int i=0;i<3;i++) {
       digitalWrite(outRecEnCours,LOW);
       delay(250);
       digitalWrite(outRecEnCours,HIGH);
       delay(250);
     }
     digitalWrite(outRecEnCours,LOW);
     delay(1000);    
     // fermeture de guvcview
     Keyboard.press(KEY_LEFT_ALT);
     delay(100);
     Keyboard.press(KEY_F4);
     delay(100);
     Keyboard.releaseAll();
     delay(2000);
     // fermeture de la console
     Keyboard.press(KEY_LEFT_ALT);
     delay(100);
     Keyboard.press(KEY_F4);
     delay(100);
     Keyboard.releaseAll();
     digitalWrite(auSuivant,HIGH); // extinction du panneau lumineux
   }
 }
 /**/

Pour ceux qui ne seraient habitué à ce site, je sais que le code n’est pas optimisé. Vous remarquerez que j’utilise l’entrée 2 comme indicateur de mode clavier. Sans cela, il est difficile de modifier le programme de la carte depuis certains PC. Le port USB servant déjà à l’émulation de clavier plug&play.

Bug de la vidéo

Sur nos vidéos, nous avons constaté un décalage entre le son et l’image de presque 1.166 secondes. Plutôt que de chercher l’origine du problème, j’ai préféré corriger les vidéos par paquet grâce à l’outil Linux ffmpeg. Attention, c’est en ligne de commande.

Etape 1 : Ouvrir un terminal (sous linux évidemment)

Tapez CTRL+ALT+T

Etape 2 : Naviguer vers le dossier contenant les vidéos

Avec la commande “cd” retrouvez le dossier. Vérifiez qu’il contient bien les fichiers *.mkv avec la commande “dir”.

image.png

Etape 3 : La ligne de commande magique

Mesurez bien le temps de décalage entre le son et l’image grâce à un logiciel comme Kdenlive par exemple. Pour moi, ce décalage est de 1.166 seconde. Ensuite, c’est le saut de la foi. Tapez la ligne suivante :

for i in .mkv; do ffmpeg -i "$i" -itsoffset 1.166 -i "$i" -vcodec copy -acodec copy -map 0:1 -map 1:0 "${i%.}.mp4"; done
image.png

Etape 4 : Contrôle

Normalement, de nouveaux fichiers vidéos *.mp4 ont été créés. Il faut vérifier que le son est bon.

Amusez-vous !

Auteur : Cyrille Laulier

Bidouilleur à temps perdu

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.