Modifications

Sauter à la navigation Sauter à la recherche
11 565 octets ajoutés ,  28 septembre 2015 à 07:22
Ligne 436 : Ligne 436 :  
[[Fichier:hat-sense-banner-05.jpg]]
 
[[Fichier:hat-sense-banner-05.jpg]]
   −
Le Sense HAT dispose également de senseurs qui peuvent détecter le mouvement. Il est équipé d'une centrale de mesure intertielle (dite IMU pou ''Inertial Measurement Unit'') sous forme d'une puce qui inclus:
+
Le Sense HAT dispose également de senseurs qui peuvent détecter le mouvement. Il est équipé d'une centrale de mesure inertielle (dite IMU pou ''Inertial Measurement Unit'') sous forme d'une puce qui inclus:
 
* Un gyroscope (pour détecter dans quelle direction la carte est orientée)
 
* Un gyroscope (pour détecter dans quelle direction la carte est orientée)
 
* Un accéléromètre (pour détecter le mouvement)
 
* Un accéléromètre (pour détecter le mouvement)
 
* Un magnétomètre (pour détecter les champs magnétiques)
 
* Un magnétomètre (pour détecter les champs magnétiques)
   −
{{traduction}}
+
Avant de commencer vos expériences avec les senseurs de mouvement, il est important de comprendre 3 termes clés couverts par se guide et dans cette [https://www.youtube.com/watch?v=pQ24NtnaLl8 vidéo] (''en anglais'').
   −
Before you start experimenting with motion sensing, it's important to understand three key terms covered in the guide and in [https://www.youtube.com/watch?v=pQ24NtnaLl8 this video].
+
Les 3 axes utilisés pour décrire le mouvement sont:
 
  −
The three axes uses to describe motion are:
   
* Elévation, dit "Pitch" en anglais (comme quand l'avion décolle)
 
* Elévation, dit "Pitch" en anglais (comme quand l'avion décolle)
 
* Roulis/Roulement, dit "Roll" en anglais (comme un avion qui faire la rouleau de la victoire, ou une voiture qui fait un tonneau)
 
* Roulis/Roulement, dit "Roll" en anglais (comme un avion qui faire la rouleau de la victoire, ou une voiture qui fait un tonneau)
* Embardée, dit "Yaw" en anglais  (imaginez un avion qui dévie de sa route comme le ferait une voiture)
+
* Lacet/Embardée, dit "Yaw" en anglais  (imaginez un avion qui dévie de sa route comme le ferait une voiture, où une voiture qui prend un virage "en lacet")
    
Etant donné que l'interface de programmation du Sense Hat utilise ces mêmes mots clés en anglais pour vous permettre d'accéder aux valeurs, nous allons préserver les termes "Pitch"n "Roll", "Yaw".
 
Etant donné que l'interface de programmation du Sense Hat utilise ces mêmes mots clés en anglais pour vous permettre d'accéder aux valeurs, nous allons préserver les termes "Pitch"n "Roll", "Yaw".
 
    
 
    
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Debuter-29.png|640px]]
+
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Debuter-29.png|800px]]
    
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Debuter-30.jpg]]
 
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Debuter-30.jpg]]
   −
{{traduction}}
+
Vous pouvez obtenir l'orientation du Sense Hat en appelant la méthode {{fname|sense.get_orientation()}}:
 +
 
 +
<nowiki>pitch, roll, yaw = sense.get_orientation().values()</nowiki>
 +
 
 +
Cela donne les trois valeurs d'orientation (mesuré en degrés) et stocke ces valeurs dans trois variables respectivement nommées {{fname|pitch}}, {{fname|roll}} et {{fname|yaw}}. La partie {{fname|.values()}} de l'appel obtient les 3 valeurs ce qui permet de les stocker séparément.
 +
 
 +
'''1.''' Vous pouvez découvrir et explorer ces valeurs à l'aide du programme suivant:
 +
 
 +
<nowiki>from sense_hat import SenseHat
 +
 
 +
sense = SenseHat()
 +
 
 +
while True:
 +
    pitch, roll, yaw = sense.get_orientation().values()
 +
    print("Elevation/pitch=%s, Roulis/roll=%s, Embardee/yaw=%s" % (pitch,yaw,roll))</nowiki>
 +
 
 +
'''2.''' Cliquer sur "File -- Save As" (''Fichier -- Sauver comme'') et donner un nom au programme - exemple {{fname|orientation.py}}. Pressez '''F5''' pour exécuter le programme.
 +
 
 +
{{tmbox|text=Note: Lorsque l'on utilise des senseurs de mouvement, il est important de les interroger souvent à l'aide d'une boucle très courte. Par exemple, une pause de 0.5 seconde dans votre boucle provoquera un affichage un affichage bizarre. C'est parce que le code de la bibliothèque à besoin de faire beaucoup de mesure de façon à parfaitement combiner les données provenant du gyroscope, accéléromètre et du magnétomètre.}}
 +
 
 +
