Robot capable de détecter et d`afficher des obstacles
Transcription
Robot capable de détecter et d`afficher des obstacles
Robot capable de détecter et d'afficher des obstacles Adel Kherchache Terminale S 3 Guillaume Gobin Terminale S 3 Sylvain Moretti Terminale S 3 Isnarduino.fr - Page 1 SOMMAIRE Présentation..................................................................................................................................Page 3 Environnement de travail.............................................................................................................Page 5 Répartition des taches et collaboration........................................................................................Page 6 Partie personnelle Partie personnelle d'Adel........................................................................................................Page 8-10 Partie personnelle de Sylvain...............................................................................................Page 11-13 Partie personnelle de Guillaume...........................................................................................Page14- 18 Annexe...................................................................................................................................Page20-41 Isnarduino.fr - Page 2 PRESENTATION Le projet s'est déroulé en 2 parties, la partie virtuel effectué sur l'IDE processing, et la partie électronique que nous avons réalisé avec l'hardware arduino. Dans un premier temps la problématique de notre projet était de développer un programme qui gérera les déplacements d'un robot virtuel, dans notre programme le robot sera modélisé par un carré. Ce dernier devra cartographier une pièce dans laquelle il aura était placé. Pour cette partie nous nous sommes débrouillé seul avec quasiment aucune aide extérieure au groupe. Ensuite nous sommes passé à la partie "physique" du projet, pour cela nous avons utilisé le software et l'hardware arduino, qui nous ont permis de réaliser notre projet avec le peu de connaissances que nous avions. Pour cette partie nous avons fait beaucoup de recherches sur internet, nous nous sommes en fin de compte orienté sur youtube qui nous offrez le plus de solutions et surtout des images sur lesquelles nous pouvions nous appuyer. La première étape que nous avons effectué fut la création de l'environnement, 2D dans notre cas. L'ordinateur devait simplement représenter une pièce dans laquelle nous placerions notre robot afin qu'il la scan. Pour cela nous avons utilisé une "matrice", un tableau à double entrée, qui formait un ensemble de cases qui elle-mêmes formaient la pièce. Au début une case valant 1 représentait un obstacle et une case valant 0 représentait une case vide. Ensuite vint la création du robot, au début une simple méthode, elle évolua en une "class", donc un objet. La robot créé nous passâmes à la création de l'intelligence artificielle, il fallait ici coder chaque réponse possible pour toutes les situations dans lesquelles le robot pouvait se trouver et ainsi qu'il ne soit jamais bloqué ou bugué. C'est sur cette partie que nous avons passé le plus de temps. Une fois la base du programme créée nous nous sommes attelés aux obstacles, d'abord fixes, nous les avons amélioré pour qu'à chaque lancement du programme ils soient différents. Enfin la dernière partie, la création de la seconde fenêtre et des options. Cette partie a été réalisée en langage JAVA non-simplifié, donc dans le langage que pouvait utiliser un développeur. Pour le projet nous devions créer un site, les autres groupes ayant choisis de créer le leur sur des sites déjà pré-fabriqué tel que webnode.fr, nous avons choisi, et c'est important de le souligner vu le temps que cela nous a pris, de développer le notre de A à Z en HTML/CSS/JAVASCRIPT. Isnarduino.fr - Page 3 A partir de là, le premier objectif était rempli : la partie virtuelle. Il nous a maintenant fallu réaliser la partie arduino. Malgré ce que l'on peut penser, et cela grâce à la simplicité d'utilisation de l'arduino, ce fut la plus simple et la plus rapide des tâches que nous ayons accompli. Le plus long a été d'attendre le matériel que nous avions préalablement commandé, une fois reçu nous avons finis le robot en seulement 2 séances de groupe. Nous avions la voiture et tout le matériel pour construire une vraie voiture autonome. Nous avons donc enlevé tout ce qui ne nous servait pas, la coque, les piles... Puis nous avons installé le module arduino à la place de l'ancienne carte électronique, ne restait plus qu'à brancher le moteur et le servo-moteur au Motorshield, qui se trouvait sur l'arduino et à développer un simple code, avec le software d'arduino, pour que la voiture avance et recule. Nous avons ensuite amélioré le tout en rajoutant un interrupteur, que nous avons nous-même créé, ainsi notre voiture était entièrement autonome... ou presque ! A ce jour elle fonctionne, mais uniquement quand elle se trouve branchée à l'ordinateur par le câble USB, elle ne fonctionne pas avec une alimentation par pile 9V. ( POUR LES CODES VOIR ANNEXES ) Isnarduino.fr - Page 4 ENVIRONNEMENT DE TRAVAIL Pour notre projet nous avons donc utilisé en premier lieu l'IDE open-source processing. (processing.org) Ensuite nous avons utilisé le software et hardware arduino ( arduino.cc ) deux environnement de travail très bien adapté pour des élèves de Terminales voulant s'initier au monde passionnant de l'informatique, et l'un de leur principaux avantages est qu'ils sont gratuits et open-source. Pour le partage en ligne, nous utilisé Google Drive :(google.com/intl/fr_fr/drive/) Google Drive est aussi totalement gratuit et l'accès au partage est simple se qui favorise l'échange entre camarades. Enfin, pour le développement de notre site web nous avons utiliser Sublim eText, lui aussi gratuit et vraiment intéressant. ( sublimetext.com) Isnarduino.fr - Page 5 Répartition des tâches Tache Mise au point des objectifs Création de la carte Création du robot Création de l'intelligence artificielle Création d'obstacles Création d'une seconde fenêtre Mise en commun et finalisation Début de la partie robotique : réflexion Achat du matériel Démontage d'une voiture Assemblage du robot Planning 02/11/14 12/11/14 10/12/14 Nom Adel/Guillaume/Sylvain Adel/Guillaume Adel 12/12/14 Guillaume 19/12/14 Guillaume/Sylvain 30/12/14 Sylvain 02/01/15 Adel/Guillaume/Sylvain 14/01/15 Adel/Guillaume/Sylvain 15/01/15 30/01/15 04/02/15 Sylvain/Guillaume Adel/Guillaume/Sylvain Adel/Guillaume/Sylvain Au début, le groupe n’était formé que de Guillaume et d’Adel, puis Sylvain nous a rejoint, étant fort intéressé par notre idée de voiture autoguidée. Nous sommes tous les trois passionnés d’informatique et de robotique. La collaboration s’est donc naturellement effectuée sous l’égide de l’amitié et de l’entente. Nous nous sommes tout de suite entendus sur le fait de partager le travail. Guillaume a donc pris la partie algorithmique (donc de l’intelligence artificielle) du programme, Adel s’est chargé du robot et de la carte tandis que Sylvain s’est chargé de la seconde fenêtre et de tous ce qui lui était lié. Pour cette collaboration nous avons utilisé la plate forme de partage en ligne la plus pratique et la plus rependus : Google Drive. A chaque modification, ou ajouts, au projet, une nouvelle sauvegarde était créé, avec le nom de l’élève et la date à laquelle la Isnarduino.fr - Page 6 modification à était effectuée. Cette méthode nous a permis de suivre le rythme d’évolution du projet et ainsi de donner un petit coup d’accélérateur que cela était nécessaire. Enfin quand chacun pensait avoir finis sa partie, nous avons mis le tout en commun et finaliser le projet, en y ajoutant quelques point ou en corrigeant d’autres. Isnarduino.fr - Page 7 Partie Personnelle Adel Notre projet comporte deux grandes parties : celle concernant l'Arduino, avec le robot, et celle concernant la partie Processing. Pour cette dernière, nous étions dans l'obligation de créer un environnement dans lequel le robot pouvait se mouvoir. Cet environnement allait donc contenir les différents obstacles générés aléatoirement, ainsi que le robot. Nous nous sommes donc demander comment il serait possible de créer un tel environnement. Après maintes recherches, c'est seulement après une discussion avec un ami que l'idée de matrice apparue. Guillaume et moi avons ainsi réfléchis sur son utilisation... Comment la créer ? Comment en faire un environnement utilisable facilement et rapidement ? Pour la créer nous avons penser à faire deux boucles for emboîté permettant de balayer, à l’aide des variables i et j, tout le tableaux. Ceci nous a permis de rentrer des valeurs dans le tableau, ces valeurs correspondant aux obstacles ou autres. A l’aide de la variable gC, nous avons pu synchroniser le tableau avec l’affichage. En effet, la variable , était la valeur de référence; on multiplier les coordonnées du robot x,y par gC, pour qu’il se déplace de case en case, on divisait i et j pour donner respectivement u et v, pour que les coordonnées des cases affichés à l’écran correspondent aux coordonnées dans le tableau. Une fois cela terminé, ma première partie personnelle du projet était de créer le robot qui allait ensuite se déplacer, rien de bien compliqué, car Guillaume tenait à se charger personnellement de la partie plus difficile : l'intelligence Artificielle. L’objectif était donc de créer l’objet en lui-même. Ici, la programmation orienté objet est donc nécessaire. C’est pour cela que j’ai créé l’objet “Robo”, qui prendrait comme paramètres “rX”, soit la coordonnée en x, ainsi que “rY”, soit la coordonnée en y, sans oublier le cosmétique avec le choix de la couleur grâce à la variable “couleur”. J’ai eu un petit problème au début pour “synchroniser” le robot avec la matrice, mais après plusieurs essais j’ai fini par résoudre le problème : il suffisait de multiplier la coordonnée voulu par “gC” (soit la taille d’une case de matrice). création de l’objet : Robot robot = new Robot(x*gC,y*gC,#EA1111); . Isnarduino.fr - Page 8 Le robot. Une fois cela terminé, je commençais à développer le site web pendant que Guillaume et Sylvain s’occupaient de la génération des obstacles et de la seconde fenêtre. Pas grand chose en particulier à développer sur ce point, si ce n’est que je l’ai codé en HTML/CSS, et que du javascript est également présent, par exemple sur la catégorie “Code Source”. J’avais prévu à la base de créer un mode édition pour pouvoir ajouter des pages au carnet de bord plus simplement que de passer par le logiciel FileZilla, mais un problème s’est posé quant à la mise en place de la fonction car je manque de connaissances en PHP et base de données.. Il est possible de visualiser le cours du travail en se rendant sur la page d’accueil et en cliquant sur “rentrer en mode édition”. Le mot de passe est simplement “edition”. On se retrouve ensuite sur la page suivante avec un formulaire que l’on peut remplir. Capture d’écran de la page d’édition. Tout le développement de comment a été fait la partie machine (arduino) se trouve sur la partie personnelle de Guillaume car nous ne voulions pas dupliquer trois fois la même chose (schémas etc…). Isnarduino.fr - Page 9 Enfin , j’aurais aimé développer une application mobile qui soit liée avec le robot par wifi ou Infrarouge (ou même par bluetooth), afin qu’elle montre ce que celui-ci est en train de cartographier, néanmoins la partie machine a pris bien plus de temps que prévu. De plus il se pose des problèmes sur le fonctionnement de l’application, car la mise en situation réelle était plus complexe (car plus de paramètres à prendre en compte, comme la taille de la salle, la position de départ du robot, la forme des obstacles qui ne sont pas tous rectangles comme sur processing etc) que sur la partie logicielle processing. Cette expérience fut très enrichissante personnellement, car c’est le premier projet de groupe que je fais sur un sujet qui me tient particulièrement à coeur : l’informatique. Cela m’a donc appris le travail d’équipe, le travail à long terme sur une même chose, etc.. De plus, j’ai appris beaucoup de choses en Processing, ce qui m’a donné envie de commencer mon propre projet personnel : un jeu de rôle à l’époque médiéval ( http://klaes-fate.livehost.fr/ ). Isnarduino.fr - Page 10 Partie personnelle de Sylvain Suite au partage des taches je devais m'occuper des obstacles, de la création d'une seconde fenêtre et de tout le paramétrage du programme. J'ai donc commencer pas la création d'une seconde fenêtre, dans JAVA, la class responsable de la fenêtre est la classe JFrame, j'ai donc créer une classe « PFrame », qui hérité des attributs de Jframe : class PFrame extends Jframe A cette classe j'ai ajouter ensuite quelques modifications, comme sa taille, son titre, sa position au lancement du programme... Je me suis ensuite atteler à la création des boutons, là encore les fonctions déjà présente dans JAVA, qui ne nécessitent qu'un import, m'ont bien aidé puisque la encore je me suis servis de l'hérédité, vraiment très pratique, qu'offre JAVA : class Slide extends JSlider Exemple de Slider : Dans la classe Slider, j'ai ensuite modifier là encore quelques paramètres tel que sa taille, son minimum, son maximum, les ticks ( entre les petits et les grand traits sur l'image du dessus )... J'y ai ensuite ajouter la méthode « StateChanged » : void stateChanged(ChangeEvent event) Isnarduino.fr - Page 11 Cette méthode tourne en boucle et vérifie l'état du slider, si ce dernier change, si on le met par exemple a 20, la méthode va immédiatement le savoir et ainsi exécute l'instruction à la suite : compteurAmpliMax=((JSlider)event.getSource()).getValue();compteurAmpli = 0; Si on met le Slider a 20, compteurAmpliMax prend la valeur 20. class Pan extends JPanel Un JPanel est un conteneur qui se trouver a l’intérieur d'une fenêtre : J'ai ensuite créer des boutons, encore une fois mon travail fut simplifié par les fonctions intégrées dans JAVA : final JRadioButton but1 = new JRadioButton("Cyan"); J'ai donc créer un nouvel objet de la class JRadioButton , le mot-clés « final » signifie qu'il est non modifiable, le programme ne marche pas si il n'est pas présent. A ces boutons on ajoute ensuite la fonction actionPerformed(ActionEvent e), qui a un peu le meme principe de fontionnement que stateChanged(ChangeEvent event) : void actionPerformed(ActionEvent e) if(but1.isSelected() == true) {coul = #00F4FF;} }}); Si on presse le bouton ( on clique dessus ), la variable « coul » est modifié. Isnarduino.fr - Page 12 Apres l'ajout des panels, slider et boutons il faut maintenant les ajouter à a la fenetre, avec la méthode « add », qu'on applique à « this » qui est la fentre ici : this.add(panGroup2); Le panel « panGroup2 » est ajouter à la fenêtre. Pour finir on rend notre fenêtre visible avec : this.setVisible(true); POUR LE CODE COMPLET, VOIR ANNEXE Étant fortement intéresser par l'informatique, j'avais acheté et lu « Apprenez à programmer en Java ( Livre du Zéro ) de Cyrille Herby, pendant les vacances de transition entre la première et la terminale, c'est pour cela que j'ai utilisé des méthodes non vus en cours tel que ActionListener(). C'est aussi grâce a cela que je n'ai pas eu de réelle difficulté a développer cette partie, cela représente environ 5 ou 6 heures de travail. Lors de la mise en commun du projet j'ai évidement expliquée tout cela a mes collègues. Ce que le travail m'a apporté c'est encore plus de passion pour l'informatique, des connaissances en JAVA mais aussi à travailler en équipe et à faire confiance à mes collègues, car nous avons construits une véritable entente, même si tout le monde ne travaille et n'apporte pas autant au groupe, je pense que nous avons tout les trois appris beaucoup de ce projet. Isnarduino.fr - Page 13 Partie personnelle de Guillaume: Notre projet se constituait de deux parties : la partie arduino avec le robot et la partie processing. Pour la partie processing, nous devions créer un environnement dans lequel le robot pouvait se déplacer. Il fallait un environnement où des obstacles aléatoires apparaissait et ou on pouvait faire la différence entre les obstacles et le vide automatiquement et simplement. L’idée de faire une matrice m’est venu d’un ami pendant une discussion. Ayant l’idée en tête, je l’ai partagé au reste de l’équipe. Adel et moi avons réfléchis sur l’utilisation de la matrice. Comment la créer ? Comment en faire un environnement ? Pour la créer nous avons penser à faire deux boucles for emboîtées permettant de balayer, à l’aide des variables i et j, tout le tableaux. Ceci nous a permis de rentrer des valeurs dans le tableau, ces valeurs correspondant aux obstacles ou autres. A l’aide de la variable gC, nous avons pu synchroniser le tableau avec l’affichage. En effet, la variable gC, était la valeur de référence; on multiplier les coordonnées du robot x,y par gC, pour qu’il se déplace de case en case, on divisait i et j pour donner respectivement u et v, pour que les coordonnées des cases affichées à l’écran correspondent aux coordonnées dans le tableau. Une fois la matrice synchronisée je me suis tourné vers l’algorithme du comportement du robot. La création de cet algorithme a été plutôt long. Au début, je suis parti sur une idée simple. J’ai fais un comportement en cas par cas, c’est à dire, que je définissais chaque situation dans laquelle le robot pouvait se trouver, et j’y assignais une réponse. Ces situations correspondait à l’emplacement des obstacles par rapport au robot et sa direction. Et les réponses était qu’il aille soit vers sa gauche, soit vers sa droite, ou faire demi-tour. Ce premier algorithme effectué, je le partageais avec mes associés. L'algorithme présentait de gros défauts. En effet, malgré la réaction pour chaque cas, le robot n’avait aucune diversité dans son déplacement et les répétés sans cesse, il ne pouvait pas cartographier l’environnement comme ceci. Pour remédier à ce problème j’ai essayé de penser un tout autre algorithme, en oubliant le précédent. Le nouveau algorithme était un algorithme scripté. En effet, je donnais au départ une direction au robot, et suivant ça direction, lorsqu’il rencontrait un obstacle, il montait d’une ou deux cases, et revenait en arrière. Il dessinait ainsi des zig-zag, faisant des allez et retour décalés. Les “zig-zag” changaient de sens quand il ne pouvait plus descendre ou monter, il faisait donc des “zig-zag” verticaux, et ainsi de suite. Cet algorithme était prometteur. Nous n’avions pas encore fait les obstacles, et sans ceux là, l’algorithme était parfait, il cartographiait l’intégralité de la pièce. Isnarduino.fr - Page 14 Ensuite, nous nous sommes donc penché sur les obstacles avec sylvain. Tout d’abord, j’ai cherché de mon côté. J’avais recréé une méthode rect() mais dans la matrice. C’est à dire qu’avec cette méthode, ceci pouvait me créer un rectangle d’obstacle dans l’environnement 2D. J’ai donc ensuite créé un par un les obstacles, leur mettant des coordonnées et des dimensions aléatoires avec int(random());. Ensuite, Sylvain a eu l’idée de faire de l’obstacle un objet, et de se servir d’une boucle pour les générer au lieu de les faire un par un. Nous nous mettions au travail cherchant à faire cela. En s’inspirant de la méthode préalablement créé, nous faisions l’objet obstacle, et ensuite, avec une boucle for, tournant jusqu’à un nombre aléatoire, qui correspondait au nombre d’obstacles générés, nous mettions la création de l’objet, avec des coordonnées et des dimensions aléatoires, et nous l’appelions tout de suite après. Les obstacles s’affichaient très bien. Nous avons connu un petit soucis pendant une génération: un obstacle c’était généré sur l’emplacement d’apparition du robot, le robot était donc coincé. Pour ça, sylvain et moi avons reprit la fonction rect() créé spécialement pour la matrice, et nous avons inversé les Isnarduino.fr - Page 15 valeurs de génération. C’est à dire qu’au lieu de créer un rectangle d’obstacle, nous avons créé un rectangle de vide, sur l’emplacement du robot. Ainsi, il n’y avait plus de soucis. A ce moment là, le projet était comme finit. Sauf que l’algorithme du robot ne fonctionnait plus comme il devait. Il présentait des imperfections, où il lui arrivait de traverser les obstacles ou même quand il ne le faisait pas, il ne cartographier pas l’intégralité de la carte. En effet, il faisait son chemin scripté de “zig-zag”, mais 90% des générations faites, il revenait sur ses pas, et ne cartographier plus rien de nouveau. J’ai donc essayé de trouver une solution; celle ci était était de dire au robot lorsqu’il restait sur une zone déjà vérifié pendant trop de temps, autrement dit, s’il restait sur ses pas, qu’il devait prendre une nouvelle direction aléatoire. J’avais résout ce problème, mais cependant l’algorithme présentait toujours cette imperfection de traverser les murs une génération sur dix environ. Cet algorithme que j’avais fais était plutôt complexe, des booleans et tout autres conditions était en jeu, tout était équilibré pour fonctionnait, je ne voyais pas d’où venait le problème. J’essayais de modifier des lignes, mais ça déséquilibrer tout le reste, et l’algorithme ne fonctionnait plus. Jusqu’au moment ou j’avais compris d’où venait le problème. C’était que pendant un cas précis, un type de boolean, s’activer, et ne se désactiver plus, faisant tout buguer. Réfléchissant, la solution était de faire encore plus d’instructions et de conditions, pour faire des réponses pour d’autres cas, et donc d’agrandir l’algorithme. Sauf, qu’à la base, j’avais créé cet algorithme pour être moins long, plus compact, plus efficace. Il ne l’était donc pas, peut-être plus compact, plus efficace, mais imparfait. J’étais dans une impasse. Je me suis donc retourné vers mon ancien algorithme, qui était parfait mais qui malheureusement ne donnait aucune diversité de déplacement au robot. J’ai donc eu l’idée de faire un second algorithme lié à ce dernier pour donner de la diversification au déplacement. L’idée était de mettre un compteur qui incrémentait de 1 à chaque tour du draw() et que s’il arrivait à une valeur tM il prenait une direction aléatoire. Ainsi, l’algorithme était parfait, et ayant un mouvement diversifié. Par la suite, j’ai implanté mon nouvel algorithme au programme original, sylvain avait mit son onglet “paramétrage”, et notre programme semblait finit. Tout les trois, nous avons repris le programme de A à Z. Nous avons corrigé des imperfections, amélioré des lignes de codes, mit des commentaires, et changé le nom de quelques variables et de méthode pour qu’elles soient plus explicite, nous avons aussi rajouté des options dans l’onglet paramétrage. Nous avons finalisé le programme. Après ça, pour s’assurer de la perfection du programme, nous avons fait une série de test : nous avons allumé le programme de nombreuses fois pour voir s’il y avait des problèmes de génération d’obstacle, nous avons Isnarduino.fr - Page 16 attendu que le robot cartographie l’intégralité de la pièce pour voir s’il y avait un problème dans l’algorithme, nous avons même chronométré le temps que prenait le robot à tout cartographier, et pour chaque génération, le robot a cartographiait l’intégralité de l’environnement en environ 5 min. Ce qui était plutôt satisfaisant. Après le programme finit, nous nous sommes lancé dans la partie Arduino. Sylvain a ramené une voiture qu’il avait chez lui, nous l’avons démonté, enlevé ce qui était inutile, gardant le moteur, servo moteur, les roues et le châssis. Quand nous avions tout les composants, nous avons attendu longtemps avant d’avoir le motor shield. Le motor shield nous permettait de protéger la carte Arduino UNO. En effet, si on branchait les moteurs directement à la carte Arduino ceux ci pouvaient l’endommager. Nous avons donc placé le motor shield au dessus de l’arduino et avons branché le moteur et le servo moteur. Avec un programme très simple à coder, nous avons tout d’abord fait avancé le robot. Puis nous l’avons fait, avancer et reculer et ensuite nous l’avons fait zigzaguer, tout en avançant ou en reculant. Pour finir, nous avons construit un interrupteur avec des matériaux préalablement acheté pour pouvoir faire un capteur de chocs. Pour faire cet interrupteur nous avons acheté 1 barre d’aluminium d’un mètre, des ressorts très petits et fins, du ruban adhésif et de la glu. Nous avons découpé la barre d’1 mètre, pour avoir deux barres de 20 centimètre, nous avons tordu une barre des deux cotés pour pouvoir y fixer les ressorts. Et nous avons collé les ressort avec de la glu, pour les isoler. Nous avons ensuite mis du ruban adhésif pour que les barre d’aluminium soit droite, et aussi pour faire tenir les fils de cuivre relié au deux cotés de l’interrupteur. Voir Schéma ci-dessous: Isnarduino.fr - Page 17 Schéma des branchement de la voiture autoguidé La voiture ayant un programme qui répond en cas d’obstacle détecté par le capteur en faisant un demi-tour fonctionne presque parfaitement. En effet, il y a deux problèmes majeurs, malgré le fait que théoriquement notre voiture fonctionne. Le premier problème est que la voiture est très lente avec le branchement USB. Elle avance et recule, elle tourne à droite et à gauche, mais parfois elle s’arrête car le moteur n’est plus assez puissant. L’idée pour résoudre ce problème serait de changer de moteur et d’engrenage pour les roues arrières. Le deuxième problème est l’autonomie de la voiture. En effet, la voiture fonctionne que quand elle est branché par l’USB de l'ordinateur. Lorsqu’on alimente la carte Arduino avec une alimentation extérieur de 9V, par la prise jack, la voiture ne marche plus, la carte Arduino s’allume, les diodes clignotent, mais les moteurs ne tournent pas et restent inactif. Au départ, je pensais qu’une pile 9V n’était pas assez puissante. Je me suis renseigné et j’ai découvert qu’un port USB fournissait du 5V. Le problème ne venait sans doute pas de là. Nous avons cherché sur internet… Aucune recherche ne nous aidez. A ce jour, nous n’avons pas réglé ces deux problèmes. Isnarduino.fr - Page 18 Pour finir, j’aurais souhaité régler ces deux problèmes par rapport à Arduino et en plus améliorer l’utilité de cette voiture. En effet, à la base notre projet était de faire en sorte que la voiture enregistre l’emplacement des obstacles détecté qu’elle aura frappé et donc qu’elle cartographie la pièce. De plus, nous avions pour idée de relier la voiture à une application Smartphone pour voir le robot cartographier la pièce sur l’application en direct. Mais la finalisation de ce projet semblait être hors de portée pour des débutants élève en Terminale. J’espère prendre ma revanche une fois en IUT… Isnarduino.fr - Page 19 ONGLET 1 //Importation des bibliotheques java. import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.Dimension; import javax.swing.ButtonGroup; import javax.swing.JRadioButton; //--- DEBUT VARIABLES --- //ENTIERS : //Des entiers nommés sX et sY sont créé avec les valeurs 800 et 600. (taille de la matrice et de la fenêtre) int sX = 800, sY = 600; //gC = grandeurCases (c'est ce qui définit la grandeur des cases en pixels). Cette variable sert de référence pour synchroniser l'affichage des cases aux coordonnées de la matrice int gC = 10; //Coordonnées du robot int x = (sX/2)/gC, y = (sY/2)/gC; //Le robot apparaît au milieux avec ces coordonnées //Coordonnées du robot dans l'objet int rX; //rX et rY évolue en fonction de x et y. int rY; //Vitesse du Robot int V = 1; //Variables de déplacement du robot qui évolue en fonction de V. Isnarduino.fr - Page 20 int dx = V, dy; //valeur des frameRate int v = 50; //ce compteur prends plus un à chaque tour du draw int compteurAmpli = 0; //Si le compteur arrive à cette valeur alors le robot tourne aléatoirement int compteurAmpliMax = 8; //TABLEAU D'ENTIER: //Un tableau à double entrées d'entiers nommés ma est créé avec pour taille sX et sY int [][]ma = new int[sX][sY]; //OBJET : //Création de l'objet robot Robot robot = new Robot(x*gC,y*gC,#EA1111); //BOOLEANS : //boolean pour afficher ou cacher les obstacles boolean affObs = false; //affichage du quadrillage boolean affNoStroke = false; //Boolean pour activer ou désactiver l'amplitude de mouvement. (s'il elle est désactivé le robot ne tourne plus aléatoirement et continu tout droit jusqu'à arriver contre un obstacle) boolean desactAmpliAuto = true; //COULEUR : //Couleur du robot color coul; //--- FIN VARIABLES --- //=== SETUP === void setup(){ Isnarduino.fr - Page 21 //Création d'une fénêtre. Avec les dimensions sX et sY. size(sX,sY); //Ces méthodes sont appelés qu'une fois, car les créations qu'elles apportent pourront être modifiés dans le draw //Appel de la méthode setMat() qui va créer un environnement 2D vierge setMat(); //Appel de la méthode genObstacles() qui va créer un nombre obstacles aléatoires ayant des coordonnées et des dimensions aléatoires. genObstacles(); //Appel de la méthode secureSpawn() qui va balayer la zone d'apparition du robot pour qu'il n'apparaisse dans aucun obstacles. secureSpawn(); } //=== FIN SETUP === //=== LOOP === void draw(){ //Les ips (image par seconde) du programme prennent la valeur v. frameRate(v); //Appel de la méthode genMat() qui va donner la couleur des cases suivant leur valeur. De plus, elle réinitialise la valeur des murs pour qu'ils soient toujours égale à 3. genMat(); //Appel de la méthode affNoStroke() qui va décider, suivant le boolean affNoStroke, si on affiche ou pas le quadrillage. affNoStroke(); //Appel de la méthode cadre() qui va créer des rectangles pour former un cadre. cadre(); //Appel de robot.display() qui va créer le robot, avec ses coordonnées, et la valeur de son déplacement. De plus, la méthode dComportementRobot() y est intégré. Isnarduino.fr - Page 22 //La méthode dComportementRobot() est la méthode qui donne le comportement du robot face à un obstacle. De plus, cette méthode à la méthode mAmpli() d'intégré qui sert à faire tourner le robot aléatoirement, même quand il n'y a pas d'obstacles, à chaque intervalle de temps. Ceci dans le but de varier son déplacement. robot.display(); //Appel de la méthode mAffObs() qui va décider, suivant affObs, si on affiche ou pas les obstacles. mAffObs(); //si le compteurAmpli est égale à 51 alors le robot ne tourne plus aléatoirement (desacAmpliAuto se désactive) if(compteurAmpliMax == 51){desactAmpliAuto = false;}else{desactAmpliAuto = true;} } //=== FIN LOOP == ONGLET 2 //Méthode servant à faire le comportement du Robot void dcomportementRobot(){ if(desactAmpliAuto == true){ //Si l'amplitude auto est désactivé alors mAmpli n'est pas appelé mAmpli();} //(OBSTACLE A DROITE) //Si le robot à un déplacement vers la droite ET que la case qu'il y a à droite est un obstacles caché, affiché ou détecté alors cette case prends la valeur 4 (obstacles détectés). if(dx == V && ma[x+V][y] >= 2){ ma[x+V][y] = 4; if (ma[x][y-V] > 1 && ma[x][y+V] <= 1) } //De plus s'il y a un obstacle en haut et rien en bas alors... int w = int(random(2)); //un entier prends une valeur aléatoire entre 0 et 1. if (w == 0) { //s'il est égale à 0 alors le robot va vers le bas dy = V ; Isnarduino.fr - Page 23 dx=0; } else { //sinon il fait demi tour. dx = -V ; } } if (ma[x][y-V] <= 1 && ma[x][y+V] > 1) { //De plus s'il y a un obstacle en bas et rien en haut alors... int w = int(random(2)); //un entier prends une valeur aléatoire entre 0 et 1. if (w == 0) { //s'il est égale à 0 alors le robot va vers le haut dy = -V ; dx=0; } else { //sinon il fait demi tour. dx = -V ; } } if (ma[x][y-V] <= 1 && ma[x][y+V] <= 1) { //De plus s'il n'y a un obstacle n'y en haut, n'y en bas alors... dx = 0; //(le déplacement en x prends 0 car il ira soit vers le haut soit vers le bas) int w = int(random(2)); //un entier prends une valeur aléatoire entre 0 et 1. if (w == 0) { //si cet entier est égale à 0 le robot va vers le haut dy = -V ; } else { //sinon il va vers le bas dy = V ; } } if (ma[x][y-V] > 1 && ma[x][y+V] > 1) { Isnarduino.fr - Page 24 //De plus s'il y a des obstacles en haut et en bas dy = 0; //alors il fait demi tour. dx = -V ; } } //(OBSTACLE A GAUCHE) //Si le robot à un déplacement vers la gauche ET que la case qu'il y a à gauche est un obstacles caché, affiché ou détecté alors cette case prends la valeur 4 (obstacles détectés). if(dx == -V && ma[x-V][y] >=2 ){ ma[x-V][y] = 4; if (ma[x][y-V] > 1 && ma[x][y+V] <= 1) { //S'il y a un obstacle en bas et pas en haut alors il peut soit faire demi tour soit aller vers le bas. int w = int(random(2)); if (w == 0) { dy = V ; dx=0; } else { dx = V ; } } if (ma[x][y-V] <= 1 && ma[x][y+V] > 1) { //S'il y a un obstacle en haut et pas en bas alors il peut soit faire demi tour soit aller vers le haut. int w = int(random(2)); if (w == 0) { dy = -V ; dx=0; } else { dx = V ; } } if (ma[x][y-V] <= 1 && ma[x][y+V] <= 1) { //S'il n'y a pas d'obstacle ni en haut, ni en bas, alors il va soit en haut, soit en bas dx = 0; Isnarduino.fr - Page 25 int w = int(random(2)); if (w == 0) { dy = -V ; } else { dy = V ; } } if (ma[x][y-V] > 1 && ma[x][y+V] > 1) { //S'il y a des obstacles en haut et en bas, alors il fait demi tour dy = 0; dx = V ; } } //(OBSTACLE EN BAS) //Si le robot à un déplacement vers la gauche ET que la case qu'il y a à gauche est un obstacles caché, affiché ou détecté alors cette case prends la valeur 4 (obstacles détectés). if(dy == V && ma[x][y+V] >= 2){ma[x][y+V] = 4; if (ma[x+V][y] > 1 && ma[x-V][y] <= 1) { //Obstacle à droite et pas à gauche alors il va soit à gauche soit il fait demi-tour int w = int(random(2)); if (w == 0) { dx = -V ; dy=0; } else { dy = -V ; } } if (ma[x+V][y] <= 1 && ma[x-V][y] > 1) { //Obstacle à gauche et pas à droite alors il va soit à droite soit il fait demi-tour int w = int(random(2)); if (w == 0) { dx = V ; dy=0; } else { Isnarduino.fr - Page 26 dy = -V ; } } if (ma[x+V][y] <= 1 && ma[x-V][y] <= 1) { //Obstacle ni à gauche, ni à droite alors il va soit à gauche soit à droite dy = 0; int w = int(random(2)); if (w == 0) { dx = -V ; } else { dx = V ; } } if (ma[x+V][y] > 1 && ma[x-V][y] > 1) { //Obstacle à droite et à gauche alors il fait demi-tour dy = -V; dx = 0; } } //(OBSTACLE EN HAUT) //Si le robot à un déplacement vers la gauche ET que la case qu'il y a à gauche est un obstacles caché, affiché ou détecté alors cette case prends la valeur 4 (obstacles détectés). if(dy == -V && ma[x][y-V] >= 2){ ma[x][y-V] = 4; if (ma[x+V][y] > 1 && ma[x-V][y] <= 1) { //Obstacle à droite et pas à gauche alors il va soit à gauche soit il fait demi-tour int w = int(random(2)); if (w == 0) { dx = -V ; dy=0; } else { dy =V ; } } if (ma[x+V][y] <= 1 && ma[x-V][y] > 1) { //Obstacle à gauche et pas à droite alors il va soit à droite soit il fait demi-tour int w = int(random(2)); Isnarduino.fr - Page 27 if (w == 0) { dx = V ; dy=0; } else { dy = V ; } } if (ma[x+V][y] <= 1 && ma[x-V][y] <= 1) { //Obstacle ni à gauche, ni à droite alors il va soit à gauche soit à droite dy = 0; int w = int(random(2)); if (w == 0) { dx = -V ; } else { dx = V; } } if (ma[x+V][y] > 1 && ma[x-V][y] > 1) { //Obstacle à droite et à gauche alors il fait demi-tour dy = V ; dx = 0; } } } //Méthode servant à faire tourner le robot aléatoirement en fonction de son déplacement actuel(s'il se déplace vers la droite, vers le haut etc.) void mAmpli() { if ( compteurAmpli == compteurAmpliMax) { //Si le compteur est égale à la limite alors il va prendre une direction aléatoire : if (dx == V ) { //S'il va vers la droite int w = int(random(2)); if (w == 0) { //un entier prends une valeur aléatoire entre 0 et 1 //si cet entier est égale à 0 le robot va vers le haut Isnarduino.fr - Page 28 dy = V ; dx=0; } else { //sinon il va vers le bas dy = -V ; dx=0; } } else if (dx == -V ) { //S'il va vers la gauche il peut soit aller vers le haut, soit aller vers le bas int w = int(random(2)); if (w == 0) { dy = V ; dx=0; } else { dy = -V ; dx=0; } } else if (dy == V ) { //S'il descends il pourra aller soit à gauche, soit à droite int w = int(random(2)); if (w == 0) { dx = V ; dy=0; } else { dx = -V ; } dy=0; } else if (dy == -V ) { //S'il monte il pourra aller soit à gauche, soit à droite int w = int(random(2)); if (w == 0) { dx = V ; Isnarduino.fr - Page 29 dy=0; } else { dx = -V ; dy=0; } } compteurAmpli = 0; //Le compteur reprend la valeur 0 } compteurAmpli++; } //Le compteur prends plus 1 ONGLET 3 /*Si ma[u][v] = ... 0 = vide 1 = vérifié 2 = obstacle caché 3 = obstacle affiché 4 = obstacle détecté */ //On balaye tout le tableau avec les deux boucles for pour assigner à toutes les case la valeur 0 (vide). void setMat(){ for(int i = 0; i < sX; i+=gC){ for(int j = 0; j < sY; j+=gC){ int u = i/gC; //Diviser i et j par gC revient à créer des coordonnées qui reviennent int v = j/gC; //à compter les cases qu'on voit à l'écran. ma[u][v] = 0; } } } //Cette méthode sert à balayer toutes les coordonnées du tableau pour afficher les cases avec leurs Isnarduino.fr - Page 30 couleurs. void genMat(){ for(int i = 0; i < sX; i+=gC){ for(int j = 0; j < sY; j+=gC){ int u = i/gC; int v = j/gC; //Ces instructions créaient un cadre: ma[u][0] = 3; //Toutes les cases ayant pour coordonnées [u;0] prennent la valeur 3 ma[0][v] = 3; //Pareil mais avec [0;v] ma[(sX-1)/gC][v] = 3; //Pareil avec [sX-1/gC;v] c'est à dire la dernière valeur sur l'axe des abscisses. ma[u][(sY-1)/gC] = 3; //Idem mais avec la dernière valeur sur l'axe des ordonnées //Ces instructions servent à donner les couleurs respectives aux rectangles (case) : if(ma[u][v] == 3 || ma[u][v] == 4){fill(0);} else if(ma[u][v] == 1){fill(#96DBFC);} else{fill(255);} rect(i,j,gC,gC); } } } /* Le setMat est appelé dans le setup, il s'éxécute donc une fois. Ceci dans le but de faire un environnement vide qui pourra être modifié. En effet, le genMat est appelé dans le draw, il s'éxécute indéfiniment. Le but est d'afficher et de "mémoriser" les modifications apporté à l'environnement. ( quand le robot tape contre un obstacle il s'affiche en noir ou le robot laisse une trainée bleue derrière lui. */ Isnarduino.fr - Page 31 //Ceci est la class Robot pour créer le Robot: class Robot { Robot(int RX, int RY, color couleur){ //constructeur de l'objet, on lui assigne des coordonnées et une couleur. rX = RX; rY = RY; coul = couleur; } void display(){ dcomportementRobot(); x += dx; // on ajoute à x ou à y la valeur du déplacement y += dy; // dx ou dy qui peut être égale à V,-V ou 0 ma[x][y] = 1; // Toutes les coordonnées que le robot aura empreinté auront la valeur 1. (case vérifié) fill(coul); //Assigne la couleur au robot (rectangle) rect(x*gC,y*gC,gC,gC); //Création d'un rectangle aux coordonnées x*gC et y*gC. (comme V est égale à 1, le robot doit multiplier ses coordonnées pour qu'il soit affiché correctement à l'emplacement voulu) } } //Cette methode sert à balayer la zone d'apparition du robot pour éviter qu'il apparaisse à l'intérieur d'un obstacle. void secureSpawn(){ for(int k = x*gC-(5*gC); k < x*gC+(5*gC); k+=gC){ for(int l = y*gC-(5*gC); l < y*gC+(5*gC); l+=gC){ ma[k/gC][l/gC] = 0; } } } //OBJET OBSTACLE Isnarduino.fr - Page 32 class Obstacles { int ox; int oy; int ox2; int oy2; Obstacles(int xo,int yo,int txo,int tyo){ ox = xo; //ox : coordonnées x de l'obstacle oy = yo; //oy : coordonnées y de l'obstacle ox2 = txo; //ox2 : longueur x de l'obstacle oy2 = tyo; //oy2: longueur y de l'obstacle } void display(){ //Nous avons recréé la fonction rect() de processing, mais pour pouvoir l'utiliser dans la matrice. ox2 = ox + ox2*gC; oy2 = oy + oy2*gC; for(int k = ox; k < ox2; k+=gC){ for(int l = oy; l < oy2; l+=gC){ ma[k/gC][l/gC] = 2; //Chaque case ayant les coordonnées balayées par la double boucle for prennent la valeur 2 (obstacle caché). } } } } //Méthode qui sert à créer, avec des coordonnées et des grandeurs aléatoires, des obstalces. void genObstacles() { for(int i=0;i<int(random(5,10));i++){ Obstacles obstacle = new Obstacles(int(random(0,sX)),int(random(0,sY)),int(random(2,gC*2)),int(random(2,gC*2))); obstacle.display(); } } Isnarduino.fr - Page 33 //Cette méthode sert à afficher ou à cacher les obstacles en fonction de affichageObstacle void mAffObs(){ for(int i = 0; i < sX; i+=gC){ for(int j = 0; j < sY; j+=gC){ int u = i/gC; int v = j/gC; if(affObs == true){ //Si la boolean est vrai alors les obstacles apparaissent en prenant pour valeur 3 (obstacles affichés). if(ma[u][v] == 2){ma[u][v] = 3;} } if(affObs == false){ //Si elle est fausse alors les obstacles prennent la valeur 2 (obstacles cachés). if(ma[u][v] == 3){ma[u][v] = 2;} } } } } //Méthode qui affiche un cadre qui n'est pas influencé par le quadrillage. void cadre(){ rect(0,gC,gC,sY-2*gC); rect(gC,0,sX-2*gC,gC); rect(sX-gC,gC,gC,sY-2*gC); rect(gC,sY-gC,sX-2*gC,gC); } //Création de l'objet Slide. class Slide extends JSlider { //Créer un Slider... Slide(){ this.setPreferredSize(new Dimension(250,200)); this.setMaximum(100); // avec ses dimensions, // sa valeur maximum, Isnarduino.fr - Page 34 this.setMinimum(0); this.setValue(v); // sa valeur minimum, // valeur que le slide à au début, this.setPaintTicks(true); this.setPaintLabels(true); this.setMinorTickSpacing(10); //l'écart entre chaque petit tirés, this.setMajorTickSpacing(20); //l'écart entre chaque grand tirés. this.addChangeListener(new ChangeListener(){ //Il "écoute" chaque modification apporté, void stateChanged(ChangeEvent event){ v=((JSlider)event.getSource()).getValue()+1; //S'il trouve qu'il y a une modification la valeur v change. println(v);} }); } } //Créer l'objet Pan class Pan extends JPanel { Pan(int x,int y,int tx, int ty){ this.setSize(tx,ty); this.setLocation(x,y); this.setVisible(true); } } //Création de l'objet Slide2 class Slide2 extends JSlider { //Créer un deuxième Slider... Slide2(){ this.setPreferredSize(new Dimension(250,100)); //ses dimension this.setMaximum(50); this.setMinimum(0); this.setValue(compteurAmpliMax); //sa valeur maximum //sa valeur minimum //sa valeur de départ this.setPaintTicks(true); Isnarduino.fr - Page 35 this.setPaintLabels(true); this.setMinorTickSpacing(5); //l'écart entre chaque petit tirés, this.setMajorTickSpacing(10); //l'écart entre chaque grands tirés, this.addChangeListener(new ChangeListener(){ //Il "écoute" chaque modification apporté, void stateChanged(ChangeEvent event){ compteurAmpliMax=((JSlider)event.getSource()).getValue()+1;compteurAmpli = 0;}}); //S'il trouve qu'il y a une modification la valeur compteurAmpli change. } } //Méthode servant à afficher le cadriallage en fonction de la boolean affNoStroke. void affNoStroke() { if(affNoStroke == true) { stroke(#A2A2A2); } else { noStroke(); } } ONGLET 4 PFrame f = new PFrame(); //Crée une nouvelle fenêtre class PFrame extends JFrame { //Crée une classe PFrame qui hérite des caractéristique de la classe JFrame //qui est en fait la classe qui crée une fenêtre en JAVA PFrame() { this.setSize(700, 400); //Attribution de la taille a notre fenêtre this.setTitle("Paramètres du robot"); //le titre this.setLocationRelativeTo(null); //la fenetre sera au centre de l'écran this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Si on ferme la fenêtre, tout le programme s'arrete Isnarduino.fr - Page 36 ButtonGroup groupe = new ButtonGroup(); //Crée un nouveau groupe de bouton nommé groupe ButtonGroup groupe2 = new ButtonGroup(); //... ButtonGroup groupe3 = new ButtonGroup(); //... Pan panel = new Pan(370,-65,250,150); //crée un nouvel objet nommé panel, on lui attribue une taille et une localisation Pan panel2 = new Pan(40, 17,200,20); //... Pan panel3 = new Pan(41, 90,200,20); //... Pan panel4 = new Pan(350, 90,300,30); //... Pan pan2 = new Pan(40,170,250,20); //... Pan pan1 = new Pan(370,135,250,100); //... Pan panel10 = new Pan(10,10,10,10); //... Pan panGroup2 = new Pan(400,250,200,50); //... Pan textGroup2 = new Pan(24,250,200,20); //... Pan panGroup3 = new Pan(400,300,200,50); //... Pan textGroup3 = new Pan(24,300,200,20); //... Slide slide = new Slide(); //Créé un nouveau slider nommé slide Slide2 slide2 = new Slide2(); //... final JRadioButton but1 = new JRadioButton("Cyan"); // nouveau bouton qui portera l'inscription Cyan a l'écran final JRadioButton but2 = new JRadioButton("Rouge"); // Le mot-clé "final" indique que ces bouton ne pourront pas final JRadioButton but3 = new JRadioButton("Vert"); // modifié dans la suite du programme. final JRadioButton but4 = new JRadioButton("Activer"); final JRadioButton but5 = new JRadioButton("Désactiver"); final JRadioButton but6 = new JRadioButton("Afficher"); final JRadioButton but7 = new JRadioButton("Cacher"); //Ces trois méthodes servent à changer les couleurs du robot en fonction du bouton validé. but1.addActionListener(new ActionListener() { // "Action listener" cette méthode va ecouter Isnarduino.fr - Page 37 pendant void actionPerformed(ActionEvent e) { // toute la durée du programme, quand on actionne le bouton if(but1.isSelected() == true) {coul = #00F4FF;} // le programme execute "coul = #00F4FF". }}); but2.addActionListener(new ActionListener() { //... void actionPerformed(ActionEvent e) { if(but2.isSelected() == true) {coul = #FF0000;} }}); but3.addActionListener(new ActionListener() { //... void actionPerformed(ActionEvent e) { if(but3.isSelected() == true) {coul = #14FF00;} }}); //Ces méthodes servent à afficher ou non le quadrillage but4.addActionListener(new ActionListener() { void actionPerformed(ActionEvent e) { if(but4.isSelected() == true) {affNoStroke = true;} //si le bouton est sélectionné, alors le boolean affNoStroke est "true". }}); but5.addActionListener(new ActionListener() { void actionPerformed(ActionEvent e) { if(but5.isSelected() == true) {affNoStroke = false;} //Si le bouton est sélectionné, alors le boolean affNoStroke est "false". }}); //par la suite ces booleans apparaissent dans une méthodes affNoStroke() qui va afficher, ou non, le quadrillage //Celles-ci servent à afficher ou non les obstacles but6.addActionListener(new ActionListener() { void actionPerformed(ActionEvent e) { if(but6.isSelected() == true) {affObs = true;} //... Isnarduino.fr - Page 38 }}); but7.addActionListener(new ActionListener() { void actionPerformed(ActionEvent e) { if(but7.isSelected() == true) {affObs = false;}//... }}); //... groupe.add(but1); //on ajoute au groupe de bouton "groupe" le bouton "but1". groupe.add(but2); //pour qu'un seul des bouton 1,2 et 3 ne soit actionnable groupe.add(but3); //en meme temps groupe2.add(but4); //on ajoute au groupe de bouton "groupe2" le bouton "but4". groupe2.add(but5); //... groupe3.add(but6); //... groupe3.add(but7); //... panel4.add(but1); //on ajoute les bouton au panel pour qu'ils soit visible dedans panel4.add(but2); panel4.add(but3); panel.add(slide); //on ajoute les sliders au panel pour qu'ils soit visible dedans pan1.add(slide2); panGroup2.add(but4); panGroup2.add(but5); panGroup3.add(but6); panGroup3.add(but7); panel2.add(new JLabel("Modifiez la vitesse du robot : ")); //on ajoute des inscription à l'écran panel3.add(new JLabel("Modifiez la couleur du robot : ")); pan2.add(new JLabel("Modifiez l'amplitude des mouvement : ")); textGroup2.add(new JLabel("Afficher le quadrillage : ")); textGroup3.add(new JLabel("Afficher les obstacles : ")); this.add(panGroup2); // "this" représente notre seconde fenêtre. this.add(textGroup2); // Nous ajoutons donc tout les panels et inscription que nous avons préalabement crée this.add(panGroup3); this.add(textGroup3); Isnarduino.fr - Page 39 this.add(pan2); this.add(pan1); this.add(panel); this.add(panel2); this.add(panel3); this.add(panel4); this.add(panel10); this.setVisible(true); //on rend notre fenêtre visible } } FIN PROCESSING Isnarduino.fr - Page 40 ARDUINO int Moteur = 3; int dMoteur = 2; int serMoteur = 9; int dSerMoteur = 8; int interrup = 4; int i = 0; boolean interrupt = false; void setup() { pinMode(Moteur,OUTPUT); pinMode(dMoteur,OUTPUT); pinMode(serMoteur,OUTPUT); pinMode(dSerMoteur,OUTPUT); pinMode(interrup,INPUT); digitalWrite(interrup,HIGH); } void loop() { if(digitalRead(interrup) == LOW){ digitalWrite(dMoteur,LOW); analogWrite(Moteur,250); analogWrite(serMoteur,250); delay(5000); } else{ digitalWrite(dMoteur,HIGH); analogWrite(Moteur,250); analogWrite(serMoteur,0); } Isnarduino.fr - Page 41 } Isnarduino.fr - Page 42