Sistem de Reglare a Altitudinii Unui Vehicul Aerian Fara Pilot

[NUME_REDACTAT] de cod implementata în mediul de dezvoltare Arduino.

Declarare librari , initializare variabile globale .

#include <Wire.h>

#include "Kalman.h"

#include <SFE_BMP180.h>

#define filterSamples 13

#define RESTRICT_PITCH

SFE_BMP180 pressure;

Kalman kalmanX; // Create the Kalman instances

Kalman kalmanY;

/* IMU Data */

double accX, accY, accZ;

double gyroX, gyroY, gyroZ;

int16_t tempRaw;

double gyroXangle, gyroYangle; // Angle calculate using the gyro only

double kalAngleX, kalAngleY; // Calculated angle using a Kalman filter

uint32_t timer;

uint8_t i2cData[14]; // Buffer for I2C data

int arm = 0;

int pwm=9;

int pwm10=10;

double T=1230;

double baseline; // baseline pressure

double rawData1 , smoothData1;

int sensSmoothArray1 [filterSamples];

Folosind funcția Setup() se declara pini pentru controlul motoarelor , setarea parametrilor pentru senzori , armarea ESC-urilor.

void setup()

{

pinMode(pwm,OUTPUT);

pinMode(pwm10,OUTPUT);

Serial.begin(115200);

Wire.begin();

TWBR = ((F_CPU / 400000L) – 16) / 2; // Set I2C frequency to 400kHz

if (pressure.begin())

Serial.println("BMP180 init success");

else

{

Serial.println("BMP180 init fail (disconnected?)\n\n");

while(1); // Pause forever.

}

i2cData[0] = 7; // Set the sample rate to 1000Hz – 8kHz/(7+1) = 1000Hz

i2cData[1] = 0x00; // Disable FSYNC and set 260 [NUME_REDACTAT] filtering, 256 [NUME_REDACTAT] filtering, 8 KHz sampling

i2cData[2] = 0x00; // [NUME_REDACTAT] [NUME_REDACTAT] Range to ±250deg/s

i2cData[3] = 0x00; // [NUME_REDACTAT] [NUME_REDACTAT] Range to ±2g

while (i2cWrite(0x19, i2cData, 4, false)); // Write to all four registers at once

while (i2cWrite(0x6B, 0x01, true)); // PLL with X axis gyroscope reference and disable sleep mode

while (i2cRead(0x75, i2cData, 1));

if (i2cData[0] != 0x68) { // Read "WHO_AM_I" register

Serial.print(F("Error reading sensor"));

while (1);

}

pinMode(pwm,OUTPUT);

baseline = getPressure();

Serial.print("baseline pressure: ");

Serial.print(baseline);

Serial.println(" mb");

/* Set kalman and gyro starting angle */

while (i2cRead(0x3B, i2cData, 6));

accX = (i2cData[0] << 8) | i2cData[1];

accY = (i2cData[2] << 8) | i2cData[3];

accZ = (i2cData[4] << 8) | i2cData[5];

#ifdef RESTRICT_PITCH

double roll = atan2(accY, accZ) * RAD_TO_DEG;

double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;

#else // Eq. 28 and 29

double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;

double pitch = atan2(-accX, accZ) * RAD_TO_DEG;

#endif

kalmanX.setAngle(roll); // Set starting angle

kalmanY.setAngle(pitch);

gyroXangle = roll;

gyroYangle = pitch;

timer = micros();

delay(5000);

for(arm=0;arm<500;arm += 1)

{

digitalWrite(pwm,HIGH);

digitalWrite(pwm10,HIGH);

delayMicroseconds(1100);

digitalWrite(pwm,LOW);

digitalWrite(pwm10,LOW);

delay(20);

}

}

inițializează și prescrierea valorilor inițiale, folosind funcția Loop(). Aceasta creează o bucla care permite schimbarea variabilelor la fiecare iterație fiind folosita pentru a controla în mod activ placa de dezvoltare.

void loop() {

/* Update all the values */

double PID_1,PID_2;

double error,lastErr,error1,sumErr,sumErr1;

double Last_T;

double impus = 0 ,impus1 = 1; //roll impus

double a,P;

int A_Imp = 1; //altimetru impus

int prop = 1;

double Ri = 0; //roll impus

while (i2cRead(0x3B, i2cData, 14));

accX = ((i2cData[0] << 8) | i2cData[1]) -394;

accY = ((i2cData[2] << 8) | i2cData[3]) -1788;

accZ = ((i2cData[4] << 8) | i2cData[5]) + 1559;

tempRaw = (i2cData[6] << 8) | i2cData[7];

gyroX = (i2cData[8] << 8) | i2cData[9] + 77;

gyroY = (i2cData[10] << 8) | i2cData[11] -4;

gyroZ = (i2cData[12] << 8) | i2cData[13] + 57;

double dt = (double)(micros() – timer) / 1000000; // Calculate delta time

timer = micros();

#ifdef RESTRICT_PITCH

double roll = atan2(accY, accZ) * RAD_TO_DEG;

double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;

#else

double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;

double pitch = atan2(-accX, accZ) * RAD_TO_DEG;

#endif

double gyroXrate = gyroX / 131.0; // Convert to deg/s

double gyroYrate = gyroY / 131.0; // Convert to deg/s

#ifdef RESTRICT_PITCH

// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees

if ((roll < -90 && kalAngleX > 90) || (roll > 90 && kalAngleX < -90)) {

kalmanX.setAngle(roll);

kalAngleX = roll;

gyroXangle = roll;

} else

kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter

if (abs(kalAngleX) > 90)

gyroYrate = -gyroYrate; // Invert rate, so it fits the restriced accelerometer reading

kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt);

#else

// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees

if ((pitch < -90 && kalAngleY > 90) || (pitch > 90 && kalAngleY < -90)) {

kalmanY.setAngle(pitch);

kalAngleY = pitch;

gyroYangle = pitch;

} else

kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt); // Calculate the angle using a Kalman filter

if (abs(kalAngleY) > 90)

gyroXrate = -gyroXrate; // Invert rate, so it fits the restriced accelerometer reading

kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter

#endif

Serial.print(kalAngleX); Serial.print(" kalAngleX \t");

P = getPressure();

a = pressure.altitude(P,baseline);

rawData1 = a ; // read sensor 1

smoothData1 = digitalSmooth(rawData1, sensSmoothArray1); // every sensor you use with digitalSmooth needs its own array

Serial.println(kalAngleX);

Calculu regulatoarelor și aceasta portiune de cod apartine functiei void Loop()

// PI altitud

error1 = impus1 – smoothData1;

if(error1 <= 2 && error1 >= -2)

{

error1 = 0 ;

}

sumErr1 += error1;

PID_2 = 281 * error1 + 0.02 * sumErr1 ;

if(PID_2 >= 100){PID_2= 100;}

if(PID_2 <= -100){PID_2= -100;}

//===============PID balance====================================

error= impus – kalAngleX;

if(error <= 2 && error >= -2)

{

error = 0 ;

}

sumErr += error;

double dErr = (error – lastErr)/dt;

PID_1 = 241 * error + 0.033 * sumErr + dErr * 0.0005;

lastErr=error;

if(PID_1 >= 100){PID_1 = 100;}

if(PID_1 <= -80){PID_1 = -80;}

Comanda

T = 1250 – PID_1 + PID_2 ;

//Serial.println(PID_);

if(T >= 1350)

{T = 1350 ;}

if(T <= 1250)

{T = 1250 ;}

digitalWrite(pwm,HIGH);

delayMicroseconds(T);

digitalWrite(pwm,LOW);

delay(5);

double temperature = (double)tempRaw / 340.0 + 36.53;

delay(50);

Achiyitonare date de la altimetru

double getPressure()

{

char status;

double T,P,p0,a;

status = pressure.startTemperature();

if (status != 0)

{

delay(status);

status = pressure.getTemperature(T);

if (status != 0)

{

status = pressure.startPressure(3);

if (status != 0)

{

delay(status);

status = pressure.getPressure(P,T);

if (status != 0)

{

return(P);

}

else Serial.println("error retrieving pressure measurement\n");

}

else Serial.println("error starting pressure measurement\n");

}

else Serial.println("error retrieving temperature measurement\n");

}

else Serial.println("error starting temperature measurement\n");

}

Filtru de mediere

double digitalSmooth(double rawIn, int *sensSmoothArray){ // "int *sensSmoothArray" passes an array to the function – the asterisk indicates the array name is a pointer

int j, k, temp, top, bottom;

int total;

static int i;

// static int raw[filterSamples];

static int sorted[filterSamples];

boolean done;

i = (i + 1) % filterSamples; // increment counter and roll over if necc. – % (modulo operator) rolls over variable

sensSmoothArray[i] = rawIn; // input new data into the oldest slot

// Serial.print("raw = ");

for (j=0; j<filterSamples; j++){ // transfer data array into anther array for sorting and averaging

sorted[j] = sensSmoothArray[j];

}

done = 0; // flag to know when we're done sorting

while(done != 1){ // simple swap sort, sorts numbers from lowest to highest

done = 1;

for (j = 0; j < (filterSamples – 1); j++){

if (sorted[j] > sorted[j + 1]){ // numbers are out of order – swap

temp = sorted[j + 1];

sorted [j+1] = sorted[j] ;

sorted [j] = temp;

done = 0;

}

}

}

bottom = max(((filterSamples * 15) / 100), 1);

top = min((((filterSamples * 85) / 100) + 1 ), (filterSamples – 1)); // the + 1 is to make up for asymmetry caused by integer rounding

k = 0;

total = 0;

for ( j = bottom; j< top; j++){

total += sorted[j];

k++;

}

return total / k; // divide by number of samples

}

Bibliografie

[1] ARDA ÖZGÜR KIVRAK, “Design of control systems for a

quadrotor flight vehicle equipped with inertial sensors”, Decembrie 2006

[2] Prof.Dr.Ing. Petru DOBRA, [NUME_REDACTAT], notițe de curs, anul III;

[3] Prof.Dr.Ing. Clemet FEȘTILĂ, [NUME_REDACTAT] Automate II, notițe de curs, anul III;

[4] Samuel W. FERGUSON, “Development and validation of a simulation for a generic tilt-rotor aircraft”, Aprilie 1989

[5] Christopher J. FISHER,” Using an Accelerometer for inclination sensing” , AN-1057

[6] Sl.Dr.Ing. Vlad MURESAN, [NUME_REDACTAT] [NUME_REDACTAT] de Laborator, anul IV;

[7] [NUME_REDACTAT], “Modern control engineering”, editia V,2010

[8] Kendoul, I. Fantoni, and R. Lozano. “Modeling and control of a small autonomous aircraft having two tilting rotors” în Proc. 44th IEEE Conf. [NUME_REDACTAT]/Euro.[NUME_REDACTAT]., Seville, Spain, Dec. 2005, pp. 8144–8149.

[9] Michael J PONT , “Programing embedded system I”, 2002-2006

[10] [NUME_REDACTAT], “Control of Quadcopter”, 2008

[11] Prof.Univ.Dr.Ing. [NUME_REDACTAT], “Ingineria reglarii automate II”, Targu-Mures,1999 [12] BMP180 datasheet www.adafruit.com, 5 Aprilie 2013

[13] MPU-6050 datasheet www. Invensense.com, 8 September 2013 (17)

[14] http://www.aie.ugal.ro/isa/Curs/Curs_10.pdf

[15] http://arduino.cc

[16] http://en.wikipedia.org/wiki/UAV

[17] http://www.analog.com/static/imported-files/tech_docs/dsp_book_Ch15.pdf

[18] http://www.i2cdevlib.com/forums/topic/96-arduino-sketch-to-automatically-calculate-mpu6050-offsets/

[19] http://www.linushelgesson.se/2012/04/pitch-and-roll-estimating-kalman-filter-for- stabilizing-quadrocopters/

[20] http://www.nongnu.org/avrdude/

[NUME_REDACTAT] [NUME_REDACTAT] tabele

Capitolul 1. Introducere

1.1Obiective:

1.2 Specificațiile proiectului

