Khối khởi động

Một phần của tài liệu Đồ án tốt nghiệp Quadcopter sử dụng Arduino và MPU 6050 (Trang 51)

Khối khởi động bao gồm nguồn điện là pin LiPo 11.5V. Khi ta cấp nguồn vào mạch, nguồn được chia làm ba nhánh. Nhánh thứ nhất cấp nguồn cho bốn bộ điều tốc ESC gián tiếp cấp nguồn cho bốn động cớ, nhánh thứ hai cấp nguồn cho vi điều khiển, Gyro và relay. Nhánh thứ ba cấp nguồn cho động cơ tạo áp suất. Nguồn này cần một dòng điện lớn vì các motor cần một tốc độ cao, tiêu thụ một dòng lớn, đây cũng là lý do đồ án này sử dụng pin LiPo.

3.4.2 Khối khởi tạo thông số MPU 6050

MPU6050 giao tiếp với vi điều khiển Arduino UNO bằng giao thức I2C (Inter Integrated Circuit) nên cần xác định địa chỉ của Gyro. Ta tiến hành lấy địa chỉ và

nạp thông số ba trục lúc Quadcopter cân bằng vào các biến để xử lý PID. I2C là loại giao thức giao tiếp nối tiếp đồng bộ nên ta có thể mở rộng nhiều thiết bị.

Hình 3. 15 Giao thức I2C

3.4.3 Khối kiểm tra Receiver

Kiểm tra xem Tx và Rx đã nhận được tín hiệu hay chưa và đồng thời kiểm tra sự kết nối giữa arduino và Rx.

Nếu đã nhận được tín hiệu từ Receiver thì tiếp tục chạy các dòng lệnh tiếp theo, nếu không thì tiếp tục kiểm tra tín hiệu Receiver.

3.4.4 Chuẩn hóa tín hiệu từ receiver về 1000us – 2000us

Ở đây ta phải chuẩn hóa để bốn kênh tín hiệu được thống nhất, đồng bộ với nhau. Đầu tiên ta lưu vào eepron vị trí cao nhất và thấp nhất của các cần điều khiển. Tiếp theo ta so sánh giá trị hiện tại nhận được ở biến Actual để so sánh với các biến định mức Low, High và Center, sau đó quy về giá trị 1000us – 2000us.

Hình 3. 17 Code thực hiện chuẩn hóa Receiver

3.4.5 Khối lấy giá trị của Gyro và chuyển vào bộ PID

Ở khối này, ta tiếp tục lấy giá trị hiện tại ba trục Gyro ở thời điểm hiện tại và giá trị này được xử lý thành tốc độ góc:

Hình 3. 18 Code đổi giá trị Gyro sang tốc độ góc

Sau đó ra chuyển giá trị đã biến đổi này vào vộ PID để tiếp tục tính toán.

3.4.6 Khối kiểm tra điều kiện khởi động

Đến đây, các thông số đã sẳn sàng để máy bay cách cánh, tuy nhiên ta cần một số điều kiện để giúp cho quá trình điều khiển sự khởi động và sự tắt máy bay từ xa được an toàn. Trong dự án này sử dụng các cần điều khiển làm công tắc đóng ngắt nguồn điện. Khi ta hạ cần throttle xuống vị trí thấp nhất bên trái thì cả bốn động cơ sẽ khởi động. Nếu cần throttle ở vị trí cao nhất bên phải, cả bốn động cơ sẽ bị ngắt nguồn hoàn toàn.

Hình 3. 19 Code điều khiển để khởi động động cơ

Khi biến start bằng hai, hệ thống sẽ bắt đầu khởi động và tính toán PID, nếu không thì bước này sẽ tiếp tục được lặp lại theo vòng lặp loop.

3.4.7 Khối tính toán PID

Đầu tiên ta tìm sai số hiện tại so với gia trị ban đầu ở vị trí cân bằng hoàn toàn.

Đó chính là e(t) sai số theo thời gian. Nhân nó với hệ số Kp ta đã đặt trước đó, ta được khâu tỉ lệ đầu tiên.

