Différences entre versions de « RASP-SENSE-HAT-ASTRO-PI-Joystick »
(2 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{RASP-SENSE-HAT-ASTRO-PI-NAV}} | {{RASP-SENSE-HAT-ASTRO-PI-NAV}} | ||
− | |||
− | |||
== Le joystick == | == Le joystick == | ||
Ligne 59 : | Ligne 57 : | ||
Voyons comment un joystick fonctionne, nous pouvons utiliser la matrice LED pour nous aider à le comprendre. | Voyons comment un joystick fonctionne, nous pouvons utiliser la matrice LED pour nous aider à le comprendre. | ||
− | Nous allons utiliser un point blanc (un pixel) et utiliser le joystick pour le déplacer sur la matrice 8x8. Pour réaliser ce tâche, nous pouvons utiliser un événement qui détecte la pression d'une touche. Par exemple, si la touche BAS (''DOWN'' en anglais) est pressée, nous allons déplacer le point allumé vers le bas. | + | Nous allons utiliser un point blanc (un pixel) et utiliser le joystick pour le déplacer sur la matrice 8x8. Pour réaliser ce tâche, nous pouvons utiliser un événement qui détecte la pression d'une touche. Par exemple, si la touche BAS (''DOWN'' en anglais) est pressée, nous allons déplacer le point allumé vers le bas.<br />A votre avis, comment allons nous gérer cela? |
− | |||
− | A votre avis, comment allons nous gérer cela? | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | Lorsqu'un événement touche enfoncée est détecté? | ||
+ | * Eteindre la LED située à la position 'x' et 'y' actuelle | ||
+ | * Si '''DOWN''' (''bas'') est détecté alors ajouter 1 à 'y' | ||
+ | * Si '''UP''' (''haut'') est détecté alors soustraire 1 à 'y' | ||
+ | * Si '''RIGHT''' (''droite'') est détecté alors ajouter 1 à 'x' | ||
+ | * Si '''LEFT''' (''gauche'') est détecté alors soustraire 1 à 'x' | ||
+ | * Allumer la LED sur la nouvelle coordonnée 'x' et 'y' que nous venons de calculer | ||
'''1.''' Commençons par ajouter le code prennant en charge la touche vers le bas ('''DOWN'''). Effacez la ligne {{fname|print(event)}} que nous avons utilisé dans la section précédente et insérez le code ci-dessous au même niveau d'indentation: | '''1.''' Commençons par ajouter le code prennant en charge la touche vers le bas ('''DOWN'''). Effacez la ligne {{fname|print(event)}} que nous avons utilisé dans la section précédente et insérez le code ci-dessous au même niveau d'indentation: | ||
Ligne 88 : | Ligne 83 : | ||
Signifiant que la valeur pour la position Y doit être comprise entre 0 et 7. | Signifiant que la valeur pour la position Y doit être comprise entre 0 et 7. | ||
− | + | '''3.''' Notre valeur {{fname|y}} peut uniquement avoir une valeur entre 0 et 7, sinon nous dépassons les limites de la matrice (hors de l'espace d'affichage)! C'est pour cette raison que l'erreur survient; La HAT Sense ne ''comprend'' pas ces valeurs hors de cette gamme. Notre code se contente d'ajouter la valeur 1 à {{fname|y}} chaque fois que la touche vers le bas (''DOWN'') est pressée, nous devons donc empêcher la valeur de {{fname|y}} d'aller au-delà de 7. | |
− | |||
− | '''3.''' | ||
− | + | Nous pouvons facilement atteindre ce but en modifiant la syntaxe {{fname|and y < 7}} (signifiant ''et {{fname|y}} plus petit que 7'') dans le test des touches de direction: | |
<nowiki>if event.key == K_DOWN and y < 7: | <nowiki>if event.key == K_DOWN and y < 7: | ||
y = y + 1</nowiki> | y = y + 1</nowiki> | ||
− | '''4.''' | + | '''4.''' Sauvez et exécutez votre programme une nouvelle fois; Cette fois, le code ne ne devrait pas laisser le point sortie de l'écran. |
− | '''5.''' | + | '''5.''' Maintenant que cela fonctionne pour pour une direction du joystick, nous allons faire de même avec les autres directions. A l'endroit où nous avons le code {{fname|1=if event.key == K_DOWN:}}, nous pouvons également utiliser: |
* {{fname|K_UP}} - Touche vers le haut | * {{fname|K_UP}} - Touche vers le haut | ||
* {{fname|K_DOWN}} - Touche vers le bas | * {{fname|K_DOWN}} - Touche vers le bas | ||
Ligne 106 : | Ligne 99 : | ||
* {{fname|K_RETURN}} - Touche "''retour clavier''" ou "''entrée''". | * {{fname|K_RETURN}} - Touche "''retour clavier''" ou "''entrée''". | ||
− | '''6.''' | + | '''6.''' Nous pouvons ajouter une section pour chaque direction à tester... et compléter notre code: |
<nowiki>import pygame | <nowiki>import pygame | ||
Ligne 128 : | Ligne 121 : | ||
for event in pygame.event.get(): | for event in pygame.event.get(): | ||
if event.type == KEYDOWN: | if event.type == KEYDOWN: | ||
− | sense.set_pixel(x, y, 0, 0, 0) # | + | sense.set_pixel(x, y, 0, 0, 0) # Noir 0,0,0 - signifiant éteint |
if event.key == K_DOWN and y < 7: | if event.key == K_DOWN and y < 7: | ||
Ligne 144 : | Ligne 137 : | ||
print("BYE")</nowiki> | print("BYE")</nowiki> | ||
− | '''7.''' | + | '''7.''' Lorsque vous exécutez votre code, vous devriez être capable de déplacer le pixel partout sur la matrice sans jamais en sortir. |
{{RASP-SENSE-HAT-ASTRO-PI-TRAILER}} | {{RASP-SENSE-HAT-ASTRO-PI-TRAILER}} |
Version actuelle datée du 20 octobre 2015 à 19:15
Le joystick
Le joystick du Sense Hat est mis en correspondance (ont dit "map" en anglais) avec les 4 touches de déplacement du curseur, le click du joystick presse la touche "retour clavier" (dite "Return" ou "Enter" en anglais). Le joystick du Hat Sense se comporte donc comme un clavier. Rappelez vous que la direction 'vers le bas' se trouve face au port HDMI.
Keyboard Mapping
"Keyboard Mapping" que nous traduirons par "mappage clavier" (correspondance clavier) est pris en charge par un pilote et transforme l'utilisation du joystick en simulation d'activation sur le clavier du PC.
L'utilisation d'un pilote et du "Keyboard Mapping" est plus que pratique, votre programme n'a pas besoin de savoir comment lire l'état du joystick... il a juste besoin de détecter les touches pressées sur le clavier (et cela, tous les programmes savent le faire).
1. Ouvrez Python 3 depuis une fenêtre terminal et utilisez la commande suivante avec sudo:
sudo idle3 &
2. Une fenêtre de commande Python va apparaître.
3. Sélectionnez l'option File > New Window (Fichier > Nouvelle fenêtre).
4. Et tapez le code suivant:
import pygame from pygame.locals import * from sense_hat import SenseHat pygame.init() pygame.display.set_mode((640, 480)) sense = SenseHat() sense.clear() running = True while running: for event in pygame.event.get(): print(event) if event.type == QUIT: running = False print("AU REVOIR")
5. Sélectionnez File > Save (pour "Fichier > Sauver") et choissisez un nom pour votre programme.
6. Sélectionnez ensuite Run > Run module (pour "Executer > Exécutez module").
Notez que nous utilisons le module Python pygame pour détecter les touches pressées.
7. Une fenêtre va apparaître. Utilisez la souris pour bouger cette fenêtre sur le côté de votre bureau de façon à pouvoir voir la fenêtre du Shell Python.
8. Gardez le nouvelle fenêtre sélectionnée et bougez la souris au dessus de celle-ci, pressez et relachez des touches sur le clavier et jouez avec le joystick du Sense Hat. Essayez de presser et maintenir une touche enfoncé pendant un moment puis la relâcher quelques secondes. Vous pouvez noter que deux événements ("EVENT en anglais) se passent durant ce temps: un événement lorsque la touche est enfoncée, et un autre événement lorsque la touche est relâchée. Dans ce programme vous allez uniquement utiliser l'événement KEY DOWN.
KEY DOWN signifie FLECHE BAS
9. Cliquez sur le x dans coin supérieur droit de la fenêtre Pygame (dans laquelle nous n'affichons rien). Vous devriez voir le message AU REVOIR apparâitre dans la fenêtre Shell Python Shell (mais la fenêtre vide ne se ferme pas).
Nous utilisons le fil d'événements de PyGame avec la syntaxe for event in pygame.event.get():. Les termes anglais d'application sont "Event Queue" (queue d'événement) et pour être précis, nous "consommons" (Consume en anglais) ces événements.
Cela boucle au travers de tous les événements provenant du clavier et de la souris.
Les événements sont affichés à l'aide de l'instruction print(event). Après l'affichage, nous faisons un test pour détecter l'événement QUIT. Si c'est le cas, nous modifions la valeur de la variable running à False. Une fois la variable running à False, la boucle while termine sont exécution et le programme se termine.
Le programme devrait afficher une ligne de texte dans le Shell Python lorsque nous déplaçons la souris, et pressez ou/ou relâcher une touche au clavier.
Détecter les mouvements du joystick
Voyons comment un joystick fonctionne, nous pouvons utiliser la matrice LED pour nous aider à le comprendre.
Nous allons utiliser un point blanc (un pixel) et utiliser le joystick pour le déplacer sur la matrice 8x8. Pour réaliser ce tâche, nous pouvons utiliser un événement qui détecte la pression d'une touche. Par exemple, si la touche BAS (DOWN en anglais) est pressée, nous allons déplacer le point allumé vers le bas.
A votre avis, comment allons nous gérer cela?
Lorsqu'un événement touche enfoncée est détecté?
- Eteindre la LED située à la position 'x' et 'y' actuelle
- Si DOWN (bas) est détecté alors ajouter 1 à 'y'
- Si UP (haut) est détecté alors soustraire 1 à 'y'
- Si RIGHT (droite) est détecté alors ajouter 1 à 'x'
- Si LEFT (gauche) est détecté alors soustraire 1 à 'x'
- Allumer la LED sur la nouvelle coordonnée 'x' et 'y' que nous venons de calculer
1. Commençons par ajouter le code prennant en charge la touche vers le bas (DOWN). Effacez la ligne print(event) que nous avons utilisé dans la section précédente et insérez le code ci-dessous au même niveau d'indentation:
if event.type == KEYDOWN: sense.set_pixel(x, y, 0, 0, 0) # Noir = 0,0,0 - ce qui éteind la LED if event.key == K_DOWN: y = y + 1 sense.set_pixel(x, y, 255, 255, 255)
2. Sauvez et exécutez le code. Vous devriez être capable de déplacer un pixel vers le bas en utilisant la touche DOWN (flèche vers le bas) ou le joystick. Si vous continuez, vous rencontrez éventuellement cette erreur:
ValueError: Y position must be between 0 and 7
Signifiant que la valeur pour la position Y doit être comprise entre 0 et 7.
3. Notre valeur y peut uniquement avoir une valeur entre 0 et 7, sinon nous dépassons les limites de la matrice (hors de l'espace d'affichage)! C'est pour cette raison que l'erreur survient; La HAT Sense ne comprend pas ces valeurs hors de cette gamme. Notre code se contente d'ajouter la valeur 1 à y chaque fois que la touche vers le bas (DOWN) est pressée, nous devons donc empêcher la valeur de y d'aller au-delà de 7.
Nous pouvons facilement atteindre ce but en modifiant la syntaxe and y < 7 (signifiant et y plus petit que 7) dans le test des touches de direction:
if event.key == K_DOWN and y < 7: y = y + 1
4. Sauvez et exécutez votre programme une nouvelle fois; Cette fois, le code ne ne devrait pas laisser le point sortie de l'écran.
5. Maintenant que cela fonctionne pour pour une direction du joystick, nous allons faire de même avec les autres directions. A l'endroit où nous avons le code if event.key == K_DOWN:, nous pouvons également utiliser:
- K_UP - Touche vers le haut
- K_DOWN - Touche vers le bas
- K_LEFT - Touche vers la gauche
- K_RIGHT - Touche vers la droite
- K_RETURN - Touche "retour clavier" ou "entrée".
6. Nous pouvons ajouter une section pour chaque direction à tester... et compléter notre code:
import pygame from pygame.locals import * from sense_hat import SenseHat pygame.init() pygame.display.set_mode((640, 480)) sense = SenseHat() sense.clear() running = True x = 0 y = 0 sense.set_pixel(x, y, 255, 255, 255) while running: for event in pygame.event.get(): if event.type == KEYDOWN: sense.set_pixel(x, y, 0, 0, 0) # Noir 0,0,0 - signifiant éteint if event.key == K_DOWN and y < 7: y = y + 1 elif event.key == K_UP and y > 0: y = y - 1 elif event.key == K_RIGHT and x < 7: x = x + 1 elif event.key == K_LEFT and x > 0: x = x - 1 sense.set_pixel(x, y, 255, 255, 255) if event.type == QUIT: running = False print("BYE")
7. Lorsque vous exécutez votre code, vous devriez être capable de déplacer le pixel partout sur la matrice sans jamais en sortir.
Source: Getting Started with Astro PI et Astro-Pi Guide proposé par Raspberry Pi Learning Resource (www.raspberrypi.org)
Licence Creative Commons - CC-BY-SA
The learning resource is provided for free by the Raspberry Pi Foundation under a Creative Commons licence.
Find more at raspberrypi.org/resources and github.com/raspberrypilearning.
Crédit de traduction: Toute référence, mention ou extrait de cette traduction doit également être explicitement accompagné du crédit de traduction suivant : « Traduction par MCHobby (shop.MCHobby.be) » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.