Recycler une voiture télécommandée (RC Car) avec un ESP8266, Shield Motor Wemos d1 mini et Blynk • Domotique et objets connectés à faire soi-même

ku1xy63hk64slxdluh2u-6038021
eqafe2r182ebjbpmcdzn-3833070

Pour ce nouveau projet, je vous propose de recycler une voiture télécommandée en remplaçant le récepteur radio par un ESP8266. Les moteurs seront contrôlés à l’aide d’un shield Motor pour Wemos d1 mini présenté dans cet article. Vous avez certainement une vieille voiture télécommandée qui traine à la maison. La télécommande ne fonctionne plus ou elle a été perdue.

Pour ce projet, nous allons retirer le circuit imprimé qui contient le récepteur et les commandes des moteurs. Nous conserverons uniquement les moteurs et bloc de piles qui servira à alimenter en énergie les 2 moteurs. Pour ce tutoriel, j’ai utilisé un modèle de voiture télécommandée équipé d’un moteur pour l’orientation des roues avant. La télécommande sera remplacée par une tablette ou un smartphone à l’aide de l’application et de la librairie Blynk. Si vous n’avez pas de vielle voiture télécommandée, nous adapterons le programme dans un prochain tutoriel pour un kit RC Car.

Matériel utilisé

Pour ce projet, je vous propose d’utiliser le shield Motor pour Wemos d1 mini. Elle vient s’empiler sur l’ESP8266 ce qui permet d’obtenir un montage très compact. Ls moteurs seront alimentés à l’aide de l’ancien bloc de piles. La Wemos sera alimentée à l’aide d’un batterie LiPo. Ici, j’ai utilisé une batterie de 1100mAh. Je vous conseille d’utiliser le shield Battery (présenté ici) ou utiliser une Power Bank.

Comme c’est un projet de voiture télécommandée, il y a forcément des options :-).

svkjgiirbbit324qmk2w-8095846 Chargeur pour batterie LiPo avec connecteur micro USB.

environ 2,20€

mht1wwqstt4girq1eknw-9213605 Câble de remplacement avec connecteur JST XH2-2.54mm

environ 0,23€ le cable

Base double.

Environ 0,95€

Kit connecteur pour jumper Dupont

Environ 4,17€ la boite de 310 pièces

Power Bank. Vous pouvez également alimenter la Wemos par une batterie délivrant une tension de 5V servant habituellement à  recharger un smartphone ou tablette en voyage

A partir de 12€

Attention. Le firmware n’est pas correctement installé sur de nombreux clones. Je vous conseille d’acheter directement ce shield sur la boutique officielle de Wemos CC ici.

Pourquoi ne pas utiliser un pont en H L293D ?

Effectivement, si vous ne voulez pas investir dans un shield Motor, il est tout à fait possible d’utiliser un pont en H, par exemple le L293D. Le prix de revient est équivalent. Par contre au niveau de la mise en oeuvre, ça n’a rien à voir ! Sur le shield Motor, vous n’aurez que 6 fils à brancher. L’alimentation électrique en provenance du bloc de piles et 2 fils par moteur. Vous n’aurez même pas besoin de jumpers. Vous pourrez recycler les anciens fils (s’ils sont assez long évidemment). Enfin dernier avantage, le shield Motor est déjà correctement câblé pour délivrer toute la puissance au moteur.

Sur un L293D, il faudra brancher une alimentation électrique complémentaire (par exemple une pile 4.5V) sur la broche 8 (VCC2) pour délivrer suffisamment de puissance aux moteurs. La Wemos d1 mini ne délivre pas assez de puissance pour faire fonctionner les moteurs correctement. La broche 16 sert uniquement à alimenter le pont en H. Vous pouvez la relier à la sortie 5V de la Wemos. Enfin, n’oubliez pas de brancher la masse de la batterie à la masse de la Wemos.

Repérage des broches du pont en H L293D

Enable pin pour Moteur 1. Actif sur état Haut
Alimentation électrique des Moteurs. 9 à 12V (jusqu’à 36V)
Enable pin pour Moteur 2. Actif sur état Haut
Alimentation 5V du pont L293H (jusqu’à 36V)

