Ceci est une ancienne révision du document !
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/
/* 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.
#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.
#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
#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.
#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.