jeudi 27 septembre 2018

ESP8266 / ESP32 et afficheur à base de TM1638

Note: Cet article a été mis à jour le 28 juillet 2019 afin d'ajouter des informations concernant l'ESP32.

J'aime bien l'afficheur "LED and KEY" à base de TM1638 qui comporte huit afficheurs numériques à 7 segments, 8 LEDs et 8 boutons. J'avais déjà eu l'occasion d'utiliser ce genre de module avec un Arduino, avec un ATTiny85, et avec un STM32 Nucleo.  Cette fois-ci, en prévision d'un projet d'horloge connectée dont je vous parlerai bientôt, c'est un module ESP8266 (ou ESP32) qui pilotera l'afficheur.


Installation de la bibliothèque dans l'IDE Arduino

J'avais espéré pouvoir utiliser la bibliothèque "tm1638" par Ricardo Batista qui fonctionne très bien avec une carte Arduino mais, malheureusement, elle semble incompatible avec l'ESP8266 (voir message d'erreur ci-dessous).




Je me suis donc résigné à utiliser la bibliothèque "ErriezTM1638" qui, elle, a fonctionné sans problèmes. Malheureusement, cette bibliothèque a été conçue pour utiliser le circuit intégré TM1638 dans n'importe quel circuit, plutôt que pour les cartes de type LED and KEY en particulier.  Pour cette raison, elle est beaucoup moins simple d'utilisation que la bibliothèque de Ricardo Batista.

Tous les sketches présentés dans la suite de ce billet nécessitent la présence de la bibliothèque ErriezTM1638.

Circuit

Si vous utilisez une carte de développement complète munie d'un connecteur USB (genre Wemos, NodeMCU, etc.), les 5 broches du module TM1638 sont branchés à la carte de la façon suivante:
  • La broche VCC du module TM1638 est branchée à 3,3 V.
  • Les la broche GND du module TM1638 est branchée à GND.
  • La broche STB du TM1638 est branchée à la broche GPIO 4 de l'ESP8266 ou de l'ESP32
  • La broche CLK du TM1638 est branchée à la broche GPIO 16 de l'ESP8266 ou de l'ESP32
  • La broche DIO du TM1638 est branchée à la broche GPIO 5 de l'EP8266 ou de l'ESP32
Le schéma ci-dessous montre les connexions pour une carte Wemos D1R1 (la position des broches peut être très différente sur une autre carte):


Le circuit ci-dessous montre les connexions sur ma carte de développement ESP32:


Les instructions suivantes vous seront utiles si vous utilisez un module ESP8266 qui ne fait pas partie d'une carte de développement (un ESP-12, par exemple):
  • La broche VCC du module TM1638 ainsi que les broches VCC, RST et CH_PD (ou "EN") du module ESP8266 sont branchées à 3,3 V.
  • Les la broche GND du module TM1638 et les broches GND et GPIO0 du module ESP8266 sont branchées à la masse.
  • 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.

Il ne reste plus que les 3 broches du module TM1638 qui servent à la communication des données:
  • La broche STB du TM1638 est branchée à la broche GPIO 4 de l'ESP8266
  • La broche CLK du TM1638 est branchée à la broche GPIO 16 de l'ESP8266
  • La broche DIO du TM1638 est branchée à la broche GPIO 5 de l'EP8266



Afficher des nombres

Pour afficher un nombre, la bibliothèque ErriezTM1638 met à notre disposition la fonction writeData().  Cette fonction nécessite deux arguments: le premier argument est un nombre qui indique la position du chiffre sur l'afficheur, alors que le deuxième argument est un nombre qui indique lesquels des 7 segments doivent être allumés.

Par exemple, le premier chiffre à gauche de l'afficheur occupe la position "0b00000000".  Si je désire y afficher le chiffre zéro, je dois allumer tous les segments sauf le trait central et le point, ce qui correspond au nombre "0b00111111".  La commande permettant d'afficher zéro à la première position à gauche de l'afficheur sera donc:

tm1638.writeData(0b00000000, 0b00111111);

Comme vous pouvez le constater, ce qui rend l'utilisation de la bibliothèque un brin compliquée, c'est que nous devons gérer nous-mêmes l'affichage des segments (ce que j'accomplis, dans le sketch ci-dessous, à l'intérieur de la routine "afficheChiffre").  De plus, l'adresse correspondant à la position du chiffre sur l'afficheur ne respecte aucune logique. Puisque le premier chiffre à gauche correspond à la position 0b00000000, on pourrait croire que le deuxième chiffre se trouve à l'adresse 0b00000001, mais non... 0b00000001 est l'adresse d'une LED et le deuxième chiffre de l'afficheur numérique se trouve plutôt à l'adresse 0b00000110 !

Voici donc un sketch qui affiche un nombre croissant sur l'afficheur numérique.


/**************************************************
Afficheur TM1638 pour ESP8266
Affichage d'un nombre à huit chiffres sur un module
LED & KEY branché à un ESP8266
https://electroniqueamateur.blogspot.com/2018/09/esp8266-et-afficheur-base-de-tm1638.html
Utilisation de la bibliothèque ErriezTM1638
Source: https://github.com/Erriez/ErriezTM1638
Documentation: https://erriez.github.io/ErriezTM1638
**************************************************/
#include <ErriezTM1638.h> // voir https://github.com/Erriez/ErriezTM1638
// Définition des broches liées au module LED & KEY
#define TM1638_CLK_PIN 16
#define TM1638_DIO_PIN 5
#define TM1638_STB0_PIN 4
// Création d'un objet TM1638
TM1638 tm1638(TM1638_CLK_PIN, TM1638_DIO_PIN, TM1638_STB0_PIN);
int compteur = 0;
void setup()
{
tm1638.begin();
tm1638.clear();
tm1638.setBrightness(3);
tm1638.displayOn();
}
void afficheChiffre(int rang, int valeur)
{
int leRang, laValeur;
switch (rang) {
case 1:
leRang = 0b00000000;
break;
case 2:
leRang = 0b00000010;
break;
case 3:
leRang = 0b00000100;
break;
case 4:
leRang = 0b00000110;
break;
case 5:
leRang = 0b00001000;
break;
case 6:
leRang = 0b000001010;
break;
case 7:
leRang = 0b000001100;
break;
case 8:
leRang = 0b000001110;
break;
}
switch (valeur) {
case 0:
laValeur = 0b00111111;
break;
case 1:
laValeur = 0b00000110;
break;
case 2:
laValeur = 0b01011011;
break;
case 3:
laValeur = 0b01001111;
break;
case 4:
laValeur = 0b01100110;
break;
case 5:
laValeur = 0b01101101;
break;
case 6:
laValeur = 0b01111101;
break;
case 7:
laValeur = 0b00000111;
break;
case 8:
laValeur = 0b01111111;
break;
case 9:
laValeur = 0b01101111;
break;
}
tm1638.writeData(leRang, laValeur);
}
void afficheNombre()
{
int reste;
// premier chiffre
afficheChiffre(1, compteur / 10000000);
// deuxième chiffre
reste = compteur % 10000000;
afficheChiffre(2, reste / 1000000);
// troisième chiffre
reste = reste % 1000000;
afficheChiffre(3, reste / 100000);
// quatrième chiffre
reste = reste % 100000;
afficheChiffre(4, reste / 10000);
// cinquième chiffre
reste = reste % 10000;
afficheChiffre(5, reste / 1000);
// sixième chiffre
reste = reste % 1000;
afficheChiffre(6, reste / 100);
// septième chiffre
reste = reste % 100;
afficheChiffre(7, reste / 10);
//huitième chiffre
reste = reste % 10;
afficheChiffre(8, reste);
}
void loop()
{
afficheNombre();
compteur ++;
delay(300);
}

Allumer des LEDs

Pour contrôler les 8 LEDs, on utilise encore la fonction writeData().  Le premier argument est la position de la LED (qui est, par exemple, "1" pour la première LED à gauche), et le deuxième argument est "1" pour allumer la LED, et "0" pour l'éteindre.

Le sketch ci-dessous allume les 8 LEDs à tour de rôle.


/**************************************************
Afficheur TM1638 pour ESP8266
Allume à tour de rôle les 8 LEDs du module LED & KEY
https://electroniqueamateur.blogspot.com/2018/09/esp8266-et-afficheur-base-de-tm1638.html
Utilisation de la bibliothèque ErriezTM1638
Source: https://github.com/Erriez/ErriezTM1638
Documentation: https://erriez.github.io/ErriezTM1638
**************************************************/
#include <ErriezTM1638.h> // voir https://github.com/Erriez/ErriezTM1638
// Définition des broches liées au module LED & KEY
#define TM1638_CLK_PIN 16
#define TM1638_DIO_PIN 5
#define TM1638_STB0_PIN 4
// Création d'un objet TM1638
TM1638 tm1638(TM1638_CLK_PIN, TM1638_DIO_PIN, TM1638_STB0_PIN);
void setup()
{
tm1638.begin();
tm1638.clear();
tm1638.setBrightness(3);
tm1638.displayOn();
}
void loop()
{
// on allume la première LED
tm1638.writeData(0b00000001, 1);
delay(1000);
// on éteint la première LED
tm1638.writeData(0b00000001, 0);
// on allume la deuxième LED
tm1638.writeData(0b00000011, 1);
delay(1000);
// on éteint la deuxième LED
tm1638.writeData(0b00000011, 0);
// on allume la troisième LED
tm1638.writeData(0b00000101, 1);
delay(1000);
// on éteint la troisième LED
tm1638.writeData(0b00000101, 0);
// on allume la quatrième LED
tm1638.writeData(0b00000111, 1);
delay(1000);
// on éteint la quatrième LED
tm1638.writeData(0b00000111, 0);
// on allume la cinquième LED
tm1638.writeData(0b000001001, 1);
delay(1000);
// on éteint la cinquième LED
tm1638.writeData(0b000001001, 0);
// on allume la sixième LED
tm1638.writeData(0b000001011, 1);
delay(1000);
// on éteint la sixième LED
tm1638.writeData(0b000001011, 0);
// on allume la septième LED
tm1638.writeData(0b000001101, 1);
delay(1000);
// on éteint la septième LED
tm1638.writeData(0b000001101, 0);
// on allume la huitième LED
tm1638.writeData(0b000001111, 1);
delay(1000);
// on éteint la huitième LED
tm1638.writeData(0b000001111, 0);
}

Détecter les boutons enfoncés

Pour détecter si un des 8 boutons est enfoncé, il s'agit d'utiliser la commande getKeys(), qui retourne un nombre à 32 bits dont la valeur dépend de la position du bouton enfoncé.  Si vous enfoncez le bouton "S1", getKeys() retourne "1", alors que si vous enfoncez le bouton "S2", getKeys() retourne 256 (je vous réfère au sketch pour connaître la valeur retournée par chaque bouton).

Si plusieurs boutons sont enfoncés simultanément, getKeys() retourne la somme des valeurs individuelles de chaque bouton.  Si vous enfoncez S1 et S2 en même temps, la valeur retournée sera donc 257 (qui vient de 1 + 256 ).

Le sketch ci-dessous affiche dans le moniteur série le nom du bouton enfoncé.


/**************************************************
Identifie le bouton pressé sur un module
LED & KEY branché à un ESP8266
https://electroniqueamateur.blogspot.com/2018/09/esp8266-et-afficheur-base-de-tm1638.html
Utilisation de la bibliothèque ErriezTM1638
Source: https://github.com/Erriez/ErriezTM1638
Documentation: https://erriez.github.io/ErriezTM1638
**************************************************/
#include <ErriezTM1638.h>
// Définition des broches liées au module LED & KEY
#define TM1638_CLK_PIN 16
#define TM1638_DIO_PIN 5
#define TM1638_STB0_PIN 4
// création d'un objet tm1638
TM1638 tm1638(TM1638_CLK_PIN, TM1638_DIO_PIN, TM1638_STB0_PIN);
void setup()
{
Serial.begin(115200);
tm1638.begin();
tm1638.displayOff();
tm1638.clear();
tm1638.setBrightness(3);
tm1638.displayOn();
}
void loop()
{
static uint32_t boutonsPrecedents = 0;
uint32_t boutons;
// Read 32-bit keys
boutons = tm1638.getKeys();
// Détection du bouton pressé
if (boutonsPrecedents != boutons) {
boutonsPrecedents = boutons;
if (boutons == 1) {
Serial.println("Bouton S1 enfonce");
}
if (boutons == 256) {
Serial.println("Bouton S2 enfonce");
}
if (boutons == 65536) {
Serial.println("Bouton S3 enfonce");
}
if (boutons == 16777216) {
Serial.println("Bouton S4 enfonce");
}
if (boutons == 16) {
Serial.println("Bouton S5 enfonce");
}
if (boutons == 4096) {
Serial.println("Bouton S6 enfonce");
}
if (boutons == 1048576) {
Serial.println("Bouton S7 enfonce");
}
if (boutons == 268435456) {
Serial.println("Bouton S8 enfonce");
}
}
}



À lire également:

Yves Pelletier   (TwitterFacebook)


dimanche 16 septembre 2018

Livre: Raspberry Pi et ESP8266

Raspberry Pi et ESP8266
Domotisez votre habitation
par Kevin Sartor
Éditions ENI, collection La Fabrique
256 pages
2018

Voici un livre dont le public cible est parfaitement défini: les bricoleurs qui souhaitent être guidés dans la réalisation d'un système domotique résidentiel constitué d'un Raspberry Pi communiquant par Wi-Fi avec un certain nombre de capteurs et d'actionneurs branchés à des modules ESP8266.

L'objectif: améliorer le confort du domicile tout en diminuant le gaspillage d'énergie,  grâce à un système réalisé soi-même à faible coût.

Vous y trouverez de précieux conseils qui vous permettront, par exemple, de surveiller votre consommation d'électricité, d'eau et de gaz, d'automatiser la ventilation d'une pièce en fonction de son degré d'humidité, de réaliser votre propre thermostat connecté, d'arroser automatiquement votre gazon (mais uniquement lorsqu'il en a besoin), d'être alerté par email lorsque vous avez oublié d'éteindre une lampe, etc.

Pour en arriver là, on vous présente:

  • Une introduction à la domotique: son historique, ses possibilités...
  • Un tour d'horizon des principaux compteurs domestiques (eau, gaz, électricité), et des capteurs et actionneurs qui peuvent être pertinents dans votre installation domotique (interrupteur à lame souple, photorésistance, capteur de température, de pression, d'humidité, détecteurs de présence, relais, moteurs, bipeurs, etc.)
  • La marche à suivre pour installer l'IDE Arduino et le configurer pour programmer un module NodeMCU (la carte de développement qui comporte un ESP8266).  
  • La marche à suivre pour configurer le Raspberry Pi 3 et y installer le logiciel Domoticz.
  • Des exemples de projets spécifiques incluant, bien entendu des schémas de circuit (Fritzing) et des sketches complets et correctement commentés.
Bien que ces projets présentent un certain niveau de complexité (on dépasse nettement le simple clignotement d'une LED...) il me semble que les informations sont suffisamment détaillées pour qu'un néophyte puisse se débrouiller sans disposer d'une très grande quantité de connaissances préalables en électronique ou en programmation.

Yves Pelletier   (TwitterFacebook)

samedi 8 septembre 2018

Servomoteur contrôlé par Wi-Fi (ESP8266 ou ESP32)

(N.B.: cet article a été mis à jour le 8 août 2019, pour assurer une compatibilité avec l'ESP32).

Il fallait s'y attendre: après avoir contrôlé un moteur à courant continu et un moteur pas à pas, je vous explique aujourd'hui comment j'ai procédé pour contrôler un servomoteur par Wi-Fi, à partir d'une page web.

Matériel

Nous utiliserons un petit servomoteur de type Tower Pro SG90 et un module ESP8266 ou ESP32. Sur la photographie ci-contre, vous pouvez constater qu'en fait j'ai utilisé une carte de développement Wemos D1 (dont je vous parlerai avec enthousiasme dans un futur billet) mais puisque le servomoteur n'occupera qu'une seule sortie de l'ESP8266, n'importe quel module ESP8266 devrait convenir (même le modeste ESP-01!).

Préparation de l'IDE Arduino

Dans l'hypothèse où il s'agirait de votre première occasion de programmer un module ESP8266 avec l'IDE Arduino, je vous réfère à un précédent billet qui vous fournit les instructions nécessaires à l'installation des fichiers requis. Pour l'ESP32, les informations pertinentes se trouvent plutôt ici.

Pour l'ESP32: installation d'une bibliothèque

Si vous utilisez un ESP8266, vous n'avez pas de bibliothèque à installer: la bibliothèque "Servo"  conventionnelle, installée par défaut dans l'IDE Arduino, fait parfaitement l'affaire. Si vous utilisez un ESP32, toutefois, vous devez installer une version de la bibliothèque Servo qui a été spécialement conçue pour l'ESP32. Heureusement, la syntaxe est la même peu importe la bibliothèque utilisée.

Circuit

Nous avons choisi d'utiliser la broche GPIO4 pour contrôler le servomoteur. Pour un seul petit servomoteur, on peu utiliser l'alimentation 3,3 V de la carte. Pour plusieurs servomoteurs, ou pour un servomoteur plus gros, il devient important d'utiliser une alimentation distincte (auquel cas, n'oubliez pas de relier une broche GND de la carte à la borne négative de l'alimentation du servomoteur).

Schéma du circuit pour une carte ESP32 (mais elles ne sont pas toutes identiques):


Schéma du circuit pour une carte Wemos D1 mini (la broche D2 de cette carte correspond à GPIO4):



Si vous utilisez plutôt un module ESP8266 et un convertisseur USB-TTL, 3 broches de votre module ESP8266 sont connectées à 3,3 V: VCC, RST et CH_PD (aussi appelée "EN" sur certains modules), et deux broches 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.

Il n'est évidemment pas nécessaire que la sortie utilisée pour le contrôle du servomoteur soit GPIO 04, puisque toutes les sorties de l'ESP8266 peuvent produire un signal PWM.

Sketch

Le contrôle du servomoteur se limite à l'utilisation de la fonction attach(), au démarrage, pour indiquer à quelle broche on l'a connecté, et la fonction write() pour modifier sa position. 

La fonction "construitPage()" retourne une chaîne de caractères contenant la totalité de la page web, en langage html.  Cette page comporte 3 boutons radio qui permettent à l'utilisateur de sélectionner 3 positions différentes du servomoteur.

Avant d'utiliser le sketch, vous devrez remplacer les astérisques par le nom de votre réseau Wi-Fi et le mot de passe qui permet d'y accéder.


/**********************************************************************
Contrôle d'un servomoteur au moyen d'une page Web.
ESP32 et ESP8266
https://electroniqueamateur.blogspot.com/2018/09/servomoteur-controle-par-wi-fi-esp8266.html
***********************************************************************/
// inclusion des bibliothèques utiles
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32
#include "WiFi.h"
#include <WebServer.h>
#endif
#include <Servo.h> // s'il s'agit d'un ESP32, il faut installer une version spéciale
// de la bibliothèque servo:
// https://github.com/RoboticsBrno/ESP32-Arduino-Servo-Library
// modifiez ces deux constantes pour qu'elles contiennent les caractéristiques de
// votre réseau Wifi
#define ssid "**********" // le nom (SSID) de votre réseau WiFi
#define password "**********" // votre mot de passe WiFi
// le servomoteur est contrôlé par les GPIO 4 de l'ESP8266
#define pinServo 4
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266
ESP8266WebServer server(80);
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32
WebServer server(80);
#endif
Servo monServo; //création de l'objet servo
// La variable qui indique la position désirée pour le servomoteur (dépend du bouton coché sur la page web)
String positionSTR = "1"; // peut prendre les valeurs 1, 2 ou 3.
/* La fonction construitPage retourne un string qui contient toute notre page web */
String construitPage() {
String bouton1Str, bouton2Str, bouton3Str;
// pour que le bon bouton demeure coché:
if (positionSTR == "1") {
bouton1Str = "checked";
}
if (positionSTR == "2") {
bouton2Str = "checked";
}
if (positionSTR == "3") {
bouton3Str = "checked";
}
String page = "<html lang=fr-FR><head>";
page += "<title>ESP8266 Servomoteur</title>";
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
page += "</head><body><h1>ESP8266 Servomoteur</h1>";
page += "<form action='/' method='POST'>";
page += "<h3>Position du servomoteur:</h3>";
page += "<p><INPUT type='radio' name='position' value='1' " + bouton1Str + ">A";
page += "<INPUT type='radio' name='position' value='2' " + bouton2Str + ">B";
page += "<INPUT type='radio' name='position' value='3' " + bouton3Str + ">C</p>";
page += "<INPUT type='submit' value='Appliquer'><br><br>";
page += "</body></html>";
return page;
}
/* La fonction gestionPage modifie les caractéristiques du moteur si le bouton
Appliquer a été cliqué. */
void gestionPage() {
if ( server.hasArg("position") ) {
positionSTR = server.arg("position");
Serial.print("Commande recue. Position: ");
Serial.println(positionSTR);
gestionMoteur();
}
server.send ( 200, "text/html", construitPage() );
}
/* Contrôle du servomoteur */
void gestionMoteur() {
int laPosition;
if (positionSTR == "1") {
laPosition = 30;
}
if (positionSTR == "2") {
laPosition = 90;
}
if (positionSTR == "3") {
laPosition = 150;
}
monServo.write(laPosition);
}
void setup() {
monServo.attach(pinServo);
// pour affichage dans le moniteur série
Serial.begin ( 115200 );
// initialisation de la communication WiFi
WiFi.begin ( ssid, password );
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 ); Serial.print ( "." );
}
Serial.println ( "" );
Serial.print ( "Maintenant connecte a " );
Serial.println ( ssid );
Serial.print ( "Adresse IP: " );
Serial.println ( WiFi.localIP() );
// On indique le nom de la fonction qui gère l'interraction avec la page web
server.on ( "/", gestionPage );
server.begin();
Serial.println ( "Serveur HTTP en fonction" );
}
void loop() {
server.handleClient();
}

Résultat

Il est utile d'afficher le moniteur série lors du démarrage du sketch, car vous y trouverez l'adresse IP du module ESP8266.



Il s'agit de coller cette adresse dans un navigateur web ayant accès à votre réseau Wi-Fi pour afficher la page web qui permet de contrôler le servomoteur.

Pour un contrôle plus fin de la position du servomoteur, vous pouvez bien sûr ajouter des boutons supplémentaires,  les remplacer par un champ texte dans lequel l'utilisateur entrera directement l'angle désiré en degrés ou encore les remplacer par un contrôle qu'on fait glisser avec la souris.

Yves Pelletier   (TwitterFacebook)

dimanche 2 septembre 2018

Livre: Arduino, Apprivoisez l'élecronique et le codage



Arduino: Apprivoisez l'électronique et le codage
par Jean-Christophe Quetin
Éditions ENI (Collection La Fabrique), 2018
428 pages

Il est difficile de ne pas s'enthousiasmer devant la jeune collection "La Fabrique" des Éditions ENI, qui comporte déjà quelques bons ouvrages sur l'Arduino.  Certains sont très spécialisés (je pense entre autres à Arduino: Faites-le jouer au train, à paraître en octobre) ou s'adressent à un public déjà expérimenté (Arduino: S'exercer au prototypage électronique de Cédric Doutriaux).

