Raspberry clavier

Fermé
STILTHER42 - Modifié par THE_TNTCRAFTER le 7/05/2015 à 18:23
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 - 11 mai 2015 à 21:30
Bonjour, je possède une carte raspberry pi B+ et j'aimerai savoir si il serai possible de faire un programme incluant des données provenant d'un clavier azerty soit en le branchant en usb soit en le reliant au GPIO, faut-il installer des bibliothèque et comment faut-il procéder pour utiliser les touches du clavier?
j'ai trouver se module https://python-evdev.readthedocs.io/en/latest/ mais je ne n'arrive pas a l'utiliser je l'ai bien installer est ce que quelqu'un pourrai me faire un exemple de boucle if avec la biblio a importer,
import "tel biblio"
if("toucheexemple appuyer"):
GPIO.output(40, True)
...
merci d'avance



24 réponses

RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
8 mai 2015 à 11:47
peux-tu donner plus de précisions de l'application du principe, en particulier, essaie-tu simplement de changer le statut des broches GPIO par l'intermédiaire d'un clavier USB comme ton example semble l'impliquer?
1
Bonjour deja merci de votre réponse, alors j'aimerai me servir des touches du clavier comme des interrupteur, pour avoir une cinquantaine de bouton poussoir mais brancher en usb, cela changera la valeur prise pas une ou des gpio grace a une boucle if ou autre.
Merci d'avance désolé pour le temps d'attente entre les réponses
1
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
Modifié par RogueM le 10/05/2015 à 01:03
Il te faut probablement une ou plusieurs dépendences. Vois ceci:

https://learn.pimoroni.com/tutorial/robots/controlling-your-robot-wireless-keyboard

1) en particulier:

sudo apt-get install libusb-dev git

2) puis il faut cloner le repo github:

git clone https://github.com/walac/pyusb
cd pyusb
sudo python setup.py install

3) ensuite il faut identifier le clavier avec:

sudo lsusb

c'est plus facile si tu limite au max le nombre de périphériques USB.

4) une fois cela fait tu peux utiliser le fichier HIDtest.py que j'ai chargé sur:

https://github.com/RogueM/rogue-hacks

remplace le VENDOR-ID et PRODUCT-ID par ceux de ton clavier

5) ensuite vois le fichier HIDgpio.py sur mon repo

... c'est un exemple basique qui change la valeur de la pin 17 lorsque les touches clavier <86-87> sont reçues. Il faut bien sûr que tu change aussi le VENDOR-ID et PRODUCT-ID par ceux de ton clavier, plus la broche que tu veux controller, plus les codes touches que tu veux utiliser.

Ça marche très bien, je ferai des exemples plus complexes dans les jours prochains. Amuse toi bien!
1
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
9 mai 2015 à 12:16
Cette application m'interesse pour mes propres besoins, je vais y regarder de près et essayer de faire une liste compréhensive de la procédure mais si tu veux essayer de démarrer tout seul pour gagner du temps, voilà une librairie qui devrait faire l'affaire:

https://github.com/walac/pyusb

... on se tiens au courant!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
9 mai 2015 à 12:19
Merci je vais aussi regarder ça, si vous trouver quelque chose tenez moi au courant aussi, sa fait quelque semaine que je travail la dessus, deja j'ai vu que l'on peu choisir si la touche est relâché appuyé ou maintenue
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
9 mai 2015 à 20:48
je n'arrive pas a installer la librairie
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 08:51
Merci je regarderai tout sa dans la journée si vous faites des exemples plus complexes j'aimerai bien en avoir si possible.
Bonne journée
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 11:14
Le programme HIDgpio.py fonctionne sauf que la touche 85 ou 86 correspond a quoi ?
Une fois lancer je ne pouvais plus utilisé ma souris et mon clavier.
Je continue les recherches
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 11:20
Le test aussi fonctionne mais sa bloque les perif usb
C'est bien la première ligne a prendre pour les ID ?

Voir image


0
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
10 mai 2015 à 13:18
Oui, bien sûr, il vous faut un périphérique USB dédier au contrôle des GPIO, séparé de votre clavier d'entrée!

Dans mon cas je suis en ssh et j'utilise un 'keypad' numérique, par exemple.

Pour les valeurs des touches, c'est celle qui apparaissent à l'écran avec HIDtest.py... il faut choisir celles qui vous convient et changer les variables KEY_ en conséquence.
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 13:22
D'accord merci je vais passer en ssh avec putty, je comprend par contre apres il me faudra juste une boucle if mais déjà je vais regarder sa de près
Merci
0
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
10 mai 2015 à 13:29
aussinon, j'ai charger un exemple plus complexe de HIDgpio, qui préconfure 8 GPIO pour contrôle avec 2 touches.

