Python sur des Micro-contrôleurs ESP8266

par Fabien Roca ·22/10/2019 · 3 vues
Python sur des Micro-contrôleurs ESP8266

Ce projet montre comment préparer son ordinateur pour travailler avec les microcontrôleurs de type ESP8266, ces derniers étant compatibles avec les langages C pour Arduino, blocs mais aussi le Python.

Les microcontrôleurs usuels du type Arduino (Atmega) sont souvent utilisés en bluetooth avec des applications générées via App Inventor. Le gros défaut est qu’il n’est pas possible de créer une application sur-mesure pour les téléphones à la pomme ou tout simplement certains ordinateurs dépourvus de ce type de connexion. L’avantage de l’ESP est la liaison wifi, il peut être tout simplement client ou serveur.


Télécharger tout d'abord le fichier microPython.7z fourni dans cette page.

Étapes du projet

  1. Étape 1

    Présentation des ESP8266

    Bien qu'il en existe différentes versions, vous pourrez utiliser la carte D1 car elle est au format Arduino UNO. Elle permet de brancher son matériel Arduino classique (Shield Grove, modules…) comme sur n'importe quelle carte UNO tout en bénéficiant de la puissance web d'une ESP8266. Elle est également compatible Arduino augmenté ou easycoding pour la programmation en blocs, avec l’environnement logiciel Arduino mais surtout ce qui va nous intéresser ici : avec Python.

  2. Étape 2

    Avantages et inconvénients

    Les cartes ESP8266 ressemblent énormément aux habituels Arduinos mais elles ne présentent pas les mêmes pins (ports ou GPIO). Un inconvénient est, sur la plupart, la présence d'un seul port analogique.

    En revanche, elles possèdent plusieurs ports séries et tous les ports numériques (digitaux) permettent la PWM (Pulse Width Modulation: nous verrons dans un autre projet son utilisation).

    Elles permettent aussi d'être des clients wifi (se connecter à des boxes, des partages de connexion...) mais aussi des serveurs et donc accueillir par exemple des petites pages web.

    Pour finir ces cartes possèdent de l'espace de stockage pour les programmes et les données. Appelé SPIFFS, cette mémoire varie suivant les modèles de 512 Ko à 4Mo.

  3. Étape 3

    Préparation matérielle et logicielle

    Préparation des ordinateurs :

    • Installer les pilotes et les bibliothèques pour les cartes ESP sur l’ordinateur Pilote CH340 :

    https://sparks.gogo.co.nz/assets/_site_/downloads/CH34x_Install_Windows_v3_4.zip 

    ou https://wiki.wemos.cc/downloads 

    • Télécharger le logiciel uPyCraft (fourni dans le kit ici en version 1.1):

    https://github.com/DFRobot/uPyCraft 

    ou http://docs.dfrobot.com/upycraft 

    Préférez télécharger le pack complet en début de projet.

    • Télécharger et installer le logiciel Python 3.8 si ce n'est pas déjà fait :

    https://www.python.org/downloads/ 

    Préparation du micro-contrôleur :
    Si celui-ci n’est pas prévu pour python initialement, il faudra installer le firmware téléchargeable à l’adresse :

    Il s’agit d’un fichier binaire de la forme :  esp8266-20190125-v1.10.bin

    Remarque: si vous utilisez un autre modèle, il vous faudra récupérer le firmware adapté.

    Lancer uPyCraft.exe puis vérifier la présence du port série ainsi que le bon type de carte microcontrôleur. 

  4. Étape 4

    Flash de l'ESP

    Choisissez alors les maillons de chaîne dans les boutons de droite afin de vous connecter à votre carte. Si jamais le firmware présent sur celle-ci n’est pas correct, une nouvelle fenêtre apparaît à l’écran et vous demande à nouveau de choisir le type de carte et le firmware à installer.

    Commencez par choisir uPyCraft puis Ok. Si une erreur vous est signalée, choisissez Users et allez chercher le firmware que vous avez téléchargé précédemment. Encore une fois, pas de panique, si vous ne choisissez pas le bon firmware une erreur vous sera signalée, sinon tout se lance et se "Burn".

  5. Étape 5

    Présentation de uPyCraft

    Le logiciel uPyCraft ne demande pas d'installation, il vous suffira de décompresser le dossier et de lancer l'exécutable.

    Il est composé de plusieurs parties permettant de programmer en python mais aussi d'interagir avec le microcontroleur. Il est important de noter que la version fournie dans ce sujet possède déjà des bibliothèque de capteurs mais aussi des exemples qui vous permettront d'avancer plus vite.


    Remarque : L’ESP, lorsqu’il est juste alimenté électriquement, lit en premier le fichier boot.py puis le fichier main.py si celui-ci existe. Si vous souhaitez donc réaliser un capteur embarqué, il est vous faudra nommer votre script en conséquence.


  6. Étape 6

    La base : allumer des Led

    Il faut tout d'abord trouver le nom des pins du microcontrôleur utilisé (NodeMCU, D1 Mini...) et préparer le câblage de chacune des "pattes" de la Led RVB. Il s'agit ici du seul cas où la broche la plus longue correspond à la masse. Ensuite chacune correspond à une couleur.

    Remarque: attention, il est possible de faire "griller" une seule couleur (souvent le rouge) si vous lui fournissez une trop haute tension et/ou un trop fort courant. Protégez vos Led avec des résistances entre 110 et 220 Ohms.

    Nous branchons pour commencer la plus longue pin à la broche G de l'ESP puis une broche directement à la pin D1 (on évitera la D0 celle-ci ayant d'autres fonctions). 


    Attention: Certaines LED ne sont pas à anode commune mais à cathode, il ne faut donc pas relier la grande pin à la masse (G) mais au + (3,3V).

    On voit que la D1 s'appelle GPIO5 donc on peut demander à uPyCraft de créer un nouveau programme tel que :

    import time #on importe la fonction temps

    from machine import Pin #on importe la possibilité de commander les pin de l'Esp

    led=Pin(5,Pin.OUT) #On définit notre Led comme connectée à la pin D1 (GPIO5)

    #On réalise une boucle infinie:

    while True:

    led.value(1)   #On allume la Led

    time.sleep(0.5)  #On attend une demie seconde

    led.value(0)   #On éteint la Led

    time.sleep(0.5)  #On attend une demie seconde

    #On recommence !

  7. Étape 7

    La suite : allumage progressif

    On a parlé au début du projet de PWM qui n'est rien d'autre qu'un signal alternant LOW et HIGH à haute fréquence. La LED est donc alternativement allumée et éteinte mais le cycle est tellement rapide que la persistance rétinienne nous donne l’illusion d’une LED allumée en permanence. Si la LED est allumée pendant 1ms et éteinte pendant 9ms, l’impression sera d'une luminosité de 10%. Le pourcentage de temps passé à l’état HIGH sur la période du signal est appelé le rapport cyclique (duty). Le rapport cyclique n’est pas donné de 0 à 100 mais de 0 à 1023. Il sera nécessaire de faire un produit en croix...

    1. Réalisons une boucle qui fera évoluer petit à petit ce rapport cyclique pour obtenir une luminosité maximale après environ 5 secondes

    from machine import Pin, PWM

    import time

    pwmB = machine.PWM(machine.Pin(5))

    pwmB.duty(0)

    pwmR = machine.PWM(machine.Pin(4))

    pwmR.duty(0)

    pwmV = machine.PWM(machine.Pin(0))

    pwmV.duty(0)


    for i in range(1024):

    pwmB.duty(i)

    time.sleep(0.005)


    2. Réalisons à présent une boucle infinie qui fera évoluer petit à petit ce rapport cyclique pour obtenir une luminosité maximale après environ 5 secondes puis une extinction progressive. Cela affectera chacune des couleurs les unes après les autres avant de recommencer.

    from machine import Pin, PWM

    import time

    pwmB = machine.PWM(machine.Pin(5))

    pwmB.duty(0)

    pwmR = machine.PWM(machine.Pin(4))

    pwmR.duty(0)

    pwmV = machine.PWM(machine.Pin(0))

    pwmV.duty(0)

    while True:

    for i in range(1024):

    pwmR.duty(i)

    time.sleep(0.005)

    for i in range(1023, -1, -1):

    pwmR.duty(i)

    time.sleep(0.005)

    for i in range(1024):

    pwmV.duty(i)

    time.sleep(0.005)

    for i in range(1023, -1, -1):

    pwmV.duty(i)

    time.sleep(0.005)

    for i in range(1024):

    pwmB.duty(i)

    time.sleep(0.005)

    for i in range(1023, -1, -1):

    pwmB.duty(i)

    time.sleep(0.01)

  8. Étape 8

    Mesure de température: Dallas 18B20

    Comme pour beaucoup de matériel dans nos ordinateurs, des drivers sont nécessaires pour faire fonctionner les capteurs. En langage de programmation, ces drivers sont appelés librairies. 

    On utilisera à nouveau la pin D1 et on veillera à placer une résistance de 4,7kOhms entre cette broche et l'alimentation (3,3V). 


  9. Étape 9

    Mesure de température: BMP 180

  10. Étape 10

    Mesure de température et Pression : BMP280

  11. Étape 11

    Mesure de Température et Humidité : DHT 11

    import dht, time

    import machine

    d = dht.DHT11(machine.Pin(4))

    while True:

      print(d.measure())

      print(d.temperature())

      print(d.humidity())

      time.sleep(3)

  12. Étape 12

    Mesure de Température et Humidité : DHT 22

  13. Étape 13

    Afficher des informations sur un afficheur LCD 16x2

  14. Étape 14

    [EN COURS] Capteur de distance HC-SR04

    #
    #                   Mesure de distance
    #
    # Programme permettant d’utiliser la librairie qui gere le capteur
    # de  distance ultrason HC-SR04
    # Tester sur NodeMCU Lolin et Wemos D1 mini
    #
    # Auteur iTechnoFrance
    #

    Connecter le VCC au Vin de l'ESP ainsi que le GND au GND de l'ESP, les pin Echo et Trigger doivent être connecter a des pin sur l'ESP (dans l'exemple GPIO04 et GPIO05).

    import hcsr04, time
    # pin_echo : pin pour mesurer la distance
    # pin_trig : pin pour envoyer les impulsions
    pin_echo = 4  # sortie D2 –> GPIO04
    pin_trigger = 5  # sortie D1 –> GPIO05
    # initialisation librairie HC-SR04
    hc_sr04 = hcsr04.HCSR04(pin_echo, pin_trigger)
    while True:
        distance = hc_sr04.distance_cm()
        if (distance == -1):
            print ("Mesure superieure à 4 metres")
        else:
            print ((distance), " cm ")
        time.sleep(1)


  15. Étape 15

    Détecteur de collision

    Sachant qu'il s'agit d'un capteur numérique (qui ne sort que 0 ou 1) sur la Pin OUT.

    Pour transformer une pin en entrée (lire un capteur) il faut utiliser la commande :

    Entree=Pin(5,Pin.IN)

    Et pour lire sa valeur, il vous suffit de taper :

    Entree.value()


    Exemple de code:

    import time

    from machine import Pin

    entree=Pin(5,Pin.IN)

    while True:  

      alume=entree.value()

      time.sleep(0.05)

      if alume==1:

        print("1")

      elif alume==0:

       print("0")

  16. Étape 16

    Détecter la pression sur un bouton poussoir

    On peut s'inspirer du détecteur de collision pour lire l'entrée d'une pin reliée à un bouton poussoir ou un interrupteur.

  17. Étape 17

    Utiliser un moteur à courant continu (DC)

  18. Étape 18

    Utiliser un Servo Moteur SG90

    from machine import Pin, PWM

    import time

    servo = machine.PWM(machine.Pin(5), freq=50)

    while True:

      time.sleep(1)

      servo.duty(40)

      time.sleep(1)

      servo.duty(115)

      time.sleep(1)

      servo.duty(77)

      time.sleep(1)

  19. Étape 19

    Utiliser un moteur pas à pas avec driver

  20. Étape 20

    Utiliser un GPS Neo6M

  21. Étape 21

    Mini Serveur : créer son propre point d'accès wifi.

  22. Étape 22

    Rejoindre un point d'accès Wifi et héberger une page html

  23. Étape 23

    Sitographie

Commentaires (0)

Aucun commentaire pour le moment.

Connectez-vous pour laisser un commentaire.

Collaborateurs