Capitolul 2. Analiza și modelarea matematica a unui vehicul aerian fără pilot

2.1 Analiza vehiculelor aeriene fără pilot

2.2 Selectarea componentelor hardware

2.2.1 Motoare

2.2.2 Regulator electronic de viteza (Electronic speed controller[16])

2.2.4 Accelerometru

2.2.5 Altimetru barometric

2.2.7 Microcontroler

2.3 Analiza și modelarea sistemului

2.3.1 Achiziționarea datelor experimentale

2.3.3 Identificare sistemului de menținere a altitudini

Capitolul 3. Proiectarea sistemului de reglare

3.1 Control convențional

3.2 Sistemul de reglare pe axa orizontala

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 1

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 2

3.3 Sistemul de reglare pe axa verticala

Cap.4 Implementarea și testare sistemului de reglare a altitudinii unui vehicul aerian fără pilot

4.1 [NUME_REDACTAT] vehiculului aerian.

4.1.1 Materiale folosite

4.1.2 Alinierea motoarelor și balansarea prototipului

4.2 Arhitectura sistemului

4.3 Implementarea software a sistemului de reglare.

4.3.1 Concepte generale.

4.3.2 Achiziționarea datelor de la senzori:

4.3.3.1 [NUME_REDACTAT]

4.3.3.2 Implementarea filtrului de mediere cu alunecare FMA

4.3.4 Implementarea sistemului de reglare a poziției pe axa verticala și orizontala

4.4 Testarea sistemului de reglare a altitudinii și stabilizării vehiculului aerian

4.4.1. Testarea sistemului de menținere echilibru

4.4.2 Testarea sistemului de reglare a altitudinii

Capitolul 5. Concluzii

5.1. Contribuții personale

5.2. Direcții de dezvoltare viitoare

[NUME_REDACTAT]

Anexe

PROIECTAREA ȘI IMPLEMENTAREA UNUI SISTEM DE REGLARE A ALTITUDINII UNUI VEHICUL AERIAN FĂRĂ PILOT

[NUME_REDACTAT] [NUME_REDACTAT] tabele

Capitolul 1. Introducere

1.1Obiective:

1.2 Specificațiile proiectului

Capitolul 2. Analiza și modelarea matematica a unui vehicul aerian fără pilot

2.1 Analiza vehiculelor aeriene fără pilot

2.2 Selectarea componentelor hardware

2.2.1 Motoare

2.2.2 Regulator electronic de viteza (Electronic speed controller[16])

2.2.4 Accelerometru

2.2.5 Altimetru barometric

2.2.7 Microcontroler

2.3 Analiza și modelarea sistemului

2.3.1 Achiziționarea datelor experimentale

2.3.3 Identificare sistemului de menținere a altitudini

Capitolul 3. Proiectarea sistemului de reglare

3.1 Control convențional

3.2 Sistemul de reglare pe axa orizontala

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 1

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 2

3.3 Sistemul de reglare pe axa verticala

Cap.4 Implementarea și testare sistemului de reglare a altitudinii unui vehicul aerian fără pilot

4.1 [NUME_REDACTAT] vehiculului aerian.

4.1.1 Materiale folosite

4.1.2 Alinierea motoarelor și balansarea prototipului

4.2 Arhitectura sistemului

4.3 Implementarea software a sistemului de reglare.

4.3.1 Concepte generale.

4.3.2 Achiziționarea datelor de la senzori:

4.3.3.1 [NUME_REDACTAT]

4.3.3.2 Implementarea filtrului de mediere cu alunecare FMA

4.3.4 Implementarea sistemului de reglare a poziției pe axa verticala și orizontala

4.4 Testarea sistemului de reglare a altitudinii și stabilizării vehiculului aerian

4.4.1. Testarea sistemului de menținere echilibru

4.4.2 Testarea sistemului de reglare a altitudinii

Capitolul 5. Concluzii

5.1. Contribuții personale

5.2. Direcții de dezvoltare viitoare

[NUME_REDACTAT]

[NUME_REDACTAT] [NUME_REDACTAT] 1. Motor BL Outrunner 4270/07 13

Figura 2 Structura unui circuit de comanda a unui motor BLDC folosind ESC: 1- [NUME_REDACTAT], 2-GND, 3-Semnal comanda transmis de către Arduino, 4-Conexiune la bornele motorului 14

Figura 3 Conexiuni ESC: 1-Conexiune acumulator, 2-3-4-conexiuni borne motor, 15

Figura 4 Accelerometru, giroscop MPU – 6050 17

Figura 5 Pini de conexiune senzor MPU – 6050[17] 18

Figura 6 Grade de libertate 18

Figura 7 [NUME_REDACTAT] a senzorului MPU – 6050 [17] 18

Figura 8 Altimetru BMP180 19

Figura 9. Schema bloc altimetru BMP180 20

Figura 10. Acumulator LiPo G3 RAY 21

Figura 11. Terminale acumulator LiPo G3 RAY 21

Figura 12. Placa de dezvoltare Arduino „Leonardo” 22

Figura 13. Date experimentale subsistem 1 24

Figura 14. Date experimentale subsistem 2 24

Figura 15. Date experimentale subsistem 1 – prelucrate 25

Figura 16. Date experimentale subsistem 2 – prelucrate 25

Figura 17. Identificare experimentala subsistem 1 26

Figura 18. Identificare experimentala subsistem 2 26

Figura 19. Schema bloc subsisteme – implementare SIMULINK 27

Figura 20. Comparație date simulate – date experimentale subsistem 1 27

Figura 21. Comparație date simulate – date experimentale subsistem 2 28

Figura 22 Identificare experimentala sistem de menținere a altitudinii 28

Figura 23. Schema bloc sistem de menținere a altitudinii – implementare SIMULINK 29

Figura 24. Comparație date simulate – date experimentale sistem de menținere a altitudinii. 29

Figura 25. Schema clasica a unui SRA 30

Figura 26. Schema bloc a unui regulator PID 30

Figura 27 Implementarea sistemului de reglare pentru subsistemul număr.1 folosind un regulator P 32

Figura 28. Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator P 33

Figura 29. Implementarea sistemului de reglare pentru subsistemul număr. 1 33

Figura 30. Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator PI 34

Figura 31. Implementarea sistemului de reglare pentru subsistemul număr. 1 folosind un 34

Figura 32 Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator PID 34

Figura 33. Evoluția orientării UAV-ului în cazul unei perturbații de tip treapta – regulator PID 35

Figura 34. Implementarea sistemului de reglare pentru subsistemul număr. 2 folosind un 35

Figura 35. Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator P 36

Figura 36. Implementarea sistemului de reglare pentru subsistemul număr. 2 36

Figura 37. Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator PI 36

Figura 38. Implementarea sistemului de reglare pentru subsistemul număr. 2 folosind un 37

Figura 39. Evoluția orientării UAV-ului în cazul unui semnal de referința de tip treapta – regulator PID 37

Figura 40. Evoluția orientării UAV-ului în cazul unei perturbații de tip treapta 38

Figura 41. Implementarea sistemului de reglare pentru sistemul de reglare pe axa verticala folosind un regulator P 38

Figura 42. Evoluția altitudini în cazul unui semnal de referința de tip treapta – regulator P 39

Figura 43. Evoluția altitudini în cazul unui semnal de referința de tip treapta – regulator PI 39

Figura 44. Implementarea sistemului de reglare pentru sistemul de reglare pe axa verticala folosind un regulator PID 40

Figura 45. Evoluția altitudini în cazul unui semnal de referința de tip treapta – regulator PID 40

Figura 46. Evoluția altitudinii în cazul unei perturbații de tip treapta – regulator PI și PID 41

Figura 47. Prototip UAV 42

Figura 48. Arhitectura sistemului 43

Figura 49. Calibrarea senzorilor 46

Figura 50. Date primare în format digital 47

Figura 51. Date primare în sistem metric 48

Figura 52. Comparație date senzori și date filtrate (Kalman) 51

Figura 53. Testarea filtrului FMA 52

Figura 54. Evoluția altitudini. 53

Figura 55. Evoluția altitudini folosind filtrul FMA 53

Figura 56.Secventa de cod Arduino 55

Figura 57. Stand testare sistem de menținere echilibru 56

Lista tabele

Tabel 2.1 Specificatii: BL Outrunner 4240/ 07 11

Tabel 2.2 [NUME_REDACTAT] Platinum 40A Pro ESC: 13

Tabel 2.3 [NUME_REDACTAT] 13

Tabel 2.4 [NUME_REDACTAT] 14

Tabel 2.5 Specificați MPU-6050 14

Tabel 2.6 [NUME_REDACTAT] BMP180 16

Tabel 2.7 [NUME_REDACTAT] LiPo G3 RAY 18

Tabel 3.1 Formule de acordare regulatoare Ziegler-Nichols. ………………………………………….29

Tabel 3.2 [NUME_REDACTAT] calculate………………………………………………………………………….29

Capitolul 1. [NUME_REDACTAT] vehicul aerian fără pilot (unmanned aerial vehicle – UAV[16]) este o aeronavă care poate fi controlată de la distanță sau autonom cu ajutorul unei unități centrale de procesare la bordul UAV-ului. UAV-urile sunt folosite în aplicații care ar putea pune în pericol viața umană și pot fi folosite în aplicații militare cat și în aplicații civile.

1.1Obiective:

Principalul obiectiv al prezentului proiect este proiectarea și implementarea unui sistem de reglare a altitudinii a unui vehicul aerian fără pilot cu decolare și aterizare verticala.

Dintre etapele acestui proiect se pot enumera:

Implementarea practică a cunoștințelor teoretice acumulate în cei patru ani de cursuri și orientarea spre latura practică a meseriei de inginer

Aprofundarea noțiunilor de electronică, programare, precum și de ingineria reglării automate

Studiu în detaliu a tehnicilor de prelucrare digitală a semnalelor

Printre obiectivele secundare se numără utilizarea microcontrolerelor ATmega32u4 din familia AVR de la Atmel pentru dezvoltarea algoritmilor de control.

Pentru îndeplinirea acestor obiective se vor folosi cunoștințele teoretice acumulate la cursuri precum: Circuite analogice și numerice, Ingineria reglării automate, Identificarea proceselor.

1.2 Specificațiile proiectului

Se va dezvolta un prototip pentru dezvoltarea, implementarea și testarea sistemelor de reglare a altitudinii și a menținerii echilibrului.

Lucrarea este structurată în opt capitole după cum urmează.

După un scurt capitol introductiv în capitolul 2 se descriu pe scurt tipurile de UAV-uri, analiza și concluzia în urma căreia s-a ales tipul de UAV care va fi realizat în acest proiect. Tot în acest capitol s-a prezentat analiza și alegerea echipamentului electronic ideal pentru acest proiect, motoare, acumulatoare, altimetru, senzori și un controler de viteze electronic.

Capitolul 3 se axează pe descrierea sistemelor de control convenționale PID, proiectarea sistemele de reglare a altitudinii și a sistemului de menținere a echilibrului precum și testarea acestora la nivel de simulare folosind mediul Matlab/SIMULINK.

În capitolul 4 se vor descrie pași de construcție a aeromodelului folosit în proiect, materialele folosite, echilibrarea modelului. De asemenea se prezintă concepte generale despre implementarea sistemului de reglare software, descrierea aplicației implementate,

Metode de comunicație între componente, prelucrarea datelor achiziționate de la senzori, implementarea unor filtre necesare pentru a combina datele de la diferiți senzori.

Lucrarea se încheie cu capitolul 5, care prezintă concluziile și contribuțiile personale, precum și direcții viitoare de cercetare.

Capitolul 2. Analiza și modelarea matematică a unui vehicul aerian fără pilot

2.1 Analiza vehiculelor aeriene fără pilot

