microbit & Neopixel

MICROBIT : UN “NIVEAU À BULLE”

L’objectif est de créer un “niveau à bulle” , c’est-à-dire un outil qui permette de vérifier l’horizontalité ou la verticalité d’une surface.

Il n’y aura pas de bulle dans notre niveau à bulle …
Nous allons proposer deux solutions différentes

  • un affichage qui utilise les LED de la carte
  • un affichage qui déplace une lumière sur un Neopixel

Principe de fonctionnement

L’accéléromètre du microbit mesure constamment aussi bien l’accélération de la pesanteur à la surface de la terre (environ 9.81 m/s2), dirigée verticalement vers le bas, que des accélérations dues aux changements de vitesse dans les deux autres directions.

L’accéléromètre est bien visible sur la carte du micro:bit. Il est tout-à-fait analogue à ceux qui se trouvent dans les smartphones et qui permettent de déterminer leur orientation ou leurs mouvements.

Ce capteur peut mesurer l’accélération dans chacune des trois dimensions (axes x, y et z), y compris l’accélération de la pesanteur terrestre.

À partir de ces valeurs lues en permanence par le capteur, il est possible de déterminer l’inclinaison avant (pitch) et l’inclinaison latérale (roll).

1/ Mise en œuvre

Il y a une méthode pour chaque axe qui renvoie un nombre positif ou négatif qui indique une mesure en milli-g. Lorsque la lecture est de 0, il y a un alignement selon cet axe.

Par exemple, voici un « niveau à bulle » très simple qui utilise get_x pour mesurer l’alignement de l’appareil selon l’axe X:

 

from microbit import *
while True:
    acc = accelerometer.get_x()
    print (acc)
    if acc > 0:
        display.show(Image.ARROW_E)
    else:
        display.show(Image.ARROW_W)
    sleep(100)

E1 : Testez le programme précédent sur la microbit

2/ Utilisation avancée de l’écran (display)

Les valeurs renvoyées par les méthodes get_x() et get_y() sont comprises entre -1024 et +1024.

E2 : Écrivez un programme qui va allumer un pixel de l’écran au centre, lorsque la carte est parfaitement horizontale.
Le pixel se déplace à droite ou à gauche (selon l’axe x) lorsque la carte tourne autour de l’axe y.

E3 : Écrivez un programme qui va allumer un pixel de l’écran au centre, lorsque la carte est parfaitement horizontale.
Le pixel se déplace en haut ou en bas (selon l’axe y) lorsque la carte tourne autour de l’axe x.

E4 : Enfin, le pixel se déplace sur tout l’écran selon les rotations de l’axe x ou l’axe y

3/ Niveau à bulle et Neopixel

Il s’agit de visualiser le niveau sur un axe, avec un rendu LED, grâce à un Neopixel.

E5 : En partant des programmes précédents et du TP sur Neopixel, la bulle de l’axe x est maintenant matérialisée par une lumière qui se déplace sur le Neopixel.

Si vous avez le temps : une couleur pour la bulle x et une autre couleur pour la bulle y

Programmer l’Arduino avec python (ICN)

L’objectif est de piloter une carte arduino, à partir d’un programme en python s’exécutant dans l’ordinateur.
La carte arduino est programmée de manière à dialoguer avec une librairie python:

  • dans la carte arduino, le programme arduinoPy.ino est préalablement installé. Si ce n’est pas le cas, il s’installe simplement avec l’IDE «Arduino»
  • dans votre répertoire de travail, vous disposez de la librairie pyduino.py

Carte d'extensionPlan de la carte

Librairie python

pyduino.py

Ce fichier est à copier dans le même dossier que votre programme.
Vous ne devez pas le modifier, sauf si vous modifiez également le fichier « arduinoPy.ino » fourni plus bas.

Utilisation de la librairie

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM1')
time.sleep(3)
pos = 100
for i in range(0,1000):
   if i%2 == 0:    
        a.S0(1)
        a.S1(0)
   else:
        a.S0(0)
        a.S1(1)
   if i%3 == 0:
        a.S2(1)
        a.S3(0)
   else:
        pos = 100 - pos
        a.M2(pos)
        a.S2(0)
        a.S3(1)
   v  = a.E0() + 2*a.E1()
   print(' '+ repr(v) + '; A1 = ' + repr(a.A(1)) + '; A6 = '
            + repr(a.A(6)))
   a.M1(60*v)
   a.M0(60*v)
   time.sleep(0.1)

TP de mise en œuvre de la carte d’extension avec python

Firmware Arduino

arduinoPy.ino

Pour être pris en compte par le logiciel arduino, ce fichier est à placer dans un dossier arduinoPy.

Arduino / python : documentation

Introduction

 

La carte, associée à la librairie python, permet de gérer:

  • 2 entrées digitales E0 et E1 reliées à des boutons poussoirs
  • 4 sorties digitales S0 à S3 connectées à des LEDS
  • 6 entrées analogiques de A1 à A6
  • 3 PWM pour servomoteurs, M0, M1 et M2

Pour utiliser la carte, il suffit de déclarer une variable de type Arduino, puis d’utiliser cette variable comme dans les exemples qui suivent.

Initialisation de la carte

Pour être connecté à la carte, il faut exécuter

a = Arduino()

Le constructeur prend un paramètre optionnel pour s’adapter au système.

Exemple sous linux

from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

Exemple sous Windows

from pyduino import *
import time

a = Arduino('COM10')
time.sleep(3)

La valeur par défaut est ‘/dev/ttyACM0’.
Vous pouvez modifier cette valeur par défaut dans votre fichier pyduino.py, elle
est facile à repérer.

Remarque : sous linux, cela peut être /dev/ttyACM1 , /dev/ttyUSB0
et soux windows COM11 , COM12

La connexion à la carte arduino par le port série  redémarre la carte.
Les 3 secondes sont là pour attendre que l’initialisation soit complète.

Les sorties digitales

Elles sont au nombre de 4, accessibles par les méthodes :
 a.S0(<valeur>),  a.S1(<valeur>), a.S3(<valeur>),  a.S4(<valeur>)

ou <valeur> vaut 0 ou 1 pour éteindre ou allumer la sortie correspondante

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM0') # à adapter
time.sleep(3)

i = 0
while True:
    if i%2 == 0:
       a.S0(1)
       a.S1(0)
    else:
       a.S0(0)
       a.S1(1)
    if i%3 == 0:
       a.S2(1)
       a.S3(0)
    else:
       a.S2(0)
       a.S3(1)
    i = i+1

.

Les entrées digitales

On peut en utiliser 2 à partir des boutons placés sur la carte:

v0 = a.E0()
v1 = a.E1()

v0 vaut 1 si le bouton E0 est enfoncé, et 0 sinon
v1 vaut 1 si le bouton E1 est enfoncé, et 0 sinon

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)
while True:
   v0 = a.E0()
   v1 = a.E1()
   print(' v0 = '+ v0 + ' et v1 = ' + v1)

Les entrées analogiques

On peut en utiliser 6 (numérotées de 1 à 6).

val = a.A1() renvoie une valeur entière (entre 0 et 400), qui est une valeur numérisée proportionnelle à la tension renvoyée par le capteur.
On peut aussi écrire val = a.A(1) ce qui permet de traiter plusieurs entrées de capteurs dans une boucle.

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    print(' A1 = ' + repr(a.A(1)))

Les sorties PWM pour les moteurs

Installez un moteur sur la sortie M0 (voyez le plan)


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    a.M0(0)
    time.sleep(1)
    a.M0(180)
    time.sleep(1)
    a.M0(90)
    time.sleep(1)