PyCom – Base du langage MicroPython

1. Les variables

 

1.1 Déclaration et initialisation

Pendant l’exécution d’un programme, les données qu’il manipule sont stockées en mémoire. Les variables permettent de manipuler ces données sans se préoccuper de leur position. Pour cela, il suffit de leur donner un nom (les déclarer).

En Python, la simple déclaration d’une variable ne suffit pas à la créer. Après avoir choisi son nom, il est nécessaire de lui affecter une valeur initiale (initialisation).
exvar1.py
position_x = 10 # variable de type entier
pi = 1.14159 # variable de type réel
hello = "Hello world !" # variable de type chaîne de caractère

1.2 Type des variables

Différents types d’information (entier (int), réel (float), chaîne de caractère (string), etc.) peuvent être placés dans une variable.

En Python, il n’est pas nécessaire de préciser le type d’une variable. Python est dit typé dynamiquement.

1.3 Copie de variables

Le contenu d’une variable var1 peut être placé dans var2.

exvar2.py
var2 = var1

1.4 Connaître le type d’une variable

Pour cela, on utilise les fonctions suivantes :

exvar3.py
type(nom_variable)
print(nom_variable)

1.5 Opérations

  • Sur les entiers (int) : addition (+), soustraction (-), multiplication (*), division (/), exposant (* *)
exvar4.py
var1 = 5
var2 = 1
var3 = var1 + var2 # résultat var3 = 6
  • Sur les réels (float) : addition (+), soustraction (-), multiplication (*), division (/), exposant (* *)
– exvar5.py
var1 = 5.2
var2 = 1.4
var3 = var1 + var2 # résultat var3 = 6.6

1.6 Variable sans valeur

On peut réinitialiser une variable en l’affectant d’une valeur vide avec le mot None.

2. Les types composites: chaînes, listes, tuples et dictionnaires

 

2.1 Les chaînes

En programmation, le texte s’appelle chaîne de caractères. Pour créer une chaîne, il faut encadrer le texte de guillemets ou d’apostrophes. Une chaîne de caractère est une collection de caractères indexés, le premier élément de la chaîne est repéré par la valeur 0.
Python ne fait pas la différence entre les apostrophes simples (‘) et doubles (“).

Exemple

exch1.py
maChaine = "Ceci est une chaîne de caractères"
  • Opérations
    • pour insérer une valeur dans une chaîne : utiliser %s à l’emplacement retenu.
    • pour associer des chaînes (concaténation) : utiliser l’opérateur +
    • pour répéter des chaînes : utiliser l’opérateur *

Exemple

exch1.py
monscore = 1000
mespoints = "Vous avez obtenu %s points"
print(mespoints % monscore)
 
texte1 = "Hello"
texte2 = " World"
texte3 = texte1 + texte2 # résultat texte3 = "Hello World"
texte3 = texte2*3 # résultat texte3 = " World World World
texte1[0] # correspond à 'H'

2.2 Les listes

Les listes sont des collections d’entiers, réels, caractères, chaînes, etc.
  • Opérations
    • pour connaître le nombre d’éléments dans une liste : len(nom_liste),
    • pour ajouter un élément à la fin : nom_liste.append(élément),
    • pour supprimer un élément d’une liste : del(nom_liste[position])
    • Afficher un ou des éléments d’une liste : print(nom_liste[position]) ou print(nom_liste[pos1:pos2])
exliste1.py
une_liste = ["Journal", 9, 2.714, "pi"]
print(une_liste) # résultat : ['Journal', 9, 2.714, 'pi']
len(une_liste) # résultat 4  
une_liste.append("fin") # résultat : ['Journal', 9, 2.714, 'pi', 'fin']
del(une_liste[2]) # résultat : ['Journal', 9, 'pi', 'fin']

2.3 Les tuples

Un tuple, ou n-uplet est une liste de constantes.
extp.py
tp = (1,2,4,8)
print(tp[2]) # Résultat : 4

2.4 Les dictionnaires

Dans les dictionnaires chaque élément est indexé par un élément choisi parmi les trois types simples. Il s’agit d’une sorte de matrice, 2 x n d’éléments simples, dont ceux de la première colonne réalisent l’index ou la clé d’accès au second.

  • Opérations
    • pour ajouter un élément dans le dictionnaire : nom_dic[clé] = valeur
    • pour supprimer un élément du dictionnaire : del nom_dic[clé]
    • Afficher un élément : print(nom_dic[clé])