Conceptul de vehicul aerian fără pilot nu este nou, acest concept există din ani 1800 când austriecii au trimis baloane cu bombe pentru a ataca Veneția. Inovația care a condus la dezvoltarea dronelor din ziua de astăzi a început la începutul secolului 20 utilizate inițial pentru antrenamente de tragere la ținta în armată. Dezvoltarea a continuat în primul război mondial când firma [NUME_REDACTAT] Company a inventat torpedoul aerian fără pilot care putea sa explodeze după un anumit timp prestabilit și la o anumita locație. În al doilea război mondial au fost făcute mai multe inovații în conceptul dronelor. Germania nazistă a dezvoltat și folosit mai multe tipuri de drone.

Americanii au început dezvoltarea dronelor în anii 1959 când forțele aeriene americane au fost îngrijorate de pierderea piloților deasupra zonelor inamice. Dezvoltarea acestui proiect s-a intensificat în 1960 când un pilot sub numele de [NUME_REDACTAT] Powers și avionul lui U-2 a fost doborât deasupra teritoriului [NUME_REDACTAT]. La interval de câteva zile fost lansat proiectul “[NUME_REDACTAT]”, cu scopul de a dezvolta și folosi drone în războiul din Vietnam.[16]

În prezent există mai multe tipuri de [NUME_REDACTAT] Vehicle UAV-uri. Dintre acestea se pot enumera:

– UAV-uri pentru armată

– UAV-uri pentru supravegherea spațiului aerian comercial

– UAV-uri pentru sport și hobby

– UAV-uri pentru explorare

– UAV-uri de tip elicopter

– UAV-uri de tip avion

– UAV-uri cu rotoare pivotante

UAV-urile cu rotoare pivotante sunt mai performante decât UAV-urile tip avion și elicopter. Aceste UAV-uri combina caracteristicile importante a celor două categorii: posibilitatea de decolare și aterizare verticală (asemănător elicopterelor) precum și posibilitatea de a se deplasa cu viteze mai mari la funcționarea în mod avion. În zbor vertical controlul aeromodelului cu rotor pivotant este similar elicopterului cu motoare în tandem. [NUME_REDACTAT] este controlat pivotând rotoarele în direcți opuse, unghiul Roll este controlat prin diferența de turație dintre motoare, iar unghiul Pitch se controlează schimbând unghiul de atac al paletelor rotorului.

Conceptul descris în acest proiect se bazează pe o soluție dezvoltată de către [NUME_REDACTAT] în 1993. Bell a început dezvoltarea unei aeronave cu motoare pivotante fără pilot TR911X în cadrul programului [NUME_REDACTAT]. Aeronava a avut primul zbor pe 6 martie 1998 după care a intrat într-un program de test cu 2 faze, una pe uscat și una deasupra oceanului. Primul prototip a fost distrus într-un accident iar al doilea prototip a reușit sa treacă testele.

[NUME_REDACTAT] a promovat proiectul [NUME_REDACTAT] timp de zece ani fără a găsi un cumpărător, până în vara anului 2002 când Garda de Coasta SUA a comandat UAV-ul pentru a fi folosit în proiectul Deepwater [8].

În acest proiect se dorește proiectarea, dezvoltarea și implementarea intr-o prima etapă a unui vehicul aerian fără pilot similar unui UAV cu motoare pivotante fără abilitatea de a pivota motoarele, funcționând mai degrabă ca un elicopter cu motoare în tandem. Următoarea etapa de cercetare constă în dezvoltarea sistemului de pivotare a motoarelor.

2.2 Selectarea componentelor hardware

În vederea implementării prezentului proiect etapa de selectare a componentelor hardware are o importanta deosebită atât din punct de vedere a costurilor cat și a performantelor sistemului final. S-a dorit alegerea componentelor hardware care prezintă un raport calitate (performanță)/preț căt mai avantajos. În continuarea capitolului se prezintă componentele hardware alese precum și caracteristicile acestora.

2.2.1 [NUME_REDACTAT] implementarea acestui proiect s-au folosit motoarele BL Outrunner 4240/ 07, de tip Brushless DC Outrunner sau BLDC Outrunner cu un număr de 6 poli. Acest tip de motor se controlează în mod similar motoarelor Brushless DC convenționale prin comutarea electronica a căilor de curent necesare învârtirii rotorului. Totuși, există o diferență în modul de construcție a tipului de motor folosit în proiect. Numele acestui tip de motor, outrunner, se datorează faptului ca rotorul motorului reprezintă și carcasa motorului. Motoarele BDLC Outrunner funcționează la o turație mai mică decât motoarele BLDC convenționale dar funcționează la o turație mult mai mare decât motoarele de ferita. De asemenea acest tip de motor nu are nevoie de cutie de viteze micșorând greutatea motorului, reprezentând soluția optima pentru aeromodelele propulsate de motoare electrice.

Figura 1. Motor BL Outrunner 4270/07

Tabel 2.0.1 Specificatii: BL Outrunner 4240/ 07

2.2.2 Regulator electronic de viteza (Electronic speed controller[16])

Regulatoarele electronice de viteza (“ Electronic speed controllers – ESC ”) sunt circuite electronice dedicate pentru controlul turației și sensului de rotație a motoarelor electrice, care pot funcționa și ca frâna dinamica.

Există multiple tipuri de regulatoare electronice de viteză în funcție de tipul motorului folosit. De exemplu, există ESC-uri pentru motoare de curent alternativ, de curent continuu cu și fără perii. ESC-urile sunt folosite în diverse aplicații: aeronautica, automobile electrice, biciclete electrice, machete cu radiocomanda.

Figura 2 Structura unui circuit de comanda a unui motor BLDC folosind ESC: 1- [NUME_REDACTAT], 2-GND, 3-Semnal comanda transmis de către Arduino, 4-Conexiune la bornele motorului

În funcție de semnalul de comandă, ESC-ul modifica timpii de comutație a tranzistoarelor cu efect de câmp din punte, oferind un control mult mai fin și eficient asupra turației motorului. Semnalul de comanda a ESC-urilor este un semnal PWM cu frecvența nominala de 50Hz, lățimea pulsurilor variază de la 1ms până la 2ms, pulsul de 1ms înseamnă oprirea completă a motorului, la un impuls de 1,5ms rezultă un factor de umplere de 50% care acționează motorul la o turație de 50% iar la un impuls de 2ms motorul este acționat 100% rezultând un factor de umplere 100%.

Sensul de rotație a motorului se determină măsurând tensiunea contraelectromotoare indusă în înfășurări de către magneți permanenți. În funcție de sensul de rotație a motorului sesizat de către ESC se determină perechile de tranzistoare comandate. În final un regulator PID implementat în ESC modifică factorul de umplere a semnalului PWM pentru a menține turația constantă. Este posibil și schimbarea sensului de rotație a motorului schimbând oricare 2 dintre cele 3 conexiuni .

ESC-urile au în general incorporat și un circuit de protecție (Battery eliminator circuit – BEC) care elimină necesitatea unui acumulator separat pentru alimentarea echipamentului electronic de control din aeromodel. Acest circuit întrerupe alimentarea motoarelor și furnizează tensiune doar circuitelor de control a direcție pentru a nu pierde controlul asupra aeromodelului.

Unele ESC-uri se mai pot programa și ulterior cu ajutorul unui card de programare care se poate achiziționa separat. Acestea se folosesc pentru a seta mai bine opțiunile de funcționare pentru motorul ales.

ESC-ul folosit în acest proiect este [NUME_REDACTAT] 40A Pro ESC[…], datorită raportului bun calitate/preț. Microprocesorul de înaltă performanță face posibil ca acest ESC sa fie compatibil cu o gama larga de motoare și ajută la creșterea eficienței acestora. Acest ESC poate fi utilizat la motoare cu un număr diferit de poli.

Viteze maxime la un număr diferit de poli: 21000RPM (2 poli), 70000 RPM (6 poli), 35000 RPM (12 poli). De asemenea, este prevăzut cu diferite sisteme de protecție implementate, în caz de supra-încălzire, întreruperea alimentări motoarelor la tensiune joasă, pierderea semnalului de comandă.

Figura 3 Conexiuni ESC: 1-Conexiune acumulator, 2-3-4-conexiuni borne motor,

5-conexiune semnal de comandă

Tabel 0.2.2 [NUME_REDACTAT] Platinum 40A Pro ESC:

2.2.3 [NUME_REDACTAT] un senzor folosit pentru menținerea și determinarea direcției de orientare în funcție de viteza unghiulară. Există mai multe tipuri de giroscoape, mecanice, electro-mecanice. Giroscopul folosit în acest proiect este de tip [NUME_REDACTAT] – MEMS care se bazează pe teoria [NUME_REDACTAT] folosind un element vibrator [16].

MEMS ([NUME_REDACTAT]-[NUME_REDACTAT][16]) sunt sisteme alcătuite din componente electrice și mecanice care au dimensiunea între 1 și 100 micrometri, dimensiunea acestor sisteme pot varia între 20 micrometri și 1 mm. Sunt alcătuite dintr-o unitate centrală de procesare, senzori care interacționează cu mediul înconjurător. Specificațiile giroscopului se pot vedea în tabelul 2.3

Tabel 2.3 [NUME_REDACTAT]

2.2.4 [NUME_REDACTAT] un senzor folosit pentru determinarea accelerației pe baza inerției corpurilor sau a accelerație gravitaționale. Sunt disponibile mai multe modele de accelerometre care determină accelerația pe o axa sau pe mai multe axe, detectând amplitudinea și direcția forței gravitaționale. Accelerometrele bazate pe tehnologia MEMS[9] sunt din ce în ce mai răspândite în dispozitive electronice. Specificațiile accelerometrului se pot vedea în tabelul 2.4

Tabel 2.4 [NUME_REDACTAT]

Figura 4 Accelerometru, giroscop MPU – 6050

Accelerometrul și giroscopul sunt integrate în aceeași pastilă de siliciu, MPU-6050 care este integrată pe circuitul din figura 4. Acesta este un circuit cu 6 grade de libertate combinând cele 3 axe ale accelerometrului și a giroscopului cu ajutorul unui procesor. Dimensiunea pastilei de siliciu este de 4x4x0.9mm

Tabel 2.5 Specificați MPU-6050

Figura 5. Pini de conexiune senzor MPU – 6050[17]

În figura 6 se pot observa cele 6 grade de libertate 3 pentru mișcări liniare și 3 pentru mișcări de rotație.

Figura 6 Grade de libertate

Figura 7 [NUME_REDACTAT] a senzorului MPU – 6050 [17]

2.2.5 Altimetru barometric

Altimetrul barometric este de fapt un barometru cu indicații în unități de înălțime, folosit pentru determinarea altitudinii (înălțimii) față de un nivel de referință (nu neapărat nivelul mării), aflat la bordul planoarelor, avioanelor (aparatelor de zbor). El indică înălțimea de zbor față de nivelul aerodromului de decolare și se bazează pe principiul descreșterii presiunii atmosferice în raport cu înălțimea.[16]

Există mai multe tipuri de altimetre :

– altimetru sonic

– altimetru cu unde radar

– GPS cu determinarea altitudinii prin trilaterație

Altimetrul folosit în acest proiect este BMP180 produs de firma Bosch (raport calitate(performanță)/preț bun, rezoluție mare). Acesta se poate conecta direct la un microcontroler prin conexiune I2C[12]. Această placă de siliciu este prevăzuta cu un senzor piezo-electric care furnizează date primare neprelucrate, un convertor analog numeric și o unitate de control cu o memorie EEPROM. Memoria EEPROM conține 176 biți de date pentru calibrare care ajută la prelucrarea și compensarea presiunii și a temperaturii. Altimetrul BMP180 este prezentat în figura 8 iar specificațiile acestui altimetru sunt evidențiate în tabelul 2.6. Figura 9 detaliază schema bloc a altimetrului.

Figura 8 Altimetru BMP180

Tabel 2.6 [NUME_REDACTAT] BMP180

Figura 9. Schema bloc altimetru BMP180

2.2.6 [NUME_REDACTAT] tipului de acumulatoare este un pas dificil, pe piață existând mai multe tipuri de acumulatoare pentru modelism, dintre care 3 tipuri uzuale: Nichel-Cadmiu(NiCd), [NUME_REDACTAT](NiMH) și Litiu-Polimer.

