Magic Mirror

Me voilà lancé dans mon projet de miroir magique avec ma Raspberry pi !

On trouve sur le net plusieurs exemple de réalisation de miroirs magiques. Il exemple plusieurs approches : carte Raspberry couplée à un écran LCD, application Android qui tourne sur une tablette bon marché…

J’ai opté pour la première solution car c’est celle qui me laissera, je pense, le plus de liberté.

Le principe

Le principe est relativement simple (sur le papier). Il s’agit de réaliser un miroir à partir d’une vitre sans tain derrière laquelle on vient fixer un écran LCD relié à la carte Raspberry Pi. La carte affiche une page web en plein écran. Tout ce qui est noir est invisible coté miroir, tout ce qui est blanc apparait.

Inspiration :

L’idée

Mon idée au niveau software :

  1. Affichage de la météo et du jour/heure
  2. Installation d’un capteur de proximité pour allumer l’écran uniquement quand quelqu’un s’en approche
  3. Utilisation de la reconnaissance faciale pour afficher les prochains événements du calendrier de la personne devant le miroir (plus tard)

Budget

Sans en avoir l’explication, j’ai constaté qu’un miroir sans tain est hors de prix en France. Je vais donc me tourner vers l’achat d’une plaque en verre sur laquelle je collerai un film « sans tain ». Il me reste encore à déterminer si je vais réaliser un cadre en bois ou intégrer le miroir à un meuble existant.

Pour l’écran, je vais réutiliser un vieil écran LCD qui traine dans un coin de mon appartement.

Software

Etant avant tout développeur, je suis pressé de tester les possibilités logicielles. C’est parti !

Les sources sont disponibles sur mon GitHub.

Incliner l’écran de 90°

sudo nano /boot/config.txt

Ajouter la ligne suivante à la fin du fichier :

display_rotate=0 Normal
display_rotate=1 90 degrees
display_rotate=2 180 degrees
display_rotate=3 270 degrees
display_rotate=0x10000 horizontal flip
display_rotate=0x20000 vertical flip

Météo et jour/heure

Etant développeur web, cette partie est la plus simple pour moi. Je réalise rapidement une page web avec du Javascript qui affiche la date/heure à gauche et la météo à droite. Je me base sur l’API OpenWeatherMap qui fournit les données météo pour ma ville, ainsi que les prévisions sur plusieurs jours.

Un peu de formatage et le tour est joué :

capture d'écran de l'interface du miroir
Capture d’écran de l’interface qui s’affichera au travers du miroir

Le code est loin d’être parfait mais j’aurais l’occasion de le retravailler plus tard. Toute contribution est la bienvenue 🙂

Installer le code sur le RPI

sudo apt-get install nginx
cd /var/www
sudo chmod o+w .
git clone https://github.com/nicolasgrancher/mirror.git
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mirror
sudo nano /etc/nginx/sites-available/mirror

server {
listen 80;
root /var/www/mirror;
index index.html;
server_name mirror;
location / {
try_files $uri $uri/ =404;
}
}

sudo ln -s /etc/nginx/sites-available/mirror /etc/nginx/sites-enabled/mirror
sudo service nginx restart
sudo nano /etc/hosts

127.0.0.1       mirror

Tester en lançant le navigateur à l’adresse http://mirror/

Pour lancer le navigateur automatiquement au démarrage du RPI en plein écran j’ai suivi ce tuto :
http://blog.philippegarry.com/2014/10/15/pi-kiosk-mode/
et https://letmeknow.fr/blog/2016/03/12/tuto-passer-le-raspberry-pi-en-mode-kiosque/

sudo apt-get install chromium
sudo nano ~/.config/lxsession/LXDE-pi/autostart

ajouter :
@point-rpi
@xset s off
@xset -dpms
@xset s noblank
@chromium-browser –kiosk http://mirror

EDIT 15/02/2020 :

Avec une meilleur compréhension voici une méthode plus propre :

Nous désactivons l’économiseur d’écran :

sudo nano ~/.config/lxsession/LXDE-pi/autostart

@xset s off
@xset -dpms
@xset s noblank
#@lxpanel --profile LXDE-pi
#@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
@point-rpi

Puis nous créons un fichier pour démarrer Chromium automatiquement.
nano ~/.config/autostart/autoChromium.desktop

[Desktop Entry]
Type=Application
Exec=/usr/bin/chromium-browser –noerrdialogs –incognito –disable-session-crashed-bubble –disable-infobars –kiosk http://mirror
Hidden=false
X-GNOME-Autostart-enabled=true
Name[en_US]=AutoChromium
Name=AutoChromium
Comment=Autostart Chromium

