vendredi 10 août 2018

Moteur électrique contrôlé par WiFi (ESP8266 ou ESP32)

N.B.: Cet article à été mis à jour le 29 juillet 2019 (ajout d'informations sur l'ESP32).

C'est toujours amusant de jouer avec l'ESP8266 ou l'ESP32. Aujourd'hui, je vais y connecter un petit moteur à courant continu, qui pourra être contrôlé à distance à partir d'une page web.

Matériel

Nous utiliserons une carte comportant un ESP32 ou un ESP8266, un circuit intégré de type "pont en H" (L298, L293D ou autre) pour piloter le moteur, et un petit moteur électrique à courant continu.  Bien entendu, vous devez avoir accès à un réseau WiFi.

Pour ma part, lors du développement initial de ce projet, j'avais utilisé le module ESP-12, un module L298N et un moteur muni d'une boîte d'engrenages.  Un convertisseur USB-TTL fonctionnant à un niveau logique de 3,3 V a aussi été nécessaire pour la programmation de l'ESP8266.

Si vous disposez d'une carte de développement complète comportant un connecteur USB, c'est encore mieux.

Préparation de l'IDE Arduino

S'il s'agit de votre premier projet impliquant la programmation de l'ESP8266 ou de l'ESP32 avec l'IDE Arduino, ces tutos vous expliquent comment installer certains fichiers supplémentaires dans votre copie de l'IDE: version ESP8266 et version ESP32.

Circuit

Nous contrôlerons le sens et la vitesse de rotation du moteur grâce deux signaux PWM sur les broches GPIO4 et GPIO5 de l'ESP8266 ou ESP32. Le L298 et le moteur sont alimentés par une alimentation distincte de 5 V ou plus.

Le schéma ci-dessous montre le circuit pour une carte ESP32 (remarque: la disposition des broches sur la carte peut varier d'un modèle à l'autre). Ce schéma suppose que l'ESP32 est alimenté par USB.


Le schéma ci-dessous montre le circuit pour une carte Wemos D1R1 (comportant un ESP8266). Là encore, on suppose que la carte est alimentée par USB.


Voici finalement le schéma du circuit comportant un module ESP-12 que j'avais utilisé lors de la rédaction de la première version de ce billet. Ce circuit permet à la fois de programmer l'ESP8266 et d'utiliser le circuit de contrôle du moteur (cliquez sur le schéma pour l'agrandir).

L'ESP8266 exige une alimentation de 3,3 V, alors que le module L298 fonctionne avec au moins 5 V, d'où les deux alimentations distinctes.  De plus, l'ESP8266 est assez capricieux en matière d'alimentation: si cette dernière n'est pas impeccablement stable, il risque d'avoir un comportement imprévisible (c'est une bonne idée de placer un condensateur entre les deux bornes de la source de tension).
  • 3 broches de l'ESP8266 sont connectées à 3,3 V:  VCC, RST et CH_PD (aussi appelée "EN" sur certains modèles).
  • 2 broches de l'ESP8266 sont connectées à la masse:  GND et GPIO0.
  • La broche RXD de l'ESP8266 est reliée à la broche TX du convertisseur USB-TTL, et la broche TXD de l'ESP8266 est reliée à la broche RX du convertisseur USB-TTL.
  • Les broches GPIO4 et GPIO5 de l'ESP8266 sont branchées à IN1 et IN2 du module 298N, puisqu'elles sont responsables de contrôler le moteur.
  • Toutes les masses sont reliées ensemble (GND de l'ESP8266, du convertisseur USB-TTL et du module L298N).
Ne pas oublier de brancher la broche RST à la masse pendant quelques secondes juste avant de faire le téléchargement du sketch.

Sketch

Les bibliothèques pour l'ESP8266 ou l'ESP32 font l'essentiel du travail pour nous.  Essentiellement, le sketch construit une page web comportant 3 boutons radio permettant de sélectionner la vitesse du moteur (arrêt, lent et rapide), et 3 boutons radio permettant de sélectionner le sens de rotation (horaire ou antihoraire), et contrôle le moteur en fonction des paramètres de la page web lorsque l'utilisateur clique sur le bouton "Appliquer".

Le moteur se contrôle de la façon habituelle: il tourne dans un sens lorsque la broche GPIO4 est à l'état logique haut pendant que la broche GPIO5 est à l'état logique bas, et dans l'autre sens si c'est le contraire.  La vitesse du moteur se règle grâce à un signal PWM. Le signal PWM s'obtient par la commande analogWrite() sur un ESP8266, mais par LEDcWrite() sur un ESP32, ce qui m'a obligé à écrire des instructions différentes selon le microcontrôleur utilisé.

Évidemment, pour que ça fonctionne, vous devez mettre le nom de votre réseau Wifi ainsi que le mot de passe dans les variables "ssid" et "password" avant de le transférer dans l'ESP8266.

Résultats

Lors du démarrage de l'ESP8266 / ESP32, ouvrez le moniteur série de l'IDE Arduino afin de connaître l'adresse IP qui lui a été assignée.


Vous entrez ensuite cette adresse IP dans le navigateur web de n'importe quel appareil branché au même réseau local.


Une page web apparaît, présentant 3 boutons radio pour le réglage de la vitesse du moteur (arrêt, lent, rapide) et deux boutons pour le sens de rotation du moteur (horaire et antihoraire).  Le moteur devrait tourner selon vos spécifications lorsque vous cliquez sur le bouton "Appliquer".

Yves Pelletier   (TwitterFacebook)

8 commentaires:

  1. Bonjour, merci pour ce tuto , est ce que c'est faisable d'envoyer la vitesse de moteur puis tu va ralentir ou accélérer ce dernier suivant le valeur afficher sur la page .
    merci d'avance

    RépondreSupprimer
  2. Bonjour, je suis avec un esp32 le programme se compile mais impossible d'avoir une connexion. Il me semble aussi que la vitesse avec esp23 va de 0 à 255.
    Merci de ma donner de vos nouvelles

    Bien à vous

    Louis

    RépondreSupprimer
    Réponses
    1. Le pwm de l'ESP32 ayant été réglé à 10 bits (avec ledcSetup), les valeurs possibles vont de 0 à 1023. Ce serait de 0 à 255 si on l'avait réglé à 8 bits.

      Supprimer
  3. Bonjour, j'essaye d'utiliser ce programme avec un Arduino wifi rev 2 et ça coince à la vérification : message d'erreur : "server" was not declared in this scope

    RépondreSupprimer
    Réponses
    1. Le contraire serait surprenant. Puisqu'il ne s'agit ni d'un ESP8266 ni d'un ESP32, la ligne "WebServer server(80);" n'a jamais été exécutée.

      Supprimer
    2. Auriez vous une idée ? J'ai cherché à partir de la bibliothèque WiFiNINA sans succès.

      Supprimer
  4. bonjour, l'adresse ip quand je lance votre code est 0.0.0.0 savez vous pourquoi?

    RépondreSupprimer
  5. Bonjour et merci beaucoup pour ce tuto! Bravo. Peut-on ajouter une consigne horaire pour le démarrage du moteur pour telle ou telle action? Exemple: 20h30 moteur1 sens horaire pendant 10minutes.
    merci d'avance

    RépondreSupprimer