Détection automatique résolution écran

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

prd2
Messages : 9
Enregistré le : ven. 20 janv. 2017 08:51

Détection automatique résolution écran

Message par prd2 » ven. 20 janv. 2017 09:40

Bonjour,
J'ai un petit problème à résoudre et donc un grand besoin d'aide si possible ;)

Tout d'abord, voici ma config :
-RPI3 qui boot sur Retropie avec Kodi au sein de Retropie.
-écran HDMI waveshare 7" 1024x600, celui-ci : http://www.waveshare.com/product/module ... -lcd-c.htm
-écran alimenté sur l'USB du RPI et raccordé en HDMI sur le RPI

J'ai pu à peu près m'en sortir avec l'installation de tout ça en suivant moultes tutos et ça fonctionne dans les grandes lignes.
J'ai rajouté les lignes nécessaires au fichier config.txt pour la prise en compte de la résolution écran du waveshare, OK.
Mais lorsque je rebranche mon RPI sur ma TV, plus d'image ! :|
Je compte n'utiliser le waveshare que sporadiquement lorsque madame a besoin de la TV.
Je suppose que je devrais avant chaque boot modifier le config.txt mais ça risque de vite devenir lourd.

Donc, est-il possible de faire en sorte que le RPI détecte automatiquement la résolution de l'écran auquel il est raccordé ?

Ce que je trouve bizarre c'est que le RPI n'essaie même pas d'afficher du 1024x600 sur ma TV, c'est black out écran noir direct.

HELP !

D'avance merci, ça va être passionnant j'espère :)

dyox
Raspinaute
Messages : 511
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: Détection automatique résolution écran

Message par dyox » dim. 22 janv. 2017 10:26

Bonjour,

Je regardais ce post du coin de l’œil car effectivement il va être passionnant et je le laissais au plus spécialiste que moi !

Je vais être succinct mais je vais donner ce que je ferais (il y a sûrement mieux mais il faut bien commencer par un début).

Ce que l'on sait :
- détection automatique du matériel et application de la résolution adéquate
=> 1 config.txt pour la TV et 1 autre pour lcd ; copie suivant la détection et reboot ; cron toutes les x secondes pour la détection auto
- config.txt
- wiki 7inch HDMI LCD
- écrire en BASH
- commande grep

Le plus dur est de connaitre la BONNE commande qui sera explicite concernant la détection de la TV / lcd. Peut-être que le matériel / résolution / driver est inscrit dans la commande "dmesg".
Il faudra comparer les fichiers sortant de dmesg ; genre
sur la tv : dmes > tv.txt
sur lcd : dmesg > lcd.txt
et on compare (il existe plein d'outils sous linux / windows), on relève une différence intéressante qui n'existera jamais dans l'autre.

Dans un bash (supposons que nous sommes sur lcd avec le config.txt de TV) :
si "variable LCD" présente dans dmesg et nous avons le config.txt du LCD, rien ne se passe AUTREMENT copie du config.txt LCD et reboot
si "variable TV"...

Je vous laisse chercher les options de grep, les conditions, cron...

Bon courage
Débutant sous RPi / linux

:arrow: :arrow: :arrow: [Pour bien commencer] Pour les nouveaux acquéreurs de Raspberry Pi (liste de liens utiles)

Avatar du membre
Flachy Joe
Messages : 82
Enregistré le : mar. 20 sept. 2016 22:30

Re: Détection automatique résolution écran

Message par Flachy Joe » dim. 22 janv. 2017 21:57

Salut,
dyox : sauf qu'avec cette technique il faut démarrer une fois pour détecter l’écran puis redémarrer pour appliquer les modif du fichier config.txt

Il vaudrait mieux s'inspirer de ça : http://www.opentechguides.com/how-to/ar ... tting.html Sous-titre The resolution and HDMI modes are not the best values for your screen
Et utiliser l'utilitaire tvservice pour changer dynamiquement la résolution avec l'option
https://github.com/raspberrypi/userland/blob/master/host_applications/linux/apps/tvservice/tvservice.c a écrit : -e, --explicit=\"GROUP MODE DRIVE\" Power on HDMI with explicit GROUP (CEA, DMT, CEA_3D_SBS, CEA_3D_TB, CEA_3D_FP, CEA_3D_FS)\n"
" MODE (see --modes) and DRIVE (HDMI, DVI)" );
.

