Rapport M Boot 1 PDF

Télécharger au format docx, pdf ou txt
Télécharger au format docx, pdf ou txt
Vous êtes sur la page 1sur 24

Robotique Industrielle Rapport du projet

M-Boot détecteur d’obstacles


Réaliser par :
Moussabik Issam Abou Youssef Mehdi Mohamadi Mohamed Dekkaki Jihane Hrout
Tarik
Encadré par :
Mme. Daraoui Nawal
M-boot Détecteur d’obstacles Robotique Industrielle
Table des matières Introduction générale :
............................................................................................................................. 3
Équipe de travail :
.................................................................................................................................. 4
Cahier de charges (Objectifs du projet) :
......................................................................................... 4
Chapitre I : Généralités sur les robots mobiles
.................................................................................. 5
1.1. Introduction
............................................................................................................................... 5
1.2. Définition d’un robot mobile :
.............................................................................................. 5
1.3. Classification des robots mobiles :
...................................................................................... 5
1.4. Applications :
............................................................................................................................. 5
1.5. L’architecture des robots mobiles :
..................................................................................... 6
1.5.1. La structure mécanique :
..................................................................................................... 7
1.5.2. Les organes de sécurité :
..................................................................................................... 7
1.5.3. Traitement des informations (Gestion des tâches) :
..................................................... 7
Chapitre II : L’étude du robot
................................................................................................................. 8
I. La Conception mécanique du robot :
........................................................................................... 8
1.1. Le châssis :
................................................................................................................................. 8
II. La conception électrique du robot :
........................................................................................... 10
2.1. La partie puissance :
.............................................................................................................. 10
2.2. Les moteurs :
........................................................................................................................... 12
2.3. Les capteurs :
.......................................................................................................................... 13
2.3.1. Capteurs infrarouges à Led : .......................................................................................
13
2.3.2. Le capteur ultrasonique HC-SR04 : ...........................................................................
14
III. Les problèmes rencontrés et la stratégie adoptée pour les résoudre : .............................
15
Chapitre III : La partie commande
....................................................................................................... 16
I. La carte Arduino Uno :
................................................................................................................... 16
II. L’organigramme de travail
:........................................................................................................... 17
III. Le programme :
................................................................................................................................ 18
Conclusion générale :
.............................................................................................................................. 23
2
M-boot Détecteur d’obstacles Robotique Industrielle