... par exemple en pressant simultanément le chiffre '1' et la touche '+' de mon pavé numérique je peux mettre GPIO4 en HIGH (valeur 1). En pressant '1' et '-' je change GPIO4 en LOW (valeur 0).

Les autres broches GPIO font de même, et la touche '0' assigne une valueur de 0 sur toutes les 8 broches utilisées par le programme.

Finalement la touche 'Del' permet de sortir du programme (solution préférée à CTRL+C dans mon cas)

Encore une fois il FAUT changer toutes les valeurs broches et touches pour VOTRE application, mes exemples sont des démonstrations de principe!

... si vous préférez la solution de touche séparée pour changer la valeur plutôt q'une combinaison de 2, alors il faut modifier/étendre la version précédente, que j'ai laissé sur mon GitHub sous le nom HIDbasic.py

Bon courage!
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 13:39
Moi pour le moment il me faudra simplement la pression d'une seule tout mais répété pour différentes touche je pense au moins toute les lettre mais je pense qu' avec votre exemple j'ai juste a repeter avec quelque chose de différent au niveau des gpio
0
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
Modifié par RogueM le 10/05/2015 à 15:03
attention, il n'est pas nécessaire d'utiliser ssh, du moment que le clavier servant de capture (identifier par le VENDOR_ID et le PRODUCT_ID) ne sert qu'à cela!

personellement je pense que votre solution d'utiliser un clavier azerty avec les lettres est horriblement compliqué dans la pratique, sans compter l'espace requis.

L'avantage des chiffres est qu'ils ont un sens intuitifs en relations avec les pins GPIO.

Par exemple, en passant en mode BOARD, vous pourriez créer une logique de programmation qui passe 0<>1 (et vice et versa) lorsque vous maintenez 2 touches correspondantes à la position physique de la broche sur le connecteur, en omettant les points de voltage et de masse, de préférence.

Mais que cela ne vous arrête pas, vous pouvez toujours démarrer avec un mapping de lettres uniques. Je ferai un exemple simple qui ne nécessite qu'une touche par broche en qui la passe dans l'état alternatif si cela vous interesse?
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 15:24
Oui cela m'intéresse mais pour mon utilisation il faut que j utilise les touche lettre, chaque lettre correspond a quelque chose et parfois plusieur gpio avec des time.sleep entre eux
0
RogueM Messages postés 7 Date d'inscription vendredi 8 mai 2015 Statut Membre Dernière intervention 10 mai 2015 2
10 mai 2015 à 15:45
ah, OK, je vois. Pas de probs.
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 15:51
Merci de votre aide sa fait longtemps que je cherchais
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 17:09
Donc si tout est bien initialisé cela devrai fonctionner, j'essaierai plus tard la j ai quelque chose a faire

0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
10 mai 2015 à 20:12
Les valeurs ont t elle un rapport avec le code ascii ?
0
STILTHER42 Messages postés 67 Date d'inscription dimanche 25 janvier 2015 Statut Membre Dernière intervention 9 juillet 2017 1
Modifié par STILTHER42 le 10/05/2015 à 20:49
voici un début de programme mais non testé est ce que cela pourrai fonctionné ? je n'ai pas tout mis, comme par exemple les leds pour reduire la taille et il me manque les valeurs correspondantes au lettre (valeurs x y et z arbitraire pour le moment)

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
import usb.core
import usb.util

#ID CLAVIER
VENDOR_ID = 0x0424
PRODUCT_ID = 0x9514

GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()

#DEFINITION DES VALEURS DE DEPALCEMENT MOTEURS
#DROITE/GAUCHE
X=2
#HAUT/BAS
Y=1.5
#DIAGONALE
Z=3

#ASSOCIATION PIN/NOM
HAUT = 40
BAS = 38
DROITE = 37
GAUCHE = 35
APP = 36
LEV = 33
VITESSE = 31 #LENT > True
DERNIERELAI = 29 #LIBRE
LEDHD = 13
LEDHG = 16
LEDBD = 15
LEDBG = 18
TEST = 7
LEDTEST = 12
LEDMARCHE = 22
STOP = 32
LEDSTOP = 11
FDCH = 19
FDCB = 21
FDCD = 23
FCDG = 24

#ASSOCIATION LETTRE/NUMEROCLAVIER
KEY_A =
KEY_B =
KEY_C =
KEY_D =
KEY_E =
KEY_F =
KEY_G =
KEY_H =
KEY_I =
KEY_J =
KEY_K =
KEY_L =
KEY_M =
KEY_N =
KEY_O =
KEY_P =
KEY_Q =
KEY_R =
KEY_S =
KEY_T =
KEY_U =
KEY_V =
KEY_W =
KEY_X =
KEY_Y =
KEY_Z =