prd2
Messages : 9
Enregistré le : ven. 20 janv. 2017 08:51

Re: Détection automatique résolution écran

Message par prd2 » lun. 23 janv. 2017 09:19

Merci pour vos réponses !
Mais j'avoue, c'est un vrai charabia pour moi.
Pas évident du tout pour un débutant.
Moi qui m'attendais à un truc tout cuit à copier/coller dans le config.txt, je suis déçu :lol:

Je vais creuser du côté de tvservice pour savoir :
1- qu'est-ce que c'est ?
2- à quoi ça sert ?
3- comment on s'en sert ?
4- est-ce que ça peut solutionner mon problème ?

Ça va faire beaucoup de choses à se fourrer dans le crâne :)

Avatar du membre
Flachy Joe
Messages : 82
Enregistré le : mar. 20 sept. 2016 22:30

Re: Détection automatique résolution écran

Message par Flachy Joe » lun. 23 janv. 2017 12:42

Salut,
tvservice est un utilitaire en ligne de commande pour lire ou modifier l'état des sorties vidéo du RPi.

Un script de ce genre, lancé au démarrage, devrait faire ton affaire. Les lignes entre case et esac sont à éditer pour mettre le nom de tes moniteurs et les modes correspondants :

Code : Tout sélectionner

#!/bin/bash

# Lecture des information EDID pour trouver le nom du moniteur
PARSE_STRING="HDMI:EDID monitor name is "
MONITOR=$(tvservice -d - | edidparser - | sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//")

#Les modes pour chaque moniteur
case $MONITOR in
	SyncMaster)	MODE="DMT 87 HDMI" ;;	#1e moniteur
	Bidule)		MODE="CEA 5 HDMI" ;;	#2d moniteur
	*)			MODE="DMT 4 DVI" ;;	#par défaut
esac

#Activation du mode sélectionné
tvservice -e "$MODE"
Tu peux utiliser les commandes

Code : Tout sélectionner

PARSE_STRING="HDMI:EDID monitor name is "
tvservice -d - | edidparser - | sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//"
pour afficher le nom du moniteur tel que détecté par tvservice.
et

Code : Tout sélectionner

tvservice -s
pour connaître le mode actuellement utilisé.

prd2
Messages : 9
Enregistré le : ven. 20 janv. 2017 08:51

Re: Détection automatique résolution écran

Message par prd2 » lun. 23 janv. 2017 23:19

Merci Flachy Joe mais après beaucoup d'essais et tâtonnement, rien n'y fait.

J'ai pu trouver les modes correspondant à mes deux moniteurs.
J'ai changé leurs noms respectifs mais peut-être faut-il indiquer des noms bien précis ?
Y'a forcément une voir plusieurs choses qui m'échapent :oops:

Voici une copie de mon config.txt

[code]
# For more options and information see
# http://www.raspberrypi.org/documentatio ... fig-txt.md
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
gpu_mem_256=128
gpu_mem_512=256
gpu_mem_1024=256
overscan_scale=1

# SWITCH WAVESHARE
#max_usb_current=1
#hdmi_group=2
#hdmi_mode=87
#hdmi_cvt=1024 600 60 6 0 0 0
#hdmi_force_mode=1

# TEST DETECTION MONITEUR

#!/bin/bash

# Lecture des information EDID pour trouver le nom du moniteur
PARSE_STRING="HDMI:EDID monitor name is "
MONITOR=$(tvservice -d - | edidparser - | sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//")

#Les modes pour chaque moniteur
case $MONITOR in
Waveshare) MODE="DMT 87 DVI" ;; #1e moniteur
Panasonic) MODE="CEA 31 HDMI" ;; #2d moniteur
*) MODE="DMT 4 DVI" ;; #par défaut
esac

#Activation du mode sélectionné
tvservice -e "$MODE"
[/code]

Avatar du membre
Flachy Joe
Messages : 82
Enregistré le : mar. 20 sept. 2016 22:30

