Outils pour utilisateurs

Outils du site


wiki:god:maverick:programmation_de_la_carte_de_vol

Ceci est une ancienne révision du document !


L’informatique du drone (la programmation)

Pour l'informatique, c'est de l'artisanal !

Nous utilisons l'interface Arduino pour compiler et uploader le code sur la carte et emacs pour éditer le code (Notez pour ça qu'il faut activer l'option “utiliser un éditeur externe”).

Les codes que nous avons utlisés :

Pour la centrale inertielle nous avons utilisé le code de Jeff Rowberg. Pour l'installation : http://42bots.com/tutorials/arduino-uno-and-the-invensense-mpu-6050-6dof-imu/

afficherDistanceSol.ino
/* Utilisation du capteur Ultrason HC-SR04 */
 
#define US_TRIG 12
#define US_ECHO 8
 
// Programme pour afficher la distance entre le drone et la surface en
// dessous (en général le sol)
 
long lecture_echo;
long cm;
 
void setup()
{
  // Initialisation
 
  pinMode(US_TRIG, OUTPUT);
  digitalWrite(US_TRIG, LOW);
 
  pinMode(US_ECHO, INPUT);
  Serial.begin(9600);
}
 
void loop()
{
  // mettre US_TRIG à haut pendant 10 microsecondes
  digitalWrite(US_TRIG, HIGH);
  delayMicroseconds(10);
 
  // remettre ensuite US_TRIG à bas
  digitalWrite(US_TRIG, LOW);
 
  // récupérer la durée du signal de réponse
  lecture_echo = pulseIn(US_ECHO, HIGH);
  // transformer le résultat vers la bonne unitée
  cm = lecture_echo / 58;
 
  // Afficher la distance
  Serial.print("Distance m : ");
  Serial.println(lecture_echo);
 
  // Attendre avant la prochaine lecture
  delay(1000);
}

Note :
Dans les codes suivants, nous parlons de valeur transmise aux moteurs. Pour commencer, cette valeur est transmise aux ESC et pas aux moteurs. L'ESC se débrouillera lui même avec le moteur. De plus il est important de différencier plusieurs valeurs :
- La valeur sous laquelle l'ESC ne sait même pas qu'il reçoit quelque chose
- La valeur au dessus de laquelle le moteur commence à tourner
- La valeur maximale que l'ESC peut transmettre
Au dessus de la première valeur, le moteur s'initialise, et c'est cette valeur que le programme suivant recherche.

afficherValeursMPU.ino
#include <Servo.h>
 
#define MAXESC1 2000
#define MINESC1 700
#define ESC1 9
#define PAS 5
 
 // Programme pour faire varier la puissance d'un moteur.
 // Utile pour déterminer la valeur minimum à appliquer au moteur pour l'initialiser
 
 
void setup() {
  Servo esc1;
  int val = MINESC1;
  char c;
 
  Serial.begin(9600);
  Serial.println("DEBUT OK");
 
  // initialiser la variable ESC
  esc1.attach(ESC1);
 
  // Attendre 1 seconde
  delay(1000);
 
  // Affecter la valeur minimale à l'ESC
  esc1.writeMicroseconds(MINESC1);
  Serial.println("MIN OK");
 
  Serial.println(val);		// Afficher la valeur initiale
 
  while(1) {			// Jusqu'à la fin
 
    while (!Serial.available()); // Attendre un caractère
    c = Serial.read();
    if(c == 'p') {		// Si p : augmenter la vitesse
      val += PAS;
      esc1.writeMicroseconds(val);
    }
    else if(c == 'm') {		// Si m : diminuer la vitesse
      val -= PAS;
      esc1.writeMicroseconds(val);
    }
    else			// Sinon, message d'erreur
      Serial.println("non reconnu");
 
    Serial.println(val);
  }  
 
}
 
void loop() {  
 
}

Note : Pour appliquer ce code à un autre ESC, il suffit de modifier la valeur de ESC1.

Note 2 : MINESC1 est la valeur trouvée par le programme précédent.

Note 3 : MAXESC1 a été trouvée sur internet et n'as pas plus de fondements.

calibrationFinaleESC1.ino
#include <Servo.h>
 
#define MAXESC1 2000
#define MINESC1 703
#define ESC1 9
 
// Programme pour calibrer le premier ESC 
 
