<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tondeuse</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tondeuse"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/Tondeuse"/>
		<updated>2026-05-04T16:53:03Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14455</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14455"/>
				<updated>2021-03-18T11:15:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14454</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14454"/>
				<updated>2021-03-18T11:14:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Programmation}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14453</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14453"/>
				<updated>2021-03-18T11:13:34Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino|lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14414</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14414"/>
				<updated>2021-03-16T08:53:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Vert|Github}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14413</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14413"/>
				<updated>2021-03-16T08:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Programmation}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Github}}===&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui condense tous les codes et bibliothèque de notre projet [https://github.com/Wasabules/Projet-Tondeuse/lien github]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14407</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14407"/>
				<updated>2021-03-16T08:35:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteurs MDP}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 à 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avaient pas le même couple c'est-à-dire, un des moteurs tournait plus vite que l'autre, on a donc dû faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14402</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14402"/>
				<updated>2021-03-16T08:30:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteurs MDP}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
On a testé les les moteurs en mettant le pin M1 du moteur de droite à l'état haut et le pin M2 à l'état haut et les pins E1 et E2 a 255, on a vu que le robot tournait à gauche. Ainsi on a testé toutes les possibilités, cela nous a permis de définir la marche avant, la marche arrière, tourner à gauche et à droite. Puis on a remarqué que les moteurs n'avait pas le même couple donc un des moteurs tournait plus vite que l'autre alors on a du faire plusieurs tests pour faire tourner les deux moteurs à la même vitesse et ainsi aller tout droit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14400</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14400"/>
				<updated>2021-03-16T08:22:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Plaque pastillée}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14399</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14399"/>
				<updated>2021-03-16T08:21:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code général}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14398</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14398"/>
				<updated>2021-03-16T08:21:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
   Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14397</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14397"/>
				<updated>2021-03-16T08:20:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14396</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14396"/>
				<updated>2021-03-16T08:20:27Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Moteurs MDP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Ces moteurs sont pilotés par deux pins, le pin Mx qui permet de définir le sens de rotation du rotor en le mettant à l'état haut ou à l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique. On met le pin à 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14395</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14395"/>
				<updated>2021-03-16T08:16:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Moteurs MDP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14394</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14394"/>
				<updated>2021-03-16T08:15:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
    * Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin &lt;br /&gt;
      Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14393</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14393"/>
				<updated>2021-03-16T08:15:21Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
   * Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14392</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14392"/>
				<updated>2021-03-16T08:15:07Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
     * constituée de 6 parties:&lt;br /&gt;
       - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
       - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
       - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
       - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
       - masse du 12V &lt;br /&gt;
       - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
   * Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14391</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14391"/>
				<updated>2021-03-16T08:14:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Moteurs MDP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
* constituée de 6 parties:&lt;br /&gt;
 - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
 - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
 - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
 - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
 - masse du 12V &lt;br /&gt;
 - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
   * Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14390</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14390"/>
				<updated>2021-03-16T08:13:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
* constituée de 6 parties:&lt;br /&gt;
 - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
 - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
 - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
 - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
 - masse du 12V &lt;br /&gt;
 - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
* Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14389</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14389"/>
				<updated>2021-03-16T08:13:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
* constituée de 6 parties:&lt;br /&gt;
- le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
- le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
- SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
- SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
- masse du 12V &lt;br /&gt;
- masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
* Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14388</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14388"/>
				<updated>2021-03-16T08:13:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
* constituée de 6 parties:&lt;br /&gt;
 - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
 - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
 - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
 - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
 - masse du 12V &lt;br /&gt;
 - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
* Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14387</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14387"/>
				<updated>2021-03-16T08:12:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Plaque pastillée */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
* constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
* Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14386</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14386"/>
				<updated>2021-03-16T08:12:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Moteurs MDP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
