Forum Diskio Pi

Another digital world is possible.

Vous n'êtes pas identifié(e).

#1 04-07-2020 22:12:23

belzebuteu
Moderator

[Ca avance]Mettre en place la rotation automatique de l'écran

Tuto afin de mettre en place la rotation automatique de l'écran sur la Diskio à partir d'une raspberry Pi sous Raspbian.

Vidéo de démo Ici

Pour mettre en place tout ça je me suis basé sur 2 tutos glanés sur le web.

Le 1er How to rotate display ubuntu qui explique la commande

xrandr -o <arg>

Puis le second tuto expliquant la détection du gyroscope MPU-6050 trouvable chez nos amis chinois ou sur amazon. J'utilise ce type là :MPU-9250 mais celui ici est celui du tuto

Commençons par le branchement du gyroscope à la Pi.

-------------------------
Raspberry Pi |    MPU 6050
-------------------------
Pin 1 (3.3V) |    VCC
Pin 3 (SDA)  |    SDA
Pin 5 (SCL)  |    SCL
Pin 6 (GND)  |    GND

rpi-mpu-diskio.png

Ensuite vous devez activer I²C sur la pi via la commande

sudo raspi-config

Puis dans le N°5 Interfacing Options et enfin P5 enable i2c.

Ensuite:

sudo nano /etc/modules

Si la ligne n'est pas présente alors rajoutez

i2c-bcm2708

Ensuite un reboot

Maintenant il faut installer les outils i²c et les paquets python:

sudo apt-get install i2c-tools python-smbus

Lançons un test afin de voir si le module i²c est détecté:

sudo i2cdetect -y 1

Vous devriez voir ceci:

pi@raspberrypi ~ $ sudo i2cdetect -y 1
 0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Pour lire la valeur retour du module:

sudo i2cget -y 1 0x68 0x75

Maintenant il nous reste à créer un script afin de lire la valeur automatiquement et d'exécuter la rotation de l'écran.
Attention. Ce script est fait à l'arrache pour test à partir de celui du 2nd tuto:
/!\ des bouts de code xinput sont dans le script. A la fin du tuto vous comprendrez pourquoi.

Créer un fichier gyro.py sur votre bureau pour commencer:

nano ~/Desktop/gyro.py
#!/usr/bin/python
import smbus
import math
import os
 
# Register
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
 
def read_byte(reg):
    return bus.read_byte_data(address, reg)
 
def read_word(reg):
    h = bus.read_byte_data(address, reg)
    l = bus.read_byte_data(address, reg+1)
    value = (h << 8) + l
    return value
 
def read_word_2c(reg):
    val = read_word(reg)
    if (val >= 0x8000):
        return -((65535 - val) + 1)
    else:
        return val
 
def dist(a,b):
    return math.sqrt((a*a)+(b*b))
 
def get_y_rotation(x,y,z):
    radians = math.atan2(x, dist(y,z))
    return -math.degrees(radians)
 
def get_x_rotation(x,y,z):
    radians = math.atan2(y, dist(x,z))
    return math.degrees(radians)
 

while True: 
        bus = smbus.SMBus(1) # bus = smbus.SMBus(0) fuer Revision 1
        address = 0x68       # via i2cdetect
 
# Aktivieren, um das Modul ansprechen zu koennen
        bus.write_byte_data(address, power_mgmt_1, 0)
 
 
        gyroskop_xout = read_word_2c(0x43)
        gyroskop_yout = read_word_2c(0x45)
        gyroskop_zout = read_word_2c(0x47)
 
        beschleunigung_xout = read_word_2c(0x3b)
        beschleunigung_yout = read_word_2c(0x3d)
        beschleunigung_zout = read_word_2c(0x3f)
 
        beschleunigung_xout_skaliert = beschleunigung_xout / 16384.0
        beschleunigung_yout_skaliert = beschleunigung_yout / 16384.0
        beschleunigung_zout_skaliert = beschleunigung_zout / 16384.0
 
        #position =  get_y_rotation(beschleunigung_xout_skaliert, beschleunigung_yout_skaliert, beschleunigung_zout_skaliert)
        positionx = beschleunigung_xout
        #positiony = beschleunigung_yout
        #positionz = beschleunigung_zout
    
    
        if positionx > 350 and positionx < 800 :
            print("gauche")
            #os.system('xrandr -o left')
            #os.system("xinput set-prop 'ILITEK Multi-Touch-V3000' 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1")
    
        if positionx < -90 and positionx > -1000:
            print("droite")
            #os.system('xrandr -o right')
            #os.system("xinput set-prop 'ILITEK Multi-Touch-V3000' 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1")
        
        if positionx > 14500 and positionx < 17000 :  
            print("normal")
            #os.system('xrandr -o normal')
            #os.system("xinput set-prop 'ILITEK Multi-Touch-V3000' 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1")

        if positionx > -16000 and positionx < -10000 :
            print("a lenvers")
            #os.system('xrandr -o inverted')
            #os.system("xinput set-prop 'ILITEK Multi-Touch-V3000' 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1")

        os.system('sleep 1')


        #a commenter
        print(position) 

