Modèle:MicroPython-Hack-LED-core

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Ce que nous faisons

Nous allons apprendre à utiliser les LEDs déjà disponibles sur la carte PyBoard.

Ensuite, dans une prochaine étape, nous allons apprendre à brancher une LED externe sur la PyBoard.

Montage

Votre PyBoard est déjà équipée de 4 LEDs, c'est elles que nous allons utilser.

PyBoard-LEDs.jpg

Le code

.: Activer les LEDs et concepts de base :.


L'une des choses les plus faciles à faire sur une carte PyBoard est est d'allumer les LEDs qui sont montés sur la carte. Connectez la carte, et connectez vous sur la carte en REPL comme décrit dans le tutoriel précédent. Nous allons commencer par allumer une LED dans l’interpréteur REPL en tapant la commande suivante:

>>> myled = pyb.LED(1)
>>> myled.on()
>>> myled.off()

Ces commandes allume (on) et éteint (off) la LED.

Tout cela est très bien mais nous aimerions que ce processus soit automatisé. Ouvrez le fichier main.py sur la carte PyBoard avec votre éditeur de texte favorit. Ecrivez (ou copiez/collez) les lignes suivantes dans le fichier. Si vous débutez en Python, assurez-vous de bien préserver l'indentation dans les différentes lignes, cela est vraiment très important!

led = pyb.LED(2)
while True:
    led.toggle()
    pyb.delay(1000)

Lorsque vous sauvez le fichier, la LED rouge sur la carte doit s'allumer pendant environ une seconde. Pour exécuter le script, faite une réinitialisation logicielle (soft reset) en pressant (CTRL-D). La carte PyBoard va redémarrer et vous devriez voir la LED rouge clignoter continuellement. Ca marche? génial, vous venez de réaliser la première étape vous permettant de réaliser votre futur armée de petits robots! Lorsque vous serez lassé de voir la LED clignoter alors pressez la combinaison CTRL-C dans votre terminal pour interrompre l'exécution.

Que fait donc ce code? Pour commencer, nous avons besoin de faire le point sur la terminologie. Python est un langage orienté objet, donc presque tout les éléments en Python son des classe et lorsque vous créer une instance de classe, vous obtenez un objet. La classe représente la définition, l'objet instancié (depuis un classe) un "objet" manipulable. Une méthode (aussi appelée fonction membre) est utilisé pour interagir avec l'objet, ce qui permet de le contrôler.

La première ligne e code crée un objet appelé "led", instance de la classe LED. Lorsque l'objet est crée, celui-ci prend un seul paramètre dont la valeur varie entre 1 et 4, valeurs correspondants aux 4 LEDs disponibles sur la carte.

La classe pyb.LED dispose de 3 membres importants que nous allons utiliser:

  • on() pour allumer la LED,
  • off() pour éteindre la LED,
  • toggle() pour inverser l'état de la LED.

L'autre fonction que nous allons utiliser est pyb.delay() qui attend un temps/délai définit exprimé en milliseconde.

Une fois que nous avons crée l'objet "led" (instance de la classe LED), la ligne while True: crée une boucle infinie qui change l'état de la led (via l'appel de toggle()) et attend une seconde (soit 1000 millisecondes).

Note: voyez aussi l'article "classe et instance d'objet" sur commentcamarche.net

Faire encore mieux

Changer le temps et la LED

Essayez de changer le temps entre deux changement d'état de la LED.... et essayez d'allumer une autre LED.

Utiliser REPL

Connectez vous directement sur votre pyboard en utilisant REPL pour

  1. créez un objet pyb.LED
  2. Allumer une LED en utilisant la méthode on().

REPL est un mode très utile, il est essentiel de pouvoir le maîtriser.

C'est Disco sur votre PyBoard

Jusqu'à maintenant, nous avons uniquement utilisé une seule LED mais la pyboard dispose de 4 LEDs. Commençons par créer un objet pour chaque LED comme cela, il sera possible de toutes les commander séparément. Nous faisons cela en créant une liste de LEDs à l'aide d'une "list comprehension" (voyez cet exemple).

leds = [pyb.LED(i) for i in range(1,5)]

Vous recevrez un message d'erreur si vous appelez pyb.LED() avec un nombre autre que 1,2,3,4. nous allons ensuite utiliser une boucle infinie pour allumer et éteindre les LEDs en cycles.

n = 0
while True:
  n = (n + 1) % 4
  leds[n].toggle()
  pyb.delay(50)

Dans ce code, la variable n identifie la LED actuellement manipulée. A chaque itération de la boucle nous passons à la LED suivante (le signe % est l'opérateur "Modulus", retournant le reste de la division, aussi appelé reste de la division euclidienne). Cet opérateur permet de garder la valeur de n entre 0 et 3.

Ensuite, nous accédons à la Nième LED et nous modifions son état avec la méthode toggle. Si vous exécutez ce code, vous devriez voir toutes les LEDs s'allumer puis toutes les LEDs s'éteindre.

Bloc try finally

Un problème que vous pourriez rencontrer lorsque vous arrêtez puis redémarrer le script, c'est que les LEDs restent dans l'état du précédent fonctionnement, ruinant ainsi votre chorégraphie Disco préparée avec tellement de soin. Nous pouvons facilement corriger ce problème en éteignant les LEDs lorsque nous initialisons le script ET en utilisant ensuite un bloc try... finally. Lorsque vous pressez CTRL-C, Micro Python génère une exception VCPInterrupt. Les exceptions signifie généralement que quelque-chose s'est mal déroulé. Vous pouvez utiliser une commande try: pour "attraper" l'exception. Dans ce cas, il s'agit de l'arrêt du script provoqué par l'utilisateur, nous n'avons pas besoin d'attraper l'erreur mais juste d'informer Micro Python de ce qui doit être fait lorsque l'on quitte le script. C'est ce que réalise le bloc finally et nous l'utilisons pour faire en sorte que toutes les LEDs soient éteinte. Le code complet est:

leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
    l.off()

n = 0
try:
   while True:
      n = (n + 1) % 4
      leds[n].toggle()
      pyb.delay(50)
finally:
    for l in leds:
        l.off()

La LED 4 est spéciale

La LED bleue est spéciale. En plus de pouvoir l'allumer et l'éteindre, vous pouvez controler sont intensité en utilisant la méthode intensity(). Cette méthode accepte un nombre entre 0 et 255 qui détermine sa luminosité. Le script suivant fait en sorte d'allumer la LED bleue graduellement puis l’éteint pour recommencer.

led = pyb.LED(4)
intensity = 0
while True:
    intensity = (intensity + 1) % 255
    led.intensity(intensity)
    pyb.delay(20)

Vous pouvez appeler intensity() sur les autres LEDs mais elles peuvent uniquement être éteinte ou allumée. La valeur 0 permet de les éteindre... tout autre valeur (jusqu'à 255) l'allumera.

Cela ne fonctionne pas?

Il ne se passe rien

Il faut sauver votre programme dans le fichier main.py et suivre la procédure décrite dans Premier script.

Cela ne fonctionne toujours pas

Vérifiez attentivement votre programme, une erreur de syntaxe peut empêcher votre script de fonctionner correctement.

Tout recommencer

Il est facile de s'emmêler les pinceaux les premières fois.

Si vous éprouvez vraiment des difficultés, n'hésitez pas à tout recommencer.

Plus d'information

Nous aurons l'occasion de revenir plus en détails sur la commande des broches dans un autre tutoriel. En attendant, vous trouverez d'autres informations dans la documentation de Micro Python