Introduction générale :
Ce présent document représente le rapport technique lié au projet de fin de session du
module ‘Robotique Industrielle’ de la 5éme année Génie Électrique.
Ce projet, dont la finalité première est de faire l’étude complète d’un robot qu’on a
choisie, le tester et le faire fonctionner en fin de compte.
On a choisi pour notre part de travailler sur un robot mobile détecteur d’obstacles, qu’on
a appelé M-Boot. Ce robot est commandé par un module Arduino Uno.
C’est pour cela que notre étude du dit robot se portera sur les trois aspects, mécanique,
électrique puis l’aspect commande (programmation du robot), le but étant d’avoir à la fin
du projet un robot mobile qui fonctionne correctement sans problèmes.
Pour réaliser ce robot on doit respecter un Cahier des Charges, que nous avons, nous-
mêmes établis. Nous avons alors dû nous organiser de manière spécifique, chaque
personne étant en charge d’un aspect en particulier, surtout en ce qui concerne la
programmation du robot M-Boot.
Le rapport s’ouvre sur une présentation détaillée des objectifs et des contraintes du
projet, avant de s’attarder sur l’ensemble du développement technique du robot. Notre
réflexion s’étant d’abord orientée sur la stratégie de ce robot (c’est-à-dire ce qu’il doit
réaliser). Nous avons revisité la mécanique et l’électronique du robot en ce sens avant de
développer plus en profondeur le code informatique lui-même.
La partie concernant le robot principal reproduit ce schéma, puis nous présentons les
résultats obtenus lors des tests effectués sur le robot.
3
M-boot Détecteur d’obstacles Robotique Industrielle
Équipe de travail :
Nous avons choisi le robot détecteur d’obstacles au milieu des autres parce que ce
dernier nous permettra de travailler sur plusieurs aspects intéressants à la fois, à savoir, sa
conception mécanique, et électrique (capteurs, liaisons, ...), puis cava nous donner en
même temps la possibilité de manipuler une carte Arduino, la programmer et la tester.
Ce robot est un véritable challenge pour des étudiants du Génie Électrique passionnés
par la robotique.
Durant l’ensemble de la phase de réalisation, nous avons dû rendre compte de notre
avancement à notre tuteur de projet (Mme. Daraoui Nawal). Nous avions intérêt de
choisir chacun une partie à faire pour avoir un résultat plus structuré à la fin.
Nous nous sommes organisés de cette façon :
Cahier de charges (Objectifs du projet) :
4
Faire une description complète du robot, sa partie mécanique (châssis) et sa partie
électrique.
Diagnostiquer le robot.
Programmer le robot : Ce robot détectera les obstacles à 30cm devant lui.
Amélioration : Le robot doit analyser les obstacles devant lui et avancer en même temps.
M-boot Détecteur d’obstacles Robotique Industrielle
Chapitre I
Généralités sur les robots mobiles
1.1. Introduction
Généralement, l'image que l'on se donne d'un robot est celle d'un système mécanique
articulé qui doit effectuer des opérations telles que le soudage, la peinture, la manutention
dans des ateliers de l'industrie automobile, ...etc. II en existe pourtant une autre, dont on
parle moins souvent : les robots mobiles a roues.
Ces systèmes sont actuellement très peu répandus dans les applications industrielles.
Pourtant de nombreuses applications potentielles s'offrent à ce type de véhicules
applications de nettoyage, l’aide à la mobilité de personnes âgées ou handicapées.
1.2. Définition d’un robot mobile :
Un robot mobile est un véhicule dote de moyens de locomotion qui lui permettent de se
déplacer.
Suivant son degré d'autonomie il peut être doté de moyens de perception et de
raisonnement.
1.3. Classification des robots mobiles : La classification des robots mobiles se fait suivant
plusieurs critères (degré d'autonomie, système de locomotion, énergie utilisée ...). La
classification la plus intéressante, et la plus utilisée est selon leur degré d'autonomie. Un
robot mobile autonome est un système automoteur doté de capacités décisionnelles et de
moyens d'acquisition et de traitement de l'information qui lui permettent d'accomplir sous
contrôle humain réduit, un certain nombre de tâches, dans un environnement non
complètement connu. On peut citer quelques types :
Véhicule autonome qui réalise des tâches semi- définies.
1.4. Applications : Le domaine d'application des robots mobiles est vaste, nous
présentons quelques applications dans le tableau suivant (figure 1) :
5
Véhicule télécommandé par un opérateur qui lui impose chaque tâche élémentaire à
réaliser.
Véhicule télécommandé au sens de la tâche à réaliser. Le véhicule contrôle
automatiquement ses actions.
Véhicule semi- autonome réalisant sans l'aide de l'opérateur des tâches prédéfinies.
M-boot Détecteur d’obstacles Robotique Industrielle
1.5. L’architecture des robots mobiles : L’architecture d’un robot mobile se compose de 4
parties essentielles :
6
Figure 1 Domaine d'applications des robots mobiles
M-boot Détecteur d’obstacles Robotique Industrielle
1.5.1. La structure mécanique : Il existe quatre types de structures mécaniques assurant la
motricité :
□ Les robots à roues : La mobilité par roues est la structure mécanique la plus
communément appliquée.
□ Les robots à chenilles : L'utilisation des chenilles présente l'avantage d'une bonne
adhérence au sol et d'une faculté de franchissement d'obstacles.
□ Les robots marcheurs : Les robots marcheurs sont destinés à réaliser des tâches variées
dont l'accès au site est difficile.
□ Les robots rampants.
1.5.2. Les organes de sécurité :
II est dangereux de laisser le robot mobile complètement libre. Donc il est obligatoire
qu'il soit doté d'organes garantissant la sécurité.
1.5.3. Traitement des informations (Gestion des tâches) :
L'ensemble de traitement des informations et gestion des tâches constitue le noyau du
module d'informatique central qui établit les commandes permettant au robot mobile de
réaliser un déplacement et d'activer les divers organes en accord avec l'objectif.
À ce niveau le problème qui se pose est le problème de génération de plan qui consiste à
établir la manière dont le robot se déplace par rapport à des connaissances aprioriques
«statiques » ou obtenues en cours d'évolution « dynamiques »
La génération des plans repose sur trois concepts :
1. La stratégie de navigation.
2. La modélisation de l'espace.
3. La planification.
7
Figure 2 Les organes de sécurité
M-boot Détecteur d’obstacles Robotique Industrielle
Chapitre II
L’étude du robot
Dans ce chapitre, on se concentrera sur l’étude du robot, dans ses deux aspects :
mécanique et électrique. Puis on fera le point sur les problèmes rencontrés durant l’étude
du robot et comment on les a résolus afin d’avoir un robot en parfaite condition qui
fonctionne correctement.
I. La Conception mécanique du robot :
1.1. Le châssis : Le châssis du véhicule robotisé, roulant avec 2 moteurs, 3 roues, 2
disques d’encodage, et avec une porte piles fournis.
Ce châssis peut être monter avec une carte Arduino ou d’autres micro contrôleurs. Il
comporte 2 roues motrices indépendantes et une troisième roue de suivi libre. Les deux
roues sont commandées par des moteurs pas à pas.
Il comporte aussi un boîtier porte piles et deux disques encodeurs de rotation (pour
contrôleur les mouvements).
8
Figure 3 Le châssis du robot M-boot
M-boot Détecteur d’obstacles Robotique Industrielle
Moteur pas à pas connecté à la roue motrice.
L’alimentation du robot est posée à l’arrière du châssis, au milieu on retrouve la carte
Arduino, et au-devant du robot on y a placé les capteurs.
En travaillant sur notre robot, on a décidé de privilégier la vitesse sur le couple, d’où
l’utilisation des moteurs pas à pas. Le châssis est donc léger et permet au robot de se
déplacer plus rapidement sans contraintes.
9
M-boot Détecteur d’obstacles Robotique Industrielle
10
II. La conception électrique du robot : La conception électrique du robot est composée de
deux parties qui sont la partie puissance et les commandes de moteurs. Le but de la partie
puissance est de distribuer la puissance aux moteurs et aux autres parties du robot. Tandis
que la commande des moteurs est une partie qui génère les signaux envoyés à la partie
puissance. Ces signaux ont pour but de fixer la vitesse des moteurs.
2.1. La partie puissance : La partie de puissance permet de distribuer l’énergie fournie par
la batterie du robot aux moteurs. Mais cette partie doit fournir plus ou moins d’énergie
aux moteurs en fonction de la demande provenant des montages amont. Elle doit dont
être capable de distribuer deux puissances différentes aux deux moteurs. Cette fonction
sépare la partie puissance de la partie commande.
Figure 4 Schéma bloc du robot mobile
On a décidé de modéliser les schémas de la partie électrique du robot sur ISIS Proteus
àfin d’avoir une idée plus claire sur la partie commande en entière :
M-boot Détecteur d’obstacles Robotique Industrielle
11
M-boot Détecteur d’obstacles Robotique Industrielle
2.2. Les moteurs : Les deux moteurs du robot sont des moteurs à courant continu. Les
deux sont des moteurs-réducteurs avec réduction de 1:48 à courant continu DC (fils rouge
/ noir)
Caractéristiques :
12
Alimentation : 6Vcc
Rapport de réduction de 1:48
Vitesse (à vide): 200 RPM ± 10%
Sortie sur fil avec connecteur
Poids : 40 g
Figure 6 Montage du moteur CC sur la roue motrice
Figure 5 Schéma du moteur 1:48 utilisé
M-boot Détecteur d’obstacles Robotique Industrielle
2.3. Les capteurs : Notre robot M-Boot est doté de deux types de capteurs (5 capteurs au
total). Deux modules émetteur-récepteur à led infrarouge, et puis un capteur ultrasonique.
Ces capteurs on la difficile tâche de détecter tout obstacles devant le robot, en bas et sur
ses côtés. Ces capteurs donnent l’information nécessaire à la carte Arduino programmée,
en fonction de ces informations, à choisir le chemin le plus convenable que le robot va
devoir suivre pour faire face aux obstacles rencontrés.
Capteur ultrasonique
Module infrarouge émetteur-récepteur
Capteurs infrarouges
2.3.1. Capteurs infrarouges à Led : Le capteur en question est monté en module
(émetteur-récepteur).
Les LED infrarouges fonctionnent entre 940-950nm.
Avec 1.5 V
DC

de tension avant et 50mA de courant max direct.


Champ et angle de vision du capteur infrarouge
13
Figure 7 Caractéristiques à T
ambiante

25°c
M-boot Détecteur d’obstacles Robotique Industrielle
2.3.2. Le capteur ultrasonique HC-SR04 :
Le module de capteur à distance à ultrasons de référence : HC-SR04 fonctionne à une
tension de 5V
DC. Avec un courant statique (Max) de 2 mA Et un niveau électrique de
sortie = 5V Haut Sa distance de détection peut aller jusqu’à 2cm- 450cm.
Il faut envoyer une impulsion niveau haut (à + 5v) pendant au moins 10 μs sur la broche
‘Trig Input’; cela déclenche la mesure. En retour la sortie ‘Output’ ou ‘Echo’, va fournir
une impulsion + 5v dont la durée est proportionnelle à la distance si le module détecte un
objet. Afin de pouvoir calculer la distance en cm, on utilisera la formule suivante :
Distance = (durée de l’impulsion (en μs) / 58
Voici une représentation graphique de la séquence de fonctionnement du module :
Passons à la pratique, le module HC-SR04 est doté de 4 broches : deux broches
d’alimentations et deux broches qui seront reliés à la carte Arduino comme tel :
14
M-boot Détecteur d’obstacles Robotique Industrielle

III. Les problèmes rencontrés et la stratégie adoptée pour les


résoudre :
Tout au long de la durée du projet, nous avons rencontré pas mal de problèmes sur le
robot, des problèmes différents qu’on a par la suite essayé de résoudre afin de pouvoir
arriver à faire ce qui est demandé dans le cahier de charge.
Voici une petite liste des problèmes qu’on a rencontré :
Problème Solution
Alimentation
15 Le robot en entier était alimenté par une seule pile de 7V. On a dû redimensionner
l’alimentation du robot, de sorte à avoir des alimentations indépendantes pour chaque
partie du robot.
Capteur Ultrasonique
Le capteur ultrason ne fonctionnait pas correctement au début. Il ne détectait aucun
mouvement. On était donc obligé de défaire puis refaire le soudage complétement.
Les liaisons entre les circuits
La plupart des fils électriques des circuits implémenté sur le châssis n’étaient pas
correctement connectés. Ceci nous a posé un grand problème, comme le programme ne
pouvait pas fonctionner correctement dans ces conditions. On a refait le câblage et
redessiner les liaisons entre les différents composants.
Fonctionnement parallèle
Dans un premier plan, le robot s’arrêtait d’avancer pour faire ses calculs et détecter les
obstacles. Comme on avait comme but d’avoir un robot qui peut faire plusieurs tâches à
la fois, on a revu nos organigrammes et notre programme principale. Le responsable de la
programmation du groupe a fait des énormes efforts afin de nous permettre d’avoir un
robot parfait à la fin du projet.
M-boot Détecteur d’obstacles Robotique Industrielle
Chapitre III
La partie commande
I. La carte Arduino Uno : Les cartes Arduino sont des cartes matériellement libres sur
lesquelles se trouve un microcontrôleur (d'architecture Atmel AVR). Et de composants
complémentaires qui facilitent la programmation et l'interfaçage avec d'autres circuits.
Chaque module possède au moins un régulateur linéaire 5 V et un oscillateur à quartz 16
MHz (ou un résonateur céramique dans certains modèles).
Le microcontrôleur est préprogrammé avec un boot loader de façon à ce qu'un
programmateur dédié ne soit pas nécessaire.
Les modules sont programmés au travers d'une connexion série TTL, mais les
connexions permettant cette programmation diffèrent selon les modèles.
Les premiers Arduino possédaient un port série RS-232, puis l'USB est apparu sur les
modèles Diecimila, tandis que certains modules destinés à une utilisation portable comme
le Lillypad ou le Pro-mini se sont affranchis de l'interface de programmation, relocalisée
sur un module USB-série dédié (sous forme de carte ou de câble), cela permettait aussi de
réduire leur coût, le convertisseur USB-Série TTL (un FTDI232RL de FTDI) coûtant
assez cher.
L'Arduino utilise la plupart des entrées/sorties du microcontrôleur pour l'interfaçage
avec les autres circuits. Le modèle Diecimila par exemple, possède 14 entrées/sorties
numériques, dont 6 peuvent produire des signaux PWM, et 6 entrées analogiques. Les
connexions sont établies au travers de connecteurs femelles HE14 situés sur le dessus de
la carte, les modules d'extension venant s'empiler sur l'Arduino. Plusieurs sortes
d'extensions sont disponibles dans le commerce.
16
M-boot Détecteur d’obstacles Robotique Industrielle
II. L’organigramme de travail : L’équipe technique du groupe a proposé différents
organigrammes tout au long du déroulement du projet. On devait de les corriger et de
leurs apporter des modifications afin de les perfectionner au fur et à mesure.
Le but étant d’exploiter au maximum les capteurs dont on dispose, tout en optimisant
ses performances (Calculs et mouvements se font en parallèle au lieu de les faires un à la
fois).
17
M-boot Détecteur d’obstacles Robotique Industrielle
III. Le programme : En travaillant sur ce projet, la phase de programmation était la plus
longue et celle qui a pris le plus d’effort. La raison est qu’on était obligé à chaque fois de
faire des tests, puis repenser à modifier le programme afin d’augmenter ses performances.
Ceci n’était pas simple au début, avec toutes les difficultés rencontrées : Problèmes
d’alimentation, parties mal soudés, mal branchés ... Mais on a réussi à la fin du projet à
proposer un programme qui exploitent les capteurs au maximum et qui donne au robot la
possibilité et le choix de s’en sortir des situations les plus délicates.
#include <Servo.h> Servo myservo;
int pos = 0; int var_position = 0; int var_ultrasonic = 0;
long duration; int distance;
void move_forward(){
digitalWrite(A1,HIGH); //Moteur droit digitalWrite(A2,LOW); digitalWrite(A0,HIGH);
digitalWrite(A3,LOW); //Moteur gauche digitalWrite(A4,HIGH); digitalWrite(A5,HIGH);
Serial.println("Marche avant"); } void move_backward(){
digitalWrite(A1,LOW); //Moteur droit digitalWrite(A2,HIGH); digitalWrite(A0,HIGH);
digitalWrite(A3,HIGH); //Moteur gauche digitalWrite(A4,LOW); digitalWrite(A5,HIGH);
Serial.println("Marche arrière"); } void Turn_LEFT(){
digitalWrite(A1,HIGH); //Moteur droit digitalWrite(A2,LOW); digitalWrite(A0,HIGH);
digitalWrite(A3,HIGH); //Moteur gauche digitalWrite(A4,LOW); digitalWrite(A5,HIGH);
Serial.println("Tourne gauche"); } void Turn_RIGHT(){
digitalWrite(A1,LOW); //Moteur droit digitalWrite(A2,HIGH);

18
M-boot Détecteur d’obstacles Robotique Industrielle
digitalWrite(A0,HIGH);
digitalWrite(A3,LOW); //Moteur gauche digitalWrite(A4,HIGH); digitalWrite(A5,HIGH);
Serial.println("Tourn droit"); } void Stop_all(){
digitalWrite(A0, LOW); //Moteur droit digitalWrite(A5, LOW); //Moteur gauche Serial.println("STOP"); } int
left_sensor_IR(){
if(digitalRead(2) == 0){
//Serial.println("obstacle à gauche"); return 0; }else{
//Serial.println("chemin vide"); return 1; } } int right_sensor_IR(){
if(digitalRead(3) == 0){
//Serial.println("obstacle à gauche"); return 0; }else{
//Serial.println("chemin vide"); return 1; } } int down_sensors(){
if(digitalRead(4) == 0 or digitalRead(5) == 0){
//Serial.println("obstacle à gauche"); return 0; }else{
//Serial.println("chemin vide"); return 1; } }
class ultrasonic_sensor {
public: ultrasonic_sensor(int var1){
} void Update() {
// Clears the trigPin digitalWrite(8, LOW); delayMicroseconds(2); // trigPin on HIGH pour 10 micro secondes
digitalWrite(8, HIGH); delayMicroseconds(10); digitalWrite(8, LOW); // Lire echoPin, le temps du retour de l'onde
sonor en micro secondes duration = pulseIn(9, HIGH); // Calcul du distance distance= (duration/2)/29.1; if(distance
<= 20){
var_ultrasonic = 1;

19
M-boot Détecteur d’obstacles Robotique Industrielle
}else{
var_ultrasonic = 0; } // Afficher la distance en Serial Monitor Serial.print("Distance: "); Serial.print(distance);
Serial.println(" cm"); } };
class Sweeper {
Servo servo; // Variable pour la communication avec le servo moteur int pos; // Position du servo moteur en degrée
int increment; // incrementation pour le mouvement pour chaque interval int updateInterval; // interval entre les
mise-à-jours unsigned long lastUpdate; // la dernière mise-à-jour du position
public:
Sweeper(int interval) {
updateInterval = interval; increment = 5; }
void Attach(int pin) {
servo.attach(pin); }
void Detach() {
servo.detach(); }
void Update() {
if((millis() - lastUpdate) > updateInterval) // time to update {
lastUpdate = millis(); pos += increment; var_position = pos; servo.write(pos); //Serial.println(pos); if ((pos >= 180)
|| (pos <= 0)) // end of sweep {
// reverse direction increment = -increment; } } } };
ultrasonic_sensor scan1(12); Sweeper sweeper1(10);
void setup() {
pinMode(2, INPUT); //LED 4 pinMode(3, INPUT); //LED 3 pinMode(5, INPUT); //LED 1 Droit IR pinMode(4,
INPUT); //LED 2 Gauche IR

20
M-boot Détecteur d’obstacles Robotique Industrielle
// Moteur gauche pinMode(A3,OUTPUT); digitalWrite(A3,LOW); pinMode(A4,OUTPUT);
digitalWrite(A4,LOW); pinMode(A5,OUTPUT); // RIGHT motor pinMode(A1,OUTPUT); digitalWrite(A1,LOW);
pinMode(A2,OUTPUT); digitalWrite(A2,LOW); pinMode(A0,OUTPUT); // Servo motor sweeper1.Attach(10);
pinMode(8, OUTPUT); pinMode(9, INPUT);
Serial.begin(9600); }
void loop() {
//Serial.println(digitalRead(2)); scan1.Update(); sweeper1.Update();
//servo_motor(); //ultrasonic_sensor();
if(var_ultrasonic==0){
Serial.println("Nothing here"); }else{
if(var_position>= 0 && var_position <= 60){
Serial.println("obstacle in RIGHT - Turn LEFT"); Turn_LEFT(); delay(1000); }else if(var_position>= 60 &&
var_position <= 120){ Serial.println("obstacle in front - Turn RIGHT"); Turn_RIGHT(); delay(1000); }else
if(var_position>= 120 && var_position <= 180){ Serial.println("obstacle in LEFT - Turn RIGHT"); Turn_RIGHT();
delay(1000); } } if(left_sensor_IR() ==1 && right_sensor_IR() ==1 && down_sensors() ==1){
move_forward(); }else{
//Stop_all();
if(right_sensor_IR() == 0 && left_sensor_IR() == 1){
Turn_LEFT(); delay(1000); } if(right_sensor_IR() == 1 && left_sensor_IR() == 0){
Turn_RIGHT(); delay(1000); } if(right_sensor_IR() ==0 && left_sensor_IR() ==0){
move_backward(); delay(1000); Turn_RIGHT();

21
M-boot Détecteur d’obstacles Robotique Industrielle
delay(1000); //Stop_all(); } if(down_sensors() == 1){
move_backward(); delay(1000); Turn_LEFT(); //Stop_all(); } } }

22
M-boot Détecteur d’obstacles Robotique Industrielle

Conclusion générale :
Le but de ce projet était de réaliser l’étude et la programmation du robot M-Boot.
Il nous a fallu décrire les différents blocs exécutant chacun une fonction particulière.
Ensuite nous avons assemblé ces blocs afin d’arriver à créer un programme final.
On a ensuite testé le robot plusieurs fois pour faire en sorte qu’il détecte toute sorte
d’obstacles.
Ainsi grâce à la réalisation de ce projet nous avons pu mettre en œuvre concrètement des
enseignements qu’on a eu dans différents modules. Tout en étant guidé mais à la fois
libre, ce projet nous a permis de prendre des initiatives, de réfléchir par nous-même et
d’effectuer un travail se rapprochant plus de celui qui nous sera demandé lors de notre
carrière professionnelle.
Le fait d’assister à toutes les étapes de la conception et de la réalisation d’un produit fut
à la fois plaisant et éducatif.
23

Vous aimerez peut-être aussi