Khâu tiếp theo là khâu tích phân. Ở đây, tiếp tục tính toán sai số cộng dồn theo thời gian và lấy nó nhân với độ lợi Ki để tạo thành khâu tích phân. Ta sử dụng dòng lệnh:

Sau đó, ta tiếp tục tính toán khâu vi phân. Ta sử dụng phép trừ để tìm ra tốc độ thay đổi của sai số theo thời gian của phép vi phân. Lấy sai số hiện tại trừ cho sai số trước đó và nhân với Kd, độ lợi khâu vi phân.

Phương trình PID cuối cùng, ta cộng cả ba phép tính trên lại với nhau, sau đó cứ lặp đi lặp lại theo một vòng lặp thời gian để liên tục cập nhật bất kỳ sự thay đổi nhỏ nào.

3.4.8 Khối cấp xung cho ESC

Để điều khiển bốn động cơ chính, điều khiển thông qua bộ ESC đã giới thiệu ở trên bằng cách gởi xung điện.

Hình 3. 21 Code cấp xung cho 4 ESC

Đoạn code trên tạo ra mỗi hai cặp motor cùng tốc độ để có thể điều khiển máy bay tới lùi, qua trái, qua phải và xoay trái, xoay phải ổn định. Ở đây, esc_1 là CCW ở đằng trước bên phải, esc_2 là một CW ở đằng sau bên phải, esc_3 là một CCW ở đằng sau bên trái và cuối cùng esc_4 là một CW ở đằng trước bên trái.

3.5 THIẾT KẾ MÔ HÌNH TRÊN SOLIDWORK

CHƯƠNG 4: KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN

4.1 MÔ HÌNH LẮP RÁP HOÀN THIỆN

Hình 4. 1 Mô hình lắp ráp hoàn thiện

4.2 MÔ PHỎNG VÀ KẾT QUẢ TRÊN MATLAB SIMULINK

Hình 4. 2. Sơ đồ các khối

Khối biến đổi omega:

Hình 4. 3. Khối biến đổi omega

Hình 4. 4. Khối tính gia tốc góc

Khối tính gia tốc tuyến tính:

Khối tính PID:

Hình 4. 6. Khối PID

* Kết quả:

4.3 KẾT QUẢ ĐẠT ĐƯỢC

Ưu điểm:

- Mô hình quadcopter đã bay được.

- PID đã hoạt động ổn định, tác động giúp quadcopter cân bằng mỗi khi suất hiện góc nghiêng.

- Đã điều chỉnh được hướng bay của Quadcopter ( sang trái, phải, tiến, lùi). - 4 động cơ quay đều và đồng bộ.

*Một số hình ảnh bay của quadcopter:

Hình 4. 8 Một số hình ảnh bay

Hình 4. 10 Một số hình ảnh bay

Hạn chế:

- Mô hình bay còn thiếu tính ổn định - Khi hạ cánh máy bay dễ bị mất kiểm soát * Một số hình ảnh bay lỗi:

Hình 4. 12 Một số hình ảnh bay lỗi

Hình 4. 13 Một số hình ảnh bay lỗi

4.4 HƯỚNG PHÁT TRIỂN

* Sử dụng thêm cảm biến từ trường giúp ổn định hơn trong cân bằng trục Z và xác định hướng của máy bay trong không gian.

* Cân bằng thêm về bị trí trong không gian, giúp mô hình máy bay không bị trôi và có thể đứng yên tại 1 điểm trong không gian mà không cần sự điều khiển của người điều khiển (có thể sử dụng GPS).

* Mô hình có thể trang bị thêm camera truyền hình ảnh trực tiếp về smartphone, máy tính. Bên cạnh đó nếu quacopter đã được ứng xử bay tốt có thể thay đổi bộ xử lí trung tâm sang các loại vi điều khiển khác mạnh hơn, nhanh hơn kết hợp với camera xử lí ảnh để có thể điều khiển quadcopter theo cử chỉ con người * Từ mô hình bay quadcopter ta có thể vận dụng vào những hoạt động ứng dụng trong cuộc sống như:

 Phun thuốc sâu

 Mang phao cứu hộ

 Quay phim toàn cảnh trên cao

 Những hoạt động quân sự