#ENTREES/SORTIES
GPIO.setup(HAUT,GPIO.OUT)
GPIO.setup(BAS,GPIO.OUT)
GPIO.setup(DROITE,GPIO.OUT)
GPIO.setup(GAUCHE,GPIO.OUT)
GPIO.setup(APP,GPIO.OUT)
GPIO.setup(LEV,GPIO.OUT)
GPIO.setup(VITESSE,GPIO.OUT)
GPIO.setup(DERNIERELAI,GPIO.OUT)
GPIO.setup(LEDHD,GPIO.OUT)
GPIO.setup(LEDHG,GPIO.OUT)
GPIO.setup(LEDBD,GPIO.OUT)
GPIO.setup(LEDBG,GPIO.OUT)
GPIO.setup(LEDMARCHE,GPIO.OUT)
GPIO.setup(CMD,GPIO.IN)
GPIO.setup(LEDTEST,GPIO.OUT)
GPIO.setup(STOP,GPIO.IN)
GPIO.setup(LEDSTOP,GPIO.OUT)
GPIO.setup(FDCB,GPIO.OUT)
GPIO.setup(FCDH,GPIO.OUT)
GPIO.setup(FDCD,GPIO.OUT)
GPIO.setup(FCDG,GPIO.OUT)

#INITIALISATION USB
USB_IF = 0
USB_TIMEOUT = 5

dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
endpoint = dev[0][(0,0)][0]

if dev.is_kernel_driver_active(USB_IF) is True:
dev.detach_kernel_driver(USB_IF)
usb.util.claim_interface(dev, USB_IF)

while True:
control = None

#LED STOP
if (GPIO.input(STOP) == True):
GPIO.output(LEDSTOP, True)

elif (GPIO.output(HAUT) == False) and (GPIO.output(BAS) == False) and (GPIO.output(DROITE) == False) and (GPIO.output(GAUCHE) == False):
GPIO.output(LEDSTOP, True)



#MOUVEMENT MOTEUR POUR LETTRE
#A
try:
control = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, USB_TIMEOUT)

if KEY_A in control:
GPIO.output(RAPIDE, True)
GPIO.output(LENT, False)
GPIO.output(HAUT, True)
GPIO.output(DROITE, True)
time.sleep(Z)
GPIO.output(HAUT, False)
GPIO.output(BAS, True)
GPIO.output(DROITE, True)
time.sleep(Z)
GPIO.output(HAUT, True)
GPIO.output(DROITE, False)
GPIO.output(GAUCHE, True)
time.sleep(Z/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, False)
GPIO.output(GAUCHE, True)
time.sleep(X/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
GPIO.output(GAUCHE, False)
time.sleep(X/2)
GPIO.output(BAS, True)
GPIO.output(DROITE, True)
GPIO.output(GAUCHE, False)
time.sleep(Z/2)
GPIO.output(DROITE, False)

#B

#C

#D

#E
if KEY_E in control:
GPIO.output(RAPIDE, True)
GPIO.output(LENT, False)
GPIO.output(DROITE, True)
time.sleep(X)
GPIO.output(DROITE, False)
GPIO.output(GAUCHE, True)
time.sleep(X)
GPIO.output(GAUCHE, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
time.sleep(X/1.5)
GPIO.output(DROITE, False)
GPIO.output(GAUCHE, True)
time.sleep(X/1.5)
GPIO.output(GAUCHE, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
time.sleep(X)
GPIO.output(DROITE, False)

#F
if KEY_F in control:
GPIO.output(RAPIDE, True)
GPIO.output(LENT, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
time.sleep(X/1.5)
GPIO.output(DROITE, False)
GPIO.output(GAUCHE, True)
time.sleep(X/1.5)
GPIO.output(GAUCHE, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
time.sleep(X)
GPIO.output(DROITE, False)

#G

#H
if KEY_H in control:
GPIO.output(RAPIDE, True)
GPIO.output(LENT, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)
GPIO.output(DROITE, True)
time.sleep(X)
GPIO.output(DROITE, False)
GPIO.output(BAS, True)
time.sleep(Y/2)
GPIO.output(BAS, False)
GPIO.output(HAUT, True)
time.sleep(Y)
GPIO.output(HAUT, False)
GPIO.output(BAS, True)
time.sleep(Y/2)
GPIO.output(BAS, False)
GPIO.output(GAUCHE, True)
time.sleep(X)
GPIO.output(GAUCHE, False)
GPIO.output(HAUT, True)
time.sleep(Y/2)
GPIO.output(HAUT, False)

gpio.cleanup()
0