Présentation du Sense Hat aux RMLL de 2016

dimanche 19 juin 2022
par  Alain BUSSER

L’utilisation du Sense Hat en ICN avait été présentée aux RMLL de 2016 à Saint-Joseph. Cela avait été l’occasion de proposer des activités menées en mini-projet. Ces activités peuvent toujours être pratiquées, en NSI.

Licence Creative Commons
Cet article est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 2.0 France.

Les RMLLd de 2016 à Saint-Joseph ont eu leur propre station météo affichant en temps réel la température, l’hygrométrie et la pression atmosphérique. L’appareil sur lequel ces données étaient mesurées et affichées est formé

Le Sense Hat est une extension du Raspberry Pi développée pour Astro Pi (un ordinateur à base de Raspberry Pi utilisé dans la station spatiale internationale). Son succès en ISN vient de son seul actuateur (virtuel ou en tout cas, optique) qui est la matrice de LEDs qui le recouvre presque complètement. Par exemple un jeu de Candy Crush a été programmé par des élèves d’ISN sur le Sense Hat.

Mais ce sont les nombreux et discrets senseurs qui font l’intérêt du Sense Hat pour la station spatiale internationale. Par exemple la mesure régulière de la pression atmosphérique et du taux d’humidité de l’air donne le graphique suivant (fait avec le logiciel libre R) :

Les données ont été enregistrées dans un fichier csv à l’aide de ce script :

  1. from sense_hat import SenseHat
  2. import time
  3. sense = SenseHat()
  4.  
  5. fichier = open("hygro.csv","w")
  6.  
  7. for n in range(240):
  8.         fichier.write(str(sense.get_humidity()))
  9.         fichier.write(" , ")
  10.         fichier.write(str(sense.get_pressure()))
  11.         fichier.write('\n')
  12.         time.sleep(60)
  13.  
  14. fichier.close()

Télécharger

Et oui ! C’est en Python (langage) qu’on programme le Sense Hat [1] ! Durant les RMLL, ont été montrés des exemples de mini-projets d’ISN qu’on peut faire avec le Sense Hat, comme

  • La station météo ;

Le script

  1. from sense_hat import SenseHat
  2.  
  3. sense = SenseHat()
  4. white = (255,255,255)
  5. for n in range(8):
  6.         message = "Welcome to the RMLL, the meteo today: "
  7.         message += "temperature: " + str(round(sense.get_temperature(),1)) + " Celsius;  "
  8.         message += "Pressure: " + str(int(sense.get_pressure())) + " hPa; "
  9.         message += "humidity: " + str(int(sense.get_humidity())) + "% "
  10.         sense.show_message(message,text_colour=white)

Télécharger

Le script

  1. from sense_hat import SenseHat
  2.  
  3. sense = SenseHat()
  4. on_continue = True
  5.  
  6.  
  7. while on_continue:
  8.         vecteur = sense.get_accelerometer_raw()
  9.         x = -vecteur['x']*10 + 3.5
  10.         y = -vecteur['y']*10 + 3.5
  11.        
  12.         for i in range(8):
  13.                 for j in range(8):
  14.                         n = int(100*max(2-(i-x)**2-(j-y)**2,0))
  15.                         sense.set_pixel(i,j,n,n,n)
  16.        
  17.         if (x-4)**2>20 or (y-4)**2>20:
  18.                 on_continue = False

Télécharger

  • La simulation d’un robot type fourmi de Langton, représenté par un pixel mobile sur la matrice de LEDs