'''3.''' Une autre façon de détecter l'orientation est d'utiliser la méthode {{fname|sense.get_accelerometer_raw()}} qui vous indique la quantité de force-g agissant sur les 3 axes. Si n'importe quel axe indique une valeur d'environ 1g alors cet axe pointe vers le bas.
 +
 
 +
Dans cette exemple, la 'accélération gravitationnelle (celle qui nous tient au sol) est quantifié pour chaque axe  (x, y et z) puis arrondi au nombre entier le plus proche:
 +
 
 +
<nowiki>from sense_hat import SenseHat
 +
 
 +
sense = SenseHat()
 +
 
 +
while True: # boucle inifinie
 +
    x, y, z = sense.get_accelerometer_raw().values()
 +
 
 +
    x=round(x, 0)
 +
    y=round(y, 0)
 +
    z=round(z, 0)
 +
 
 +
    print("x=%s, y=%s, z=%s" % (x, y, z))</nowiki>
 +
 
 +
'''4.''' Cliquer sur "File -- Save As" (''Fichier -- Sauver comme'') et donner un nom au programme - par exemple {{fname|acceleration.py}}. Ensuite, presser F5 pour exécuter le programme.
 +
 
 +
En tournant l'écran, vous devriez vous les valeurs de x et y osciller entre -1 et 1. Si vous placez le Pi à plat (ou retourner votre Pi), l'axe Z afficher la valeur 1 puis -1.
 +
 
 +
'''5.''' Si vous connaissez l'orientation de votre Pi... alors vous pouvez modifier l'orientation d'affichage de la matrice de sorte que le texte soit toujours lisible. C'est exactement comme cela que votre smartphone détecte le changement d'orientation pour faire une rotation de l'écran.<br />Pour commencer, vous afficher quelque-chose sur la matrice puis vous vérifiez constalement l'orientation de la carte. Vous utiliser cette information d'orientation pour faire une mise-à-jour de l'orientation de l'afficheur.
 +
 
 +
<nowiki>from sense_hat import SenseHat
 +
 
 +
sense = SenseHat()
 +
 
 +
sense.show_letter("J")
 +
 
 +
while True:
 +
    x, y, z = sense.get_accelerometer_raw().values()
 +
 
 +
    x = round(x, 0)
 +
    y = round(y, 0)
 +
 
 +
    if x == -1:
 +
        sense.set_rotation(180)
 +
    elif y == 1:
 +
        sense.set_rotation(90)
 +
    elif y == -1:
 +
        sense.set_rotation(270)
 +
    else:
 +
        sense.set_rotation(0)</nowiki>
 +
 
 +
 
 +
 
 +
'''6.''' Cliquer sur "File -- Save As" (''Fichier -- Sauver comme'') et donner un nom au programme - {{fname|rotating_letter.py}} par exemple (signifiant ''lettre tournante''). Pressez ensuite '''F5''' pour exécuter le programme.
 +
 
 +
Dans ce programme, vous utilisez une structure {{fname|if, elif, else}} pour détecter l'orientation du Raspberry-Pi. Le {{fname|if}} et {{fname|elif}} teste les trois orientation ET si l'orientation ne correspond à aucun des orientations testées par le programme ALORS le programme considère de l'orientation est ''correcte''. En utilisant l'instruction {{fname|else}} nous couvrons également tous les autres cas, comme lorsque la carte est inclinée de 45 degrées ou reposée sur un présentoir incliné.
 +
 
 +