* Pour ces moteurs ils sont pilotés par deux pins, le pin Mx permet de définir le sens de rotation du rotor en le mettant à l'état haut ou l'état bas, puis il y a le pin Ex qui permet de définir la vitesse de rotation du rotor, c'est un pin analogique, on met le pin a 255 pour avoir la vitesse maximale.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14385</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14385"/>
				<updated>2021-03-16T08:06:27Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Moteur brushless */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur Brushless ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté à un pin PWM de l'Arduino pour pouvoir le piloter&lt;br /&gt;
    * Alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * Sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14384</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14384"/>
				<updated>2021-03-16T08:05:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Le gyroscope */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * Connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * Alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * Fait la somme de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14383</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14383"/>
				<updated>2021-03-16T08:05:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Vidéos}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos=&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14382</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14382"/>
				<updated>2021-03-16T08:04:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14381</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14381"/>
				<updated>2021-03-16T08:03:41Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Vidéos}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14380</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14380"/>
				<updated>2021-03-16T08:03:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Capteurs de distance}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14379</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14379"/>
				<updated>2021-03-16T08:02:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteur brushless}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14378</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14378"/>
				<updated>2021-03-16T08:02:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteur brushless}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
* Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14377</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14377"/>
				<updated>2021-03-16T08:02:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteur brushless}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 *Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14376</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14376"/>
				<updated>2021-03-16T08:01:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteur brushless}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 * Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14375</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14375"/>
				<updated>2021-03-16T08:00:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Gyroscope}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
* On a testé le code du gyroscope avec le capteur seul sur une platine d'essai, le code a été trouvé sur internet. Le code fonctionnait bien, on avait les valeurs de la magnitude en X, Y et Z. Pareil pour l'accélération et on avait aussi la température. Puis on a programmé un code permettant de faire une boussole pour avoir l'angle par rapport au nord magnétique. Ensuite on a mis en commun avec les capteurs de distance, il n'y a pas besoin de redéfinir son adresse vu qu'elle est déjà différente des capteurs de distance.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14369</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14369"/>
				<updated>2021-03-16T07:39:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14368</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14368"/>
				<updated>2021-03-16T07:39:27Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14365</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14365"/>
				<updated>2021-03-16T07:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== Interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== Abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== Plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== Moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14364</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14364"/>
				<updated>2021-03-16T07:35:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== Les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
=== Le gyroscope ===&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== moteur brushless ===&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
=== interrupteur ===	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
=== abaisseur de tension ===&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
=== plaque pastillée ===&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
=== moteurs MDP ===&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14362</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14362"/>
				<updated>2021-03-16T07:33:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Explications}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
=== les capteurs de distance ===&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14360</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14360"/>
				<updated>2021-03-16T07:31:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Plaque pastillée}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;br /&gt;
&lt;br /&gt;
* Partie 12V&lt;br /&gt;
&lt;br /&gt;
 Nous avons alimenté la plaque en 12V grâce à une alimentation.&lt;br /&gt;
&lt;br /&gt;
* Partie 5V&lt;br /&gt;
&lt;br /&gt;
 Nous avons branché un abaisseur de tension LM2596 avec en entrée 12V puis avons tourné le potentiomètre à l'aide d'un tournevis pour avoir 5V en sortie. Pour le vérifier, on a &lt;br /&gt;
 utilisé un multimètre.&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14358</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14358"/>
				<updated>2021-03-16T07:26:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Moteur brushless}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre)&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code pour RUN / STOP}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Parameters&lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int min_throttle = 1000;&lt;br /&gt;
