samedi 30 janvier 2021

Envoi d'un email par l'ESP32

Dans certaines situations, il peut être intéressant de programmer un ESP32 pour qu'il envoie un email. Il pourrait s'agir, par exemple, d'un rapport quotidien vous indiquant les valeurs mesurées par ses capteurs, ou encore d'une alerte vous avisant qu'un événement inhabituel a été détecté.


Obtenir les paramètres du serveur SMTP utilisé

Pour l'envoi du email, l'ESP32 enverra des instructions à un serveur SMTP (Simple Mail Transfer Protocol). Pour ce faire, vous pouvez utiliser un compte email sur Gmail, sur outlook.com, etc. Pour programmer l'ESP32, vous aurez besoin de connaître l'adresse du serveur SMTP associé à votre compte email, ainsi que le numéro de son port.

Pour ma part, j'ai utilisé un compte outlook.com. En allant dans les paramètres (par l'entremise de la roue d'engrenage en haut à droite, puis en cliquant sur "Afficher tous les paramètres d'Outlook",j'ai accédé à la section "Courrier", puis "Synchroniser le courriel". À cet endroit, on m'informe que mon serveur SMTP est smtp.office365.com, et que le port est 587. Ces informations peuvent évidemment être différentes pour le compte email que vous aller choisir d'utiliser.


Installation de la bibliothèque

Par l'entremise du gestionnaire de bibliothèques de l'IDE Arduino, j'ai installé la bibliothèque ESP Mail Client par Mobizt.


En principe, cette bibliothèque fonctionne également avec l'ESP8266 (pourvu que le core ESP8266 soit de la version 2.6.3 ou plus récente). Malheureusement, je me suis buté à une erreur de compilation à chacune de mes tentatives de l'utiliser avec l'ESP8266.

Exemple de sketch

J'ai fait le sketch ci-dessous en utilisant, comme point de départ, l'exemple "Send_Text" fourni par l'auteur de la bibliothèque. Dans son exemple, l'auteur fait la démonstration d'à peu près tous les paramètres qui peuvent être modifiés. De mon côté, j'ai plutôt opté pour un sketch aussi bref que possible qui utilise généralement les valeurs par défaut, sans les modifier.

Dans ce sketch, je simule l'envoi de la mesure d'un capteur en générant un nombre aléatoire. Ainsi, vous pouvez facilement faire l'essai du programme sans qu'il soit nécessaire de brancher un véritable capteur à l'ESP32.

La fonction send_email() n'est exécutée qu'une seule fois, au démarrage du programme. Bien entendu, selon vos besoins, vous pouvez l'exécuter de façon périodique, ou lorsqu'un événement spécifique est détecté par un capteur.

Il va sans dire que, pour que le programme fonctionne, vous devez y écrire le nom et le mot de passe de votre réseau wifi, le login et le mot de passe de votre compte email, l'adresse email du destinataire, etc. (lignes 15 à 29).

-

-

Grâce à la fonction smtpCallback, à la fin du sketch, on peut suivre sur le moniteur série le processus d'expédition du email.


L'email a bel et bien été envoyé...et reçu!

À lire également

Ce blog comporte plusieurs autres projets impliquant l'ESP32, notamment l'écriture de données dans un document Google Sheets ou Google Docs.