exliste2.py
dic = {"computer":"ordinateur"}
dic["mouse"] = "souris"
dic[2] = "two" 
print(dic) # résultat : {'computer': 'ordinateur', 'mouse': 'souris', 2: 'two'}
del(dic["mouse"]) # résultat : {'computer': 'ordinateur', 2: 'two'}

3. Les instructions de contrôle : alternatives, répétitives

Les instructions de contrôle utilisent des opérateurs logiques et de comparaison.

  • Les opérateurs de comparaison

Les opérateurs de comparaison ==><>=!= permettent de réaliser les conditions placées dans les structures de contrôle.

Ne pas confondre l’opérateur d’égalité == avec l’opérateur d’affectation =

Exemple

exop.py
a >=5 # se traduit par a supérieur ou égale à 5
  • Opérateurs logiques
Les opérateurs notor et and sont utilisés pour combiner des conditions.

Exemple

exop.py
a >=5 and a<=10 # à placer dans un test comme dans l'exemple ci-dessous

3.1 Les tests (alternatives)

Ce type d’instruction permet au code de suivre différents chemins.

  • if … else …

Syntaxe

if condition:
   bloc de code 1 # si la condition est vraie alors on exécute le bloc de code 1
else:
   bloc de code 2 # sinon on exécute le bloc de code 2
Remarque : On dit du code décalé vers la droite qu’il est indenté. En Python l’indentation est fondamentale. Elle fait intégralement partie de la syntaxe du langage.

Exemple

extest1.py
a=5
if a<10:
   print("C'est vrai")
else:
   print("c'est faux")
  • if … elif … else …
On utilise elif lorsqu’il est nécessaire d’enchaîner plusieurs tests.

Syntaxe

if condition 1:
   bloc de code 1 # si la condition 1 est vraie alors on exécute le bloc de code 1
elif condition 2:
   bloc de code 2 # sinon si la condition 2 est vraie alors on exécute le bloc de code 2
else:
   bloc de code 3 # sinon on exécute le bloc de code 3
Remarque : elif est une concaténation de else if. On peut utiliser autant de elif que nécessaire.

Exemple

extest2.py
a=5
if a<0:
   print("a est positif est inférieur à 5")
elif a >=5 and a<=10:
   print("a appartient à [5,10]")
else:
   print("a est supérieur à 10") # Résultat : a appartient à [5,10]

=== 3.2 d’instruction permet au programme de répéter, de compter ou d’accumuler avec très peu d’instruction.

  • while …

Syntaxe

while condition:
   bloc de code # le bloc de code est exécuté tant que la condition est vraie
Attention : afin que la boucle puisse s’interrompre, il faut veiller à faire évoluer dans le bloc au moins une des variables intervenant dans la condition.

Exemple

exboucle1.py
compteur = 0 # Initialisation de la variable utilisée dans la boucle
while compteur < 10:
  print(compteur) # Résultat : 0 1 2 3 4 5 6 7 8 9
  compteur = compteur+1
  • for … in …
L’instruction for … in est une autre forme de boucle. Elle permet d’itérer sur une collection de données, telle une liste ou un dictionnaire.

Syntaxe

for nom_variable in collection:
  bloc de code

Exemple

exboucle2.py
ma_liste = ["chien", "chat", "souris", "cheval"]
for x in ma_liste:
  print(x) # A chaque itération x prend la valeur pointée dans la liste,  
           # la variable de boucle est gérée automatiquement.
           # Résultat : chien chat souris cheval

4. Les fonctions

En Python comme dans tous les langages de programmation, il est possible de découper le programme en blocs fonctionnels, appelés “fonctions” qui peuvent être appelées partout dans le code.

4.1 Déclaration et appel

