Académique Documents
Professionnel Documents
Culture Documents
1- Architecture matérielle
I. Vue global:
J’avais un robot électrique, semblable à une voiture, qui est capable de se rendre
dans un parking intelligent. Chacun de ces éléments est équipé de composants de
fabrication spécifiques
II.Matériaux et composants de robot : 1-
Les Moteur :
Un moteur 4.5V est un type de moteur électrique qui fonctionne avec une tension nominale
de 4,5volts, Le chiffre 200 rpm indique la vitesse de rotation du moteur, mesurée en tours par
minute. Dans ce cas, le moteur tourne à 200 tours par minute, ce qui peut être ajusté en fonction
des besoins spécifiques de l’application.
Figure 2: Moteur DC
2-Capteurs ultra-son :
Le capteur ultrason est un composant essentiel utilisé dans de nombreux projets de robotique pour la
détection d'obstacles et la mesure de distances. Il utilise des ondes sonores à haute fréquence pour détermi-
ner la distance entre lui-même et un objet en mesurant le temps qu'il faut aux ondes sonores pour être
réfléchies et revenir au capteur. Ce capteur est largement utilisé pour la navigation autonome des robots, la
création de systèmes d'évitement d'obstacles, et bien d'autres applications nécessitant une mesure précise
de la distance. Son utilisation est répandue en raison de sa fiabilité, de sa facilité d'utilisation et de son faible
coût
Dans notre projet, nous avons utilisé le capteur ultrason pour permettre à notre robot de détecter les obs-
tacles environnants et d'ajuster son mouvement en conséquence. Le capteur ultrason émet des ondes sonores
à haute fréquence et mesure le temps nécessaire à leur retour après avoir été réfléchies par un objet. Cette
information nous permet de calculer la distance entre le 40 robot et l'obstacle le plus proche. En intégrant
cette fonctionnalité, notre robot . Bien sûr, voici une version plus détaillée :
Grâce à ses capteurs sophistiqués, le système est capable de détecter les barrières présentes dans le parking.
Cette fonctionnalité permet au robot de réagir de manière autonome et sécurisée en s'arrêtant automatique-
ment dès qu'il détecte la présence d'une barrière, contribuant ainsi à prévenir les collisions et assurant un
fonctionnement efficace et sécurisé dans l'environnement du parking.
Figure 4: fonction de capteur ultra-son.
La carte de puissance L298N est un module électronique utilisé pour contrôler les moteurs à
courant continu dans divers appareils, tels que les robots, les voitures télécommandées et les
imprimantes 3D. Il dispose de deux ponts-H intégrés, ce qui permet de contrôler 4 moteurs
indépendamment. La vitesse des moteurs peut être ajustée grâce à des signaux de commande
PWM. La carte offre également une protection contre la surchauffe et les surintensités pour éviter
les dommages. Elle est compatible avec une gamme de tensions d'alimentation et peut être utilisée
avec des circuits logiques TTL et CMOS. En bref, la carte de puissance L298N est un composant
polyvalent pour le contrôle précis des moteurs à courant continu.
La carte ESP 32 :
La carte ESP32 est conçue pour offrir une plateforme de développement complète et conviviale
pour une variété d'applications, allant des projets amateurs aux produits commerciaux. Voici
quelques points clés à prendre en compte lors de l'introduction à cette carte :
Microcontrôleur ESP32 : Au cœur de la carte ESP32 se trouve le microcontrôleur ESP32,
un puissant système sur puce (SoC) développé par Expressif System. Ce microcontrôleur
intègre un double cœur processeur Xtensa 32 bits, une connectivité Wi-Fi et Bluetooth,
ainsi que de nombreuses interfaces pour connecter une gamme de périphériques.
Connectivité sans fil : La carte ESP32 intègre la connectivité sans fil Wi-Fi et Bluetooth,
ce qui permet aux développeurs de créer des dispositifs IoT et des applications qui
peuvent se connecter à des réseaux locaux ou à des appareils mobiles.
Facilité de programmation : La carte ESP32 peut être programmée à l'aide de plusieurs
environnements de développement, y compris l'IDE Arduino, ESP-IDF (Expressif IoT
Développement Framework) et d'autres outils de développement tiers. Cela permet aux
développeurs de choisir l'environnement qui convient le mieux à leurs besoins et à leur
niveau de compétence.
La batterie 18650 :
Les batteries rechargeables 3,7V offrent une capacité énergétique de 18650 mWh, ce qui les rend
idéales pour alimenter une variété d'appareils électroniques. Avec leur tension 37 nominale de 3,7 volts,
ces batteries fournissent une puissance stable et fiable pour une utilisation prolongée. Grâce à leur
conception rechargeable, elles peuvent être rechargées et réutilisées à plusieurs reprises, ce qui les rend
économiques et écologiques. Leur capacité élevée de 18650 mWh leur permet de maintenir une autonomie
prolongée, ce qui en fait un choix idéal pour notre véhicule.
Figure 7: La batterie.
Dans le contexte de notre robot, les batteries rechargeables 3,7V sont comme source d'alimentation
principale. Leur tension nominale de 3,7 volts les rend compatibles avec nos composants, y compris la carte
ESP32 et les capteurs utilisés dans ce robot. Avec leur capacité élevée de 18650 mWh, ces batteries offrent
une autonomie prolongée, ce qui est crucial pour assurer le fonctionnement continu du robot
Dans cette partie , nous allons détailler le cadre physique de ce parking, qui est essentiel pour comprendre
son fonctionnement.
Le parking autonome est divisé en trois sections égales, chaque section ayant une largeur de 30 cm. La
largeur totale du parking est de 1,60 mètres (160 cm)ainsi que sa longueur est de 1,70 mètres. Cette division
en trois parties permet une optimisation de l'espace et facilite la gestion du flux de véhicules.
La première entrée du parking a une largeur de 30 cm, ce qui est suffisant pour permettre à un véhicule de
taille standard de s'engager en toute sécurité dans le parking. Cette entrée est conçue pour faciliter l'accès
des véhicules au système autonome de stationnement.
En résumé, le cadre de ce parking autonome robotisé est caractérisé par sa division en trois parties égales,
chaque partie ayant une largeur de 30 cm, et par une entrée initiale de 30 cm de large.
Ce parking est aussi entouré par un entourage jaune qui mesure 7cm de sa largeur .
Ces dimensions ont été soigneusement conçues pour assurer un fonctionnement efficace et sécurisé du
système de stationnement autonome.
Capteur Infrarouge :
Le capteur d’évitement d’obstacles à capteur infrarouge IR est une solution peu coûteuse pour la
détection d’évitement pour la robotique, la voiture intelligente et d’autres utilisations
électroniques. Dans certains cas, ce capteur est utilisé en paire, avec un capteur placé avant et un
autre placé après une barrière ou un obstacle. Lorsque le robot ou la voiture approche de la barrière,
le premier capteur détecte sa présence et déclenche l'ouverture de la barrière. Une fois que le
véhicule a franchi la barrière, le second capteur détecte sa présence et déclenche l'arrêt du véhicule,
assurant ainsi un contrôle précis du mouvement et de la sécurité dans les applications de
stationnement ou de déplacement automatisé.
A. Principe de fonctionnement:
L'émetteur infrarouge envoie un signal infrarouge qui, en cas de surface réfléchissante
(par exemple de couleur blanche), rebondit dans certaines directions, y compris celle du
récepteur infrarouge qui capte le signal détectant l'objet.
Lorsque la surface est absorbante (par exemple de couleur noire), le signal IR n'est pas
réfléchi et l'objet ne peut pas être détecté par le capteur. Ce résultat se produirait mêmesi
l'objet est absent.
B. Caractéristiques Techniques:
Réalisation
Introduction :
Dans le cadre de notre projet, le programme Arduino IDE a joué un rôle central. Cet outil de
développement intégré a été essentiel pour établir une connexion vitale entre la carte ESP32 du
robot et celle du parking. Grâce à la flexibilité et à la puissance de l'Arduino IDE, nous avons pu
concevoir et mettre en œuvre des programmes sur mesure, parfaitement adaptés aux exigences
spécifiques de notre projet.
Ce chapitre offre une plongée en profondeur dans les multiples programmes que nous avons
développés et déployés pour atteindre nos objectifs. Chaque aspect de ces programmes sera
minutieusement examiné, avec des explications détaillées sur leur fonctionnement et leur
contribution à la réalisation globale du projet. En mettant en évidence les choix de conception et
les défis rencontrés, nous fournirons une vue d'ensemble complète du processus de développement
logiciel qui a guidé notre démarche. Ensuite, nous procéderons à une analyse des enseignements
tirés de cette expérience, tout en envisageant les perspectives d'amélioration et les pistes
d'exploration futures.
L'Arduino IDE (Integrated Development Environment) est un logiciel essentiel pour de nombreux
projets de fin d'études (PFE) dans le domaine de l'ingénierie électronique et de l'informatique
embarquée. Il fournit une plateforme de développement conviviale pour écrire, téléverser et tester
le code destiné aux microcontrôleurs Arduino et à d'autres cartes compatibles. Cette introduction
met en évidence l'importance de l'IDE Arduino pour les projets de fin d'études.
ESP32 NOW est un protocole de communication sans fil propriétaire développé par Espressif
Systems, conçu spécifiquement pour les microcontrôleurs de la famille ESP32. Il permet la
communication directe entre les modules ESP32 sans passer par un routeur WiFi ou une
connexion Bluetooth.
Contrairement au WiFi classique, ESP32 NOW fonctionne en utilisant une topologie de réseau
en étoile simple, où un nœud maître communique avec plusieurs nœuds esclaves. Cela le rend
particulièrement adapté aux applications où plusieurs dispositifs ESP32 doivent échanger des
données de manière simple et efficace, comme dans les systèmes domotiques , les capteur
distribués ou les réseaux de capteurs IoT.
Les avantages clés d'ESP32 NOW incluent une latence réduite, une consommation d'énergie plus
faible par rapport aux connexions WiFi traditionnelles et une configuration simplifiée.
Cependant, comme il s'agit d'un protocole propriétaire, son utilisation limite l'interopérabilité
avec d'autres dispositifs et technologies de communication.
Le code ESP32 utilisé:
Nous avons utilisé ce code ESP32Now pour établir une connexion entre les deux cartes ESP32.
Plus précisément, la carte ESP32 du robot a été configurée en tant que “Slave”, tandis que celle
du parking a été désignée comme “Master” Ce choix de configuration a permis une
communication efficace et bidirectionnelle entre les deux dispositifs.
Nous allons diviser le code en deux parties distinctes : l'une dédiée à la carte ESP32 maître, que
nous nommerons ESP code Master, et l'autre dédiée à la carte ESP32 Slave. Cette segmentation
nous permettra de mieux organiser notre développement et de nous concentrer sur les
fonctionnalités spécifiques de chaque carte.
Debut
Inclure bibliothèques :
esp_now.h - WiFi.h - ESP32Servo.h
Initialisation :
Broches Capteurs et servomoteur
Mode Wifi STA
Initialisation ESPNow
ScanForSlave()
Oui
Parking plein ?
SlaveCnt > 0 & P_Presence Non
manageSlave()
Oui
Fermer Barrière sendData()
Ouvrir Barrière
Lorsque le robot a pénétré dans la zone de stationnement, un autre capteur infrarouge, positionné
stratégiquement, repère sa présence et signale à la carte ESP32 Master de refermer la barrière,
assurant ainsi la sécurité et la confidentialité de la zone.
Mais le rôle de la carte ESP32 Master ne s'arrête pas là. Elle établit également une connexion avec
la carte ESP32 esclave pour échanger des informations cruciales sur la disponibilité des
emplacements de stationnement. Cette connexion permet de déterminer précisément quelles places
sont libres parmi les trois capteurs de stationnement.
En cas de saturation, où les trois positions sont occupées, la barrière reste fermée, empêchant tout
autre véhicule d'entrer. Cette stratégie garantit un contrôle efficace de l'accès au stationnement,
optimisant ainsi son utilisation et minimisant les risques de congestion.
/**
ESPNOW - Basic communication - Master
Date: 26th September 2017
Author: Arvind Ravulavaru <https://github.com/arvindr21>
Purpose: ESPNow Communication between a Master ESP32 and multiple ESP32 Slaves
Description: This sketch consists of the code for the Master module.
Resources: (A bit outdated)
a. https://espressif.com/sites/default/files/documentation/esp-
now_user_guide_en.pdf
b. http://www.esploradores.com/practica-6-conexion-esp-now/
Flow: Master
Step 1 : ESPNow Init on Master and set it in STA mode
Step 2 : Start scanning for Slave ESP32 (we have added a prefix of `slave` to
the SSID of slave for an easy setup)
Step 3 : Once found, add Slave as peer
Step 4 : Register for send callback
Step 5 : Start Transmitting data from Master to Slave(s)
Flow: Slave
Step 1 : ESPNow Init on Slave
Step 2 : Update the SSID of Slave with a prefix of `slave`
Step 3 : Set Slave in AP mode
Step 4 : Register for receive callback and wait for data
Step 5 : Once data arrives, print it in the serial monitor
Note: Master and Slave have been defined to easily understand the setup.
Based on the ESPNOW API, there is no concept of Master and Slave.
Any devices can act as master or salve.
*/
#include <esp_now.h>
#include <WiFi.h>
#include <ESP32Servo.h>
#define CHANNEL 1
#define PRINTSCANRESULTS 0
const int P1 = 5; // Broche pour le capteur 1
const int P2 = 16; // Broche pour le capteur 2
const int P3 = 17; // Broche pour le capteur 1
const int P4 = 13; // Broche pour le capteur 2
if (PRINTSCANRESULTS) {
Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print("
["); Serial.print(BSSIDstr); Serial.print("]");
Serial.print(" ("); Serial.print(RSSI); Serial.print(")");
Serial.println("");
}
delay(10);
// Check if the current device starts with `Slave`
if (SSID.indexOf("Slave") == 0) {
// SSID of interest
Serial.print(i + 1); Serial.print(": "); Serial.print(SSID); Serial.print("
["); Serial.print(BSSIDstr);
Serial.print("]"); Serial.print(" ("); Serial.print(RSSI);
Serial.print(")"); Serial.println("");
// Get BSSID => Mac Address of the Slave
int mac[6];
if (SlaveCnt > 0) {
Serial.print(SlaveCnt); Serial.println(" Slave(s) found, processing..");
} else {
Serial.println("No Slave Found, trying again.");
}
// clean up ram
WiFi.scanDelete();
}
//uint8_t data = 0;
// send data
void sendData() {
//data++;
void setup() {
Serial.begin(115200);
pinMode(Presence_P, INPUT);
pinMode(Entree_P, INPUT);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(P3, INPUT);
//pinMode(P4, INPUT);
//Set device in STA mode to begin with
WiFi.mode(WIFI_STA);
Serial.println("ESPNow/Multi-Slave/Master Example");
// This is the mac address of the Master in Station Mode
Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
// Init ESPNow with a fallback logic
InitESPNow();
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
void loop() {
// In the loop we scan for slave
myData.a[0] = digitalRead(P1);
myData.a[1] = digitalRead(P2);
myData.a[2] = digitalRead(P3);
sendData();
} else {
// No slave found to process
}
int P_Presence = digitalRead(Presence_P);
int P_Entree = digitalRead(Entree_P);
Debut
Inclure bibliothèques :
esp_now.h - WiFi.h
Initialisation :
Broches Capteur ultrason et moteurs
Mode Wifi AP
Initialisation ESPNow
Non
Distance < 28
delay(200)
Non
Connexion avec parking ?
OnDataRecv()
Parking plein ?
Non
P1 vide
Oui
P2 vide
MoveP1()
Oui
MoveP3() MoveP2()
Dans le code ESP32 SLAVE, nous avons intégré un programme dédié au contrôle des
mouvements des roues du robot. À l'intérieur de l'unité robotique, un capteur à ultrasons est
déployé pour détecter les obstacles, notamment la barrière. Dès qu'un obstacle est détecté, le
robot interrompt ses déplacements de manière automatique.
Une fois que la barrière est opérationnelle et ouverte, le robot reprend son avancée pour atteindre
la zone de stationnement. Lorsqu'il se trouve à proximité de la barrière ouverte, le robot initie une
connexion avec les cartes esclaves et la carte ESP32 Master.
La carte maître informe ensuite le robot de l'emplacement disponible où il peut se stationner. Cette
interaction permet une gestion efficace de l'espace de stationnement en guidant le robot vers une
place libre, tout en réduisant les risques de congestion et en optimisant l'utilisation des
emplacements disponibles.
#include <esp_now.h>
#include <WiFi.h>
#define CHANNEL 1
// Define a data structure
typedef struct struct_message {
int a[4];
int Etat;
int Com;
} struct_message;
// Motor A
int motor1Pin1 = 13; // 8
int motor1Pin2 = 27; // 6
int enable1Pin = 17;
// Motor A
int motor2Pin1 = 18; // 13
int motor2Pin2 = 2;
//int enable2Pin = 16;
int Park = 0;
int m = 0;
// Setting PWM properties
const int freq = 30000;
const int pwmChannel1 = 0;
//const int pwmChannel2 = 1;
const int resolution = 8;
int dutyCycle;
int Ultrasonic_Ranging() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
int distance = pulseIn(echoPin, HIGH); // reading the duration of high level
distance = distance / 58; // Transform pulse time to distance
delay(50);
return distance;
}
// config AP SSID
void configDeviceAP() {
String Prefix = "Slave:";
String Mac = WiFi.macAddress();
String SSID = Prefix + Mac;
String Password = "123456789";
bool result = WiFi.softAP(SSID.c_str(), Password.c_str(), CHANNEL, 0);
if (!result) {
Serial.println("AP Config failed.");
} else {
Serial.println("AP Config Success. Broadcasting with AP: " + String(SSID));
}
}
void setup() {
// sets the pins as outputs:
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
pinMode(enable1Pin, OUTPUT);
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
//pinMode(enable2Pin, OUTPUT);
myData.Com = 0;
Serial.begin(115200);
// testing
Serial.print("Testing DC Motor...");
WiFi.mode(WIFI_AP);
// configure device AP mode
configDeviceAP();
// This is the mac address of the Slave in AP Mode
Serial.print("AP MAC: "); Serial.println(WiFi.softAPmacAddress());
// Init ESPNow with a fallback logic
InitESPNow();
Stop();
dutyCycle = 210;
ledcWrite(pwmChannel1, dutyCycle);
}
void loop()
{
//dutyCycle = 150;
//ledcWrite(pwmChannel1, dutyCycle);
//ledcWrite(pwmChannel2, dutyCycle);
// Move the DC motor forward at maximum speed
}
else if (m==0)
{
Avant_N();
delay(100);
}
}
void Stop()
{
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin1, LOW);
digitalWrite(motor2Pin2, LOW);
}
void Avant_N()
{
digitalWrite(motor1Pin1, HIGH);
digitalWrite(motor1Pin2, LOW);
digitalWrite(motor2Pin1, HIGH);
digitalWrite(motor2Pin2, LOW);
}
void moveP1()
{
Avant(1500);
delay(12000);
Avant(2400);
}
void moveP2()
{
Avant(1300);
delay(9000);
Right(1700);
delay(300);
Avant(1000);
delay(300);
Left(1400);
delay(300);
Avant(2100);
}
void moveP3()
{
Avant(1300);
delay(9000);
Right(1700);
delay(300);
Avant(1800);
delay(300);
Left(1400);
delay(300);
Avant(2100);
}