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 :
- http://blog.dylanjpierce.com/raspberrypi/magicmirror/tutorial/2015/12/27/build-a-magic-mirror.html
- http://michaelteeuw.nl/post/84026273526/and-there-it-is-the-end-result-of-the-magic
- https://medium.com/@maxbraun/my-bathroom-mirror-is-smarter-than-yours-94b21c6671ba
- https://thinkrpi.wordpress.com/magic-mirror/
L’idée
Mon idée au niveau software :
- Affichage de la météo et du jour/heure
- Installation d’un capteur de proximité pour allumer l’écran uniquement quand quelqu’un s’en approche
- 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é :

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/mirrorserver {
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/hosts127.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/autostartajouter :
@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-rpiPuis 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 Chromiumsudo 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 subprocessGPIO.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 = 30def EXEC_BASH(command):
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print output
if error:
print errordef 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


Application du film sans tain
Réalisation du cadre en bois



Fixation de la vitre au cadre


Fixation de l’écran derrière la vitre

Résultat

Bonjour
Super Tuto
Avez vous réussi à installer la détection de mouvement ?
Il me manque cette élément pour finaliser mon miroir …
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)
Très intéressant, merci pour ce petit tuto. J’espère que tu as d’autres idées à développer sous le coude ! 🙂
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