Laboratory
Dependencies: mbed BufferedSerial LSM6DS33
main.cpp@2:aa102819471f, 2022-05-19 (annotated)
- Committer:
- abm_mechatronika
- Date:
- Thu May 19 14:01:44 2022 +0000
- Revision:
- 2:aa102819471f
- Parent:
- 1:6e9fe61d7074
2022
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
abm_mechatronika | 1:6e9fe61d7074 | 1 | //Program na NUCLEO F429ZI |
abm_mechatronika | 1:6e9fe61d7074 | 2 | |
Lukasz_K | 0:a7c396f2ccf6 | 3 | #include "mbed.h" |
Lukasz_K | 0:a7c396f2ccf6 | 4 | #include "BufferedSerial.h" |
Lukasz_K | 0:a7c396f2ccf6 | 5 | #include "LSM6DS33.h" |
Lukasz_K | 0:a7c396f2ccf6 | 6 | #include "math.h" |
Lukasz_K | 0:a7c396f2ccf6 | 7 | #include <stdio.h> |
Lukasz_K | 0:a7c396f2ccf6 | 8 | |
Lukasz_K | 0:a7c396f2ccf6 | 9 | /*PwmOut rled(LED_RED); |
Lukasz_K | 0:a7c396f2ccf6 | 10 | PwmOut gled(LED_GREEN); |
Lukasz_K | 0:a7c396f2ccf6 | 11 | PwmOut bled(LED_BLUE);*/ |
Lukasz_K | 0:a7c396f2ccf6 | 12 | |
Lukasz_K | 0:a7c396f2ccf6 | 13 | //deklaracje funkcji |
Lukasz_K | 0:a7c396f2ccf6 | 14 | void testy_czujnika(); //wolne obroty wybranego przegubu |
Lukasz_K | 0:a7c396f2ccf6 | 15 | void zadajnik_odbiornik(); //zadawanie położenia odebranego z zadajnika |
Lukasz_K | 0:a7c396f2ccf6 | 16 | void sekwencja_pokazowa(); //przykładowa ścieżka ruchu urządzenia |
Lukasz_K | 0:a7c396f2ccf6 | 17 | void stabilizacja_smartfon(); //zadawanie położenia odebranego z aplikacji |
Lukasz_K | 0:a7c396f2ccf6 | 18 | void predkosc_kat(); //zamiana prędkosci obrotowej na kąt |
Lukasz_K | 0:a7c396f2ccf6 | 19 | void regulacja(); //funkcja regulacji |
Lukasz_K | 0:a7c396f2ccf6 | 20 | void regulacja2(); //funkcja regulacji 2 |
Lukasz_K | 0:a7c396f2ccf6 | 21 | void stream_pc(); //wysyłanie danych na port usb |
Lukasz_K | 0:a7c396f2ccf6 | 22 | void stream_telefon(); //wysyłanie danych do modułu Bluetooth |
Lukasz_K | 0:a7c396f2ccf6 | 23 | void odbiornik(); //odbiór danych z zadajnika |
Lukasz_K | 0:a7c396f2ccf6 | 24 | void odbiornik2(); //odbiór danych z aplikacji mobilnej |
Lukasz_K | 0:a7c396f2ccf6 | 25 | void stabilizacja_zero(); //stabilizacja położenia dla stałej wartości 0 |
abm_mechatronika | 1:6e9fe61d7074 | 26 | void odczyt_pozycji_gimbala(); //odczyt danych z czujnika Pololu MinIMU-9 v5 |
Lukasz_K | 0:a7c396f2ccf6 | 27 | double arc_tan_2(double a, double b); //funkcja zamiany przyśpieszenia na kąt |
Lukasz_K | 0:a7c396f2ccf6 | 28 | |
Lukasz_K | 0:a7c396f2ccf6 | 29 | //BUTTON |
abm_mechatronika | 1:6e9fe61d7074 | 30 | DigitalOut led1(LED1); //żółta |
abm_mechatronika | 1:6e9fe61d7074 | 31 | DigitalOut led2(LED2); //niebieska |
abm_mechatronika | 1:6e9fe61d7074 | 32 | DigitalOut led3(LED3); //czerwona |
abm_mechatronika | 1:6e9fe61d7074 | 33 | InterruptIn button1(USER_BUTTON); //niebiski przycisk |
Lukasz_K | 0:a7c396f2ccf6 | 34 | volatile bool button1_pressed = false; // Użyte w pętli głównej |
abm_mechatronika | 1:6e9fe61d7074 | 35 | volatile bool button1_enabled = true; // Eliminacja wpływu drgania styków |
abm_mechatronika | 1:6e9fe61d7074 | 36 | Timeout button1_timeout; // Drganie styków - zwłoka |
Lukasz_K | 0:a7c396f2ccf6 | 37 | |
Lukasz_K | 0:a7c396f2ccf6 | 38 | //TICKER |
abm_mechatronika | 1:6e9fe61d7074 | 39 | float sampling_time = 0.2; //częstotiwosc zapisu na konsolę PC (terminal) w funkcji przerwania |
Lukasz_K | 0:a7c396f2ccf6 | 40 | Ticker trigger1; //predkosc_kat |
abm_mechatronika | 1:6e9fe61d7074 | 41 | Ticker trigger2; //stream na termial |
Lukasz_K | 0:a7c396f2ccf6 | 42 | |
Lukasz_K | 0:a7c396f2ccf6 | 43 | //Wyjscia PWM dla trzech silników |
abm_mechatronika | 1:6e9fe61d7074 | 44 | PwmOut MOTOR_1(PB_3); //ogniwo 1 - od zewnętrznej |
Lukasz_K | 0:a7c396f2ccf6 | 45 | PwmOut MOTOR_2(PB_4); //ogniwo 2 |
Lukasz_K | 0:a7c396f2ccf6 | 46 | PwmOut MOTOR_3(PB_5); //ogniwo 3 |
Lukasz_K | 0:a7c396f2ccf6 | 47 | |
Lukasz_K | 0:a7c396f2ccf6 | 48 | DigitalOut OBROTY_M1(PE_13); //Kierunek obrotów dla trzech silników(stan 0/1) |
Lukasz_K | 0:a7c396f2ccf6 | 49 | DigitalOut OBROTY_M2(PE_14); |
Lukasz_K | 0:a7c396f2ccf6 | 50 | DigitalOut OBROTY_M3(PE_15); |
Lukasz_K | 0:a7c396f2ccf6 | 51 | |
Lukasz_K | 0:a7c396f2ccf6 | 52 | //=============REGULACJA====================== |
Lukasz_K | 0:a7c396f2ccf6 | 53 | int obecna_pozycja=0; |
abm_mechatronika | 1:6e9fe61d7074 | 54 | float e_x=0, e_x_poprzednie=0; //uchyby położeń kątowych |
Lukasz_K | 0:a7c396f2ccf6 | 55 | float e_y=0, e_y_poprzednie=0; |
Lukasz_K | 0:a7c396f2ccf6 | 56 | float e_z=0, e_z_poprzednie=0; |
abm_mechatronika | 1:6e9fe61d7074 | 57 | int docelowa_pozycja_x=0, docelowa_pozycja_y=0, docelowa_pozycja_z=0; //wartosc zadana |
abm_mechatronika | 1:6e9fe61d7074 | 58 | double pwm1, pwm2, pwm3; //sygnały sterujace |
Lukasz_K | 0:a7c396f2ccf6 | 59 | |
abm_mechatronika | 1:6e9fe61d7074 | 60 | volatile double z_kat,x_kat,y_kat; //wartosc aktualna |
Lukasz_K | 0:a7c396f2ccf6 | 61 | |
abm_mechatronika | 1:6e9fe61d7074 | 62 | float Ix=0, Iy=0, Iz=0; //Stałe regulatora PID |
Lukasz_K | 0:a7c396f2ccf6 | 63 | float Dx=0, Dy=0, Dz=0; |
Lukasz_K | 0:a7c396f2ccf6 | 64 | float Kp=0.2, Ki=0.05, Kd=0.01; //0.2, 0.05, 0.01 |
Lukasz_K | 0:a7c396f2ccf6 | 65 | |
Lukasz_K | 0:a7c396f2ccf6 | 66 | //===============STREAM======================= |
Lukasz_K | 0:a7c396f2ccf6 | 67 | //Serial pc(USBTX,USBRX); //BLUETOOTH // komunikacja z PC |
Lukasz_K | 0:a7c396f2ccf6 | 68 | BufferedSerial pc(USBTX,USBRX); //PC |
abm_mechatronika | 1:6e9fe61d7074 | 69 | Serial device_bt(PD_5, PD_6); //TX, RX aplikacja/modul Bluetooth |
abm_mechatronika | 1:6e9fe61d7074 | 70 | Serial device_zadajnik(PC_10, PC_11); //TX, RX zadajnik |
Lukasz_K | 0:a7c396f2ccf6 | 71 | char buffer[24]; |
abm_mechatronika | 1:6e9fe61d7074 | 72 | |
Lukasz_K | 0:a7c396f2ccf6 | 73 | //===============BUTTON======================== |
Lukasz_K | 0:a7c396f2ccf6 | 74 | // Enables button when bouncing is over |
Lukasz_K | 0:a7c396f2ccf6 | 75 | void button1_enabled_cb(void) |
Lukasz_K | 0:a7c396f2ccf6 | 76 | { |
Lukasz_K | 0:a7c396f2ccf6 | 77 | button1_enabled = true; |
Lukasz_K | 0:a7c396f2ccf6 | 78 | } |
Lukasz_K | 0:a7c396f2ccf6 | 79 | |
abm_mechatronika | 1:6e9fe61d7074 | 80 | int tryb = 0; //tryby pracy 1-5 |
abm_mechatronika | 1:6e9fe61d7074 | 81 | |
Lukasz_K | 0:a7c396f2ccf6 | 82 | // ISR handling button pressed event |
Lukasz_K | 0:a7c396f2ccf6 | 83 | void button1_onpressed_cb(void) |
Lukasz_K | 0:a7c396f2ccf6 | 84 | { |
Lukasz_K | 0:a7c396f2ccf6 | 85 | if (button1_enabled) { // Disabled while the button is bouncing |
Lukasz_K | 0:a7c396f2ccf6 | 86 | button1_enabled = false; |
Lukasz_K | 0:a7c396f2ccf6 | 87 | button1_pressed = true; // To be read by the main loop |
Lukasz_K | 0:a7c396f2ccf6 | 88 | button1_timeout.attach(callback(button1_enabled_cb), 0.3); // Debounce time 300 ms |
Lukasz_K | 0:a7c396f2ccf6 | 89 | tryb++; |
Lukasz_K | 0:a7c396f2ccf6 | 90 | if(tryb>=6){tryb=1;} |
Lukasz_K | 0:a7c396f2ccf6 | 91 | } |
Lukasz_K | 0:a7c396f2ccf6 | 92 | } |
Lukasz_K | 0:a7c396f2ccf6 | 93 | //===================KOMUNIKACJA Z CZUJNIKIEM=================================== |
abm_mechatronika | 1:6e9fe61d7074 | 94 | volatile double a_x; //deklaracja zmiennych akcelerometru |
Lukasz_K | 0:a7c396f2ccf6 | 95 | volatile double a_y; |
Lukasz_K | 0:a7c396f2ccf6 | 96 | volatile double a_z; |
Lukasz_K | 0:a7c396f2ccf6 | 97 | |
abm_mechatronika | 1:6e9fe61d7074 | 98 | volatile double g_x; //deklaracja zmiennych żyroskopu |
Lukasz_K | 0:a7c396f2ccf6 | 99 | volatile double g_y; |
Lukasz_K | 0:a7c396f2ccf6 | 100 | volatile double g_z; |
Lukasz_K | 0:a7c396f2ccf6 | 101 | |
Lukasz_K | 0:a7c396f2ccf6 | 102 | volatile double z_stopnie; |
Lukasz_K | 0:a7c396f2ccf6 | 103 | |
Lukasz_K | 0:a7c396f2ccf6 | 104 | //===================KOMUNIKACJA Z ZADAJNIKIEM================================== |
abm_mechatronika | 1:6e9fe61d7074 | 105 | volatile float X=0; //zmiennne globalne - kąty obrotu zadajnika przesłane przez UART |
Lukasz_K | 0:a7c396f2ccf6 | 106 | volatile float Y=0; |
Lukasz_K | 0:a7c396f2ccf6 | 107 | volatile float Z=0; |
Lukasz_K | 0:a7c396f2ccf6 | 108 | |
Lukasz_K | 0:a7c396f2ccf6 | 109 | //======================PINY DLA CZUJNIKA======================================= |
Lukasz_K | 0:a7c396f2ccf6 | 110 | LSM6DS33 gimbal(PB_9, PB_8, LSM6DS33_AG_I2C_ADDR(1)); //akcelerometr i żyroskop |
Lukasz_K | 0:a7c396f2ccf6 | 111 | |
Lukasz_K | 0:a7c396f2ccf6 | 112 | //===========PĘTLA GŁÓWNA======================================================= |
Lukasz_K | 0:a7c396f2ccf6 | 113 | int main() |
Lukasz_K | 0:a7c396f2ccf6 | 114 | { |
Lukasz_K | 0:a7c396f2ccf6 | 115 | pc.baud(115200); |
abm_mechatronika | 1:6e9fe61d7074 | 116 | device_bt.baud(9600); //transmisja danych Bluetooth |
abm_mechatronika | 1:6e9fe61d7074 | 117 | device_zadajnik.baud(115200); //zadajnik - odbiornik |
Lukasz_K | 0:a7c396f2ccf6 | 118 | |
Lukasz_K | 0:a7c396f2ccf6 | 119 | //prędkosci silników(wypełnienie PWM) |
abm_mechatronika | 1:6e9fe61d7074 | 120 | MOTOR_1.period(0.002f); // 2 milisecond period (500Hz) |
abm_mechatronika | 1:6e9fe61d7074 | 121 | MOTOR_1.write(1.0f); // wypełnienie (1.0=0%, 0.0=100%) z krokiem 0.01f |
abm_mechatronika | 1:6e9fe61d7074 | 122 | MOTOR_2.period(0.002f); // 2 ms |
abm_mechatronika | 1:6e9fe61d7074 | 123 | MOTOR_2.write(1.0f); |
abm_mechatronika | 1:6e9fe61d7074 | 124 | MOTOR_3.period(0.002f); // 2 ms |
abm_mechatronika | 1:6e9fe61d7074 | 125 | MOTOR_3.write(1.0f); |
Lukasz_K | 0:a7c396f2ccf6 | 126 | |
Lukasz_K | 0:a7c396f2ccf6 | 127 | //LSM6DS33 gimbal(PB_9, PB_8); //akcelerometr i żyroskop |
Lukasz_K | 0:a7c396f2ccf6 | 128 | wait(0.001); |
Lukasz_K | 0:a7c396f2ccf6 | 129 | |
abm_mechatronika | 1:6e9fe61d7074 | 130 | //PRZERWANIA================ |
abm_mechatronika | 1:6e9fe61d7074 | 131 | button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event -zwolnienie niebieskiego przycisku |
Lukasz_K | 0:a7c396f2ccf6 | 132 | // Delay for initial pullup to take effect |
abm_mechatronika | 1:6e9fe61d7074 | 133 | wait(0.001); |
abm_mechatronika | 1:6e9fe61d7074 | 134 | trigger2.attach(&stream_pc, sampling_time); //wsysyłanie danych w przerwaniu (stream PC) na terminal |
Lukasz_K | 0:a7c396f2ccf6 | 135 | //trigger1.attach(&predkosc_kat, sampling_time); |
Lukasz_K | 0:a7c396f2ccf6 | 136 | |
abm_mechatronika | 1:6e9fe61d7074 | 137 | while(1) |
Lukasz_K | 0:a7c396f2ccf6 | 138 | { |
Lukasz_K | 0:a7c396f2ccf6 | 139 | if(button1_pressed) |
Lukasz_K | 0:a7c396f2ccf6 | 140 | { |
Lukasz_K | 0:a7c396f2ccf6 | 141 | if(tryb==1) //ODBIORNIK - STREAM TELEFON |
Lukasz_K | 0:a7c396f2ccf6 | 142 | { |
Lukasz_K | 0:a7c396f2ccf6 | 143 | led1 = 1; led2 = 0; led3 = 0; |
abm_mechatronika | 1:6e9fe61d7074 | 144 | //odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 145 | //testy_czujnika(); |
Lukasz_K | 0:a7c396f2ccf6 | 146 | //pc.printf(" %.2f\n\r", z_stopnie); |
Lukasz_K | 0:a7c396f2ccf6 | 147 | //pc.printf(" %.2f\n\r", arc_tan_2(a_y,a_z)); |
Lukasz_K | 0:a7c396f2ccf6 | 148 | /////// |
abm_mechatronika | 1:6e9fe61d7074 | 149 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 150 | stream_telefon(); |
Lukasz_K | 0:a7c396f2ccf6 | 151 | |
abm_mechatronika | 1:6e9fe61d7074 | 152 | //studenci wybieraja okreslana funkcje |
abm_mechatronika | 1:6e9fe61d7074 | 153 | |
Lukasz_K | 0:a7c396f2ccf6 | 154 | //odbiornik(); |
Lukasz_K | 0:a7c396f2ccf6 | 155 | //stabilizacja_smartfon(); |
Lukasz_K | 0:a7c396f2ccf6 | 156 | |
Lukasz_K | 0:a7c396f2ccf6 | 157 | //predkosc_kat(); |
Lukasz_K | 0:a7c396f2ccf6 | 158 | //stabilizacja_zero(); //!!!! |
Lukasz_K | 0:a7c396f2ccf6 | 159 | |
Lukasz_K | 0:a7c396f2ccf6 | 160 | //predkosc_kat(); |
Lukasz_K | 0:a7c396f2ccf6 | 161 | //odbiornik2(); |
Lukasz_K | 0:a7c396f2ccf6 | 162 | //zadajnik_odbiornik(); |
abm_mechatronika | 1:6e9fe61d7074 | 163 | } |
abm_mechatronika | 1:6e9fe61d7074 | 164 | if(tryb==2) //ZADAJNIK - STABILIZACJA "0" |
Lukasz_K | 0:a7c396f2ccf6 | 165 | { |
abm_mechatronika | 1:6e9fe61d7074 | 166 | led1 = 0; led2 = 0; led3 = 1; |
abm_mechatronika | 1:6e9fe61d7074 | 167 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 168 | stabilizacja_zero(); //!!!! |
Lukasz_K | 0:a7c396f2ccf6 | 169 | } |
abm_mechatronika | 1:6e9fe61d7074 | 170 | if(tryb==3) //ZADAJNIK-ODBIORNIK |
Lukasz_K | 0:a7c396f2ccf6 | 171 | { |
Lukasz_K | 0:a7c396f2ccf6 | 172 | led1 = 1; led2 = 0; led3 = 1; |
abm_mechatronika | 1:6e9fe61d7074 | 173 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 174 | odbiornik2(); |
Lukasz_K | 0:a7c396f2ccf6 | 175 | zadajnik_odbiornik(); |
Lukasz_K | 0:a7c396f2ccf6 | 176 | } |
abm_mechatronika | 1:6e9fe61d7074 | 177 | if(tryb==4) |
Lukasz_K | 0:a7c396f2ccf6 | 178 | { |
Lukasz_K | 0:a7c396f2ccf6 | 179 | led1 = 1; led2 = 1; led3 = 1; |
Lukasz_K | 0:a7c396f2ccf6 | 180 | wait(0.02); |
Lukasz_K | 0:a7c396f2ccf6 | 181 | sekwencja_pokazowa(); |
Lukasz_K | 0:a7c396f2ccf6 | 182 | } |
abm_mechatronika | 1:6e9fe61d7074 | 183 | if(tryb==5) //SMARTFON-ODBIORNIK |
abm_mechatronika | 1:6e9fe61d7074 | 184 | { |
abm_mechatronika | 1:6e9fe61d7074 | 185 | led1 = 0; led2 = 1; led3 = 0; |
abm_mechatronika | 1:6e9fe61d7074 | 186 | odczyt_pozycji_gimbala(); |
abm_mechatronika | 1:6e9fe61d7074 | 187 | odbiornik(); //wartosci zadane polozeniem telefonu |
abm_mechatronika | 1:6e9fe61d7074 | 188 | stabilizacja_smartfon(); |
abm_mechatronika | 1:6e9fe61d7074 | 189 | } |
Lukasz_K | 0:a7c396f2ccf6 | 190 | }//KONIEC WARUNKU BUTTON |
Lukasz_K | 0:a7c396f2ccf6 | 191 | }//KONIEC PĘTLI WHILE |
Lukasz_K | 0:a7c396f2ccf6 | 192 | }//KONIEC PĘTLI MAIN |
Lukasz_K | 0:a7c396f2ccf6 | 193 | |
Lukasz_K | 0:a7c396f2ccf6 | 194 | //===========_STREAM_======================================================= |
Lukasz_K | 0:a7c396f2ccf6 | 195 | void stream_pc() { //funkcja streamu |
Lukasz_K | 0:a7c396f2ccf6 | 196 | //KONSOLA PC |
Lukasz_K | 0:a7c396f2ccf6 | 197 | //pc.printf(" %.2f ", Y); |
Lukasz_K | 0:a7c396f2ccf6 | 198 | //pc.printf(" %.2f\n\r", arc_tan_2(a_y,a_z)); |
Lukasz_K | 0:a7c396f2ccf6 | 199 | //pc.printf(" %.2f\n\r", arc_tan_2(a_y,a_z)); |
Lukasz_K | 0:a7c396f2ccf6 | 200 | //pc.printf(" %.2f\n\r", z_stopnie); |
Lukasz_K | 0:a7c396f2ccf6 | 201 | |
Lukasz_K | 0:a7c396f2ccf6 | 202 | //sprintf((char*)buffer, " %.2f %.2f %.2f\n\r",gimbal.ax, gimbal.ay, gimbal.az); |
Lukasz_K | 0:a7c396f2ccf6 | 203 | //pc.printf(buffer); |
Lukasz_K | 0:a7c396f2ccf6 | 204 | |
abm_mechatronika | 1:6e9fe61d7074 | 205 | //studenci moga wybrav sposrod trzech komend |
Lukasz_K | 0:a7c396f2ccf6 | 206 | sprintf((char*)buffer, " %.2f %.2f %.2f\n\r",a_x, a_y, a_z); |
Lukasz_K | 0:a7c396f2ccf6 | 207 | pc.printf(buffer); |
Lukasz_K | 0:a7c396f2ccf6 | 208 | |
Lukasz_K | 0:a7c396f2ccf6 | 209 | //sprintf((char*)buffer, " %.2f %.2f %.2f\n\r",gimbal.gx, gimbal.gy, gimbal.gz); |
Lukasz_K | 0:a7c396f2ccf6 | 210 | //pc.printf(buffer); |
Lukasz_K | 0:a7c396f2ccf6 | 211 | |
Lukasz_K | 0:a7c396f2ccf6 | 212 | //sprintf((char*)buffer, " %.2f %.2f %.2f\n\r",g_x, g_y, g_z); |
Lukasz_K | 0:a7c396f2ccf6 | 213 | //pc.printf(buffer); |
Lukasz_K | 0:a7c396f2ccf6 | 214 | |
Lukasz_K | 0:a7c396f2ccf6 | 215 | } |
abm_mechatronika | 1:6e9fe61d7074 | 216 | void stream_telefon(){ //wysłanie jednej ze wspolrzednych przez Bluetooth |
Lukasz_K | 0:a7c396f2ccf6 | 217 | //MODUŁ BLUETOOTH |
abm_mechatronika | 1:6e9fe61d7074 | 218 | float dane = (arc_tan_2(a_y,a_z)+180); //+180 stopni aby przesunąc wykres w aplikacji |
Lukasz_K | 0:a7c396f2ccf6 | 219 | |
abm_mechatronika | 1:6e9fe61d7074 | 220 | device_bt.putc(0); |
Lukasz_K | 0:a7c396f2ccf6 | 221 | sprintf((char*)buffer,"%.2f", dane); |
abm_mechatronika | 1:6e9fe61d7074 | 222 | device_bt.printf(buffer); |
Lukasz_K | 0:a7c396f2ccf6 | 223 | |
Lukasz_K | 0:a7c396f2ccf6 | 224 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 225 | } |
Lukasz_K | 0:a7c396f2ccf6 | 226 | //===================ODCZYT_POZYCJI========================================= |
abm_mechatronika | 1:6e9fe61d7074 | 227 | void odczyt_pozycji_gimbala(){ |
Lukasz_K | 0:a7c396f2ccf6 | 228 | gimbal.begin(); |
Lukasz_K | 0:a7c396f2ccf6 | 229 | gimbal.readAll(); |
Lukasz_K | 0:a7c396f2ccf6 | 230 | |
abm_mechatronika | 1:6e9fe61d7074 | 231 | float *wsk1 = &gimbal.ax; //odczyt z czujnika przyspieszenia |
Lukasz_K | 0:a7c396f2ccf6 | 232 | float *wsk2 = &gimbal.ay; |
Lukasz_K | 0:a7c396f2ccf6 | 233 | float *wsk3 = &gimbal.az; |
Lukasz_K | 0:a7c396f2ccf6 | 234 | |
abm_mechatronika | 1:6e9fe61d7074 | 235 | float *wsk4 = &gimbal.gx; //odczyt z czujnika prędkosci |
Lukasz_K | 0:a7c396f2ccf6 | 236 | float *wsk5 = &gimbal.gy; |
Lukasz_K | 0:a7c396f2ccf6 | 237 | float *wsk6 = &gimbal.gz; |
Lukasz_K | 0:a7c396f2ccf6 | 238 | |
abm_mechatronika | 1:6e9fe61d7074 | 239 | a_x= *wsk1; |
Lukasz_K | 0:a7c396f2ccf6 | 240 | a_y= *wsk2; |
Lukasz_K | 0:a7c396f2ccf6 | 241 | a_z= *wsk3; |
Lukasz_K | 0:a7c396f2ccf6 | 242 | |
Lukasz_K | 0:a7c396f2ccf6 | 243 | g_x= *wsk4; |
Lukasz_K | 0:a7c396f2ccf6 | 244 | g_y= *wsk5; |
Lukasz_K | 0:a7c396f2ccf6 | 245 | g_z= *wsk6; |
Lukasz_K | 0:a7c396f2ccf6 | 246 | |
abm_mechatronika | 1:6e9fe61d7074 | 247 | wait(0.005); //czas próbkowaia czujnika Pololu |
Lukasz_K | 0:a7c396f2ccf6 | 248 | } |
Lukasz_K | 0:a7c396f2ccf6 | 249 | |
Lukasz_K | 0:a7c396f2ccf6 | 250 | //>>>>>>>>>>>>>>>>>>>_FUNKCJA_ATAN2_>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
abm_mechatronika | 1:6e9fe61d7074 | 251 | double arc_tan_2(double a, double b) //a - x lub y, b - z (funkcja oblicza kąty wokół osi x, y) |
Lukasz_K | 0:a7c396f2ccf6 | 252 | { |
Lukasz_K | 0:a7c396f2ccf6 | 253 | double stopnie; |
Lukasz_K | 0:a7c396f2ccf6 | 254 | double val = 180.0/3.14; |
Lukasz_K | 0:a7c396f2ccf6 | 255 | stopnie = atan2(a,b)*val; |
Lukasz_K | 0:a7c396f2ccf6 | 256 | return stopnie; |
Lukasz_K | 0:a7c396f2ccf6 | 257 | } |
Lukasz_K | 0:a7c396f2ccf6 | 258 | |
Lukasz_K | 0:a7c396f2ccf6 | 259 | //@@@@@@@@@@@_PRĘDKOŚĆ_NA_KĄT_@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
Lukasz_K | 0:a7c396f2ccf6 | 260 | void predkosc_kat(){ |
Lukasz_K | 0:a7c396f2ccf6 | 261 | |
Lukasz_K | 0:a7c396f2ccf6 | 262 | double z_rad = g_z; //przypisanie zmiennej z czujnika do zmiennej lokalnej |
Lukasz_K | 0:a7c396f2ccf6 | 263 | if(z_rad>=-4.5&&z_rad<=-2.0){z_rad=0.0;} //dla wart 0 czujnik wskazuje ~-3,6 |
Lukasz_K | 0:a7c396f2ccf6 | 264 | double delta_t=0.02; //funkcja wywoływana jest co 2,5 milisekund |
Lukasz_K | 0:a7c396f2ccf6 | 265 | double delta_kat=(z_rad*delta_t); //różnica kątowa= wart. czujnika * dt |
Lukasz_K | 0:a7c396f2ccf6 | 266 | z_kat=z_kat+delta_kat; //ostateczny kąt = kąt obecny + d kąta |
Lukasz_K | 0:a7c396f2ccf6 | 267 | z_stopnie = z_kat*(180/3.14); //zamiana radianów na stopnie |
Lukasz_K | 0:a7c396f2ccf6 | 268 | } |
Lukasz_K | 0:a7c396f2ccf6 | 269 | |
Lukasz_K | 0:a7c396f2ccf6 | 270 | //&&&&&&&&&&&®ULACJA&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& |
Lukasz_K | 0:a7c396f2ccf6 | 271 | void regulacja(){ |
Lukasz_K | 0:a7c396f2ccf6 | 272 | Kp=0.2, Ki=0.05, Kd=0.01; |
Lukasz_K | 0:a7c396f2ccf6 | 273 | |
Lukasz_K | 0:a7c396f2ccf6 | 274 | docelowa_pozycja_x=X; //pozycja docelowa dla zadajników |
Lukasz_K | 0:a7c396f2ccf6 | 275 | docelowa_pozycja_y=Y; |
Lukasz_K | 0:a7c396f2ccf6 | 276 | docelowa_pozycja_z=Z; |
Lukasz_K | 0:a7c396f2ccf6 | 277 | |
Lukasz_K | 0:a7c396f2ccf6 | 278 | e_x=docelowa_pozycja_x-arc_tan_2(a_x,a_z); //uchyb regulacji |
Lukasz_K | 0:a7c396f2ccf6 | 279 | e_y=docelowa_pozycja_y-arc_tan_2(a_y,a_z); |
Lukasz_K | 0:a7c396f2ccf6 | 280 | e_z=docelowa_pozycja_z-z_stopnie; |
Lukasz_K | 0:a7c396f2ccf6 | 281 | |
Lukasz_K | 0:a7c396f2ccf6 | 282 | Ix=Ix+e_x; |
Lukasz_K | 0:a7c396f2ccf6 | 283 | Iy=Iy+e_y; |
Lukasz_K | 0:a7c396f2ccf6 | 284 | Iz=Iz+e_z; |
Lukasz_K | 0:a7c396f2ccf6 | 285 | |
Lukasz_K | 0:a7c396f2ccf6 | 286 | Dx=e_x - e_x_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 287 | Dy=e_y - e_y_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 288 | Dz=e_z - e_z_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 289 | |
Lukasz_K | 0:a7c396f2ccf6 | 290 | //pwm1=(Kp*e_x); //P |
Lukasz_K | 0:a7c396f2ccf6 | 291 | //pwm1=(Kp*e_x)+(Ki*Ix); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 292 | pwm1=(Kp*e_x)+(Kd*Dx); //PD |
Lukasz_K | 0:a7c396f2ccf6 | 293 | //pwm1=(Kp*e_x)+(Ki*Ix)+(Kd*Dx); //PID |
Lukasz_K | 0:a7c396f2ccf6 | 294 | //pwm2=(Kp*e_y); //P |
Lukasz_K | 0:a7c396f2ccf6 | 295 | //pwm2=(Kp*e_y)+(Ki*Iy); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 296 | pwm2=(Kp*e_y)+(Kd*Dy); //PD |
Lukasz_K | 0:a7c396f2ccf6 | 297 | //pwm2=(Kp*e_y)+(Ki*Iy)+(Kd*Dy); //PID |
Lukasz_K | 0:a7c396f2ccf6 | 298 | //pwm3=(Kp*e_z); //P |
Lukasz_K | 0:a7c396f2ccf6 | 299 | //pwm3=(Kp*e_z)+(Ki*Iz); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 300 | pwm3=(Kp*e_z)+(Kd*Dz); //PD |
Lukasz_K | 0:a7c396f2ccf6 | 301 | //pwm3=(Kp*e_z)+(Ki*Iz)+(Kd*Dz); //PID |
Lukasz_K | 0:a7c396f2ccf6 | 302 | } |
Lukasz_K | 0:a7c396f2ccf6 | 303 | |
Lukasz_K | 0:a7c396f2ccf6 | 304 | void regulacja2(){ |
Lukasz_K | 0:a7c396f2ccf6 | 305 | Kp=0.1, Ki=0.05, Kd=0.01; |
Lukasz_K | 0:a7c396f2ccf6 | 306 | |
Lukasz_K | 0:a7c396f2ccf6 | 307 | docelowa_pozycja_x=X; //pozycja docelowa dla zadajników |
Lukasz_K | 0:a7c396f2ccf6 | 308 | docelowa_pozycja_y=Y; |
Lukasz_K | 0:a7c396f2ccf6 | 309 | docelowa_pozycja_z=Z; |
Lukasz_K | 0:a7c396f2ccf6 | 310 | |
Lukasz_K | 0:a7c396f2ccf6 | 311 | e_x=docelowa_pozycja_x-arc_tan_2(a_x,a_z); //uchyb regulacji |
Lukasz_K | 0:a7c396f2ccf6 | 312 | e_y=docelowa_pozycja_y-arc_tan_2(a_y,a_z); |
Lukasz_K | 0:a7c396f2ccf6 | 313 | e_z=docelowa_pozycja_z-z_stopnie; |
Lukasz_K | 0:a7c396f2ccf6 | 314 | |
Lukasz_K | 0:a7c396f2ccf6 | 315 | Ix=Ix+e_x; |
Lukasz_K | 0:a7c396f2ccf6 | 316 | Iy=Iy+e_y; |
Lukasz_K | 0:a7c396f2ccf6 | 317 | Iz=Iz+e_z; |
Lukasz_K | 0:a7c396f2ccf6 | 318 | |
Lukasz_K | 0:a7c396f2ccf6 | 319 | Dx=e_x - e_x_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 320 | Dy=e_y - e_y_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 321 | Dz=e_z - e_z_poprzednie; |
Lukasz_K | 0:a7c396f2ccf6 | 322 | |
Lukasz_K | 0:a7c396f2ccf6 | 323 | pwm1=(Kp*e_x); //P |
Lukasz_K | 0:a7c396f2ccf6 | 324 | //pwm1=(Kp*e_x)+(Ki*Ix); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 325 | pwm2=(Kp*e_y); //P |
Lukasz_K | 0:a7c396f2ccf6 | 326 | //pwm2=(Kp*e_y)+(Ki*Iy); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 327 | pwm3=(Kp*e_z); //P |
Lukasz_K | 0:a7c396f2ccf6 | 328 | //pwm3=(Kp*e_z)+(Ki*Iz); //PI |
Lukasz_K | 0:a7c396f2ccf6 | 329 | } |
Lukasz_K | 0:a7c396f2ccf6 | 330 | |
Lukasz_K | 0:a7c396f2ccf6 | 331 | |
Lukasz_K | 0:a7c396f2ccf6 | 332 | //+++++++++++DANE Z ZADAJNIKA+++++++++++++++++++++++++++++++++++++++++++++ |
Lukasz_K | 0:a7c396f2ccf6 | 333 | void odbiornik() |
Lukasz_K | 0:a7c396f2ccf6 | 334 | { |
Lukasz_K | 0:a7c396f2ccf6 | 335 | char str_x[1]; //definicja wektorów char |
Lukasz_K | 0:a7c396f2ccf6 | 336 | char str_y[1]; |
Lukasz_K | 0:a7c396f2ccf6 | 337 | char str_z[1]; |
Lukasz_K | 0:a7c396f2ccf6 | 338 | |
abm_mechatronika | 1:6e9fe61d7074 | 339 | device_bt.scanf("%s",str_x); //kąty pochylenia urzadzeia mobilnego |
abm_mechatronika | 1:6e9fe61d7074 | 340 | device_bt.scanf("%s",str_y); |
abm_mechatronika | 1:6e9fe61d7074 | 341 | device_bt.scanf("%s",str_z); |
Lukasz_K | 0:a7c396f2ccf6 | 342 | |
abm_mechatronika | 1:6e9fe61d7074 | 343 | X = atof(str_x); //zamiana na float |
Lukasz_K | 0:a7c396f2ccf6 | 344 | Y = atof(str_y); |
abm_mechatronika | 1:6e9fe61d7074 | 345 | Z = atof(str_z)-180; //rozlozenie zakresu kata obrotu symetrycznie wokol zera |
Lukasz_K | 0:a7c396f2ccf6 | 346 | } |
Lukasz_K | 0:a7c396f2ccf6 | 347 | void odbiornik2() |
Lukasz_K | 0:a7c396f2ccf6 | 348 | { |
Lukasz_K | 0:a7c396f2ccf6 | 349 | char str_x[1]; //definicja wektorów char |
Lukasz_K | 0:a7c396f2ccf6 | 350 | char str_y[1]; |
Lukasz_K | 0:a7c396f2ccf6 | 351 | char str_z[1]; |
Lukasz_K | 0:a7c396f2ccf6 | 352 | |
abm_mechatronika | 1:6e9fe61d7074 | 353 | device_zadajnik.scanf("%s",str_x); |
abm_mechatronika | 1:6e9fe61d7074 | 354 | device_zadajnik.scanf("%s",str_y); |
abm_mechatronika | 1:6e9fe61d7074 | 355 | device_zadajnik.scanf("%s",str_z); |
Lukasz_K | 0:a7c396f2ccf6 | 356 | |
Lukasz_K | 0:a7c396f2ccf6 | 357 | X = atof(str_x); |
Lukasz_K | 0:a7c396f2ccf6 | 358 | Y = atof(str_y); |
Lukasz_K | 0:a7c396f2ccf6 | 359 | Z = atof(str_z)-180; |
Lukasz_K | 0:a7c396f2ccf6 | 360 | } |
Lukasz_K | 0:a7c396f2ccf6 | 361 | |
Lukasz_K | 0:a7c396f2ccf6 | 362 | //+++++++++++STABILIZACJA_ZERO++++++++++++++++++++++++++++++++++++++++++ |
abm_mechatronika | 1:6e9fe61d7074 | 363 | void stabilizacja_zero(){ //platforma stabilizuje się do położenia w którym odczyty z akcelerometru wynoszą: ax=0, ay=0; |
Lukasz_K | 0:a7c396f2ccf6 | 364 | //OŚ X''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 365 | regulacja(); |
Lukasz_K | 0:a7c396f2ccf6 | 366 | |
Lukasz_K | 0:a7c396f2ccf6 | 367 | if(a_x<=0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 368 | { |
Lukasz_K | 0:a7c396f2ccf6 | 369 | OBROTY_M3=1; |
Lukasz_K | 0:a7c396f2ccf6 | 370 | MOTOR_3.write(-0.022*(abs(pwm1))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 371 | } |
Lukasz_K | 0:a7c396f2ccf6 | 372 | if(a_x>0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 373 | { |
Lukasz_K | 0:a7c396f2ccf6 | 374 | OBROTY_M3=0; |
Lukasz_K | 0:a7c396f2ccf6 | 375 | MOTOR_3.write(-0.022*(abs(pwm1))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 376 | } |
Lukasz_K | 0:a7c396f2ccf6 | 377 | //OŚ Y''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 378 | if(a_y<=0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 379 | { |
Lukasz_K | 0:a7c396f2ccf6 | 380 | OBROTY_M1=1; |
Lukasz_K | 0:a7c396f2ccf6 | 381 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 382 | } |
Lukasz_K | 0:a7c396f2ccf6 | 383 | if(a_y>0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 384 | { |
Lukasz_K | 0:a7c396f2ccf6 | 385 | OBROTY_M1=0; |
Lukasz_K | 0:a7c396f2ccf6 | 386 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 387 | } |
Lukasz_K | 0:a7c396f2ccf6 | 388 | |
Lukasz_K | 0:a7c396f2ccf6 | 389 | //OŚ Z''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 390 | /* if(z_stopnie<=0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 391 | { |
Lukasz_K | 0:a7c396f2ccf6 | 392 | OBROTY_M2=0; |
Lukasz_K | 0:a7c396f2ccf6 | 393 | MOTOR_2.write(-0.022*(abs(pwm3))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 394 | } |
Lukasz_K | 0:a7c396f2ccf6 | 395 | if(z_stopnie>0.0) |
Lukasz_K | 0:a7c396f2ccf6 | 396 | { |
Lukasz_K | 0:a7c396f2ccf6 | 397 | OBROTY_M2=1; |
Lukasz_K | 0:a7c396f2ccf6 | 398 | MOTOR_2.write(-0.022*(abs(pwm3))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 399 | } */ |
Lukasz_K | 0:a7c396f2ccf6 | 400 | |
Lukasz_K | 0:a7c396f2ccf6 | 401 | } |
Lukasz_K | 0:a7c396f2ccf6 | 402 | //++++++++++STABILIZACJA_SMARTFON++++++++++++++++++++++++++++++++++++++++++ |
Lukasz_K | 0:a7c396f2ccf6 | 403 | void stabilizacja_smartfon(){ |
Lukasz_K | 0:a7c396f2ccf6 | 404 | //predkosc_kat(); |
Lukasz_K | 0:a7c396f2ccf6 | 405 | regulacja2(); |
Lukasz_K | 0:a7c396f2ccf6 | 406 | //OŚ X''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 407 | if(arc_tan_2(a_x,a_z)<=X) |
Lukasz_K | 0:a7c396f2ccf6 | 408 | { |
Lukasz_K | 0:a7c396f2ccf6 | 409 | OBROTY_M3=1; |
Lukasz_K | 0:a7c396f2ccf6 | 410 | MOTOR_3.write(-0.022*(abs(pwm1))+1); //y=ax+b |
Lukasz_K | 0:a7c396f2ccf6 | 411 | } |
Lukasz_K | 0:a7c396f2ccf6 | 412 | if(arc_tan_2(a_x,a_z)>X) |
Lukasz_K | 0:a7c396f2ccf6 | 413 | { |
Lukasz_K | 0:a7c396f2ccf6 | 414 | OBROTY_M3=0; |
Lukasz_K | 0:a7c396f2ccf6 | 415 | MOTOR_3.write(-0.022*(abs(pwm1))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 416 | } |
Lukasz_K | 0:a7c396f2ccf6 | 417 | //OŚ Y''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 418 | if(arc_tan_2(a_y,a_z)<=Y) |
Lukasz_K | 0:a7c396f2ccf6 | 419 | { |
Lukasz_K | 0:a7c396f2ccf6 | 420 | OBROTY_M1=1; |
Lukasz_K | 0:a7c396f2ccf6 | 421 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 422 | } |
Lukasz_K | 0:a7c396f2ccf6 | 423 | if(arc_tan_2(a_y,a_z)>Y) |
Lukasz_K | 0:a7c396f2ccf6 | 424 | { |
Lukasz_K | 0:a7c396f2ccf6 | 425 | OBROTY_M1=0; |
Lukasz_K | 0:a7c396f2ccf6 | 426 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 427 | } |
Lukasz_K | 0:a7c396f2ccf6 | 428 | //OŚ Z''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 429 | /* if(z_stopnie<=Z) |
Lukasz_K | 0:a7c396f2ccf6 | 430 | { |
Lukasz_K | 0:a7c396f2ccf6 | 431 | OBROTY_M2=1; |
Lukasz_K | 0:a7c396f2ccf6 | 432 | MOTOR_2.write(0.9); |
Lukasz_K | 0:a7c396f2ccf6 | 433 | } |
Lukasz_K | 0:a7c396f2ccf6 | 434 | if(z_stopnie>Z) |
Lukasz_K | 0:a7c396f2ccf6 | 435 | { |
Lukasz_K | 0:a7c396f2ccf6 | 436 | OBROTY_M2=0; |
Lukasz_K | 0:a7c396f2ccf6 | 437 | MOTOR_2.write(0.9); |
Lukasz_K | 0:a7c396f2ccf6 | 438 | }*/ |
Lukasz_K | 0:a7c396f2ccf6 | 439 | } |
Lukasz_K | 0:a7c396f2ccf6 | 440 | |
Lukasz_K | 0:a7c396f2ccf6 | 441 | //vvvvvvvvvvvvvvvvvvvvvv_ZADAJNIK_ODBIORNIK_vvvvvvvvvvvvvvvvvvvvvvvvv |
Lukasz_K | 0:a7c396f2ccf6 | 442 | void zadajnik_odbiornik() { |
Lukasz_K | 0:a7c396f2ccf6 | 443 | |
abm_mechatronika | 1:6e9fe61d7074 | 444 | regulacja(); //oblicza pwm1 - sygnał sterujacy |
Lukasz_K | 0:a7c396f2ccf6 | 445 | //OŚ X''''''''''''''''''''''''''''' |
abm_mechatronika | 1:6e9fe61d7074 | 446 | if(arc_tan_2(a_x,a_z)<=X) //X - wartosc zadana |
Lukasz_K | 0:a7c396f2ccf6 | 447 | { |
abm_mechatronika | 1:6e9fe61d7074 | 448 | OBROTY_M3=1; //kierunek obrotu |
abm_mechatronika | 1:6e9fe61d7074 | 449 | MOTOR_3.write(-0.022*(abs(pwm1))+1); //y=-ax+1 (odejmujemy od wypełnienia z uwagi na odwrotnosc fali PWM: 1 - 0% wypełnienia, 0 - 100% wypełnienia sygnału |
Lukasz_K | 0:a7c396f2ccf6 | 450 | } |
Lukasz_K | 0:a7c396f2ccf6 | 451 | if(arc_tan_2(a_x,a_z)>X) |
Lukasz_K | 0:a7c396f2ccf6 | 452 | { |
Lukasz_K | 0:a7c396f2ccf6 | 453 | OBROTY_M3=0; |
Lukasz_K | 0:a7c396f2ccf6 | 454 | MOTOR_3.write(-0.022*(abs(pwm1))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 455 | } |
Lukasz_K | 0:a7c396f2ccf6 | 456 | //OŚ Y''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 457 | if(arc_tan_2(a_y,a_z)<=Y) |
Lukasz_K | 0:a7c396f2ccf6 | 458 | { |
Lukasz_K | 0:a7c396f2ccf6 | 459 | OBROTY_M1=1; |
Lukasz_K | 0:a7c396f2ccf6 | 460 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 461 | } |
Lukasz_K | 0:a7c396f2ccf6 | 462 | if(arc_tan_2(a_y,a_z)>Y) |
Lukasz_K | 0:a7c396f2ccf6 | 463 | { |
Lukasz_K | 0:a7c396f2ccf6 | 464 | OBROTY_M1=0; |
Lukasz_K | 0:a7c396f2ccf6 | 465 | MOTOR_1.write(-0.022*(abs(pwm2))+1); |
Lukasz_K | 0:a7c396f2ccf6 | 466 | } |
Lukasz_K | 0:a7c396f2ccf6 | 467 | //OŚ Z''''''''''''''''''''''''''''''''''''' |
Lukasz_K | 0:a7c396f2ccf6 | 468 | /* if(z_stopnie<=Z) |
Lukasz_K | 0:a7c396f2ccf6 | 469 | { |
Lukasz_K | 0:a7c396f2ccf6 | 470 | OBROTY_M2=1; |
Lukasz_K | 0:a7c396f2ccf6 | 471 | MOTOR_2.write(0.9); |
Lukasz_K | 0:a7c396f2ccf6 | 472 | } |
Lukasz_K | 0:a7c396f2ccf6 | 473 | if(z_stopnie>Z) |
Lukasz_K | 0:a7c396f2ccf6 | 474 | { |
Lukasz_K | 0:a7c396f2ccf6 | 475 | OBROTY_M2=0; |
Lukasz_K | 0:a7c396f2ccf6 | 476 | MOTOR_2.write(0.9); |
Lukasz_K | 0:a7c396f2ccf6 | 477 | }*/ |
Lukasz_K | 0:a7c396f2ccf6 | 478 | } |
Lukasz_K | 0:a7c396f2ccf6 | 479 | //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv |
Lukasz_K | 0:a7c396f2ccf6 | 480 | |
Lukasz_K | 0:a7c396f2ccf6 | 481 | //&&&&&&&&&&&&&&&&&&&&TESTY CZUJNIKA&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& |
Lukasz_K | 0:a7c396f2ccf6 | 482 | void testy_czujnika(){ |
Lukasz_K | 0:a7c396f2ccf6 | 483 | // WOLNE OBROTY - 10 % PWM |
Lukasz_K | 0:a7c396f2ccf6 | 484 | for(double i=1; i>=0.85; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 485 | { |
Lukasz_K | 0:a7c396f2ccf6 | 486 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 487 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 488 | //MOTOR_3.write(i); |
abm_mechatronika | 1:6e9fe61d7074 | 489 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 490 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 491 | } |
Lukasz_K | 0:a7c396f2ccf6 | 492 | |
Lukasz_K | 0:a7c396f2ccf6 | 493 | for(double j=50; j>=0; j=j-1) |
Lukasz_K | 0:a7c396f2ccf6 | 494 | { |
Lukasz_K | 0:a7c396f2ccf6 | 495 | wait(0.1); |
abm_mechatronika | 1:6e9fe61d7074 | 496 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 497 | } |
Lukasz_K | 0:a7c396f2ccf6 | 498 | |
Lukasz_K | 0:a7c396f2ccf6 | 499 | for(double i=0.85; i<=1; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 500 | { |
Lukasz_K | 0:a7c396f2ccf6 | 501 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 502 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 503 | //MOTOR_3.write(i); |
abm_mechatronika | 1:6e9fe61d7074 | 504 | odczyt_pozycji_gimbala(); |
Lukasz_K | 0:a7c396f2ccf6 | 505 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 506 | } |
Lukasz_K | 0:a7c396f2ccf6 | 507 | //SZYBKIE OBROTY - 100% PWM |
Lukasz_K | 0:a7c396f2ccf6 | 508 | /* for(double i=1; i>=0.01; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 509 | { |
Lukasz_K | 0:a7c396f2ccf6 | 510 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 511 | //MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 512 | //MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 513 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 514 | } |
Lukasz_K | 0:a7c396f2ccf6 | 515 | |
Lukasz_K | 0:a7c396f2ccf6 | 516 | for(double j=50; j>=0; j=j-1) |
Lukasz_K | 0:a7c396f2ccf6 | 517 | { |
Lukasz_K | 0:a7c396f2ccf6 | 518 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 519 | } |
Lukasz_K | 0:a7c396f2ccf6 | 520 | |
Lukasz_K | 0:a7c396f2ccf6 | 521 | for(double i=0.00; i<=1; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 522 | { |
Lukasz_K | 0:a7c396f2ccf6 | 523 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 524 | //MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 525 | //MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 526 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 527 | }*/ |
Lukasz_K | 0:a7c396f2ccf6 | 528 | } |
Lukasz_K | 0:a7c396f2ccf6 | 529 | |
Lukasz_K | 0:a7c396f2ccf6 | 530 | //$$$$$$$$$$$$$SEKWENCJE_POKAZ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |
Lukasz_K | 0:a7c396f2ccf6 | 531 | //SEKWENCJA 2 |
Lukasz_K | 0:a7c396f2ccf6 | 532 | void sekwencja_pokazowa(){ // funkcja sekwencja pokazowa |
Lukasz_K | 0:a7c396f2ccf6 | 533 | for(double i=1; i>=0.6; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 534 | { |
Lukasz_K | 0:a7c396f2ccf6 | 535 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 536 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 537 | MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 538 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 539 | } |
Lukasz_K | 0:a7c396f2ccf6 | 540 | //WTRĄCENIE 2.1 |
Lukasz_K | 0:a7c396f2ccf6 | 541 | for(double i=1; i>=0.6; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 542 | { |
Lukasz_K | 0:a7c396f2ccf6 | 543 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 544 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 545 | } |
Lukasz_K | 0:a7c396f2ccf6 | 546 | for(double i=0.6; i<=1.0; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 547 | { |
Lukasz_K | 0:a7c396f2ccf6 | 548 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 549 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 550 | } |
Lukasz_K | 0:a7c396f2ccf6 | 551 | OBROTY_M2=1; //zmiana obrotów |
Lukasz_K | 0:a7c396f2ccf6 | 552 | for(double i=1; i>=0.6; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 553 | { |
Lukasz_K | 0:a7c396f2ccf6 | 554 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 555 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 556 | } |
Lukasz_K | 0:a7c396f2ccf6 | 557 | for(double i=10.6; i<=1.0; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 558 | { |
Lukasz_K | 0:a7c396f2ccf6 | 559 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 560 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 561 | } |
Lukasz_K | 0:a7c396f2ccf6 | 562 | //=============== |
Lukasz_K | 0:a7c396f2ccf6 | 563 | wait(2.0); |
Lukasz_K | 0:a7c396f2ccf6 | 564 | for(double i=0.6; i<=1.0; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 565 | { |
Lukasz_K | 0:a7c396f2ccf6 | 566 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 567 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 568 | MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 569 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 570 | } |
Lukasz_K | 0:a7c396f2ccf6 | 571 | wait(1.0); |
Lukasz_K | 0:a7c396f2ccf6 | 572 | //SEKWENCJA 1 |
Lukasz_K | 0:a7c396f2ccf6 | 573 | for(double i=1; i>=0; i=i-0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 574 | { |
Lukasz_K | 0:a7c396f2ccf6 | 575 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 576 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 577 | MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 578 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 579 | } |
Lukasz_K | 0:a7c396f2ccf6 | 580 | for(double i=0; i<=1; i=i+0.01) |
Lukasz_K | 0:a7c396f2ccf6 | 581 | { |
Lukasz_K | 0:a7c396f2ccf6 | 582 | MOTOR_1.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 583 | MOTOR_2.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 584 | MOTOR_3.write(i); |
Lukasz_K | 0:a7c396f2ccf6 | 585 | wait(0.1); |
Lukasz_K | 0:a7c396f2ccf6 | 586 | } |
Lukasz_K | 0:a7c396f2ccf6 | 587 | |
Lukasz_K | 0:a7c396f2ccf6 | 588 | wait(2.0); |
Lukasz_K | 0:a7c396f2ccf6 | 589 | } |
Lukasz_K | 0:a7c396f2ccf6 | 590 | //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |
Lukasz_K | 0:a7c396f2ccf6 | 591 |