IMA5 2018/2019 P30 : Différence entre versions

De Wiki de Projets IMA
(Semaine 6)
(Documents Rendus)
 
(99 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 56 : Ligne 56 :
 
=Réalisation du Projet=
 
=Réalisation du Projet=
  
==Semaine 1==
+
==Semaine 1 du 07/01==
 
Nos objectifs pour la semaine  sont de démonter, nettoyer, et remonter correctement le robot, afin que le câblage soit lisible et que tout puisse y rentrer. Nous allons également le tester afin de s'assurer qu'il roule sans soucis et que le contrôle au joystick soit fonctionnel. Si possible, nous désirons également corriger le système d'arrêt d'urgence et de démarrage pour qu'ils soient accessibles à la fois de façon logicielles et physiques, en parallèle. De cette façon, lorsque l'on passera à l'étape du wifi, nous pourrons contrôler le robot entièrement à distance. Il est très important que tout fonctionne sans soucis, nous comptons ensuite nous baser sur le contrôle au joystick pour créer le contrôle via l'ordinateur. Si l'on réussi à disposer d'un robot fonctionnel, et de bons plans pour y intégrer l'ordinateur et la wifi rapidement à la semaine 2, ce sera un bon début de projet. <br> <br>
 
Nos objectifs pour la semaine  sont de démonter, nettoyer, et remonter correctement le robot, afin que le câblage soit lisible et que tout puisse y rentrer. Nous allons également le tester afin de s'assurer qu'il roule sans soucis et que le contrôle au joystick soit fonctionnel. Si possible, nous désirons également corriger le système d'arrêt d'urgence et de démarrage pour qu'ils soient accessibles à la fois de façon logicielles et physiques, en parallèle. De cette façon, lorsque l'on passera à l'étape du wifi, nous pourrons contrôler le robot entièrement à distance. Il est très important que tout fonctionne sans soucis, nous comptons ensuite nous baser sur le contrôle au joystick pour créer le contrôle via l'ordinateur. Si l'on réussi à disposer d'un robot fonctionnel, et de bons plans pour y intégrer l'ordinateur et la wifi rapidement à la semaine 2, ce sera un bon début de projet. <br> <br>
 
Jour 1: Prendre connaissance de l'état du robot, et des choses à faire avant de pouvoir réellement commencer le projet. Création du wiki. Lecture de la documentation pré existante. Création d'un plan du robot et mesure de toutes ses dimensions importantes.<br>
 
Jour 1: Prendre connaissance de l'état du robot, et des choses à faire avant de pouvoir réellement commencer le projet. Création du wiki. Lecture de la documentation pré existante. Création d'un plan du robot et mesure de toutes ses dimensions importantes.<br>
Ligne 113 : Ligne 113 :
 
Celle-ci sera terminée et découpée la semaine prochaine.
 
Celle-ci sera terminée et découpée la semaine prochaine.
  
==Semaine 2==
+
==Semaine 2 du 14/01==
  
 
===Nouveau PCB===
 
===Nouveau PCB===
Ligne 160 : Ligne 160 :
 
Insérer graphique, tableau, référence
 
Insérer graphique, tableau, référence
  
 
+
==Semaine 3 du 21/01==
==Semaine 3==
 
  
 
===Convertisseur===
 
===Convertisseur===
Ligne 169 : Ligne 168 :
 
===Programmation===
 
===Programmation===
  
Ensuite un premier test de la Kinect a été réalisé, afin de vérifier la simplicité d'utilisation de celle-ci. Pour notre application actuelle, à savoir simplement afficher le retour vidéo sur un écran, il est très simple d'installer les bibliothèques recquises sont linux et d'afficher la vidéo sur notre écran. Il sera ensuite simplement question d'ouvrir ce flux vidéo en le redirigeant vers le serveur plutôt que vers un écran directement.
+
Ensuite un premier test de la Kinect a été réalisé, afin de vérifier la simplicité d'utilisation de celle-ci. Pour notre application actuelle, à savoir simplement afficher le retour vidéo sur un écran, il est très simple d'installer les bibliothèques requises sont linux et d'afficher la vidéo sur notre écran. Il sera ensuite simplement question d'ouvrir ce flux vidéo en le redirigeant vers le serveur plutôt que vers un écran directement.
  
Le programme Arduino sera d'abord repris du projet de Nicolas Havard, de l'année précédente. Le contrôle des moteurs par l'Arduino sera un peu amélioré afin que la transition de marche avant à marche arrière se face sans problèmes. En effet, jusque là lors d'un passage de marche avant à marche arrière, le robot ne passait pas forcément par l'état arrêt, et cet état est nécessaire pour empécher les régulateurs de se bloquer. Ca à donc été ajouté au programme. Il a ensuite fallut ajouter la lecture des senseurs du robot et envoyer le résultat de cette lecture sur le port série.
+
Le programme Arduino sera d'abord repris du projet de Nicolas Havard, de l'année précédente. Le contrôle des moteurs par l'Arduino sera un peu amélioré afin que la transition de marche avant à marche arrière se face sans problèmes. En effet, jusque là lors d'un passage de marche avant à marche arrière, le robot ne passait pas forcément par l'état arrêt, et cet état est nécessaire pour empêcher les régulateurs de se bloquer. Ça à donc été ajouté au programme. Il a ensuite fallut ajouter la lecture des senseurs du robot et envoyer le résultat de cette lecture sur le port série.
  
 
Ensuite, la dernière partie du programme concernant l'Arduino consiste à envoyer des informations sur le port série, puis à lire la réponse de l'ordinateur, qui à terme va remplacer le joystick pour la transmission d'ordres au robot. Il s'agit donc d'écrire un programme en C qui puisse utiliser le port série en lecture/écriture. Ceci est fait sans trop de problèmes, on a maintenant un programme Arduino capable de transmettre l'état des capteurs à l'ordinateur et de lire l'état du joystick virtuel donné par l'ordinateur, afin de réaliser le mouvement demandé.
 
Ensuite, la dernière partie du programme concernant l'Arduino consiste à envoyer des informations sur le port série, puis à lire la réponse de l'ordinateur, qui à terme va remplacer le joystick pour la transmission d'ordres au robot. Il s'agit donc d'écrire un programme en C qui puisse utiliser le port série en lecture/écriture. Ceci est fait sans trop de problèmes, on a maintenant un programme Arduino capable de transmettre l'état des capteurs à l'ordinateur et de lire l'état du joystick virtuel donné par l'ordinateur, afin de réaliser le mouvement demandé.
Ligne 202 : Ligne 201 :
 
En parallèle, nous avons entamé les recherches sur le joystick virtuel. En effet, des librairies avec des Joystick existent déjà et nous regardons les différentes possibilités pour savoir lesquelles implanter.
 
En parallèle, nous avons entamé les recherches sur le joystick virtuel. En effet, des librairies avec des Joystick existent déjà et nous regardons les différentes possibilités pour savoir lesquelles implanter.
  
==Semaine 4==
+
==Semaine 4 du 28/01==
  
 
===PCB===
 
===PCB===
  
Faire découper la deuxième version du PCB, la souder et la tester, en récupèrant des composants sur le PCB de l'année précédente. Des petits problèmes de contacts sont réglés par des soudures. Le PCB n'est pas tout à fait à la bonne taille, mais fonctionne toujours bien comme Shield.
+
Faire découper la deuxième version du PCB, la souder et la tester, en récupèrant des composants sur le PCB de l'année précédente. Des petits problèmes de contacts sont réglés par des soudures, notamment au niveau de la prise RJ11. Le PCB n'est pas tout à fait à la bonne taille, mais fonctionne toujours bien comme Shield. Il y a également, lors du premier test, deux problèmes : le premier hardware, deuxs fils avaient été branchés à l'envers au niveau des relais, ce qui fait que le robot ne pouvait aller qu'en marche avant. Cependant, ça n'a pas causé de problèmes à long terme. Le second, en software, était issu de l'inversion de deux pins en hardware qui n'avait pas été répercutée en software. Problème qui a été réglé facilement une fois qu'il a été trouvé.
 +
 
 +
[[File:PCB3.PNG|400px|thumb|center|Version finale du PCB]]
  
 
===Arduino===
 
===Arduino===
 +
 +
Le programme Arduino a été amélioré avec plusieurs fonctionnalités. Tout d'abord, lorsqu'une commande en vitesse impliquant une tension inférieure à 70mV est envoyée, cela entraîne la coupure des régulateurs, et il faut alors redémarrer tout le robot. On ignore ici cette commande et on éteint directement le moteur à la place. Ensuite, quand on met le joystick de façon a avoir un y nul, et une valeur en x, le robot effectue maintenant une manœuvre avec les deux roues tournant dans des sens opposés, ce qui n'était pas pris en compte auparavant. La mobilité et le contrôle que l'on a sur le robot sont donc grandement améliorés.
 +
 +
Le programme Arduino a ensuite été adapté afin de pouvoir prendre en compte la lecture des capteurs. En effet, si les capteurs sont branchés, il suffit du mettre une variable globale à 1 pour prendre en compte ceux-ci et arrêter le robot si un objet est trop proche de celui-ci.
 +
 +
Enfin, le programme Arduino peut maintenant lire le port série pour recevoir des commandes au lieu de lire la prise RJ11. Cette dernière fonctionnalité n'est pas encore au point, on analyse bien les messages reçus, mais il y a des problèmes de réception des messages sur le port série depuis un code en C qui se contente d'émettre en boucle un message.
  
 
===Programme en C et script linux===
 
===Programme en C et script linux===
 +
 +
Le programme en C actuel a été réalisé sans trop de problèmes et permet d'ouvrir le port USB sur lequel l'Arduino est branché, pour ensuite y envoyer des données.
 +
On va ensuite essayer de lire une donnée, qui sera la réponse de l'Arduino et devra être envoyée vers le serveur par la suite, même si celui-ci n'est pas encore tout à fait opérationnel.
 +
 +
Le script C permet simplement de lancer le programme. Il était prévu d'également modifier les droits de l'utilisateur dans le script, pour lui permettre d'accèder au port série, mais il apparait qu'il est en fait plus simple d'ajouter l'utilisateur au groupe dialout, groupe autorisé à utiliser les ports série.
  
 
===Branchements & Fixations===
 
===Branchements & Fixations===
Ligne 232 : Ligne 244 :
  
 
De plus, nous avons fait des recherches sur le serveur et particulièrement l'envoi continu de données pour envoyer la position de notre joystick virtuel à notre serveur.
 
De plus, nous avons fait des recherches sur le serveur et particulièrement l'envoi continu de données pour envoyer la position de notre joystick virtuel à notre serveur.
Suite à ces recherches, nous sommes arrivés à une démonstration de communication serveur-client et pour les besoins de celle-ci, nous avons du mettre à jour notre version de Linux ubuntu et nos paquets nodejs et npm.
+
Suite à ces recherches, nous sommes arrivés à une démonstration de communication serveur-client (http) et pour les besoins de celle-ci, nous avons du mettre à jour notre version de Linux ubuntu et nos paquets nodejs et npm.
  
Nous avons maintenant deux fichiers qui permettent la communication client-serveur et l'envoi de message simples. Et d'autres fichiers qui gèrent le joystick.
+
Nous avons maintenant deux fichiers qui permettent la communication client-serveur et l'envoi de message simples, des chaînes de caractères. Et d'autres fichiers qui gèrent le joystick, ses valeurs x et y.
 
Nous allons donc devoir comprendre ces différents fichiers pour savoir comment récupérer nos valeurs en x et en y et les envoyer au serveur.
 
Nous allons donc devoir comprendre ces différents fichiers pour savoir comment récupérer nos valeurs en x et en y et les envoyer au serveur.
  
 +
==Semaine 5 du 04/02==
 +
 +
===Programme Arduino===
 +
 +
Correction du programme arduino, notamment d'un problème lors de l'émission réception en série des données. Le délai minimum obtenu pour l'instant est d'une seconde, ce qui pourrait s’avérer insuffisant. Le message a été réduit au minimum, il faut déterminer quelle action prend beaucoup de temps, et si ce temps est compressible. La communication série entre l'Arduino et l'ordinateur se fait en 115200B, ce qui devrait être plus que suffisant pour envoyer un message de 10 octets en quelques millièmes de secondes, mais ce n'est apparemment pas le cas. Pour envoyer un message de 10 octets à 115200B, il faudrait en principe 7 micro-secondes. On remarque également des erreurs lors de la transmission série, ce qui entraine la nécessité de transmettre plusieurs fois un message avant qu'il ne soit bien reçu. Même en prenant en compte les erreurs de transmission, et la nécessité de devoir attendre une réponse sur 24 octets, ça ne justifie pas un délai de presque une seconde entre chaque message.
 +
 +
Problèmes sur le dual boot de travail, une machine virtuelle a sur-occupé l'espace, puis sa désinstallation à entrainé des problèmes sur Linux.
 +
 +
===Programme en C===
 +
 +
Ajout de la lecture/écriture de fichiers sur le programme en C, ainsi que la gestion des interruptions. Il reste à déterminer si les verrous posés lors de l'utilisation des fichiers vont fonctionner pour éviter de lire pendant une écriture. Le protocole d'échanges des données par fichiers, doit encore être implémenté côté serveur, et nous pourrons ensuite tester le bon fonctionnement de l'ensemble.
 +
 +
Le problème principal est que le serveur peut transmettre des instructions vers le robot bien plus vite que celui-ci ne peut les recevoir, et l'idée principale qui a été retenue est d'écrire les informations dans un fichier, sans conserver les informations précédentes. De cette façon, on n'a pas de fichier de stockage prenant des trop grandes dimensions, et on est sûr de toujours lire les informations les plus récentes.
 +
 +
===Organisation du robot===
 +
 +
Pour compléter le rangement des éléments à l'intérieur du robot, nous avons dessiné les supports destinés aux variateurs. Pour cela nous avons pris exemple sur les supports déjà existants, nous les avons redessinés puis ajustés pour qu'ils entrent dans les fentes prévues à cet effet sur la plaque de l'étage du haut.
 +
 +
Nous avons ensuite fait un test de découpe pour ces supports ainsi que pour le convertisseur 24V-12V dont les plans avaient été dessinés précédemment. Après ce test, sont venues les étapes de rectifications pour que les composants s'emboîtent correctement sur leur support, et de redécoupe. Nous avons donc maintenant des supports!
 +
Nous avons donc pu brancher à nouveau les variateurs et le convertisseur au sein du robot mais plus proprement.
 +
 +
===Récupération du projet===
 +
 +
Malheureusement, au cours de la semaine, mon ordinateur a cessé de fonctionner et nous avons donc perdu un peu de temps pour en recommander un, et faire les installations nécessaires dessus. Une fois le nouvel ordinateur prêt, nous avons récupéré notre projet sur git. Heureusement notre avancement était archivé sur un git, ainsi seulement les parties de tests ont été perdues.
 +
 +
==Semaine 6 du 11/02==
 +
 +
===Organisation du robot===
 +
 +
Finir les branchements du robot. Il est nécessaire de terminer l'intérieur du robot avant la fin du projet. En effet, il est tout a fait possible d'obtenir un robot fonctionnel sans cela, mais l'aspect esthétique ne doit pas être négligé. Nous avons passé beaucoup de temps, au cours de ces semaines, à modifier l'intérieur et à découper du plexiglas afin que tous les câblages ne soient pas trop présents. Ce robot devra être présentable, quelle que soit son utilisation future. Il ne nous reste qu'a terminer les branchements de la partie supérieure, et à découper une boite qui pourra maintenir l'Arduino, les relais, et l'ordinateur. Un problème que nous avions rencontré auparavant, était également la non-fiabilité des borniers utilisés pour les contacts. Au cours de cette semaine, nous avons essayé de tout resserrer afin que ce genre de problème ne se reproduise plus. De multiples tests ont également été effectués afin de s'assurer qu'on puisse démarrer le robot de façon fiable sans devoir l'ouvrir. Le bouton d'arrêt d'urgence à également enfin été mis en place de façon définitive. Un faux contact au niveau du PCB a également été résolu.
 +
 +
===Communication client-serveur-Aduino===
  
 +
Faire l'échange entre serveur et Arduino, possiblement en passant par un programme en C, ou en établissant une communication directe entre le port série et le Js du serveur. Après réflexion et tests, nous avons décidé d'établir une liaison directe entre le serveur et l'Arduino, sans passer par un langage intermédiaire. En effet, passer par un programme C ralenti le processus en ajoutant un intermédiaire inutile, et malgré des tests concluants de communications entre le programme en C et l'Arduino, faire un programme en Js n'a pas été difficile, et simplifie considérablement nos échanges.
  
 +
Au niveau du site web, nous avons modifié les fichiers du Joystick pour qu'il envoie des valeurs comprises entre -500 et 500, valeurs ensuite envoyées au serveur en communication http par le client. Puis nous récupérons ces données et nous les envoyons en série à l'Arduino en respectant le format de la trame demandée à savoir : 'X' suivi de '+' ou '-' puis la valeur de x sur 3 chiffres (ex: 000 ou 089) puis 'Y' suivi de '+' ou '-' et sa valeur sur trois chiffres également. Un exemple de message correct serait 'X+450Y+000'.
 +
En fin de semaine, nous avons enfin obtenu le résultat désiré, en utilisant le joystick du site web, hébergé par un ordinateur connecté à l'Arduino, pour contrôler les roues du robot. Tout le process de communication est donc techniquement fonctionnel. Pour ce test, le robot était contrôlé par un autre ordinateur, connecté sur le même wifi que l'ordinateur du robot. Il reste cependant à corriger des défauts dans le joystick, qui n'envoie pas toujours les valeurs correspondant à celles voulues (il glitch et se déplace très rapidement vers le centre quand on approche des bords du Joystick).
  
Améliorations du programme arduino (tourne comme un tank)
+
'''*** ViDEO ***'''
  
==Semaine 5==
+
===Alimentation===
  
 +
La Kinect, l'ordinateur et l'écran seront alimentés grâce au 12V sortant du convertisseur 24/12V. Les capteurs seront alimentés et commandés par l'Arduino. Il s'avère que le convertisseur 24->12V ne sort pas du 12 mais du 13.6V. C'est correct pour alimenter l'écran, mais pas la kinect ou l'ordinateur. Un pont diviseur consommerais trop de courant et on n'aurait plus assez de puissance pour alimenter les appareils. Un autre convertisseur à été trouvé, cette fois-ci allant bien de 24 vers 12V, et qui peut sortir au maximum 360W. C'est plus que suffisant pour notre application, qui nécessite seulement 90W pour l'ordinateur, 13W pour la Kinect, et 42W pour l'écran, pour un total de 145Watts demandés. Cependant, ce convertisseur présente un autre défaut majeur, il aurait tendance à chauffer jusqu'aux 150 degrés, ce qui est inacceptable pour notre robot. Un autre convertisseur à été commandé, et sera testé après la semaine d'interruption pédagogique. Avant de se rendre compte que le précédent convertisseur ne donnait pas les 12V demandés, le test a fait chauffer l'alimentation de la Kinect. Il faudra donc déterminer grâce à la nouvelle alimentation si celle de la Kinect à grillé ou non.
  
==Semaine 6==
+
===Installation Linux===
 +
Au cours de la semaine, nous avons également préparé une clé bootable avec la distribution Debian Stretch de Linux dessus pour l'installer sur l'ordinateur intégré au robot. Nous l'avons donc branché à l'ordinateur et nous avons constaté que linux était déjà installé dessus et qu'un utilisateur centaure existait déjà.
  
 
==Fin (interruption pédagogique)==
 
==Fin (interruption pédagogique)==
aka rapport + wiki
+
 
 +
Lors de la dernière semaine avant les soutenances, nous avons eu l'occasion de faire plusieurs choses. D'abord, rédiger le rapport, commencé pendant l'interruption pédagogique mais terminé au début de la semaine.
 +
Ensuite, nous avons testé le nouveau convertisseur, acheté par Mr Redon, qui lui sort bien du 12V régulé, et nous nous en sommes servis pour alimenter l'ordinateur, la kinect et l'écran. Tout est donc opérationnel de ce côté, l'alimentation est correcte.
 +
Le programme Arduino a également été modifié puis testé pour pouvoir lire et envoyer les valeurs des capteurs à l'ordinateur. Si le robot détecte un objet trop proche, il va immédiatement rouler dans l'autre direction jusqu'à ce que l'objet soit de nouveau à une distance raisonnable.
 +
Nous avons ensuite redessiné la boite qui devra contenir ordinateur et Arduino, afin de prendre en compte le bouton et les Leds de démarrage de l'ordinateur, pour la découper ensuite. Cette boite marquera le point final dans le rangement du robot.
 +
 
 +
Nous avons également changé le Joystick présent sur le site web, l'ancien bien que facile à prendre en main présentait des bugs lorsque l'on approchait la souris de ses bords. En effet, lorsqu'on souhaitait aller au maximum d'une direction et qu'on approchait de l'extrémité du Joystick, celui-ci bougeait très rapidement dans plusieurs directions et ne restait pas stable.
 +
Grâce au nouveau Joystick de NippleJS, nous n'avons plus ce problème.
 +
 
 +
Nous avons également refait la communication entre la page index.html et le Joystick pour envoyer les coordonnées.
 +
 
 +
==Vidéos de fonctionnement==
 +
 
 +
===Vidéo de test en filaire===
 +
 
 +
Voici une vidéo du test de fonctionnement du robot en filaire sur la table :
 +
 
 +
[[File:Test_filaire_table.mp4]] <br>
 +
 
 +
 
 +
Voici une vidéo du test de fonctionnement du robot en filaire à terre :
 +
 
 +
[[File:Test_filaire.mp4]] <br>
 +
 
 +
===Vidéo de test commandé en wifi===
 +
 
 +
Voici une vidéo du test de fonctionnement du robot commandé en wifi sur la table :
 +
 
 +
[[File:Test wifi table.mp4]] <br>
 +
 
 +
 
 +
Voici une vidéo du test de fonctionnement du robot commandé en wifi à terre :
 +
 
 +
[[File:Test_wifi.mp4]] <br>
 +
 
 +
=Point sur le projet=
 +
 
 +
==Détails sur le câblage du robot==
 +
 
 +
[[File:Schema_cablage_Centaure_2018.png|400px|thumb|center|Schéma de cablage du robot Centaure]] <br>
 +
 
 +
Tout d’abord nous avons 2 batteries de 12V en parallèle ce qui nous donne une alimentation de 24V. Ces deux batteries sont liées à un coupe-batterie qui coupe l’alimentation du robot entièrement.
 +
De l'autre côté, les batteries sont branchées sur un bornier. De l'autre côté de ce bornier, nous avons 3 câbles connectés au 24V des batteries ce qui permet de distribuer la tension. La masse étant connectée au rail, elle est, elle aussi, distribuée. Le câblage se sépare donc en 3 parties à partir d'ici.
 +
 
 +
En premier, nous distribuons la tension au convertisseur 24V vers 12V. Le 12V du convertisseur est branché sur le bornier de l'étage et ce qui nous permet d'alimenter l'ordinateur, la kinect et l'écran.
 +
 
 +
Ensuite, en deuxième, le bornier de l'étage inférieur est connecté au bornier supérieur et ainsi au bouton d'arrêt d'urgence. Le bouton d'arrêt d'urgence est lui connecté au bouton de départ cycle et au relai qui se trouve sur le rail en haut du robot. Le relai, lui, est branché au contacteur. Lorsque le relai est alimenté en 24V, cela va être transmit à la commande du contacteur qui va donc laisser passer le 24V qu'il reçoit en entrée à la sortie.
 +
Si on actionne le bouton d'arrêt d'urgence, le relai ne sera pas alimenté ce qui va couper l'alimentation du contacteur.
 +
 
 +
Enfin, en troisième et en dernier, nous avons le contacteur qui en entrée prend également du 24V et le réparti sur 3 câbles. En sortie, nous reprenons la tension et nous connectons 2 câbles au porte fusible pour ajouter une sécurité supplémentaire. Un de ces câbles va être branché sur les freins des moteurs sortant de la gaine, si on ne les alimente pas en 24V, les roues seront bloquées et ne pourrons pas tourner. Et l'autre sur le shield.
 +
La dernière sortie du contacteur est branchée sur le bornier du haut qui va alimenter les variateurs de vitesse en 24V.
 +
 
 +
===Le shield===
 +
<br> [[File:PCB3.PNG|400px|thumb|center|Version finale du PCB]] <br>
 +
 
 +
Au mileu du PCB, nous pouvons trouver une double barrette (2x18), celle-ci regroupe des VCC d'un côté et des masses de l'autre pour ajouter des sensors par la suite.
 +
En bas à gauche, en J1, nous avons la prise RJ11 pour contrôler le Joystick manuellement.
 +
 
 +
En P26 et P27, nous avons les DAC. Puis en P19 et P20, nous avons les barrettes devant être reliées aux variateurs de vitesse. Enfin, nous avons P24 et P25 qui vont être connectés au PCB des relais.
 +
Pour les capteurs, nous les branchons sur les headers connectés à l'Arduino directement.
 +
 
 +
===La carte des relais===
 +
<br> [[File:quadrelay_board.jpg|200px|thumb|center|Version finale du PCB]] <br>
 +
 
 +
Pour les relais, on a l'alimentation des relais en eux-même, ainsi que le contrôle des relais, sur un header 6 pins, très bien indiqué.
 +
A l'avant des relais, on a le 24V en entrée de deux relais, un par régulateur, et une première sortie sur ce relais, qui indique la marche avant aux régulateurs. Il y a ensuite un pont entre premier et deuxième relai, et le deuxième relais sert lui à indiquer la marche arrière
 +
Pour la marche avant, on a donc relai 1 fermé, peu importe l'état du relai 2.
 +
Pour la marche arrière, il faut relai 1 ouvert, et relai 2 fermé.
 +
 
 +
===Les variateurs de vitesse===
 +
<br> [[File:Variateurs.jpg|300px|thumb|center|Version finale du PCB]] <br>
 +
 
 +
En bas à gauche, il y a la barrette à brancher sur le shield de l'Arduino.
 +
 
 +
En haut à droite, nous pouvons visser le 24V et la masse venant du bornier en haut du robot. Il est d'ailleurs écrit sur la carte Batt - et + pour indiquer où les brancher précisemment.
 +
 
 +
En haut à gauche, nous pouvons visser le + et le - des moteurs. Il est d'ailleurs écrit sur la carte motors - et +.
 +
 
 +
==Comment le faire fonctionner==
 +
 
 +
Pour mettre en route le robot et le faire rouler, il faut suivre les étapes suivantes dans l'ordre :
 +
 
 +
* Tout d'abord, il faut fermer le coupe batterie pour laisser les batteries alimenter les éléments connectés à celles-ci.
 +
 
 +
* Ensuite, il faut démarrer l'ordinateur en appuyant sur le bouton de démarrage. Ceci va alimenter l'Arduino (branché en USB sur l'ordinateur). L'Arduino va sortir la tension minimale requise et nécessaire au bon démarrage des variateurs de vitesse. Sans cette tension, les variateurs se mettraient en erreur.
 +
 
 +
* Maintenant, il faut appuyer sur le bouton de départ cycle pour laisser la tension de 24V passer dans le reste du robot. Normalement, le robot devrait être apte à rouler à partir de ce point.
 +
 
 +
* En cas de problème, il faut appuyer sur le bouton d'arrêt d'urgence, cela va couper l'alimentation du contacteur et donc de l'étage. Il est également possible d'ouvrir le coupe batterie et couper intégralement l'alimentation au sein du robot.
 +
 
 +
==Subtilité du programme Arduino==
 +
 
 +
Pour le programme Arduino, il existe deux modes, le mode serveur et le mode Joystick. Ces modes sont atteints, pour l'instant au moyen d'une variable globale définie à 1 ou 0. a 1, on lit le port série, donc le serveur, à 0 on lit la prise RJ12, donc le joystick physique. Quand on est en mode serveur, les capteurs sont également pris en compte, en mode joystick ce n'est pas le cas.
 +
 
 +
==Fonctionnement du site et du serveur==
 +
 
 +
Dans le dossier du projet, il y a deux fichiers permettant la communication entre le serveur et les clients :
 +
* Le fichier seveur.js
 +
* Le fichier client.js présent dans le dossier public
 +
 
 +
Pour réussir à commander le robot en wifi, il va d'abord falloir vérifier l'adresse ip à entrer dans le navigateur et démarrer le serveur écrit en NodeJS.
 +
 
 +
Première étape, l'adresse ip. Pour vérifier l'adresse ip, entrez la commande '''ip a''' dans le terminal. Ensuite, modifiez le fichier server.js avec la bonne adresse ip. La ligne a modifier est la suivante : ''server.listen(port, 'adresse ip');''
 +
 
 +
Et il va falloir faire de même avec le fichier public/client.js. La ligne à modifier est la suivante : ''var socket = new WebSocket('ws://adresse ip:port/');''
 +
 
 +
Vous pouvez maintenant lancer la commande ''npm start'' dans le terminal. (Il faut que vous soyez dans le dossier du projet pour cela)
 +
 
 +
Côté client, entrez simplement l'adresse ip suivi du port comme ceci : ''adresseip:port''. Si vous êtes sur le même réseau wifi que l'ordinateur du robot, la page devrait se charger et vous devriez pouvoir commander le robot à distance.
 +
 
 +
Autre point important, dans server.js, on se charge également de la communication série avec l'Arduino. Si vous obtenez un message d'erreur à ce propos, vérifiez que le port dans le fichier server.js correspond bien à celui sur lequel est l'Arduino en faisant ''ls /dev''. Logiquement, l'Arduino devrait être connecté au port ACM0 mais il peut arriver qu'il soit sur ACM1.
 +
 
 +
==Améliorations==
 +
 
 +
Pour améliorer le projet, nous avons plusieurs pistes :
 +
 
 +
* Créer un fichier pour lancer npm start dès que l'ordi démarre pour ne pas avoir à le faire manuellement.
 +
 
 +
* Modifier le programme Arduino et lire la valeur d'un pin pour savoir si on fait Joystick matériel ou Joystick virtuel au lieu de changer le programme arduino à chaque fois.
 +
 
 +
* Finir de découper les boîtes et améliorer le câblage de l'étage du haut pour le rendre plus sûr et éviter les défaillances.
 +
 
 +
* Ajouter la lecture des capteurs et la webcam sur le site.
  
 
=Documents Rendus=
 
=Documents Rendus=
 +
 +
• Rapport : [[Fichier:Projet_IMA5_Rapport.pdf]]
 +
<br>
 +
• Diapo pour la soutenance : [[Fichier:Soutenance_PFE_Centaure_2018.pdf]]
 +
 +
<br>
 +
• Plans SVG pour l'organisation du robot : [[Fichier:Centaure_svg.zip]]
 +
<br>
 +
• Dossier contenant le site, le serveur et les programmes : [[Fichier:Projet_ima5-master.zip]]
 +
<br>
 +
• PCB pour le shield : [[Fichier:PCB_P30.zip]]
 +
 +
 +
• Archive zip regroupant ce qui a été fait les années précédentes :([https://1drv.ms/u/s!Agdnb608xp_Rift2zCfKdIWpLIfFMQ lien Onedrive vers l'archive])

Version actuelle datée du 3 avril 2019 à 16:46


Présentation générale

Description

Encadrants : Xavier Redon / Alexandre Boé / Thomas Vantroys
Objectif : Contrôler un robot de grande taille à partir d'une tablette.
Description : Un robot de grande taille a été réalisé à partir de moteurs de fauteuil roulant. Le système de contrôle électrique a été détruit lors d'un précédent projet, il est à reprendre totalement. Le système de commande à base d'Arduino commandant des contrôleurs de moteurs de puissance doit être revu lui aussi. Il faut ensuite s'assurer d'un dispositif d'arrêt d'urgence en cas d'obstacle proche. Pour la détection d'obstacles vous pouvez vous appuyer sur des détecteurs infrarouges et sur une Kinect. Enfin le PC embarqué doit être configuré pour se connecter sur les points d'accès WiFi de l'école et comporter un site Web permettant ainsi de le contrôler à distance avec les images des Webcam comme retour. Pour un déplacement dans tous les bâtiments de l'école, prévoir un dispositif pour appuyer sur les boutons des ascenseurs.

Objectifs

  • Faire à nouveau rouler le robot, rendre son câblage compréhensible et clair.
  • Connecter le robot en wifi grâce à l'ordinateur qui y sera intégré, et réaliser un site web permettant d'accéder au robot.
  • Vérifier les capteurs et s'en servir pour contrôler le robot à distance, le faire se déplacer dans Polytech, et le faire prendre les ascenseurs.

Préparation du projet

Cahier des charges

Choix techniques : matériel et logiciel

Nous utilisons un robot pré existant, et en grande partie du matériel pré existant. Pour la fixation des cartes dans le robot, nous allons acheter nous mêmes la visserie spécifique dont nous avons besoin si elle n'est pas à notre disposition. L'ordinateur a intégrer au robot, la webcam, l'écran, les régulateurs de moteur, l’Arduino méga, et les batteries sont déjà fournis.

Liste des tâches à effectuer

  • Faire rouler à nouveau le robot
  • Faire du ménage dans les câblages et tout faire tenir à l'intérieur pour que le robot soit mobile (joystick)
  • Installer l'ordinateur et connecter le robot au wifi
  • Réaliser un site web permettant de contrôler le robot
  • Lire le retour de la webcam et des infrarouges pour le contrôle à distance
  • Faire rouler le robot en utilisant le site web et le wifi
  • Prendre les ascenseurs?

Calendrier prévisionnel

Contacter Nicolas Havard (Semaine 1)
Lire la documentation pertinente (Semaine 1)
Refaire les câblages, faire du rangement dans le robot (Semaine 1)
Comprendre le fonctionnement des régulateurs de vitesse et du robot (Semaine 1)
Etape 1: Contrôler le robot à l’aide de la manette (Semaine 1)
Y intégrer un ordinateur pour contrôler le robot de cette façon (via le port série) (Semaine 2)
Faire le site internet de contrôle du robot (Semaine 3/4)
Connecter le robot en wifi (Semaine 3/4)
Etape 2: Contrôler le robot à l’aide du site en wifi (Semaine 3/4)
Gérer la webcam (Semaine 5)
Tester les capteurs (Semaine 5)
Etape 3: Contrôler le robot à l’aide du wifi et des capteurs à distance (Semaine 5)
Wiki (Toutes les semaines) (Semaines 1-8)

Si on en a le temps: utilisation des ascenseurs.

Réalisation du Projet

Semaine 1 du 07/01

Nos objectifs pour la semaine sont de démonter, nettoyer, et remonter correctement le robot, afin que le câblage soit lisible et que tout puisse y rentrer. Nous allons également le tester afin de s'assurer qu'il roule sans soucis et que le contrôle au joystick soit fonctionnel. Si possible, nous désirons également corriger le système d'arrêt d'urgence et de démarrage pour qu'ils soient accessibles à la fois de façon logicielles et physiques, en parallèle. De cette façon, lorsque l'on passera à l'étape du wifi, nous pourrons contrôler le robot entièrement à distance. Il est très important que tout fonctionne sans soucis, nous comptons ensuite nous baser sur le contrôle au joystick pour créer le contrôle via l'ordinateur. Si l'on réussi à disposer d'un robot fonctionnel, et de bons plans pour y intégrer l'ordinateur et la wifi rapidement à la semaine 2, ce sera un bon début de projet.

Jour 1: Prendre connaissance de l'état du robot, et des choses à faire avant de pouvoir réellement commencer le projet. Création du wiki. Lecture de la documentation pré existante. Création d'un plan du robot et mesure de toutes ses dimensions importantes.
Jour 2: Réaliser un schéma des branchements actuels puis tout débrancher pour réorganiser le robot. Retirer les plaques de soutien actuelles, réduire la taille des borniers, trouver un moyen élégant et efficace de soutenir les différents éléments composant le robot. Comprendre le PCB présentement réalisé pour pouvoir le reproduire de façon potentiellement plus efficace, peut être avec un shield supplémentaire sur l'Arduino Méga.
Jour 3-5: Réaliser le PCB et le système de compartimentation du robot afin d'essayer de la refaire fonctionner pour la fin de la semaine 1 ou le début de la semaine 2, et pouvoir ensuite s'attaquer au projet en lui-même.

Schéma du PCB actuel

Le PCB actuel rempli un objectif principal, qui est de diminuer le nombre de câbles présents à l'intérieur du robot, et rendre le tout plus lisible et agréable à regarder. Pour cela, il fait le lien entre les régulateurs de vitesse, le joystick, les relais, l'Arduino Mega et les batteries.

En un premier temps, le joystick doit pouvoir transmettre des informations à l'Arduino pour la commande en vitesse. Un câble 'ethernet' RJ12, et le port associé, permettent de connecter l'Arduino au PCB, et 6 pins relient le PCB à l'Arduino pour cette fonction.
L'Arduino, en suivant ces informations, va commander les relais, qui influent sur les entrées des régulateurs. Le PCB présente donc des pins pour l'Arduino, pour y connecter les relais, et ensuite des pins pour les relais, pour y connecter les régulateurs.
L'intérêt de chaque pin a été intégré au PCb sur le silkscreen, afin de pouvoir s'en servir facilement et sans devoir toujours en réfèrer à la documentation.
Deux versions ont été réalisées, l'une un PCB standard, et l'autre un PCB destiné à être un shield qu'on puisse fixer sur le sensor shield déjà présent, pour encore réduire le câblage, et simplifier le tout.

On pourra conserver ce PCB à l'avenir car l'objectif est ensuite de simplement remplacer le joystick pour l'ordinateur, qui viendra se brancher sur la même prise RJ11 et enverra les mêmes informations que le joystick. Nous créons donc un système utilisable avec n'importe quel port RJ11 envoyant des informations correctes.

Schématic du PCB réalisé

Version non shield du PCB

Version shield du PCB

Plans pour le maintien des composants au sein du robot

Avant de pouvoir faire rouler le robot et le tester dans Polytech, nous devons fixer tous les composants présents dans le corps du robot. Pour ce faire, nous devons dessiner :

  • 1 étage en bas pour maintenir les batteries
  • 2 piliers pour fixer le bornier présent en bas et le relais
  • 1 étage en haut qui va supporter toute la partie électronique (et ses pieds pour le maintenir élevé)
  • 2 supports pour fixer les régulateurs de vitesse
  • 1 tour qui contiendra PCB, Arduino Méga, Relais et l'ordinateur


Nous avons pris les mesures du robot comme faire se pouvait et avons dessiné un premier jet que voici :

Première version des pièces de fixation

Après l'avoir installé dans le robot, nous avons remarqué quelques modifications à faire :

  • Les pieds de l'étage supérieur sont inutiles puisqu'il est déjà soutenu par les piliers fixant le bornier et le relais, nous pouvons donc les enlever
  • Les trous faits pour laisser les bouchons des batteries passer sont eux aussi inutiles puisque nous avons acheter des colliers plats pour remplacer les bouchons et gagner de la place
  • Nous enlevons également la barre entre les deux batteries sinon nous ne pouvons pas mettre les batteries
  • Enfin nous ajustons la taille des étages et de la hauteur des piliers pour qu'ils soient adaptés au robot


Ce qui nous amène donc au deuxième jet :

Deuxième version des pièces de fixation


Pour celui-ci, nous avons aussi voulu essayer de mettre l'emplacement de la future boîte qui contiendra le PC et l'arduino à droite afin de voir quel endroit lui convient le mieux.

Cette fois-ci, les étages sont légèrement trop long, donc en nous basant sur les deux essais précédents, nous allons pouvoir trouver une juste valeur pour la version finale. Il en va de même pour la longueur des encoches que nous avions agrandit.


Grâce aux deux versions précédentes, nous avons pu dessiner une troisième version qui sera aussi la version finale découpée en Plexi. Celle-ci sera terminée et découpée la semaine prochaine.

Semaine 2 du 14/01

Nouveau PCB

Changement de design du PCB, on passe d'un shield a mettre sur le shield actuel, à un shield qui remplacerais le shield actuel et remplirais donc toutes les fonctionnalités demandées d'un coup. Ce shield sera posé directement sur l'Arduino Mega, nous allons utiliser directement les pins dont nous avons besoin et les autres seront toujours accessibles, grâce à des connecteurs femelle similaires à ceux présents sur l'Arduino Mega de base. De par sa fonction, ce shield doit être très bien documenté afin qu'il soit facilement compréhensible et utilisable.

Ce shield disposera d'une led pour le debug, de pins pour les deux régulateurs, les relais, ainsi que les DAC. Une prise RJ11 sera présente pour le joystick tant qu'on en aura besoin. Nous allons également inclure 18 pins à 5V et 18 pins au Gnd sur le PCB afin de pouvoir utiliser autant de capteurs que l'on désire. Les quelques résistances nécesaires aux branchements sont également inclues sur ce montage.

Jusq'aù mardi de la deuxième semaine, le deuxième PCB est en cours de design. Il est ensuite envoyé à Monsieur Boé pour approbation. Une fois que ces premières étapes de PCB et rangement dans le robot sont terminées, un plan est réalisé pour les semaines restantes, afin de savoir quoi faire de jour en jour.

Schématic de la version finale du schématic réalisé

PCB routé en double couche

Cependant, les PCB réalisés à Polytech ne peuvent pas être vraiment fait en double couche, du fait de l'impossibilité de réaliser des vias métalliques. De plus, les câbles étaient initialement trop fins. Il a donc fallut réaliser un nouveau routage du PCB en simple couche. J'ai néamoins pu optimiser le routage, ce qui fait que l'on n'aura besoin que de deux jumpers pour finaliser le routage. Les gravures ont également été diminuées afin de simplifier le travail à la découpe.

PCB routé en simple couche

Design des pièces de maintien

Cette semaine, nous avons terminé le design des étages du haut et du bas qui serviront à créer des compartiments au sein du robot.

Grâce aux deux versions tests dessinées et découpées la semaine dernière, nous avons pu élaborer une troisième et dernière version. Pour celle-ci, nous avons ajuster la longueur des étages, nous avons ajouté des encoches pour les derniers éléments qui n'avaient pas encore de place attitrée. De plus, nous avons ajouté les trous de vis dans les piliers pour aider à fixer les éléments.

Version finale des pièces de fixation


Nous avons pris le soin de faire les découpes et de tester le résultat au fur et à mesure pour éviter tout problème et gâchis de matériau. Nous avons donc découpé les deux étages. Malheureusement, la découpeuse est devenue HS alors que nous devions découper les piliers ce qui retardera le processus. En attendant, nous allons réaliser le premier jet de design de notre site internet pour la commande à distance du robot.

Après seulement deux jours, la découpeuse était à nouveau opérationnelle, nous avons donc repris le cours normal de notre projet. Nous avons donc découpé les piliers qui vont servir à maintenir l'étage du haut à une certaine hauteur de l'étage du bas et sur lesquels seront vissés certaines pièces du robot.

Version finale des piliers

Une fois ces pièces prêtes, nous avons entamé de remonter le robot. Cette partie a pris plus de temps que prévu puisque les câbles sont assez rigides et il est compliqué de leur donner la forme que l'on souhaite. De plus, comme nous avons changer la place des différents éléments du robot, la longueur des câbles n'est plus forcément adapté et nous avons du les ajuster ce qui s'est révélé assez long.

Entre temps, nous avons commencé le design des boîtes qui serviront à garder en place l'électronique de l'étage supérieur et nous les testerons la semaine prochaine. Nous finirons également de monter le robot la semaine prochaine.

Test des capteurs

Les valeurs renvoyées par les capteurs ne correspondent pas vraiment aux valeurs indiquées sur la datasheet. Cependant, il semblerait qu'il puisse détecter des objets plus proches et moins loin que prévus, ce qui correspond mieux à nos besoins.

Insérer graphique, tableau, référence

Semaine 3 du 21/01

Convertisseur

La première chose à faire à été de faire sertir les câbles qui seraient utilisés pour le convertisseur 24->12V. Ces câbles devaient être présents pour la finition de l'étage du bas du robot. Il n'est possible de sertir que des câbles souples, il n'a donc pas été possible d'utiliser des câbles rigides utilisés dans le reste du robot.

Programmation

Ensuite un premier test de la Kinect a été réalisé, afin de vérifier la simplicité d'utilisation de celle-ci. Pour notre application actuelle, à savoir simplement afficher le retour vidéo sur un écran, il est très simple d'installer les bibliothèques requises sont linux et d'afficher la vidéo sur notre écran. Il sera ensuite simplement question d'ouvrir ce flux vidéo en le redirigeant vers le serveur plutôt que vers un écran directement.

Le programme Arduino sera d'abord repris du projet de Nicolas Havard, de l'année précédente. Le contrôle des moteurs par l'Arduino sera un peu amélioré afin que la transition de marche avant à marche arrière se face sans problèmes. En effet, jusque là lors d'un passage de marche avant à marche arrière, le robot ne passait pas forcément par l'état arrêt, et cet état est nécessaire pour empêcher les régulateurs de se bloquer. Ça à donc été ajouté au programme. Il a ensuite fallut ajouter la lecture des senseurs du robot et envoyer le résultat de cette lecture sur le port série.

Ensuite, la dernière partie du programme concernant l'Arduino consiste à envoyer des informations sur le port série, puis à lire la réponse de l'ordinateur, qui à terme va remplacer le joystick pour la transmission d'ordres au robot. Il s'agit donc d'écrire un programme en C qui puisse utiliser le port série en lecture/écriture. Ceci est fait sans trop de problèmes, on a maintenant un programme Arduino capable de transmettre l'état des capteurs à l'ordinateur et de lire l'état du joystick virtuel donné par l'ordinateur, afin de réaliser le mouvement demandé.

De plus, on fait en sorte que le programme en C se lance dès l'allumage de l'ordinateur, et qu'il tourne en boucle afin d'être actif en permanence dès l'allumage du robot.

Maintien

Une fois les pièces rassemblées, nous avons pu commencer le montage du robot. Nous avons commencé par assembler les câbles de petits diamètre car ils étaient plus nombreux et que pour fixer les câbles des batteries, nous aurions dû tout visser à l'intérieur du robot alors qu'il est plus facile de visser à l'extérieur un maximum.

En commençant à mettre les câbles en place, nous avons pensé d'avantage au branchement, et nous avons réalisé que quelques ajustements sur les étages seraient judicieux, nous avons donc entrepris de dessiner et nous avons redécoupé sur les étage déjà existant de nouveaux trous pour les passages des câbles.

Tout d'abord, nous avons remarqué que les parties déjà dénudées des câbles étaient abîmées à cause de leurs précédentes multiples utilisations. Nous avons donc décidé de couper les parties abîmées et de les dénuder à nouveau, comme ces câbles sont plus longs que nécessaire, en couper une partie ne posait pas problème. Vu le diamètre des câbles, nous avons eu besoin de matériel spécial emprunté à M. Flamand. Cependant, malgré les outils prêtés, la tâche ne s'est pas avérée aisée et a pris plus de temps que prévu.

Ensuite, nous avons entrepris de placer les câbles précédemment coupés de façon à ce qu'il atteignent leur bornier tout en ne gênant pas le reste du câblage. Pour cette étape, comme les câbles étaient trop longs et qu'il est certes facile de raccourcir un câble mais pas de le rallonger, nous avons décidé de les plier. Par contre, ce sont des câbles plutôt rigides et ils ne prennent pas facilement la forme que l'on souhaite leur donner. Après de multiple essais pour les plier à la main ou à l'aide d'une pince, nous avons testé une autre méthode. En effet, en fin de semaine, nous avons eu l'idée de scotcher les câbles en place en leur donnant la forme que l'on souhaitait et de les laisser ainsi une nuit pour voir s'ils avaient gardé cette forme. Bonne surprise, le lendemain matin car cette méthode avait fonctionné.

En fin de semaine, nous avons donc pu procéder à la finalisation de l'assemblage de l'étage du bas.

Au cours de la semaine, nous avons également pris le temps de dessiner une boîte qui maintiendrait en place le convertisseur et nous l'avons découpée dans des chutes de plexi. De légers ajustement seront à faire sur cette boîte pour la version définitive.

La semaine prochaine, en plus de monter l'étage du haut, nous allons devoir régler un dernier détail sur l'étage du bas. En effet, en déposant la plaque de plexi de l'étage du haut, nous nous sommes rendu compte qu'il était bancal. Nous avions oublié que certaines cosses des batteries ne pouvaient être enfoncées correctement et provoquait ce décalage de hauteur. Nous devrons donc trouver une solution pour les enfoncer correctement la prochaine fois.

De plus, alors que nous avons essayé d'enlever l'étage du haut du robot, une fissure s'est créée. Nous allons donc essayer de la réparer avant qu'elle ne s'aggrave et qu'une partie de la plaque ne casse.

Site

A partir du design du site précédemment réalisé, nous avons choisi un bootstrap qui va nous permettre de réaliser un site esthétiquement agréable tout en gagnant du temps. Nous avons ensuite adapté le bootstrap à nos besoins pour avoir la structure de base HTML de notre choix. Grâce à ces modifications, nous avons maintenant notre base à laquelle nous allons pouvoir ajouter notre autres éléments tel le joystick; la webcam, les capteurs, etc...

En parallèle, nous avons entamé les recherches sur le joystick virtuel. En effet, des librairies avec des Joystick existent déjà et nous regardons les différentes possibilités pour savoir lesquelles implanter.

Semaine 4 du 28/01

PCB

Faire découper la deuxième version du PCB, la souder et la tester, en récupèrant des composants sur le PCB de l'année précédente. Des petits problèmes de contacts sont réglés par des soudures, notamment au niveau de la prise RJ11. Le PCB n'est pas tout à fait à la bonne taille, mais fonctionne toujours bien comme Shield. Il y a également, lors du premier test, deux problèmes : le premier hardware, deuxs fils avaient été branchés à l'envers au niveau des relais, ce qui fait que le robot ne pouvait aller qu'en marche avant. Cependant, ça n'a pas causé de problèmes à long terme. Le second, en software, était issu de l'inversion de deux pins en hardware qui n'avait pas été répercutée en software. Problème qui a été réglé facilement une fois qu'il a été trouvé.

Version finale du PCB

Arduino

Le programme Arduino a été amélioré avec plusieurs fonctionnalités. Tout d'abord, lorsqu'une commande en vitesse impliquant une tension inférieure à 70mV est envoyée, cela entraîne la coupure des régulateurs, et il faut alors redémarrer tout le robot. On ignore ici cette commande et on éteint directement le moteur à la place. Ensuite, quand on met le joystick de façon a avoir un y nul, et une valeur en x, le robot effectue maintenant une manœuvre avec les deux roues tournant dans des sens opposés, ce qui n'était pas pris en compte auparavant. La mobilité et le contrôle que l'on a sur le robot sont donc grandement améliorés.

Le programme Arduino a ensuite été adapté afin de pouvoir prendre en compte la lecture des capteurs. En effet, si les capteurs sont branchés, il suffit du mettre une variable globale à 1 pour prendre en compte ceux-ci et arrêter le robot si un objet est trop proche de celui-ci.

Enfin, le programme Arduino peut maintenant lire le port série pour recevoir des commandes au lieu de lire la prise RJ11. Cette dernière fonctionnalité n'est pas encore au point, on analyse bien les messages reçus, mais il y a des problèmes de réception des messages sur le port série depuis un code en C qui se contente d'émettre en boucle un message.

Programme en C et script linux

Le programme en C actuel a été réalisé sans trop de problèmes et permet d'ouvrir le port USB sur lequel l'Arduino est branché, pour ensuite y envoyer des données. On va ensuite essayer de lire une donnée, qui sera la réponse de l'Arduino et devra être envoyée vers le serveur par la suite, même si celui-ci n'est pas encore tout à fait opérationnel.

Le script C permet simplement de lancer le programme. Il était prévu d'également modifier les droits de l'utilisateur dans le script, pour lui permettre d'accèder au port série, mais il apparait qu'il est en fait plus simple d'ajouter l'utilisateur au groupe dialout, groupe autorisé à utiliser les ports série.

Branchements & Fixations

En début de semaine, nous avons enfoncé les collier des batteries pour qu'ils soient tous au même niveau. Pour ce faire, nous avons emprunté une pince et un tournevis de force à M. Flamand qui nous ont permis d'écarté les colliers le temps de les mettre en place.

Nous avons ensuite pu re-finaliser les branchements de l'étage du bas, puis nous avons assemblé les piliers avec l'étage du haut et procédé au branchement de l'étage du haut.

Après tout ceci, nous avons fait le premier test pour faire rouler le robot en filaire à l'aide du Joystick réalisé par Nicolas Havard lors du semestre précédent. Comme le premier test n'a pas fonctionné, nous avons entamé la phase de "debbugage" où nous cherchions la cause du soucis, réglions le problème, testions à nouveau et ainsi de suite jusqu'à fonctionnement. Après moult essais et problèmes rencontrés, nous avons réussi à faire tourner le robot en fonction du joystick. Voici une courte démonstration :

*****Demo*****

De plus, nous avons profité d'un peu de temps dans la semaine pour "réparer" notre fissure dans la plaque du haut. Nous avons essayé deux méthodes différentes, pour l'une d'elle nous avons mis de l'acétone sur la fissure puis de la superglue par mesure de précaution. Puis pour l'autre, nous avons tenté de faire fondre le plexi avec un fer à souder, comme cela a créé une légère crevasse, nous l'avons remplie avec de la superglue également. Nous allons être plus prudent dorénavant et nous allons espérer que cela tienne en place.

Site web

En parallèle des branchements, nous avons continué à réaliser le site web. Nous avons ajouté un joystick dont les valeurs varient entre -1 et 1 pour x et y, et celles-ci s'affichent en dessous du joystick pour des besoins de debuggage.

De plus, nous avons fait des recherches sur le serveur et particulièrement l'envoi continu de données pour envoyer la position de notre joystick virtuel à notre serveur. Suite à ces recherches, nous sommes arrivés à une démonstration de communication serveur-client (http) et pour les besoins de celle-ci, nous avons du mettre à jour notre version de Linux ubuntu et nos paquets nodejs et npm.

Nous avons maintenant deux fichiers qui permettent la communication client-serveur et l'envoi de message simples, des chaînes de caractères. Et d'autres fichiers qui gèrent le joystick, ses valeurs x et y. Nous allons donc devoir comprendre ces différents fichiers pour savoir comment récupérer nos valeurs en x et en y et les envoyer au serveur.

Semaine 5 du 04/02

Programme Arduino

Correction du programme arduino, notamment d'un problème lors de l'émission réception en série des données. Le délai minimum obtenu pour l'instant est d'une seconde, ce qui pourrait s’avérer insuffisant. Le message a été réduit au minimum, il faut déterminer quelle action prend beaucoup de temps, et si ce temps est compressible. La communication série entre l'Arduino et l'ordinateur se fait en 115200B, ce qui devrait être plus que suffisant pour envoyer un message de 10 octets en quelques millièmes de secondes, mais ce n'est apparemment pas le cas. Pour envoyer un message de 10 octets à 115200B, il faudrait en principe 7 micro-secondes. On remarque également des erreurs lors de la transmission série, ce qui entraine la nécessité de transmettre plusieurs fois un message avant qu'il ne soit bien reçu. Même en prenant en compte les erreurs de transmission, et la nécessité de devoir attendre une réponse sur 24 octets, ça ne justifie pas un délai de presque une seconde entre chaque message.

Problèmes sur le dual boot de travail, une machine virtuelle a sur-occupé l'espace, puis sa désinstallation à entrainé des problèmes sur Linux.

Programme en C

Ajout de la lecture/écriture de fichiers sur le programme en C, ainsi que la gestion des interruptions. Il reste à déterminer si les verrous posés lors de l'utilisation des fichiers vont fonctionner pour éviter de lire pendant une écriture. Le protocole d'échanges des données par fichiers, doit encore être implémenté côté serveur, et nous pourrons ensuite tester le bon fonctionnement de l'ensemble.

Le problème principal est que le serveur peut transmettre des instructions vers le robot bien plus vite que celui-ci ne peut les recevoir, et l'idée principale qui a été retenue est d'écrire les informations dans un fichier, sans conserver les informations précédentes. De cette façon, on n'a pas de fichier de stockage prenant des trop grandes dimensions, et on est sûr de toujours lire les informations les plus récentes.

Organisation du robot

Pour compléter le rangement des éléments à l'intérieur du robot, nous avons dessiné les supports destinés aux variateurs. Pour cela nous avons pris exemple sur les supports déjà existants, nous les avons redessinés puis ajustés pour qu'ils entrent dans les fentes prévues à cet effet sur la plaque de l'étage du haut.

Nous avons ensuite fait un test de découpe pour ces supports ainsi que pour le convertisseur 24V-12V dont les plans avaient été dessinés précédemment. Après ce test, sont venues les étapes de rectifications pour que les composants s'emboîtent correctement sur leur support, et de redécoupe. Nous avons donc maintenant des supports! Nous avons donc pu brancher à nouveau les variateurs et le convertisseur au sein du robot mais plus proprement.

Récupération du projet

Malheureusement, au cours de la semaine, mon ordinateur a cessé de fonctionner et nous avons donc perdu un peu de temps pour en recommander un, et faire les installations nécessaires dessus. Une fois le nouvel ordinateur prêt, nous avons récupéré notre projet sur git. Heureusement notre avancement était archivé sur un git, ainsi seulement les parties de tests ont été perdues.

Semaine 6 du 11/02

Organisation du robot

Finir les branchements du robot. Il est nécessaire de terminer l'intérieur du robot avant la fin du projet. En effet, il est tout a fait possible d'obtenir un robot fonctionnel sans cela, mais l'aspect esthétique ne doit pas être négligé. Nous avons passé beaucoup de temps, au cours de ces semaines, à modifier l'intérieur et à découper du plexiglas afin que tous les câblages ne soient pas trop présents. Ce robot devra être présentable, quelle que soit son utilisation future. Il ne nous reste qu'a terminer les branchements de la partie supérieure, et à découper une boite qui pourra maintenir l'Arduino, les relais, et l'ordinateur. Un problème que nous avions rencontré auparavant, était également la non-fiabilité des borniers utilisés pour les contacts. Au cours de cette semaine, nous avons essayé de tout resserrer afin que ce genre de problème ne se reproduise plus. De multiples tests ont également été effectués afin de s'assurer qu'on puisse démarrer le robot de façon fiable sans devoir l'ouvrir. Le bouton d'arrêt d'urgence à également enfin été mis en place de façon définitive. Un faux contact au niveau du PCB a également été résolu.

Communication client-serveur-Aduino

Faire l'échange entre serveur et Arduino, possiblement en passant par un programme en C, ou en établissant une communication directe entre le port série et le Js du serveur. Après réflexion et tests, nous avons décidé d'établir une liaison directe entre le serveur et l'Arduino, sans passer par un langage intermédiaire. En effet, passer par un programme C ralenti le processus en ajoutant un intermédiaire inutile, et malgré des tests concluants de communications entre le programme en C et l'Arduino, faire un programme en Js n'a pas été difficile, et simplifie considérablement nos échanges.

Au niveau du site web, nous avons modifié les fichiers du Joystick pour qu'il envoie des valeurs comprises entre -500 et 500, valeurs ensuite envoyées au serveur en communication http par le client. Puis nous récupérons ces données et nous les envoyons en série à l'Arduino en respectant le format de la trame demandée à savoir : 'X' suivi de '+' ou '-' puis la valeur de x sur 3 chiffres (ex: 000 ou 089) puis 'Y' suivi de '+' ou '-' et sa valeur sur trois chiffres également. Un exemple de message correct serait 'X+450Y+000'. En fin de semaine, nous avons enfin obtenu le résultat désiré, en utilisant le joystick du site web, hébergé par un ordinateur connecté à l'Arduino, pour contrôler les roues du robot. Tout le process de communication est donc techniquement fonctionnel. Pour ce test, le robot était contrôlé par un autre ordinateur, connecté sur le même wifi que l'ordinateur du robot. Il reste cependant à corriger des défauts dans le joystick, qui n'envoie pas toujours les valeurs correspondant à celles voulues (il glitch et se déplace très rapidement vers le centre quand on approche des bords du Joystick).

*** ViDEO ***

Alimentation

La Kinect, l'ordinateur et l'écran seront alimentés grâce au 12V sortant du convertisseur 24/12V. Les capteurs seront alimentés et commandés par l'Arduino. Il s'avère que le convertisseur 24->12V ne sort pas du 12 mais du 13.6V. C'est correct pour alimenter l'écran, mais pas la kinect ou l'ordinateur. Un pont diviseur consommerais trop de courant et on n'aurait plus assez de puissance pour alimenter les appareils. Un autre convertisseur à été trouvé, cette fois-ci allant bien de 24 vers 12V, et qui peut sortir au maximum 360W. C'est plus que suffisant pour notre application, qui nécessite seulement 90W pour l'ordinateur, 13W pour la Kinect, et 42W pour l'écran, pour un total de 145Watts demandés. Cependant, ce convertisseur présente un autre défaut majeur, il aurait tendance à chauffer jusqu'aux 150 degrés, ce qui est inacceptable pour notre robot. Un autre convertisseur à été commandé, et sera testé après la semaine d'interruption pédagogique. Avant de se rendre compte que le précédent convertisseur ne donnait pas les 12V demandés, le test a fait chauffer l'alimentation de la Kinect. Il faudra donc déterminer grâce à la nouvelle alimentation si celle de la Kinect à grillé ou non.

Installation Linux

Au cours de la semaine, nous avons également préparé une clé bootable avec la distribution Debian Stretch de Linux dessus pour l'installer sur l'ordinateur intégré au robot. Nous l'avons donc branché à l'ordinateur et nous avons constaté que linux était déjà installé dessus et qu'un utilisateur centaure existait déjà.

Fin (interruption pédagogique)

Lors de la dernière semaine avant les soutenances, nous avons eu l'occasion de faire plusieurs choses. D'abord, rédiger le rapport, commencé pendant l'interruption pédagogique mais terminé au début de la semaine. Ensuite, nous avons testé le nouveau convertisseur, acheté par Mr Redon, qui lui sort bien du 12V régulé, et nous nous en sommes servis pour alimenter l'ordinateur, la kinect et l'écran. Tout est donc opérationnel de ce côté, l'alimentation est correcte. Le programme Arduino a également été modifié puis testé pour pouvoir lire et envoyer les valeurs des capteurs à l'ordinateur. Si le robot détecte un objet trop proche, il va immédiatement rouler dans l'autre direction jusqu'à ce que l'objet soit de nouveau à une distance raisonnable. Nous avons ensuite redessiné la boite qui devra contenir ordinateur et Arduino, afin de prendre en compte le bouton et les Leds de démarrage de l'ordinateur, pour la découper ensuite. Cette boite marquera le point final dans le rangement du robot.

Nous avons également changé le Joystick présent sur le site web, l'ancien bien que facile à prendre en main présentait des bugs lorsque l'on approchait la souris de ses bords. En effet, lorsqu'on souhaitait aller au maximum d'une direction et qu'on approchait de l'extrémité du Joystick, celui-ci bougeait très rapidement dans plusieurs directions et ne restait pas stable. Grâce au nouveau Joystick de NippleJS, nous n'avons plus ce problème.

Nous avons également refait la communication entre la page index.html et le Joystick pour envoyer les coordonnées.

Vidéos de fonctionnement

Vidéo de test en filaire

Voici une vidéo du test de fonctionnement du robot en filaire sur la table :



Voici une vidéo du test de fonctionnement du robot en filaire à terre :


Vidéo de test commandé en wifi

Voici une vidéo du test de fonctionnement du robot commandé en wifi sur la table :



Voici une vidéo du test de fonctionnement du robot commandé en wifi à terre :


Point sur le projet

Détails sur le câblage du robot

Schéma de cablage du robot Centaure

Tout d’abord nous avons 2 batteries de 12V en parallèle ce qui nous donne une alimentation de 24V. Ces deux batteries sont liées à un coupe-batterie qui coupe l’alimentation du robot entièrement. De l'autre côté, les batteries sont branchées sur un bornier. De l'autre côté de ce bornier, nous avons 3 câbles connectés au 24V des batteries ce qui permet de distribuer la tension. La masse étant connectée au rail, elle est, elle aussi, distribuée. Le câblage se sépare donc en 3 parties à partir d'ici.

En premier, nous distribuons la tension au convertisseur 24V vers 12V. Le 12V du convertisseur est branché sur le bornier de l'étage et ce qui nous permet d'alimenter l'ordinateur, la kinect et l'écran.

Ensuite, en deuxième, le bornier de l'étage inférieur est connecté au bornier supérieur et ainsi au bouton d'arrêt d'urgence. Le bouton d'arrêt d'urgence est lui connecté au bouton de départ cycle et au relai qui se trouve sur le rail en haut du robot. Le relai, lui, est branché au contacteur. Lorsque le relai est alimenté en 24V, cela va être transmit à la commande du contacteur qui va donc laisser passer le 24V qu'il reçoit en entrée à la sortie. Si on actionne le bouton d'arrêt d'urgence, le relai ne sera pas alimenté ce qui va couper l'alimentation du contacteur.

Enfin, en troisième et en dernier, nous avons le contacteur qui en entrée prend également du 24V et le réparti sur 3 câbles. En sortie, nous reprenons la tension et nous connectons 2 câbles au porte fusible pour ajouter une sécurité supplémentaire. Un de ces câbles va être branché sur les freins des moteurs sortant de la gaine, si on ne les alimente pas en 24V, les roues seront bloquées et ne pourrons pas tourner. Et l'autre sur le shield. La dernière sortie du contacteur est branchée sur le bornier du haut qui va alimenter les variateurs de vitesse en 24V.

Le shield


Version finale du PCB

Au mileu du PCB, nous pouvons trouver une double barrette (2x18), celle-ci regroupe des VCC d'un côté et des masses de l'autre pour ajouter des sensors par la suite. En bas à gauche, en J1, nous avons la prise RJ11 pour contrôler le Joystick manuellement.

En P26 et P27, nous avons les DAC. Puis en P19 et P20, nous avons les barrettes devant être reliées aux variateurs de vitesse. Enfin, nous avons P24 et P25 qui vont être connectés au PCB des relais. Pour les capteurs, nous les branchons sur les headers connectés à l'Arduino directement.

La carte des relais


Version finale du PCB

Pour les relais, on a l'alimentation des relais en eux-même, ainsi que le contrôle des relais, sur un header 6 pins, très bien indiqué. A l'avant des relais, on a le 24V en entrée de deux relais, un par régulateur, et une première sortie sur ce relais, qui indique la marche avant aux régulateurs. Il y a ensuite un pont entre premier et deuxième relai, et le deuxième relais sert lui à indiquer la marche arrière Pour la marche avant, on a donc relai 1 fermé, peu importe l'état du relai 2. Pour la marche arrière, il faut relai 1 ouvert, et relai 2 fermé.

Les variateurs de vitesse


Version finale du PCB

En bas à gauche, il y a la barrette à brancher sur le shield de l'Arduino.

En haut à droite, nous pouvons visser le 24V et la masse venant du bornier en haut du robot. Il est d'ailleurs écrit sur la carte Batt - et + pour indiquer où les brancher précisemment.

En haut à gauche, nous pouvons visser le + et le - des moteurs. Il est d'ailleurs écrit sur la carte motors - et +.

Comment le faire fonctionner

Pour mettre en route le robot et le faire rouler, il faut suivre les étapes suivantes dans l'ordre :

  • Tout d'abord, il faut fermer le coupe batterie pour laisser les batteries alimenter les éléments connectés à celles-ci.
  • Ensuite, il faut démarrer l'ordinateur en appuyant sur le bouton de démarrage. Ceci va alimenter l'Arduino (branché en USB sur l'ordinateur). L'Arduino va sortir la tension minimale requise et nécessaire au bon démarrage des variateurs de vitesse. Sans cette tension, les variateurs se mettraient en erreur.
  • Maintenant, il faut appuyer sur le bouton de départ cycle pour laisser la tension de 24V passer dans le reste du robot. Normalement, le robot devrait être apte à rouler à partir de ce point.
  • En cas de problème, il faut appuyer sur le bouton d'arrêt d'urgence, cela va couper l'alimentation du contacteur et donc de l'étage. Il est également possible d'ouvrir le coupe batterie et couper intégralement l'alimentation au sein du robot.

Subtilité du programme Arduino

Pour le programme Arduino, il existe deux modes, le mode serveur et le mode Joystick. Ces modes sont atteints, pour l'instant au moyen d'une variable globale définie à 1 ou 0. a 1, on lit le port série, donc le serveur, à 0 on lit la prise RJ12, donc le joystick physique. Quand on est en mode serveur, les capteurs sont également pris en compte, en mode joystick ce n'est pas le cas.

Fonctionnement du site et du serveur

Dans le dossier du projet, il y a deux fichiers permettant la communication entre le serveur et les clients :

  • Le fichier seveur.js
  • Le fichier client.js présent dans le dossier public

Pour réussir à commander le robot en wifi, il va d'abord falloir vérifier l'adresse ip à entrer dans le navigateur et démarrer le serveur écrit en NodeJS.

Première étape, l'adresse ip. Pour vérifier l'adresse ip, entrez la commande ip a dans le terminal. Ensuite, modifiez le fichier server.js avec la bonne adresse ip. La ligne a modifier est la suivante : server.listen(port, 'adresse ip');

Et il va falloir faire de même avec le fichier public/client.js. La ligne à modifier est la suivante : var socket = new WebSocket('ws://adresse ip:port/');

Vous pouvez maintenant lancer la commande npm start dans le terminal. (Il faut que vous soyez dans le dossier du projet pour cela)

Côté client, entrez simplement l'adresse ip suivi du port comme ceci : adresseip:port. Si vous êtes sur le même réseau wifi que l'ordinateur du robot, la page devrait se charger et vous devriez pouvoir commander le robot à distance.

Autre point important, dans server.js, on se charge également de la communication série avec l'Arduino. Si vous obtenez un message d'erreur à ce propos, vérifiez que le port dans le fichier server.js correspond bien à celui sur lequel est l'Arduino en faisant ls /dev. Logiquement, l'Arduino devrait être connecté au port ACM0 mais il peut arriver qu'il soit sur ACM1.

Améliorations

Pour améliorer le projet, nous avons plusieurs pistes :

  • Créer un fichier pour lancer npm start dès que l'ordi démarre pour ne pas avoir à le faire manuellement.
  • Modifier le programme Arduino et lire la valeur d'un pin pour savoir si on fait Joystick matériel ou Joystick virtuel au lieu de changer le programme arduino à chaque fois.
  • Finir de découper les boîtes et améliorer le câblage de l'étage du haut pour le rendre plus sûr et éviter les défaillances.
  • Ajouter la lecture des capteurs et la webcam sur le site.

Documents Rendus

• Rapport : Fichier:Projet IMA5 Rapport.pdf
• Diapo pour la soutenance : Fichier:Soutenance PFE Centaure 2018.pdf


• Plans SVG pour l'organisation du robot : Fichier:Centaure svg.zip
• Dossier contenant le site, le serveur et les programmes : Fichier:Projet ima5-master.zip
• PCB pour le shield : Fichier:PCB P30.zip


• Archive zip regroupant ce qui a été fait les années précédentes :(lien Onedrive vers l'archive)