"Arduino: Apprivoisez l'électronique" par Jean-Christophe Quetin entrerait plutôt dans la catégorie "manuel général à l'usage du débutant".  Le genre de livre que vous achetez au moment où vous souhaitez vous initier à l'Arduino, et auquel vous continuerez de vous référer à mesure que vous progresserez dans le domaine.

Je le recommande aux débutants, puisqu'il ne présuppose pas de connaissances préalables en électronique ou en programmation.  Si vous ne savez pas faire la différence entre une LED et un condensateur, ça vous sera expliqué.  Vous n'avez pas la moindre idée de ce que signifie l'expression "digitalWrite(LEDROUGE, HIGH);"?  On va vous l'expliquer aussi.  Environ la moitié du livre est consacrée aux concepts de base et à des projets simples impliquant essentiellement des LEDs, des boutons et des potentiomètres.  De plus, tout le langage Arduino est résumé de façon bien ordonnée dans le dernier chapitre.

La deuxième moitié du livre est consacrée à des capteurs et actionneurs plus spécialisés, mais très largement utilisés: photorésistance, capteur de température, télémètre à ultrasons, moteurs, afficheurs, cartes SD, etc.  Les différentes façons d'établir une communication entre deux cartes Arduino sont regroupées dans un même chapitre: I2C, liaison série, bluetooth, radio 433 MHz, infrarouge, ethernet, Wi-Fi (mais rien sur le populaire NRF24L01, toutefois).  On vous présente aussi quelques alternatives au classique Arduino Uno, comme l'ESP8266, l'ATTiny85 ou la fabrication de votre propre clone d'Arduino Uno.

