CR-Arduino
Transcription
CR-Arduino
Elèves : DIABY Yacouba CHANDELIER Gilles Groupe 4 Projet final d'électronique avec arduino Le contrôleur 4 in 1: une manette de jeu interactive I- Rappel du projet Objectif : Proposer une manette sans fil la plus complète et la plus interactive possible. Fonctions : Comme l'indique son nom, notre manette a quatre fonctions principales. Tout d'abord elle dispose de boutons qui permettent de réaliser des actions ponctuelles dans un jeu sur pc. De plus, elle est dotée d'un écran LCD 64.5x16mm pouvant afficher à tout moment des textes en rapport avec le jeu. Ensuite, elle est capable de détecter des mouvements effectués par le joueur. Pour finir elle émet des sons correspondant aux actions dans le jeu. II- Déroulement du projet 1ère semaine : -Branchement de deux boutons -Lien entre arduino et python pour les boutons : 2ème semaine : -La connexion bluetooth -L'accéloromètre + calibrage -La diode -Lien entre inclinaison et python 3ème semaine : -La connexion bluetooth -Le son -L'affichage sur un écran lcd III- Succès et échecs : A) Succès 1) Jouer grâce aux boutons Principe : La manette dispose de deux boutons poussoirs placés idéalement pour être facilement accéssibles avec les pouces comme sur une manette de jeu classique. Pour notre exemple de jeu nous avons utilisé ces boutons pour déplacer une tortue horizontalement dans un quadrillage. Problème : Un bouton poussoir ne passe pas « proprement » de l’état HIGH à l’état LOW. En effet, lorsque l’on appuie sur le bouton, les fils en métal que l’on met en contact vont rebondir l’un sur l’autre avant de se stabiliser. On obtient ainsi plusieurs fois la transition HIGH/LOW. Solution matérielle : Nous avons donc ajouté en parrallèle condensateur pour chaque bouton ce qui aura pour effet de se débarrasser de ce problème de rebond du bouton poussoir comme vu en cours en première année. Montage : Code : A chaque étape de la boucle, on vérifie si le bouton gauche ou le bouton droit est passé de l'état HIGH (non appuyé) à l'état LOW (appuyé). 2) Lien arduino-python Avec les ports série, on a réussi à faire un lien entre l'arduino et le python. Pour cela, nous avons utiliser sur python la classe PYserial, qu'il a fallu téléchargé. Dans notre code python nous devons importer cette classe. Sur arduino, on utilise Serial.print. Ce qui est écrit sur dans le moniteur sera lu par Python. C'est de cette façon que la communication se fait. Pour créé une connexion, il faut donc ne pas ouvrir le moniteur série, sinon le port série sera occupé. La ligne de code qui créé la connexion sur Python est la suivante : serial_port = Serial(port='NOM_DU_PORT', baudrate=9600) Pour lire ce qui a été envoyé via arduino : lu = serial_port.readline() Les données sont reçues en ASCII : il faut donc les décoder : lu.decode('ascii') Par exemple si l'on appuie sur le bouton gauche, nous envoyons depuis l'arduino avec un Serial.print "appui gauche". Pour effectuer une action sur notre jeu Python lors de l'appui du bouton, on teste ce qui a été reçu : if 'gauche' in lu.decode('ascii') : //Si il y a le mot gauche dans ce qui est lu gauche() //fonction de déplacement vers la gauche 3) Réaliser des actions dans le jeu en pivotant la manette Principe : La fonction détection de mouvement doit être la plus dynamique. Son objectif est de détecter de façon précise des mouvements réalisés par le joueur, d'interpréter ces mouvements et effectuer les actions du jeu qui leur correspondent. Nous utilisons un accéléromètre pour détecter l'inclinaison de la manette et déplacer une tortue (verticalement) dans un quadrillage. Cette fonction peut servir à déplacer un personnage, conduire une voiture, etc... Montage : Nous avons utilisé les informations sur l'inclinaison selon l'axe y donné par un accéléromètre. Problème 1 : Dans le jeu que nous avons présenté, nous executions la fonction «avant» qui fait monter la tortue d'une case vers l'avant dès que la manette était inclinée jusqu'à un certain point vers l'avant. Le problème a été que lorsque le joueur atteint cette position requise, la fonction «avant» s'exécute en boucle jusqu'à ce que celui-ci arrête d'incliner la manette. En conséquence la tortue se retrouve tout en haut de la grille alors que le joueur voulait monter d'une seule case. Solution logicielle : A chaque fois que l'inclinaison requise pour faire monter la tortue est atteinte, on fait une pause de 60ms dans le programme (delay(60)). Cela a pour effet de laisser le temps au joueur pour redresser la manette. Les 60 milli-secondes parraissent très courtes, mais si on avait choisi plus long, cela prendrait trop de temps au joueur pour faire monter la tortue de plusieurs cases, or le jeu doit etre réactif. Problème 2 : Le calcul de l'inclinaison se fait de façon absolue. De plus, tous les joueurs ne tiennent pas la manette de la meme façon. Donc, par exemple, une personne qui tient sa manette (dans la position d'équilibre) en l'inclinant un peu vers l'avant ou vers l'arrière peut se retrouver dérangée par le fait de devoir faire un mouvement trop long pour avancer. Solution logicielle et matérielle : On a mis en place une fonction calibrage qui s'exécute quand on appuie sur les boutons gauche et droite en même temps. Elle règle la position d'équilibre du joueur et les angles d'inclinaison pour avancer la tortue ou la reculer en fonction de cette position d'équilibre. 4) Emettre des sons La manette est équipée d'un buzzer arduino auquel nous pouvons faire émettre des sons à tout moment. Nous pouvons choisir d'émettre un son lorsqu'un événement particulier se produit dans le jeu ou lorsqu'on réalise une action spéciale avec la manette. Pour notre démonstration nous avions choisi d'émettre un son lorsque le joueur calibre sa manette. A chaque fois qu'il appuie sur les deux boutons, un double bip est émis. Montage : 5) Envoyer des messages correspondant à des actions de jeu Le lien Python -> Arduino nous a un peu plus embêté. Cela marche de la même manière que dans l'autre sens. En python, toujours avec PYserial, on utilise la fonction write : serial_port.write(liste) Pour la réception avec Arduino, on utilise les mêmes lignes qu'avec la connexion bluetooth : if(Serial.available()){ char inByte = Serial.read(); } Nous n'avons cependant pas réussi à tester de façon analogue avec les boutons et l'accéloromètre, ce qui a été envoyé via python. Un soucis de langage, nous ne nous y connaissons pas assez dans celui-ci. Mais cela semble faisable. Donc, nous affichons un seul message d'action venu de python sur notre écran lcd : à la fin du jeu. if(Serial.available()){ //Rentre dans cette boucle uniquement si il y a eu une communication python -> arduino char inByte = Serial.read(); lcd.clear(); lcd.print("Bravo !"); } De cette façon nous n'avons pas à tester ce qui a été envoyé, et l'affichage sur l'écran lcd se fait donc uniquement lorsqu'un message est reçu. B) Echec : Connexion bluetooth avec le pc Principe : Lors d'une connexion bluetooth, un port virtuel est utilisé/créé. Donc nous étions confiant pour que notre connexion "arduino-python" fonctionne. Problème : Nous n'avons pas réussi à utiliser le module bluetooth avec l'ordinateur : il y avait une connexion mais nous n'avons réussi à envoyer des données depuis l'arduino jusqu'à l'autre ordinateur connecté. Nous avons cependant réussi à envoyer dans l'autre sens, du pc connecté en bluetooth à l'arduino. Solution utilisée : Nous avons essayé beaucoup de choses. De changer de module, d'ordinateur. Nous avons essayé plusieurs logiciels : Putty et Termite. Dans tous les cas, la connexion ne se faisait que dans le mauvais sens. Nous pensons tout de même qu'il devrait y avoir possibilité à ce que ça marche. Peut-être cela est venu du fait que notre carte arduino soit une nano. Il est probable que ça aurait marché avec une carte arduino uno. Cet échec est regrettable car c'est la seule chose qui nous manquait pour remplir notre objectif : notre manette n'est pas sans fil. IV- Si on avait plus de temps : Les fonctions à rajouter : -Le bluetooth -Se déplacer horizontalement avec la détection de mouvement -Utiliser les boutons uniquement pour des actions -Enregistrer de scores et affichage sur l'écran lcd -Développer entièrement un jeu qui serait en synergie totale avec la manette Les fonctions à améliorer : -La précicion du déplacement avec l'inclinaison -Utiliser le sons pour plus d'actions (allumage de la manette, connexion bluetooth établie...)