Acumulatoarele NiCd sunt printre cele mai ieftine acumulatoare. Se încarcă relativ repede, dar au o mare problemă, denumită efectul memoriei. Dacă se reîncărca înainte de descărcarea completă se vor descărca din ce în ce mai repede pe viitor, ținând parcă minte nivelul la care erau când au fost reîncărcate. De asemenea, dacă stau nefolosite, după 90 de zile vor fi complet descărcate. Raportul dintre greutate și capacitatea de stocare este destul de mic fața de celelalte 2 tipuri .

Acumulatoarele NiMH înlocuiesc acumulatoarele nichel-cadmiu cu un aliaj care permite stocarea în același spațiu cu 40% mai multă energie. Problema reîncărcării înainte de descărcarea completă nu mai este atât de acută ca în cazul bateriilor nichel-cadmiu, deși nu este eliminat complet.

Pentru acest proiect s-au ales acumulatoare LiPo. Acumulatoarele LiPo sunt cel mai noi tipuri de acumulatoare reprezentând generația ce înlocuiește acumulatoarele NiCd și NiMH și se folosesc în aplicațiile în care masa acumulatorului este importantă. Aceasta tehnologie oferă o densitate mai mare a energiei, greutate mică, și durata de exploatare convenabilă comparativ cu alte tipuri de baterii. Necesită încărcarea cu încărcător special și egalizor altfel existând riscul de incendiu.

Acumulatorul de tip LiPo G3 RAY 2200 mAh, 11.1V, 2/26/50 C se poate vedea în figura 10 iar specificațiile acestui acumulator sunt prezentate în tabelul 2.7 . În figura 11 se prezintă schema electrică a acumulatorului.

Tabel 2.7 [NUME_REDACTAT] LiPo G3 RAY

Figura 11. Terminale acumulator LiPo G3 RAY

2.2.7 [NUME_REDACTAT] 12. Placa de dezvoltare Arduino „Leonardo”

Pentru implementarea proiectului s-a folosit placa de dezvoltare Arduino „Leonardo” pe care este integrat un microcontroler de tip ATmega32u4 produs de firma AVR. Este un microcontroler pe 8-biți cu o memorie ISP Flash de 32K Octeți (ISP- [NUME_REDACTAT] [NUME_REDACTAT]). Transmisia pe microcontroler se face folosind comunicația serială prin portul Micro USB și apare ca un port virtual în calculator, dar se poate comporta și ca un dispozitiv ce comunică prin „full speed USB 2.0” folosind driver standard de USB. Microcontrolerul dispune și de comunicație serială UART TTL(5V) prin pini digitali 0(RX) și 1(TX); dar și comunicație I2C([NUME_REDACTAT] Bus) și SPI([NUME_REDACTAT] Interface) având librării incluse care simplifică comunicarea cu alte dispozitive [15].

2.3 Analiza și modelarea sistemului

Pentru dezvoltarea sistemului de control este necesar un model matematic al procesului pentru a descrie într-un mod cat mai simplu dinamica procesului. Un model matematic de ordin superior este mai precis decât unul de ordin mic însa este dificil de utilizat în proiectarea sistemului de control. Astfel, trebuie făcut un compromis între complexitatea și precizia modelului matematic. Acest capitol se axează pe analiza și modelarea sistemului. Modelul procesului va consta din două parți, un model pentru controlul altitudinii și unul pentru controlul echilibrului. Datorită complexității procesului și a neliniarității acestuia s-a optat pentru determinarea modelelor folosind metode de identificare experimentala.

2.3.1 Achiziționarea datelor experimentale

Prima etapă în modelarea sistemului constă în obținerea datelor experimentale. Pentru ca înregistrarea datelor să fie posibilă și fără pericol de accident s-au creat două sisteme separate de testare, a echilibrului și a altitudinii. De asemenea sistemul dezvoltat și folosit pentru înregistrarea datelor pentru sistemul de menținere a altitudinii a fost refolosit la construirea sistemului pentru menținerea echilibrului .

Datele experimentale s-au achiziționat după testarea sistemului în bucla deschisă atât pentru sistemul de menținere a altitudinii cât și pentru sistemul de menținere a echilibrului. Astfel în urma aplicării unui semnal de intrare de tip treaptă, deoarece aceste procese sunt procese rapide, timpul de stabilizare este foarte scurt, de ordinul secundelor.

S-au implementat două secvențe de cod pentru testarea celor două sisteme, diferențele dintre cele două fiind minore. Pentru determinarea modelului matematic a sistemului de menținere a altitudinii s-au achiziționat date experimentale pentru funcționarea simultană a motoarelor. S-a aplicat același semnal treapta pe intrarea fiecărui ESC care la rândul lor au transmis un semnal PWM pentru controlul turației motoarelor.

Pentru determinarea modelului matematic a sistemului de menținere a echilibrului s-a folosit o secvență de cod similară. S-au achiziționat date experimentale pentru funcționarea individuala a fiecărui motor.

Următorul pas după achiziționarea datelor experimentale constă în prelucrarea acestora în vederea aplicării metodelor clasice de identificare experimentală. Acest pas este necesar deoarece datele primare achiziționate de la senzorii utilizați prezintă zgomote de măsurare. Soluțiile folosite pentru prelucrarea datelor experimentale primare sunt prezentate în detaliu capitolul 4, subcapitolul 2.

După prelucrarea datelor experimentale achiziționate ultimul pas pentru determinarea modelului matematic al procesului consta în aplicarea metodelor de identificare. S-a determinat un model pentru sistemul de menținere a altitudinii și un model pentru sistemul de menținere a echilibrului. Identificarea celor 2 procese se vor face separat astfel obținând două sisteme de reglare.

2.3.2. Identificare sistemului de menținere a echilibrului

Având în vedere ca vehiculul aerian este prevăzut cu două motoare electrice identificarea s-a realizat separat pentru subsisteme diferite, fiecare subsistem conținând un motor. Procesul de obținerea datelor este identic la ambele subsisteme.

Motoarele au fost montate pe un cadru de lemn cu un ax de metal. Pentru identificarea sistemului s-au considerat:

Poziția inițială a sistemului este perpendiculară pe suprafața solului. S-a aplicat un semnal de tip treaptă la bornele ESC-ului conectat la motorul cel mai aproape de sol. Poziția de echilibru a sistemului este când acesta este paralel cu solul.

După aplicarea unui semnal de tip treaptă la bornele ESC-ului conectat la unul dintre motoare, sistemul se va deplasa spre poziția de echilibru. După terminarea achiziției datelor pentru un subsistem se va folosi aceeași procedură la cel de al doilea subsistem. Acest comportament se poate observa pe datele achiziționate în urma experimentelor, reprezentate în figurile următoare.

Datele înregistrate în timpul experimentelor pentru determinarea modelului subsistemului cu motorul număr 1, se pot observa în figura 13.

Figura 13. Date experimentale subsistem 1

Datele înregistrate în timpul experimentelor pentru determinarea modelului subsistemului cu motorul număr 2, se pot observa în figura 14.

Figura 14. Date experimentale subsistem 2

Pentru aplicarea metodelor de identificare datele obținute au fost prelucrate folosind mediul Matlab. În figurile 15, 16 se prezintă datele experimentale după prelucrare.

Date prelucrate pentru subsistemul cu motorul număr. 1 se pot observa în figura 15

Figura 15. Date experimentale subsistem 1 – prelucrate

Date prelucrate pentru subsistemul cu motorul număr 2 se pot observa în figura 16.

Figura 16. Date experimentale subsistem 2 – prelucrate

Pentru identificarea funcțiilor de transfer s-a folosit metoda tangentei pentru procese cu timp mort[6] de ordinul I. Pentru determinarea constantelor de timp și a factorului de proporționalitate Kf, în figurile 17 și 18 se poate observa aplicarea metodei tangentei pentru ambele subsisteme.

Figura 17. Identificare experimentala subsistem 1

Figura 18. Identificare experimentala subsistem 2

Tangenta se trasează în originea răspunsului și se va translata spre dreapta cu valoarea timpului mort, astfel se va afla constanta de timp mort și constanta de timp a procesului. Pasul următor constă în determinarea factorului de proporționalitate . Se vor citi valorile staționare a procesului și și valorile inițiale și respectiv . Cu aceste date se vor calcula constantele de proporționalitate a funcțiilor de transfer după următoarea formulă.

Forma generală a funcțiilor de transfer a părții fixate a celor două subsisteme are următoarea structură:

=

Funcțiile de transfer determinate sunt:

=

=

Pentru evaluarea modelelor determinate în urma identificării experimentale acestea au fost implementate și simulate folosind mediul Matlab/ SIMULINK iar rezultatele simulărilor au fost comparate cu datele experimentale. Schemele bloc ale celor 2 subsisteme sunt prezentate în figura 19 .

Figura 19. Schema bloc subsisteme – implementare SIMULINK

Figurile 20 și 21 prezintă compararea rezultatelor simulate cu datele experimentale pentru ambele subsisteme. Se pot observa diferențe mici între modelul procesului și datele experimentale.

Figura 20. Comparație date simulate – date experimentale subsistem 1

Figura 21. Comparație date simulate – date experimentale subsistem 2

2.3.3 Identificarea sistemului de menținere a altitudinii

Identificarea modelului pentru sistemul de menținere a altitudinii s-a realizat cu ajutorul unui sistem de șine. În jurul aripii s-a montat un sistem de direcționare verticala format din două bucăți de cherestea poziționate pe lateralele aripi prevăzute cu șine metalice. Pe fiecare parte a aripii vehiculului aerian au fost montate o pereche de roți pentru reducerea frecărilor. Acest sistem a permis înregistrarea datelor eliminând orice pericol de accidente, acest sistem fiind capabil sa mențină poziția pe axele x și y și permițând doar deplasarea vehiculului pe axa z.

Si în acest caz s-a folosit metoda tangentei evidențiată în figura 22.

Figura 22 Identificare experimentala sistem de menținere a altitudinii

În urma identificării s-a observat că funcția de transfer a parții fixate are forma următoare:

=

Similar cazului precedent pentru evaluarea modelului determinat în urma identificării experimentale acesta a fost implementat, figura 23, și simulat folosind mediul Matlab/ SIMULINK iar rezultatele simulărilor au fost comparate cu datele experimentale în figura 24.

Figura 23. Schema bloc sistem de menținere a altitudinii – implementare SIMULINK

Figura 24. Comparație date simulate – date experimentale sistem de menținere a altitudinii.

Si în acest caz se poate observa o eroare, în limite acceptabile, între simularea modelului matematic și datele experimentale, ceea ce justifică utilizarea modelelor matematice determinate în proiectarea buclelor de reglare.

Capitolul 3. Proiectarea sistemului de reglare

3.1 Control convențional

Un sistem cu reglarea în bucla închisa presupune compararea mărimii de ieșire cu o mărime de referința, diferența dintre aceste două mărimi reprezentând eroarea. Eroarea este semnalul de intrare pentru regulator. În urma prelucrării mărimii de eroare, conform unei anumite legi de reglare, obținem la ieșirea regulatorului o mărime de comanda care reprezintă mărimea de intrare al procesului tehnologic. Schema bloc al unui sistem de reglare automată (SRA) adaptat pentru acest proiect se poate observa în figura 25.

Figura 25. Schema clasica a unui SRA

Pentru acest proiect sau ales două tipuri de regulatoare: regulator de tip PI pentru sistemul de reglare a altitudinii și un regulator PID pentru sistemul de reglare al echilibrului. Deoarece regulatorul PI este similar unui regulator PID lipsind doar componenta derivativă, se vor prezenta caracteristicile unui regulator PID. Regulatorul PID este unul dintre cele mai ușoare regulatoare de implementat. Schema bloc al unui regulator PID se poate observa în figura 26.

Figura 26. Schema bloc a unui regulator PID

ε – Eroare

ym – semnalul de ieșire măsurat

y – semnalul de ieșire

R.A – Regulator automat

E.E – Element de execuție

Proces – instalația tehnologica (vehiculul aerian fără pilot)

Se observă ca mărimea de comandă este egală cu suma componentelor regulatorului. În continuare se vor descrie cele trei componente ale regulatorului PID, ce efect au asupra funcționarii regulatorului și a reglării procesului.