Bref, de quoi vous occuper pendant plusieurs mois, jusqu'à ce que vous ne soyez plus du tout débutant.

Vous me ferez peut-être remarquer (avec raison) que des livres pour s'initier à l'Arduino, il y en a déjà bien d'autre.  Alors celui-ci, qu'est-ce qu'il a de particulier?
  • L'approche pédagogique est efficace et élégante.  Le lecteur acquiert progressivement de nouvelles connaissances en réalisant une suite de mini-projets concrets ordonnés de façon logique.  Chaque nouveau projet est une occasion d'apprendre un nouvel élément. Par exemple, les conditions (if, switch...case) et les différents types de boucles (while, do...while, for...) sont présentées au moment où elles se révèlent utiles dans un projet qui consiste à varier la luminosité d'une LED par PWM;  les tableaux (arrays) sont expliqués au moment de jouer une mélodie avec la fonction tone;  les registres à décalage sont présentés au moment de piloter un afficheur à 7 segments.  En ce qui me concerne, ce mode d'apprentissage est optimal.
  • Il va droit au but.  Vous y trouverez les informations nécessaires pour faire fonctionner les montages courants (incluant un schéma Fritzing et un exemple de code), mais les digressions non-essentielles sont rares. Avantage ou inconvénient?  Ça dépend du lecteur.  Je suppose que certaines personnes pourraient regretter l'absence de certaines informations complémentaires.
  • Les projets présentés sont très classiques: simulation de feux de circulation, jeu Simon (mémorisation musicale)...ce sont des applications éducatives déjà bien éprouvées qu'on retrouve dans d'autres livres et, bien sûr, sur de nombreux sites internet.  Au départ, je croyais que le "piano banane" était une création de l'auteur, mais non: Google m'a prouvé qu'il s'agit d'un projet bien connu déjà réalisé par des tas de gens.  L'auteur n'a pas tenté d'être original à tout prix en proposant un "piano raisin" ou des feux pour piétons contrôlables par une banane, si vous voyez ce que je veux dire.  Pour cette raison, j'hésiterais à conseiller ce livre à quelqu'un qui possède déjà d'autres livres sur l'Arduino.  (Seule exception notable:  11 pages sont consacrées à la Kitco, petite console de jeu dont je ne me souviens pas avoir entendu parler auparavant, et qui se voit ici accorder autant d'importance que l'ATTiny85,  l'ESP8266 ou le Leonardo.)
  • Le style de codage est uniforme tout le long du livre: les commentaires ainsi que les noms des variables et des routines sont en français; le nom des constantes est en majuscule et le noms des variables est en minuscules, etc. 
  • Comme les autres livres de la même collection, il a été écrit en français par un auteur francophone. En pratique, ça n'ajoute peut-être rien à la qualité intrinsèque de l'ouvrage, mais ça me semble quand même plus sympa que la traduction d'un livre précédemment publié dans une langue étrangère.
Pour terminer, je souligne quelques imperfections mineures:
  • J'ai remarqué à plus d'un endroit l'utilisation de l'expression "un courant de 5 V". Hérésie!!! (C'est bien sûr la tension qui est de 5 V.  Le courant, lui, se mesure en ampères.)
  • Je doute fortement que quelqu'un qui ne sait pas déjà comment piloter un moteur pas à pas avec une carte Arduino puisse apprendre à le faire en lisant les quelques lignes qui sont consacrées à ce sujet...il n'y a ni schéma de montage, ni indication sur la façon de brancher le moteur. C'est d'autant plus troublant que, dans les pages précédentes, le moteur à courant continu et le servomoteur sont couverts adéquatement.
  • Dans la version imprimée, les schémas Fritzing ne sont pas en couleur, ce qui complique parfois l'interprétation des schémas les plus complexes.
Si vous le désirez, vous pouvez feuilleter le livre sur le site web de la maison d'édition.

Yves Pelletier   (TwitterFacebook)