RobotTondeuse : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
({{Bleu|Programmation}})
({{Bleu|Programmation}})
Ligne 128 : Ligne 128 :
 
* programmation des capteurs de distance  
 
* programmation des capteurs de distance  
  
#include <Arduino.h>
 
 
  #include <Wire.h>
 
  #include <Wire.h>
 
  #include <VL53L1X.h>
 
  #include <VL53L1X.h>
Ligne 136 : Ligne 135 :
 
  VL53L1X sensor3;
 
  VL53L1X sensor3;
  
  void setupLaser();
+
  //USE_I2C_2V8K;
  void setupLaser(){
+
  void setup()
   pinMode(2, OUTPUT);  
+
{
 +
   pinMode(2, OUTPUT);
 
   pinMode(3, OUTPUT);
 
   pinMode(3, OUTPUT);
 
   pinMode(4, OUTPUT);
 
   pinMode(4, OUTPUT);
 
+
 
 
   digitalWrite(2, LOW);
 
   digitalWrite(2, LOW);
 
   digitalWrite(3, LOW);
 
   digitalWrite(3, LOW);
 
   digitalWrite(4, LOW);
 
   digitalWrite(4, LOW);
 
+
 
  // initialise I2C
+
  // Initialisation I2C
 
   delay(500);
 
   delay(500);
 
   Wire.begin();
 
   Wire.begin();
 
   Wire.beginTransmission(0x29);
 
   Wire.beginTransmission(0x29);
 +
  Serial.begin (9600);
  
 
   digitalWrite(3,HIGH);
 
   digitalWrite(3,HIGH);
Ligne 173 : Ligne 174 :
 
   Serial.println("10");
 
   Serial.println("10");
 
   delay(100);
 
   delay(100);
 +
 
   sensor.setDistanceMode(VL53L1X::Long);
 
   sensor.setDistanceMode(VL53L1X::Long);
 
   sensor.setMeasurementTimingBudget(50000);
 
   sensor.setMeasurementTimingBudget(50000);
Ligne 193 : Ligne 195 :
 
   Serial.println ("I2C scanner. Scanning ...");
 
   Serial.println ("I2C scanner. Scanning ...");
 
   byte count = 0;
 
   byte count = 0;
 
  
 
   for (byte i = 1; i < 120; i++)
 
   for (byte i = 1; i < 120; i++)
Ligne 207 : Ligne 208 :
 
       Serial.println (")");
 
       Serial.println (")");
 
       count++;
 
       count++;
       delay (1);
+
       delay (1);
 
     } // end of good response
 
     } // end of good response
 
   } // end of for loop
 
   } // end of for loop
Ligne 214 : Ligne 215 :
 
   Serial.print (count, DEC);
 
   Serial.print (count, DEC);
 
   Serial.println (" device(s).");
 
   Serial.println (" device(s).");
 +
 +
 
}
 
}
 +
 +