Yves Pelletier (TwitterFacebook

dimanche 17 janvier 2021

Communication Bluetooth entre micro:bit et smartphone

Dans cet article, je vous décris comment j'ai pu établir une communication série via Bluetooth (BLE) entre une carte micro:bit et un smartphone (ou une tablette). Deux courts programmes faits dans MakeCode ont été testés avec succès: un premier programme qui envoie des données du micro:bit vers le téléphone, et un deuxième programme qui fait l'inverse.


Programmation dans MakeCode

Par défaut, quand vous commencez un nouveau projet dans MakeCode, les blocs permettant l'utilisation du bluetooth ne sont pas disponibles. Pour les faire apparaître, on clique d'abord sur "Avancé", au bas de la liste.


On clique ensuite sur "Extensions"...


On choisit l'extension bluetooth:


...et on accepte de renoncer à l'extension radio pour ce projet.


Une catégorie de blocs "Bluetooth" est maintenant disponible (attention: la plupart des blocs que j'ai utilisés sont dans la catégorie "plus" située juste en-dessous de "Bluetooth").



Sélection du mode d'appairage

En cliquant sur la roue d'engrenage en haut à droite, puis en sélectionnant "Paramètres du projet", il est possible de choisir le mode d'appairage.


Trois options sont proposées: aucun appairage requis, appairage "JustWorks" et appairage avec mot de passe. Pour la suite de mon expérimentation, j'ai utilisé le mode par défaut "JustWorks".

Premier exemple: le micro:bit envoie des données vers le téléphone

Dans ce premier exemple, le micro:bit envoie chaque seconde un message via bluetooth  (le message est un nombre qui augmente d'une unité à chaque seconde). Pour que ça fonctionne, il est important de démarrer le "bluetooth service uart" au début du programme.

Deuxième exemple: le micro:bit reçoit des données provenant du téléphone

Dans ce deuxième exemple, le micro:bit vérifie constamment l'arrivée d'un message via bluetooth. Chaque message reçu est affiché sur la matrice de LEDs du micro:bit. Ici encore, il est important de ne pas oublier le bloc "bluetooth service uart" au démarrage du programme.


Installation d'une appli de communication UART Bluetooth sur le téléphone

Pour mes tests, j'ai utilisé l'application Serial Bluetooth Terminal de Kai Morich sur ma tablette android. C'est loin d'être la seule option possible: il existe bien d'autres applications du même genre, et vous pouvez même programmer votre propre application android avec App Inventor si vous préférez.

Appairage du micro:bit avec le téléphone

(Rappel: mon micro:bit a été réglé pour un appairage de type "JustWorks"; la procédure est légèrement différente pour les autres types d'appairage).

Pour mettre la carte micro:bit en mode appairage, il faut d'abord appuyer simultanément sur les boutons A et B de la carte. Tout en maintenant les boutons A et B enfoncés, on appuie sur le bouton "reset", qui se trouve de l'autre côté de la garde, et on relâche le bouton reset.

Plusieurs LEDs de la matrice s'allument. Le logo bluetooth est momentanément affiché, puis les LEDs forment le motif ci-dessous. Le micro:bit est en mode appairage.



À cette étape, le nom du micro:bit devrait être visible dans la liste des appareils bluetooth disponibles, dans les paramètres du téléphone (bluetooth doit évidemment être activé sur le téléphone). Il s'agit de sélectionner ce nom dans la liste pour déclencher l'appairage.


Si tout va bien, la matrice de LEDs du micro:bit prend la forme d'un crochet, et le téléphone place le nom du micro:bit dans la catégorie "périphériques couplés".




Il semble nécessaire de refaire cette procédure chaque fois qu'on installe un nouveau programme sur le micro:bit, ou si le micro:bit a été mis hors tension.

Réglages de l'appli "Serial Bluetooth Terminal"

Dans le menu de l'appli "Serial Bluetooth Terminal", on sélectionne "Devices"...


...et on choisit notre micro:bit, visible sous l'onglet "Bluetooth LE".


Mise à l'essai du premier programme

Pendant que le micro:bit exécute le premier programme, l'application Serial Bluetooth terminal affiche chaque seconde le message qui a été envoyé par le micro:bit.


Mise à l'essai du deuxième programme

Si le micro:bit exécute le deuxième programme, il faut alors écrire un message dans le bas de la fenêtre de l'appli Serial Bluetooth Terminal, et l'envoyer en cliquant sur le bouton de droite. Le message envoyé à partir du téléphone va alors défiler sur la matrice de LEDs du micro:bit.


Et MicroPython?

Les fonctionnalités Bluetooth du micro:bit ne sont pas supportées par MicroPython!

À lire également

Mes autres articles portant sur la carte micro:bit:


Yves Pelletier (TwitterFacebook

mercredi 13 janvier 2021

Contrôler plusieurs servomoteurs avec le PCA9685

Certains projets de robotique nécessitent le contrôle simultanés de plusieurs servomoteurs: bras robotique, robot marcheur, etc. Pour ce genre de projet, un module PWM/Servo PCA9685 peut se révéler très utile.


Un seul de ces modules peut contrôler jusqu'à 16 servomoteurs simultanément, en n'utilisant que les deux broches I2C du microcontrôleur. Et si ce n'est pas suffisant, il est possible de connecter plusieurs modules PCA9685 au même microcontrôleur grâce à un système qui permet de modifier assez facilement l'adresse I2C. 


Le module comporte pas moins de 62 connecteurs, qu'il faut souder soi-même.

Du côté gauche de la photo, vous pouvez voir les connecteurs qui se branchent au microcontrôleur:

  • Broche GND - la masse
  • Broche OE - "output enable": permet de désactiver tous les servomoteurs en la mettant au niveau logique HAUT. Il n'est pas nécessaire de la brancher si on n'en a pas besoin.
  • Broche SCL - signal d'horloge I2C
  • Broche SDA - transfert de données I2C
  • Broche VCC - Alimentation logique: 5 V pour les microcontrôleurs qui fonctionnent à un niveau logique de 5 V, et 3,3 V pour les microcontrôleurs qui fonctionnent à un niveau logique de 3,3 V
  • Broche V+ : Alimentation des servomoteurs (5 V); ce connecteur est également présent sous la forme d'un bornier à vis.
La même série de connecteurs est répétée de l'autre côté du module, pour faciliter la connexion de plusieurs modules (au cas où votre projet nécessiterait plus que 16 servomoteurs).

Finalement, 16 groupes de 3 connecteurs permettent de branchement des servomoteurs, du canal numéro 0 (à gauche) jusqu'au canal numéro 15 (à droite).

J'ai testé le module sur les cartes suivantes: Arduino Uno, ESP32, ESP8266, STM32 Nucleo et STM32 Blue Pill. Dans chaque cas, il s'agit de connaître la position des broches I2C, et de prendre soint d'utiliser une alimentation VCC de même valeur que le niveau logique du microconrôleur.

Branchement du module PCA9685 à un Arduino Uno

  • Broche GND du module PCA9685 : Broche GND de l'Arduino
  • Broche SCL du module PCA9685: Broche A5 de l'Arduino
  • Broche SDA du module PCA9685: Broche A4 de l'Arduino
  • Broche VCC: sortie 5 Vde l'Arduino

Branchement du module PCA9685 à un ESP8266

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche GPIO 5 de l'ESP8266
  • Broche SDA du module PCA9685: Broche GPIO 4 de l'ESP8266
  • Broche VCC: 3,3 V

Branchement du module PCA9685 à un ESP32

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche D22 de l'ESP32
  • Broche SDA du module PCA9685: Broche D21 de l'ESP32
  • Broche VCC: 3,3 V


Branchement du module PCA9685 à un STM32 F103C8 "Blue Pill"

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche B6 de la Blue Pill
  • Broche SDA du module PCA9685: Broche B7 de la Blue Pill
  • Broche VCC: 3,3 V

Branchement du module PCA9685 à un STM32 Nucleo

  • Broche GND du module PCA9685 : GND
  • Broche SCL du module PCA9685: Broche SCL/D15 du Nucleo
  • Broche SDA du module PCA9685: Broche SDA/D14 du Nucleo
  • Broche VCC: 3,3 V

Installation de la bibliothèque PWM Servo Driver

J'ai ensuite installé la bibliothèque PWM Servo Driver par Adafruit dans l'IDE Arduino, ce qui peut être fait par l'entremise du gestionnaire de bibliothèques.

Exemple de sketch

Le sketch ci-dessous contrôle 3 servomoteurs respectivement branchés aux canaux 0, 1 et 2 du module (je ne disposais malheureusement pas de 16 servomoteurs). Le servomoteur branché au canal 0 fait un mouvement lent entre ses deux positions extrêmes, celui du canal 1 va plus vite dans un sens que dans l'autre, alors que celui du canal 2 prend une position aléatoire qui change toutes les deux secondes.

La méthode setPWM permet de régler la positon des servomoteurs. Puisque le signal PWM généré est de 12 bits, une période complète peut être séparée en 4096 valeurs différentes. Le premier paramètre indique le numéro du canal (de 0 à 15), le deuxième paramètre indique à quel moment le signal PWM devient haut (de 0 à 4095), et le troisième paramètre indique à quel moment le signal PWM devient bas (de 0 à 4095).

Par exemple, pwm.setPWM(2, 0, 160) règle le signal du canal 2 de façon à ce qu'il devienne haut au tout début d'un cycle (0/4095), et qu'il devienne bas à 160/4095 d'un cycle. Il s'agit donc d'un rapport cyclique d'environ 4%.

-

-

Vidéo

Voici finalement une courte vidéo qui montre le mouvement des trois servomoteurs.



Yves Pelletier (TwitterFacebook

samedi 9 janvier 2021

Communication RF 433 MHz avec RadioHead (Arduino, ESP32, ESP8266)

Dans cet article, nous établissons une communication radio à une fréquence de 433 MHz entre cartes Arduino , ESP8266 et ESP32. Il peut s'agir, par exemple, d'un Arduino Uno qui transmet des informations à un ESP8266,  d'un ESP32 transmettant des informations à un Arduino Nano, etc.


L'émetteur et le récepteur

Les modules utilisés sont vendus par paire: l'émetteur, de forme carrée, comporte trois broches: deux pour l'alimentation (VCC et GND) et une entrée pour le message à transmettre (DATA).

Le récepteur comporte 4 broches, mais les deux broches centrales (DATA) sont reliées ensemble, on utilise l'une ou l'autre pour recueillir le message capté. Les deux autres broches (VCC et GND) servent à alimenter le module.


Les deux modules comportent également un connecteur "ANT" qui permet d'ajouter une antenne.

Il est possible de brancher un émetteur et un récepteur au même microcontrôleur de façon à établir une communication bidirectionnelle. Dans les sketches ci-dessous, toutefois, je me contente d'une communication unidirectionnelle.

Installation de la bibliothèque RadioHead

Nous utiliserons la bibliothèque RadioHead qui, en plus d'être compatible avec les cartes Arduino "classiques", fonctionne également avec l'ESP32 et l'ESP8266 (ce qui n'était pas le cas de VirtualWire, le prédécesseur de Radiohead). Puisqu'elle ne semble pas disponible dans le gestionnaire de bibliothèque, vous devrez l'installer à partir du fichier zip disponible sur la page web de RadioHead.

Connexions de l'émetteur à un Arduino Uno

Si vous désirez émettre un message avec un Arduino Uno, l'émetteur sera branché de cette façon:
  • Broche VCC de l'émetteur : 5 V
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche 12 de l'Arduino

Connexions de l'émetteur à un ESP8266

Pour émettre à partir d'un ESP8266, l'émetteur est branché de la façon suivante:

  • Broche VCC de l'émetteur : 5 V
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche GPIO 5 de l'ESP8266

Connexions de l'émetteur à un ESP32

Pour brancher l'émetteur à un ESP32:

  • Broche VCC de l'émetteur : VIN (5 V)
  • Broche GND de l'émetteur: GND
  • Broche DATA de l'émetteur: broche D5 de l'ESP32

Connexion du récepteur à un Arduino Uno

Pour recevoir des données sur un Arduino Uno, vous connectez le récepteur de cette façon:

  • Broche VCC du récepteur:  5 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche 11 de l'Arduino

Connexion du récepteur à un ESP8266

Pour un ESP8266, le récepteur est branché de cette façon:

  • Broche VCC du récepteur:  3,3 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche GPIO 4 de l'ESP8266

Connexion du récepteur à un ESP32

Finalement, pour un ESP32, les branchements du récepteur sont:

  • Broche VCC du récepteur:  3,3 V
  • Broche GND du récepteur: GND
  • Broche DATA du récepteur: Broche D4 de l'ESP32


Exemple: sketch de l'émetteur

Le sketch ci-dessous émet un message chaque seconde (il s'agit d'un nombre entier qui augmente d'une unité à chaque émission, ce qui permet de constater si tous les messages arrivent à destination ou non). Le même sketch fonctionnera aussi bien sur une carte Arduino classique que sur un ESP32 ou un ESP8266.

-
-


Exemple: sketch du récepteur

Le sketch ci-dessous affiche dans le moniteur série le message radio reçu par le récepteur. Encore une fois, le même sketch s'applique à l'ESP32, à l'ESP8266 et aux cartes Arduino conventionnelles comme le UNO.

-
-




À lire également:


Yves Pelletier (TwitterFacebook

jeudi 7 janvier 2021

Mesurer la température avec le capteur interne du STM32

Les microcontrôleurs STM32 comportent un capteur de température intégré, qu'on peut utiliser afin d'obtenir une mesure de la température ambiante.


Le sketch ci-dessous est un exemple tiré du STM32Duino Wiki. Je l'ai testé avec une carte STM32F103C "Blue Pill" ainsi qu'avec une carte Nucleo F030R8, toutes les deux programmées avec l'IDE Arduino et le core STM32 officiel (voir ce précédent article pour des informations concernant l'installation du core STM32 officiel).

-

-


Dans mon cas, les valeurs mesurées étaient supérieures à la température ambiante de plusieurs degrés (la mesure était de 26°C alors que la température ambiante était d'environ 20°C). 

Pour calculer la température, le sketch utilise les constantes V25 (tension à 25°C) et AVG_SLOPE (variation de tension correspondant à une variation de température de 1°C). La valeur de ces deux constantes provient des fiches techniques des microcontrôleurs STM32, mais ces valeurs peuvent varier considérablement d'un spécimen à l'autre.

Comme le montre le tableau ci-dessus, la valeur de 1430 assignée à la constante V25 n'est qu'une valeur moyenne. Pour une carte en particulier, elle peut prendre n'importe quelle valeur située entre 1340 et 1520. On a assigné à la constante AVG_SLOPE une valeur typique de 4300, mais sa valeur réelle pour la carte que vous utilisez peut se situer n'importe où entre 4000 et 4600.

Si vous désirez obtenir des valeurs de température raisonnablement précises, il faudra modifier la valeur de V25 et de AVG_SLOPE (ce qui implique de mesurer VRef pour quelques valeurs de températures mesurées au moyen d'un thermomètre fiable).

À lire également:

Yves Pelletier (TwitterFacebook

dimanche 3 janvier 2021

Module GPS NEO 6MV2 et Raspberry Pi

Dans cet article, nous expliquons comment déterminer un position précise grâce à un module GPS NEO 6MV2 branché à un Raspberry Pi programmé en Python. En plus de déterminer la latitude et la longitude, nous situerons la position mesurée sur une carte Google Maps.

Nous avons déjà utilisé le module GPS NEO 6MV2 avec différents microcontrôleurs: lorsqu'on l'alimente avec une tension continue de 3,3 V il reçoit les signaux émis par des satellites de géolocalisation et émet continuellement des informations par communication UART.


Connexions

Le module GPS est branché au Raspberry Pi de la façon suivante:

  • Broche VCC du module GPS : Sortie 3,3 V du Raspberry Pi (broche 1)
  • Broche RX du module GPS : Pas branchée
  • Broche TX du module GPS: branchée à la broche RX du Raspberry Pi (broche 10)
  • Broche GND du module GPS: branchée à une broche GND du Raspberry Pi (broche 6)



Une fois alimenté, plusieurs minutes peuvent être nécessaire avant que module GPS dispose de suffisamment d'informations pour déterminer la position; lorsque c'est le cas, une LED bleu située sur le module GPS se met à clignoter.

Activation de la communication série

Par défaut, la communication série n'est habituellement pas activée sur le Raspberry Pi. Pour l'activer, il faut utiliser le menu Préférence - Configuration du Raspberry Pi.

Dans l'onglet "Interfaces", on active "Serial Port" et on désactive "Serial Console". 


Il faut ensuite redémarrer.

Identification du port série serial0

Une fois le port série activé, j'ai tapé cette commande dans le terminal:

ls -l /dev


Dans la longue liste qui est apparue en retour, j'ai pu constater que le nom du port série "serial0" était "ttys0", ce qui s'est avéré utile dans la rédaction des scripts en python. J'ai cru comprendre que le résultat peut être différent selon le modèle de Raspberry Pi.

Script 1: Affichage des données brutes

Je crois que la bibliothèque "pySerial" est installée par défaut dans le Rasbperry Pi OS. Si ce n'est pas le cas, vous pouvez l'installer avec pip:

pip3 install pyserial

Le script ci-dessous affiche les données brutes générées par le module GPS.

-
-


Ces données respectent la norme NMEA0183 de la National Marine Electronics Association. Sous cette forme, leur interprétation n'est pas facile et, pour cette raison, nous allons maintenant utiliser une bibliothèque spécialement conçue pour en extraire les informations les plus pertinentes.

Installation de la bibliothèque pynmea2

On peut facilement installer la bibliothèque pynmea2 avec pip:

pip3 instal pynmea2


Script 2: Affichage de la latitude et de la longitude

Grâce à la bibliothèque pynmea2, ce deuxième exemple affiche continuellement la latitude et la longitude.

-
-



Script 3: présentation de la position dans Google Maps

Finalement, ce 3e script montre la position mesurée sur une carte Google Maps.

-
-

Lors de l'exécution du script, le navigateur par défaut montre, dans un nouvel onglet, la position sur Google Maps.


À lire également:

Yves Pelletier (TwitterFacebook