﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://bacasable.arpitania.eu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Emilie+cnvt</id>
	<title>Learning Lab Environnements Connectés - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://bacasable.arpitania.eu//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Emilie+cnvt"/>
	<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Sp%C3%A9cial:Contributions/Emilie_cnvt"/>
	<updated>2026-04-06T23:55:29Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12222</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12222"/>
		<updated>2023-05-22T17:07:00Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code estimé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesqueless on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici notre première version de l'algorithme du contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. En effet,  on teste tout les 10cm s'il n'y a pas d'obstacle ainsi nous n'avons plus besoin d'interruptions. La prise de mesure des capteurs ultrasons est relevée à intervalles réguliers dans la loop.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; &lt;br /&gt;
int direction; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
suivant(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  cas avant:&lt;br /&gt;
    moteur_avant(10);  //on avance le moteur correspondant&lt;br /&gt;
    &lt;br /&gt;
  cas gauche: &lt;br /&gt;
    moteur_gauche(10);&lt;br /&gt;
   &lt;br /&gt;
  cas droite:&lt;br /&gt;
    moteur_droite(10);&lt;br /&gt;
&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    si direction = gauche  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=droite;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=gauche;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
   s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=droite;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=arriere;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=avant; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une vis sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La vis sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une vis et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la vis au moteur, nous avons essayé de souder la vis au moteur : [[Fichier:Capture d’écran 2023-05-11 171145.png]]&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la vis. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la vis on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras : [[Fichier:Capture d’écran 2023-05-11 171434.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On fera par la suite une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
[[Fichier:Capture d’écran 2023-05-11 170600.png]]&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :[[Fichier:teensy_r_esp.zip]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt; Remarque: L'asservissement des moteurs n'est pas fonctionnel, le robot se déplace bien dans les directions qui ne nécessitent que la rotation de deux roues (ah000, ah120, ah240) mais pour le reste le robot dévie de la trajectoire désirée.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
==Asservissement des déplacements==&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir contrôler la distance parcourue par chaque, nous avons essayé de mettre en place un asservissement à l'aide d'une centrale inertielle. Pour cela, on utilise une centrale inertielle 10DOF équipée d'un MPU9250.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des mesures fiables, nous avons réaliser un étalonnage de l'accéléromètre sur ses trois axes. Ensuite, en utilisant une formule de dérivation numérique, on peut calculer la distance parcourue par chaque robot. Pour être sûr que cette méthode soit fiable, il faut avoir la fréquence de rafraichissement du capteur et la fréquence d'interruption, afin d'accorder la fréquence de calcul à notre problème.&lt;br /&gt;
&lt;br /&gt;
On a déterminé les valeurs d'étalonnage suivantes:&lt;br /&gt;
Sensibilité: Sx=1.000085&lt;br /&gt;
             Sy=0.99634&lt;br /&gt;
             Sz=1.01619&lt;br /&gt;
Offset: Offx=0.034625&lt;br /&gt;
        Offy=0.01245&lt;br /&gt;
        Offz=0.04328&lt;br /&gt;
&lt;br /&gt;
Cette méthode n'a cependant pas pu être mis en place et tester sur les robots. &lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et choisit le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec toutes les responders à portée. &amp;lt;strong&amp;gt;Cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2&amp;amp;3 devront ensuite découper le message en instructions (couple de caractères), ces instructions sont ensuite traduites pour être comprises par la Teensy. Exemple: av --&amp;gt; ah000 et ho3,  dr --&amp;gt; ah270 et ho3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc les codes nécessaires pour cette communication:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment les robots 2&amp;amp;3 ne sont pas bien asservis et ne peuvent donc pas reproduire le trajet demandé par le robot 1, ici un délai de 500ms a été mis pour chaque instruction (ex: av --&amp;gt; le robot avance tout droit pendant 500ms) tandis que pour le robot 1 chaque commande correspond à une durée de 0.5s. Cependant les robots ne vont pas à la même vitesse, il faudrait donc prendre en compte celles ci pour déterminer la durée de chaque instruction pour les robots 2&amp;amp;3.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12221</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12221"/>
		<updated>2023-05-22T16:57:51Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Communication entre les robots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesqueless on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici une version de base du code de contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. La prise de mesure des capteurs ultrasons est relevée dans la loop. On teste avant d'avancer s'il n'y a pas d'obstacle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une vis sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La vis sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une vis et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la vis au moteur, nous avons essayé de souder la vis au moteur : [[Fichier:Capture d’écran 2023-05-11 171145.png]]&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la vis. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la vis on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras : [[Fichier:Capture d’écran 2023-05-11 171434.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On fera par la suite une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
[[Fichier:Capture d’écran 2023-05-11 170600.png]]&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :[[Fichier:teensy_r_esp.zip]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt; Remarque: L'asservissement des moteurs n'est pas fonctionnel, le robot se déplace bien dans les directions qui ne nécessitent que la rotation de deux roues (ah000, ah120, ah240) mais pour le reste le robot dévie de la trajectoire désirée.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
==Asservissement des déplacements==&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir contrôler la distance parcourue par chaque, nous avons essayé de mettre en place un asservissement à l'aide d'une centrale inertielle. Pour cela, on utilise une centrale inertielle 10DOF équipée d'un MPU9250.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des mesures fiables, nous avons réaliser un étalonnage de l'accéléromètre sur ses trois axes. Ensuite, en utilisant une formule de dérivation numérique, on peut calculer la distance parcourue par chaque robot. Pour être sûr que cette méthode soit fiable, il faut avoir la fréquence de rafraichissement du capteur et la fréquence d'interruption, afin d'accorder la fréquence de calcul à notre problème.&lt;br /&gt;
&lt;br /&gt;
On a déterminé les valeurs d'étalonnage suivantes:&lt;br /&gt;
Sensibilité: Sx=1.000085&lt;br /&gt;
             Sy=0.99634&lt;br /&gt;
             Sz=1.01619&lt;br /&gt;
Offset: Offx=0.034625&lt;br /&gt;
        Offy=0.01245&lt;br /&gt;
        Offz=0.04328&lt;br /&gt;
&lt;br /&gt;
Cette méthode n'a cependant pas pu être mis en place et tester sur les robots. &lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et choisit le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec toutes les responders à portée. &amp;lt;strong&amp;gt;Cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2&amp;amp;3 devront ensuite découper le message en instructions (couple de caractères), ces instructions sont ensuite traduites pour être comprises par la Teensy. Exemple: av --&amp;gt; ah000 et ho3,  dr --&amp;gt; ah270 et ho3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc les codes nécessaires pour cette communication:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment les robots 2&amp;amp;3 ne sont pas bien asservis et ne peuvent donc pas reproduire le trajet demandé par le robot 1, ici un délai de 500ms a été mis pour chaque instruction (ex: av --&amp;gt; le robot avance tout droit pendant 500ms) tandis que pour le robot 1 chaque commande correspond à une durée de 0.5s. Cependant les robots ne vont pas à la même vitesse, il faudrait donc prendre en compte celles ci pour déterminer la durée de chaque instruction pour les robots 2&amp;amp;3.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12220</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12220"/>
		<updated>2023-05-22T16:57:04Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Contraintes liés au capteur d'humidité du sol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesqueless on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici une version de base du code de contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. La prise de mesure des capteurs ultrasons est relevée dans la loop. On teste avant d'avancer s'il n'y a pas d'obstacle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une vis sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La vis sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une vis et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la vis au moteur, nous avons essayé de souder la vis au moteur : [[Fichier:Capture d’écran 2023-05-11 171145.png]]&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la vis. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la vis on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras : [[Fichier:Capture d’écran 2023-05-11 171434.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On fera par la suite une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
[[Fichier:Capture d’écran 2023-05-11 170600.png]]&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :[[Fichier:teensy_r_esp.zip]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt; Remarque: L'asservissement des moteurs n'est pas fonctionnel, le robot se déplace bien dans les directions qui ne nécessitent que la rotation de deux roues (ah000, ah120, ah240) mais pour le reste le robot dévie de la trajectoire désirée.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
==Asservissement des déplacements==&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir contrôler la distance parcourue par chaque, nous avons essayé de mettre en place un asservissement à l'aide d'une centrale inertielle. Pour cela, on utilise une centrale inertielle 10DOF équipée d'un MPU9250.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des mesures fiables, nous avons réaliser un étalonnage de l'accéléromètre sur ses trois axes. Ensuite, en utilisant une formule de dérivation numérique, on peut calculer la distance parcourue par chaque robot. Pour être sûr que cette méthode soit fiable, il faut avoir la fréquence de rafraichissement du capteur et la fréquence d'interruption, afin d'accorder la fréquence de calcul à notre problème.&lt;br /&gt;
&lt;br /&gt;
On a déterminé les valeurs d'étalonnage suivantes:&lt;br /&gt;
Sensibilité: Sx=1.000085&lt;br /&gt;
             Sy=0.99634&lt;br /&gt;
             Sz=1.01619&lt;br /&gt;
Offset: Offx=0.034625&lt;br /&gt;
        Offy=0.01245&lt;br /&gt;
        Offz=0.04328&lt;br /&gt;
&lt;br /&gt;
Cette méthode n'a cependant pas pu être mis en place et tester sur les robots. &lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec toutes les responders à portée. &amp;lt;strong&amp;gt;Cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2&amp;amp;3 devront ensuite découper le message en instructions (couple de caractères), ces instructions sont ensuite traduites pour être comprises par la Teensy. Exemple: av --&amp;gt; ah000 et ho3,  dr --&amp;gt; ah270 et ho3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc les codes nécessaires pour cette communication:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment les robots 2&amp;amp;3 ne sont pas bien asservis et ne peuvent donc pas reproduire le trajet demandé par le robot 1, ici un délai de 500ms a été mis pour chaque instruction (ex: av --&amp;gt; le robot avance tout droit pendant 500ms) tandis que pour le robot 1 chaque commande correspond à une durée de 0.5s. Cependant les robots ne vont pas à la même vitesse, il faudrait donc prendre en compte celles ci pour déterminer la durée de chaque instruction pour les robots 2&amp;amp;3.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12219</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12219"/>
		<updated>2023-05-22T16:56:05Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Missions des robots jardiniers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesqueless on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici une version de base du code de contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. La prise de mesure des capteurs ultrasons est relevée dans la loop. On teste avant d'avancer s'il n'y a pas d'obstacle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une visse sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La visse sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une visse et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la visse au moteur, nous avons essayé de souder la visse au moteur : [[Fichier:Capture d’écran 2023-05-11 171145.png]]&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la visse. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la visse on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras : [[Fichier:Capture d’écran 2023-05-11 171434.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On fera par la suite une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
[[Fichier:Capture d’écran 2023-05-11 170600.png]]&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :[[Fichier:teensy_r_esp.zip]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt; Remarque: L'asservissement des moteurs n'est pas fonctionnel, le robot se déplace bien dans les directions qui ne nécessitent que la rotation de deux roues (ah000, ah120, ah240) mais pour le reste le robot dévie de la trajectoire désirée.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
==Asservissement des déplacements==&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir contrôler la distance parcourue par chaque, nous avons essayé de mettre en place un asservissement à l'aide d'une centrale inertielle. Pour cela, on utilise une centrale inertielle 10DOF équipée d'un MPU9250.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des mesures fiables, nous avons réaliser un étalonnage de l'accéléromètre sur ses trois axes. Ensuite, en utilisant une formule de dérivation numérique, on peut calculer la distance parcourue par chaque robot. Pour être sûr que cette méthode soit fiable, il faut avoir la fréquence de rafraichissement du capteur et la fréquence d'interruption, afin d'accorder la fréquence de calcul à notre problème.&lt;br /&gt;
&lt;br /&gt;
On a déterminé les valeurs d'étalonnage suivantes:&lt;br /&gt;
Sensibilité: Sx=1.000085&lt;br /&gt;
             Sy=0.99634&lt;br /&gt;
             Sz=1.01619&lt;br /&gt;
Offset: Offx=0.034625&lt;br /&gt;
        Offy=0.01245&lt;br /&gt;
        Offz=0.04328&lt;br /&gt;
&lt;br /&gt;
Cette méthode n'a cependant pas pu être mis en place et tester sur les robots. &lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec toutes les responders à portée. &amp;lt;strong&amp;gt;Cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2&amp;amp;3 devront ensuite découper le message en instructions (couple de caractères), ces instructions sont ensuite traduites pour être comprises par la Teensy. Exemple: av --&amp;gt; ah000 et ho3,  dr --&amp;gt; ah270 et ho3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc les codes nécessaires pour cette communication:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment les robots 2&amp;amp;3 ne sont pas bien asservis et ne peuvent donc pas reproduire le trajet demandé par le robot 1, ici un délai de 500ms a été mis pour chaque instruction (ex: av --&amp;gt; le robot avance tout droit pendant 500ms) tandis que pour le robot 1 chaque commande correspond à une durée de 0.5s. Cependant les robots ne vont pas à la même vitesse, il faudrait donc prendre en compte celles ci pour déterminer la durée de chaque instruction pour les robots 2&amp;amp;3.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12216</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12216"/>
		<updated>2023-05-12T08:20:05Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Robot 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesquels on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici une version de base du code de contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. La prise de mesure des capteurs ultrasons est relevée dans la loop. On teste avant d'avancer s'il n'y a pas d'obstacle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une visse sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La visse sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une visse et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la visse au moteur, nous avons essayé de souder la visse au moteur : [[Fichier:Capture d’écran 2023-05-11 171145.png]]&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la visse. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la visse on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras : [[Fichier:Capture d’écran 2023-05-11 171434.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On fera par la suite une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
[[Fichier:Capture d’écran 2023-05-11 170600.png]]&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :[[Fichier:teensy_r_esp.zip]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt; Remarque: L'asservissement des moteurs n'est pas fonctionnel, le robot se déplace bien dans les directions qui ne nécessitent que la rotation de deux roues (ah000, ah120, ah240) mais pour le reste le robot dévie de la trajectoire désirée.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
==Asservissement des déplacements==&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir contrôler la distance parcourue par chaque, nous avons essayé de mettre en place un asservissement à l'aide d'une centrale inertielle. Pour cela, on utilise une centrale inertielle 10DOF équipée d'un MPU9250.&lt;br /&gt;
&lt;br /&gt;
Pour avoir des mesures fiables, nous avons réaliser un étalonnage de l'accéléromètre sur ses trois axes. Ensuite, en utilisant une formule de dérivation numérique, on peut calculer la distance parcourue par chaque robot. Pour être sûr que cette méthode soit fiable, il faut avoir la fréquence de rafraichissement du capteur et la fréquence d'interruption, afin d'accorder la fréquence de calcul à notre problème.&lt;br /&gt;
&lt;br /&gt;
Cette méthode n'a cependant pas pu être mis en place et tester sur les robots. &lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec toutes les responders à portée. &amp;lt;strong&amp;gt;Cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2&amp;amp;3 devront ensuite découper le message en instructions (couple de caractères), ces instructions sont ensuite traduites pour être comprises par la Teensy. Exemple: av --&amp;gt; ah000 et ho3,  dr --&amp;gt; ah270 et ho3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc les codes nécessaires pour cette communication:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme dit précédemment les robots 2&amp;amp;3 ne sont pas bien asservis et ne peuvent donc pas reproduire le trajet demandé par le robot 1, ici un délai de 500ms a été mis pour chaque instruction (ex: av --&amp;gt; le robot avance tout droit pendant 500ms) tandis que pour le robot 1 chaque commande correspond à une durée de 0.5s. Cependant les robots ne vont pas à la même vitesse, il faudrait donc prendre en compte celles ci pour déterminer la durée de chaque instruction pour les robots 2&amp;amp;3.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12188</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12188"/>
		<updated>2023-05-11T12:22:03Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code estimé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;&amp;lt;B&amp;gt; Comment concevoir un robot jardinier capable d’explorer son environnement, d’identifier les emplacements optimaux pour semer des graines et s’occuper des plants ? &amp;lt;/em&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On dispose de 3 bases roulantes holonomes sur lesquels on peut monter une batterie de capteur qu'on appellera par la suite robot 1, 2 et 3. L'environnement de fonctionnement du robot est un terrain plat contenant des obstacles à éviter (type rochers), et des points d'intérêts où il est possible de planter des graines. Les positions de ces éléments ne sont pas connues initialement. Il est donc possible de séparer le fonctionnement du robots en 2 phases successives. Un première phase de découverte de l'environnement puis un phase d'action.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut alors définir un plan d'action des robots jardiniers à travers les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut finalement reformuler ces actions sous forme d'un cahier des charges plus concis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Robot 1 :&lt;br /&gt;
* Explorer un environnement &lt;br /&gt;
* Mesurer des paramètres expérimentaux&lt;br /&gt;
* Déterminer un environnement propice à l'ensemencement&lt;br /&gt;
* Enregistrer et communiquer un chemin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Robot 2 et 3 :&lt;br /&gt;
* Suivre un chemin&lt;br /&gt;
* Arroser / forer le sol&lt;br /&gt;
&lt;br /&gt;
Les solutions techniques mises en place pour répondre à ces attentes seront détaillées par la suite. Il convient de noter que toutes ces fonctions n'ont cependant pas pu être réalisées.&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Également, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1 : Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots) : 6 étudiants&lt;br /&gt;
* Groupe 2 : Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
* Groupe 3 : Robot 3 (robot planteur qui suivra le chemin créé par le robot 1) : 3 étudiants&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes ont souvent travaillé ensemble.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Étant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continu à droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode, mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé :&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra, au choix, refaire le même chemin en sens inverse (on retiendra chacun des mouvements), ou s'arrêter lorsque la coordonnée y du robot sera assez proche de celle de départ.&lt;br /&gt;
Ce schéma est assez simpliste, mais présente globalement la façon dont notre algorithme fonctionne. Il est également applicable sur certaines formes plus complexes (voir schéma ci-dessous)&lt;br /&gt;
[[Fichier:robot_algo_3.png|600px]] &amp;lt;br&amp;gt;&lt;br /&gt;
Pour faciliter la compréhension de l'algorithme, voici un schéma explicatif de ce dernier&lt;br /&gt;
[[Fichier:Schéma_stylé.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cet algorithme est assez simpliste mais sera capable de parcourir la plupart des terrains proposés de manière efficace. Il faudra malgré tout veiller à positionner le point de départ du robot sur le point le plus éloigné du mur en face possible. &lt;br /&gt;
Un problème de notre algorithme est que le robot peut rester coincé dans certaines configurations, cela aurait été évitable mais par manque de temps, nous ne pourrons pas palier à ce problème.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code estimé==&lt;br /&gt;
Voici une version de base du code de contrôle du robot, ce code a changé car nous n'effectuons plus d'interruptions. La prise de mesure des capteurs ultrasons est relevée dans la loop. On teste avant d'avancer s'il n'y a pas d'obstacle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors, elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin, on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes donc nous n'avons pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs :&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors :&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple : la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Contraintes liés au capteur d'humidité du sol =&lt;br /&gt;
Le capteur d'humidité du sol comme son nom l’indique, prend une mesure de l’humidité d’un sol. Nous avons donc dû trouver une méthode pour planter la fourche sensoriel du capteur dans le sol à mesurer. Pour ce faire, nous avons imaginé trois méthodes : &lt;br /&gt;
&lt;br /&gt;
* Utilisation d’un vérin&lt;br /&gt;
* Utilisation d’une visse sans fin&lt;br /&gt;
* utilisation d’un bras&lt;br /&gt;
&lt;br /&gt;
Le vérin semblait être une bonne idée, cependant son coût ainsi que sa consommation d'énergie ne correspondait pas à nos attentes (30€ pour les moins chère et au minimum 12V d’alimentation).&lt;br /&gt;
&lt;br /&gt;
La visse sans fin nous à paru être la meilleure option, elle nécessite uniquement un moteur, une visse et un écrou. Nous avions deux moteurs à disposition, l’un était rapide mais avec peu de couple et l’autre était lent avec plus de couple. Dans l’objectif d’enfoncer notre capteur dans le sol nous avons donc choisi d’utiliser le moteur lent avec du couple. En effet, il faut beaucoup de force pour enfoncer le capteur, de plus, le temps n’est pas une contrainte dans ce cas. Pour relier la visse au moteur, nous avons essayé de souder la visse au moteur :&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il nous à été trop difficile d'axer parfaitement la visse. De plus la vitesse du moteur (1/4 tour par seconde) ainsi que la forme de la visse on rendu cette méthode obsolète ( 1 minute  pour descendre le capteur et 1 minute pour le remonter).&lt;br /&gt;
&lt;br /&gt;
Nous avons finalement choisi la dernière méthode, qui consistait à fixer un bras sur le moteur avec notre capteur au bout. Cette méthode est assez facile à mettre en place cependant elle est également moins efficace pour planter un capteur, car elle développe moins de force. Pour la conception du bras, nous avons utilisé les outils et matériaux disponibles dans l’atelier. Au final voici à quoi ressemble le bras :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Concernant le moteur utilisé :&lt;br /&gt;
Nous avons utilisé un moteur 28BYJ ce moteur pas à pas est composé de 5 entrées, 4 bobinages et une alimentation. Pour le faire tourner, on va donc alimenter chaque bobinage l’un après l’autre, de façon à faire un cycle. On va donc faire une boucle de descente et une boucle de monté du capteur en laissant un délai en bas pour prendre les mesures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;ESP32 Thing&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; ESP32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5 VDC. Il s'alimente à l'aide d'une batterie de 9.6 V composée de 8 cellules &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, la tension maximale est d'environ 10.7 V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2 V, ils consomment chacun à 0.5 A en fonctionnement à vide et jusqu'à 1.3 A en fonctionnement nominal (à un couple de 2 &amp;lt;em&amp;gt;kg.cm&amp;lt;/em&amp;gt;) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9 V -&amp;gt; 3.3 V). Celle-ci alimente la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et la carte &amp;lt;em&amp;gt;Sparkfun ESP32 Thing&amp;lt;/em&amp;gt;.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles &amp;lt;em&amp;gt;Ni.Mh&amp;lt;/em&amp;gt;, qui délivre 9.6 V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
: Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : &amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt; et &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte &amp;lt;em&amp;gt;Arduino&amp;lt;/em&amp;gt;, car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; parce que la &amp;lt;em&amp;gt;Arduino Uno&amp;lt;/em&amp;gt; ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; comme carte motrice, car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Les deux cartes sont connectées par une liaison série pour communiquer.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Contrôle des déplacements du robot===&lt;br /&gt;
Afin de contrôler les déplacements du robot, nous allons utiliser le code pour une plateforme holonome moteur.&lt;br /&gt;
La procédure à suivre pour vérifier et tester le fonctionnement des moteurs et de l'asservissement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Téléverser ce code dans la carte &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes :&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115 200. On utilise alors le port sérié par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin(115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient un problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandées et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; n'étaient donc pas les bons ports dans le code de &amp;lt;em&amp;gt;l'Arduino&amp;lt;/em&amp;gt;. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'&amp;lt;em&amp;gt;Arduino Due&amp;lt;/em&amp;gt;, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; utiliser (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; et de la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
La première étape est de contrôler les moteurs avec la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, pour cela, il faut utiliser le code suivant :&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes :&lt;br /&gt;
#La commande ahXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande ahXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes AT et permettant respectivement d'allumer et d'éteindre la led de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; et la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;, l'objectif est de contrôler le robot depuis l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; car c'est cette carte qui recevra les informations du robot 1, pour cela, vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt;. Dans notre cas, nous avons utilisé les ports 16 et 17 de l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui correspondent à &amp;lt;em&amp;gt;UART2&amp;lt;/em&amp;gt;, pour envoyer les commandes, nous avons donc utilisé &amp;lt;em&amp;gt;Serial2&amp;lt;/em&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
La suite d'instruction permettant de guider les robots jusqu'au point d'intérêt est envoyée dans une seule chaîne de caractère, les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 auront ensuite pour rôle de lire cette chaine par couple de caractère, chacun indiquant une instruction, celle-ci est ensuite traduite en une commande que la &amp;lt;em&amp;gt;Teensy&amp;lt;/em&amp;gt; pourra comprendre. Les instructions envoyées par le robot 1 via la chaîne de caractère seront les suivantes : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
* ac : Action : Planter/Arroser (selon le robot)&lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code utiliser pour le Bluetooth : [Cliquer ici pour télécharger le fichier ] [[Fichier:Bluetooth.zip]]&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 &amp;lt;em&amp;gt;GHz&amp;lt;/em&amp;gt;. Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; recevront le message envoyé. L'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Il existe deux méthodes de communication avec la bibliothèque &amp;lt;em&amp;gt;ESP-NOW&amp;lt;/em&amp;gt;:&lt;br /&gt;
#La première est qu'une première carte (initiator) envoie des données à une autre carte (responder) précise via son adresse MAC.&lt;br /&gt;
#Le broadcast, cette méthode permet à l'initiator de communiquer avec tous es responder à portée, &amp;lt;strong&amp;gt;cela ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder. &lt;br /&gt;
Dans notre cas, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;Serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt;Serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici la carte envoie un message à l'&amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui doit la transmettre à l'autre &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;, c'était un test. Par la suite, ce message sera modifié en fonction du chemin parcouru par le robot 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast : [Cliquer ici pour télécharger le fichier] [[Fichier:Boradcast.ZIP]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
POur la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; qui reçoit le message : [Cliquer ici pour télécharger le fichier] [[Fichier:Responder.ZIP]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A noté que ici, on découpe le message reçu en chaines de caractères de longueur 2 qui correspondent directement aux ordres à donner au robot pour qu'il avance/recule/tourne.&lt;br /&gt;
&lt;br /&gt;
=Implémentation des algorithme finaux=&lt;br /&gt;
==Implémentation de l'algorithme de déplacement du robot 1==&lt;br /&gt;
Le programme principal sera disponible ici :[[Fichier:Prog_principal.zip]]&lt;br /&gt;
Afin de simplifier la compréhension et la lisibilité du code, nous utiliserons 2 énumérations permettant de lier un entier à un texte utilisable dans le code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
enum directions { AUCUNE,&lt;br /&gt;
                  AVANT,&lt;br /&gt;
                  ARRIERE,&lt;br /&gt;
                  DROITE,&lt;br /&gt;
                  GAUCHE };&lt;br /&gt;
enum action { RIEN,&lt;br /&gt;
              PLANTE,&lt;br /&gt;
              ARROSE,&lt;br /&gt;
              LESDEUX };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre programme est constitué de 3 fonctions principales:&lt;br /&gt;
*La '''boucle principale()''' permettant de faire rouler le robot et d'appeler les autres fonctions.&lt;br /&gt;
*La fonction '''capture()''' permettant de détecter si la zone doit être plantée, arrosée, ou aucun des deux&lt;br /&gt;
*La fonction '''Determine_direction()''' permettant de déterminer la prochaine direction&lt;br /&gt;
'''Fonction Capture()'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int capture() {&lt;br /&gt;
  int act;&lt;br /&gt;
  float temperature, humidite;&lt;br /&gt;
  int moisture, uvi;&lt;br /&gt;
  temperature = temp(); // fonction retournant la température&lt;br /&gt;
  humidite = hum(); // fonction retournant l'humidité&lt;br /&gt;
  moisture = mois(); fonction retournant l'humidité du sol&lt;br /&gt;
  uvi = uv(); fonction retournant l'indice UV&lt;br /&gt;
  act = RIEN;&lt;br /&gt;
  // UV INDEX LIMIT : 40&lt;br /&gt;
  // TEMPERATURE INDEX LIMIT: 25&lt;br /&gt;
  if (humidite &amp;gt; 50 &amp;amp;&amp;amp; moisture &amp;lt; 400) {&lt;br /&gt;
    act = LESDEUX;&lt;br /&gt;
  } else {&lt;br /&gt;
    if (humidite &amp;gt; 50) { act = PLANTE; }&lt;br /&gt;
    if (moisture &amp;lt; 400) { act = ARROSE; }&lt;br /&gt;
  }&lt;br /&gt;
  return act;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Fonction determine_direction()''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est appelée toutes les 0.5 secondes et permet d'actualiser la direction du robot en fonction de son environnement. &lt;br /&gt;
à chaque incrément, on envoie la direction aux roues avec la fonction Serial2.print() en indiquant dans les parenthèses la direction souhaitée.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void determine_direction() {&lt;br /&gt;
  distance_av = ultrasonic_av.read();&lt;br /&gt;
  distance_ar = ultrasonic_ar.read();&lt;br /&gt;
  distance_d = ultrasonic_d.read();&lt;br /&gt;
  distance_g = ultrasonic_g.read();&lt;br /&gt;
  switch (direction) {&lt;br /&gt;
    case AVANT:&lt;br /&gt;
      if (distance_av &amp;gt; 50) {&lt;br /&gt;
        Serial.println(&amp;quot;Avance &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;avd&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = AVANT;&lt;br /&gt;
        y = y + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        depart = true;&lt;br /&gt;
        direction = GAUCHE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case DROITE:&lt;br /&gt;
      if (distance_d &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Droite &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = DROITE;&lt;br /&gt;
        direction_prec = DROITE;&lt;br /&gt;
        x = x + 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    case GAUCHE:&lt;br /&gt;
      if (distance_g &amp;gt; 30) {&lt;br /&gt;
        Serial.println(&amp;quot;Gauche &amp;quot;);&lt;br /&gt;
        Serial2.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
        position_tab[tab_index].direction = GAUCHE;&lt;br /&gt;
        direction_prec = GAUCHE;&lt;br /&gt;
        x = x - 1;&lt;br /&gt;
      } else {&lt;br /&gt;
        direction = ARRIERE;&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case ARRIERE:&lt;br /&gt;
      if (distance_ar &amp;gt; 30) {&lt;br /&gt;
        if (pas_arriere &amp;lt; 5) { // On recule sur des incréments de 5&lt;br /&gt;
          pas_arriere++;&lt;br /&gt;
          Serial.println(&amp;quot;Arriere &amp;quot;);&lt;br /&gt;
          Serial2.print(&amp;quot;ard&amp;quot;);&lt;br /&gt;
          y = y - 1;&lt;br /&gt;
          position_tab[tab_index].direction = ARRIERE;&lt;br /&gt;
        } else {&lt;br /&gt;
          position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
&lt;br /&gt;
          pas_arriere = 0;&lt;br /&gt;
          if (direction_prec == DROITE) { // Balayer de gauche à droite&lt;br /&gt;
            direction = GAUCHE;&lt;br /&gt;
          } else {&lt;br /&gt;
            direction = DROITE;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].direction = AUCUNE;&lt;br /&gt;
        if (direction_prec == DROITE) {&lt;br /&gt;
          direction = GAUCHE;&lt;br /&gt;
        } else {&lt;br /&gt;
          direction = DROITE;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      break;&lt;br /&gt;
    default: break;&lt;br /&gt;
  }&lt;br /&gt;
  if (position_tab[tab_index].direction != AUCUNE) { j++; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Boucle principale''' &amp;lt;br&amp;gt;&lt;br /&gt;
Cette fonction est décomposée en 2 parties. Tout d'abord, on détecte si le programme est terminé. Si tel est le cas, on envoie les données aux autres robots en parcourant le tableau position_tab rempli dans les autres fonctions (données de direction et d'action). Sinon, on continue la boucle en déterminant la direction et en capturant tous les 5 incréments de temps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!fin) {&lt;br /&gt;
    if (depart &amp;amp;&amp;amp; y &amp;lt;= 1) { // Lorsqu'on revient au point de départ, on s'arrête et on envoie les informations&lt;br /&gt;
      Serial2.println(&amp;quot;st&amp;quot;);&lt;br /&gt;
      // Amelioration possible, le faire revenir à x = 0&lt;br /&gt;
      // ENVOI DES DONNEES&lt;br /&gt;
      for (int i = 0; i &amp;lt; tab_index; i++) {&lt;br /&gt;
        switch (position_tab[i].direction) {&lt;br /&gt;
          case AVANT:&lt;br /&gt;
            Serial3.print(&amp;quot;av&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case DROITE:&lt;br /&gt;
            Serial3.print(&amp;quot;dr&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case GAUCHE:&lt;br /&gt;
            Serial3.print(&amp;quot;ga&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARRIERE:&lt;br /&gt;
            Serial3.print(&amp;quot;ar&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        switch (position_tab[i].action) {&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial3.print(&amp;quot;pl&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial3.print(&amp;quot;wa&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial3.print(&amp;quot;l2&amp;quot;);&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      fin = true;&lt;br /&gt;
    } else {&lt;br /&gt;
      determine_direction();&lt;br /&gt;
      if (j == 5) { // On effectue une capture tous les 5 incréments&lt;br /&gt;
        condition = capture();&lt;br /&gt;
        switch (condition) {&lt;br /&gt;
          case ARROSE:&lt;br /&gt;
            Serial.println(&amp;quot;On arrose&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = ARROSE;&lt;br /&gt;
            break;&lt;br /&gt;
          case PLANTE:&lt;br /&gt;
            Serial.println(&amp;quot;On plante&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = PLANTE;&lt;br /&gt;
            break;&lt;br /&gt;
          case LESDEUX:&lt;br /&gt;
            Serial.println(&amp;quot;Les deux&amp;quot;);&lt;br /&gt;
            position_tab[tab_index].action = LESDEUX;&lt;br /&gt;
            break;&lt;br /&gt;
          default:&lt;br /&gt;
            position_tab[tab_index].action = RIEN;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        j = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        position_tab[tab_index].action = RIEN;&lt;br /&gt;
      }&lt;br /&gt;
      tab_index++;&lt;br /&gt;
    }&lt;br /&gt;
    delay(500); // On rafraichit la direction toutes les 0.5 secondes&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Tests de l'algorithme du robot 1==&lt;br /&gt;
Plusieurs tests ont été effectués tout au long du projet pour tester nos algorithmes les premiers utilisaient seulement les capteurs à ultrasons mais au fur et à mesure, nous avons réussi a lier l'ensemble des composants, voici quelques vidéos montrant les tests effectués.&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=hlS6NtwyzBk&lt;br /&gt;
|alignment=left&lt;br /&gt;
|description=test du robot 1 immobile&lt;br /&gt;
}}&lt;br /&gt;
{{#evt:&lt;br /&gt;
service=youtube&lt;br /&gt;
|id=https://www.youtube.com/watch?v=ECn0T1XQ3xc&lt;br /&gt;
|alignment=right&lt;br /&gt;
|description=test du robot 1 en conditions &amp;quot;réelles&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Comme on voit sur la 2ème vidéo, puisque l'une des roues ne fonctionne pas dans un sens, il est impossible pour le robot d'aller à droite, et donc impossible de tester notre robot de façon réelle.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12088</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12088"/>
		<updated>2023-05-05T14:25:34Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Algorithme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes ainsi nous n'aurions pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors:&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple: la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy comme carte motrice car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les deux cartes sont connectées par une liaison série pour communiquer.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de Controller les déplacements du robot, on va utiliser le code pour une plateforme holonome moteurs.&lt;br /&gt;
La procédure à suivre afin de vérifier et tester le fonctionnement des moteurs et de l'asservissement:&lt;br /&gt;
#Téléverser ce code dans la carte Teensy. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Téléverser &lt;br /&gt;
#&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes:&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115200. On utilise alors le port série par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin( 115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandés et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la Teensy n'étaient donc pas les bons ports dans le code de l'Arduino. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'Arduino Due, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la due utilisé (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la Teensy et de la Due ensemble.&lt;br /&gt;
&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
Ces robots utilisent les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE et un module WiFi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la teensy, pour cela il faut utiliser le code suivant:&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes:&lt;br /&gt;
#La commande avXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande avXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes at et et permettant respectivement d'allumer et d'éteindre la led de la Teensy.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'ESP32 et la Teensy, l'objectif est de contrôler le robot depuis l'ESP32 car c'est cette carte qui recevra les informations du robot 1, pour cela vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la Teensy. Dans notre cas nous avons utilisé les ports 16 et 17 de l'ESP32 qui correspondent à UART2, pour envoyer les commandes nous avons donc utiliser Serial2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre : (ici sous arduino UNO)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;SoftwareSerial.h&amp;gt;                         // Software Serial Port&lt;br /&gt;
&lt;br /&gt;
#define RxD         7&lt;br /&gt;
#define TxD         6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SoftwareSerial blueToothSerial(RxD,TxD);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(RxD, INPUT);&lt;br /&gt;
  pinMode(TxD, OUTPUT);&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
  blueToothSerial.begin(9600);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Version : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+VERSION&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Default : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedMaster0 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+NAMESeeedMaster0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+ROLEM : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in master mode&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+AUTH1 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   delay(400);      &lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }      &lt;br /&gt;
    delay(400);    &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+CLEAR : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
    delay(400);   &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111 : &amp;quot;); &lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    blueToothSerial.flush();&lt;br /&gt;
&lt;br /&gt;
    Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les réponses aux commandes AT :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Réponse_commandes_AT.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code Esclave : (ici avec une DUE, donc pas besoin de SoftwareSerial)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+Default&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  Serial3.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
   Serial.println(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);    &lt;br /&gt;
    if(Serial3.available()){&lt;br /&gt;
    Serial.print(lnSerial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    Serial3.flush();&lt;br /&gt;
   &lt;br /&gt;
  Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque ESP-NOW. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors ESP-NOW. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 GHz. Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; recevront le message envoyé. Le &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cette méthode &amp;lt;strong&amp;gt; ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder. Cependant, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt; serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Include Libraries&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
//Message to send&lt;br /&gt;
String recv;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void formatMacAddress(const uint8_t *macAddr, char *buffer, int maxLength)&lt;br /&gt;
// Formats MAC Address&lt;br /&gt;
{&lt;br /&gt;
  snprintf(buffer, maxLength, &amp;quot;%02x:%02x:%02x:%02x:%02x:%02x&amp;quot;, macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void receiveCallback(const uint8_t *macAddr, const uint8_t *data, int dataLen)&lt;br /&gt;
// Called when data is received&lt;br /&gt;
{&lt;br /&gt;
  // Only allow a maximum of 250 characters in the message + a null terminating byte&lt;br /&gt;
  char buffer[ESP_NOW_MAX_DATA_LEN + 1];&lt;br /&gt;
  int msgLen = min(ESP_NOW_MAX_DATA_LEN, dataLen);&lt;br /&gt;
  strncpy(buffer, (const char *)data, msgLen);&lt;br /&gt;
 &lt;br /&gt;
  // Make sure we are null terminated&lt;br /&gt;
  buffer[msgLen] = 0;&lt;br /&gt;
 &lt;br /&gt;
  // Format the MAC address&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
 &lt;br /&gt;
  // Send Debug log message to the serial port&lt;br /&gt;
  Serial.printf(&amp;quot;Received message from: %s - %s\n&amp;quot;, macStr, buffer);&lt;br /&gt;
 &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
void sentCallback(const uint8_t *macAddr, esp_now_send_status_t status)&lt;br /&gt;
// Called when data is sent&lt;br /&gt;
{&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Sent to: &amp;quot;);&lt;br /&gt;
  Serial.println(macStr);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Send Status: &amp;quot;);&lt;br /&gt;
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? &amp;quot;Delivery Success&amp;quot; : &amp;quot;Delivery Fail&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void broadcast(const String &amp;amp;message){&lt;br /&gt;
  // Emulates a broadcast&lt;br /&gt;
  // Broadcast a message to every device in range&lt;br /&gt;
  uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};&lt;br /&gt;
  esp_now_peer_info_t peerInfo = {};&lt;br /&gt;
  memcpy(&amp;amp;peerInfo.peer_addr, broadcastAddress, 6);&lt;br /&gt;
  if (!esp_now_is_peer_exist(broadcastAddress))&lt;br /&gt;
  {&lt;br /&gt;
    esp_now_add_peer(&amp;amp;peerInfo);&lt;br /&gt;
  }&lt;br /&gt;
  // Send message&lt;br /&gt;
  esp_err_t result = esp_now_send(broadcastAddress, (const uint8_t *)message.c_str(), message.length());&lt;br /&gt;
 &lt;br /&gt;
  // Print results to serial monitor&lt;br /&gt;
  if (result == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Broadcast message success&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_INIT)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW not Init.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_ARG)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Invalid Argument&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_INTERNAL)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NO_MEM)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP_ERR_ESPNOW_NO_MEM&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_FOUND)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Peer not found.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Unknown error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial2.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  // Set ESP32 in STA mode to begin with&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
  Serial.println(&amp;quot;ESP-NOW Broadcast Demo&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC address&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  // Initialize ESP-NOW&lt;br /&gt;
  if (esp_now_init() == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Success&amp;quot;);&lt;br /&gt;
    esp_now_register_recv_cb(receiveCallback);&lt;br /&gt;
    esp_now_register_send_cb(sentCallback);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Failed&amp;quot;);&lt;br /&gt;
    delay(3000);&lt;br /&gt;
    ESP.restart();&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
//if(Serial2.available()){&lt;br /&gt;
    //recv=Serial2.readStringUntil('\n');&lt;br /&gt;
    recv=&amp;quot;avavardrgaalal&amp;quot;;&lt;br /&gt;
    broadcast(recv);&lt;br /&gt;
//}&lt;br /&gt;
&lt;br /&gt;
delay(5000);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les ESP32 en mode responder :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char msg[32];&lt;br /&gt;
char sous_chaine[3]; // Tableau de char pour stocker les sous-chaînes&lt;br /&gt;
int i=0;&lt;br /&gt;
// Create a structured object&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
// Callback function executed when data is received&lt;br /&gt;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {&lt;br /&gt;
  memcpy(&amp;amp;msg, incomingData, sizeof(msg));&lt;br /&gt;
  Serial.print(&amp;quot;Message received: &amp;quot;);&lt;br /&gt;
  Serial.println(msg);&lt;br /&gt;
  for(i=0;i&amp;lt;strlen(msg);i+=2){&lt;br /&gt;
    sous_chaine[0] = msg[i];&lt;br /&gt;
    sous_chaine[1] = msg[i+1];&lt;br /&gt;
    sous_chaine[2] = '\0'; // Ajoute un caractère nul à la fin de la sous-chaîne&lt;br /&gt;
    Serial.println(sous_chaine); // Affiche la sous-chaîne dans le moniteur série&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
  // Set ESP32 as a Wi-Fi Station&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Initilize ESP-NOW&lt;br /&gt;
  if (esp_now_init() != ESP_OK) {&lt;br /&gt;
    Serial.println(&amp;quot;Error initializing ESP-NOW&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Register callback function&lt;br /&gt;
  esp_now_register_recv_cb(OnDataRecv);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A noté que ici, on découpe le message reçu en chaines de caractères de longueur 2 qui correspondent directement aux ordres à donner au robot pour qu'il avance/recule/tourne.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12087</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12087"/>
		<updated>2023-05-05T14:25:19Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Moteurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes ainsi nous n'aurions pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors:&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple: la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy comme carte motrice car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les deux cartes sont connectées par une liaison série pour communiquer.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afin de Controller les déplacements du robot, on va utiliser le code pour une plateforme holonome moteurs.&lt;br /&gt;
La procédure à suivre afin de vérifier et tester le fonctionnement des moteurs et de l'asservissement:&lt;br /&gt;
#Téléverser ce code dans la carte Teensy. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Téléverser &lt;br /&gt;
#&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes:&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115200. On utilise alors le port série par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin( 115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandés et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la Teensy n'étaient donc pas les bons ports dans le code de l'Arduino. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'Arduino Due, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la due utilisé (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la Teensy et de la Due ensemble.&lt;br /&gt;
&lt;br /&gt;
===Algorithme===&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
Ces robots utilisent les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE et un module WiFi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la teensy, pour cela il faut utiliser le code suivant:&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes:&lt;br /&gt;
#La commande avXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande avXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes at et et permettant respectivement d'allumer et d'éteindre la led de la Teensy.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'ESP32 et la Teensy, l'objectif est de contrôler le robot depuis l'ESP32 car c'est cette carte qui recevra les informations du robot 1, pour cela vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la Teensy. Dans notre cas nous avons utilisé les ports 16 et 17 de l'ESP32 qui correspondent à UART2, pour envoyer les commandes nous avons donc utiliser Serial2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre : (ici sous arduino UNO)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;SoftwareSerial.h&amp;gt;                         // Software Serial Port&lt;br /&gt;
&lt;br /&gt;
#define RxD         7&lt;br /&gt;
#define TxD         6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SoftwareSerial blueToothSerial(RxD,TxD);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(RxD, INPUT);&lt;br /&gt;
  pinMode(TxD, OUTPUT);&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
  blueToothSerial.begin(9600);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Version : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+VERSION&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Default : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedMaster0 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+NAMESeeedMaster0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+ROLEM : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in master mode&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+AUTH1 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   delay(400);      &lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }      &lt;br /&gt;
    delay(400);    &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+CLEAR : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
    delay(400);   &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111 : &amp;quot;); &lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    blueToothSerial.flush();&lt;br /&gt;
&lt;br /&gt;
    Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les réponses aux commandes AT :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Réponse_commandes_AT.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code Esclave : (ici avec une DUE, donc pas besoin de SoftwareSerial)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+Default&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  Serial3.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
   Serial.println(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);    &lt;br /&gt;
    if(Serial3.available()){&lt;br /&gt;
    Serial.print(lnSerial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    Serial3.flush();&lt;br /&gt;
   &lt;br /&gt;
  Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque ESP-NOW. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors ESP-NOW. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 GHz. Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; recevront le message envoyé. Le &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cette méthode &amp;lt;strong&amp;gt; ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder. Cependant, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt; serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Include Libraries&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
//Message to send&lt;br /&gt;
String recv;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void formatMacAddress(const uint8_t *macAddr, char *buffer, int maxLength)&lt;br /&gt;
// Formats MAC Address&lt;br /&gt;
{&lt;br /&gt;
  snprintf(buffer, maxLength, &amp;quot;%02x:%02x:%02x:%02x:%02x:%02x&amp;quot;, macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void receiveCallback(const uint8_t *macAddr, const uint8_t *data, int dataLen)&lt;br /&gt;
// Called when data is received&lt;br /&gt;
{&lt;br /&gt;
  // Only allow a maximum of 250 characters in the message + a null terminating byte&lt;br /&gt;
  char buffer[ESP_NOW_MAX_DATA_LEN + 1];&lt;br /&gt;
  int msgLen = min(ESP_NOW_MAX_DATA_LEN, dataLen);&lt;br /&gt;
  strncpy(buffer, (const char *)data, msgLen);&lt;br /&gt;
 &lt;br /&gt;
  // Make sure we are null terminated&lt;br /&gt;
  buffer[msgLen] = 0;&lt;br /&gt;
 &lt;br /&gt;
  // Format the MAC address&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
 &lt;br /&gt;
  // Send Debug log message to the serial port&lt;br /&gt;
  Serial.printf(&amp;quot;Received message from: %s - %s\n&amp;quot;, macStr, buffer);&lt;br /&gt;
 &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
void sentCallback(const uint8_t *macAddr, esp_now_send_status_t status)&lt;br /&gt;
// Called when data is sent&lt;br /&gt;
{&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Sent to: &amp;quot;);&lt;br /&gt;
  Serial.println(macStr);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Send Status: &amp;quot;);&lt;br /&gt;
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? &amp;quot;Delivery Success&amp;quot; : &amp;quot;Delivery Fail&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void broadcast(const String &amp;amp;message){&lt;br /&gt;
  // Emulates a broadcast&lt;br /&gt;
  // Broadcast a message to every device in range&lt;br /&gt;
  uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};&lt;br /&gt;
  esp_now_peer_info_t peerInfo = {};&lt;br /&gt;
  memcpy(&amp;amp;peerInfo.peer_addr, broadcastAddress, 6);&lt;br /&gt;
  if (!esp_now_is_peer_exist(broadcastAddress))&lt;br /&gt;
  {&lt;br /&gt;
    esp_now_add_peer(&amp;amp;peerInfo);&lt;br /&gt;
  }&lt;br /&gt;
  // Send message&lt;br /&gt;
  esp_err_t result = esp_now_send(broadcastAddress, (const uint8_t *)message.c_str(), message.length());&lt;br /&gt;
 &lt;br /&gt;
  // Print results to serial monitor&lt;br /&gt;
  if (result == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Broadcast message success&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_INIT)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW not Init.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_ARG)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Invalid Argument&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_INTERNAL)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NO_MEM)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP_ERR_ESPNOW_NO_MEM&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_FOUND)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Peer not found.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Unknown error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial2.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  // Set ESP32 in STA mode to begin with&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
  Serial.println(&amp;quot;ESP-NOW Broadcast Demo&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC address&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  // Initialize ESP-NOW&lt;br /&gt;
  if (esp_now_init() == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Success&amp;quot;);&lt;br /&gt;
    esp_now_register_recv_cb(receiveCallback);&lt;br /&gt;
    esp_now_register_send_cb(sentCallback);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Failed&amp;quot;);&lt;br /&gt;
    delay(3000);&lt;br /&gt;
    ESP.restart();&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
//if(Serial2.available()){&lt;br /&gt;
    //recv=Serial2.readStringUntil('\n');&lt;br /&gt;
    recv=&amp;quot;avavardrgaalal&amp;quot;;&lt;br /&gt;
    broadcast(recv);&lt;br /&gt;
//}&lt;br /&gt;
&lt;br /&gt;
delay(5000);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les ESP32 en mode responder :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char msg[32];&lt;br /&gt;
char sous_chaine[3]; // Tableau de char pour stocker les sous-chaînes&lt;br /&gt;
int i=0;&lt;br /&gt;
// Create a structured object&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
// Callback function executed when data is received&lt;br /&gt;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {&lt;br /&gt;
  memcpy(&amp;amp;msg, incomingData, sizeof(msg));&lt;br /&gt;
  Serial.print(&amp;quot;Message received: &amp;quot;);&lt;br /&gt;
  Serial.println(msg);&lt;br /&gt;
  for(i=0;i&amp;lt;strlen(msg);i+=2){&lt;br /&gt;
    sous_chaine[0] = msg[i];&lt;br /&gt;
    sous_chaine[1] = msg[i+1];&lt;br /&gt;
    sous_chaine[2] = '\0'; // Ajoute un caractère nul à la fin de la sous-chaîne&lt;br /&gt;
    Serial.println(sous_chaine); // Affiche la sous-chaîne dans le moniteur série&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
  // Set ESP32 as a Wi-Fi Station&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Initilize ESP-NOW&lt;br /&gt;
  if (esp_now_init() != ESP_OK) {&lt;br /&gt;
    Serial.println(&amp;quot;Error initializing ESP-NOW&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Register callback function&lt;br /&gt;
  esp_now_register_recv_cb(OnDataRecv);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A noté que ici, on découpe le message reçu en chaines de caractères de longueur 2 qui correspondent directement aux ordres à donner au robot pour qu'il avance/recule/tourne.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12086</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12086"/>
		<updated>2023-05-05T14:24:37Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Déplacement des robots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Missions des robots jardiniers=&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=  &lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile. Les autres robots auront seulement besoin de reproduire les déplacements du robot 1.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes ainsi nous n'aurions pas pu effectuer une simulation concrète de notre algorithme. La simulation et la création d'un nouveau robot auraient pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation même si cette dernière aurait été très intéressante pour tester notre algorithme.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors:&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
Pour capter la luminosité, nous utilisons le capteur d'UV de Grove &amp;quot;Grove UV sensor&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:grove_uv_sensor.jpg|500px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur retourne une tension de l'ordre du mV qu'on transformera en indice UV grâce à une fonction qu'on retrouvera dans la '''[https://wiki.seeedstudio.com/Grove-UV_Sensor/ Documentation]'''.&lt;br /&gt;
On utilisera cet indice UV pour détecter si la zone est bien éclairée, donc s'il faut planter au point ou les mesures sont prises&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
Pour détecter les conditions idéales de plantation et d'arrosage des plantes, nous avons utilisé un capteur combinant la détection de température et d'humidité de l'air, il s'agit du &amp;quot;Grove humidity and temperature sensor&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:grove_humidity_temperature.jpg|300px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur nous retournera un signal en mV qui nous permettra via un rapide programme présent dans la [https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor/ Documentation] de récupérer le taux d'humidité de l'air et la température en degrés&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Ce capteur est également doté d'un module additionnel d'analyse permettant de recevoir en entrée de la carte une information simple: la présence de gouttes de pluies, on recevra alors un signal booléen permettant de savoir si il pleut. Si tel est le cas, on ordonnera au robot 1 de rentrer à la base.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout d'abbord, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs. Elles possède aussi des avantages comme sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle est dotée d'une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
# Les cartes sont alimentées par des batteries externes de 5V&lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy comme carte motrice car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les deux cartes sont connectées par une liaison série pour communiquer.&lt;br /&gt;
&lt;br /&gt;
=Déplacement des robots=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Robot 1==&lt;br /&gt;
&lt;br /&gt;
===Moteurs===&lt;br /&gt;
Afin de Controller les déplacements du robot, on va utiliser le code pour une plateforme holonome moteurs.&lt;br /&gt;
La procédure à suivre afin de vérifier et tester le fonctionnement des moteurs et de l'asservissement:&lt;br /&gt;
#Téléverser ce code dans la carte Teensy. La vitesse maximale est définie par le paramètre paramVitesse dans le début du code.&lt;br /&gt;
#Téléverser &lt;br /&gt;
#&lt;br /&gt;
#Tester les moteurs en envoyer les commandes suivantes:&lt;br /&gt;
#:-&amp;lt;code&amp;gt;av1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à pleine vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;am1&amp;lt;/code&amp;gt; pour démarrer le moteur 1 à demi vitesse&lt;br /&gt;
#:-&amp;lt;code&amp;gt;st&amp;lt;/code&amp;gt; pour stopper tous les moteurs&lt;br /&gt;
#Tester les déplacements en entiers&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avd&amp;lt;/code&amp;gt; pour que le robot avance : on active simultanément les moteurs 1 et 3.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;avg&amp;lt;/code&amp;gt; pour que le robot se déplace à gauche : on active simultanément les moteurs 2 et 4.&lt;br /&gt;
#:-&amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; pour que le robot fasse une rotation dans le sens trigonométrique : on active simultanément les moteurs 1,2,3 et 4.&lt;br /&gt;
&lt;br /&gt;
On peut tester le code grâce à une console série avec une vitesse de 115200. On utilise alors le port série par défaut de la carte, il faut donc penser à l'ouvrir (&amp;lt;code&amp;gt;Serial.begin( 115200);&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Lors des premiers essais de déplacement, nous avons eu quelques problèmes concernant l'asservissement. En effet, on a remarqué au début du projet que la roue 1 avait une vitesse de rotation très importante comparée aux autres et que le moteur 2 ne tournait que dans un sens. Ces difficultés posaient problème pour le déplacement du robot. On a donc test toute la chaine en partant de la Teensy jusqu'aux moteurs :&lt;br /&gt;
&lt;br /&gt;
Premièrement, concernant le moteur qui ne tourne que dans un sens, le problème vient du pont en H qui ne fait pas circuler le courant dans un sens. Ce pont est à changer l'année prochaine.&lt;br /&gt;
&lt;br /&gt;
Deuxièmement, en étudiant le moteur 1, nous avons remarqué qu'il ne répondait pas aux consignes demandés et en particulier l'asservissement. Il semblerait effectivement que &amp;lt;b&amp;gt;les branchements de l'asservissement sur la Teensy sur le schéma électrique fourni ne sont plus d'actualités&amp;lt;/b&amp;gt;. Les ports de la Teensy n'étaient donc pas les bons ports dans le code de l'Arduino. Après vérification, voici les bons ports : &lt;br /&gt;
&lt;br /&gt;
M1Out1 = 16;&lt;br /&gt;
&lt;br /&gt;
M1Out0 = 17;&lt;br /&gt;
&lt;br /&gt;
M2Out1 = 14;&lt;br /&gt;
&lt;br /&gt;
M2Out0 = 15;&lt;br /&gt;
&lt;br /&gt;
M3Out1 = 11;&lt;br /&gt;
&lt;br /&gt;
M3Out0 = 12;&lt;br /&gt;
&lt;br /&gt;
M4Out1 = 9;&lt;br /&gt;
&lt;br /&gt;
M4Out0 = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois les ports correctement associés, l'asservissement de la roue 1 fonctionne correctement et les roues tournent toutes à la même vitesse.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer les opérations de déplacement à l'aide de l'Arduino Due, il faut connecter les deux cartes à l'aide des ports séries en croisant le Tx et le Rx. Il faut également ouvrir le port série de la due utilisé (&amp;lt;code&amp;gt;SerialX.begin(115200);&amp;lt;/code&amp;gt;) pour le port série X. Finalement, ne pas oublier de relier les masses de la Teensy et de la Due ensemble.&lt;br /&gt;
&lt;br /&gt;
===Algorithme===&lt;br /&gt;
== Robot 2 et 3 ==&lt;br /&gt;
&lt;br /&gt;
Ces robots utilisent les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE et un module WiFi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
La première étape est de contrôler les moteurs avec la teensy, pour cela il faut utiliser le code suivant:&lt;br /&gt;
Les déplacements des robots 2 et 3 sont gérés avec les commandes suivantes:&lt;br /&gt;
#La commande avXXX permet d'indiquer la direction, sous forme d'angle en degrés (ex XXX = 120), dans laquelle le robot va se déplacer (cette commande ne fait pas bouger le robot).&lt;br /&gt;
#La commande ho3 entraîne le déplacement du robot dans la direction indiquée avec la commande avXXX.&lt;br /&gt;
#Vous pouvez aussi tester les commandes at et et permettant respectivement d'allumer et d'éteindre la led de la Teensy.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut établir une liaison série entre l'ESP32 et la Teensy, l'objectif est de contrôler le robot depuis l'ESP32 car c'est cette carte qui recevra les informations du robot 1, pour cela vous pouvez commencer par utiliser ce code simple permettant de faire clignoter la LED de la Teensy. Dans notre cas nous avons utilisé les ports 16 et 17 de l'ESP32 qui correspondent à UART2, pour envoyer les commandes nous avons donc utiliser Serial2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial2.begin(115200); // Initialize serial communication at 115200 baud&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;al&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
    Serial2.print(&amp;quot;et&amp;quot;); // Send &amp;quot;Blink&amp;quot; command to Teensy&lt;br /&gt;
&lt;br /&gt;
    delay(1000); // Wait for 1 second   &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite modifier le code pour envoyer les commandes permettant au robot de se déplacer.&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* av : Avance tout droit de 10 cm&lt;br /&gt;
* dr : Tourne à droite et avance de 10 cm&lt;br /&gt;
* ga : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* ar : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
=== 1ère tentative : &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Bluetooth (ECHEC)&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:bluetooth2.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:IMG_5040.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Pour plus d'information sur les commandes AT, voici le site officiel de Seedstudio : &lt;br /&gt;
[https://wiki.seeedstudio.com/Bluetooth_Bee_v2.0/]. Si le module est connecté, la petite LED verte de celui-ci s'arrête de clignoter. Pour voir un exemple d'utilisation dont nous sommes fortement inspirés, consulter le site suivant :[https://wiki.seeedstudio.com/Grove-Serial_Bluetooth_v3.0/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre : (ici sous arduino UNO)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;SoftwareSerial.h&amp;gt;                         // Software Serial Port&lt;br /&gt;
&lt;br /&gt;
#define RxD         7&lt;br /&gt;
#define TxD         6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SoftwareSerial blueToothSerial(RxD,TxD);&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(RxD, INPUT);&lt;br /&gt;
  pinMode(TxD, OUTPUT);&lt;br /&gt;
 &lt;br /&gt;
    &lt;br /&gt;
  blueToothSerial.begin(9600);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Version : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+VERSION&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+Default : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);  &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedMaster0 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+NAMESeeedMaster0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+ROLEM : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in master mode&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;AT+AUTH1 : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   delay(400);      &lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }      &lt;br /&gt;
    delay(400);    &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+CLEAR : &amp;quot;);&lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }&lt;br /&gt;
    delay(400);   &lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111 : &amp;quot;); &lt;br /&gt;
  blueToothSerial.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(blueToothSerial.available()){&lt;br /&gt;
    Serial.println(blueToothSerial.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    blueToothSerial.flush();&lt;br /&gt;
&lt;br /&gt;
    Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les réponses aux commandes AT :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Réponse_commandes_AT.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code Esclave : (ici avec une DUE, donc pas besoin de SoftwareSerial)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #define DEBUG_ENABLED  1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
 &lt;br /&gt;
  Serial.println(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+Default&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);  &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);&lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedSlave0&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  Serial3.print(&amp;quot;AT+PIN1111&amp;quot;); &lt;br /&gt;
  delay(400);&lt;br /&gt;
  if(Serial3.available()){&lt;br /&gt;
    Serial.println(Serial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
  delay(400);&lt;br /&gt;
   Serial.println(&amp;quot;AT+AUTH1&amp;quot;);&lt;br /&gt;
   Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);    &lt;br /&gt;
    if(Serial3.available()){&lt;br /&gt;
    Serial.print(lnSerial3.readStringUntil('\n'));&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
    //wait 1s and flush the serial buffer&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    Serial.flush();&lt;br /&gt;
    Serial3.flush();&lt;br /&gt;
   &lt;br /&gt;
  Serial.println(&amp;quot;Debut de la communication&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mode de communication retenu : &amp;lt;B&amp;gt;WiFi&amp;lt;/B&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Nous nous aidons de la bibliothèque ESP-NOW. Pour avoir toutes les méthodes et fonction de la bibliothèque : https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html#_CPPv416esp_now_add_peerPK19esp_now_peer_info_t. Pour avoir un exemple dont nous sommes inspirés : https://dronebotworkshop.com/esp-now/.&lt;br /&gt;
&lt;br /&gt;
On souhaite établir une communication entre les robots, via &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. On utilise alors ESP-NOW. Il s'agit d'un protocole de communication unique aux &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. Le protocole utilise la bande de fréquence 2.4 GHz. Dans le cadre de ce projet, le mode opératoire est appelé broadcast, c'est-à-dire que toutes les cartes &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; recevront le message envoyé. Le &amp;lt;B&amp;gt;ESP32&amp;lt;/B&amp;gt; du robot 1 joue le rôle d'initiateur (initiator) et les &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; des robots 2 et 3 jouent le rôle de récepteur (responder).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Esp-now bb.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Cette méthode &amp;lt;strong&amp;gt; ne nécessite pas de connaître les adresses MAC des &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; &amp;lt;/strong&amp;gt; qui auront le rôle de responder. Cependant, nous avons d'abord essayé de communiquer en point à point avec les adresses MAC. Celle-ci peuvent être obtenue facilement avec ce code :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Il faut bien noter les adresses obtenues pour éviter de le refaire plusieurs fois.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// Include WiFi Library&lt;br /&gt;
#include &amp;quot;WiFi.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
 &lt;br /&gt;
  // Setup Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
 &lt;br /&gt;
  // Put ESP32 into Station mode&lt;br /&gt;
  WiFi.mode(WIFI_MODE_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC Address to Serial monitor&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comme notre carte principale est la &amp;lt;em&amp;gt;Arduino Due &amp;lt;/em&amp;gt;, on connecte sur les ports &amp;lt;em&amp;gt;serial 3&amp;lt;/em&amp;gt; deux fils vers &amp;lt;em&amp;gt; serial 2&amp;lt;/em&amp;gt; (en inverser) de la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt;. C'est la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; qui enverra les messages à envoyer.&lt;br /&gt;
&lt;br /&gt;
Voici le code utilisé pour envoyer les données en mode broadcast : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;Due&amp;lt;/em&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
String mvt=&amp;quot;avavavdrdrgaalalav&amp;quot;;&lt;br /&gt;
void setup() {&lt;br /&gt;
  &lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial3.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
 Serial3.print(mvt);&lt;br /&gt;
 delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour la &amp;lt;em&amp;gt;ESP32&amp;lt;/em&amp;gt; en mode Broadcast :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Include Libraries&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
//Message to send&lt;br /&gt;
String recv;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void formatMacAddress(const uint8_t *macAddr, char *buffer, int maxLength)&lt;br /&gt;
// Formats MAC Address&lt;br /&gt;
{&lt;br /&gt;
  snprintf(buffer, maxLength, &amp;quot;%02x:%02x:%02x:%02x:%02x:%02x&amp;quot;, macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
void receiveCallback(const uint8_t *macAddr, const uint8_t *data, int dataLen)&lt;br /&gt;
// Called when data is received&lt;br /&gt;
{&lt;br /&gt;
  // Only allow a maximum of 250 characters in the message + a null terminating byte&lt;br /&gt;
  char buffer[ESP_NOW_MAX_DATA_LEN + 1];&lt;br /&gt;
  int msgLen = min(ESP_NOW_MAX_DATA_LEN, dataLen);&lt;br /&gt;
  strncpy(buffer, (const char *)data, msgLen);&lt;br /&gt;
 &lt;br /&gt;
  // Make sure we are null terminated&lt;br /&gt;
  buffer[msgLen] = 0;&lt;br /&gt;
 &lt;br /&gt;
  // Format the MAC address&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
 &lt;br /&gt;
  // Send Debug log message to the serial port&lt;br /&gt;
  Serial.printf(&amp;quot;Received message from: %s - %s\n&amp;quot;, macStr, buffer);&lt;br /&gt;
 &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
void sentCallback(const uint8_t *macAddr, esp_now_send_status_t status)&lt;br /&gt;
// Called when data is sent&lt;br /&gt;
{&lt;br /&gt;
  char macStr[18];&lt;br /&gt;
  formatMacAddress(macAddr, macStr, 18);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Sent to: &amp;quot;);&lt;br /&gt;
  Serial.println(macStr);&lt;br /&gt;
  Serial.print(&amp;quot;Last Packet Send Status: &amp;quot;);&lt;br /&gt;
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? &amp;quot;Delivery Success&amp;quot; : &amp;quot;Delivery Fail&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void broadcast(const String &amp;amp;message){&lt;br /&gt;
  // Emulates a broadcast&lt;br /&gt;
  // Broadcast a message to every device in range&lt;br /&gt;
  uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};&lt;br /&gt;
  esp_now_peer_info_t peerInfo = {};&lt;br /&gt;
  memcpy(&amp;amp;peerInfo.peer_addr, broadcastAddress, 6);&lt;br /&gt;
  if (!esp_now_is_peer_exist(broadcastAddress))&lt;br /&gt;
  {&lt;br /&gt;
    esp_now_add_peer(&amp;amp;peerInfo);&lt;br /&gt;
  }&lt;br /&gt;
  // Send message&lt;br /&gt;
  esp_err_t result = esp_now_send(broadcastAddress, (const uint8_t *)message.c_str(), message.length());&lt;br /&gt;
 &lt;br /&gt;
  // Print results to serial monitor&lt;br /&gt;
  if (result == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Broadcast message success&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_INIT)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW not Init.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_ARG)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Invalid Argument&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_INTERNAL)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NO_MEM)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP_ERR_ESPNOW_NO_MEM&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else if (result == ESP_ERR_ESPNOW_NOT_FOUND)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Peer not found.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Unknown error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial2.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
  // Set ESP32 in STA mode to begin with&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
  Serial.println(&amp;quot;ESP-NOW Broadcast Demo&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  // Print MAC address&lt;br /&gt;
  Serial.print(&amp;quot;MAC Address: &amp;quot;);&lt;br /&gt;
  Serial.println(WiFi.macAddress());&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  // Initialize ESP-NOW&lt;br /&gt;
  if (esp_now_init() == ESP_OK)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Success&amp;quot;);&lt;br /&gt;
    esp_now_register_recv_cb(receiveCallback);&lt;br /&gt;
    esp_now_register_send_cb(sentCallback);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;ESP-NOW Init Failed&amp;quot;);&lt;br /&gt;
    delay(3000);&lt;br /&gt;
    ESP.restart();&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
//if(Serial2.available()){&lt;br /&gt;
    //recv=Serial2.readStringUntil('\n');&lt;br /&gt;
    recv=&amp;quot;avavardrgaalal&amp;quot;;&lt;br /&gt;
    broadcast(recv);&lt;br /&gt;
//}&lt;br /&gt;
&lt;br /&gt;
delay(5000);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour les ESP32 en mode responder :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;esp_now.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char msg[32];&lt;br /&gt;
char sous_chaine[3]; // Tableau de char pour stocker les sous-chaînes&lt;br /&gt;
int i=0;&lt;br /&gt;
// Create a structured object&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
// Callback function executed when data is received&lt;br /&gt;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {&lt;br /&gt;
  memcpy(&amp;amp;msg, incomingData, sizeof(msg));&lt;br /&gt;
  Serial.print(&amp;quot;Message received: &amp;quot;);&lt;br /&gt;
  Serial.println(msg);&lt;br /&gt;
  for(i=0;i&amp;lt;strlen(msg);i+=2){&lt;br /&gt;
    sous_chaine[0] = msg[i];&lt;br /&gt;
    sous_chaine[1] = msg[i+1];&lt;br /&gt;
    sous_chaine[2] = '\0'; // Ajoute un caractère nul à la fin de la sous-chaîne&lt;br /&gt;
    Serial.println(sous_chaine); // Affiche la sous-chaîne dans le moniteur série&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void setup() {&lt;br /&gt;
  // Set up Serial Monitor&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  &lt;br /&gt;
  // Set ESP32 as a Wi-Fi Station&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
 &lt;br /&gt;
  // Initilize ESP-NOW&lt;br /&gt;
  if (esp_now_init() != ESP_OK) {&lt;br /&gt;
    Serial.println(&amp;quot;Error initializing ESP-NOW&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // Register callback function&lt;br /&gt;
  esp_now_register_recv_cb(OnDataRecv);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() {&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A noté que ici, on découpe le message reçu en chaines de caractères de longueur 2 qui correspondent directement aux ordres à donner au robot pour qu'il avance/recule/tourne.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12026</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12026"/>
		<updated>2023-05-02T06:58:48Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Simulation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
La simulation de robot permet de vérifier que le comportement du robot est adéquat avec les fonctionnalités recherchés.&lt;br /&gt;
&lt;br /&gt;
[[File:webots_jardin.png|800px|Fenetre de simulation Webots]]&lt;br /&gt;
&lt;br /&gt;
Nous avons essayé de simuler avec le logiciel Webots. Nous avons commencer par modéliser le terrain, c'est à dire un carré d'herbe avec des objets qu'on pourrait trouver dans un jardin. Cependant, nous n'avons pas réussi à trouver un robot avec des roues holonomes ainsi nous n'aurions pas pu effectuer une simulation concrète de notre algorithme. La simulation aurait pris beaucoup de temps par rapport à celui dont on dispose, nous avons choisi de ne pas finir la simulation.&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
&lt;br /&gt;
Nous avons alors décidé d'utiliser les différents capteurs disponibles à Télécom car ils remplissaient les fonctions demandées, nous utiliserons alors:&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12024</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12024"/>
		<updated>2023-05-02T06:36:51Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Simulation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
[[File:webots_jardin.png|800px|fenetre de simulation webots]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12023</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12023"/>
		<updated>2023-05-02T06:36:40Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Simulation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
[[File:webots_jardin.png|800px|left|fenetre de simulation webots]]&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12022</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12022"/>
		<updated>2023-05-02T06:36:14Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
[[File:webots_jardin.png|432px|thumb|left|fenetre de simulation webots]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Un capteur de gouttes de pluie, ou capteur de détection de gouttes de pluie, est utilisé pour détecter s'il pleut ou non, ainsi que les précipitations. Il est largement utilisé dans des systèmes d'essuie-glace automatique, des systèmes d'éclairages intelligents et de  toits ouvrants d'automobiles.&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Fichier:Webots_jardin.png&amp;diff=12020</id>
		<title>Fichier:Webots jardin.png</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Fichier:Webots_jardin.png&amp;diff=12020"/>
		<updated>2023-05-02T06:35:07Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12019</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12019"/>
		<updated>2023-05-02T06:34:18Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé:&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pour le retour, il faudra refaire le même chemin en sens inverse, on retiendra chacun des mouvements.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm (voir les schémas ci-dessus)&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arrive en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Simulation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;. '''[https://wiki.seeedstudio.com/Grove-Moisture_Sensor/ Documentation]'''&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
[[File:raindrop.jpg]] &amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://docs.sunfounder.com/projects/sensorkit-v2-arduino/en/latest/lesson_34.html Documentation]'''&lt;br /&gt;
Capteur détecteur de gouttes de pluie&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12006</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=12006"/>
		<updated>2023-04-07T12:36:47Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
Voici un schéma explicatif de l'algorithme utilisé&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm voir les schémas ci-dessus&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arriv en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11999</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11999"/>
		<updated>2023-04-07T12:34:13Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Choix de l'algorithme de déplacement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm voir le schéma associé&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arriv en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11998</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11998"/>
		<updated>2023-04-07T12:33:44Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm voir le schéma associé&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arriv en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11996</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11996"/>
		<updated>2023-04-07T12:33:17Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
[[File:chemin_robot.png|432px|thumb|left|chemin normal du robot]]&lt;br /&gt;
[[File:chemin_robot_obstacle.png|432px|thumb|right|chemin du robot avec obstacle détecté]]&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)  //suivant le déplacement qu'on a choisi&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();  //on avance le moteur correspondant&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10); //le robot descend seulement de 10cm voir le schéma associé&lt;br /&gt;
    if (direction==2)  //si la direction était gauche alors elle devient droite et inversement&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()  // dès que le capteur avant détecte une détection, on veut se déplacer à droite&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1) //s'il n'y a pas d'obstacle à droite&lt;br /&gt;
      deplacement=3;         //on se déplace à droite&lt;br /&gt;
    else                     //sinon&lt;br /&gt;
      fin interruption       // on quitte l'interruption capteur avant pour aller dans l'interruption capteur droite&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;  // lorsque qu'un mur ou un obstacle est détecté, on veut descendre&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1; //dès qu'on arriv en bas du jardin on fait demi-tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11984</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11984"/>
		<updated>2023-04-07T12:27:20Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. &lt;br /&gt;
&lt;br /&gt;
Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
Le projet consiste à avancer jusqu'au fond du terrain (on considère ici que le terrain est un rectangle).&lt;br /&gt;
Le robot avance jusqu'à détecter un objet puis on se dirige vers la droite. Ensuite, le robot continue a droite jusqu'à détecter un objet, ce qui nous fera aller vers l'arrière. Le robot roulera vers l'arrière pendant quelques centimètres puis ira à gauche.&lt;br /&gt;
Lors de la prochaine détection d'un objet, le robot réutilisera la même méthode mais en inversant la droite et la gauche.&lt;br /&gt;
&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)&lt;br /&gt;
  case 1:&lt;br /&gt;
    moteur_avant();&lt;br /&gt;
    break;&lt;br /&gt;
  case2: &lt;br /&gt;
    moteur_gauche();&lt;br /&gt;
    break;&lt;br /&gt;
  case 3:&lt;br /&gt;
    moteur_droite();&lt;br /&gt;
    break;&lt;br /&gt;
  default :&lt;br /&gt;
    moteur_arriere(10);&lt;br /&gt;
    if (direction==2)&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      deplacement=2;&lt;br /&gt;
&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
Interruptions :&lt;br /&gt;
&lt;br /&gt;
- capteur_av()&lt;br /&gt;
    &lt;br /&gt;
    if (capteur_droite != 1)&lt;br /&gt;
      deplacement=3;&lt;br /&gt;
    else &lt;br /&gt;
      fin interruption&lt;br /&gt;
&lt;br /&gt;
- capteur_droite() ou capteur_gauche()&lt;br /&gt;
&lt;br /&gt;
    deplacement=4;&lt;br /&gt;
&lt;br /&gt;
-capteur_ar()&lt;br /&gt;
   deplacement=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11979</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11979"/>
		<updated>2023-04-07T12:21:00Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Pseudo code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents codes ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter la communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants :&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
&lt;br /&gt;
Pour déplacer le Robot 1, nous avons retenu le choix de discrétiser l'espace en 10 cm. Chaque mouvement effectué fera donc 10 cm, nous avons des capteurs à ultrasons qui transmettront au robot s'il est capable d'avancer de 10 cm sans rentrer dans un obstacle. Comme le Robot 1 ne tourne pas (il n'y pas vraiment de gauche ou de droite avec les roues holonomes) cela rend la tâche plus facile.&lt;br /&gt;
&lt;br /&gt;
==Choix de l'algorithme de déplacement==&lt;br /&gt;
Nous avons choisi un algorithme simple permettant de parcourir une grande distance et d'éviter la plupart des obstacles. Etant donné la durée du projet assez courte, faire un algorithme trop complexe aurait été assez contraignant.&lt;br /&gt;
==Pseudo code==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int deplacement ; //1=avant 2=gauche 3= droite 4= arrière&lt;br /&gt;
int direction; //2= gauche 3= droite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
switch(deplacement)&lt;br /&gt;
 \t case 1:&lt;br /&gt;
&lt;br /&gt;
case2: &lt;br /&gt;
&lt;br /&gt;
case 3:&lt;br /&gt;
defaut :&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectées au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte, car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Communication entre les robots=&lt;br /&gt;
&lt;br /&gt;
Pour communiquer entre les robots, nous avons choisi le protocole suivant : Le robot se déplace et prend plusieurs mesures, il les enregistre et au choisi le meilleur point pour planter des choux. Le chemin qu'il a parcouru est stocké en mémoire, il envoie donc les instructions de se déplacer jusqu'à ce point au robot 2 puis au 3. Les robots 2 et 3 reproduisent le même parcours que le robot 1, certes ce n'est pas le chemin le plus court, mais c'est la solution la plus facile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le mode de communication retenu est le Bluetooth. Les instructions seront envoyées comme suit : &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 bit de start, 1 bit de stop&lt;br /&gt;
* 00 : Avance tout droit de 10 cm&lt;br /&gt;
* 01 : Tourne à droite et avance de 10 cm&lt;br /&gt;
* 10 : Tourne à gauche et avance de 10 cm&lt;br /&gt;
* 11 : Recule de 10 cm. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le protocole Bluetooth, on utilise le module série Bluetooth v3.01 &amp;lt;br&amp;gt;. Pour utiliser le protocole Bluetooth, on utilise des commandes AT pour initialiser la communication entre le maitre (Robot 1) et l'esclave (Robot 2 et 3). Voici le code pour initier la connexion : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Maitre :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial3.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+NAMESeeedMaster&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedMaster&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+ROLEM&amp;quot;);             // set the bluetooth work in slave mode&lt;br /&gt;
  delay(400); &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+AUTH1&amp;quot;);            &lt;br /&gt;
    delay(400);    &lt;br /&gt;
  &lt;br /&gt;
  Serial3.print(&amp;quot;AT+CLEAR&amp;quot;);             // Clear connected device mac address&lt;br /&gt;
    delay(400);   &lt;br /&gt;
  &lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
  //wait 1s and flush the serial buffer&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  Serial3.flush();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code Esclave :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Serial1.begin(9600);  &lt;br /&gt;
  Serial1.print(&amp;quot;AT&amp;quot;);&lt;br /&gt;
  delay(400); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+DEFAULT&amp;quot;);             // Restore all setup value to factory setup&lt;br /&gt;
  delay(2000); &lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+NAMESeeedBTSlave&amp;quot;);    // set the bluetooth name as &amp;quot;SeeedBTSlave&amp;quot; ,the length of bluetooth name must less than 12 characters.&lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+PIN0000&amp;quot;);             // set the pair code to connect &lt;br /&gt;
  delay(400);&lt;br /&gt;
&lt;br /&gt;
  Serial1.print(&amp;quot;AT+AUTH1&amp;quot;);             &lt;br /&gt;
  delay(400); &lt;br /&gt;
   &lt;br /&gt;
  Serial1.flush();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11966</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11966"/>
		<updated>2023-04-07T07:30:22Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Robot 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants:&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer, étant donné que les robots 2 et 3 sont très similaires, les étudiants de ces 2 groupes travailleront souvent ensembles.&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE et une faible consommation.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
== Robot 3 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement Esp32 Thing et Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11963</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11963"/>
		<updated>2023-04-07T07:24:25Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Robot 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants:&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précédemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11962</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11962"/>
		<updated>2023-04-07T07:23:50Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Robot 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants:&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11961</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11961"/>
		<updated>2023-04-07T07:23:31Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Programmation des cartes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un œil sur les différents groupes.&lt;br /&gt;
Ces groupes sont les suivants:&lt;br /&gt;
* Groupe 1: Robot 1 (robot détecteur équipé de plusieurs capteurs permettant de créer une carte à suivre pour les autres robots): 6 étudiants&lt;br /&gt;
* Groupe 2: Robot 2 (robot arroseur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
* Groupe 3: Robot 3 (robot planteur qui suivra le chemin créé par le robot 1): 3 étudiants&lt;br /&gt;
&lt;br /&gt;
Cette composition sera très vite amenée à changer&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Premièrement, nous avons choisi la Teensy car c'est la carte utilisée par les années précédentes. Ainsi, nous disposons de tous les codes pour faire tourner les moteurs.&lt;br /&gt;
Ses avantages sont sa polyvalence et sa petite taille.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Robot 2 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Esp32 Thing et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Esp32 Thing :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi cette carte car elle possède une communication BLE.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Teensy :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la Teensy pour les mêmes raisons que précedemment.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11957</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11957"/>
		<updated>2023-04-07T07:12:13Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Robot 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner &amp;quot;ESP32 Dev Module&amp;quot;&lt;br /&gt;
D'après le pin layout de l'ESP32, il y a une led conncectée au pin 5, vous pouvez donc essayer de la faire clignoter pour tester la communication PC-ESP32.&lt;br /&gt;
[[Fichier:esp32.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino en suivant ce tuto : [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
Vous pouvez ensuite utiliser [&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un oeil&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due :&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11956</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11956"/>
		<updated>2023-04-07T07:11:12Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Choix des cartes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner &amp;quot;ESP32 Dev Module&amp;quot;&lt;br /&gt;
D'après le pin layout de l'ESP32, il y a une led conncectée au pin 5, vous pouvez donc essayer de la faire clignoter pour tester la communication PC-ESP32.&lt;br /&gt;
[[Fichier:esp32.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino en suivant ce tuto : [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
Vous pouvez ensuite utiliser [&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Décomposition initiale du travail=&lt;br /&gt;
Pour le début de ce projet, nous avons décidé de décomposer le groupe en plusieurs sous-groupes de travail, chacun constitué d'un chef. Egalement, nous avons décidé d'inclure un chef global de groupe qui permettra de faciliter le communication entre les groupes en gardant un oeil&lt;br /&gt;
&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes de développement suivantes : Arduino Due et Teensy.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Arduino Due &amp;lt;/u&amp;gt;&lt;br /&gt;
Nous avons choisi une carte Arduino car nous trouvons que la programmation est plus facile.&lt;br /&gt;
Nous avons pris le modèle Due car la Arduino Uno ne possédait pas assez de ports d'interruptions (seulement 2).&lt;br /&gt;
L'inconvénient est que la carte est grande par rapport à notre robot.&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11954</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11954"/>
		<updated>2023-04-07T07:02:21Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
=Prise en main des plateformes=&lt;br /&gt;
&lt;br /&gt;
==Alimentation==&lt;br /&gt;
*Le robot maître :&lt;br /&gt;
# Il possède un convertisseur de tension 9-18 à 5VDC. Il s'alimente à l'aide d'une batterie de 9.6V composée de 8 cellules Ni-Mh, la tension maximale est d'environ 10.7V.&lt;br /&gt;
# Les moteurs fonctionnent jusqu'à un maximum de 7.2V, ils consomment chacun à 0.5A en fonctionnement à vide et jusqu'à 1.3A en fonctionnement nominal (à un couple de 2 kgf-cm) : [https://bacasable.arpitania.eu//index.php?title=Fichier:Doc_HG37D670WE12_motor.pdf Documentation du moteur] &lt;br /&gt;
&lt;br /&gt;
*Les robots esclaves ont deux sources d'alimentation :&lt;br /&gt;
# La partie logique est alimentée par une pile 9V au travers d'une carte TRACO POWER (4.5-9V -&amp;gt; 3.3V). Celle-ci alimente la carte Teensy et la carte Sparkfun ESP32 Thing.&lt;br /&gt;
# La partie puissance est alimentée par un ensemble de 8 piles Ni-Mh, qui délivre 9.6V. Elles sont connectés au port Pvex1 (et à la masse juste en dessous) d'après cette [https://mootse.telecom-st-etienne.fr/pluginfile.php/65110/mod_resource/content/1/PCB_Robot4Voies.PDF représentation du PCB].&lt;br /&gt;
:Les deux parties sont séparées sur le PCB à l'aide du cavalier placé du côté du coté du connecteur d'alimentation.&lt;br /&gt;
&lt;br /&gt;
==Programmation des cartes==&lt;br /&gt;
* ESP32 :&lt;br /&gt;
::- Ajouter le support de la carte dans l'IDE Arduino en insérant ce lien dans Fichier → Préférences → URL de gestionnaire de carte supplémentaire : https://dl.espressif.com/dl/package_esp32_index.json&lt;br /&gt;
::- Dans Outils → Type de carte → Gestionnaire de cartes, rechercher et installer ESP32&lt;br /&gt;
::- Dans Outils → Type de carte sélectionner &amp;quot;ESP32 Dev Module&amp;quot;&lt;br /&gt;
D'après le pin layout de l'ESP32, il y a une led conncectée au pin 5, vous pouvez donc essayer de la faire clignoter pour tester la communication PC-ESP32.&lt;br /&gt;
[[Fichier:esp32.png|500px]]&lt;br /&gt;
&lt;br /&gt;
* Teensy :&lt;br /&gt;
::- Installer le support de la carte dans l'IDE Arduino en suivant ce tuto : [https://www.pjrc.com/teensy/td_download.html lien]&lt;br /&gt;
Vous pouvez ensuite utiliser [&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Déroulement des séances=&lt;br /&gt;
=Algorithmes des robots=&lt;br /&gt;
=Choix des capteurs=&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir mesurer au mieux les caractéristiques du terrain pour déterminer où il devra planter et où il devra arroser, notre robot aura besoin de plusieurs capteurs:&lt;br /&gt;
* Un capteur à UV pour la luminosité&lt;br /&gt;
* Un capteur d'humidité de l'air&lt;br /&gt;
* Un capteur de température&lt;br /&gt;
* Un capteur pour mesurer d'humidité du sol&lt;br /&gt;
* 4 capteurs de proximité à ultrason pour détecter les obstacles&lt;br /&gt;
== Capteur UV ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité et température ==&lt;br /&gt;
&lt;br /&gt;
== Capteur humidité du sol ==&lt;br /&gt;
Après étude, nous avons choisi d'utiliser le capteur &amp;quot;Grove moisture sensor&amp;quot;.&lt;br /&gt;
Sa forme de fourche lui permet de se planter dans le sol plus facilement. Son fonctionnement est simple, plus le sol est humide, plus le courant pourra passer entre les 2 dents de la fourche &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:sol_sec.jpg|300px|center]] &lt;br /&gt;
&amp;lt;div style='text-align: center;'&amp;gt;Prise du capteur d'humidité du sol dans un sol sec&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Tableau récapitulatif des mesures du sol (prises à Télécom un lendemain de jour de pluie et un jour sec)&lt;br /&gt;
|-&lt;br /&gt;
! Etat du sol !! Valeur mesurée par le capteur&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche|| 300&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche avec herbe || 350&lt;br /&gt;
|-&lt;br /&gt;
| Terre avec herbe (pluie la veille) || 600&lt;br /&gt;
|-&lt;br /&gt;
| Terre sèche après avoir été humidifiée || 650&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| Terre trempée|| 720&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ces mesures nous permettent alors de déterminer les valeurs pour lesquelles le sol a besoin d'être arrosé ou non. On détermine alors que lorsque le sol a besoin d'être arrosées, nos valeurs de retour seront inférieures à 400, et lorsque le seuil a été arrosé récemment, nos valeurs seront supérieures à 400.&amp;lt;br&amp;gt;&lt;br /&gt;
On décide alors de fixer le seuil du capteur à '''400 '''.&lt;br /&gt;
&lt;br /&gt;
== Capteur de gouttes de pluie ==&lt;br /&gt;
&lt;br /&gt;
= Choix des cartes =&lt;br /&gt;
&lt;br /&gt;
== Robot 1 ==&lt;br /&gt;
&lt;br /&gt;
Ce robot utilise les cartes développements&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11904</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11904"/>
		<updated>2023-04-05T16:05:25Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Capteur Gouttes de pluie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Déroulement des séances=&lt;br /&gt;
==Algorithmes des robots==&lt;br /&gt;
==Choix des capteurs==&lt;br /&gt;
&lt;br /&gt;
=== Capteur UV ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur humidité et température ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur humidité du sol ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur gouttes de pluie ===&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11903</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11903"/>
		<updated>2023-04-05T16:05:13Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : /* Choix des capteurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Déroulement des séances=&lt;br /&gt;
==Algorithmes des robots==&lt;br /&gt;
==Choix des capteurs==&lt;br /&gt;
&lt;br /&gt;
=== Capteur UV ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur humidité et température ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur humidité du sol ===&lt;br /&gt;
&lt;br /&gt;
=== Capteur Gouttes de pluie ===&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
	<entry>
		<id>https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11902</id>
		<title>Robots jardiniers</title>
		<link rel="alternate" type="text/html" href="https://bacasable.arpitania.eu//index.php?title=Robots_jardiniers&amp;diff=11902"/>
		<updated>2023-04-05T16:03:29Z</updated>

		<summary type="html">&lt;p&gt;Emilie cnvt : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Présentation=&lt;br /&gt;
&lt;br /&gt;
==Objectifs pédagogiques==&lt;br /&gt;
Les objectifs pédagogiques de l'option Robotique sont les suivantes :&lt;br /&gt;
* découvrir la robotique en s'appuyant sur une démarche pratique et concrète ;&lt;br /&gt;
* savoir mettre en œuvre des capteurs analogiques et numériques ;&lt;br /&gt;
* acquérir des notions sur la commande des moteurs et leur asservissement ;&lt;br /&gt;
* maîtriser les spécificités des interfaces de puissance à base de commutation (hacheurs, pont en H) ;&lt;br /&gt;
* prendre conscience des difficultés pratiques et technologiques de mise en œuvre de robots ;&lt;br /&gt;
* mettre en œuvre une démarche de ''reverse-engineering'' pour la prise en main du matériel ;&lt;br /&gt;
* mettre en œuvre une démarche DD-RSE, afin d'évaluer la réparabilité des plateformes robotiques utilisées ;&lt;br /&gt;
* savoir programmer des scénarios de comportement prenant en compte l’environnement ;&lt;br /&gt;
* bonne pratique de programmation C ou Python : commentaires, noms intelligibles de variables ou fonctions, utilisation d'un dépôt Git...&lt;br /&gt;
* méthodologie de gestion de projet, en groupe : gestion des ressources, gestion du temps, plan de tests...&lt;br /&gt;
* s’initier à une démarche de ''Design Thinking'' pour la conception de projet.&lt;br /&gt;
&lt;br /&gt;
==Modalités d'évaluation==&lt;br /&gt;
Les modalités d'évaluation du module seront : &lt;br /&gt;
* avancée du projet : intérêt porté au projet, travail pendant et en dehors des séances, efficacité du travail en groupe...&lt;br /&gt;
* utilisation des outils et notamment mise à jour du Wiki ;&lt;br /&gt;
* présentation + démonstration technique finale du projet ;&lt;br /&gt;
* examen écrit (QCM, sans document) - &amp;lt;u&amp;gt;jeudi 4 mai&amp;lt;/u&amp;gt; ;&lt;br /&gt;
&lt;br /&gt;
==Outils à utiliser==&lt;br /&gt;
# wiki : explication et documentation du projet ;&lt;br /&gt;
# projet GitLab (serveur de TSE) : sauvegarde et suivi de version des différents code ;&lt;br /&gt;
# ''ToDoList'' avec les missions de chaque étudiant, au fur et à mesure des séances ;&lt;br /&gt;
&lt;br /&gt;
==Missions des robots jardiniers==&lt;br /&gt;
Les robots jardiniers devront réaliser les actions suivantes :&lt;br /&gt;
# départ de la base du robot 1 ;&lt;br /&gt;
# exploration de l'environnement en évitant les obstacles ;&lt;br /&gt;
# évaluation des paramètres environnementaux : lumière, UV, température, humidité, humidité du sol\ldots&lt;br /&gt;
# si détection de paramètres propices, communication vers les robots 2 et 3 ;&lt;br /&gt;
# cheminement des robots 2 et 3 jusqu'au point de sinistre, à partir des informations fournies par le robot 1 ;&lt;br /&gt;
# action des robots 2 et 3 au point cible : arrosage, forage du sol\ldots&lt;br /&gt;
&lt;br /&gt;
En fonction de l'avancée du projet, d'autres types d'action pourront être ajoutés.&lt;br /&gt;
=Déroulement des séances=&lt;br /&gt;
==Algorithmes des robots==&lt;br /&gt;
==Choix des capteurs==&lt;/div&gt;</summary>
		<author><name>Emilie cnvt</name></author>
		
	</entry>
</feed>