KẾT LUẬN

- Nếu không sử dụng sử dụng bộ điều khiển PID thì quadcopter không thể tự động cân bằng, các góc bị lệch rất lớn

- PID hoạt động tốt, giúp máy bay cân bằng trong không gian - Máy bay còn chưa ổn định khi bay cao và khi hạ cánh

- Có thể phát triển mở rộng thêm về các ứng dụng của quadcopter trong đời sống

- Có thể lắp đặt thêm những thiết bị lên quadcopter(ví dụ: GPS) để máy bay ổn định và bay chính xác hơn

DANH MỤC THAM KHẢO

Tiếng Việt:

[1] http://arduino.vn/

[2] Lý thuyết về PWM: http://arduino.vn/reference/xung-pwm

[3] Lý thuyết về PPM: http://arduino.vn/reference/xung-ppm

[4] Lý thuyết I2C: http://dammedientu.vn/gioi-thieu-chuan-giao-tiep-i2c/

[5] https://making.vn

[6] Chanel Khoa Học Vui:

https://www.youtube.com/channel/UC4TDMxvGCf3FLxycS0Ijfrg

[7] Bộ điều khiển PID: http://vi.wikipedia.org/wiki/Bộ_điều_khiển_PID [8] Và một số hình ảnh sưu tầm trên internet.

Tiếng Anh:

[1] https://www.arduino.cc/

[2] https://www.ijert.org/research/design-of-control-system-for-quadcopter-using- complementary-filter-and-pid-controller-IJERTV3IS041539.pdf

PHỤ LỤC

#include <Wire.h> // Bao gồm thư viện Wire.h để giao tiếp với con quay hồi chuyển.

#include <EEPROM.h> //Bao gồm thư viện EEPROM.h để lưu trữ thông tin vào EEPROM

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////

//Cài đặt tăng và giới hạn PID

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////

float pid_p_gain_roll = 1.4; //Cài đặt thông số Kp roll float pid_i_gain_roll = 0.05; //Cài đặt thông số Ki roll float pid_d_gain_roll = 15.0; //Cài đặt thông số Kd roll

int pid_max_roll = 400; //Đầu ra tối đa của bộ điều khiển PID (+/-)

float pid_p_gain_pitch = pid_p_gain_roll; float pid_i_gain_pitch = pid_i_gain_roll; float pid_d_gain_pitch = pid_d_gain_roll;

int pid_max_pitch = pid_max_roll;

float pid_p_gain_yaw = 4.0;

float pid_i_gain_yaw = 0.02;

float pid_d_gain_yaw = 0.0;

int pid_max_yaw = 400;

boolean auto_level = true; //Tự động bật (đúng) hoặc tắt (sai)

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////

//Khai báo các biến toàn cục

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////

byte last_channel_1, last_channel_2, last_channel_3, last_channel_4; byte eeprom_data[36];

volatile int receiver_input_channel_1, receiver_input_channel_2, receiver_input_channel_3, receiver_input_channel_4;

int counter_channel_1, counter_channel_2, counter_channel_3, counter_channel_4, loop_counter;

int esc_1, esc_2, esc_3, esc_4; int throttle, battery_voltage; int cal_int, start, gyro_address; int receiver_input[5];

int temperature;

int acc_axis[4], gyro_axis[4];

float roll_level_adjust, pitch_level_adjust;

long acc_x, acc_y, acc_z, acc_total_vector;

unsigned long timer_channel_1, timer_channel_2, timer_channel_3, timer_channel_4, esc_timer, esc_loop_timer;

unsigned long timer_1, timer_2, timer_3, timer_4, current_time; unsigned long loop_timer;

double gyro_pitch, gyro_roll, gyro_yaw; double gyro_axis_cal[4];

float pid_error_temp;

float pid_i_mem_roll, pid_roll_setpoint, gyro_roll_input, pid_output_roll, pid_last_roll_d_error;