Componenta proporțională P depinde numai de eroare. Factorul de proporționalitate Kp determină raportul dintre răspunsul sistemului și valoarea erorii. Creșterea factorului de proporționalitate creste răspunsul sistemului. [NUME_REDACTAT] este prea mare, sistemul poate intra în oscilație și sa deterioreze instalația tehnologica.

Componenta integrativă I este suma erorilor în timp. Valoarea componentei I va crește și la cea mai mică valoare a erorii, astfel valoarea erorii staționare va tinde spre zero. Deoarece componenta I poate sa crească în continuu aceasta produce un fenomen de “windup” în urma căruia componenta I va satura regulatorul fără ca eroarea sa scadă la zero.

Componenta derivativă D ajută la reducerea suprareglajului, este proporțional cu viteza de schimbare a variabilelor procesului, ajută la îmbunătățirea timpului de răspuns dar este foarte sensibil la perturbații și acesta poate sa destabilizeze procesul.

Forma generala a funcției de transfer a unui regulator PID este [3] :

– Componenta proporțională

– Componenta integrativă

– Componenta derivativă

Având în vedere ca modelele determinate și prezentate în capitolul anterior sunt de ordinul I pentru acordarea regulatoarelor se va folosi metoda de acordare Ziegler-Nichols pentru procese cu timp mort. Această metodă face parte din categoria metodelor experimentale de acordare.

Pentru fiecare sistem (de menținere a echilibrului, de reglare a altitudinii), se vor determina parametrii regulatoarelor: P, PI și PID. După determinarea parametrilor regulatoarelor se vor testa la nivel de simulare în vederea alegerii regulatorului cu cele mai bune performanțe în vederea implementării și testării pe procesul real.

Pași care trebuie urmați sunt următorii:

Daca sistemul de reglare este în buclă închisa, bucla de reacție trebuie deconectată ca sistemul sa devina un sistem de reglare în bucla deschisa.

Aplicarea unui semnal treaptă

Determinarea constantei de timp „ T ” și timpul mort „Tm” al sistemului de pe graficul obținut în urma aplicări semnalului treaptă.

Determinarea factorului de proporționalitate „Kf”

Se determina parametrii regulatorului utilizând tabelul 3.1.

Tabel 3.1

3.2 Sistemul de reglare pe axa orizontală

În urma obținerii parametrilor regulatoarelor pentru cele două subsisteme care conțin cele două motoare acestea se vor implementa în mediul de simulare Matlab/SIMULINK. Ulterior se vor compara rezultatele obținute cu toate cele trei tipuri de regulatoare determinate.

În tabelul 3.2 se pot vedea parametrii determinați pentru fiecare tip de regulator pentru aceste două subsisteme.

Tabel 3.2 [NUME_REDACTAT] calculate

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 1

Bucla de reglare implementata cu un regulatorul P pentru subsistemul cu motorul număr. 1 se poate observa în figura 28,

Figura 27 Implementarea sistemului de reglare pentru subsistemul număr.1 folosind un regulator P

Figura 28. Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator P

În figura 28 se poate observa simularea regulatorului P pentru sistemul cu motorul numărul 1. În urma simulării prezentate se poate observa prezența unei erori staționare la poziție, inacceptabila în cazul unui astfel de sistem.

Bucla de reglare implementata folosind un regulatorul PI pentru sistemul cu motorul numărul 1 se poate observa în figura 29.

Figura 29. Implementarea sistemului de reglare pentru subsistemul numărul 1

folosind un regulator PI

Figura 30. Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator PI

După cum se poate observa în figura 30 timpul de răspuns este de 0.0096 secunde, suprareglajul este de 13.73%, timpul de ridicare 0.0016.

Datorita valorii mari a suprareglajului în continuare se va proiecta și testa un regulator PID folosind aceeași metodă de acordare.

Bucla de reglare implementată folosind un regulatorul PID pentru subsistemul cu motorul numărul 1 se poate observa în figura 31.

Figura 31. Implementarea sistemului de reglare pentru subsistemul număr. 1 folosind un regulator PID

Figura 32 Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator PID

După cum se poate observa timpul de răspuns este de 0.99 secunde, suprareglajul este nul, timpul de ridicare 0.0096secunde. Se observa ca folosind un regulator PID răspunsul sistemului nu prezintă suprareglaj, dar timpul de răspuns este mai mare decât folosind un regulator PI.

Sistemul de reglare folosind regulator PI și PID se testează și pentru rejectarea efectelor perturbațiilor. Se consideră ca la momentul t=2sec apare o perturbație pe ieșire de valoare negativa. În urma analizei rezultatelor obținute, figura 33, s-a ales pentru implementare regulatorul de tip PID.

Figura 33. Evoluția orientării UAV-ului în cazul unei perturbații de tip treapta – regulator PID

3.2.1 Implementarea regulatorului P, PI și PID pentru subsistemul 2

Bucla de reglare implementată cu un regulatorul P pentru subsistemul cu motorul numărul 2 se poate observa în figura 34,

Figura 34. Implementarea sistemului de reglare pentru subsistemul numărul 2 folosind un

regulator P

Figura 35. Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator

În figura 35 se poate observa simularea regulatorului P pentru sistemul cu motorul numărul 2. În urma simulării prezentate se poate observa prezenta unei erori staționare la poziție, inacceptabila în cazul unui astfel de sistem.

Bucla de reglare implementata folosind un regulatorul PI pentru sistemul cu motorul numărul 2 se poate observa în figura 36.

Figura 36. Implementarea sistemului de reglare pentru subsistemul numărul 2

folosind un regulator PI

Figura 37. Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator PI

După cum se poate observa în figura 37 timpul de răspuns este de 0.0096 secunde, suprareglajul este de 13.73%, timpul de ridicare 0.0016 secunde.

Datorita valorii mari a suprareglajului în continuare se va proiecta și testa un regulator PID folosind aceeași metoda de acordare.

Bucla de reglare implementata folosind un regulatorul PID pentru subsistemul cu motorul numărul 2 se poate observa în figura 38.

Figura 38. Implementarea sistemului de reglare pentru subsistemul numărul 2 folosind un

regulator PID

Rezultatele simulărilor sunt prezentate în figura 39.

Figura 39. Evoluția orientării UAV-ului în cazul unui semnal de referință de tip treaptă – regulator PID

După cum se poate observa timpul de răspuns este de 0.99 secunde, suprareglajul este nul, timpul de ridicare 0.0096 secunde. Se observă ca folosind un regulator PID răspunsul sistemului nu prezintă suprareglaj dar timpul de răspuns este mai mare decât folosind un regulator PI.

Sistemul de reglare folosind regulator PI și PID se testează și pentru rejectarea efectelor perturbațiilor. Se considera ca la momentul t=2sec apare o perturbație pe ieșire de valoare negativa. În urma analizei rezultatelor obținute, figura 40, s-a ales pentru implementare regulatorul de tip PID.

Figura 40. Evoluția orientării UAV-ului în cazul unei perturbații de tip treaptă

regulator PI și PID

3.3 Sistemul de reglare pe axa verticala

Similar sistemului de reglare pe axa orizontală și în cazul sistemului de reglare pe axa verticală se vor determina parametrii unor regulatoare de tip P, PI și PID folosind metoda de acordare Ziegle-Nichols. Se vor testa performanțele sistemelor de reglare la nivel de simulare folosind toate tipurile de regulatoare, pentru determinarea celui mai potrivit regulator în vederea implementării pentru procesul real.

În prima etapa s-a determinat un regulator de tip P pentru sistemul de reglare a altitudinii. În figura 41 este prezentată implementarea în Matlab/SIMULINK a buclei de reglare.

Figura 41. Implementarea sistemului de reglare pentru sistemul de reglare pe axa verticală folosind un regulator P

Figura 42. Evoluția altitudini în cazul unui semnal de referința de tip treaptă – regulator P

Răspunsul sistemului cu regulatorul P se poate observa în figura 42. Se observa prezența unei erori staționare la poziție, inacceptabila în cazul unui UAV.

Pentru același sistem s-au determinat parametrii unui regulator de tip PI, în figura 43 fiind prezentată schema de implementare.

Figura 43. Implementarea sistemului de reglare pentru sistemul de reglare pe axa verticală folosind un regulator PI

Figura 43. Evoluția altitudini în cazul unui semnal de referință de tip treaptă – regulator PI

Răspunsul sistemului folosind regulatorul PI se poate observa în figura 43, prezentând un timp de răspuns de 1.7 secunde, suprareglajul este de 7.37%, timpul de ridicare de 0.504 secunde, iar eroarea staționară la poziție este nulă. Totuși se dorește reducerea suprareglajului, în acest sens proiectându-se și un regulator PID.

Bucla de reglare implementată cu un regulator PID pentru sistemul de reglare a altitudini se poate observa în figura 44.

Figura 44. Implementarea sistemului de reglare pentru sistemul de reglare pe axa verticală folosind un regulator PID

Figura 45. Evoluția altitudini în cazul unui semnal de referință de tip treaptă – regulator PID

Răspunsul sistemului cu regulatorul PID se poate observa în figura 45. Se observa ca sistemul nu are eroare staționară la poziție, timpul de răspuns este de 3.89secunde, supra reglajul este nul iar timpul de ridicare 3.1secunde.

Înainte de alegerea soluției finale pentru sistemul de reglare pe axa verticală se testează regulatoarele PI și PID pentru rejectarea efectului perturbației. În figura 46 se pot observa performanțele celor două regulatoare considerând aplicarea unei perturbații la momentul t=5 secunde.

Figura 46. Evoluția altitudinii în cazul unei perturbații de tip treaptă – regulator PI și PID

Cap.4 Implementarea și testare sistemului de reglare a altitudinii unui vehicul aerian fără pilot

4.1 [NUME_REDACTAT] vehiculului aerian.

4.1.1 Materiale folosite

Prima etapă în realizarea prototipului presupune alegerea materialelor necesare. Materialele folosite la construirea prototipului au fost alese în așa fel încât după prelucrarea și asamblarea prototipului masa acestuia sa fie căt mai mică.

Figura 47. Prototip UAV

Pentru construcția fuzelajului s-a ales polistirenul extrudat datorita proprietăților fizice. Dintre acestea se pot enumera: rezistentă mare la șocuri mecanice, greutatea mică în raport cu cantitatea folosită, prelucrarea și asamblarea ușoară. La asamblarea fuzelajului sa folosit un adeziv special pentru lipirea polistirenului. Datorită caracteristicilor fizice ale motoarelor, susținerea acestora pe aripile prototipului, a fost necesară utilizarea lemnului de brad cu dimensiunea de 1000x42x18MM pentru construcția aripilor. În acest stagiu de construcție nu s-a insistat pe forma aerodinamica a aripilor, deoarece vehiculul va decola vertical .

4.1.2 Alinierea motoarelor și balansarea prototipului

A două etapă constă în alinierea motoarelor. S-a avut ca obiectiv poziționarea motoarelor în așa fel încât axul motoarelor sa fie perpendicular pe suprafața pământului. De asemenea axurile motoarelor trebuie să fie paralele, echidistante și coliniare față de centrul de greutate.

Balansarea prototipului are o importanță deosebită reprezentând și obiectivul celei de a treia etapa. La balansarea prototipului sa folosit o metodă mai rudimentara: s-a fixat o sfoara de centru de greutate dorit în urma căreia s-au adăugat greutăți suplimentare pe extremitățile prototipului până când acesta a devenit paralel cu solul, realizând echilibrarea pe axele x și respectiv y.

4.2 Arhitectura sistemului

Pentru o mai bună înțelegere a acestui capitol se va prezenta o arhitectură de nivelul 2 a sistemului și se vor descrie pe scurt toate componentele sistemului. Arhitectura sistemului cu toate componentele sale se poate observa în figura 48. Se observa ca sistemul este redundant redundant deoarece s-a evitat folosirea firelor de execuție și s-a recurs la folosirea a două microcontroloare pentru cele două motoare.

Figura 48. Arhitectura sistemului