Le script

  1. from time import *
  2. from sense_hat import SenseHat
  3.  
  4.  
  5. sense = SenseHat()
  6. sense.clear()
  7.  
  8. def mettre_bleu(x,y,n):
  9.         (r,g,b) = sense.get_pixel(x,y)
  10.         sense.set_pixel(x,y,r,g,n)
  11.  
  12. def mettre_rouge(x,y,n):
  13.         (r,g,b) = sense.get_pixel(x,y)
  14.         sense.set_pixel(x,y,n,g,b)
  15.  
  16.  
  17. def gauche():
  18.         global direction
  19.         direction = (direction+1) % 4
  20.  
  21. def droite():
  22.         global direction
  23.         direction = (direction+3) % 4
  24.  
  25. def avance():
  26.         global direction, x,y
  27.         mettre_bleu(x,y,0)
  28.         x = (x+dx[direction]) % 8
  29.         y = (y+dy[direction]) % 8
  30.         mettre_bleu(x,y,255)
  31.  
  32. dx = [1,0,-1,0]
  33. dy = [0,1,0,-1]
  34. direction = 1
  35. x,y = 4,4
  36.  
  37. sense.set_pixel(x,y,0,0,255)
  38.  
  39.  
  40. for n in range(2000):
  41.         avance()
  42.         (r,g,b) = sense.get_pixel(x,y)
  43.         if r>0:
  44.                 gauche()
  45.                 mettre_rouge(x,y,0)
  46.         else:
  47.                 droite()
  48.                 mettre_rouge(x,y,255)
  49.         sleep(0.1)

Télécharger

On peut même expérimenter avec plusieurs fourmis de couleurs différentes interagissant entre elles :

  1. from time import *
  2. from sense_hat import SenseHat
  3.  
  4.  
  5. sense = SenseHat()
  6. sense.clear()
  7.  
  8. def mettre_bleu(x,y,n):
  9.         (r,g,b) = sense.get_pixel(x,y)
  10.         sense.set_pixel(x,y,r,g,n)
  11.  
  12. def mettre_rouge(x,y,n):
  13.         (r,g,b) = sense.get_pixel(x,y)
  14.         sense.set_pixel(x,y,n,g,b)
  15.  
  16. def mettre_vert(x,y,n):
  17.         (r,g,b) = sense.get_pixel(x,y)
  18.         sense.set_pixel(x,y,r,n,b)
  19.  
  20.  
  21. def gauche1():
  22.         global direction1
  23.         direction1 = (direction1+1) % 4
  24.  
  25. def droite1():
  26.         global direction1
  27.         direction1 = (direction1+3) % 4
  28.  
  29. def avance1():
  30.         global direction1, x1,y1
  31.         mettre_bleu(x1,y1,0)
  32.         x1 = (x1+dx[direction1]) % 8
  33.         y1 = (y1+dy[direction1]) % 8
  34.         mettre_bleu(x1,y1,255)
  35.  
  36. def gauche2():
  37.         global direction2
  38.         direction2 = (direction2+1) % 4
  39.  
  40. def droite2():
  41.         global direction2
  42.         direction2 = (direction2+3) % 4
  43.  
  44. def avance2():
  45.         global direction2, x2,y2
  46.         mettre_bleu(x2,y2,0)
  47.         x2 = (x2+dx[direction2]) % 8
  48.         y2 = (y2+dy[direction2]) % 8
  49.         mettre_bleu(x2,y2,255)
  50.  
  51. dx = [1,0,-1,0]
  52. dy = [0,1,0,-1]
  53. direction1 = 1
  54. direction2 = 2
  55. x1,y1 = 6,6
  56. x2,y2 = 3,3
  57.  
  58. sense.set_pixel(x1,y1,0,0,255)
  59. sense.set_pixel(x2,y2,0,0,255)
  60.  
  61.  
  62. for n in range(4000):
  63.         avance1()
  64.         (r,g,b) = sense.get_pixel(x1,y1)
  65.         if r>0:
  66.                 gauche1()
  67.                 mettre_rouge(x1,y1,0)
  68.         else:
  69.                 droite1()
  70.                 mettre_rouge(x1,y1,255)
  71.         avance2()
  72.         (r,g,b) = sense.get_pixel(x2,y2)
  73.         if g>0:
  74.                 gauche2()
  75.                 mettre_vert(x2,y2,0)
  76.         else:
  77.                 droite2()
  78.                 mettre_vert(x2,y2,255)
  79.         sleep(0.01)

Télécharger

  • Des jeux style Lightsout... ou le jeu de la vie de Conway !

