Le Raspberry-Pi dispose d'un accessoire assez remarquable: un écran TFT tactile. Lorsque qu'il est utilisé avec le boitier dédié, on obtient un minuscule ordinateur tout-en-un, fort pratique pour afficher les valeurs de divers capteurs. C'est d'autant plus intéressant que l'application YoctoVisualization tourne maintenant sous Linux :-) Il y a juste une petite ombre au tableau: le contrôle de la luminosité...
Peut-on s'arranger pour que la luminosité de l'écran s'adapte à la lumière ambiante?
Si vous installez cet écran dans une pièce, vous allez rapidement vous rendre compte que la nuit, le rétro-éclairage de l'écran est suffisamment fort pour baigner la pièce d'une lumière fantomatique un peu flippante. C'est pourquoi on s'est demandé s'il ne serait pas possible de modifier l'écran pour qu'il adapte automatiquement sa luminosité à la lumière ambiante. Pour cela il suffirait d'un capteur de lumière, ça tombe bien, ce n'est pas ce qui manque chez Yoctopuce.
Partie hardware
On voulait que le capteur soit directement intégré à l'écran même s'il est évidement possible de le connecter au bout d'un bête câble USB. La partie la plus délicate consiste à ménager une ouverture sur la façade avant de l'écran. Cette face avant est constituée d'une plaque de plastique, dont les bordures sont peintes en noir du coté interne. L'idée est d'enlever un peu de cette peinture et d'obtenir une petite fenêtre ronde. Pour ce faire, on a collé un confetti de papier de verre sur une tête de vis, qu'on a placé dans le mandrin d'une perceuse à colonne, et on a utilisé cet outil improvisé pour décaper la peinture noire, résultat impeccable en quelques secondes.
Décapage express
Notez qu'il faut faire tourner le mandrin très lentement pour ne pas faire fondre le plastique. Après l'opération, il peut rester un point de peinture noire au centre du rond. Il suffit de le gratter délicatement avec une pointe de cutter pour le faire partir.
Un beau rond tout propre
Pour mesurer la lumière ambiante, on a choisi d'utiliser un Yocto-Light-V2 parce que dans les basses luminosités, il est un peu plus sensible que le Yocto-Light-V3. On l'a coupé en deux: il y a juste assez de place pour la partie capteur le long du bord de l'écran. Pour faire un montage propre, on a collé a la colle époxy deux supports en verre acrylique munies d'inserts filetés, un le long du bord de l'écran en face de la fenêtre et un second au beau milieu du PCB de l'écran. Ainsi les deux parties du module peuvent être fixées avec des vis.
La partie électronique
On a connecté le module au Raspberry Pi en soudant les fils d'un câble 1.27-1.27-11 directement sous un des connecteurs USB. On a condamné le port USB correspondant à l'aide d'un dongle USB imprimé. Finalement, on a du raboter deux des renforts du boîtier pour arriver à le refermer.
Il a fallu limer un peu le boitier
Une fois terminé ce petit bricolage réalisé en moins de deux heures a un look tout à fait honorable, on remarque à peine le capteur de lumière sur la face avant.
Un écran Raspberry PI avec un capteur de lumière ambiante
Partie Software
Pour changer la luminosité de l'écran, il suffit d'écrire un entier entre 0 et 255 dans le fichier
/sys/class/backlight/rpi_backlight/brightness. Par défaut il faut être root pour pouvoir le faire, c'est pourquoi on a ajouté une petite ligne dans le fichier /etc/udev/rules.d/51-yoctopuce.rules qui autorise déjà le commun des mortels à utiliser des modules Yoctopuce.
# udev rule to allow write access to all users for Yoctopuce USB devices SUBSYSTEM=="usb", ATTR{idVendor}=="24e0", MODE="0666" # udev rules to allow write access to all users for RaspberryPi 7" Touch Display SUBSYSTEM=="backlight",RUN+="/bin/chmod 666 /sys/class/backlight/%k/brightness"
On a installé le VirtualHub sur le Raspberry Pi et fait en sorte qu'il démarre automatiquement au boot de la machine, grâce à system-D
Puis on a écrit un petit script tout simple qui trouve le premier capteur de lumière disponible, et installe un callback qui recalcule la luminosité de l'écran en fonction de la lumière ambiante. Pour éviter que l'écran ne se mette à flasher à chaque fois que quelqu'un passe devant, les changements de luminosité se font par incréments de 1 toutes les 5 ms.
# -*- coding: utf-8 -*-
# import Yoctopuce Python library (installed from PyPI)
from yoctopuce.yocto_api import *
from yoctopuce.yocto_lightsensor import *
target = 128
current = 128
def lightChange(sensor,value):
global target
target = int(float(value))
if target>255: target=255
if target<10: target=10
errmsg = YRefParam()
if YAPI.RegisterHub("127.0.0.1", errmsg) != YAPI.SUCCESS:
sys.exit("RegisterHub error" + str(errmsg))
sensor = YLightSensor.FirstLightSensor()
if sensor == None:
sys.exit("No light sensor available.");
sensor.registerValueCallback(lightChange)
while True:
YAPI.Sleep(5,errmsg)
if (target!=current):
if (current<target):
current = current+1
else:
current = current-1
file = open("/sys/class/backlight/rpi_backlight/brightness","w")
file.write(str(current))
file.close()
Et voilà, c'est fini, et ça marche:
Remarques finales
Ces écrans pour Raspberry Pi sont livrés avec un plastique de protection collé sur la face avant, ne le retirez surtout pas avant d'avoir terminé votre bricolage et d'être sûr que tout marche, cela vous évitera de rayer bêtement l'écran en travaillant dessus.
Vous aurez sans doute remarqué que l'accès au Yocto-Light-V2 se fait à travers un VirtualHub. C'est parce que si on l'avait fait en mode USB natif, cela aurait interdit de faire tourner une autre application utilisant des module Yoctopuce sur la même machine.
Par défaut, l'écran du Raspberry Pi s'éteint tout seul au bout de quelques minutes, la méthode la plus simple et la plus fiable pour éviter ce désagrément consiste à installer un screensaver
sudo apt-get install xscreensaver
puis à le désactiver.