int max_throttle = 2000;&lt;br /&gt;
unsigned long currentMillis, previousMillis;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
//Init Serial USB&lt;br /&gt;
Serial.begin(9600);&lt;br /&gt;
Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
//Init ESC&lt;br /&gt;
pinMode(escPin, OUTPUT);&lt;br /&gt;
initProcedure();&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
  runBrushless();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void runBrushless() {&lt;br /&gt;
Serial.println(&amp;quot;running&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
delayMicroseconds(1350);&lt;br /&gt;
digitalWrite(escPin, LOW);&lt;br /&gt;
delay(20);&lt;br /&gt;
}&lt;br /&gt;
Serial.println(&amp;quot;stop&amp;quot;);&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
while (currentMillis &amp;lt; 2000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
void initProcedure() {&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle up&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 3000) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(max_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
currentMillis = 0;&lt;br /&gt;
previousMillis = millis();&lt;br /&gt;
Serial.println(&amp;quot;throttle down&amp;quot;);&lt;br /&gt;
while (currentMillis &amp;lt; 4500) {&lt;br /&gt;
currentMillis = millis() - previousMillis;&lt;br /&gt;
 Serial.println(currentMillis);&lt;br /&gt;
 digitalWrite(escPin, HIGH);&lt;br /&gt;
 delayMicroseconds(min_throttle);&lt;br /&gt;
 digitalWrite(escPin, LOW);&lt;br /&gt;
 delay(20);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14357</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14357"/>
				<updated>2021-03-16T07:23:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Tests réalisés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Capteurs de distance}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons connecté un seul capteur pour commencer sur une platine à essai avec un arduino uno avec le programme fourni par le constructeur, et avons vérifié que le capteur &lt;br /&gt;
 nous donne une valeur correcte. Nous avons ensuite connecté les 3 capteurs en série sur la platine d'essai toujours, et avons vérifié qu'ils affichaient une valeur différente &lt;br /&gt;
 grâce à leur différente adresse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gyroscope}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteur brushless}}==&lt;br /&gt;
&lt;br /&gt;
 Nous avons testé plusieurs codes qui permettaient de faire tourner le moteur mais aucun ne le faisait tourner en continu. Pour ce faire, nous avons modifié un code qui &lt;br /&gt;
 permettait de faire du RUN / STOP pendant un certain temps fixé. (voir ci-contre) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Moteurs MDP}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Plaque pastillée}}==&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14355</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14355"/>
				<updated>2021-03-16T07:10:46Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* Travail à réaliser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;br /&gt;
&lt;br /&gt;
= Tests réalisés =&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14317</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14317"/>
				<updated>2021-03-15T15:10:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code général}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;  // Déclaration des sensors&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();  // Déclaration des variable et des fonctions&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
  runLame(); // fonction qui fait tourner le moteur de coupe&lt;br /&gt;
&lt;br /&gt;
  // Affiche les différentes valeurs des capteurs&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init(); // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH); // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14311</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14311"/>
				<updated>2021-03-15T15:01:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);  // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);  // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14307</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14307"/>
				<updated>2021-03-15T14:58:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Tâches individuelles}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur à l'état haut et l'arrêter à l'état bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14306</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14306"/>
				<updated>2021-03-15T14:58:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);   // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14305</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14305"/>
				<updated>2021-03-15T14:57:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14297</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14297"/>
				<updated>2021-03-15T14:40:15Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 5;  // pin de commande &lt;br /&gt;
