Binome2017-5 : Différence entre versions
(→Séance n°6 (29/01) à la fin :) |
|||
(47 révisions intermédiaires par 4 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | <include nopre noesc src="/home/pedago/ppeip/include/video-Robot_Binome05_2017-iframe.html" /> | ||
+ | __TOC__ | ||
+ | <br style="clear: both;"> | ||
BE IMA Proie et Chasseur | BE IMA Proie et Chasseur | ||
Ligne 4 : | Ligne 7 : | ||
− | + | [[Fichier:Faucon.png]] | |
− | |||
− | |||
+ | == Re-Définition du Projet et Phase d'Idéation == | ||
− | + | '''Le Projet :''' | |
− | + | Le Bureau d’Etudes porte sur la réalisation de robots communicants sur le thème “Proies et Prédateurs”. | |
+ | Il s’agit alors, dans le cas d’un Robot Prédateur, de concevoir un robot capable de détecter les proies et de les chasser ou bien, dans le cas de la proie, de produire un robot capable de détecter les chasseurs et de les semer. | ||
+ | La problématique du robot chasseur qui était “''Comment optimiser la détection de l’objectif et comment atteindre l’objectif lorsqu’il est en mouvement ?''” nous semblait plus intéressante et plus complexe dans le sens où chacun a son approche et stratégie de “Traque”. | ||
+ | Le noyau principal du projet est la conception d’un automate qui se meut dans son environnement. Il ne doit pas mettre en danger son environnement ou se mettre en danger lui même (Merci M. Asimov). Pour cela, il doit être capable d’observer et de comprendre ce qui l’entoure. | ||
+ | Le Deuxième point important concerne la détection de l’objectif. L’automate doit être capable de détecter son objectif et déterminer sa position par rapport à celui-ci. | ||
+ | Il faut noter que dans le modèle naturel “Proie vs. Prédateur”, la traque se doit d’être méthodique et rapide. Il convient d’appliquer ces concepts dans la réalisation de notre robot. | ||
− | |||
− | + | '''Nos Choix :''' | |
− | + | À la pensée de prédateurs, nous avons tout de suite pensé aux rapaces et cela nous a donc amené à parler de Faucons. Étant tout deux de grands fans de Star Wars, nous avons tout de suite imaginé un Faucon Millenium. | |
+ | Il parait judicieux de concevoir le robot le plus rapide du groupe afin de faciliter la traque. Nous avons donc décider d’utiliser des moteurs continus contrôlés en tension. | ||
+ | La programmation du robot nous parait importante, c’est pourquoi nous comptons passer plus de temps dessus à défaut de faire la carte électronique. Nous utiliserons donc un shield optimisé pour notre robot en complément d’une carte Arduino. | ||
+ | Concernant la méthode de traque, nous souhaitons mettre au point une méthode de détection efficace. Nous avons considérer le système de vision de l’Homme et nous l’avons simplifié pour l’adapter à notre automate. Nous allons donc créé une tourelle rotative de détection. Elle sera composée de plusieurs détecteurs infra-rouge. Son mouvement sera indépendant de celui du châssis, ainsi nous réduisons les angles morts de détection. | ||
+ | Concernant le châssis, il doit être léger et fonctionnel. | ||
− | == | + | == Élaboration du bouclier == |
− | Nous avons | + | Nous avons en premier lieu listé tous les composants dont nous aurons besoin pour l'élaboration de notre robot pour préciser leur disposition. Ainsi, nous avons pu concevoir notre bouclier de manière optimale en prenant en compte toutes ces informations. |
− | + | Ensuite, nous avons réfléchi à la manière dont on voulait que notre robot chasseur détecte la lumière LED de la proie. Nous avons alors imaginé mettre une tourelle composée de 3 capteurs infrarouge. Nous pensons que si nous ne prenons qu'un seul capteur, la détection de la proie sera moins précise. En effet, les 3 capteurs ne vont pas détecter la proie au même moment donc cela nous permettra de dire avec précision où se trouve la proie. | |
− | + | Puis, nous avons finalisé le Schematic et le PCB de notre bouclier d'Arduino. Pour cela, nous avons réagencé la disposition des différents composants. Notamment les câbles que nous avons du déplacer pour minimiser les erreurs liées à la proximité de 2 câbles. Cependant, nous avons du faire face à un problème majeur : certains câbles en chevauchaient d'autres. Nous avons donc opté pour des ponts que nous relirons avec des fils après impression du bouclier. Nous avons enfin rajouter 2 LED à notre bouclier qui serviront au débogage du robot. | |
− | + | Après avoir conçu le bouclier, nous sommes allés l'imprimer et nous avons ensuite souder des fils reliant les composants sur ce shield. | |
− | |||
− | |||
− | |||
− | |||
[[Fichier:Decoupe du Shield.jpg|thumb|400px|center]] | [[Fichier:Decoupe du Shield.jpg|thumb|400px|center]] | ||
Ligne 42 : | Ligne 48 : | ||
[[Fichier:Shield etat intermediaire2.jpg|thumb|400px|center]] | [[Fichier:Shield etat intermediaire2.jpg|thumb|400px|center]] | ||
+ | |||
+ | [[Fichier:schematic.png|thumb|500px|center]] | ||
A la suite de cela, nous nous sommes répartis les tâches à effectuer : l'un s'occupait de coder l'Arduino tandis que l'autre devait concevoir le châssis du robot. | A la suite de cela, nous nous sommes répartis les tâches à effectuer : l'un s'occupait de coder l'Arduino tandis que l'autre devait concevoir le châssis du robot. | ||
− | + | == Élaboration du châssis == | |
+ | |||
+ | Concernant la conception de la forme du châssis, nous avons décidé de faire un Faucon Millénium, vaisseau de Star Wars© et nous nous sommes donc inspiré de sa forme. Nous avons aussi voulu faire 2 plaques de plexiglas reliées entre elles par des entretoises pour placer des éléments entre comme la batterie, ou l'électro-aiment. | ||
− | [[Fichier: | + | [[Fichier:Chassis etat intermediaire2.jpeg|500px|center]] |
Pour concevoir ce châssis, nous avons utilisé Inkscape, ce qui nous permettait de le réaliser à la découpe laser. | Pour concevoir ce châssis, nous avons utilisé Inkscape, ce qui nous permettait de le réaliser à la découpe laser. | ||
+ | |||
+ | |||
+ | |||
+ | '''Vidéo de la découpe laser''' : | ||
+ | |||
[[Fichier:Découpe Laser.mp4]] | [[Fichier:Découpe Laser.mp4]] | ||
Ligne 57 : | Ligne 72 : | ||
Ainsi après avoir créé la forme, nous avons du faire les trous : ceux qui allaient servir à relier les deux plaques entre elles, ceux qui allaient fixer l'Arduino ou encore ceux pour faire passer les fils d'une plaque à l'autre. | Ainsi après avoir créé la forme, nous avons du faire les trous : ceux qui allaient servir à relier les deux plaques entre elles, ceux qui allaient fixer l'Arduino ou encore ceux pour faire passer les fils d'une plaque à l'autre. | ||
− | Pour ceux de l'Arduino, nous avons utilisé Fritzing qui propose des modèles d'Arduino avec les emplacements précis de leur trous. Malheureusement, en découvrant l'impression, nous avons remarqué que les trous effectués n'étaient pas bien placés (sauf 2). Ce problème est lié au modèle que Fritzing nous a donné, nous pensions qu'il s'agissait du bon | + | Pour ceux de l'Arduino, nous avons utilisé Fritzing qui propose des modèles d'Arduino avec les emplacements précis de leur trous. Malheureusement, en découvrant l'impression, nous avons remarqué que les trous effectués n'étaient pas bien placés (sauf 2). Ce problème est lié au modèle que Fritzing nous a donné, nous pensions qu'il s'agissait du bon en vue de l'Arduino que nous avions choisi mais nous nous sommes trompés. |
Ainsi, pour palier à ce problème, nous sommes simplement allés au Fabricarium et nous avons percer des trous supplémentaires. | Ainsi, pour palier à ce problème, nous sommes simplement allés au Fabricarium et nous avons percer des trous supplémentaires. | ||
Ensuite, pour fixer la batterie qui se situe sur la plaque inférieure, nous avons imaginer un système avec 4 fixations placés en carrés. C'est-à-dire 3 entretoises fixes et une pièce en plexiglas que nous pouvons enlever facilement si nous voulons retirer la batterie. | Ensuite, pour fixer la batterie qui se situe sur la plaque inférieure, nous avons imaginer un système avec 4 fixations placés en carrés. C'est-à-dire 3 entretoises fixes et une pièce en plexiglas que nous pouvons enlever facilement si nous voulons retirer la batterie. | ||
− | |||
− | Nous avions | + | Pour les roues, nous les avons fixées sur une 3ième petite plaque qui est reliée à la plaque inférieure pour soutenir les moteurs des roues. Nous avons fixé ces deux plaques à l'aide de 8 entretoises. Nous avons également mis une roue folle sur le devant du robot. |
+ | |||
+ | Nous avions enfin une spécificité notable sur notre robot/vaisseau : il s'agit d'une tourelle, placée sur le servomoteur, pour y fixer les 3 T-sop. Nous avons choisi d'en mettre 3 pour couvrir un large champs de vision mais également pour plus de facilité à repérer la proie. En effet, lorsqu'un T-sop détectera un signal mais que son voisin ne le détectera pas, cela nous donnera la position exacte de la proie. Nous avons donc du coder cette spécificité. | ||
[[Fichier:Tourelle.jpg|thumb|400px|center]] | [[Fichier:Tourelle.jpg|thumb|400px|center]] | ||
+ | |||
+ | |||
+ | '''Vidéo de l'élaboration de la tourelle''' : | ||
[[Fichier:Tourelle.mp4]] | [[Fichier:Tourelle.mp4]] | ||
+ | == Code == | ||
+ | |||
+ | Une fois l'électronique au point, il ne reste plus qu'a créer le meilleur code possible relatif à la configuration matériel. | ||
+ | La première phase à été une étape de découverte de l'Arduino. Nous avons aussi pas mal testé les différents composants, afin d'en avoir une compréhension suffisante pour la suite. | ||
+ | |||
+ | Une fois les bases acquises, il faut se lancer et visualiser la finalité du code. J'ai séparé le code en différents modules (déplacement, détection, servomoteur) afin de faciliter chaque étape de programmation et surtout pour éviter de perdre trop de temps sur le débogage. Enfin, une fois les différents modules au point, il ne reste plus qu'à les imbriqués. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | #include <Servo.h> | ||
+ | #include <IRremote.h> | ||
+ | #include <IRremoteInt.h> | ||
+ | |||
+ | // TSOP | ||
+ | |||
+ | char TSOP1 = A0; | ||
+ | char TSOP2 = A1; | ||
+ | char TSOP3 = A2; | ||
+ | |||
+ | int cas = 0; | ||
+ | |||
+ | IRrecv IR1(TSOP1); // créer les instances irrecv | ||
+ | IRrecv IR2(TSOP2); | ||
+ | IRrecv IR3(TSOP3); | ||
+ | decode_results results; | ||
+ | |||
+ | void detect() | ||
+ | { | ||
+ | if (IR1.decode(&results)) | ||
+ | { | ||
+ | cas = 1; | ||
+ | IR1.resume(); | ||
+ | } | ||
+ | else if (IR2.decode(&results)) | ||
+ | { | ||
+ | cas = 2; | ||
+ | IR2.resume(); | ||
+ | } | ||
+ | else if (IR3.decode(&results)) | ||
+ | |||
+ | { | ||
+ | cas = 3; | ||
+ | IR3.resume(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // ELECTO-AIMANT | ||
+ | |||
+ | int EA = 53; | ||
+ | |||
+ | // SONAR | ||
+ | |||
+ | int TRIG=41; | ||
+ | int ECHO=43; | ||
+ | const unsigned long MEASURE_TIMEOUT = 25000UL; | ||
+ | const float SOUND_SPEED = 340.0 / 1000; | ||
+ | |||
+ | float sonar() | ||
+ | { | ||
+ | digitalWrite(TRIG, HIGH); | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(TRIG, LOW); | ||
+ | |||
+ | /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */ | ||
+ | long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT); | ||
+ | |||
+ | /* 3. Calcul la distance à partir du temps mesuré */ | ||
+ | float distance_mm = measure / 2.0 * SOUND_SPEED; | ||
+ | |||
+ | return distance_mm; | ||
+ | |||
+ | } | ||
+ | |||
+ | //MOTEURS | ||
+ | |||
+ | int PWM_motorA=10; | ||
+ | int PWM_motorB=9; | ||
+ | int AIN1=50; | ||
+ | int AIN2=48; | ||
+ | int BIN1=44; | ||
+ | int BIN2=42; | ||
+ | int STDY=46; | ||
+ | unsigned long previous = millis(); | ||
+ | |||
+ | // SERVO | ||
+ | |||
+ | class Sweeper | ||
+ | { | ||
+ | Servo servo; // the servo | ||
+ | int pos; // current servo position | ||
+ | int increment; // increment to move for each interval | ||
+ | int updateInterval; // interval between updates | ||
+ | unsigned long lastUpdate; // last update of position | ||
+ | |||
+ | public: | ||
+ | Sweeper(int interval) | ||
+ | { | ||
+ | updateInterval = interval; | ||
+ | increment = 1; | ||
+ | } | ||
+ | |||
+ | void Attach(int pin) | ||
+ | { | ||
+ | servo.attach(pin); | ||
+ | } | ||
+ | |||
+ | void Detach() | ||
+ | { | ||
+ | servo.detach(); | ||
+ | } | ||
+ | |||
+ | void Update() | ||
+ | { | ||
+ | if((millis() - lastUpdate) > updateInterval) // time to update | ||
+ | { | ||
+ | lastUpdate = millis(); | ||
+ | pos += increment; | ||
+ | servo.write(pos); | ||
+ | Serial.println(pos); | ||
+ | if ((pos >= 160) || (pos <= 0)) // end of sweep | ||
+ | { | ||
+ | // reverse direction | ||
+ | increment = -increment; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | Sweeper servoTour(50); | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | IR1.enableIRIn(); | ||
+ | IR2.enableIRIn(); | ||
+ | IR3.enableIRIn(); | ||
+ | |||
+ | servoTour.Attach(8); | ||
+ | |||
+ | pinMode(EA,OUTPUT); | ||
+ | digitalWrite(EA,LOW); | ||
+ | |||
+ | pinMode(TRIG,OUTPUT); | ||
+ | digitalWrite(TRIG,LOW); | ||
+ | pinMode(ECHO,INPUT); | ||
+ | |||
+ | pinMode(AIN1,OUTPUT); | ||
+ | pinMode(AIN2,OUTPUT); | ||
+ | pinMode(BIN1,OUTPUT); | ||
+ | pinMode(BIN2,OUTPUT); | ||
+ | pinMode(PWM_motorA,OUTPUT); | ||
+ | pinMode(PWM_motorB,OUTPUT); | ||
+ | pinMode(STDY,OUTPUT); | ||
+ | |||
+ | digitalWrite(AIN1,LOW); | ||
+ | digitalWrite(AIN2,LOW); | ||
+ | digitalWrite(BIN1,LOW); | ||
+ | digitalWrite(BIN2,LOW); | ||
+ | digitalWrite(STDY,LOW); | ||
+ | analogWrite(PWM_motorA,0); | ||
+ | analogWrite(PWM_motorB,0); | ||
+ | |||
+ | digitalWrite(11,LOW); | ||
+ | }; | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | servoTour.Update(); | ||
+ | digitalWrite(STDY,HIGH); | ||
+ | digitalWrite(AIN1,HIGH); | ||
+ | digitalWrite(AIN2,LOW); | ||
+ | analogWrite(PWM_motorA,255); | ||
+ | digitalWrite(BIN1,HIGH); | ||
+ | digitalWrite(BIN2,LOW); | ||
+ | analogWrite(PWM_motorB,255); | ||
+ | if(sonar()<50) | ||
+ | { | ||
+ | digitalWrite(STDY,LOW); | ||
+ | digitalWrite(BIN1,LOW); | ||
+ | unsigned long tps = millis(); | ||
+ | while (millis()-tps < 1000) | ||
+ | { | ||
+ | digitalWrite(STDY,HIGH); | ||
+ | digitalWrite(BIN2,HIGH); | ||
+ | analogWrite(PWM_motorB,255); | ||
+ | previous = millis(); | ||
+ | } | ||
+ | } | ||
+ | unsigned long time = millis(); | ||
+ | detect(); | ||
+ | switch (cas) | ||
+ | { | ||
+ | case 1 : | ||
+ | while (millis()-time < 1000) | ||
+ | { | ||
+ | digitalWrite(BIN2,HIGH); | ||
+ | digitalWrite(BIN1,LOW); | ||
+ | analogWrite(PWM_motorB,255); | ||
+ | previous = millis(); | ||
+ | } | ||
+ | break; | ||
+ | case 2 : | ||
+ | if (sonar()< 50) | ||
+ | { | ||
+ | digitalWrite(EA,HIGH); | ||
+ | analogWrite(PWM_motorA,0); | ||
+ | analogWrite(PWM_motorB,0); | ||
+ | delay (5000); | ||
+ | } | ||
+ | case 3 : | ||
+ | while (millis()-time < 1000) | ||
+ | { | ||
+ | digitalWrite(AIN2,HIGH); | ||
+ | digitalWrite(AIN1,LOW); | ||
+ | analogWrite(PWM_motorA,255); | ||
+ | previous = millis(); | ||
+ | } | ||
+ | break; | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | == Problèmes rencontrés durant le BE == | ||
+ | |||
+ | * Ayant choisi des moteurs performants, ceux-ci nécessitent beaucoup de tension pour fonctionner. Nous avons sous-estimé ce besoin en début de projet. Or, durant la phase de programmation, nous nous sommes rendu-compte que notre robot n'avait pas assez de "jus" pour fonctionner. Cela à donc générer un certain nombre de soucis et de casses-têtes. Une solution serait de modifier l'alimentation du robot, et d'en choisir une plus adaptée à la configuration matérielle. Nous aurions pu échanger les moteurs par des servos continus, mais cela ne rentrait pas dans notre vision du projet (Conception d'un Robot relativement rapide). | ||
+ | |||
+ | * Nous avons rencontré des problèmes pour la tourelle : en effet, comme stipulé précédemment, nous avons mis 3 Tsop sur cette dernière et donc nous avions 3x3 = 9 fils dessus. Il y a donc beaucoup de frottement dû aux fils. Nous pensons toujours que la tourelle est une bonne idée car grâce à elle, le robot peut ratisser un large champs et ainsi capter la proie plus aisément. Donc pour un prochain projet, nous pourrions garder l'idée de la tourelle mais la perfectionner : lui attribuer par exemple un diamètre plus important pour que l'on puisse intégrer les Tsop à l'intérieur même de la tourelle et faire passer les fils de ceux ci dans une fente placée sur la tourelle. Comme cela, les fils ne créerait pas de frottement avec le châssis et la tourelle tournerait plus facilement. De plus, sur le servomoteur, nous pouvons remarquer que la partie qui tourne à la forme d'un petit engrenage. Donc, en créant la tourelle à l'imprimante 3D, nous aurions pu la dessiner avec un engrenage qui correspond parfaitement à celui du servomoteur. Ainsi, nous aurions pu les emboîter et il n'y aurait eu aucun frottement. Cette opération doit être toute fois extrêmement précise et elle demande beaucoup de temps : il faut repérer les dimensions exactes que doit avoir l'engrenage, le dessiner et l'imprimer avec une imprimante 3D d'une très grande précision pour que les 2 engrenages s'emboîtent au mieux (de l'ordre du micromètre). Voilà comment nous aurions pu améliorer notre tourelle. | ||
+ | |||
+ | * Dernier petit problème rencontré (et petite anecdote notable) : pendant les vacances, nous avons voulu peaufiner notre robot et lorsque nous avons testé notre programme qui permet au robot de rouler, nous avons constaté qu'une seule roue tournait. Donc nous nous sommes intéressés au moteur de cette roue et en le touchant, un de ses fils s'est dessoudé. Nous avons donc été très embêtés car nous n'avions pas d'appareil pour souder chez nous. Nous avons donc cherché un endroit près de chez nous, comme un fabricarium ou une entreprise où nous pourrions trouver cela. Et nous avons découvert, à Nanterre (92), un local de passionnés d'électronique et de mécanique qui nous ont très gentiment présenté leur 1000 m² de locaux et prêté leur appareil de soudure. Nous avons été très impressionnés des machines qu'ils ont acquit durant toutes ces années depuis la création de l'association car tout ce qui est là-bas est de la récupération. Le lien web de ce hackerspace : [https://www.electrolab.fr] | ||
+ | |||
+ | == Axes d'amélioration == | ||
+ | |||
+ | * Nous aurions pu améliorer le câblage : en effet, du fait que sa grande taille, notre robot possède de nombreux fils un peu partout. À notre avis, le nombre de fils ne peut pas être réduit car nous avons seulement mis le nécessaire. En revanche, ce qui peut être réduit est la taille de ceux-ci. Nous aurions pu faire notre robot plus petit et donc les fils auraient été plus courts. Mais nous avons choisi de le faire si grand car tout d'abord nous voulions un prédateur qui en jette, qui écrase toutes les petites proies (et également car notre shield était d'une taille importante donc nous voulions faire quelque chose d'assez aéré). | ||
+ | |||
+ | * Peut être sur un prochain projet, nous pourrions aussi faire notre propre carte pour supprimer l'interface entre Arduino et le Shield. En effet, cela réduira la place occupée car nous aurions plus qu'un élément au lieu de deux et cela réduira également les erreurs liés à l'interface entre les 2 composants. | ||
+ | |||
+ | == Ce que ce BE nous a apporté == | ||
+ | |||
+ | Clémence : Pour ma part, je n'avais que peu de compétences en électronique ou en informatique avant de commencer ce BE. Mais j'ai voulu le faire car c'est celui que je trouvais le plus intéressant : concevoir un robot de A à Z et justement acquérir un maximum de connaissances en électronique et en informatique, qui me serviront forcément dans ma vie future professionnelle. De plus, la mécanique est un domaine qui m'attire depuis longtemps. Ainsi, je me suis donné la mission de concevoir toute la partie mécanique de ce BE c'est-à-dire la réalisation du châssis du robot. J'ai donc créé ses contours, sa forme mais aussi imaginé l'emplacement, de manière précise, de chacun des éléments que nous allions devoir fixer sur le châssis. | ||
+ | |||
+ | Les débuts dans ce BE étaient un peu rudes pour moi car je me suis retrouvée immergée dans un contexte et avec un langage nouveaux. J'ai du donc apprendre un nouveau vocabulaire, mais cela était beaucoup moins dur que ce que j'imaginais ! Enfin, c'est mon partenaire Pierre qui a réalisé le codage, ce qui m'a permis appréhender la logique et de me familiariser avec cette technique. | ||
+ | |||
+ | Au final, ce BE fut très enrichissant pour moi car il m'a fait sortir de ma zone de confort et cela m'a fait découvrir un autre domaine que je ne connaissais quasiment pas. C'est exactement ce que j'attendais de ce Bureau d'Etudes ! | ||
+ | |||
+ | |||
+ | Pierre : Le Monde de la robotique m’était inconnu avant le Bureau d’Etude. La promesse d’un mélange entre électronique,informatique et mécanique, faites par la présentation du BE m’enchantait. C’est donc avec notre peu de connaissances que nous nous sommes lancés avec Clémence dans ce projet .“Vous allez réaliser de bout en bout un robot autonome” nous a t-on dit. Un rêve de Gamin. Les Phases d’électronique et d’informatique éveillaient en moi le plus d’intéret. | ||
+ | |||
+ | Les débuts ont étés difficiles. L’autonomie et la liberté accordée m’ont dérouté au commencement. Il fallait à la fois acquérir les connaissances techniques, mais aussi s’organiser autour d’une méthode de Projet jusqu’alors très peu connu pour moi. Mais la bonne ambiance et la bien bienveillance qui régnait dans le BE ont été porteuses. | ||
+ | |||
+ | Les nombreuses découvertes de ce BE me donne aujourd’hui envie de réaliser mes propres projets d’électronique communiquant (pourquoi pas rendre mon frigo intelligent ?). Surtout, la découverte de la philosophie d ”Arduino” m’a ouverte le champ des possibles. Cela renforce aussi mon choix de m’orienter en Section IMA l’année prochaine. | ||
− | |||
− | + | [[Fichier:Photo de fin.jpeg|thumb|300px|center]] | |
− |
Version actuelle datée du 16 juillet 2018 à 15:32
Sommaire
BE IMA Proie et Chasseur
Béchet Clémence / Gautreau Pierre
Re-Définition du Projet et Phase d'Idéation
Le Projet :
Le Bureau d’Etudes porte sur la réalisation de robots communicants sur le thème “Proies et Prédateurs”. Il s’agit alors, dans le cas d’un Robot Prédateur, de concevoir un robot capable de détecter les proies et de les chasser ou bien, dans le cas de la proie, de produire un robot capable de détecter les chasseurs et de les semer. La problématique du robot chasseur qui était “Comment optimiser la détection de l’objectif et comment atteindre l’objectif lorsqu’il est en mouvement ?” nous semblait plus intéressante et plus complexe dans le sens où chacun a son approche et stratégie de “Traque”.
Le noyau principal du projet est la conception d’un automate qui se meut dans son environnement. Il ne doit pas mettre en danger son environnement ou se mettre en danger lui même (Merci M. Asimov). Pour cela, il doit être capable d’observer et de comprendre ce qui l’entoure. Le Deuxième point important concerne la détection de l’objectif. L’automate doit être capable de détecter son objectif et déterminer sa position par rapport à celui-ci. Il faut noter que dans le modèle naturel “Proie vs. Prédateur”, la traque se doit d’être méthodique et rapide. Il convient d’appliquer ces concepts dans la réalisation de notre robot.
Nos Choix :
À la pensée de prédateurs, nous avons tout de suite pensé aux rapaces et cela nous a donc amené à parler de Faucons. Étant tout deux de grands fans de Star Wars, nous avons tout de suite imaginé un Faucon Millenium. Il parait judicieux de concevoir le robot le plus rapide du groupe afin de faciliter la traque. Nous avons donc décider d’utiliser des moteurs continus contrôlés en tension. La programmation du robot nous parait importante, c’est pourquoi nous comptons passer plus de temps dessus à défaut de faire la carte électronique. Nous utiliserons donc un shield optimisé pour notre robot en complément d’une carte Arduino. Concernant la méthode de traque, nous souhaitons mettre au point une méthode de détection efficace. Nous avons considérer le système de vision de l’Homme et nous l’avons simplifié pour l’adapter à notre automate. Nous allons donc créé une tourelle rotative de détection. Elle sera composée de plusieurs détecteurs infra-rouge. Son mouvement sera indépendant de celui du châssis, ainsi nous réduisons les angles morts de détection. Concernant le châssis, il doit être léger et fonctionnel.
Élaboration du bouclier
Nous avons en premier lieu listé tous les composants dont nous aurons besoin pour l'élaboration de notre robot pour préciser leur disposition. Ainsi, nous avons pu concevoir notre bouclier de manière optimale en prenant en compte toutes ces informations.
Ensuite, nous avons réfléchi à la manière dont on voulait que notre robot chasseur détecte la lumière LED de la proie. Nous avons alors imaginé mettre une tourelle composée de 3 capteurs infrarouge. Nous pensons que si nous ne prenons qu'un seul capteur, la détection de la proie sera moins précise. En effet, les 3 capteurs ne vont pas détecter la proie au même moment donc cela nous permettra de dire avec précision où se trouve la proie.
Puis, nous avons finalisé le Schematic et le PCB de notre bouclier d'Arduino. Pour cela, nous avons réagencé la disposition des différents composants. Notamment les câbles que nous avons du déplacer pour minimiser les erreurs liées à la proximité de 2 câbles. Cependant, nous avons du faire face à un problème majeur : certains câbles en chevauchaient d'autres. Nous avons donc opté pour des ponts que nous relirons avec des fils après impression du bouclier. Nous avons enfin rajouter 2 LED à notre bouclier qui serviront au débogage du robot.
Après avoir conçu le bouclier, nous sommes allés l'imprimer et nous avons ensuite souder des fils reliant les composants sur ce shield.
A la suite de cela, nous nous sommes répartis les tâches à effectuer : l'un s'occupait de coder l'Arduino tandis que l'autre devait concevoir le châssis du robot.
Élaboration du châssis
Concernant la conception de la forme du châssis, nous avons décidé de faire un Faucon Millénium, vaisseau de Star Wars© et nous nous sommes donc inspiré de sa forme. Nous avons aussi voulu faire 2 plaques de plexiglas reliées entre elles par des entretoises pour placer des éléments entre comme la batterie, ou l'électro-aiment.
Pour concevoir ce châssis, nous avons utilisé Inkscape, ce qui nous permettait de le réaliser à la découpe laser.
Vidéo de la découpe laser :
Ainsi après avoir créé la forme, nous avons du faire les trous : ceux qui allaient servir à relier les deux plaques entre elles, ceux qui allaient fixer l'Arduino ou encore ceux pour faire passer les fils d'une plaque à l'autre. Pour ceux de l'Arduino, nous avons utilisé Fritzing qui propose des modèles d'Arduino avec les emplacements précis de leur trous. Malheureusement, en découvrant l'impression, nous avons remarqué que les trous effectués n'étaient pas bien placés (sauf 2). Ce problème est lié au modèle que Fritzing nous a donné, nous pensions qu'il s'agissait du bon en vue de l'Arduino que nous avions choisi mais nous nous sommes trompés. Ainsi, pour palier à ce problème, nous sommes simplement allés au Fabricarium et nous avons percer des trous supplémentaires.
Ensuite, pour fixer la batterie qui se situe sur la plaque inférieure, nous avons imaginer un système avec 4 fixations placés en carrés. C'est-à-dire 3 entretoises fixes et une pièce en plexiglas que nous pouvons enlever facilement si nous voulons retirer la batterie.
Pour les roues, nous les avons fixées sur une 3ième petite plaque qui est reliée à la plaque inférieure pour soutenir les moteurs des roues. Nous avons fixé ces deux plaques à l'aide de 8 entretoises. Nous avons également mis une roue folle sur le devant du robot.
Nous avions enfin une spécificité notable sur notre robot/vaisseau : il s'agit d'une tourelle, placée sur le servomoteur, pour y fixer les 3 T-sop. Nous avons choisi d'en mettre 3 pour couvrir un large champs de vision mais également pour plus de facilité à repérer la proie. En effet, lorsqu'un T-sop détectera un signal mais que son voisin ne le détectera pas, cela nous donnera la position exacte de la proie. Nous avons donc du coder cette spécificité.
Vidéo de l'élaboration de la tourelle :
Code
Une fois l'électronique au point, il ne reste plus qu'a créer le meilleur code possible relatif à la configuration matériel. La première phase à été une étape de découverte de l'Arduino. Nous avons aussi pas mal testé les différents composants, afin d'en avoir une compréhension suffisante pour la suite.
Une fois les bases acquises, il faut se lancer et visualiser la finalité du code. J'ai séparé le code en différents modules (déplacement, détection, servomoteur) afin de faciliter chaque étape de programmation et surtout pour éviter de perdre trop de temps sur le débogage. Enfin, une fois les différents modules au point, il ne reste plus qu'à les imbriqués.
#include <Servo.h> #include <IRremote.h> #include <IRremoteInt.h> // TSOP char TSOP1 = A0; char TSOP2 = A1; char TSOP3 = A2; int cas = 0; IRrecv IR1(TSOP1); // créer les instances irrecv IRrecv IR2(TSOP2); IRrecv IR3(TSOP3); decode_results results; void detect() { if (IR1.decode(&results)) { cas = 1; IR1.resume(); } else if (IR2.decode(&results)) { cas = 2; IR2.resume(); } else if (IR3.decode(&results)) { cas = 3; IR3.resume(); } } // ELECTO-AIMANT int EA = 53; // SONAR int TRIG=41; int ECHO=43; const unsigned long MEASURE_TIMEOUT = 25000UL; const float SOUND_SPEED = 340.0 / 1000; float sonar() { digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); /* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */ long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT); /* 3. Calcul la distance à partir du temps mesuré */ float distance_mm = measure / 2.0 * SOUND_SPEED; return distance_mm; } //MOTEURS int PWM_motorA=10; int PWM_motorB=9; int AIN1=50; int AIN2=48; int BIN1=44; int BIN2=42; int STDY=46; unsigned long previous = millis(); // SERVO class Sweeper { Servo servo; // the servo int pos; // current servo position int increment; // increment to move for each interval int updateInterval; // interval between updates unsigned long lastUpdate; // last update of position public: Sweeper(int interval) { updateInterval = interval; increment = 1; } void Attach(int pin) { servo.attach(pin); } void Detach() { servo.detach(); } void Update() { if((millis() - lastUpdate) > updateInterval) // time to update { lastUpdate = millis(); pos += increment; servo.write(pos); Serial.println(pos); if ((pos >= 160) || (pos <= 0)) // end of sweep { // reverse direction increment = -increment; } } } }; Sweeper servoTour(50); void setup() { IR1.enableIRIn(); IR2.enableIRIn(); IR3.enableIRIn(); servoTour.Attach(8); pinMode(EA,OUTPUT); digitalWrite(EA,LOW); pinMode(TRIG,OUTPUT); digitalWrite(TRIG,LOW); pinMode(ECHO,INPUT); pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(BIN1,OUTPUT); pinMode(BIN2,OUTPUT); pinMode(PWM_motorA,OUTPUT); pinMode(PWM_motorB,OUTPUT); pinMode(STDY,OUTPUT); digitalWrite(AIN1,LOW); digitalWrite(AIN2,LOW); digitalWrite(BIN1,LOW); digitalWrite(BIN2,LOW); digitalWrite(STDY,LOW); analogWrite(PWM_motorA,0); analogWrite(PWM_motorB,0); digitalWrite(11,LOW); }; void loop() { servoTour.Update(); digitalWrite(STDY,HIGH); digitalWrite(AIN1,HIGH); digitalWrite(AIN2,LOW); analogWrite(PWM_motorA,255); digitalWrite(BIN1,HIGH); digitalWrite(BIN2,LOW); analogWrite(PWM_motorB,255); if(sonar()<50) { digitalWrite(STDY,LOW); digitalWrite(BIN1,LOW); unsigned long tps = millis(); while (millis()-tps < 1000) { digitalWrite(STDY,HIGH); digitalWrite(BIN2,HIGH); analogWrite(PWM_motorB,255); previous = millis(); } } unsigned long time = millis(); detect(); switch (cas) { case 1 : while (millis()-time < 1000) { digitalWrite(BIN2,HIGH); digitalWrite(BIN1,LOW); analogWrite(PWM_motorB,255); previous = millis(); } break; case 2 : if (sonar()< 50) { digitalWrite(EA,HIGH); analogWrite(PWM_motorA,0); analogWrite(PWM_motorB,0); delay (5000); } case 3 : while (millis()-time < 1000) { digitalWrite(AIN2,HIGH); digitalWrite(AIN1,LOW); analogWrite(PWM_motorA,255); previous = millis(); } break; default: break; } };
Problèmes rencontrés durant le BE
- Ayant choisi des moteurs performants, ceux-ci nécessitent beaucoup de tension pour fonctionner. Nous avons sous-estimé ce besoin en début de projet. Or, durant la phase de programmation, nous nous sommes rendu-compte que notre robot n'avait pas assez de "jus" pour fonctionner. Cela à donc générer un certain nombre de soucis et de casses-têtes. Une solution serait de modifier l'alimentation du robot, et d'en choisir une plus adaptée à la configuration matérielle. Nous aurions pu échanger les moteurs par des servos continus, mais cela ne rentrait pas dans notre vision du projet (Conception d'un Robot relativement rapide).
- Nous avons rencontré des problèmes pour la tourelle : en effet, comme stipulé précédemment, nous avons mis 3 Tsop sur cette dernière et donc nous avions 3x3 = 9 fils dessus. Il y a donc beaucoup de frottement dû aux fils. Nous pensons toujours que la tourelle est une bonne idée car grâce à elle, le robot peut ratisser un large champs et ainsi capter la proie plus aisément. Donc pour un prochain projet, nous pourrions garder l'idée de la tourelle mais la perfectionner : lui attribuer par exemple un diamètre plus important pour que l'on puisse intégrer les Tsop à l'intérieur même de la tourelle et faire passer les fils de ceux ci dans une fente placée sur la tourelle. Comme cela, les fils ne créerait pas de frottement avec le châssis et la tourelle tournerait plus facilement. De plus, sur le servomoteur, nous pouvons remarquer que la partie qui tourne à la forme d'un petit engrenage. Donc, en créant la tourelle à l'imprimante 3D, nous aurions pu la dessiner avec un engrenage qui correspond parfaitement à celui du servomoteur. Ainsi, nous aurions pu les emboîter et il n'y aurait eu aucun frottement. Cette opération doit être toute fois extrêmement précise et elle demande beaucoup de temps : il faut repérer les dimensions exactes que doit avoir l'engrenage, le dessiner et l'imprimer avec une imprimante 3D d'une très grande précision pour que les 2 engrenages s'emboîtent au mieux (de l'ordre du micromètre). Voilà comment nous aurions pu améliorer notre tourelle.
- Dernier petit problème rencontré (et petite anecdote notable) : pendant les vacances, nous avons voulu peaufiner notre robot et lorsque nous avons testé notre programme qui permet au robot de rouler, nous avons constaté qu'une seule roue tournait. Donc nous nous sommes intéressés au moteur de cette roue et en le touchant, un de ses fils s'est dessoudé. Nous avons donc été très embêtés car nous n'avions pas d'appareil pour souder chez nous. Nous avons donc cherché un endroit près de chez nous, comme un fabricarium ou une entreprise où nous pourrions trouver cela. Et nous avons découvert, à Nanterre (92), un local de passionnés d'électronique et de mécanique qui nous ont très gentiment présenté leur 1000 m² de locaux et prêté leur appareil de soudure. Nous avons été très impressionnés des machines qu'ils ont acquit durant toutes ces années depuis la création de l'association car tout ce qui est là-bas est de la récupération. Le lien web de ce hackerspace : [1]
Axes d'amélioration
- Nous aurions pu améliorer le câblage : en effet, du fait que sa grande taille, notre robot possède de nombreux fils un peu partout. À notre avis, le nombre de fils ne peut pas être réduit car nous avons seulement mis le nécessaire. En revanche, ce qui peut être réduit est la taille de ceux-ci. Nous aurions pu faire notre robot plus petit et donc les fils auraient été plus courts. Mais nous avons choisi de le faire si grand car tout d'abord nous voulions un prédateur qui en jette, qui écrase toutes les petites proies (et également car notre shield était d'une taille importante donc nous voulions faire quelque chose d'assez aéré).
- Peut être sur un prochain projet, nous pourrions aussi faire notre propre carte pour supprimer l'interface entre Arduino et le Shield. En effet, cela réduira la place occupée car nous aurions plus qu'un élément au lieu de deux et cela réduira également les erreurs liés à l'interface entre les 2 composants.
Ce que ce BE nous a apporté
Clémence : Pour ma part, je n'avais que peu de compétences en électronique ou en informatique avant de commencer ce BE. Mais j'ai voulu le faire car c'est celui que je trouvais le plus intéressant : concevoir un robot de A à Z et justement acquérir un maximum de connaissances en électronique et en informatique, qui me serviront forcément dans ma vie future professionnelle. De plus, la mécanique est un domaine qui m'attire depuis longtemps. Ainsi, je me suis donné la mission de concevoir toute la partie mécanique de ce BE c'est-à-dire la réalisation du châssis du robot. J'ai donc créé ses contours, sa forme mais aussi imaginé l'emplacement, de manière précise, de chacun des éléments que nous allions devoir fixer sur le châssis.
Les débuts dans ce BE étaient un peu rudes pour moi car je me suis retrouvée immergée dans un contexte et avec un langage nouveaux. J'ai du donc apprendre un nouveau vocabulaire, mais cela était beaucoup moins dur que ce que j'imaginais ! Enfin, c'est mon partenaire Pierre qui a réalisé le codage, ce qui m'a permis appréhender la logique et de me familiariser avec cette technique.
Au final, ce BE fut très enrichissant pour moi car il m'a fait sortir de ma zone de confort et cela m'a fait découvrir un autre domaine que je ne connaissais quasiment pas. C'est exactement ce que j'attendais de ce Bureau d'Etudes !
Pierre : Le Monde de la robotique m’était inconnu avant le Bureau d’Etude. La promesse d’un mélange entre électronique,informatique et mécanique, faites par la présentation du BE m’enchantait. C’est donc avec notre peu de connaissances que nous nous sommes lancés avec Clémence dans ce projet .“Vous allez réaliser de bout en bout un robot autonome” nous a t-on dit. Un rêve de Gamin. Les Phases d’électronique et d’informatique éveillaient en moi le plus d’intéret.
Les débuts ont étés difficiles. L’autonomie et la liberté accordée m’ont dérouté au commencement. Il fallait à la fois acquérir les connaissances techniques, mais aussi s’organiser autour d’une méthode de Projet jusqu’alors très peu connu pour moi. Mais la bonne ambiance et la bien bienveillance qui régnait dans le BE ont été porteuses.
Les nombreuses découvertes de ce BE me donne aujourd’hui envie de réaliser mes propres projets d’électronique communiquant (pourquoi pas rendre mon frigo intelligent ?). Surtout, la découverte de la philosophie d ”Arduino” m’a ouverte le champ des possibles. Cela renforce aussi mon choix de m’orienter en Section IMA l’année prochaine.