Re: Détection automatique résolution écran

Message par Flachy Joe » mar. 24 janv. 2017 09:10

Le script bash ne doit pas être dans le fichier config.txt, il doit être lancé par l'OS cf http://www.framboise314.fr/raspbian-tou ... e_Raspbian

Les noms des moniteurs sont effectivement bien précis, il faut utiliser la commande que j'ai cité précédemment pour les connaître :

Code : Tout sélectionner

PARSE_STRING="HDMI:EDID monitor name is "
tvservice -d - | edidparser - | sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//"
De même que les modes, ceux que j'ai indiqué sont des exemples.
En l'occurrence le mode DMT 87 est celui du waveshare, dé-commente la ligne hdmi_cvt=1024 600 60 6 0 0 0 dans config.txt

Pour ouvrir un émulateur de terminal où taper ces commandes : une fois le bureau affiché, appuyer sur Atl+F2, taper x-terminal-emulator dans la fenêtre qui s'ouvre puis cliquer sur Lancer.

prd2
Messages : 9
Enregistré le : ven. 20 janv. 2017 08:51

Re: Détection automatique résolution écran

Message par prd2 » mar. 24 janv. 2017 09:43

OK, je vais remettre le nez dedans ce soir après le boulot.
Depuis le temps que je cherche la marche à suivre, je trouve étonnant de ne rien trouver à ce sujet sur le net.
Si ça finit par fonctionner, ce sera une bonne avancée !
Je dois tout de même pas être le seul dans ce cas de figure.

prd2
Messages : 9
Enregistré le : ven. 20 janv. 2017 08:51

Re: Détection automatique résolution écran

Message par prd2 » mar. 24 janv. 2017 21:06

Suite :

J'ai finalement pu lancer le script qui semble fonctionner car au démarrage sur ma tv, je vois bien que le RPI switch entre les trois modes avant de se fixer sur le dernier de la liste : DMT 4 DVI qui sort de l'écran en haut, en bas et sur les côtés :cry:

Le problème est que je n'arrive pas à lancer la commande pour afficher le nom des moniteurs :

Code : Tout sélectionner

    PARSE_STRING="HDMI:EDID monitor name is "
    tvservice -d - | edidparser - | sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//"
Je ne sais pas faire le saut de ligne dans le terminal...
Pourtant j'ai bien cherché comment faire (certainement pas assez).

Du coup, impossible de renseigner le nom exact des moniteurs, ce qui explique que le script zappe les deux premiers modes (ceux qui m'intéressent le plus !)

Avatar du membre
Flachy Joe
Messages : 82
Enregistré le : mar. 20 sept. 2016 22:30

Re: Détection automatique résolution écran

Message par Flachy Joe » mar. 24 janv. 2017 21:48

Quand il y a plusieurs lignes c'est des commandes qui se suivent qui ont chacune leur résultat. Tu tapes sur Entrée à chaque fin de ligne, ça exécute la commande, te renvoi (ou pas) un résultat et te redonne la main pour entrer la commande suivante.

Explication des commandes :

Code : Tout sélectionner

 PARSE_STRING="HDMI:EDID monitor name is "
déclare une variable nommée PARSE_STRING qui est utilisée dans la commande suivante. Ne renvoi rien.

Ensuite c'est des commandes enchaînées, cad que le résultat de la première est envoyé dans la seconde qui envoie elle même son résultat dans la troisième et la troisième envoi finalement son résultat sur la sortie standard, cad l'affiche sur le terminal. Tout ça en une seule ligne. Le caractère | qui relie les commandes est appelé pipe (= tuyau).

Code : Tout sélectionner

tvservice -d -
Lit les données EDID de l'écran sous forme binaire

Code : Tout sélectionner

edidparser -
Transforme ces données binaires en texte

Code : Tout sélectionner

sed "/$PARSE_STRING/"'!'"d ; s/$PARSE_STRING//"
Supprime toutes les lignes ne contenant pas le texte de la variable PARSE_STRING et le remplace, dans la ligne qui le contient, par rien du tout, de manière à n'obtenir que le nom de l'écran.

Répondre

Retourner vers « Utilisateurs avancés »