def nomfonction(liste d'arguments) # Déclaration
  bloc de code
  return valeur
 
nomfonction(valeurs) # Appel

Exemple

exfonc1.py
def cube(x):    # Déclaration
  return x*x*x
 
cube(2) # Appel, résultat : 8

4.2 Variables locales et variables globales

Les arguments passés dans les fonctions sont des variables locales. Elles n’existent qu’à l’intérieur de la fonction contrairement aux variables globales déclarées dans le programme principal.

5. La programmation-objet

 

5.1 Les classes et les objets

Mot-clé : constructeur, attribut, méthode, propriété

Syntaxe

class nomClass:
  def __Init__(self): # constructeur
     pass # Évite de compléter la méthode
  def nomMethode1(self): # méthode
     pass

Exemple

exclass1.py
# Définition de la classe Elève
class Eleve:
    # Attribut de classe ou attribut statique
    _nb = 16 # Exemple d'utilisation, comptabilise le nombre maximum d'élèves 
 
    # Le constructeur définit et initialise les attributs de l'objet
    def __init__(self, nom, prenom, age):
        self.__nom = nom    # par la présence des "__" les attributs
                            # deviennent privés
        self.__prenom = prenom
        self.__age = age
        Eleve_nb -=1 # décrémentation de _nb lors de la création d'un objet
 
    # Respect du principe d'encapsulation : accès aux attributs avec des propriétés
    def Nom(self):
        return self.__nom
    def Prenom(self):
        return self.__prenom
    def Age(self):
        return self.__age
 
    # Méthodes
    def modifieAge(self,newAge):
        self.__age = newAge
    # Redéfinition de la méthode str héritée de object
    def __str__(self): 
        return "Elève : " + self.__prenom + " " + self.__nom + " " + str(self.__age) + " " + "ans"
 
    # Accès indirect par les méthodes
    Age = property(Age,modifieAge)
 
# Création des élèves
eleve1 = Eleve("Dupond", "Thomas",16)
eleve2 = Eleve("Durant","Benoît",17)
print(Eleve._nb) # Résultat = 14
 
# Exécution des méthodes sur les objets Elève
print(eleve1) # Appel de la méthode str
print(eleve2.Nom()) # Accès au champ privé __nom avec la propriété Nom 
print(eleve2)
# Première manière de modifier l'âge de eleve2
eleve2.modifieAge(18)
print(eleve2)
# Deuxième manière de modifier l'âge de eleve 2 en recourant à property
eleve2.Age = 17
print(eleve2)
Le mot-clé self est indispensable dès qu’il s’agit de faire référence à l’objet lui-même. Toutes les méthodes portant sur l’objet se doivent de le recevoir en paramètre.

5.2 L’association entre classes

La manière privilégiée pour permettre à deux classes de communiquer par envoi de messages consiste à rajouter aux attributs primitifs de la première un attribut référent de la seconde. La classe peut donc, tout à la fois, contenir des attributs et se constituer en nouveau type d’attribut. C’est grâce à se mécanisme de typage particulier que, partout dans son code, la première classe pourra faire appel aux méthodes disponibles de la seconde. Bersini

Exemple 1: Association unidirectionnelle * Diagramme de classe

Lecture du diagramme : chaque objet O1 est associé à un objet O2. La réciproque n’est pas vraie
exass1.py
class O2:
    def jeTravaillePourO2(self,x):
        print(x)
class O1:
    __lienO2 = O2() # lien d'association de O1 vers O2
    def jeTravaillePourO1(self,val):
        self.__lienO2.jeTravaillePourO2(val)
 
unO1 = O1()
unO1.jeTravaillePourO1(5)

Exemple 2: Association bidirectionnelle

  • Diagramme de classe
Lecture du diagramme : chaque oeuvre est associée à un ensemble d’exemplaires et chaque exemplaire est associé à une et une seule oeuvre.

5.3 Héritage et polymorphisme

  • Héritage
 class nomClasse(nomClasseMère) # nomClasse hérite de nomClasseMère
    pass # Évite de compléter la classe
  • Polymorphisme
L’appel de la méthode, redéfinie en fonction de la nature de la sous-classe sur laquelle cette méthode s’exerce s’appelle polymorphisme.

Exemple

expoly.py
# Dans l'exemple défini plus haut
# Redéfinition de la méthode str héritée de object
    def __str__(self): 
        return "Elève : " + self.__prenom + " " + self.__nom + " " + str(self.__age) + " " + "ans"

6. Import et from : accès aux bibliothèques Python

  • import
import est utilisé pour charger une bibliothèque dans le programme.
exbiblio1.py
import random
print(random.randint(1,10)) # exemple de résultat : 3
  • from … import
from … import évite de réécrire le nom de la bibliothèque lors de l’appel de la méthode.
exbiblio1.py
from random import * # on importe la bibliothèque complète
print(randint(1,10)) # exemple de résultat : 1
 
from datetime import datetime # On importe une seul méthode
datetime.now() # exemple de résultat : datetime.datetime(2019, 
1, 3, 20, 6, 18, 490635)