Le script

  1. from time import sleep as attendre
  2. from random import *
  3. from sense_hat import SenseHat
  4.  
  5. sense = SenseHat()
  6. sense.clear()
  7.  
  8. matrice = [[0]*8 for i in range(8)]
  9.  
  10. def lecture():
  11.         global matrice, ecosysteme
  12.         for i in range(8):
  13.                 for j in range(8):
  14.                         matrice[i][j] = ecosysteme[8*i+j][1]/255
  15.  
  16. def ecriture():
  17.         global matrice, ecosysteme
  18.         for i in range(8):
  19.                 for j in range(8):
  20.                         voisins = matrice[(i+7)%8][(j+7)%8]
  21.                         voisins += matrice[(i+7)%8][j]
  22.                         voisins += matrice[(i+7)%8][(j+1)%8]
  23.                         voisins += matrice[i][(j+7)%8]
  24.                         voisins += matrice[i][(j+1)%8]
  25.                         voisins += matrice[(i+1)%8][(j+7)%8]
  26.                         voisins += matrice[(i+1)%8][j]
  27.                         voisins += matrice[(i+1)%8][(j+1)%8]
  28.                         if voisins is 3 or (voisins is 2 and matrice[i][j]>0):
  29.                                 ecosysteme[8*i+j] = v
  30.                         else:
  31.                                 ecosysteme[8*i+j] = m
  32.  
  33. v = [0,255,0]
  34. m = [0]*3
  35. ecosysteme = []
  36. for n in range(64):
  37.         if random()<0.3:
  38.                 ecosysteme += [v]
  39.         else:
  40.                 ecosysteme += [m]
  41.                
  42. sense.set_pixels(ecosysteme)
  43.  
  44. for gener in range(200):
  45.         lecture()
  46.         ecriture()
  47.         sense.set_pixels(ecosysteme)
  48.         attendre(0.02)

Télécharger

  • La simulation d’un mouvement brownien.

Le script

  1. from random import *
  2. from time import *
  3. from sense_hat import SenseHat
  4.  
  5.  
  6. sense = SenseHat()
  7. sense.clear()
  8.  
  9. dx = [1,0,7,0]
  10. dy = [0,1,0,7]
  11.  
  12. x1,y1 = 4,4
  13. x2,y2 = 0,0
  14. x3,y3 = 0,7
  15.  
  16. sense.set_pixel(x1,y1,0,0,255)
  17. sense.set_pixel(x2,y2,255,0,0)
  18. sense.set_pixel(x3,y3,0,255,0)
  19.  
  20.  
  21. while 2+2==4:
  22.         (r,g,b) = sense.get_pixel(x1,y1)
  23.         sense.set_pixel(x1,y1,r,g,0)
  24.         indice = randrange(4)
  25.         x1 = (x1+dx[indice]) % 8
  26.         y1 = (y1+dy[indice]) % 8
  27.         (r,g,b) = sense.get_pixel(x1,y1)
  28.         sense.set_pixel(x1,y1,r,g,255)
  29.         (r,g,b) = sense.get_pixel(x2,y2)
  30.         sense.set_pixel(x2,y2,0,g,b)
  31.         indice = randrange(4)
  32.         x2 = (x2+dx[indice]) % 8
  33.         y2 = (y2+dy[indice]) % 8
  34.         (r,g,b) = sense.get_pixel(x2,y2)
  35.         sense.set_pixel(x2,y2,255,g,b)
  36.         (r,g,b) = sense.get_pixel(x3,y3)
  37.         sense.set_pixel(x3,y3,r,0,b)
  38.         indice = randrange(4)
  39.         x3 = (x3+dx[indice]) % 8
  40.         y3 = (y3+dy[indice]) % 8
  41.         (r,g,b) = sense.get_pixel(x3,y3)
  42.         sense.set_pixel(x3,y3,r,255,b)
  43.         sleep(0.1)

Télécharger

Ces mini-projets peuvent encore être menés, mais en NSI puisque l’enseignement d’ISN n’existe plus, et que les projets sont une part importante du programme de NSI.


[1Le code source de l’interface est sur github.


Commentaires