Après avoir testé les contrôles via un serveur web embarqué via l’ESP32 je n’étais pas convaincu.
Donc je me suis rabattu sur l’utilisation d’une manette PS4.
Pour rappel, voila donc tout le matériel utilisé dans mon robot :
- Un microcontrôleur ESP32
- Quatre moteurs à courant continu avec roues omnidirectionnelles
- Deux drivers de moteur L298N
- Une manette PS4
- Une source d’alimentation (batterie LIPO)
- Des fils de connexion
Le schéma de câblage est le suivant :
- Connectez les broches IN1, IN2, IN3 et IN4 du driver de moteur aux broches GPIO 16, 17, 18 et 19 de l’ESP32, respectivement.
- Connectez les broches IN5, IN6, IN7 et IN8 du driver de moteur aux broches GPIO 25, 26, 27 et 32 de l’ESP32, respectivement.
- Connectez les broches ENA et ENB du driver de moteur aux broches GPIO 14 et 12 de l’ESP32.
- Connectez les broches ENA2 et ENB2 du driver de moteur aux broches GPIO 15 et 2 de l’ESP32.
- Connectez les moteurs aux sorties du driver de moteur.
Voici un résumé des connexions (G pour Gauche et D pour Droite) :
Broche Driver Moteur | Broche ESP32 |
---|---|
IN1 (G1) | 16 |
IN2 (G1) | 17 |
IN3 (G2) | 18 |
IN4 (G2) | 19 |
ENA | 14 |
ENB | 12 |
IN5 (D1) | 25 |
IN6 (D1) | 26 |
IN7 (D2) | 27 |
IN8 (D2) | 32 |
ENA2 | 15 |
ENB2 | 2 |
Configuration Logicielle
Tout d’abord, assurez vous d’avoir installé les bibliothèques nécessaires dans votre Arduino IDE :
- La bibliothèque
PS4Controller
pour interagir avec la manette PS4. - Le package de carte
ESP32
.
Pour connecter votre manette PS4 à l’ESP32, vous devrez les associer en utilisant l’adresse MAC de la manette ( https://github.com/aed3/PS4-esp32 )
#include <PS4Controller.h>
// Définition des broches pour les moteurs
#define IN1 16 // G1
#define IN2 17 // G1
#define IN3 18 // G2
#define IN4 19 // G2
#define ENA 14 // G1 et G2
#define ENB 12 // D1 et D2
#define IN5 25 // D1
#define IN6 26 // D1
#define IN7 27 // D2
#define IN8 32 // D2
#define ENA2 15 // G1 et G2
#define ENB2 2 // D1 et D2
// Variables pour la manette PS4
int LX = 0;
int LY = 0;
int RStickX = 0;
int RY = 0;
int deadBand = 8;
bool connected = false;
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN5, OUTPUT);
pinMode(IN6, OUTPUT);
pinMode(IN7, OUTPUT);
pinMode(IN8, OUTPUT);
pinMode(ENA2, OUTPUT);
pinMode(ENB2, OUTPUT);
Serial.begin(115200);
PS4.begin("c0:49:ef:cf:03:1b"); // Remplacez par votre adresse MAC
Serial.println("Prêt.");
delay(200);
}
void loop() {
if (PS4.isConnected() && !connected) {
Serial.println("Connecté !");
Serial.printf("Niveau de batterie : %d\n", PS4.Battery());
connected = true;
}
if (PS4.isConnected()) {
if (PS4.LStickX()) {
LX = PS4.LStickX();
if (abs(LX) < deadBand) {
LX = 0;
}
}
if (PS4.LStickY()) {
LY = PS4.LStickY();
if (abs(LY) < deadBand) {
LY = 0;
}
}
if (PS4.RStickX()) {
RStickX = PS4.RStickX();
if (abs(RStickX) < deadBand) {
RStickX = 0;
}
}
// Contrôle des moteurs en fonction des sticks et des gâchettes
int speed = map(abs(LY), 0, 128, 0, 255);
int turnSpeed = map(abs(RStickX), 0, 128, 0, 255);
if (PS4.L2()) { // Inversion des gâchettes
lateralGauche();
} else if (PS4.R2()) { // Inversion des gâchettes
lateralDroit();
} else {
controlMotors(LX, LY, RStickX, RY, speed, turnSpeed);
}
}
}
void controlMotors(int LX, int LY, int RStickX, int RY, int speed, int turnSpeed) {
if (LY > 0) {
avancer(speed);
} else if (LY < 0) {
reculer(speed);
}
if (RStickX > 0) {
pivoterDroit(turnSpeed);
} else if (RStickX < 0) {
pivoterGauche(turnSpeed);
}
if (LY == 0 && RStickX == 0) {
arreter();
}
}
void avancer(int speed) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
digitalWrite(IN5, LOW);
digitalWrite(IN6, HIGH);
digitalWrite(IN7, LOW);
digitalWrite(IN8, HIGH);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
analogWrite(ENA2, speed);
analogWrite(ENB2, speed);
}
void reculer(int speed) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
digitalWrite(IN5, HIGH);
digitalWrite(IN6, LOW);
digitalWrite(IN7, HIGH);
digitalWrite(IN8, LOW);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
analogWrite(ENA2, speed);
analogWrite(ENB2, speed);
}
void lateralGauche() {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
digitalWrite(IN5, HIGH);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, HIGH);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
analogWrite(ENA2, 255);
analogWrite(ENB2, 255);
}
void lateralDroit() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
digitalWrite(IN5, LOW);
digitalWrite(IN6, HIGH);
digitalWrite(IN7, HIGH);
digitalWrite(IN8, LOW);
analogWrite(ENA, 255);
analogWrite(ENB, 255);
analogWrite(ENA2, 255);
analogWrite(ENB2, 255);
}
void pivoterGauche(int speed) {
digitalWrite(IN1, HIGH); // G1 en avant
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); // G2 en avant
digitalWrite(IN4, LOW);
digitalWrite(IN5, LOW); // D1 en arrière
digitalWrite(IN6, HIGH);
digitalWrite(IN7, LOW); // D2 en arrière
digitalWrite(IN8, HIGH);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
analogWrite(ENA2, speed);
analogWrite(ENB2, speed);
}
void pivoterDroit(int speed) {
digitalWrite(IN1, LOW); // G1 en arrière
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); // G2 en arrière
digitalWrite(IN4, HIGH);
digitalWrite(IN5, HIGH); // D1 en avant
digitalWrite(IN6, LOW);
digitalWrite(IN7, HIGH); // D2 en avant
digitalWrite(IN8, LOW);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
analogWrite(ENA2, speed);
analogWrite(ENB2, speed);
}
void arreter() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
digitalWrite(IN5, LOW);
digitalWrite(IN6, LOW);
digitalWrite(IN7, LOW);
digitalWrite(IN8, LOW);
analogWrite(ENA, 0);
analogWrite(ENB, 0);
analogWrite(ENA2, 0);
analogWrite(ENB2, 0);
}
Explication du Code
- Setup: Initialise les broches de contrôle des moteurs et configure la connexion avec la manette PS4.
- Loop: Vérifie continuellement les entrées de la manette PS4 et ajuste les vitesses des moteurs en conséquence.
- Fonctions de Contrôle des Moteurs:
avancer(int speed)
: Fait avancer le robot.reculer(int speed)
: Fait reculer le robot.lateralGauche()
: Fait déplacer le robot vers la gauche.lateralDroit()
: Fait déplacer le robot vers la droite.pivoterGauche(int speed)
: Fait tourner le robot vers la gauche en inversant le sens des moteurs correspondants.pivoterDroit(int speed)
: Fait tourner le robot vers la droite en inversant le sens des moteurs correspondants.arreter()
: Arrête tous les moteurs.
Conclusion
En suivant ce guide, vous avez construit un robot omnidirectionnel contrôlé par une manette PS4. Cette plateforme offre une grande flexibilité de mouvement, permettant des déplacements avant, arrière, latéraux et des rotations. Vous pouvez améliorer ce projet en ajoutant des capteurs, en l’intégrant à d’autres systèmes ou en affinant la logique de contrôle pour répondre à vos besoins spécifiques.
Enfin, j’ai ajouter une caméra et un VTX ( https://betafpv.com/products/c04-camera-and-vtx-module ) afin d’avoir le retour vidéo de mon robot dans un casque FPV.
N’hésitez pas à modifier le code et à expérimenter avec différentes configurations pour étendre les capacités de ce robot. Je peux fournir les STL d’impression 3D sur demandes :).
Bonne construction !
ps : Dépot GIT : https://github.com/mike37510/OmnidirectionalRobot