Différences entre versions de « RASP-SENSE-HAT-ASTRO-PI-Mouvement »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(14 versions intermédiaires par le même utilisateur non affichées)
Ligne 2 : Ligne 2 :
  
 
== Senseur de mouvement ==
 
== Senseur de mouvement ==
{{traduction}}
 
 
 
{{bloc-etroit|text=Le Sense HAT met en oeuvre de nombreux senseurs, l'un d'eux est un senseur de mouvement appelé IMU. L'IMU est capable de mesurer le type de mouvement qu'il subit.
 
{{bloc-etroit|text=Le Sense HAT met en oeuvre de nombreux senseurs, l'un d'eux est un senseur de mouvement appelé IMU. L'IMU est capable de mesurer le type de mouvement qu'il subit.
  
La source anglaise de cette traduction se trouve ici [https://www.raspberrypi.org/learning/astro-pi-guide/sensors/humidity.md https://www.raspberrypi.org/learning/astro-pi-guide/sensors/humidity.md]
+
La source anglaise de cette traduction se trouve ici [https://www.raspberrypi.org/learning/astro-pi-guide/sensors/movement.md https://www.raspberrypi.org/learning/astro-pi-guide/sensors/movement.md]
 
}}
 
}}
  
Ligne 18 : Ligne 16 :
 
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Mouvement.jpg]]
 
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Mouvement.jpg]]
  
Why is a movement sensor important, though? When you're up in space there is one question of absolute importance to which you must always know the answer: which way am I pointing?
+
Pourquoi un senseur de mouvement est-il si important?  
 +
 
 +
Quand vous êtes dans l'espace il y a une question d'importance absolue à laquelle vous devez {{underline|toujours}} être capable de répondre: dans quelle direction suis entrain de pointer?  
  
If you don't know your orientation you are in big trouble, so an IMU sensor like this one is used on all manned and unmanned spacecraft to track movements and maintain an understanding of orientation. Even the earliest spacecraft had them. Ask your grandparents if they remember the [http://en.wikipedia.org/wiki/Apollo_program Apollo missions] (''wikipedia, anglais'') that landed humans on the surface of the moon.
+
Si vous ne connaissez pas votre orientation alors vous avez un énorme problème. Par conséquent, une centrale inertielle (senseur IMU) est utilisée dans tous les engins spatiaux habités et non habités. Ce senseur permet savoir quelle est l'orientation et fait en sorte de maintenir cette information "correcte". Même un ancien engin spatial dispose d'un IMU. Demandez à vos grand-parents s'ils se souvennent des [http://en.wikipedia.org/wiki/Apollo_program missions Apollo] (''wikipedia, anglais'') qui ont emmené des humains sur la surface de la lune.
  
Above is a picture of the IMU sensor from the Apollo command module. You'll notice how big it is compared to the tiny black cube on the Astro Pi; that's the difference between 1975 and 2015 technology. Incidentally, the Astro Pi IMU is probably not as accurate as the Apollo one, however it is a million times cheaper!}}
+
La photo ci-dessus présente le senseur IMU de module de commande Apollo. Notez comme ce module est imposant comparé au petit cube noir qui équipe votre Sense-Hat; c'est la différence entre la technologie de 1975 et celle de 2015. Par ailleurs, l'IMU du Hat Sense n'est pas aussi précis que celui d'Appolo, mais il coûte aussi un million de fois moins cher!}}
  
 
== Comment l'orientation est elle représentée? ==
 
== Comment l'orientation est elle représentée? ==
We all know the Earth rotates around an axis that runs between the North and South Poles. All objects in space or otherwise have three axes around which they can rotate. If you know how much rotation has happened on each axis, then you know which way the object is pointing.
+
Nous savons que la terre tourne autour d'un axe qui va du pôle Nord vers le pôle Sud. Tous les objets (y compris dans l'espace) ont 3 axes autour desquels ils peuvent tourner. Si vous savez déterminer la quantité de "rotation" sur chacun de ces axes alors vous savez aussi vers où l'objet pointe.
  
 
Les 3 axes utilisés pour décrire le mouvement sont:
 
