Catégories
Algorithme Arduino Commande des moteurs électronique Mécatronique moteur Projets Arduino Projets électroniques pwm Variateur de vitesse

Drone | Arduino #13: Test et la command d’un drone Bicopter avec un Joystick

Objectifs

  • Savoir commander son drone avec un Joystick
  • Savoir varier la vitesses des moteurs avec Arduino
  • Connaitre la vitesse minimale de démarrage des moteurs
  • Etc.

Lecture du joystick

Dans ce tuto on va faire varier la vitesse d’un drone bicopteur (deux moteurs) en utilisant un Joystick et une carte Arduino. Le Joytick est branché via le pin analogique A0. Il est alimenté par la tension 5V  et GND. L’objectif et de faire varier la vitesse du drone entre 0 (joystick au repos) et Vmax (Joystick dans la valeur maximale). La valeur Vmax de la vitesse sera définie par l’utilisateur comme une constante dans le programme.

Le joystick est équivalent à un potentiomètre à point milieu. Au repos, la tension au borne du joystick est égale à 5/2=2.5V. De plus on dispose de deux sens : (-) 2.5 vers 0V ou (+) 2.5V vers 5V. Ce mode de fonctionnement n’est pas compatible avec la commande du drone désirée. Notre objectif, au repos la tension mesurée doit être égal à 0. Lorsque on avance le Joystik vers (+) ou (-) on aimera bien avoir une augmentation de la vitesse vers la valeur maximale.

La fonction GetVitesse() sera utilisé pour faire des adaptation ainsi retourner une valeur de la vitesse comprise  entre 0 et Vmax en fonction de l’état du Joystick. La fonction prend en entrée le pin analogique du Joystick et la vitesse maximale désirée. Ci-dessous la définition de a fonction GetVitesse().

Voir le tuto pour plus des explications

double GetVitesse(byte AnalogPin, double VmaxVal)

{

  double x=0.0, V;




  // Lecture de la tension du Joystick  [0, 5V] => [-2.5V, 2.5V]

  x=((double)analogRead(AnalogPin)*5.0/1023.0)-2.5;




  // Normalisation: [-2.5V, 2.5V] => [0, 1V]

  x=(abs(x)/2.5);




  // Conversion en Vitesse de la tension: [0, 1] => [0, Vmax]

  V=x*VmaxVal;




  return V;

}

Comment faire varier la vitesse des moteurs ?

On peut faire la vitesse des moteurs d’une façon indépendante en utilisant un rapport cyclique différent.  La bibliothèque  <Servo.h> dédiée aux servos moteurs peut être utilisée pour la commande des moteurs brushless. Elle permet de générer un signal PWM d’une fréquence fixe égale à 50 Hz (période de 20 ms) avec la possibilité de faire varié le rapport cyclique. La valeur 0 du rapport cyclique correspond à une vitesse minimale (0), 180 pour la vitesse maximale. Ci-dessous les étapes et les syntaxes d’utilisation d’un ou plusieurs moteurs.

Déclaration des moteurs

On peut déclarer un plusieurs moteurs en utilisateur le type Servo comme indiqué ci-dessous :

#include <Servo.h>



Servo M1, M2, ...;

Affectation des moteurs aux pins de la carte

L’affectation des variables M1, M2, etc. aux pins digitales de la carte Arduino doit être effectuée à l’intérieur de la fonction setup(). Il ne faut pas oublié de déclarer les constantes des pins comme indiqué dans l’exemple ci-dessous.

#define PinM1       9

#define PinM2       10



void setup()

{

Affectation des pins au servomoteur 

  M1.attach(PinM1);

  M2.attach(PinM2);

  …

}

Variation de la vitesse des moteurs

Après l’étape de déclaration et affectation des pins, grâce à la fonction write(vitesse_0_180) on peut facilement faire varier le rapport d’un pin digital. Autrement dit, la vitesse du moteur ! La fonction write prend en entrée une valeur comprise entre 0(0%) et 180 (100%). Ci-dessous un exemple qui permet d’affecter la même vitesse à deux moteurs :

...
M1.write(Vitesse_0); // 0-180

M2.write(Vitesse_0); // 0-180
...

Programme Arduino

#include <math.h>
#include <Servo.h>
#define PinM1 10
#define PinM2 9
#define Vmax 70.00 // [0(0%)-180(100%)]: Décollage à >75




double Vitesse_0=0.0;
Servo M1, M2;



void setup()
{
// Affectation des pins au servomoteur
M1.attach(PinM1);
M2.attach(PinM2);

// Port série: Affichage de la vitesse
Serial.begin(9600);
}
void loop()
{
// Lecture du Joystick
Vitesse_0=GetVitesse(A0, Vmax);

// Mise à jour de la vitesse des moteurs
M1.write(Vitesse_0); // 0-180
M2.write(Vitesse_0); // 0-180


// Affichage de la vitesse
Serial.println(Vitesse_0); // Vitesse réelle
//Serial.println(100.0*Vitesse_0/Vmax); // Vitesse en %
}


double GetVitesse(byte AnalogPin, double VmaxVal)
{
double x=0.0, V;

// Lecture de la tension du Joystick [0, 5V] => [-2.5V, 2.5V]
x=((double)analogRead(AnalogPin)*5.0/1023.0)-2.5;

// Normalisation: [-2.5V, 2.5V] => [0, 1V]
x=(abs(x)/2.5);

// Conversion en Vitesse de la tension: [0, 1] => [0, Vmax]
V=x*VmaxVal;

return V;
}

Alimentation locale du Drone

L’lamentation de l’ordinateur utilisée dans les vidéos précédentes (12V/8A) n’est pas suffisante pour faire fonctionner les deux moteurs au même temps. Nous avons utilisez donc une batterie de voiture 70Ah/12V muni d’un chargeur adapté pour nos tests. Ci-dessous la référence de la batterie ainsi un chargeur universel 12V/24V.

Accueil Drone avec Arduino

Laisser un commentaire