Ceci est une ancienne révision du document !
Not Today
I - Présentation de l’équipe
Les membres et leurs parcours
Nous sommes une équipe composée de 5 personnes de L3 Informatique :
Julien Gourraud (bac STI, DUT informatique)
William Lavoué (bac SSI spé SI)
Salmane Kechkar (bac S)
Yacine Boukhelif(bac S)
Emeric Goga (bac S, 1ère année en PEIP)
Pourquoi participer à cette compétition
Nous sommes très intéressés par cette compétition, car nous voulons mettre en places nos connaissances diverses en Informatique et Électronique, mais également pour le défi technique. La conception et la réalisation d’un drone sera une expérience valorisante tant sur le plan personnel que professionnel. De plus, elle nous permettra de nous confronter aux différents défis que représente le travail en équipe.
La répartition des tâches au sein de l’équipe
Nous avons réparti le travail de la manière suivante
William : Conception de la structure / Électronique
Julien : Électronique / Programmation
Yacine Boukhelif : Impression 3D
Salmane : Programmation / Modélisation mathématique
Emeric : Programmation / Mécanique
II - Type de drone
La structure
Nous avons choisi de réaliser un quadricoptère en X, car ce modèle représente un bon com-promis entre le prix de fabrication et la simplicité de conception ainsi que par la richesse de la documentation disponible.
La structure (cf ci-dessous) sera réalisée à partir de plaques usinées et de tubes en fibres de carbone et les éléments d’assemblage imprimés en ABS. Nous avons choisi cette solution pour sa robustesse, sa légèreté et sa facilité de réalisation avec les moyens fournis par le PMCLab.
Plan 3D du drone
L’électronique et la mécanique du drone
Nous avons choisi des hélices de 10 pouces afin d’avoir un drone stable. Pour les faire tourner, nous avons décidés de prendre des moteurs tournant à une vitesse modérée. La position de l'ensemble sur les tubes sera variable.
Nous avons choisi de faire nous-mêmes la partie électronique du drone avec une carte bien connue : l’Arduino Due. Son avantage est sa simplicité d’utilisation, cette dernière est programmée grâce à son environnement de développement. Elle comporte de nombreuses Entrées/Sortie, ce qui permet de se connecter au mieux à nos différents composants.
Concernant la commande, nous avons opté pour une communication Radio, car c’est un mode de communication très robuste et simple d’utilisation. L'émetteur radio (une manette) comporte 6 canaux, quatre d’entre eux servent à la manœuvre du drone. Il nous en reste donc 2 pour d’autres applications telles qu’un changement de mode grâce au modification des PID.
Pour l’IMU, nous avons choisi une carte Adafruit qui comporte les 3 composants essentiels :
Les moteurs triphasé sont contrôlés à l’aide d’ESCs. Ces derniers sont alimentés par la batterie et contrôlés par la carte Arduino.
Ci-dessous, le montage électronique de notre drone.
IV - Choix et prix des composants
V - Machines-outils
Nous avons utilisé la découpeuse laser pour usiner les 2 plaques de fibre de verre qui servent de “corps” pour le drone.
L’imprimante 3D nous as servi pour réaliser nos éléments d’assemblage :
La programmation se fera sur la carte Arduino grâce à l'environnement de développement Ar-duino.
#include “Wire.h”
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_L3GD20_U.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_10DOF.h>
#include <Servo.h>
#include <PID_v1.h>
//
/VARIABLE RADIO/
//
int vitesse = 0;
const int pinCh1 = A0;
const int pinCh2 = A1;
const int pinCh3 = A2;
const int pinCh4 = A3;
const int pinCh5 = A4;
micros when the pin goes HIGH
volatile unsigned long timer_start1;
volatile unsigned long timer_start2;
volatile unsigned long timer_start3;
volatile unsigned long timer_start4;
volatile unsigned long timer_start5;
difference between timer_start and micros() is the length of time that the pin
was HIGH - the PWM pulse length.
volatile int pulse_time1;
volatile int pulse_time2;
volatile int pulse_time3;
volatile int pulse_time4;
volatile int pulse_time5;
Pour mapper les commandes entre 0 et 100
const int minCh1 = 1190;
const int minCh2 = 1160;
const int minCh3 = 1137;
const int minCh4 = 1125;
const int minCh5 = 9999;
const int maxCh1 = 1930;
const int maxCh2 = 1810;
const int maxCh3 = 1790;
const int maxCh4 = 1890;
const int maxCh5 = 9999;
double ch1 = 0;
double ch2 = 0;
double ch3 = 0;
double ch4 = 0;
double ch5 = 0;
volatile int last_interrupt_time1;
volatile int last_interrupt_time2;
volatile int last_interrupt_time3;
volatile int last_interrupt_time4;
volatile int last_interrupt_time5;
//
/VARIABLES IMU*/
//
/* Assign a unique ID to the sensors */
Adafruit_10DOF dof = Adafruit_10DOF();
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301);
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(30302);
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(18001);
/* Update this with the correct SLP for accurate altitude measurements */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
double pitchKi = 0.5;
double pitchKp = 0;
double pitchKd = 1;
double rollKi = 2;
double rollKp = 5;
double rollKd = 1;
double yawKi = 2;
double yawKp = 5;
double yawKd = 1;
double pitchIN;
double rollIN;
double yawIN;
double pitchOUT;
double rollOUT;
double yawOUT;
IN,OUT,SETPOINT
PID pidPitch(&pitchIN, &pitchOUT, &ch2, pitchKp, pitchKi, pitchKd, REVERSE);
PID pidRoll(&rollIN, &rollOUT, &ch1, rollKp, rollKi, rollKd, REVERSE);
PID pidYaw(&yawIN, &yawOUT, &ch4, yawKp, yawKi, yawKd, DIRECT);
int pitchMin = -30;
int pitchMax = 30;
int rollMin = -30;
int rollMax = 30;
int yawMin = -180;
int yawMax = 180;
//
/VARIABLES MOTORS/
//
Objet servo pour controler les diff�rents moteurs
Servo motor1, motor2, motor3, motor4;
const int pinM1 = 9;
const int pinM2 = 10;
const int pinM3 = 11;
const int pinM4 = 6;
int speedM1 = 0;
int speedM2 = 0;
int speedM3 = 0;
int speedM4 = 0;
int speedM1M3 = 0;
int speedM2M4 = 0;
int pinKill = 3;
volatile int stopAll = 0;
//
/*MAIN*/
//
void setup()
{
Serial.begin(115200);
initSensors();
initInterrupt();
initPID();
initMotors(); 15 SECONDES
pinMode(pinKill, INPUT_PULLUP);
attachInterrupt(pinKill, kill, CHANGE);
pinMode(13, OUTPUT);
}
void loop()
{
Serial.println(stopAll);
if (stopAll>2) {
digitalWrite(13, HIGH); turn the LED on (HIGH is the voltage level)
delay(500); wait for a second
digitalWrite(13, LOW); turn the LED off by making the voltage LOW
delay(500);
}
else {
getSensor();
getRadio();map les cannaux de 0 � 100
calcSpeed();calcul en fontion des commandes et du PID la vitesse � appliquer aux moteurs
updateMotors();met � jour la vitesse des moteurs
/ TEST_affichagePitch();
TEST_affichageCanaux();
TEST_affichageMoteur();
}
}
//
/FONCTIONS RADIO*/
//
void isr1()
{
record the interrupt time so that we can tell if the receiver has a signal from the transmitter
last_interrupt_time1 = micros();
if the pin has gone HIGH, record the microseconds since the Arduino started up
if (digitalRead(pinCh1) == HIGH)
{
timer_start1 = micros();
}
otherwise, the pin has gone LOW
else
{
only worry about this if the timer has actually started
if (timer_start1 > 0)
{
record the pulse time
pulse_time1 = 1)