La programmation est une partie importante de ce projet : elle a pour but d'automatiser le robot, de le rendre autonome.

Elle peut être décomposée en 3 branches :

La saisie du plan

La première partie du travail consiste à :

Interface de saisie

Cette interface doit permettre à l'utilisateur de saisir les coordonnées :

Pour réaliser cette interface, il faut donc créer une page internet contenant du code HTML (un formulaire avec des champs) et du code CSS pour mettre en page :

Mais aussi du code Javascript qui se charge de :

Téléchargement du plan

Les données saisies par l'utilisateur sont analysées en Javascript puis envoyées à un programme PHP qui se charge de mettre ces données dans un fichier et de forcer le téléchargement de ce fichier chez le visiteur. Voici le programme :

Un exemple de plan

Voici un exemple de plan au format JSON :

Simulation du plan

Cette partie a pour but de simuler, dans une page web, le déplacement du robot. Voici un exemple :

Algorithme 1 : prendre le plus court chemin

L'algorithme consiste à :

  1. Prendre la liste de tous les points
  2. Trouver le point A le plus près du robot et l'ajouter à une nouvelle liste
  3. Trouver le point B le plus près du point A et l'ajouter à la nouvelle liste
  4. Faire la même chose pour tous les autres points

Algorithme 2 : calculer les coordonnées du robot

L'approche mathématiques est la suivante :

L'algorithme consiste à :

  1. Récupérer les N angles formés avec les N balises
  2. Supposer qu'un certain angle correspond à une certaine balise et un autre angle à une autre balise. Vérifier si l'on retrouve par le calcul les bons angles restants pour les bonnes balises.
  3. Faire d'autres suppositions tant que l'on ne tombe pas sur tous les angles cohérents.

Algorithme 3 : s'orienter et se déplacer

L'algorithme consiste à :

  1. Calculer les coordonnées du vecteur pour aller du robot au point le plus prêt du robot
  2. Calculer l'angle formé entre ce vecteur et l'axe des abscisses
  3. Comparer l'orientation actuelle du robot avec celle qu'il doit avoir pour être dans la bonne direction
  4. Faire tourner le robot pour que son orientation corresponde à celle à avoir
  5. Répéter les étapes 1, 2, 3 et 4 tant que l'on est pas arrivé au point voulu (rayon de 5cm)
  6. Répéter les étapes 1, 2, 3, 4 et 5 pour les points suivants

Le code

Voici le code Javascript qui m'a permis de gérer la simulation :

Implémentation sur le robot

Il nous faut maintenant implémenter notre simulation. Pour se faire, il faut placer le fichier plan.json dans une carte SD et la mettre dans le lecteur de carte SD du robot. Le traitement du plan va alors se faire en plusieurs étapes :

  1. Lecture du fichier depuis la carte SD
  2. Analyse du fichier (parsage)
  3. Gestion du robot

Lecture du fichier depuis la carte SD

Pour lire le fichier, voici le code que j'ai utilisé :

Notez que la librairie SD a été importée plus haut dans le code grâce à cette instruction :

#include <SD.h>

Analyse du fichier

Il nous faut maintenant parser le contenu du fichier pour extraire les coordonnées des points et des balises. Pour se faire, j'ai créé mon propre code car les librairies trouvables sur internet utilisaient trop de RAM et faisaient planter le programme.

Voici la fonction en C que j'ai réalisé :

Cette fonction est ensuite appelée 2 fois pour récupérer et stocker les coordonnées des balises dans une variable balises et celles des points dans une variable points.

Repérage du robot dans l'espace

Pour commencer, j'ai initialisé les pattes pour le moteur pas à pas et attaché une interruption sur la patte 3 pour stopper le programme quand le laser détectera une balise. Voici le code :

J'ai ensuite, dans la boucle loop, créé un code pour faire tourner le moteur à intervalle régulier et mettre à jour les variable steps et degrees :

Puis, j'ai implémenté la fonction updateAngles attachée à l'interruption qui se charge de mettre à jour les angles de chacune des balises et qui appelle la fonction updatePos une fois les angles de chacune des balises définies :

Enfin, j'ai implémenté la fonction updatePos qui se charge de mettre à jour la position du robot et son orientation :

Gestion du système de déplacement

Pour gérer le déplacement du robot, j'ai utilisé, à quelques variantes près, le même code que pour la simulation en l'implémentant, cette fois-ci, en C pour Arduino.

Affichage de messages grâce à un écran LCD

Pour simplifier l'affichage de messages, nous avons décidé d'utiliser un écran LCD. Pour le gérer, j'ai alors créé plusieurs fonctions :

Notez que, à cause de l'utilisant du composant Serial Enabled LCD pour gérer l'écran, j'ai du importer au préalable la librairie SoftwareSerial grâce à l'instruction suivante :

#include <SoftwareSerial.h>

Maintenant, grâce à ces 3 fonctions, je peux facilement afficher du texte sur le LCD.

Expérimentation

Divers tests ont été réalisés et problèmes rencontrés :