sudo reboot

Allumer ou éteindre le moniteur

https://thepihut.com/blogs/raspberry-pi-tutorials/raspberry-pi-gpio-sensing-motion-detection

À tester avec détecteur de présence :

https://www.banggood.com/HC-SR505-Mini-Infrared-PIR-Motion-Sensor-Precise-Infrared-Detector-Module-p-1011714.html?akmClientCountry=FR&&cur_warehouse=CN

EDIT 15/02/2020 :

éteindre l’écran :

tvservice -o

vcgencmd display_power 1

Allumer l’écran :

tvservice -p
sudo chvt 6
sudo chvt 7

J’en ai fait deux scripts :

~/screen_off.sh et ~/screen_on.sh

Code du détecteur de mouvement :

nano ~/sensor.py

import RPi.GPIO as GPIO
import time
import subprocess

GPIO.setmode(GPIO.BCM)
PIR_PIN = 4
GPIO.setup(PIR_PIN, GPIO.IN)

SCREEN_OFF_SCRIPT = « sudo sh /home/pi/screen_off.sh »
SCREEN_ON_SCRIPT = « sudo sh /home/pi/screen_on.sh »
screen_status = 1
timecount = 0
cycle_duration = 10
cycle_limit = 30

def EXEC_BASH(command):
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print output
if error:
print error

def MOTION(PIR_PIN):
global screen_status
global timecount
print « Motion Detected! »
screen_status = 1
timecount = 0
EXEC_BASH(SCREEN_ON_SCRIPT)

print « PIR Module Script (CTRL+C to exit) »
time.sleep(2)
print « Ready »

try:
GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback=MOTION)
while 1:
time.sleep(cycle_duration)
timecount = timecount + cycle_duration
if timecount >= cycle_limit and screen_status == 1:
EXEC_BASH(SCREEN_OFF_SCRIPT)
screen_statut = 0
timecount = 0
except KeyboardInterrupt:
print « Quit »
GPIO.cleanup()

Lancer le script au démarrage :

sudo nano /etc/rc.local

Ajouter cette ligne juste avant le « exit 0 »
python ~/sensor.py &

sudo reboot

Hardware

Choix des matériaux

Choix de la vitre
Matériaux achetés : filtre sans tain, tasseau de bois, pistolet à colle, scie

Application du film sans tain

Réalisation du cadre en bois

Le cadre monté et fixé par des vis
Ajout de tasseaux intérieurs qui permettront de faire tenir l’écran. J’ai percé une partie pour y insérer le capteur de présence
Mise en peinture

Fixation de la vitre au cadre

Réalisation d’un « joint » au pistolet à colle
Retrait de l’excédent de colle

Fixation de l’écran derrière la vitre

Fixation à l’aide de vis

Résultat

Le miroir terminé

4 commentaires Ajoutez le votre

  1. Matt dit :

    Bonjour
    Super Tuto
    Avez vous réussi à installer la détection de mouvement ?
    Il me manque cette élément pour finaliser mon miroir …

    1. Nicolas dit :

      Bonjour Matt,
      Désolé pour la réponse tardive je n’avais pas reçu d’alerte de commentaire.
      Merci pour ton retour.
      Je n’ai pas encore finalisé la partie détecteur de présence mais je peux te donner l’état de mes recherches. J’ai trouvé un petit script python que j’ai adapté pour tester le capteur (cf. ci-dessous). Il faudrait remplacer les « print » par une commande pour allumer/éteindre l’écran.

      Si tu souhaites partager ta réalisation je serais curieux de voir le résultat.

      Bonnes geekeries !

      import RPi.GPIO as GPIO
      import time
      GPIO.setwarnings(False)
      GPIO.setmode(GPIO.BOARD)
      GPIO.setup(11, GPIO.IN)
      while True:
      i=GPIO.input(11)
      if i==0:
      print "rien",i
      time.sleep(0.1)
      elif i==1:
      print "detection",i
      time.sleep(0.1)

  2. Grégory dit :

    Très intéressant, merci pour ce petit tuto. J’espère que tu as d’autres idées à développer sous le coude ! 🙂

    1. Nicolas dit :

      Merci Grégory pour ton message. Je manque un peu de temps en ce moment mais j’ai plusieurs idées dans les tuyaux. Stay tuned 😉
      PS : j’adore le design de ton site

Répondre à Grégory Annuler la réponse

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