Les 3 axes utilisés pour décrire le mouvement sont:
Ligne 43 : Ligne 43 :
  
 
== Démonstration Appolo Soyuz ==
 
== Démonstration Appolo Soyuz ==
The image below shows the Apollo Soyuz module that was used to take humans to the surface of the moon during the 1970s. The 3D demo we're going to play with shows this same spacecraft (but with less detail).
+
L'image ci-dessous présente le module Apollo Soyuz utilisé pour emporter des humain sur la surface de la lune durant les années 1970. La démontration 3D avec laquelle nous allons jouer montre le même vaisseau spatiale (mais avec moins de détails).
  
 
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Mouvement-10.jpg]]
 
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Mouvement-10.jpg]]
  
You will need to have your Raspberry Pi and Sense HAT connected to the internet in order to download the required software.
+
Vous aurez besoin de votre Raspberry Pi et d'un Hat Sense connecté sur Internet de façon à pouvoir télécharger les logiciels nécessaires.
  
Enter the commands below into a terminal window:
+
Entrez la commande suivante dans une fenêtre terminal:
  
 
  <nowiki>sudo apt-get install python3-pip
 
  <nowiki>sudo apt-get install python3-pip
Ligne 57 : Ligne 57 :
 
sudo ./soyuz.py</nowiki>
 
sudo ./soyuz.py</nowiki>
  
Pi 1 users will have to wait 3 to 4 minutes for this to load. For Pi 2 users it's about 30 seconds. When you see the spacecraft appear on the screen start moving the Raspberry Pi and Sense HAT around with your hands. The the main booster is where the SD card slot is on your Pi.
+
Les utilisateurs de Pi ancienne génération devrons attendre 3 ou 4 minutes pour achever le chargement.  
 +
 
 +
30 secondes de chargement seront nécessaires pour les utilisateurs de Pi 2.  
 +
 
 +
Commencez à bouger votre Raspberry-Pi lorsque vous verrez le vaisseau spatiale apparaître à l'écran. Le bruleur principal se trouve du côté du lecteur de carte SD de votre Pi.
 +
 
 +
Voyez si vous pouvez identifier les différents mouvement d'élévation ''pitch'', roulis/roulement ''roll'' et embardée ''yaw''.  
  