Se poate observa ca există 3 unități principale în cadrul sistemului. Fiecare unitate are un număr de componente:

Unitatea de prelucrare și control

În aceasta unitatea componentele sunt inițializate, datele achiziționate de la senzori sunt prelucrate prin diferite metode și fuzionate cu ajutorul [NUME_REDACTAT], calculul regulatoarelor pentru cele două sisteme de reglare „PID echilibru” și „PID Altitudine” iar pe ieșirile digitale se transmite semnalul de control către unitatea de execuție.

Unitatea de execuție

Aceasta unitate conține toate elementele de forța și de acționare a sistemului, datele de control primite de la unitatea de control sunt prelucrate de către ESC și transmise mai departe către BLDC.

Unitatea de achiziție date

Aceasta unitate conține toți senzorii sistemului, datele sunt transmise către unitatea de prelucrare cu ajutorul protocolului de comunicație I2C.

4.3 Implementarea software a sistemului de reglare.

4.3.1 Concepte generale.

După alegerea componentelor electronice potrivite este necesară dezvoltarea unei aplicații de monitorizare și control a acestora. Pentru a crea o astfel de aplicație este nevoie ca utilizatorul sa dețină cunoștințe generale despre limbajul de programare C/C++, tipuri de comunicare dintre dispozitivele electronice, semnale de comandă și control a acestor dispozitive. Aplicația software constituie o parte importanta a acestui proiect, fără aceasta ne putând fi îndeplinite toate obiectivele propuse.

Aplicația a fost realizata în mediul de dezvoltare Arduino și implementat pe placa de dezvoltare [NUME_REDACTAT].

Crearea unei aplicații software consta din 3 parți constructive[15]:

declararea Header-elor, librăriilor și a variabilelor globale

inițializarea parametrilor aplicației(definirea variabilelor, pinilor) folosind funcția Setup(). Această funcție se rulează o singura data după încărcarea programului, alimentarea plăcii sau resetarea acesteia.

inițializarea și prescrierea valorilor inițiale, folosind funcția Loop(). Această creează o buclă care permite schimbarea variabilelor la fiecare iterație fiind folosită pentru a controla în mod activ placa de dezvoltare.

Pentru rularea unei aplicații dezvoltate aceasta trebuie încărcată în memoria flash a microcontrolerului, procedura care necesită mai mulți pași. Primul pas constă în verificarea sintaxei codului scris. Compilarea reprezintă pasul următor acesta fiind procesul prin care mediul de dezvoltare transforma codul C/C++ intru-un cod pe care microcontrolerul îl poate executa. Compilatorul folosit se numește avr-gcc și transforma codul C/C++ în cod mașină. După transformarea codului în cod mașină acesta este combinat cu librăriile care asigura funcții de baza rezultatul fiind un fișier HEX care conține biți specifici necesari scrierii în memoria microcontrolerului. Codul este încărcat de către „AVRDUDE”[20]. Mediul de dezvoltare suporta o gamă largă de placi de dezvoltare însă doar cele care sunt proiectate cu microcontrolere de la firma AVR sunt compatibile.

Pentru realizarea comunicației între echipamentele electronice și placa de dezvoltare Arduino în fiecare proiect trebuie incluse anumite librarii. Mediul de dezvoltare Arduino conține un număr mare de librarii însa nu întotdeauna librăriile necesare pentru realizarea diferitelor proiecte sunt incluse în librăriile de baza ale mediului de dezvoltare. Sunt necesare cunoștințe de programare și electronica pentru modificarea librăriilor de baza pentru eficientizare în funcție de aplicația proprie.

Librăriile necesare pentru implementarea acestui proiect au fost adăugate mediului de dezvoltare Arduino și au fost adaptate pentru acest proiect. Una dintre librari existente dar care nu a fost utilizată este librăria PID folosita pentru implementarea regulatoarelor. Datorită constrângerilor date de memoria flash s-a decis implementarea regulatorului fără utilizarea librăriei PID, aceasta ocupând mult spațiu.

Instalarea acestor librarii este diferit pe fiecare sistem de operare, deoarece proiectul a fost dezvoltat și testat pe un sistem de operare Linux. Se vor prezenta pașii necesari pentru instalarea librăriilor pe acest sistem de operare[15].

1. Se descărca fișierele zip care conțin librăriile

2. Se extrag fișierele în folder-ul Libraries din directorul Sketchbook

3. Numele directorului nu are voie sa conțină caractere speciale

4. Repornirea IDE-ului

5. Verificare

4.3.2 Achiziționarea datelor de la senzori:

Comunicarea dintre microcontroler și senzori se realizează cu ajutorul protocolului de comunicare I2C. Fiecare senzor este prevăzut cu un convertor analog numeric care permite citirea datelor în format digital pe 16biți.Pentru realizarea comunicației între senzor și placa de dezvoltarea Arduino trebuie utilizată librăria Wire.h

Accelerometru și giroscopul se pot inițializa cu parametrii diferiți în funcție de precizia impusa de proiect. Fiecare senzor trebuie calibrat. Procesul de calibrare constă în realizarea unui test pentru determinarea unui offset. Datorită faptului ca tehnologia nu este încă suficient de avansată pentru producerea unor senzori de precizie cu cost redus, în cazul senzorilor achiziționați este posibil ca offsetul determinat sa difere pentru același tip de senzor.

Offset-urile se pot determina manual sau automat cu ajutorul unui program implementat în mediul de dezvoltare Arduino. În cazul metodei manuale pentru determinarea offset-ului trebuie urmați următorii pași[15]:

Senzorul trebuie pus pe o suprafață plată și orizontală

În aplicația de bază pentru acest senzor RAW[15] (program care permite citirea datelor primare furnizate de către senzor a fost modificat au fost adăugați parametri care setează offseturile ) parametrii setXGyroOffset, setYGyroOffset, setZGyroOffset, setXAccelOffset, setYAccelOffset, setZAccelOffset trebuie setați pe 0, pentru ca valoarea offset-ului pe axele x, y și z sa fie 0 cum se poate vedea în figura Figura 49.

Figura 49. Calibrarea senzorilor

După setarea offset-urilor pe 0 se încărca programul în memoria microcontrolerului.

Senzorul se lasă în funcțiune 5-10 minute pentru ca temperatura să se stabilizeze.

Se verifică și se înregistrează valorile furnizate de senzori.

Valorile înregistrate în urma acestui test se vor introduce în programul RAW ca valori a offset-urilor și se repeta pași 1-6 până când datele furnizate de către senzor sunt zero pe toate axele .

Pentru a reduce timpul de identificare a offset-urilor s-a căutat o metoda mai ușoara pentru determinarea acestora, metoda automată. Metoda automată consta în următorul script MPU6050_calibration_v1.1.zip[18] care determină automat offset-urile iar aceste offset-uri se vor trece ca valoare a parametrilor descriși la punctul 2 descris la metoda manuală.

Datele primare furnizate de senzori, neprelucrate pot avea valori între [-32768, +32767] . În cazul giroscopului folosit pentru acest proiect domeniul ales este de ± 250º/sec cu precizia de 131 LSB/( º/sec) [15]. În cazul accelerometrului, domeniul ales este de ± 2g, iar precizia este de 16384 LSB/g[15]. Cu căt numărul este mai mare cu atât senzorul are precizia mai ridicată, precizia se poate determina împărțind domeniul ales cu numărul 32767.

O reprezentare a datelor primare cu offsetul determinat și implementat se poate observa în figura 50:

Figura 50. Date primare în format digital

Se poate observa ca datele sunt reprezentate în format digital cu valori între [-32768, +32767] în funcție de orientarea senzorilor. Coloanele de date ce se pot observa in figura 50 sunt cele 3 axe ale accelerometrului respectiv cele 3 ale giroscopului, primele 3 colane din stânga spre dreapta sunt datele furnizate de către accelerometru . Iar următoarele 3 coloane sunt datele furnizate de către giroscop și sunt în următoare ordinea X, Y, Z.

Datele care sunt marcate cu dreptunghiul negru numărul 1 sunt date achiziționate în timpul mișcări giroscopului și a accelerometrului și se pot observa vitezele unghiulare și accelerațiile pe fiecare axa .

În urma așezări giroscopului pe o suprafața plata datele furnizate de acesta vor arata asemănător cu cele din dreptunghiul roșu. Se poate observa ca pe axa Y a accelerometrului valoarea furnizata este aproximativ 16000, lucru ce se datorează faptului ca senzorul este poziționat cu axa y perpendicular spre suprafața pamatului. Valoare 16000 reprezintă accelerația gravitațională g=0.98 . În urma prelucrări datele vor avea forma din figura 51 :

Figura 51. Date primare în sistem metric

Se observă ca în urma prelucrării datelor primare furnizate de senzori se determina valoarea exacta a accelerației și vitezei unghiulare. La fa ca și în figura 51, datele marcate cu chenarul negru sunt date achiziționate în timpul mișcări giroscopului și a accelerometrului. Pentru a determina unghiul de deviație a modelului viteza unghiulara trebuie integrată .

Accelerometrul și giroscopul sunt folosite pentru determinarea unghiului de deviație de la punctul de zero. Daca vehiculul aerian este poziționat orizontala senzorul este în punctul de zero.

Pentru determinarea altitudinii sa folosit un altimetru barometric a cărei precizie s-a setat pe Ultra high resolution mode, Tabelul 2.6, cu o precizie de 0.03hPa (± 0.25m). Inițializarea comunicației între placa de dezvoltare și microcontroler se face de către microcontroler printr-o secvență de start pentru începerea măsurătorilor. Valorile măsurate pentru temperatură și presiunea atmosferică sunt transmise folosind protocolul de comunicație I2C. Valorile achiziționate sunt deja prelucrate cu ajutorul unor date de calibrare care sunt stocate pe o memorie de tip EEPROM. Din această cauză datele furnizate de către placa de dezvoltare nu se pot vizualiza în forma lor primară. Pentru determinarea altitudinii sunt necesare atât temperatura cat și presiunea [12].

4.3.3 Implementarea filtrului Kalman și filtrului de mediere

Giroscopul este foarte precis la începutul măsurătorilor dar cu trecerea timpului începe sa devieze de la punctul de zero din cauza unor perturbații si integrări constante, aceasta deviație cu trecerea timpului crește. Accelerometrul este precis pe lungă durată, dar este sensibil la vibrați pe când giroscopul nu este afectat de vibrațiile sistemului. Concluzia fiind ca giroscopul este bun la începutul măsurătorilor iar accelerometrul pe durate lungi .

4.3.3.1 [NUME_REDACTAT]

După filtrarea datelor cu filtrul Kalman eroarea este considerabil redusă eliminând eroarea cumulativă a giroscopului și sensibilitatea accelerometrului față de vibrații.

[NUME_REDACTAT] este un filtru liniar care elimină perturbațiile dintr-un semnal prin calcul recursiv. Pentru descrierea matematică a filtrului se utilizează conceptul de spațiu stărilor. În particular, fiecare nouă estimare a stării se calculează pe baza estimării anterioare și a noii valori a mărimii de intrare, astfel încât numai ultima estimare trebuie memorată asta eliminând nevoia de a folosi memorie de capacitate mare[4]. Acest filtru apare într-o gamă larga de domenii cum ar fi sisteme de localizare și navigare, identificare radar și determinarea orbitei sateliților.

Pentru evaluarea filtrului Kalman se urmează următorii pași [19]:

1. Starea de predicție pe baza unui model dinamic

Cea mai importanta parte a filtrului Kalman este modelul sistemului

Starea x este definită de 3 variabile, mărimea unghiului, viteza unghiulara și bias-ul vitezei unghiulare .

Ecuația stărilor este următoarea, se poate folosi pentru estimări decente.

F reprezintă matricea dinamicii sistemului, este un zgomot Gaussian cu media de zero. Daca rescriem matricea în funcție de obținem următoarea matrice:

Se observă ca unghiul din pasul curent va fi unghiul din pasul anterior, iar viteza unghiulara și bias-ul vitezei unghiulare sunt mici între cei doi pași.

2. Actualizarea matricei de stare a covarianței bazat pe un model.