void loop()
 +
{
 +
  Serial.print("Sensor1: ");
 +
  Serial.print(sensor.read());
 +
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 +
  Serial.println();
 +
  delay(500);
 +
  Serial.print("Sensor2: ");
 +
  Serial.print(sensor2.read());
 +
  if (sensor2.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 +
  Serial.println();
 +
  delay(500);
 +
  Serial.print("Sensor3: ");
 +
  Serial.print(sensor3.read());
 +
  if (sensor3.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 +
  Serial.println();
 +
  delay(500);
 +
}
 +
  
  

Version du 15 mars 2021 à 13:05



Présentation du projet

turbo tondeuse Site Marchand





Objectif

Le projet consiste à fabriquer un robot tondeuse capable d'éviter les obstacles grâce à des capteurs de distance et faire tourner un moteur brushless désignant la lame de la tondeuse.

Tâches individuelles

  • Arel RAKO :
   * capteur VL53L1X
     - programmé et connecté le capteur
   * moteur brushless 
     - programmé, connecté, fait les soudures nécessaires pour le connecteur de la batterie
   * interrupteur
     - programmé en PULL UP pour faire tourner le moteur au niveau haut et l'arrêter au niveau bas
   * plaque pastillée
     - toutes les soudures de la plaque, qui seront détaillés un peu plus tard

Découpage fonctionnel

découpage fonctionnel

Travail à réaliser

Objectif

L'objectif sera bien évidemment de terminer le projet de sorte qu'il réponde au cahier des charges décrit précédemment.

Pour ce faire, il conviendra de :

- rechercher des solutions à partir du schéma fonctionnel fourni ( schéma électronique et composants )
- dimensionner les composants utilisés
- tester les différents blocs fonctionnels
- programmer les composants
- valider le fonctionnement


Choix des composants

- 3 capteurs de distance VL53L1X
- 1 arduino uno
- 1 shield avec drivers
- 1 gyroscope MPU9250
- 1 batterie 12.8V
- 1 abaisseur de tension LM2596
- 1 moteur brushless
- 1 interrupteur
- 2 moteurs MDP (moteurs des roues)

VL53L1x Arduino Uno MPU9250 LM2596 Moteur Brushless Driver


Tondeuse composants.jpg

Explications

  • les capteurs de distance
   * connectés en I2C via les ports SCL et SDA de l'arduino 
   * alimentés en 5V via le pin VIN, ils possèdent un régulateur qui transforme le 5V en 2.8V (sortie VDD)
   * placés au côté gauche, droit et au milieu du robot pour avoir un plus grand champ de vision 
   * détails de fonctionnement: 
- si le capteur à gauche détecte un obstacle à moins de 20cm, le robot tourne à droite - si le capteur à droite détecte un obstacle à moins de 20cm, le robot tourne à gauche - si le capteur du milieu détecte un obstacle à moins de 20cm, le robot s'arrête et fait demi-tour vers la droite
  • le gyroscope
   * connecté en I2C comme les capteurs de distance
   * alimenté en 5V comme les capteurs de distance 
   * prend la valeur de 100 angles et fait leur moyenne pour plus de précision


  • moteur brushless
   * connecté à un pin PWM de l'arduino pour pouvoir le piloter
   * alimenté directement via la batterie car nécessite 12V 
   * sur le rotor on a mis du scotch pour modéliser la lame
  • interrupteur
   * connecté en PULL-UP à un pin quelconque de l'arduino 	
   * alimenté en 5V
   * 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 
  • abaisseur de tension
   * transforme le 12V de la batterie en 5V pour alimenter les capteurs
  • plaque pastillée
   * constituée de 6 parties:
     - le 12V pour alimenter l'arduino, on y branche aussi le connecteur AMASS du moteur brushless et l'abaisseur de tension
     - le 5V où sont connectés tous les capteurs, le gyroscope et l'interrupteur
     - SCL où est connecté le pin SCL des capteurs et du gyroscope au pin SCL de l'arduino
     - SDA où est connecté le pin SDA des capteurs et du gyroscope au pin SDA de l'arduino
     - masse du 12V 
     - masse du 5V
  • moteurs MDP


Programmation

  • programmation des capteurs de distance
#include <Wire.h>
#include <VL53L1X.h>
VL53L1X sensor;
VL53L1X sensor2;
VL53L1X sensor3;
//USE_I2C_2V8K;
void setup()
{
 pinMode(2, OUTPUT);  
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
  
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 
// Initialisation I2C
 delay(500);
 Wire.begin();
 Wire.beginTransmission(0x29);
 Serial.begin (9600);
 digitalWrite(3,HIGH);
 delay(150);
 sensor2.init();
 Serial.println("01");
 delay(100);
 sensor2.setAddress(0x33);
 Serial.println("02");
 digitalWrite(4,HIGH);
 delay(150);
 sensor3.init();
 Serial.println("03");
 delay(100);
 sensor3.setAddress(0x35);
 Serial.println("04");
 digitalWrite(2, HIGH);
 delay(150);
 Serial.println("09");
 sensor.init();
 Serial.println("10");
 delay(100);
 sensor.setDistanceMode(VL53L1X::Long);
 sensor.setMeasurementTimingBudget(50000);
 sensor.startContinuous(50);
 sensor.setTimeout(100);
 sensor2.setDistanceMode(VL53L1X::Long);
 sensor2.setMeasurementTimingBudget(50000);
 sensor2.startContinuous(50);
 sensor2.setTimeout(100);
 
 sensor3.setDistanceMode(VL53L1X::Long);
 sensor3.setMeasurementTimingBudget(50000);
 sensor3.startContinuous(50);
 sensor3.setTimeout(100);
 
 delay(150);
 Serial.println("addresses set");
 Serial.println ("I2C scanner. Scanning ...");
 byte count = 0;
 for (byte i = 1; i < 120; i++)
 {
   Wire.beginTransmission (i);
   if (Wire.endTransmission () == 0)
   {
     Serial.print ("Found address: ");
     Serial.print (i, DEC);
     Serial.print (" (0x");
     Serial.print (i, HEX);
     Serial.println (")");
     count++;
     delay (1);
   } // end of good response
 } // end of for loop
 Serial.println ("Done.");
 Serial.print ("Found ");
 Serial.print (count, DEC);
 Serial.println (" device(s).");


}

void loop() {

 Serial.print("Sensor1: ");
 Serial.print(sensor.read());
 if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 delay(500);
 Serial.print("Sensor2: ");
 Serial.print(sensor2.read());
 if (sensor2.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 delay(500);
 Serial.print("Sensor3: ");
 Serial.print(sensor3.read());
 if (sensor3.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
 Serial.println();
 delay(500);

}


  • programmation moteur
const int escPin = 3; // Pin de contrôle moteur
int a= digitalRead(13);


void setup() {
 //Init Serial USB
 Serial.begin(9600);
 Serial.println(F("Initialize System"));
 //Init ESC
 pinMode(escPin, OUTPUT);
}
void loop() {
   
a= digitalRead(13);
Serial.println(a);
if(a<1)
{

Serial.println(a);
}else {
 Serial.println(a);
 digitalWrite(escPin, HIGH);
 delayMicroseconds(1350);
 digitalWrite(escPin, LOW);
 delay(20);
}
}

Vidéos

Vidéo de démonstration