'''7.''' Si vous ne faites que tourner la carte, vous remarquerez par l'expérience qu'il n'y a que '''1g''' dans chaque direction; Si nous la secouons, le senseur détectera des accélérations '''supérieure à 1g'''. Nous pourrions détecter ce '''mouvement rapide''' et y répondre. Nous allons introduire la fonction {{fname|abs()}} pour les besoins du programme suivant. {{fname|abs()}} n'est pas spécifique à la bibliothèque Sense_Hat et fait partie des éléments standard de Python. {{fname|abs()}}} nous donne la grandeur d'une valeur en ignorant volontairement si cette valeur est positive ou négative. Donc {{fname|abs(3.1415)}} donne 3.1514 et {{fname|abs(-3.1415)}} donne également 3.1514. La fonction {{fname|abs()}} est très utile puisque nous ne voulons pas savoir dans quelle direction le senseur est secoué... nous voulons juste savoir qu'il est secoué.
 +
 
 +
<nowiki>from sense_hat import SenseHat
 +
 
 +
sense = SenseHat()
 +
 
 +
while True:
 +
    x, y, z = sense.get_accelerometer_raw().values()
 +
 
 +
    x = abs(x)
 +
    y = abs(y)
 +
    z = abs(z)
 +
 
 +
    if x > 1 or y > 1 or z > 1:
 +
        sense.show_letter("!", text_colour=[255, 0, 0])
 +
    else:
 +
        sense.clear()</nowiki>
 +
 
 +
 
 +
 
 +
'''8.''' Cliquer sur "File -- Save As" (''fichier -- Sauver sous'') et donner lui un nom - par exemple {{fname|shake.py}} (en anglais "shake" signifie ''secouer''). Presser '''F5''' pour démarrer le programme.
 +
 
 +
Si le programme semble trop sensible, vous pouvez remplacer la valeur 1 par une valeur supérieure.
 +
 
 +
=== Idées ===
 +
* Vous pourriez écrire un programme qui affiche une une flèche Y(ou autre symbole) sur l'écran; le symbol peut etre utilisé pour indiquer où se trouve le sol. Cela permettrait à des astronaute (évoluant en basse gravité) de savoir où se trouve la terre.
 +
* Vous pourriez améliorer le programme "Dé" (voir les activités précédentes) pour ''jeter le Dé'' en secouant le dé.
 +
* Vous pourriez utiliser l'accéléromètre pour détecter les petits mouvements; Cela pourrait agir comme contrôleur de jeu, système d'alarme, détecteur de tremblement de terre.
    
== Tout mettre ensemble ==
 
== Tout mettre ensemble ==
 
[[Fichier:hat-sense-banner-06.jpg]]
 
[[Fichier:hat-sense-banner-06.jpg]]
 +
 +
Maintenant que vous avez exploré les possibilités du Sense Hat, vous pourriez les combiner pour créer des projets. Voici un exemple de jeu testant la réaction humaine, jeu qui pourrait être utilisé par des astronautes pour tester leurs réflexes.
 +
 +
Le jeu affiche une flèche sur la matrice LED en choisissant une orientation au hasard. Le joueur doit tourner la carte pour garder la flèche vers le haut. S'il le fait dans le temps imparti, la flèche devient verte et le score augmente; dans le cas contraire, la flèche devient rouge et le jeu est terminé. Le jeu continue d'afficher des flèches dans des directions aléatoires jusqu'au moment où le joueur à perdu, et le jeu va de plus en plus vite.
 +
 +
Cette idée combine:
 +
* L'affichage de message et images sur la matrice LED.
 +
* Sélection et détection d'une orientation
 +
* L'utilisation de variables, nombre aléatoire, itération et sélection
 +
 +
Il s'agit d'un programme plus compliqué que les exemples précédents, il est donc préférable d'identifier les étapes clés en les décrivant dans un  '''pseudocode'''.
 +
 +
<nowiki>importer les bibliothèques nécessaires (sense_hat, time, random)
 +
    Créer l'objet ''sense''
 +
 +
    Definir les couleurs nécessaire
 +
    Créer 3 flèches différentes: une blanche (''white'' en anglais), verte (''green'' en anglais) et rouge (''red'').
 +
    Initialiser la variable "pause" à 3 (Le temps initial entre chaque round)
 +
    Initialiser les variables "score" et "angle" à 0
 +
    Créer une variable "play" (signifiant "''jeu''") initialisée à True (Elle sera utilisé pour arrêter le jeu)
 +
 +
    Commencer la boucle while pour continuer le jeux tant que "play" est à True.
 +
        while play == True
 +
    Choisir un nouvel angle au hasard en utilisant la méthode random.choice()
 +
    Afficher une flèche blanche et attendre le temps indiqué dans pause
 +
    Vérifier si l'orientation correspond à la flèche
 +
    ---Si c'est le cas Alors ajouter un point et passer la flèche en vert.
 +
    ---Sinon fixer "play" à False (pour arrêter le jeu) et afficher une flèche rouge
 +
    Diminuer un peu le temps de pause
 +
    Faire une pause avant la prochaine flèche.
 +
 +
    Lorsque la boucle while est terminée, afficher un message avec le score</nowiki>
 +
 +
Si vous transformez ce pseudo code en Python, vous obtiendrez un code similaire à celui-ci:
 +
 +
<nowiki>from sense_hat import SenseHat
 +
import time
 +
import random
 +
 +
sense = SenseHat()
 +
 +
# Initialiser les couleur
 +
 +
w = [150, 150, 150] # w = white (blanc)
 +
g = [0, 255, 0]    # g = green (vert)
 +
r = [255, 0, 0]    # r = red  (rouge)
 +
e = [0, 0, 0]      # e = empty (vide... donc noir)
 +
 +
# créer les images de flèche avec 3 couleurs
 +
# différentes
 +
 +
# arrow = flèche
 +
 +
arrow = [
 +
e,e,e,w,w,e,e,e,
 +
e,e,w,w,w,w,e,e,
 +
e,w,e,w,w,e,w,e,
 +
w,e,e,w,w,e,e,w,
 +
e,e,e,w,w,e,e,e,
 +
e,e,e,w,w,e,e,e,
 +
e,e,e,w,w,e,e,e,
 +
e,e,e,w,w,e,e,e
 +
]
 +
 +
# arrow_red = flèche_rouge
 +
 +
arrow_red = [
 +
e,e,e,r,r,e,e,e,
 +
e,e,r,r,r,r,e,e,
 +
e,r,e,r,r,e,r,e,
 +
r,e,e,r,r,e,e,r,
 +
e,e,e,r,r,e,e,e,
 +
e,e,e,r,r,e,e,e,
 +
e,e,e,r,r,e,e,e,
 +
e,e,e,r,r,e,e,e
 +
]
 +
 +
# arrow_green = fleche_verte
 +
 +
arrow_green = [
 +
e,e,e,g,g,e,e,e,
 +
e,e,g,g,g,g,e,e,
 +
e,g,e,g,g,e,g,e,
 +
g,e,e,g,g,e,e,g,
 +
e,e,e,g,g,e,e,e,
 +
e,e,e,g,g,e,e,e,
 +
e,e,e,g,g,e,e,e,
 +
e,e,e,g,g,e,e,e
 +
]
 +
 +
pause = 3
 +
score = 0
 +
angle = 0
 +
play = True
 +
 +
sense.show_message("Garder la fleche pointee en haut", scroll_speed=0.05, text_colour=[100,100,100])
 +
 +
while play:
 +
    last_angle = angle # Mémoriser le dernier angle
 +
    while angle == last_angle:
 +
        angle = random.choice([0, 90, 180, 270])
 +
    sense.set_rotation(angle)
 +
    sense.set_pixels(arrow)
 +
    time.sleep(pause)
 +
 +
    x, y, z = sense.get_accelerometer_raw().values()
 +
    x = round(x, 0)
 +
    y = round(y, 0)
 +
 +
    print(angle)
 +
    print(x)
 +
    print(y)
 +
 +
    if x == -1 and angle == 180:
 +
        sense.set_pixels(arrow_green)
 +
        score += 1
 +
    elif x == 1 and angle == 0:
 +
      sense.set_pixels(arrow_green)
 +
      score += 1
 +
    elif y == -1 and angle == 90:
 +
      sense.set_pixels(arrow_green)
 +
      score += 1
 +
    elif y == 1 and angle == 270:
 +
      sense.set_pixels(arrow_green)
 +
      score += 1
 +
    else:
 +
      sense.set_pixels(arrow_red)
 +
      play = False
 +
 +
    pause = pause * 0.95
 +
    time.sleep(0.5)
 +
 +
msg = "Votre score etait de %s" % score
 +
sense.show_message(msg, scroll_speed=0.05, text_colour=[100, 100, 100])</nowiki>
 +
 +
'''1.''' cliquer sur "File -- Save As" (''Fichier -- Sauver sous'') et donner un nom à votre programme - par exemple {{fname|reaction_game.py}} ("game" signifie ''jeu'' et "reaction" ''réaction''). Ensuite, pressez sur '''F5''' pour exécuter le programme.
 +
 +
Voici une vidéo montrant comment fonctionne le programme:
 +
 +
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Debuter-40.jpg|link=https://www.youtube.com/watch?v=k1ZB8jORb74]]<small><br />Vous pouvez également [https://www.youtube.com/watch?v=k1ZB8jORb74 cliquer ici pour visionner la vidéo YouTube]
 +
 +
=== Idées ===
 +
Il y a beaucoup de potentiel de développement avec ce jeu:
 +
* Jouer sur l'orientation et le secouage.
 +
* Utiliser le senseur de température pour détecter l'haleine... une des actions demandée à l'utilisateur serait de souffler sur le détecteur d'humitidé.
 +
* Utiliser plus que les 4 directions du programme d'exemple; il pourrait être demandé au joueur de placer la carte à 45°C.
    
{{RASP-SENSE-HAT-ASTRO-PI-TRAILER}}
 
{{RASP-SENSE-HAT-ASTRO-PI-TRAILER}}
29 917

modifications

Menu de navigation