O alta parte importantă a filtrului este matricea P a cârei valoare ne arata căt de aproape suntem de valoarea reala a variabilelor de stare, daca valoarea acestei matricei este mică înseamnă ca valoarea variabilelor de stare este aproape de cea reală.

reprezintă matrice transpusă, astfel P va fi scalat cu și cu matricea Q. Unde Q este matricea de covariație a zgomotului W.

Elementele de pe diagonala matricii reprezintă cat de mari pot fi erorile de model, acești parametrii fiind foarte importanți în setarea filtrului.

3. Diferențe de model și de măsurători

În aceasta parte este vorba de valoarea noua măsurata, aici starea calculata de către model este comparata cu valoarea ecuației

Matricea H mapeaza starea curenta a măsurătorilor

[NUME_REDACTAT] este zgomotul măsurătorilor care se datorează imperfecțiunilor constructive ale senzorilor.

4.Actualizarea măsurătorilor covariației

După introducerea datelor noi în forma de măsurători trebuie calculat matricea de covariație a acestor date care se notează cu S și este similara cu matricea P

Se observa ca S depinde de covariația predicției anterioare, cu cat covariația este mai mică cu atât valorile sunt mai mici și suntem aproape de valorile ideale. R este matricea de covarianța a măsurătorilor

5. Factor de amplificare a filtrului [NUME_REDACTAT] a calcula factorul de amplificare a filtrului Kalman înmulțim matricea P cu inversa matricei S și transpusa matricei H .

Daca valoarea matricii K este mică avem încredere mare în model și încredere redusa în măsurători iar daca valoarea matricii K este mare încrederea este redusa pentru partea de model și este ridicata pentru măsurători.

6. Îmbunătățirea modelului de predicție.

Pentru a îmbunătăți modelul de predicție valoarea matricei K este adăugata stări de predicție definita la punctul Nr.1

Actualizarea stări de covariație cu date noi

În urma adăugări datelor în formă de măsurători matricea de covariație a stărilor P trebuie actualizata.

Pentru a observa diferențele dintre datele prelucrate cu filtru Kalman și datele furnizate de către accelerometru și giroscop separat, s-a realizat un test unde s-au înregistrat datele de la senzori și filtru Kalman și au fost reprezentate pe aceeași figura .

Figura 52. Comparație date senzori și date filtrate (Kalman)

În figura 52 datele achiziționate de la giroscop(semnal culoare verde), accelerometru(semnal culoare albastru) și filtru Kalman (semnal culoare roșu) . Se observă că eroarea giroscopului începe sa crească cu trecerea timpului deoarece datele sunt integrate în continuu chiar și când senzorul nu este în mișcare acest fenomen se poate observa în grafic începând de la timestamp-ul 500. Pentru ca valoarea datelor giroscopului sa nu crească sau sa scadă la infinit s-a implementat o funcție care permite resetarea acestuia daca valoarea creste peste 180º sau scade sub -180º acest lucru se poate observa pe grafic la timestamp-ul cu valoarea aproximativa 2200. Se observa ca accelerometrul pe intervalul 500 – 2500 este stabil la fel și Kalman. Pe de alta parte accelerometru este sensibil la vibrațiile introduse în sistem. Asta se poate observa la timestamp-ul cu valoarea 2500, giroscopul nu este afectat de vibrații dar tot ii creste eroarea fata de poziția reala. De asemenea, se poate observa din grafic ca giroscopul urmărește mișcările sistemului chiar daca are eroare fata de poziția reala.

4.3.3.2 Implementarea filtrului de mediere cu alunecare FMA

Deoarece datele furnizate de altimetru sunt afectate de perturbații pentru a reduce zgomotele, datele furnizate de către senzor sunt trecute printr-un filtru de mediere cu alunecare. Acest filtru a fost ales deoarece nu necesita putere de calcul foarte mare, este rapid dacă numărul de elemente din setul de date nu este foarte mare dar nici foarte mic deoarece cu cât numărul de elemente a set-ului definit este mai mare cu atât datele filtrate sunt mai netede. Dezavantajul acestui filtru este ca introduce o întârziere în datele filtrate.

Algoritmul de implementare a filtrului de mediere cu alunecare FMA[16]:

1. Se definește un set de M elemente și se face media acestora .

2. Acest set se shifteaza la dreapta cu un element.

3. Primul element din acest set este eliminat.

4. Următorul element al șirului de date este introdus în acest set.

Se repeta pași de la 1 → 4 până când filtrul ajunge la capătul șirului

Formula de calcul a filtrului

Unde x este semnalul, y este ieșirea, M este setul de mediere care poate fi diferit ca și în exemplul de mai jos

Un sir de elemente aleatori a fost trecut prin filtrul de mediere cu alunecare cu 3 seturi de mediere cu un număr diferit de elemente (M5, M10, M15) pentru o mai buna observație a prelucrări datelor cu ajutorul filtrului, aceste date filtrate se pot observa în figura de mai jos .

Figura 53. Testarea filtrului FMA

Datele reale achiziționate de la altimetru se pot observa în figura 54

Figura 54. Evoluția altitudinii.

Figura 55. Evoluția altitudini folosind filtrul FMA

4.3.4 Implementarea sistemului de reglare a poziției pe axa verticală și orizontală.

În urma proiectări regulatoarelor pentru cele două sisteme de reglare a vehiculului aerian fără pilot sa trecut la implementarea acestor regulatoare și pe parte de software pentru a putea fi testate.

Cum sa menționat în subcapitolele anterioare nu sa folosit librăria PID care se poate găsi prealabil în mediul de dezvoltare Arduino deoarece nu este nevoie de întreaga librărie pentru acest proiect și din cauza resurselor reduse a placi de dezvoltare [NUME_REDACTAT], deoarece trebuie sa luam în considerare și librăriile celorlaltor componente, și desigur mărimea codului în sine .

Primul pas pentru implementarea regulatorului este aceea de a defini care date primite de la senzor se vor folosi și în ce mod se vor folosi acestea. Datele primite de la senzori sunt următoarele și se va explica fiecare data la ce se va folosi.

Accelerația pe axa X – În acest stagiu al proiectului nu se va folosi

Accelerația pe axa Y – se va folosi pentru determinarea unghiului de deviația de la poziția orizontala împreuna cu accelerația pe axa Z

Accelerația pe axa Z – se va folosi pentru determinarea unghiului Roll împreuna cu accelerația pe Y

Deplasarea unghiulară pe axa X – În acest stagiu al proiectului nu se va folosi

Deplasarea unghiulară pe axa Y – Se va folosi la calculul unghiului cu filtrului [NUME_REDACTAT] unghiulară pe axa Z – În acest stagiu al proiectului nu se va folosi

Altitudine – se va folosi ca mărimea măsurată pentru sistemul de reglare a altitudinii.

În urma definiri folosiri datelor de la senzori se vor defini datele care au fost obținute în urma prelucrări datelor achiziționate de la senzori .

[NUME_REDACTAT] – acesta a fost obținut în urma unor calcule folosind accelerațiile de pe axele Y și Z cu ajutorul următoarei formule Roll = atan2(Y,Z)*Rad_to_deg unde atan2(y,z) = 2*arctan (sqrt(Z^2 + Y^2)-Z)/ Y [11] iar rezultatul acestei formule este convertit în grade/sec deoarece rezultatul primit este în radian/sec. În urma acestor transformări rezultatul va fi folosit la calculul unghiului cu filtru Kalman.

Unghiul calculat cu filtru Kalman – acest unghi va fi mărimea măsurata pentru sistemul de reglare a echilibrului.

Implementarea regulatorului sa făcut urmărind următorul pseudocod .

dt = curent_time – old_time

Error = Referința – Mărime_măsurata

P = Error * Kp

SumErr = SumErr + Error (suma erorilor)

I = SumErr * Ki

Rata_schimbare = (Error – Ultima_eroare)/dt

D = Rata_schimbare * kd

Ultima_eroare = error

Old_time = curent_time

Pid = P + I + D

Control = Mărime_controlata + Pid

– 1

În figura 56 se poate observa o secvența din codul [NUME_REDACTAT] 56.Secventă de cod Arduino

4.4 Testarea sistemului de reglare a altitudinii și stabilizării vehiculului aerian

Fiecare dintre sistemele de reglare proiectate a fost testat individual.

4.4.1. Testarea sistemului de menținere echilibru

După etapa de proiectare și testarea la nivel de simulare a diferitelor tipuri de regulatoare s-a decis implementarea regulatoarelor de tip PID pentru ambele subsisteme ale sistemului de menținere echilibru.

În vederea testării performantelor pe sistemul real s-a dezvoltat un stand de testare prezentat în figura 57.

Figura 57. Stand testare sistem de menținere echilibru

Standul este construit din lemn de brad acesta se folosește pentru susținerea axul pe care este fixat aripa vehiculului pe perioada testelor. Standul va permite ca aripa vehiculului sa se incline cu ușurința.

4.4.2 Testarea sistemului de reglare a altitudinii

Testarea acestui sistem de reglare nu s-a realizat practic din cauza condițiilor de siguranță pentru evitarea deteriorării prototipului dezvoltat și dificultatea realizării unui stand de testare adecvat.

Capitolul 5. [NUME_REDACTAT] de licență intitulat „Proiectarea și implementarea unui sistem de reglare a altitudinii unui vehicul aerian fără pilot” se înscrie pe linia preocupărilor privind asimilarea, dezvoltarea și implementarea metodelor clasice de sinteză a sistemelor de reglare. Ideea de bază a lucrării constă în problema conducerii unui proces tehnologice complexe.

Obiectivele principale ale lucrării sunt următoarele.

– Analiza unui vehicul aerian fără pilot

– Determinarea unui model matematic folosind metode experimentale de identificare

– Validarea modelului matematic dezvoltat, prin simularea în Matlab respectiv în Matlab-SIMULINK a comportării sistemului și comparația cu datele experimentale achiziționate folosind prototipul dezvoltat

– Prezentarea aspectelor esențiale ale unor strategii clasice de control

– Aplicarea acestor strategii de control în cazul sistemului

– Simularea comportării sistemelor de reglare automată astfel obținute și compararea rezultatelor în vederea evaluării unei strategii recomandate

5.1. Contribuții personale

În cele ce urmează se prezintă contribuțiile aduse pentru soluționarea obiectivelor proiectului de licența.

Capitolul 2:

Descrierea la nivel de detaliu a componentelor hardware selectate pentru dezvoltarea prototipului

Dezvoltarea, validarea și simularea unui model matematic al sistemului

Capitolul 3:

Analiza metodelor clasice de control

Proiectarea și testarea unui algoritm de control convențional pentru controlul altitudinii precum și a menținerii echilibrului

Capitolul 4:

Descrierea realizării practice a prototipului

Implementarea software a soluției de control aleasa folosind mediul de dezvoltarea [NUME_REDACTAT] sistemului de menținere a echilibrului sistemului

5.2. Direcții de dezvoltare viitoare

Principalele direcții de dezvoltare constau în:

Dezvoltarea unui sistem de reglare convențional multivariabil

Îmbunătățirea componentelor hardware

Proiectarea unui fuzelaj nou folosind materiale mai potrivite

Proiectarea și implementarea sistemului de pivotare a motoarelor

Implementarea unui sistem de detectare și evitare a obstacolelor

Bibliografie

[1] ARDA ÖZGÜR KIVRAK, “Design of control systems for a

quadrotor flight vehicle equipped with inertial sensors”, Decembrie 2006

[2] Prof.Dr.Ing. Petru DOBRA, [NUME_REDACTAT], notițe de curs, anul III;

[3] Prof.Dr.Ing. Clemet FEȘTILĂ, [NUME_REDACTAT] Automate II, notițe de curs, anul III;

[4] Samuel W. FERGUSON, “Development and validation of a simulation for a generic tilt-rotor aircraft”, Aprilie 1989

[5] Christopher J. FISHER,” Using an Accelerometer for inclination sensing” , AN-1057

[6] Sl.Dr.Ing. Vlad MURESAN, [NUME_REDACTAT] [NUME_REDACTAT] de Laborator, anul IV;