MicroPython

[Mise à jour le : 3/1/2019]

Introduction

Le Python des petits systèmes !

MicroPython est un langage de programmation, puissant et efficace, dérivé du Python 3 et qui a hérité d’une petite collection de bibliothèques.

MicroPython n’occupe que 256 Ko de mémoire de programme et 16 Ko de RAM, c’est idéal pour des microcontrôleurs et autres systèmes embarqués limités en ressources.

Exemples de carte à microcontrôleur

Pyboard v1.1 Wipy Flip&Click SAM3X Micro bit
MicroPython Pycom MikroElektronica BBC

Guide de mise en oeuvre

Welcome to the MicroPython Wiki!

These pages host community generated documentation and examples of the features of MicroPython and the pyboard. We welcome your contributions.

Are You a New User?

If so, here’s the basic stuff you need to read and know:

Dive Deeper

Community Contributed Projects to wet your appetite and spark ideas:

Libraries for External Devices

Usually you will want to connect different devices to your microcontroller, like sensors, displays, actuators and much more. Here you can find modules for different devices.

Official Accessories

  • Bluetooth module HC05
  • Drivers in the MicroPython source tree. These may be found under drivers:
    • NRF24L01 Provides two way checksummed radio communications with auto-retry in the 2.4GHz ISM band.
    • OneWire: generic driver for devices using the OneWire bus
    • CC3000 and CC3100: WiFi drivers
    • Display drivers: The official LCD touch display uses the LCD160CR controller. SSD1306 OLED devices are also supported.
    • DHT11 and DHT22 temperature and humidity sensors
    • SD card: supports SD cards connected by SPI bus.

Sensors

LED’s

Character Displays

Graphical Displays

Networking

  • Network Protocol: SNMP, tested WiPy only
  • MQTT A publish/subscribe protocol for the internet of things. Two projects:
    1. A « resilient » asynchronous client capable of coping with WiFi outages.
    2. Using a cheap ESP8266 as an interface, enables a target lacking a network interface (e.g. Pyboard) to be an asynchronous MQTT client.

General Code Examples

Asynchronous programming and device drivers

  • Cooperative scheduling using uasyncio Resources include a tutorial, drivers for debounced switches and pushbuttons with optional push, release, double-click and long press events, and a set of synchronisation primitives. It also provides a modification to uasyncio offering a way to write applications with improved realtime performance. Also supports low current draw applications.
  • HTU21D temperature/humidity sensor
  • IR Remote Control The file aremote.py supports IR remotes using the NEC protocol.
  • GPS An asynchronous driver for GPS devices which connect via a UART. Includes a class to enable the GPS chip’s behaviour to be altered (for hardware based on MTK3329/MTK3339 chips).
  • HD44780 LCD displays An asynchronous driver for these popular character-based displays.
  • Communicate via I2C Enables a Pyboard to communicate with another MicroPython device using I2C. The interface is a bidirectional UART-like stream I/O device. Of particular use with ESP8266 as it leaves the ESP8266 UART free.

Utilities

  • rshell Enables access to a MicroPython target via USB or a network connection. Enables maintenance of the filesystem using Unix-like commands. Also provides a REPL prompt.
  • Convert fonts to Python source A PC utility to convert ttf and otf files to MicroPython source which may optionally be frozen as bytecode. The file format is offered as a proposed standard.
  • data_to_py Converts an arbitrary binary data file to Python source which may be frozen as bytecode. This conserves RAM.
  • micropip A PC program for downloading MicroPython packages from PyPi. Runs under Python 3.2 or above. The package is put in a directory of your choice for subsequent transfer to target hardware.
  • WebREPL shell Provides remote MicroPython target REPL prompt, similar to « rshell connect telnet … », but over enabled WebREPL on the module. Provides raw mode in addition to https://micropython.org/webrepl/ normal and paste modes.
  • mp.js Execute remote MicroPython commands over WebREPL interface.
    $ node mp.js abcd 192.168.4.1 5**4**3
    542101086242752217003726400434970855712890625
    $

Structured Detail

References