See if you can get the spacecraft to do the pitch, roll and yaw movements. Refer back to the [https://www.youtube.com/watch?v=pQ24NtnaLl8 video] (''YouTube, anglais'') if you need to remind yourself which is which.
+
Le code derrière cette démo fait principalement appel à la fonction {{fname|get_orientation}} du sense hat (fonction qui accède au senseur IMU). Cette fonction retourne trois angles entre 0 et 360 degrés, une valeur pour chaque axe(''pitch'', ''roll'' et ''yaw''). Le modèle du vaisseau spatial subit alors une rotation de ces mêmes angles  de façon à pointer dans la même direction. Cette opération est répétée encore et encore de façon à maintenir ''rapidement'' l'orientation du modèle avec celle rapportée par le senseur IMU.
  
The code behind this demo is basically calling the Sense HAT {{fname|get_orientation}} function which accesses the IMU sensor. This then returns three angles between 0 and 360 degrees, one for each axis (pitch, roll and yaw). The spacecraft model is then rotated by those angles so that it points in the same direction. This is all repeating over and over very quickly to maintain the orientation of the model with what the IMU is reporting.
+
Pour quitter la démo, pressé sur la touche {{fname|Esc}}.
  
Press {{fname|Esc}} to exit the demo. Let's try a simpler version of this ourselves in code.
+
Essayons maintenant de réaliser une version simplifié de ce programme.
  
 
== Quelle direction est-elle pointée? ==
 
== Quelle direction est-elle pointée? ==
'''1.''' Open '''Python 3''' from a terminal window as sudo by typing:
+
'''1.''' Ouvrez '''Python 3''' dans une fenêtre terminal en utilisant {{fname|sudo}} avec la commande suivante:
  
 
  <nowiki>sudo idle3 &</nowiki>
 
  <nowiki>sudo idle3 &</nowiki>
 +
 +
 +
'''2.'''  Selectionnez le menu {{fname|File > New Window}} (''Fichier > Nouvelle fenêtre'') et entrez le code suivant:
 +
 +
<nowiki>from sense_hat import SenseHat
 +
sense = SenseHat()
 +
sense.clear()
 +
 +
o = sense.get_orientation()
 +
pitch = o["pitch"]
 +
roll = o["roll"]
 +
yaw = o["yaw"]
 +
print("pitch %s roll %s yaw %s" % (pitch, roll, yaw))</nowiki>
 +
 +
'''3.''' Sélectionnez le menu {{fname|File > Save}} (''Fichier > Sauver sous'') et choisissez une nom pour votre programme.
 +
 +
'''4.'''  Sélectionnez {{fname|Run > Run module}} (''Executer > Exécuter module'').
 +
 +
'''5.''' Si vous voyez l'erreur {{fname|IMU Init Failed, please run as root / use sudo}} sur la dernière ligne en rouge, cela signifie que vous n'avez pas suivit les instructions ci-dessus. Fermez tout et reprenez à l'étape 1.
 +
 +
Le message "IMU Init Failed" signifie "''Echec d'initialisation de l'IMU''".
 +
 +
'''6.''' Vous devirez maintenant un résultat semblable à celui-ci:
 +
 +
<nowiki>IMU Init Succeeded
 +
pitch 356.35723002363454 roll 303.4986602798494 yaw 339.19880231669873</nowiki>
 +
 +
La première ligne "IMU Init Succeeded" signifie que l'IMU à été initialisé avec succès.
 +
 +
Vous noterez également les 3 valeurs "pitch", "roll" et "yaw" dont nous avons expliqué la signification plus haut dans l'article.
 +
 +
'''7.'''  Nous n'avons pas besoin de toutes ces décimales derrière le point. Nous allons faire le nécessaire pour les arrondir juste avant l'instruction {{fname|print("pitch %s roll %s yaw %s" % (pitch, roll, yaw))}} avec les lignes suivantes:
 +
 +
<nowiki>pitch = round(pitch, 1) # ne garder qu'un seul chiffre après le point décimal.
 +
roll = round(roll, 1)
 +
yaw = round(yaw, 1)</nowiki>
 +
 +
== Surveiller les mouvements ==
 +
Ce serait bien de surveiller les valeurs sur les différents axes, plaçons notre code dans une boucle {{fname|while}} et exécutons le une nouvelle fois:
 +
 +
<nowiki>while True:
 +
  o = sense.get_orientation()
 +
  pitch = o["pitch"]
 +
  roll = o["roll"]
 +
  yaw = o["yaw"]
 +
 +
  pitch = round(pitch, 1)
 +
  roll = round(roll, 1)
 +
  yaw = round(yaw, 1)
 +
 +
  print("pitch %s roll %s yaw %s" % (pitch, roll, yaw))</nowiki>
 +
 +
Déplacez votre Pi dans votre main et vous deviez voir les numbres changer. Voyez si vous pouvez modifier la valeur d'un axe en bougeant votre Pi dans la direction "pitch" (élévation) comme indiqué dans les diagrammes.
 +
 +
Répéter l'opération pour les 3 axes. Pressez {{fname|Ctrl - C}} pour arrêter le programme.
 +
 +
== Afficher l'orientation sur la matrice LED ==
 +
'''1.''' Afficher quelque-chose provenant de l'univers 3D sur un afficheur 2D est toujours un challenge, plus spécialement si votre afficheur à une taille de 8 x 8 point. Une option qui fonctionnerait bien serait d'utiliser une LED pour chaque axe et de déplacer cette LED de différente façon. Par exemple:
 +
 +
* La LED pitch (''élévation'') pourrait monter et descendre
 +
* La LED roll (''roulis, roulement'') pourrait aller d'un côté à l'autre
 +
* La LED yaw (''embardée'') pourrait se déplacer le long des bordures
 +
 +
'''2.''' Voici une astuce intelligente que vous pouvez réaliser. La table ci-dessous affiche le numéro des LEDs (numérotation séquentielle) organisées en lignes horizontale.
 +
 +
[[Fichier:RASP-SENSE-HAT-ASTRO-PI-Mouvement-20.jpg]]
 +
 +
Pour chacun de ces numéros, il est possible des les convertir en coordonnées X Y en utilisant le code ci-dessous.
 +
 +
<nowiki>y = number // 8
 +
x = number % 8</nowiki>
 +
 +
Pour la valeur {{fname|y}} vous pouvez utiliser une division entière {{fname|//}} par le nombre 8. Dans division entière, la valeur décimale (et donc le "reste de la division") est simplement ignoré. Ensuite, la valeur de {{fname|x}} est le module {{fname|%}} par 8, ce qui donne '''uniquement''' le reste de la division par 8.
 +
 +
Voici un exemple basé sur le point/pixel 60 se trouvant sur la ligne du bas:
 +
 +
<nowiki>60 // 8 = 7
 +
60 % 8 = 4</nowiki>
 +
 +
Notez de '''7'' * 8 + '''4''' donne bien '''60''' :-)
 +
 +
'''3.''' Essayez le code suivant:
 +
 +
<nowiki>number = 60
 +
 +
y = number // 8
 +
x = number % 8
 +
 +
sense.set_pixel(x, y, 255, 255, 255)</nowiki>
 +
 +
'''4.''' La chose vraiment intelligente dans cet astuce est de réaliser une liste contenant les numéros de LEDs correspondantes à la directions souhaitée. Il suffira alors de se déplacer d'avant en arrière dans cette liste en fonction de la valeur de l'axe.
 +
 +
Disons maintenant que nous voulons créer une suite de LEDs à allumer le long des bords de la matrice. Nous allons construire notre liste sur la ligne du haut, puis descende le long du coté droit, aller de gauche à droite sur la ligne du bas et finalement remonter le coté gauche de la matrice.
 +
 +
Cela donnera la liste suivante:
 +
 +
<nowiki>edge = [0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8]</nowiki>
 +
 +
En anglais, le mot ''edge'' signifie "bordure".
 +
 +
Nous pouvons alors trouver la longueur de cette liste en utilisant la fonction {{fname|len}}:
 +
 +
<nowiki>length = len(edge)</nowiki>
 +
 +
Donc la taille est 28. Si nous divisons 28 par 360 nous avons un rapport entre , disons, la mesure de "yaw" (embardée) et la position de la LED dans notre liste (la distance a parcourir le long de la bordure). Nous pouvons maintenant obtenir le numéro séquentiel du point/pixel directement depuis la liste. De cette valeur "séquentielle" nous pouvons obtenir les coordonnées x et Y de la LED et allumer cette LED (comme expliqué au début de cette section)!
 +
 +
Comme ceci:
 +
 +
<nowiki>from sense_hat import SenseHat
 +
 +
sense = SenseHat()
 +
sense.clear()
 +
 +
edge = [0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8]
 +
length = len(edge)
 +
ratio = length / 360.0
 +
 +
while True:
 +
    o = sense.get_orientation()
 +
    pitch = o["pitch"]
 +
    roll = o["roll"]
 +
    yaw = o["yaw"]
 +
 +
    yaw_list_position = int(yaw * ratio) # Position dans la liste pour YAW
 +
 +
    yaw_pixel_number = edge[yaw_list_position] # Numéro du pixel pour YAW
 +
 +
    y = yaw_pixel_number // 8  # Calcul de la position Y du pixel
 +
    x = yaw_pixel_number % 8  # Calcul de la position X du pixel
 +
 +
    sense.set_pixel(x, y, 255, 255, 255) # Allumer le pixel</nowiki>
 +
 +
'''5.''' Ce qui vous aurez certainement remarqué dans le code ci-dessus, c'est qu'il ne fait qu'allumer les LEDs. Nous vous laissons le soin de trouver, par vous même, le code à utiliser pour éteindre les LEDs.
 +
 +
Essayez d'avoir des variables pour la valeur de {{fname|x}} et {{fname|y}} lorsque la boucle à été exécutée la fois précédente. Si la nouvelle valeur de {{fname|x}} et {{fname|y}} (du pixel à allumer) est différente de l'ancienne valeur alors vous pouvez utiliser {{fname|set_pixel}} pour éteindre la LED (la mettre en noir).
 +
 
{{RASP-SENSE-HAT-ASTRO-PI-TRAILER}}
 
{{RASP-SENSE-HAT-ASTRO-PI-TRAILER}}

Version actuelle datée du 4 octobre 2015 à 21:47


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Senseur de mouvement

Le Sense HAT met en oeuvre de nombreux senseurs, l'un d'eux est un senseur de mouvement appelé IMU. L'IMU est capable de mesurer le type de mouvement qu'il subit.

La source anglaise de cette traduction se trouve ici https://www.raspberrypi.org/learning/astro-pi-guide/sensors/movement.md

Qu'est ce qu'un IMU?

Il est équipé d'une centrale de mesure inertielle (dite IMU pou Inertial Measurement Unit) sous forme d'une puce qui inclus:

  • Un gyroscope (qui mesure le moment et la rotation)
  • Un accéléromètre (qui mesure les forces d'accélération et peut être utilisé pour trouver la direction de la gravité)
  • Un magnétomètre (qui mesure le champ magnétique de la terre, c'est un peu comme une boussole)

RASP-SENSE-HAT-ASTRO-PI-Mouvement.jpg

Pourquoi un senseur de mouvement est-il si important?

Quand vous êtes dans l'espace il y a une question d'importance absolue à laquelle vous devez toujours être capable de répondre: dans quelle direction suis entrain de pointer?

Si vous ne connaissez pas votre orientation alors vous avez un énorme problème. Par conséquent, une centrale inertielle (senseur IMU) est utilisée dans tous les engins spatiaux habités et non habités. Ce senseur permet savoir quelle est l'orientation et fait en sorte de maintenir cette information "correcte". Même un ancien engin spatial dispose d'un IMU. Demandez à vos grand-parents s'ils se souvennent des missions Apollo (wikipedia, anglais) qui ont emmené des humains sur la surface de la lune.

La photo ci-dessus présente le senseur IMU de module de commande Apollo. Notez comme ce module est imposant comparé au petit cube noir qui équipe votre Sense-Hat; c'est la différence entre la technologie de 1975 et celle de 2015. Par ailleurs, l'IMU du Hat Sense n'est pas aussi précis que celui d'Appolo, mais il coûte aussi un million de fois moins cher!

Comment l'orientation est elle représentée?

Nous savons que la terre tourne autour d'un axe qui va du pôle Nord vers le pôle Sud. Tous les objets (y compris dans l'espace) ont 3 axes autour desquels ils peuvent tourner. Si vous savez déterminer la quantité de "rotation" sur chacun de ces axes alors vous savez aussi vers où l'objet pointe.

Les 3 axes utilisés pour décrire le mouvement sont:

  • 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)
  • 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".

RASP-SENSE-HAT-ASTRO-PI-Debuter-29.png

RASP-SENSE-HAT-ASTRO-PI-Debuter-30.jpg

Les images ci-dessus montre les 3 axes en relation avec le Sense Hat ainsi que la correspondance dans le monde réel.

Nous allons maintenant démarrer le programme d'exemple en 3D.

Démonstration Appolo Soyuz

L'image ci-dessous présente le module Apollo Soyuz utilisé pour emporter des humain sur la surface de la lune durant les années 1970. La démontration 3D avec laquelle nous allons jouer montre le même vaisseau spatiale (mais avec moins de détails).

RASP-SENSE-HAT-ASTRO-PI-Mouvement-10.jpg

Vous aurez besoin de votre Raspberry Pi et d'un Hat Sense connecté sur Internet de façon à pouvoir télécharger les logiciels nécessaires.

Entrez la commande suivante dans une fenêtre terminal:

sudo apt-get install python3-pip
sudo pip-3.2 install pi3d
git clone git://github.com/astro-pi/apollo-soyuz
cd apollo-soyuz
sudo ./soyuz.py

Les utilisateurs de Pi ancienne génération devrons attendre 3 ou 4 minutes pour achever le chargement.

30 secondes de chargement seront nécessaires pour les utilisateurs de Pi 2.

Commencez à bouger votre Raspberry-Pi lorsque vous verrez le vaisseau spatiale apparaître à l'écran. Le bruleur principal se trouve du côté du lecteur de carte SD de votre Pi.

Voyez si vous pouvez identifier les différents mouvement d'élévation pitch, roulis/roulement roll et embardée yaw.

Le code derrière cette démo fait principalement appel à la fonction get_orientation du sense hat (fonction qui accède au senseur IMU). Cette fonction retourne trois angles entre 0 et 360 degrés, une valeur pour chaque axe(pitch, roll et yaw). Le modèle du vaisseau spatial subit alors une rotation de ces mêmes angles de façon à pointer dans la même direction. Cette opération est répétée encore et encore de façon à maintenir rapidement l'orientation du modèle avec celle rapportée par le senseur IMU.

Pour quitter la démo, pressé sur la touche Esc.

Essayons maintenant de réaliser une version simplifié de ce programme.

Quelle direction est-elle pointée?

1. Ouvrez Python 3 dans une fenêtre terminal en utilisant sudo avec la commande suivante:

sudo idle3 &


2. Selectionnez le menu File > New Window (Fichier > Nouvelle fenêtre) et entrez le code suivant:

from sense_hat import SenseHat
sense = SenseHat()
sense.clear()

o = sense.get_orientation()
pitch = o["pitch"]
roll = o["roll"]
yaw = o["yaw"]
print("pitch %s roll %s yaw %s" % (pitch, roll, yaw))

3. Sélectionnez le menu File > Save (Fichier > Sauver sous) et choisissez une nom pour votre programme.

4. Sélectionnez Run > Run module (Executer > Exécuter module).

5. Si vous voyez l'erreur IMU Init Failed, please run as root / use sudo sur la dernière ligne en rouge, cela signifie que vous n'avez pas suivit les instructions ci-dessus. Fermez tout et reprenez à l'étape 1.

Le message "IMU Init Failed" signifie "Echec d'initialisation de l'IMU".

6. Vous devirez maintenant un résultat semblable à celui-ci:

IMU Init Succeeded
pitch 356.35723002363454 roll 303.4986602798494 yaw 339.19880231669873

La première ligne "IMU Init Succeeded" signifie que l'IMU à été initialisé avec succès.

Vous noterez également les 3 valeurs "pitch", "roll" et "yaw" dont nous avons expliqué la signification plus haut dans l'article.

7. Nous n'avons pas besoin de toutes ces décimales derrière le point. Nous allons faire le nécessaire pour les arrondir juste avant l'instruction print("pitch %s roll %s yaw %s" % (pitch, roll, yaw)) avec les lignes suivantes:

pitch = round(pitch, 1) # ne garder qu'un seul chiffre après le point décimal.
roll = round(roll, 1)
yaw = round(yaw, 1)

Surveiller les mouvements

Ce serait bien de surveiller les valeurs sur les différents axes, plaçons notre code dans une boucle while et exécutons le une nouvelle fois:

while True:
   o = sense.get_orientation()
   pitch = o["pitch"]
   roll = o["roll"]
   yaw = o["yaw"]

   pitch = round(pitch, 1)
   roll = round(roll, 1)
   yaw = round(yaw, 1)

   print("pitch %s roll %s yaw %s" % (pitch, roll, yaw))

Déplacez votre Pi dans votre main et vous deviez voir les numbres changer. Voyez si vous pouvez modifier la valeur d'un axe en bougeant votre Pi dans la direction "pitch" (élévation) comme indiqué dans les diagrammes.

Répéter l'opération pour les 3 axes. Pressez Ctrl - C pour arrêter le programme.

Afficher l'orientation sur la matrice LED

1. Afficher quelque-chose provenant de l'univers 3D sur un afficheur 2D est toujours un challenge, plus spécialement si votre afficheur à une taille de 8 x 8 point. Une option qui fonctionnerait bien serait d'utiliser une LED pour chaque axe et de déplacer cette LED de différente façon. Par exemple:

  • La LED pitch (élévation) pourrait monter et descendre
  • La LED roll (roulis, roulement) pourrait aller d'un côté à l'autre
  • La LED yaw (embardée) pourrait se déplacer le long des bordures

2. Voici une astuce intelligente que vous pouvez réaliser. La table ci-dessous affiche le numéro des LEDs (numérotation séquentielle) organisées en lignes horizontale.

RASP-SENSE-HAT-ASTRO-PI-Mouvement-20.jpg

Pour chacun de ces numéros, il est possible des les convertir en coordonnées X Y en utilisant le code ci-dessous.

y = number // 8
x = number % 8

Pour la valeur y vous pouvez utiliser une division entière // par le nombre 8. Dans division entière, la valeur décimale (et donc le "reste de la division") est simplement ignoré. Ensuite, la valeur de x est le module % par 8, ce qui donne uniquement le reste de la division par 8.

Voici un exemple basé sur le point/pixel 60 se trouvant sur la ligne du bas:

60 // 8 = 7
60 % 8 = 4

Notez de 7 * 8 + 4' donne bien 60 :-)

3. Essayez le code suivant:

number = 60

y = number // 8
x = number % 8

sense.set_pixel(x, y, 255, 255, 255)

4. La chose vraiment intelligente dans cet astuce est de réaliser une liste contenant les numéros de LEDs correspondantes à la directions souhaitée. Il suffira alors de se déplacer d'avant en arrière dans cette liste en fonction de la valeur de l'axe.

Disons maintenant que nous voulons créer une suite de LEDs à allumer le long des bords de la matrice. Nous allons construire notre liste sur la ligne du haut, puis descende le long du coté droit, aller de gauche à droite sur la ligne du bas et finalement remonter le coté gauche de la matrice.

Cela donnera la liste suivante:

edge = [0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8]

En anglais, le mot edge signifie "bordure".

Nous pouvons alors trouver la longueur de cette liste en utilisant la fonction len:

length = len(edge)

Donc la taille est 28. Si nous divisons 28 par 360 nous avons un rapport entre , disons, la mesure de "yaw" (embardée) et la position de la LED dans notre liste (la distance a parcourir le long de la bordure). Nous pouvons maintenant obtenir le numéro séquentiel du point/pixel directement depuis la liste. De cette valeur "séquentielle" nous pouvons obtenir les coordonnées x et Y de la LED et allumer cette LED (comme expliqué au début de cette section)!

Comme ceci:

from sense_hat import SenseHat

sense = SenseHat()
sense.clear()

edge = [0, 1, 2, 3, 4, 5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56, 48, 40, 32, 24, 16, 8]
length = len(edge)
ratio = length / 360.0

while True:
    o = sense.get_orientation()
    pitch = o["pitch"]
    roll = o["roll"]
    yaw = o["yaw"]

    yaw_list_position = int(yaw * ratio) # Position dans la liste pour YAW

    yaw_pixel_number = edge[yaw_list_position] # Numéro du pixel pour YAW

    y = yaw_pixel_number // 8  # Calcul de la position Y du pixel
    x = yaw_pixel_number % 8   # Calcul de la position X du pixel

    sense.set_pixel(x, y, 255, 255, 255) # Allumer le pixel

5. Ce qui vous aurez certainement remarqué dans le code ci-dessus, c'est qu'il ne fait qu'allumer les LEDs. Nous vous laissons le soin de trouver, par vous même, le code à utiliser pour éteindre les LEDs.

Essayez d'avoir des variables pour la valeur de x et y lorsque la boucle à été exécutée la fois précédente. Si la nouvelle valeur de x et y (du pixel à allumer) est différente de l'ancienne valeur alors vous pouvez utiliser set_pixel pour éteindre la LED (la mettre en noir).


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.

Traduction réalisée par Meurisse. D pour shop.MCHobby.be - Licence CC-BY-SA.
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é.