[7] [NUME_REDACTAT], “Modern control engineering”, editia V,2010

[8] Kendoul, I. Fantoni, and R. Lozano. “Modeling and control of a small autonomous aircraft having two tilting rotors” în Proc. 44th IEEE Conf. [NUME_REDACTAT]/Euro.[NUME_REDACTAT]., Seville, Spain, Dec. 2005, pp. 8144–8149.

[9] Michael J PONT , “Programing embedded system I”, 2002-2006

[10] [NUME_REDACTAT], “Control of Quadcopter”, 2008

[11] Prof.Univ.Dr.Ing. [NUME_REDACTAT], “Ingineria reglarii automate II”, Targu-Mures,1999 [12] BMP180 datasheet www.adafruit.com, 5 Aprilie 2013

[13] MPU-6050 datasheet www. Invensense.com, 8 September 2013 (17)

[14] http://www.aie.ugal.ro/isa/Curs/Curs_10.pdf

[15] http://arduino.cc

[16] http://en.wikipedia.org/wiki/UAV

[17] http://www.analog.com/static/imported-files/tech_docs/dsp_book_Ch15.pdf

[18] http://www.i2cdevlib.com/forums/topic/96-arduino-sketch-to-automatically-calculate-mpu6050-offsets/

[19] http://www.linushelgesson.se/2012/04/pitch-and-roll-estimating-kalman-filter-for- stabilizing-quadrocopters/

[20] http://www.nongnu.org/avrdude/

Acronime

UAV – [NUME_REDACTAT] Vehicle

MEMS – [NUME_REDACTAT]

FMA – Filtru de Mediere cu Alunecare

BLDC – Brushless DC

SRA – Sistem de [NUME_REDACTAT]

ESC [NUME_REDACTAT] Controler

LiPo – [NUME_REDACTAT]

NiCD – [NUME_REDACTAT]

NiMH – Nickel – [NUME_REDACTAT]

MPU- [NUME_REDACTAT] Unit

ISP – [NUME_REDACTAT] [NUME_REDACTAT]

USB – [NUME_REDACTAT] Bus

UART – [NUME_REDACTAT] Receiver/Transmitter

I2C – [NUME_REDACTAT] Bus

SPI – [NUME_REDACTAT] [NUME_REDACTAT]

Secventa de cod implementata în mediul de dezvoltare Arduino.

Declarare librari , initializare variabile globale .

#include <Wire.h>

#include "Kalman.h"

#include <SFE_BMP180.h>

#define filterSamples 13

#define RESTRICT_PITCH

SFE_BMP180 pressure;

Kalman kalmanX; // Create the Kalman instances

Kalman kalmanY;

/* IMU Data */

double accX, accY, accZ;

double gyroX, gyroY, gyroZ;

int16_t tempRaw;

double gyroXangle, gyroYangle; // Angle calculate using the gyro only

double kalAngleX, kalAngleY; // Calculated angle using a Kalman filter

uint32_t timer;

uint8_t i2cData[14]; // Buffer for I2C data

int arm = 0;

int pwm=9;

int pwm10=10;

double T=1230;

double baseline; // baseline pressure

double rawData1 , smoothData1;

int sensSmoothArray1 [filterSamples];

Folosind funcția Setup() se declara pini pentru controlul motoarelor , setarea parametrilor pentru senzori , armarea ESC-urilor.

void setup()

{

pinMode(pwm,OUTPUT);

pinMode(pwm10,OUTPUT);

Serial.begin(115200);

Wire.begin();

TWBR = ((F_CPU / 400000L) – 16) / 2; // Set I2C frequency to 400kHz

if (pressure.begin())

Serial.println("BMP180 init success");

else

{

Serial.println("BMP180 init fail (disconnected?)\n\n");

while(1); // Pause forever.

}

i2cData[0] = 7; // Set the sample rate to 1000Hz – 8kHz/(7+1) = 1000Hz

i2cData[1] = 0x00; // Disable FSYNC and set 260 [NUME_REDACTAT] filtering, 256 [NUME_REDACTAT] filtering, 8 KHz sampling

i2cData[2] = 0x00; // [NUME_REDACTAT] [NUME_REDACTAT] Range to ±250deg/s

i2cData[3] = 0x00; // [NUME_REDACTAT] [NUME_REDACTAT] Range to ±2g

while (i2cWrite(0x19, i2cData, 4, false)); // Write to all four registers at once

while (i2cWrite(0x6B, 0x01, true)); // PLL with X axis gyroscope reference and disable sleep mode

while (i2cRead(0x75, i2cData, 1));

if (i2cData[0] != 0x68) { // Read "WHO_AM_I" register

Serial.print(F("Error reading sensor"));

while (1);

}

pinMode(pwm,OUTPUT);

baseline = getPressure();

Serial.print("baseline pressure: ");

Serial.print(baseline);

Serial.println(" mb");

/* Set kalman and gyro starting angle */

while (i2cRead(0x3B, i2cData, 6));

accX = (i2cData[0] << 8) | i2cData[1];

accY = (i2cData[2] << 8) | i2cData[3];

accZ = (i2cData[4] << 8) | i2cData[5];

#ifdef RESTRICT_PITCH

double roll = atan2(accY, accZ) * RAD_TO_DEG;

double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;

#else // Eq. 28 and 29

double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;

double pitch = atan2(-accX, accZ) * RAD_TO_DEG;

#endif

kalmanX.setAngle(roll); // Set starting angle

kalmanY.setAngle(pitch);

gyroXangle = roll;

gyroYangle = pitch;

timer = micros();

delay(5000);

for(arm=0;arm<500;arm += 1)

{

digitalWrite(pwm,HIGH);

digitalWrite(pwm10,HIGH);

delayMicroseconds(1100);

digitalWrite(pwm,LOW);

digitalWrite(pwm10,LOW);

delay(20);

}

}

inițializează și prescrierea valorilor inițiale, folosind funcția Loop(). Aceasta creează o bucla care permite schimbarea variabilelor la fiecare iterație fiind folosita pentru a controla în mod activ placa de dezvoltare.

void loop() {

/* Update all the values */

double PID_1,PID_2;

double error,lastErr,error1,sumErr,sumErr1;

double Last_T;

double impus = 0 ,impus1 = 1; //roll impus

double a,P;

int A_Imp = 1; //altimetru impus

int prop = 1;

double Ri = 0; //roll impus

while (i2cRead(0x3B, i2cData, 14));

accX = ((i2cData[0] << 8) | i2cData[1]) -394;

accY = ((i2cData[2] << 8) | i2cData[3]) -1788;

accZ = ((i2cData[4] << 8) | i2cData[5]) + 1559;

tempRaw = (i2cData[6] << 8) | i2cData[7];

gyroX = (i2cData[8] << 8) | i2cData[9] + 77;

gyroY = (i2cData[10] << 8) | i2cData[11] -4;

gyroZ = (i2cData[12] << 8) | i2cData[13] + 57;

double dt = (double)(micros() – timer) / 1000000; // Calculate delta time

timer = micros();

#ifdef RESTRICT_PITCH

double roll = atan2(accY, accZ) * RAD_TO_DEG;

double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;

#else

double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;

double pitch = atan2(-accX, accZ) * RAD_TO_DEG;

#endif

double gyroXrate = gyroX / 131.0; // Convert to deg/s

double gyroYrate = gyroY / 131.0; // Convert to deg/s

#ifdef RESTRICT_PITCH

// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees

if ((roll < -90 && kalAngleX > 90) || (roll > 90 && kalAngleX < -90)) {

kalmanX.setAngle(roll);

kalAngleX = roll;

gyroXangle = roll;

} else

kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter

if (abs(kalAngleX) > 90)

gyroYrate = -gyroYrate; // Invert rate, so it fits the restriced accelerometer reading

kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt);

#else

// This fixes the transition problem when the accelerometer angle jumps between -180 and 180 degrees

if ((pitch < -90 && kalAngleY > 90) || (pitch > 90 && kalAngleY < -90)) {

kalmanY.setAngle(pitch);

kalAngleY = pitch;

gyroYangle = pitch;

} else

kalAngleY = kalmanY.getAngle(pitch, gyroYrate, dt); // Calculate the angle using a Kalman filter

if (abs(kalAngleY) > 90)

gyroXrate = -gyroXrate; // Invert rate, so it fits the restriced accelerometer reading

kalAngleX = kalmanX.getAngle(roll, gyroXrate, dt); // Calculate the angle using a Kalman filter

#endif

Serial.print(kalAngleX); Serial.print(" kalAngleX \t");

P = getPressure();

a = pressure.altitude(P,baseline);

rawData1 = a ; // read sensor 1

smoothData1 = digitalSmooth(rawData1, sensSmoothArray1); // every sensor you use with digitalSmooth needs its own array

Serial.println(kalAngleX);

Calculu regulatoarelor și aceasta portiune de cod apartine functiei void Loop()

// PI altitud

error1 = impus1 – smoothData1;

if(error1 <= 2 && error1 >= -2)

{

error1 = 0 ;

}

sumErr1 += error1;

PID_2 = 281 * error1 + 0.02 * sumErr1 ;

if(PID_2 >= 100){PID_2= 100;}

if(PID_2 <= -100){PID_2= -100;}

//===============PID balance====================================

error= impus – kalAngleX;

if(error <= 2 && error >= -2)

{

error = 0 ;

}

sumErr += error;

double dErr = (error – lastErr)/dt;

PID_1 = 241 * error + 0.033 * sumErr + dErr * 0.0005;

lastErr=error;

if(PID_1 >= 100){PID_1 = 100;}

if(PID_1 <= -80){PID_1 = -80;}

Comanda

T = 1250 – PID_1 + PID_2 ;

//Serial.println(PID_);

if(T >= 1350)

{T = 1350 ;}

if(T <= 1250)

{T = 1250 ;}

digitalWrite(pwm,HIGH);

delayMicroseconds(T);

digitalWrite(pwm,LOW);

delay(5);

double temperature = (double)tempRaw / 340.0 + 36.53;

delay(50);

Achiyitonare date de la altimetru

double getPressure()

{

char status;

double T,P,p0,a;

status = pressure.startTemperature();

if (status != 0)

{

delay(status);

status = pressure.getTemperature(T);

if (status != 0)

{

status = pressure.startPressure(3);

if (status != 0)

{

delay(status);

status = pressure.getPressure(P,T);

if (status != 0)

{

return(P);

}

else Serial.println("error retrieving pressure measurement\n");

}

else Serial.println("error starting pressure measurement\n");

}

else Serial.println("error retrieving temperature measurement\n");

}

else Serial.println("error starting temperature measurement\n");

}

Filtru de mediere

double digitalSmooth(double rawIn, int *sensSmoothArray){ // "int *sensSmoothArray" passes an array to the function – the asterisk indicates the array name is a pointer

int j, k, temp, top, bottom;

int total;

static int i;

// static int raw[filterSamples];

static int sorted[filterSamples];

boolean done;

i = (i + 1) % filterSamples; // increment counter and roll over if necc. – % (modulo operator) rolls over variable

sensSmoothArray[i] = rawIn; // input new data into the oldest slot

// Serial.print("raw = ");

for (j=0; j<filterSamples; j++){ // transfer data array into anther array for sorting and averaging

sorted[j] = sensSmoothArray[j];

}

done = 0; // flag to know when we're done sorting

while(done != 1){ // simple swap sort, sorts numbers from lowest to highest

done = 1;

for (j = 0; j < (filterSamples – 1); j++){

if (sorted[j] > sorted[j + 1]){ // numbers are out of order – swap

temp = sorted[j + 1];

sorted [j+1] = sorted[j] ;

sorted [j] = temp;

done = 0;

}

}

}

bottom = max(((filterSamples * 15) / 100), 1);

top = min((((filterSamples * 85) / 100) + 1 ), (filterSamples – 1)); // the + 1 is to make up for asymmetry caused by integer rounding

k = 0;

total = 0;

for ( j = bottom; j< top; j++){

total += sorted[j];

k++;

}

return total / k; // divide by number of samples

}

Similar Posts