Préparation de la voiture télécommandée

La première chose à faire est donc de démonter l’ancien circuit. Le plus difficile est le démontage. Dans mon cas, la carrosserie était collée au chassis. Coupez tous les câbles au plus près du récepteur radio.

Circuit ESP8266

Pour connecter les anciens câbles au shield Motor, vous pouvez utiliser un kit de connecteur Dupont. Voici le montage terminé.

J’ai utilisé une base double pour limiter la hauteur de l’assemblage. Il n’y a pas de position particulière à respecter. La Wemos d1 mini peut être placée aussi bien à droite qu’à gauche. Le Shield Motor n’est pas livré avec des connecteurs à empiler,, elle a pris place au dessus de la Wemos. Le shield Battery sur l’emplacement libre avec la Led. Une Led verte de 5mm de diamètre pouvant supporter une tension d’alimentation comprise entre 3 et 3.4V, il n’est pas utile de réduire la tension délivrée par la Wemos d1 mini (3.3V).

Projet Blynk

Lancez Blynk sur votre smartphone ou tablette. Si vous disposez d’un serveur local, connectez vous à celui-ci en modifiant la source comme indiqué sur la copie d’écran ci-dessous.

dolsp2xa2lscbpsdg1ra-7377050

Créez un nouveau projet. Dans la liste Device, sélectionnez ESP8266. Dans la liste Connexion Type, choisissez WiFi.

Placez ensuite 4 boutons. Choisissez le mode Push. La valeur est maintenue jusqu’au relâchement de celui-ci. Voici les variables virtuelles utilisées dans le code Arduino :

  • V1 : avancer
  • V2 : reculer
  • V3 : droite
  • V4 : gauche

Placez enfin un slider (V0). Cochez Send values on release only, ce qui permet de n’envoyer la valeur de la consigne qu’au moment du relâchement du slider. La borne maximale ne doit pas excéder 100 (%).

Voici le projet obtenu

Code Arduino / ESP8266

Pour ce projet, nous allons inclure les 3 librairies suivantes :

#include 
#include 
#include "WEMOS_Motor.h"

Les variables suivantes permettent de définir

  • la consigne de la puissance du moteur de propulsion
  • la broche sur laquelle est branchée la Led qui indique l’état de connexion au serveur Blynk
  • les paramètres de connexion au réseau WiFi
  • le token du projet Blynk
// Vitesse exprimée en % de la puissance - Speed depend % of the power
int _speed = 25;  // %
int STATUS_BLYNK = D4;  // Etat connexion serveur Blynk - Blynk connexion status

// Vos paramètres de connexion WiFi - Your WiFi credentials.
char ssid[] = "yourSSID";
char pass[] = "yourPassword";

// Jeton Blynk - Blynk Token
char auth[] = "b065eb0a6e36434da42367b3fa7c3340";

Maintenant, nous allons créer deux objets qui permettent de contrôler les moteurs

Motor M1(0x30,_MOTOR_A, 1000);//Motor A - Direction
Motor M2(0x30,_MOTOR_B, 1000);//Motor B - Propulsion

Dans la boucle setup, on initialise la sortie de Led et on lance la connexion au serveur Blynk local. Si vous n’utilisez pas un serveur Blynk local, supprimez simplement les deux derniers paramètres (IP du serveur Blynk local et port).

void setup() {
  Serial.begin(115200);
  
  // Initialise la Led indiquant l'état de connexion au serveur Blynk - Init status Led inidcating Blynk connexion status
  pinMode(STATUS_BLYNK, OUTPUT);
  digitalWrite(STATUS_BLYNK, LOW);
  
  // Authentification auprès du serveur local Blynk - Authenticate to Blynk Private Server
  Serial.println("Connecting Blynk");
  Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,24), 8442);
}

La boucle loop est très simple. On appel simplement à chaque passage Blynk. On vérifie que l’on est toujours connecté au serveur Blynk. Si c’est le cas, on allume la Led. Dans le cas contraire, on l’éteint.

