1. Introduction

Le but du projet était de créer un système permettant de contrôler à distance 2 servomoteurs qui entraîneraient le mouvement d'un laser.

Une des difficultés majeures était de faire avec ce côté sans fil. Je suis donc parti dans l'idée d'utiliser une LED infrarouge pour envoyer les données d'un côté et de l'autre un récepteur d'infrarouge. Mais cela n'a pas fonctionné, il y a plusieurs raisons à cela:

  • Je devais envoyer 3 informations: celle d'allumer ou d'éteindre le laser chose qui ne m'a pas posée problème mais je devais aussi envoyer une valeur de X et une valeur de Y. Il faut donc envoyer ces 2 informations l'une après l'autre car on ne peut faire passer qu'une information à la fois via la communication infrarouge, mais à l'arrivée impossible de différencier la valeur des X de celles des Y.
  • De plus l'information obtenu à l'arrivée est une suite de lettres et de chiffres (par exemple "3FFF" quand le X valait 1024) et non pas la valeur comprise entre 0 et 1024 qu'elle était au début du processus. Et pour permettre un mouvement qui ne soit pas juste droite ou gauche, haut ou bas mais qu'il y ait des "nuances", comme désiré, il aurait fallu trouver le code obtenu pour les 1024 valeurs et implémenter le code correspondant à chaque valeur et donc avoir une table de correspondance avec 1024 entrées.

2. Matériel et méthodes

2.1 Matériel

  • breadboard et arduino uno
  • 2 servomoteurs
  • laser
  • joystick
  • transistor NPN

2.2 Méthode

Le principe est simple le joystick envoie 3 informations:

  • une valeur pour l'axe des X
  • une valeur pour l'axe des Y
  • une valeur, le joystick étant cliquable, pour son enfoncement

Les valeurs des X et des Y sont utilisés pour contrôler les 2 servomoteurs (un étant celui des X et l'autre celui des Y). L'information du joystick et une valeur entre 0 et 1024 qu'on transforme en une information entre 0 et 180 degrés qui correspondra à la position du servomoteur. Et le clique du joystick est utilisé pour allumer et éteindre le laser.

Le transistor est quant à lui nécessaire pour contrôler le courant arrivant au laser pour permettre d'éteindre et d'allumer le-dit laser d'un simple clique.

2.3 Montage

Le schéma: servo1_schema.png

Le montage: servo1_bb.png

Pour que le laser soit contrôlable il faut accrocher le laser à l'un des servomoteurs lui-même accroché à l'autre servomoteur qui lui serait fixé sur un support.

IMG_3442.JPG

2.3 Le code

Pour allumer ou éteindre le laser le programme regarde si le joystick est cliqué ou pas, quand celui ci est cliqué cette valeur vaut 1 et quand il ne l'est pas elle vaut 0. Quand le joystick est cliqué change la valeur envoyé au laser si il était LOW(éteint) il passe en HIGH(allumé) et inversemment si il était en HIGH il passe en LOW. Le delay est la pour éviter que le laser s'allume mais s'éteigne tout de suite (se qui peut arriver si le joystick est cliqué trop longtemps ou que par inadvertance on double-clique dessus), après avoir reçu l'information "bouton cliqué" il va s'arrêter pendant une seconde empêchant de ce fait le désagréments du double-clique ou du clique trop long.

if(digitalRead(pushPin)){
     digitalWrite(laserPin, !digitalRead(laserPin));
    delay(1000);
  }

Pour faire bouger les servomoteurs, nous allons d'abord lire la valeur donner par le joystick cette valeur sera comprise entre 0 et 1024, 0 étant la valeur obtenue quand le joystick est orienté au maximum vers la gauche pour les X et vers le bas en Y, 512 la valeur quand le joystick est au repos donc au milieu et 1024 la valeur quand le joystick est orienté au maximum vers la droite en X et vers le haut en Y. Le "map" sert à étalonner les valeurs entre 0 et 180 qui serviront à définir la positon du bras du servomoteur car elle est données par un angle compris entre 0 et 180 degrés. Avec le "constrain" on n'empêche que la valeur obtenue avec le "map" ne dépasse 180 degrés ou qu'elle soit inférieur à 0. On envoie directement cette valeur au servomoteur qui bougera en fonction de l'angle donné. Le morceau de code ci-dessous n'est que pour un servomoteur mais la méthode est exactement la même pour l'autre servomoteur.

  joyposition1 = analogRead(joystickPin1);
  servoposition1 = map(joyposition1, 0, 1024, 0, 180);
  servoposition1 = constrain(servoposition1, 0, 180);
  servomoteur1.Write(servoposition1);

Vous pourrez trouver le reste du code ici.

3. Résultats

Le joystick arrive parfaitement à faire bouger les deux servomoteurs et le fait de cliquer sur le joystick permet d'éteindre et d'allumer le laser. Mais néanmoins la partie sans fil voulu au départ n'a pas peu être intégrée car la communication infrarouge n'était pas viable dans le cadre de ce projet et le manque de temps m'a empêché de trouver une alternative.

4. Discussion

Ce projet a été très amusant à réaliser et surtout très enrichissant. Mais je suis déçu de ne pas avoir réussi à introduire la possibilité de contrôler le laser à distance. Ce problème est principalement dû au fait de s'y être pris trop tard. J'ai pris beaucoup de temps avant de commander les éléments nécessaire à la réalisation de ce projet, et quand j'ai vu que la communication infrarouge n'allait pas convenir à mon projet il était trop tard pour pouvoir penser à une alternative. Le manque d'expérience a aussi joué dans le fait de commander les faux éléments. Les LED pourraient par exemple être remplacé par des antennes Xbee, mais pour utiliser cette technologie il aurait aussi fallu utiliser un Xbee shield (à accrocher à, par exemple, un arduino uno) les antennes n'étant pas compatible avec un arduino de base. J'ai aussi beaucoup appris sur le code arduino et ça me donne envie d'aller plus loin. Il y a aussi une certaine envie de réaliser la télécommande que je n'ai pas réussi à faire dans le cadre de ce projet et qui permettrais de contrôler le tout à distance et qui rendrait le tout plus intéressant.

5. Conclusion

L'objectif de mon projet a été a moitié réalisé, j'arrive à contrôler le laser avec le joystick mais il faut un fil. Je suis néanmoins relativement satisfait du résultat.

6. Ressources:

Le joystick utilisé

Le laser utilisé

Arduino-Servo

Arduino-JoyStick

Sparkfun servo-motor

Sparkfun flex-sensor