Raspberry clavier
STILTHER42
-
STILTHER42 Messages postés 87 Statut Membre -
STILTHER42 Messages postés 87 Statut Membre -
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
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
A voir également:
- Pyusb tutorial
- Télécharger clavier arabe - Télécharger - Divers Web & Internet
- & Sur clavier - Guide
- Clavier de l'ordinateur - Guide
- Clavier iphone chiffre et lettre - Guide
- Changer clavier qwerty en azerty - Guide
24 réponses
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?
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
Merci d'avance désolé pour le temps d'attente entre les réponses
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!
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!
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!
https://github.com/walac/pyusb
... on se tiens au courant!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
Bonne journée
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
Une fois lancer je ne pouvais plus utilisé ma souris et mon clavier.
Je continue les recherches
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.
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.
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
Merci
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!
... 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!
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
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?
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?
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
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()
#!/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()