void loop() {
  Blynk.run();
  // Actualise la Led indiquant l'état de connexion au serveur Blynk - Update Blynk led Status
  if (Blynk.connected()){
    digitalWrite(STATUS_BLYNK,HIGH);
  } else {
    digitalWrite(STATUS_BLYNK, LOW);
  }
}

Maintenant il ne reste plus qu’à gérer les commandes de pilotage :

  • V0 : ajuste la puissance moteur entre 0 et 100%
  • V1 : avance
  • V2 : recule
  • V3 : tourne à gauche
  • V4 : tourne à droite

Pour avancer par exemple, on utilise la méthode setmotor qui prend deux paramètres

  • l’ordre (_CW, _CCW, _SHORT_BRAKE, _STOP ou _STANDBY)
  • une consigne

Donc ici, pour avancer, on passera les paramètres _CW avec la consigne contenue dans la variable _speed. Pour reculer, on passera l’ordre inverse, _CCW. Si les commandes sont inversées, vous pouvez simplement inverser le câblage au niveau du shield Motor. Vous remarquerez dans le code complet que j’ai limité la vitesse de recul à 50% de la vitesse d’avance. Libre à chacun de supprimer cette limitation.

// Avance - Drive
BLYNK_WRITE(V1) {
  if (param.asInt()) {
    Serial.println("D");
    M2.setmotor(_CW, _speed);
  } else {
    M2.setmotor(_STOP);
  }
}

Pour aller à droite ou à gauche, c’est exactement la même chose. On fera tourner le moteur dans un sens ou dans l’ordre. Les roues directrices reviennent en position centrale à l’aide d’un ressort. Il n’y a donc rien à programmer. Par contre c’est un fonctionnement tout ou rien.

// Droite - Right
BLYNK_WRITE(V3){    
  if (param.asInt()) {
    Serial.println(">>");
    M1.setmotor(_CW,100);
  } else {
    M1.setmotor(_STOP);
  }
}

Voici le code complet du projet. Il vous reste à modifier les paramètres présentés plus haut avant de le téléverser le programme sur l’ESP8266 de la Wemos d1 mini.

#include 
#include 
#include "WEMOS_Motor.h"

Motor M1(0x30,_MOTOR_A, 1000);//Motor A - Direction
Motor M2(0x30,_MOTOR_B, 1000);//Motor B - Propulsion

int _speed  = 25;  // Vitesse exprimée en % de la puissance - Speed depend % of the power
int STATUS_BLYNK = D4;  // Etat connexion serveur Blynk - Blynk connexion status

// Vos paramètres de connexion WiFi - Your WiFi credentials.
char ssid[] = "yourSSID";
char pass[] = "yourPassword";

// Jeton Blynk - Blynk Token
char auth[] = "b065eb0a6e36434da42367b3fa7c3340"; 

void setup() {
  Serial.begin(115200);
  
  // Initialise la Led indiquant l'état de connexion au serveur Blynk - Init status Led inidcating Blynk connexion status
  pinMode(STATUS_BLYNK, OUTPUT);
  digitalWrite(STATUS_BLYNK, LOW);
  
  // Authentification auprès du serveur local Blynk - Authenticate to Blynk Private Server
  Serial.println("Connecting Blynk");
  Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,24), 8442);
}

BLYNK_WRITE(V0) {
  Serial.print("Set speed: ");
  _speed = param.asInt();
  Serial.print(_speed); Serial.println("%");
}

// Avance - Drive
BLYNK_WRITE(V1) {
  if (param.asInt()) {
    Serial.println("D");
    M2.setmotor(_CW, _speed);
  } else {
    M2.setmotor(_STOP);
  }
}

// Recule - Rear
BLYNK_WRITE(V2) {
  if (param.asInt()) {
    Serial.println("R");
    M2.setmotor(_CCW, _speed / 2);
  } else {
    M2.setmotor(_STOP);
  }
}

// Droite - Right
BLYNK_WRITE(V3){    
  if (param.asInt()) {
    Serial.println(">>");
    M1.setmotor(_CW,100);
  } else {
    M1.setmotor(_STOP);
  }
}

// Gauche - left
BLYNK_WRITE(V4){
  if (param.asInt()) {
    Serial.println("