float pid_i_mem_pitch, pid_pitch_setpoint, gyro_pitch_input, pid_output_pitch, pid_last_pitch_d_error;

float pid_i_mem_yaw, pid_yaw_setpoint, gyro_yaw_input, pid_output_yaw, pid_last_yaw_d_error;

float angle_roll_acc, angle_pitch_acc, angle_pitch, angle_roll; boolean gyro_angles_set; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// //Thiết lập quy trình /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //// void setup(){ //Serial.begin(57600);

//Copy the EEPROM data for fast access data.

for(start = 0; start <= 35; start++)eeprom_data[start] = EEPROM.read(start); start = 0; //Đặt bắt đầu trở lại 0.

gyro_address = eeprom_data[32]; //Lưu trữ địa chỉ con quay hồi chuyển trong biến.

Wire.begin(); //Khởi động I2C với tư cách chính.

TWBR = 12; //Đặt tốc độ đồng hồ I2C thành 400kHz.

//Các chân Arduino (Atmega) mặc định là đầu vào, vì vậy chúng không cần được khai báo rõ ràng là đầu vào

DDRD |= B11110000; //Định cấu hình poort kỹ thuật số 4, 5, 6 và 7 làm đầu ra.

DDRB |= B00110000; //Định cấu hình poort kỹ thuật số 12 và 13 làm đầu ra.

//Sử dụng đèn LED trên Arduino để chỉ báo khởi động.

digitalWrite(12,HIGH); //Bật đèn led cảnh báo.

//Kiểm tra chữ ký EEPROM để đảm bảo rằng chương trình thiết lập được thực thi. while(eeprom_data[33] != 'N' || eeprom_data[34] != 'D' || eeprom_data[35] != 'P')delay(10);

//Bộ điều khiển chuyến bay cần MPU-6050 với con quay hồi chuyển và gia tốc kế //Nếu quá trình thiết lập hoàn tất mà không có MPU-6050, hãy dừng chương trình điều khiển chuyến bay

if(eeprom_data[31] == 2 || eeprom_data[31] == 3)delay(10);

set_gyro_registers(); //Đặt các thanh ghi con quay hồi chuyển cụ thể.

for (cal_int = 0; cal_int < 1250 ; cal_int ++){

PORTD |= B11110000;

delayMicroseconds(1000);

PORTD &= B00001111;

delayMicroseconds(3000); }

//Hãy lấy nhiều mẫu dữ liệu con quay hồi chuyển để chúng ta có thể xác định độ lệch con quay hồi chuyển trung bình (hiệu chuẩn).

for (cal_int = 0; cal_int < 2000 ; cal_int ++){ //Lấy 2000 lần đo để hiệu chuẩn.

if(cal_int % 15 == 0)digitalWrite(12, !digitalRead(12)); //Thay đổi trạng thái đèn led để chỉ ra hiệu chuẩn.

gyro_signalen(); //Đọc đầu ra con quay hồi chuyển. gyro_axis_cal[1] += gyro_axis[1]; //Giá trị cuộn quảng cáo thành gyro_roll_cal.

gyro_axis_cal[2] += gyro_axis[2]; gyro_axis_cal[3] += gyro_axis[3];

// Cung cấp một xung 1000us trong khi hiệu chỉnh con quay hồi chuyển.

PORTD |= B11110000; //Set digital poort 4, 5, 6 and 7 high.

delayMicroseconds(1000); //Wait 1000us.

PORTD &= B00001111; //Set digital poort 4, 5, 6 and 7 low.

delay(3); //Wait 3 milliseconds before the next loop.

}

//Chia cho 2000 để có được phần bù con quay hồi chuyển trung bình.

gyro_axis_cal[1] /= 2000; //Chia tổng số cuộn cho 2000. gyro_axis_cal[2] /= 2000;

gyro_axis_cal[3] /= 2000;

PCICR |= (1 << PCIE0); //Đặt PCIE0 để bật quét

Một phần của tài liệu Đồ án tốt nghiệp Quadcopter sử dụng Arduino và MPU 6050 (Trang 51)

Tải bản đầy đủ (DOCX)

(83 trang)
w