// la valeur de MINESC1 est trouvée avec le programmer
// varierVitesseMoteur Avec la valeur min, à l'établissement du
// courant, le moteur doit se comporter comme sur la documentation. En
// ce qui nous concerne, une suite de bips
 
void setup() {
  Servo esc1;
  char c;
 
 
  // Début prg
  Serial.begin(9600);
  esc1.attach(ESC1);
  Serial.println("DEBUT OK");
 
  // Attendre 1 seconde
  delay(1000);
 
  // Mettre au max
  esc1.writeMicroseconds(MAXESC1);
 
  // Brancher batterie à ce moment
 
  Serial.println("Connecter la batterie et attendre les bips\nEnsuite envoyer un char");
 
  // Attendre autorisation utilisateur
  while (!Serial.available());
  c = Serial.read();
 
  // Écrire la valeur minimale
  esc1.writeMicroseconds(MINESC1);
 
}
 
void loop() {  
 
}

Note : Pour calibrer les autres ESCs, changez la valeur de ESC1 et MINESC1

Puisque le servo ne réagit pas aux valeurs par défaut, le programme suivant sert à trouver la valeur minimum et la valeur maximumde ce modèle

calibrationServo.ino
#include <Servo.h>
 
#define SERVO_PIN_CMD 6
 
// Programme pour rechercher la plage de valeur du servomoteur
 
// Envoyer un caractère quelconque pour tester la valeur suivante
// Envoyer s (select) si le servo commence à se déplacer
// Envoyer s (select) de nouveau si le servo arrête de se déplacer
 
void setup() {
 
  // Déclarations
  Servo servo;
  char c;
  int val = 0;
  int pas = 20;
  int min = 0, max = 0;
 
  Serial.begin(9600);
  Serial.println("DEBUT OK\nEn attente");
 
  while(!Serial.available());	// Attendre un caractère pour commencer la recherche
  c = Serial.read();
 
  while(min == 0 || max == 0) {	// Tant que les deux valeurs n'ont pas été trouvés
    Serial.println(val);	// Afficher la valeur courante
 
    servo.attach(6, val, val);	// Initialiser le servo avec la valeur
    servo.write(0);
 
    while(!Serial.available());	// Attendre avant la valeur suivante
    c = Serial.read();
 
    if(c == 's') {		// Si l'utilisateur selectionne cette valeur
        if(min == 0) min = val;	// modifier la bonne variable
        else max = val;
    }
 
    servo.detach();		// Relacher le servo
    val += pas;			// Incrémenter la valeur
  }
 
  Serial.println("FIN\nTESTS !");
 
  while(!Serial.available());
  c = Serial.read();
 
  // Utiliser la plage trouvée
  servo.attach(6, min, max);
  servo.write(0);
  while(!Serial.available());
  c = Serial.read();
  servo.write(180);
  while(!Serial.available());
  c = Serial.read();
 
}
 
void loop() {
 
}

Le programme suivant ne compile pas, il faut d'abord renseigner les constantes min et max, qui sont trouvées grace au code précédent.

varierOrientationServo.ino
#include <Servo.h>
 
#define SERVO_PIN_CMD 6
#define SERVO_MIN_VAL
#define SERVO_MAX_VAL
 
// Programme pour tester le servomoteur
 
void setup() {
 
  // Déclarations
  Servo servo;
  char c;
 
  // Initialisation
  servo.attach(SERVO_PIN_CMD, SERVO_MIN_VAL, SERVO_MAX_VAL);
 
  // Attendre l'utilisateur pour mettre à 0°
  while(!Serial.available());
  c = Serial.read();
  servo.write(0);
 
  // Attendre l'utilisateur pour mettre à 90°
  while(!Serial.available());
  c = Serial.read();
  servo.write(90);
 
  // Attendre l'utilisateur pour mettre à -90°
  while(!Serial.available());
  c = Serial.read();
  servo.write(-90);
 
}
 
void loop() {
 
}

Nous avons rencontré plusieurs difficultés à cette étape. À commencer par les premiers pas dans l'embarqué. Heureusement, le Web était là pour nous aider à trouver les différentes commandes nécessaire, par exemple pour communiquer avec un moteur, un servo-moteur et surtout la centrale inertielle.

wiki/god/maverick/programmation_de_la_carte_de_vol.1435676960.txt.gz · Dernière modification: 2016/09/11 11:00 (modification externe)