int a= digitalRead(13); // pin interrupteur &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial &lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT); // on met le pin en sortie pour pouvoir le piloter&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH); // fait un signal carré qui permet la commutation rapide entre état haut et bas,  ce qui permet de faire tourner le moteur&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14292</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14292"/>
				<updated>2021-03-15T14:36:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int a= digitalRead(13);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial USB&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  // Affiche les différentes valeurs du capteur&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14289</id>
		<title>RobotTondeuse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=RobotTondeuse&amp;diff=14289"/>
				<updated>2021-03-15T14:33:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tondeuse : /* {{Bleu|Code des différents composants}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Catégorie:Projets]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Présentation du projet=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo tondeuse autonome.png|500px||turbo tondeuse]] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.husqvarna.com/fr/produits/robots-tondeuses/ Site Marchand]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
Le projet consiste à fabriquer un robot tondeuse autonome capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Tâches individuelles}}==&lt;br /&gt;
&lt;br /&gt;
* Arel RAKO : &lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
      - programmé et connecté le capteur&lt;br /&gt;
&lt;br /&gt;
    * moteur brushless &lt;br /&gt;
      - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie&lt;br /&gt;
&lt;br /&gt;
    * interrupteur&lt;br /&gt;
      - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas&lt;br /&gt;
&lt;br /&gt;
    * plaque pastillée&lt;br /&gt;
      - toutes les soudures de la plaque, qui seront détaillés un peu plus tard&lt;br /&gt;
* Anthony JEAN-BAPTISTE-ADOLPHE :&lt;br /&gt;
&lt;br /&gt;
    * gyroscope MPU9250&lt;br /&gt;
     - programmé et connecté le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * capteur VL53L1X&lt;br /&gt;
     - programmation pour faire fonctionner 3 capteurs en même temps avec le gyroscope aussi&lt;br /&gt;
&lt;br /&gt;
    * code général&lt;br /&gt;
     - programmation&lt;br /&gt;
&lt;br /&gt;
    * différentes soudures&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Découpage fonctionnel}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:tondeuse_fonctions.jpg|600px||découpage fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
= Travail à réaliser =&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Objectif}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il conviendra de :&lt;br /&gt;
&lt;br /&gt;
- '''rechercher''' des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants ) &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''dimensionner''' les composants utilisés &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''tester''' les différents blocs fonctionnels &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''programmer''' les composants &amp;lt;br /&amp;gt;&lt;br /&gt;
- '''valider''' le fonctionnement &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Choix des composants}}==&lt;br /&gt;
&lt;br /&gt;
- 3 capteurs de distance VL53L1X &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 arduino uno &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 shield avec drivers &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 gyroscope MPU9250 &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 batterie EMMERICH 12.8V &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 abaisseur de tension LM2596 &amp;lt;br /&amp;gt; &lt;br /&gt;
- 1 moteur brushless &amp;lt;br /&amp;gt;&lt;br /&gt;
- 1 interrupteur &amp;lt;br /&amp;gt;&lt;br /&gt;
- 2 moteurs MDP (moteurs des roues) &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo VL53L1X.jpg|300px||VL53L1x]]  [[Fichier:Photo arduino uno.png|300px||Arduino Uno]]&lt;br /&gt;
[[Fichier:Photo MPU9250.jpg|300px||MPU9250]]  [[Fichier:Photo LM2596.jpg|300px||LM2596]]&lt;br /&gt;
[[Fichier:Photo moteur brushless.jpg|300px||Moteur Brushless]]&lt;br /&gt;
[[Fichier:Driver.png|200px||Driver]]&lt;br /&gt;
[[Fichier:MoteurMDP.jpg|200px|Moteur MDP]]&lt;br /&gt;
[[Fichier:Interrupteur.jpg|200px|Interrupteur]]&lt;br /&gt;
[[Fichier:Batterie 12.8V.jpg|200px|Batterie]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tondeuse composants.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Explications}}==&lt;br /&gt;
&lt;br /&gt;
* les capteurs de distance&lt;br /&gt;
&lt;br /&gt;
    * connectés en I2C via les ports SCL et SDA de l'arduino &lt;br /&gt;
    * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)&lt;br /&gt;
    * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision &lt;br /&gt;
    * détails de fonctionnement: &amp;lt;br /&amp;gt; &lt;br /&gt;
      - si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite &lt;br /&gt;
      - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche &lt;br /&gt;
      - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite &lt;br /&gt;
&lt;br /&gt;
* le gyroscope&lt;br /&gt;
&lt;br /&gt;
    * connecté en I2C comme les capteurs de distance&lt;br /&gt;
    * alimenté en 5V comme les capteurs de distance &lt;br /&gt;
    * prend la valeur de 100 angles et fait leur moyenne pour plus de précision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* moteur brushless&lt;br /&gt;
&lt;br /&gt;
    * connecté à un pin PWM de l'arduino pour pouvoir le piloter&lt;br /&gt;
    * alimenté directement via la batterie car nécessite 12V &lt;br /&gt;
    * sur le rotor on a mis du scotch pour modéliser la lame&lt;br /&gt;
&lt;br /&gt;
* interrupteur	&lt;br /&gt;
&lt;br /&gt;
    * connecté en PULL-UP à un pin quelconque de l'arduino 	&lt;br /&gt;
    * alimenté en 5V&lt;br /&gt;
    * s'il envoie 1, le moteur brushless commence à tourner, s'il envoie 0, le moteur s'arrête '''Attention! Prévoir 5 secondes pour l'arrêt du moteur''' &lt;br /&gt;
&lt;br /&gt;
* abaisseur de tension&lt;br /&gt;
&lt;br /&gt;
    * transforme le 12V de la batterie en 5V pour alimenter les capteurs&lt;br /&gt;
&lt;br /&gt;
* plaque pastillée&lt;br /&gt;
&lt;br /&gt;
    * constituée de 6 parties:&lt;br /&gt;
      - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension&lt;br /&gt;
      - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur&lt;br /&gt;
      - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino&lt;br /&gt;
      - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino&lt;br /&gt;
      - masse du 12V &lt;br /&gt;
      - masse du 5V&lt;br /&gt;
&lt;br /&gt;
* moteurs MDP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Programmation}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code des différents composants}}===&lt;br /&gt;
&lt;br /&gt;
* programmation des capteurs de distance &lt;br /&gt;
  -Bibliothèque  pour le capteur de distance : [https://github.com/pololu/vl53l1x-arduino/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code distance}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
 #include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 VL53L1X sensor;   // Déclaration des sensors&lt;br /&gt;
 VL53L1X sensor2;&lt;br /&gt;
 VL53L1X sensor3;&lt;br /&gt;
&lt;br /&gt;
 //USE_I2C_2V8K;&lt;br /&gt;
 void setup()&lt;br /&gt;
 {&lt;br /&gt;
  pinMode(2, OUTPUT);  // On déclare les pins en sortie&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
   &lt;br /&gt;
  digitalWrite(2, LOW);  // On met les sorties à l'état bas pour définir leurs adresses&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
  &lt;br /&gt;
 // Initialisation I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);  // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33); // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH); // On met la sortie à l'état haut pour définir l'adresse de la sortie&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();  // On initialise le capteur&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);  // On définit l'adresse du capteur&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);  // On n'a pas besoin de définir l'adresse du premier capteur, il garde son adresse de base&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);  // On définit le mode du capteur&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;); // C'est un programme pour voir combien et quelles sont adresses des différents composants utilisant l'I2C&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } // end of good response&lt;br /&gt;
  } // end of for loop&lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void loop()&lt;br /&gt;
 {&lt;br /&gt;
  Serial.print(&amp;quot;Sensor1: &amp;quot;);  &lt;br /&gt;
  Serial.print(sensor.read());  // écrit la distance du capteur 1&lt;br /&gt;
  if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor2: &amp;quot;);  // écrit la distance du capteur 2&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  if (sensor2.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Serial.print(&amp;quot;Sensor3: &amp;quot;);  // écrit la distance du capteur 3&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
  if (sensor3.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  delay(500);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteur brushless avec l'interrupteur&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code brushless}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt; &lt;br /&gt;
const int escPin = 3;&lt;br /&gt;
int a= digitalRead(13);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  //Init Serial USB&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(F(&amp;quot;Initialize System&amp;quot;));&lt;br /&gt;
  //Init ESC&lt;br /&gt;
  pinMode(escPin, OUTPUT);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
void loop() {&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
a= digitalRead(13);&lt;br /&gt;
Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
if(a&amp;lt;1)&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
 Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
}else {&lt;br /&gt;
  Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation gyroscope&lt;br /&gt;
  - Bibliothèque du MPU9250 : [https://github.com/bolderflight/MPU9250#mpu9250/lien Bibliothèque]&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code gyro}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double moyenne;&lt;br /&gt;
double moyenneFinal;&lt;br /&gt;
int i;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double Module_magnetic;&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
  double Zmagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  Zmagnetic = IMU.getMagZ_uT();&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic; // formule pour définir l'angle en degré&lt;br /&gt;
  Module_magnetic = sqrt(Module_magnetic);&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degré&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(!Serial) {}&lt;br /&gt;
&lt;br /&gt;
  // début de la communication IMU&lt;br /&gt;
  status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Status: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    while(1) {}&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  //Module du champ&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;  &amp;quot;); &lt;br /&gt;
  Serial.print(&amp;quot;Angle  &amp;quot;);  //en degré&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (i=0; i&amp;lt;100; i++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  Serial.print(&amp;quot;Moyenne : &amp;quot;);&lt;br /&gt;
  Serial.println(moyenneFinal);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;AccelX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelX_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelY_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;AccelZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getAccelZ_mss(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroX_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroY : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroY_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;GyroZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getGyroZ_rads(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagX : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagX_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagY: &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagY_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\t&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;MagZ : &amp;quot;);&lt;br /&gt;
  Serial.print(IMU.getMagZ_uT(),6);&lt;br /&gt;
  Serial.print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  Serial.print(&amp;quot;Temp : &amp;quot;);&lt;br /&gt;
  Serial.println(IMU.getTemperature_C(),6);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
* programmation moteurs MDP&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code moteurs MDP}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop {&lt;br /&gt;
&lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Code général}}===&lt;br /&gt;
&lt;br /&gt;
{{boîte déroulante/début|titre=Code_tondeuse}}&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Arduino.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Moteurs.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int E1 = 5;     // Moteur droite&lt;br /&gt;
int M1 = 4;     &lt;br /&gt;
int E2 = 6;     // Moteur gauche&lt;br /&gt;
int M2 = 7;&lt;br /&gt;
&lt;br /&gt;
int escPin = 5; // Pin de contrôle moteur simulation lame&lt;br /&gt;
int a = digitalRead(12);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
VL53L1X sensor2;&lt;br /&gt;
VL53L1X sensor3;&lt;br /&gt;
MPU9250 IMU(Wire,0x68);&lt;br /&gt;
&lt;br /&gt;
int status;&lt;br /&gt;
&lt;br /&gt;
void setupLaser();&lt;br /&gt;
void setupLame();&lt;br /&gt;
void runLame();&lt;br /&gt;
void setupMoteurs();&lt;br /&gt;
double readGyro();&lt;br /&gt;
void setupGyro();&lt;br /&gt;
double angle();&lt;br /&gt;
void Moteurs();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000);&lt;br /&gt;
  setupGyro();&lt;br /&gt;
  setupLaser();&lt;br /&gt;
  setupMoteurs();&lt;br /&gt;
  //setupLame();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(){  &lt;br /&gt;
              &lt;br /&gt;
    runLame();&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot; Distance 1 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 2 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor2.read());&lt;br /&gt;
  Serial.print(&amp;quot; - Distance 3 : &amp;quot;);&lt;br /&gt;
  Serial.print(sensor3.read());&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\tEtat: &amp;quot;);&lt;br /&gt;
  Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));&lt;br /&gt;
  Serial.print(&amp;quot; Angle : &amp;quot;);&lt;br /&gt;
  Serial.println(angle());&lt;br /&gt;
&lt;br /&gt;
  runLame();&lt;br /&gt;
&lt;br /&gt;
  if((sensor3.read())&amp;lt;=150) //capteur 3 est à droite&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //tourner à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 180);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor2.read())&amp;lt;=200) //capteur 2 est devant milieu&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // reculer à gauche&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 100);&lt;br /&gt;
    analogWrite(E2, 200);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,LOW); // arrêt&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 0);&lt;br /&gt;
    analogWrite(E2, 0);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); //marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  runLame();&lt;br /&gt;
  if((sensor.read())&amp;lt;=150) //capteur 1 est à gauche&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,LOW); // tourner à droite&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 150);&lt;br /&gt;
    delay(300);&lt;br /&gt;
  }else &lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(M1,HIGH); // marche avant&lt;br /&gt;
    digitalWrite(M2,LOW);&lt;br /&gt;
    analogWrite(E1, 150);&lt;br /&gt;
    analogWrite(E2, 170);&lt;br /&gt;
    delay(30);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  runLame();&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
double angle(){&lt;br /&gt;
  double angle;&lt;br /&gt;
  double Xmagnetic;&lt;br /&gt;
  double Ymagnetic;&lt;br /&gt;
&lt;br /&gt;
  IMU.readSensor();&lt;br /&gt;
&lt;br /&gt;
  Xmagnetic = IMU.getMagX_uT();&lt;br /&gt;
  Ymagnetic = IMU.getMagY_uT();&lt;br /&gt;
  &lt;br /&gt;
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres&lt;br /&gt;
  if (angle&amp;lt;0) {angle=angle+360;}&lt;br /&gt;
  &lt;br /&gt;
  return angle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupGyro(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation du Gyroscop...&amp;quot;);&lt;br /&gt;
    status = IMU.begin();&lt;br /&gt;
  if (status &amp;lt; 0) {&lt;br /&gt;
    Serial.println(&amp;quot;IMU initialization unsuccessful&amp;quot;);&lt;br /&gt;
    Serial.println(&amp;quot;Check IMU wiring or try cycling power&amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Etat: &amp;quot;);&lt;br /&gt;
    Serial.println(status);&lt;br /&gt;
    Serial.println(&amp;quot;Problème avec le Gyroscop&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  // setting the accelerometer full scale range to +/-8G &lt;br /&gt;
  IMU.setAccelRange(MPU9250::ACCEL_RANGE_8G);&lt;br /&gt;
  // setting the gyroscope full scale range to +/-500 deg/s&lt;br /&gt;
  IMU.setGyroRange(MPU9250::GYRO_RANGE_500DPS);&lt;br /&gt;
  // setting DLPF bandwidth to 20 Hz&lt;br /&gt;
  IMU.setDlpfBandwidth(MPU9250::DLPF_BANDWIDTH_20HZ);&lt;br /&gt;
  // setting SRD to 19 for a 50 Hz update rate&lt;br /&gt;
  IMU.setSrd(19);&lt;br /&gt;
  Serial.println(&amp;quot;Gyroscope opérationnel&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double readGyro(){&lt;br /&gt;
  double moyenne;&lt;br /&gt;
  double moyenneFinal;&lt;br /&gt;
  moyenne = 0;&lt;br /&gt;
  for (int j =0; j&amp;lt;100; j++) &lt;br /&gt;
  {&lt;br /&gt;
    moyenne = moyenne + angle();&lt;br /&gt;
    delay(10);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  moyenneFinal = moyenne/100;&lt;br /&gt;
  return moyenneFinal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupLaser(){&lt;br /&gt;
  pinMode(2, OUTPUT); &lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(3, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
&lt;br /&gt;
 // initialise I2C&lt;br /&gt;
  delay(500);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.beginTransmission(0x29);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(3,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor2.init();&lt;br /&gt;
  Serial.println(&amp;quot;01&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor2.setAddress(0x33);&lt;br /&gt;
  Serial.println(&amp;quot;02&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(4,HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  sensor3.init();&lt;br /&gt;
  Serial.println(&amp;quot;03&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
  sensor3.setAddress(0x35);&lt;br /&gt;
  Serial.println(&amp;quot;04&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;09&amp;quot;);&lt;br /&gt;
  sensor.init();&lt;br /&gt;
  Serial.println(&amp;quot;10&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  sensor.setTimeout(100);&lt;br /&gt;
&lt;br /&gt;
  sensor2.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor2.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor2.startContinuous(50);&lt;br /&gt;
  sensor2.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  sensor3.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor3.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor3.startContinuous(50);&lt;br /&gt;
  sensor3.setTimeout(100);&lt;br /&gt;
  &lt;br /&gt;
  delay(150);&lt;br /&gt;
  Serial.println(&amp;quot;addresses set&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  Serial.println (&amp;quot;I2C scanner. Scanning ...&amp;quot;);&lt;br /&gt;
  byte count = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  for (byte i = 1; i &amp;lt; 120; i++)&lt;br /&gt;
  {&lt;br /&gt;
&lt;br /&gt;
    Wire.beginTransmission (i);&lt;br /&gt;
    if (Wire.endTransmission () == 0)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print (&amp;quot;Found address: &amp;quot;);&lt;br /&gt;
      Serial.print (i, DEC);&lt;br /&gt;
      Serial.print (&amp;quot; (0x&amp;quot;);&lt;br /&gt;
      Serial.print (i, HEX);&lt;br /&gt;
      Serial.println (&amp;quot;)&amp;quot;);&lt;br /&gt;
      count++;&lt;br /&gt;
      delay (1);&lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
  Serial.println (&amp;quot;Done.&amp;quot;);&lt;br /&gt;
  Serial.print (&amp;quot;Found &amp;quot;);&lt;br /&gt;
  Serial.print (count, DEC);&lt;br /&gt;
  Serial.println (&amp;quot; device(s).&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setupMoteurs(){&lt;br /&gt;
  Serial.println(&amp;quot;Initialisation des moteurs...&amp;quot;);&lt;br /&gt;
  pinMode(M1, OUTPUT);&lt;br /&gt;
  pinMode(M2, OUTPUT);&lt;br /&gt;
  pinMode(E1, OUTPUT);&lt;br /&gt;
  pinMode(E2, OUTPUT);&lt;br /&gt;
  Serial.println(&amp;quot;Moteurs opérationnels&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void runLame(){&lt;br /&gt;
  pinMode (5, OUTPUT);&lt;br /&gt;
  pinMode (12, INPUT);&lt;br /&gt;
&lt;br /&gt;
  a= digitalRead(12);&lt;br /&gt;
  if(a&amp;lt;1){&lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;br /&gt;
    &lt;br /&gt;
       Serial.println(a);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(escPin, HIGH);&lt;br /&gt;
  delayMicroseconds(1350);&lt;br /&gt;
  digitalWrite(escPin, LOW);&lt;br /&gt;
  delay(20);&lt;br /&gt;
      }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Moteurs()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  //mode marche avant (m1 high m2 low)&lt;br /&gt;
  //mode marche arrière (m1 low m2 high)&lt;br /&gt;
  //tourner à gauche (m1 high m2 high)&lt;br /&gt;
  //tourner à droite (m1 low m2 low)&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
    digitalWrite(M1,LOW);&lt;br /&gt;
    digitalWrite(M2,HIGH);&lt;br /&gt;
    analogWrite(E1, 255);&lt;br /&gt;
    analogWrite(E2, 255);&lt;br /&gt;
    delay(30);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// End of file&lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
{{boîte déroulante/fin}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Vidéos}}==&lt;br /&gt;
[https://www.youtube.com/watch?v=N13t8mgYYdE&amp;amp;ab_channel=AnthonyJeanBaptisteAdolphe/ Vidéo de démonstration du robot qui roule] &amp;lt;br/ &amp;gt;&lt;br /&gt;
[https://youtu.be/lpB92UMG2C8/ Vidéo du moteur de coupe]&lt;/div&gt;</summary>
		<author><name>Tondeuse</name></author>	</entry>

	</feed>