puis exécutez le afin d'avoir un retour visuel sur son bon fonctionnement:

sudo python ~/Desktop/gyro.py

Pour stopper le script la solution est de récupérer son PID (nom barbare pour définir son numéro de processus):

ps -ef | grep gyro
pi         712     1  0 20:26 ?        00:00:07 /usr/bin/python /home/pi/Desktop/gyro.py
pi       13784  8963  0 21:19 pts/0    00:00:00 grep --color=auto gyro

Nous voyons ici que le PID est 712 et nous allons le killer:

kill -9 712

Ok maintenant vous pouvez revenir dans le script et commenter les 4 lignes <print(...> et décommenter celles appelant la rotation de l'écran (os.system('xrandr -o ...))

Maintenant vous pouvez placer le script dans le répertoire des exécutables puis modifier les droits et enfin l'activer au démarrage en suivant la même méthode qu'expliqué dans ce post:

sudo cp ~/Desktop/gyro.py /usr/bin
chown pi:pi /usr/bin/gyro.py
chmod 744 /usr/bin/gyro.py

Vous pouvez télécharger le fichier stl afin de le fixer sur la platine supportant la SBC:
Support MPU9250


Tout ça c'est très bien mais pourquoi des 0 & des 1 dans le script avec xinput?
C'est très simple. Vous effectuez une rotation de l'écran mais il faut aussi appliquer cette rotation à la dalle tactile.
Nous devrions tous avoir la même dalle pour le moment, mais la diskioPi est appelée à vivre, évoluer.
Donc en m'appuyant sur ce forum et le wiki ubuntu nous allons trouver le driver de la dalle:

pi@raspberrypi:~ $ xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ ILITEK Multi-Touch-V3000                	id=7	[slave  pointer  (2)]
⎜   ↳ ILITEK Multi-Touch-V3000 Mouse          	id=8	[slave  pointer  (2)]
⎜   ↳ Logitech K400 Plus                      	id=6	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ ILITEK Multi-Touch-V3000 Keyboard       	id=9	[slave  keyboard (3)]
    ↳ Logitech K400 Plus                      	id=10	[slave  keyboard (3)]
pi@raspberrypi:~ $ xinput list-props "ILITEK Multi-Touch-V3000"
Device 'ILITEK Multi-Touch-V3000':
	Device Enabled (135):	1
	Coordinate Transformation Matrix (136):	1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
	Device Accel Profile (261):	0
	Device Accel Constant Deceleration (262):	1.000000
	Device Accel Adaptive Deceleration (263):	1.000000
	Device Accel Velocity Scaling (264):	10.000000
	Device Product ID (285):	8746, 1
	Device Node (284):	"/dev/input/event6"
	Evdev Axis Inversion (293):	0, 0
	Evdev Axis Calibration (294):	<no items>
	Evdev Axes Swap (295):	0
	Axis Labels (296):	"Abs MT Position X" (291), "Abs MT Position Y" (292), "None" (0), "None" (0)
	Button Labels (297):	"Button Unknown" (288), "Button Unknown" (288), "Button Unknown" (288), "Button Wheel Up" (141), "Button Wheel Down" (142)
	Evdev Scrolling Distance (298):	0, 0, 0
	Evdev Middle Button Emulation (299):	1
	Evdev Middle Button Timeout (300):	50
	Evdev Middle Button Button (301):	2
	Evdev Third Button Emulation (302):	1
	Evdev Third Button Emulation Timeout (303):	750
	Evdev Third Button Emulation Button (304):	3
	Evdev Third Button Emulation Threshold (305):	30
	Evdev Wheel Emulation (306):	0
	Evdev Wheel Emulation Axes (307):	0, 0, 4, 5
	Evdev Wheel Emulation Inertia (308):	10
	Evdev Wheel Emulation Timeout (309):	200
	Evdev Wheel Emulation Button (310):	4
	Evdev Drag Lock Buttons (311):	0

Dernière modification par belzebuteu (27-08-2020 06:35:43)

Hors ligne

Pied de page des forums

Propulsé par FluxBB 1.5.11