dimanche 26 août 2018

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


N.B. Ce tutoriel a été mis à jour le 2 août 2019 (ajout d'informations concernant l'ESP32).

Il y a quelques semaines, nous nous sommes amusés à contrôler un moteur à courant continu par WiFi grâce à un ESP8266 ou un ESP32.

L'expérience d'aujourd'hui est dans le même ordre d'idées, sauf  que nous contrôlerons cette fois-ci un moteur pas à pas.

Une page web nous permettra de choisir le nombre de pas effectués par le moteur, la direction de sa rotation (horaire ou antihoraire) ainsi que le temps écoulé entre deux pas consécutifs (ce qui influencera évidemment la vitesse de rotation du moteur).

Matériel nécessaire

Un moteur pas à pas (j'ai utilisé un moteur bipolaire provenant d'une vieille imprimante), une carte de développement munie d'un ESP8266 ou d'un ESP32, un double pont en H (j'ai utilisé un module L298N),  et un accès à un réseau WiFi.

Préparation de l'IDE Arduino

L'IDE Arduino ne dispose pas par défaut des fichiers nécessaires pour programmer l'ESP8266 ou l'ESP32: si ce n'est pas déjà fait, vous pouvez consulter une marche à suivre détaillée pour l'ESP8266 ou pour l'ESP32.

Le circuit

Sans trop de surprise, le circuit est très similaire à celui que nous avions utilisé pour le contrôle d'un moteur électrique conventionnel, sauf que le moteur pas à pas accapare toutes les sorties du module L298N.

Dans le sketch (disponible un peu plus loin), j'ai supposé que le moteur pas à pas allait être contrôlé par les broches GPIO 4, GPIO5, GPIO 14 et GPIO 16­.

Voici le schéma du circuit pour le module ESP32 que j'utilise (sur cette carte, la broche GPIO 16 est identifiée par "RX2"):


Avec une petite carte Wemos D1 Mini, ça donne ça (la numérotation sur la carte n'est pas le numéro de GPIO: on utilise D2, D1, D5 et D0):


Et voici sur le schéma et les instructions pour un module ESP-12 programmé au moyen d'un convertisseur USB-TTL:

L'ESP8266 nécessite une alimentation de 3,3 V, ce qui est trop faible pour la plupart des moteurs pas à pas, d'où les deux alimentations distinctes.
  • 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, GPIO5, GPIO14 et GPIO16 de l'ESP8266 sont branchées à IN1, IN2, IN3 et IN4 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).



Le sketch

La fonction "construitPage()" retourne une chaîne de caractères contenant la totalité de la page web, en langage html.  Cette page web contient un champ qui permettra à l'utilisateur de déterminer de combien de pas il veut faire tourner le moteur, une paire de boutons radio permettant de choisir le sens de rotation, un champ permettant de choisir le délai en millisecondes entre deux pas consécutifs, et finalement un bouton "appliquer" qu'on clique pour que les nouveaux paramètres soient pris en compte par le microcontrôleur.

La fonction "gestionPage()" est appelée lors d'un clic sur le bouton "Appliquer".  Elle met à jour quelques variables globales en fonction des choix faits par l'utilisateur de la page web, et indique les paramètres choisis dans le moniteur série (ce qui sera surtout utile pour le débogage).

prochainStep() et gestionMoteur() sont responsable de faire tourner le moteur avec les paramètres spécifiés (j'ai choisi de ne pas utiliser la bibliothèque Stepper).


Le résultat

Au démarrage du programme, l'adresse de la page web construite par l'ESP8266 ou l'ESP32  est affichée dans le moniteur série.  Il suffit de coller cette adresse dans un navigateur web pour accéder à la page.


La page web vous permet de choisir le nombre de pas de la prochaine rotation du moteur, le sens de cette rotation, et le délai en millisecondes entre chaque pas.  Le moteur devrait se mettre à tourner lorsque vous cliquez sur le bouton "Appliquer".


Yves Pelletier   (TwitterFacebook)

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)

mardi 7 août 2018

Livre: Arduino, le guide complet, par J. M. Hugues

Arduino, le guide complet
par J.M. Hugues
Éditions First
628 pages
Publié en 2018

J'aimerais bien qu'on m'explique comment un livre intitulé "Arduino, a technical reference" peut s'affubler en français d'un  titre aussi pompeux et trompeur que "Arduino, le guide complet".  Bien que ce livre présente certaines qualités, il est très, très loin d'être complet.

Dans son introduction, l'auteur indique lui-même que le livre s'adresse à ceux "qui ont exploité le plus possible les livres d'initiation et les guides pratiques de création de projets".  J'en déduis que l'auteur n'a jamais eu la prétention d'avoir écrit un guide complet!

Je qualifierais plutôt ce livre de "référence complémentaire", car l'auteur choisit souvent d'insister sur des aspects qui ne sont pas abordés dans les autres livres portant sur l'Arduino.  L'aspect positif de ce choix, c'est que ça rend ce livre pertinent si vous avez déjà lu quelques livres sur l'Arduino.  Par contre, le choix des sujets traités semble parfois arbitraire, et j'ai vraiment eu l'impression de lire 3 ou 4 livres différents rassemblés dans un même volume.

La première partie (chapitres 2 à 6), beaucoup plus aride que ludique, pourrait s'intituler "Ce que vous n'avez pas vraiment besoin de savoir pour programmer l'Arduino". On y présente, par exemple,  les caractéristiques techniques des microcontrôleurs AVR, quelques éléments de langage assembleur, comment programmer l'Arduino en utilisant autre chose que l'IDE Arduino (que le traducteur appelle "l'atelier Arduino").  Bref, le genre de connaissances qui étaient peut-être nécessaires pour programmer un microcontrôleur AVR lorsqu'Arduino n'existait pas, mais qui ne le sont plus maintenant qu'Arduino existe.

Le chapitre 7 présente en détail les bibliothèques fournies avec l'IDE Arduino, en énumérant les classes et méthodes de chacune de ces bibliothèques. Il s'agit à mon avis d'une initiative intéressante, car je ne me souviens pas avoir vu ce genre de référence dans d'autres livres.  Mais puisqu'il s'agit, selon le titre, du guide complet sur l'Arduino, on peut s'étonner qu'il n'y ait nulle part une liste des fonctions régulières du langage Arduino (domme digitalWrite(), delay(), etc.). Je mentionnerais aussi que certaines des bibliothèques qui ne sont pas fournies avec l'IDE Arduino (et qui ne sont donc pas présentées dans le livre) sont beaucoup plus utilisées que des bibliothèques ultra spécialisées comme Esplora...

Les chapitres 8 et 9 empruntent un style radicalement différent de tous ceux qui ont précédé: ça devient un genre de catalogue qui énumère une très grande quantité de boucliers (shields) et capteurs pouvant être branchés à une carte Arduino. Ça peut permettre au débutant d'avoir une idée de ce qui existe sur le marché.  Toutefois, les descriptions sont extrêmement brèves, et sont totalement insuffisantes pour permettre d'utiliser ces produits lorsque vous en avez fait l'acquisition.

Pourtant, dans son introduction, l'auteur déclarait "En tant qu'ingénieur, je suis souvent déçu d'acheter quelque chose d'intéressant, pour devoir constater qu'il n'y a aucune documentation. Cela m'oblige à me lancer dans une longue quête afin de trouver un peu de documentation sur Internet, et dans une langue que je peux comprendre (donc par exemple pas en chinois)."  À mon avis, ces chapitres ne font absolument rien pour régler ce problème!  On trouve bien quelques schémas de circuit ici et là, mais la grande majorité des descriptions vous fournissent moins d'informations qu'une annonce typique sur eBay.

Finalement, les derniers chapitre du livre adoptent un autre style différent: il s'agit maintenant de présenter, de façon détaillée, 4 projets spécifiques: le Greenshield (un système de surveillance et de contrôle pour l'horticulture), le Switchinator (14 sorties programmables), un générateur de signal et un thermostat intelligent. Il s'agit de projets assez ambitieux, incluant la conception de circuits imprimés au moyen des logiciels Eagle et Fritzing.  C'est la partie du livre qui m'a semblé la mieux réussie.

Bien qu'on mentionne à quelques reprise que les fichiers de code source sont disponible "sur le site de l'éditeur ainsi que sur GitHub", l'url n'est fourni nulle part dans le livre.  Voici un lien direct.

Je termine par une courte liste d'erreurs ou de négligences qui me semblent un peu embarrassantes:

Page 340, dans un paragraphe consacré aux photorésistances: "Ils réagissent bien moins vite que les composants basés sur une diode ou un transistor, mais cela suffit à créer par exemple un jeu de lumière piloté par de la musique".  (Détecter de la musique au moyen d'une photorésistance me semble une véritable prouesse technique.)

Page 353, dans une brève explication du principe de fonctionnement d'un télémètre à ultrasons: "Il suffit de diviser par deux le délai entre l'émission et la réception pour connaître la distance. Cette mesure est possible parce que la fréquence des ultrasons est bien inférieure à celle de la lumière. Il n'est donc pas difficile de distinguer les deux moments, si le programme va suffisamment vite."  (La mesure du délai est possible parce que la vitesse des ultrasons est beaucoup plus faible que celle de la lumière, peu importe leur fréquence.)

Page 270, au sujet de la fabrication de nos propres shields pour Arduino: "Vous pouvez faire le vôtre avec une plaque à pastilles et les connecteurs appropriés que vous trouverez chez tous les fournisseurs. Je rappelle que les connecteurs des cartes Arduino sont à la norme industrielle de 2,54 mm d'espacement (un dixième de pouce). Tous les électroniciens possèdent ce genre de connecteurs dans leur stock de base".  (Cette distance de 2,54 mm  n'est pas respectée entre les broches 7 et 8, ce qui complique considérablement l'utilisation d'une plaque à pastilles conventionnelle).

En résumé: un livre sans véritable fil conducteur, pas du tout conseillé aux débutants et, contrairement à ce que prétend le titre, pas du tout complet!

Yves Pelletier   (TwitterFacebook)