Tải bản đầy đủ

THIẾT kế máy BAY điều KHIỂN (có code và sơ đồ mạch)

THIẾT KẾ MÁY BAY ĐIỀU KHIỂN

1


MỤC LỤC

2


DANH MỤC CÁC HÌNH VẼ

3


DANH MỤC CÁC BẢNG BIỂU

4


DANH MỤC CÁC TỪ VIẾT TẮT


DC

Direct Current

ESC

Electronic Speed Control

TX

Transmitter

RX

Receiver

I2C

Inter-integrated Circuit

DMP

Digital Motion Processor

5


Trang 6/33

CHƯƠNG 1.

GIỚI THIỆU ĐỀ TÀI

1.1 Giới thiệu
 Máy bay điều khiển là một trong những mô hình điều khiển bằng RF (RC), đáp ứng
được nhiều nhu cầu sử dụng khác nhau như giải trí, chụp ảnh, quay phim,có thể ứng
dụng vào quân sự, thám hiểm những nơi con người không thể tới, ứng dụng trong
nông nghiệp.
 Máy bay điều khiển hoạt động dựa theo nguyên lý là tạo ra một lực nâng đủ lớn và


cân bằng để nâng mô hình lên cao, có thể điều khiển các hướng tiến,lùi, trái, phải,
xoay vòng; ngoài ra còn có thể gắn thêm cảm biến, GPS, camera.
 Máy bay điều khiển:
-

Ưu điểm: điều khiển từ xa, đáp ứng được nhiều nhu cầu, sử dụng trong cuộc
sống, quân sự.

-

Khuyết điểm: khó điều khiển, cần có một thời gian luyện tập, nguy hiểm nếu
điều khiển chỗ đông người, chi phí cao.

 Đề tài sử dụng vi điều khiển arduino, cảm biến 6 trục MPU6050, điều khiển từ xa
bằng tay cầm chuyên dụng dùng RF. Đề tài có tham khảo các dự án của Joop
Brokking.
1.2 Mục tiêu đề tài
 Thiết kế được mạch điều khiển chính dùng module arduino và cảm biến 6 trục, lập
trình máy bay tự cân bằng giữa các trục, hiểu được cách hoạt động của động cơ DC
không chổi than 3 pha.
 Thiết kế máy bay được điều khiển qua bộ thu phát sóng. Biết thêm về cách thức
hoạt động của máy bay cũng như ứng dụng của nó trong đời sống.
1.3 Hướng thực hiện đề tài

Thiết kế máy bay điều khiển


Trang 7/33

 Tìm hiểu cảm biến 6 trục MPU6050, động cơ DC không chổi than cùng với bộ điều
tốc ESC, đọc tín hiệu từ bộ thu sóng.
 Củng cố kiến thức lập trình vi điều khiển, đọc hiểu tài liệu tiếng anh về các thành
phần của máy bay, datasheet của cảm biến, viết chương trình.

Thiết kế máy bay điều khiển


Trang 8/33

CHƯƠNG 2.

THỰC HIỆN ĐỀ TÀI

1.4 Sơ đồ khối
1.1.1 Sơ đồ khối

TX(transmitter)

Nguồn(pin)

Động cơ,
cánh quạt

RX(receiver)
Vi điều khiển
Cảm biến
MPU6050
Hình 2-1 Sơ đồ khối

Thiết kế máy bay điều khiển

ESC


Trang 9/33

2.1.2 Chức năng các khối
• Khối TX (transmitter): sử dụng tay cầm điều khiển phát dữ liệu qua RF cho bộ thu.
• Khối RX (receiver): nhận dữ liệu từ TX, nối với các chân vi điều khiển.
• Khối vi điều khiển: module Arduino, lập trình đọc tín hiệu từ RX, đọc và tính toán
góc của cảm biến MPU6050, xuất tín hiệu điều khiển cho ESC.
• Khối nguồn (pin): dùng pin Lipo 11.1 V cấp nguồn cho ESC và Arduino.
• Khối ESC: nhận tín hiệu từ Arduino, sử dụng mạch động lực điều khiển động cơ
DC không chổi than 3 pha.
• Khối động cơ, cánh quạt: 4 động cơ-cánh quạt điều khiển qua 4 ESC, mô hình máy
bay (quadcopter).
1.5 Tìm hiểu các thành phần, module
1.1.2 Vi điều khiển Arduino
• Đề tài sẽ sử dụng module Arduino Nano có thiết kế nhỏ gọn,nhẹ thích hợp để làm
mạch xử lý điều khiển chính cho toàn bộ mô hình.
• Arduino Nano dùng chíp điều khiển chính là Atmega328 cho phép xử lý các dữ liệu
phức tạp, hỗ trợ ngôn ngữ lập trình C,C++ và ngôn ngữ chính thống của họ AT.

Hình 2-2 Aruino Nano [1]

Thiết kế máy bay điều khiển


Trang 10/33

1.1.3 Cảm biến MPU6050
• Cảm biến MPU6050 là cảm biến 6 trục tự do tích hợp gồm 3 trục cảm biến gia tốc
và 3 trục cảm biến vận tốc góc.
• MPU6050 cho phép phát hiện chuyển động, độ lệch so với điểm đặt trước đó, qua
đó có thể ứng dụng vào nhiều dự án về cân bằng như máy bay điều khiển, xe cân
bằng, con lắc, có thể ứng dụng việc theo dõi tình trạng sức khỏe, đo độ nghiêng.
• Cảm biến này cho phép xuất các dữ liệu thô về gia tốc và vận tốc góc, từ đó có thể
tính toán dựa trên datasheet cho ra số liệu mong muốn.
• Cảm biến MPU6050 sử dụng chuẩn giao tiếp I2C kết nối vi điều khiển với tốc độ
nhanh chóng, cảm biến còn có bộ tính toán chuyển động tín hiệu số (DMP) được
lập trình sẵn để tính toán các dữ liệu, giảm bớt khối lượng xử lý cho vi điều khiển.
• Giao tiếp I2C (Inter-integrated Circuit): là một chuẩn giao tiếp ở phạm vi ngắn, tốc
độ truyền nhận cao, giao thức kiểu Multi-Master Multi-Slave, chỉ sử dụng hai dây
SCL và SDA để truyền nhận dữ liệu, tiết kiệm chân giao tiếp cho vi điều khiển và
có thể nối nhiều thiết bị trên cùng một bus I2C.
• Cảm biến kết nối với Arduino theo giao tiếp I2C, SCL nối với chân A5, SDA nối
với chân A4.

Hình 2-2 Cảm biến MPU6050 [2]

Thiết kế máy bay điều khiển


Trang 11/33

• Cảm biến MPU6050 gồm 8 chân nhưng đề tài chỉ dùng 4 chân: 2 chân nguồn với
mức điện áp 3-5 V, 2 chân truyền nhận dữ liệu SDA và SCL.
• Cảm biến vận tốc góc có thể trả về các trục X, Y, Z với scale ± 250, ± 500, ± 1000,
và ± 2.000 ° /giây. Cho phép lây mẫu đồng thời các trục.
• Cảm biến gia tốc trả về gia tốc của 3 trục với scale ± 2g, ± 4g, ± 8g và ± 16g. Cho
phép lấy mẫu đồng thời gia tốc.
1.1.4 ESC (Electronic Speed Control)
• ESC là một mạch điều khiển tốc độ động cơ. Đề tài sử dụng ESC dùng cho động cơ
Brushless 3 pha.
• ESC là mạch động lực gồm nhiều FET hay IGBT, có công suất lớn, hoạt động trên
nguyên lý điều khiển động cơ ba pha.

Hình 2-3 ESC [3]

• ESC gồm 2 chân lấy nguồn từ pin, 3 chân kết nối với động cơ, 1 chân tín hiệu nhận
xung điều khiển từ vi điều khiển, chân nguồn 5 V và GND.
1.1.5 Động cơ Brushless

Thiết kế máy bay điều khiển


Trang 12/33

Hình 2-4 Động cơ brushless [4]

• Động cơ brushless là một loại động cơ DC không chổi than ba pha, có công suất
lớn, được điều khiển bằng mạch động lực ba pha.
• Cấu tạo động cơ brushless DC:
-

Stator: gồm lõi sắt và dây quấn được quấn dây khác so với các loại động cơ

-

thông thường.
Rotor: gồm nhiều nam châm vĩnh cửu có từ trường lớn.
Cảm biến Hall: cảm biến xác định vị trí của từ trường rotor so với các pha

của cuộn dây.
• Điều khiển động cơ brushless DC thì cần mạch động lực có các khóa đóng ngắt để
cấp dòng điện vào cuộn dây stator theo tín hiệu cảm biến Hall trả về, cụ thể là dùng
ESC.
• Trong thời điểm bất kỳ, động cơ chỉ có hai pha dẫn điện, mỗi pha dẫn có dòng điện
một chiều và sức điện động một chiều, các pha thay nhau dẫn để tạo tốc độ cho
động cơ.
• Tốc độ động cơ chỉ hoạt động ở 1-2 ms. Ta sẽ cấp một xung có độ rộng từ 1-2 ms từ
vi điều khiển để thay đổi tốc độ động cơ.
• Đề tài sẽ sử dụng loại động cơ 2212-1000 KV, có dòng tải tối đa là 12A, tốc độ là
1000 vòng/1V/phút. Mỗi loại động cơ sẽ sử dụng kích thước cánh quạt khác nhau,
do dùng động cơ 2212-1000 KV nên đề tài sử dụng cánh có kích thước 10×4.5.

Thiết kế máy bay điều khiển


Trang 13/33

1.1.6 Nguồn cung cấp

Hình 2.6 Pin lipo 11.1 V [4]


Do động cơ có công suất lớn nên cần một nguồn đủ lớn để máy bay có thể trên
không được một thời gian. Đề tài sử dụng pin lipo 3s 11.1 V dung lượng 2200 mAh
với dòng xả 25C.



Dòng xả tối đa tại một thời điểm của pin là 2.2×25=55 A > 48 A của 4 động cơ nên
đáp ứng được cho mô hình.

Thiết kế máy bay điều khiển


Trang 14/33

CHƯƠNG 3.

KẾT QUẢ THỰC HIỆN

1.6 Mô hình đề tài
• Yêu cầu: đọc dữ liệu từ bộ thu phát RF, tính toán dữ liệu cảm biến trả về góc xác
định, lập trình chương trình tối ưu có khả năng cân bằng cho máy bay.
• Mục đích: hiểu được nguyên lý làm việc của máy bay điều khiển, tính toán các giá
trị cảm biến, bộ thu sóng, lắp ráp hoàn thiện mô hình máy bay.
1.7 Nguyên lí hoạt động
1.1.7 Sơ đồ nguyên lí

Hình 3-5 Sơ đồ nguyên lí [8]

1.1.8

Thiết kế máy bay điều khiển


Trang 15/33

Lưu đồ giải thuật

Bắt đầu

Tính toán giá trị cảm biến

Đọc dữ liệu từ RX

Hiệu chỉnh tín hiệu RX
và giá trị cảm biến

Hiệu chỉnh
PID

Xuất tín hiệu điều khiển

ESC

Động cơ
Hình 3-6 Lưu đồ giải thuật

Thiết kế máy bay điều khiển


Trang 16/33

1.1.9 Nguyên lý hoạt động
• Máy bay điều khiển hoạt động trên nguyên lý tạo ra một lực đẩy lớn và cân bằng để
có thể nâng được trọng lượng của nó.
• Đề tài thiết kế mô hình máy bay kiểu chữ X. Cặp cánh trên-phải và dưới-trái sẽ
quay ngược chiều kim đồng hồ, cặp cánh trên-trái và dưới-phải quay cùng chiều
kim đồng hồ, tất cả cánh đều có hướng gió đẩy xuống dưới tạo ra lực nâng.
• Cả 4 động cơ phải quay cùng tốc độ, tạo ra một lực đẩy bằng nhau khi thay đổi giá
trị tốc độ. Góc nghiêng theo trụ ngang được điều khiển khi thay đổi tốc độ 2 động
cơ bên trái và 2 động cơ bên phải sao cho tổng lực đẩy vần giữ nguyên. Tương tự,
góc nghiêng theo trục dọc với 2 động cơ trước và 2 động cơ sau; góc xoay theo trục
đứng với cặp động cơ đối diện nhau.
• Dựa trên các số liệu tính toán được góc nghiêng và gia tốc, kết hợp với tín hiệu điều
khiển, sủ dụng thuật toán PID để tạo chế độ tự cân bằng cho máy bay. Do không có
phương trình thuật toán, các hệ số PID phải tự dò thủ công sau mỗi lần thử nghiệm,
nên máy bay có thể nghiêng lắc, cân bằng chưa tốt lắm.
1.8 Kiểm tra và lắp ráp mô hình máy bay
• Nguồn pin lipo 11.1 V nối vào 4 ESC cung cấp nguồn chính cho động cơ, dây
nguồn 5 V từ ESC cấp nguồn cho vi điều khiển Arduino và RX, nối chung GND của
tất cả các thành phần.
• Viết chương trình đọc giá trị điều khiển từ bộ thu. Giá trị thu được là khoảng giá trị
1-2 ms do nhà sản xuất cấu hình sẵn, từ đó có thể điều khiển các quá trình theo ý
muốn.
• Lập trình điều khiển 1 động cơ sau khi đọc dữ liệu từ bộ thu, thay đổi giá trị trong
khoảng 1-2 ms để thay đổi tốc độ động cơ. Sau đó điều khiển 4 động cơ cùng một
tốc độ.

Thiết kế máy bay điều khiển


Trang 17/33

• Kết nối Arduino với cảm biến MPU6050, viết chương trình xuất ra các giá trị thô,
tìm hiểu datasheet và phương pháp hình học không gian để tính toán các giá trị
trước đó quy đổi về các giá trị góc, gia tốc thay đổi theo thời gian. Có thể dùng phần
mềm mô phỏng để thấy sự thay đổi 3D.
• Thử nghiệm sự cân bằng dùng thuật toán PID cho 2 động cơ kết hợp giữa tín hiệu
điều khiển và góc nghiêng cảm biến. Sau khi kiểm tra các hệ số PID cho 2 động cơ,
tiến hành hiệu chỉnh cho cả hệ thống.
1.9 Kết quả mô hình
Bảng 3-1 Thông số lý thuyết và thực tế

Vpin
Vin(Arduino)
Tốc độ động cơ
Khoảng cách thu phát RF

Thiết kế máy bay điều khiển

Lí thuyết
11.1 V
5-20 V
11100 vòng/phút
300 m

Thực tế
10.6-12.2 V
5V
10600-12200 vòng/phút
150 m


Trang 18/33

Hình 3-3 Mô hình máy bay

• Lắp ráp hoàn chỉnh, kết nối các thành phần điều khiển, điều khiển được bằng bộ thu
phát RF 2.4Ghz.
• Máy bay còn chưa cân bằng do phần cứng chưa cân bằng và sai sót trong khâu hiệu
chỉnh.

Thiết kế máy bay điều khiển


Trang 19/33

CHƯƠNG 4.

KẾT LUẬN

1.10 Kết luận
• Hiểu biết cách hoạt động, nguyên lý bay của máy bay điều khiển.
• Sai số phần cứng cùng với chưa giảm bớt được nhiễu từ cảm biến nên máy bay khi
bay còn chưa được cân bằng hoàn chỉnh.
• Chưa có kinh nghiệm điều khiển nên khi điều khiển còn sai sót, dễ gây nguy hiểm
cho xung quanh và hư hỏng phần cứng. Cần thời gian nghiên cứu và luyện tập kỹ
năng điều khiển.
1.11 Hướng phát triển
• Nghiên cứu, hiệu chỉnh cân bằng tốt hơn để máy bay hoàn thiện, an toàn.
• Gắn thêm các cảm biến tăng độ an toàn cho máy bay và người xung quanh, GPS giữ
máy bay trong khoảng không gian xác định, camera quay phim, chụp hình .

Thiết kế máy bay điều khiển


Trang 20/33

TÀI LIỆU THAM KHẢO
Tiếng Việt:
[1] https://www.arduino.vn/en/Main/ArduinoBoardNano.
[2] http://playground.arduino.cc/Main/MPU-6050.
[3] https://oscarliang.com/kiss-24a-esc-re/.
[4] http://quanphongrc.vn/ct/may-bay-dieu-khien/1366/himodel-xxd-22121000kv-dau-dan.html.
[5] Datasheet MPU6050.
[6] Data sheet Atmega328p.
Tiếng Anh:
[7] https://www.arduino.cc/en/Main/ArduinoBoardNano.
[8] https://www.youtube.com/user/MacPuffdog.
[9] http://mydronelab.com/blog/arduino-quadcopter.html.

Thiết kế máy bay điều khiển


Trang 21/33

PHỤ LỤC
#include
#include
float Kp_roll = 2.5; //Gain setting for the roll P-controller
float Ki_roll = 0.03;//Gain setting for the roll I-controller
float Kd_roll = 22.5;//Gain setting for the roll D-controller
int pid_max_roll = 300; //Maximum output of the PID-controller (+/-)
float Kp_pitch = Kp_roll;
float Ki_pitch = Ki_roll;
float Kd_pitch = Kd_roll;
int pid_max_pitch = pid_max_roll;
float Kp_yaw = 2.8;
float Ki_yaw = 0.02;
float Kd_yaw = 0.05;
int pid_max_yaw = 300;
boolean mode_auto = true;//Auto level on (true)
byte last_channel_1, last_channel_2, last_channel_3, last_channel_4;
byte eeprom_data[36];
byte highByte, lowByte;
volatile int tin_hieu_kenh1, tin_hieu_kenh2, tin_hieu_kenh3, tin_hieu_kenh4;
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 tin_hieu_thu[5];
int temperature;
int truc_giatoc[4], truc_vantocgoc[4];

Thiết kế máy bay điều khiển


Trang 22/33

float roll_dieuchinh, pitch_dieuchinh;
long giatoc_x, giatoc_y, giatoc_z, tong_giatoc;
unsigned long timer_kenh1, timer_kenh2, timer_kenh3, timer_kenh4, 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 truc_vantocgoc_cal[4];
float loi_pid;
float tong_pid_i_roll, roll_setpoint, gyro_roll_input, pid_output_roll,
last_roll_d_error;
float tong_pid_i_pitch, pitch_setpoint, gyro_pitch_input, pid_output_pitch,
last_pitch_d_error;
float tong_pid_i_yaw, yaw_setpoint, gyro_yaw_input, pid_output_yaw,
last_yaw_d_error;
float goc_roll_acc, goc_pitch_acc, goc_pitch, goc_roll;
boolean gyro_angles_set;
void setup(){
//Copy the EEPROM data for fast access data.
for(start = 0; start <= 35; start++)eeprom_data[start] = EEPROM.read(start);
start = 0; //Set start back to zero.
gyro_address = eeprom_data[32]; //Store the gyro address in the variable.
Wire.begin();
TWBR = 12;//Set the I2C clock speed to 400kHz.
DDRD |= B11110000;//Configure digital poort 4, 5, 6 and 7 as output.
DDRB |= B00110000;//Configure digital poort 12 and 13 as output.
digitalWrite(12,HIGH);//Turn on the warning led.
//Check the EEPROM signature, make sure that the setup program is executed.

Thiết kế máy bay điều khiển


Trang 23/33

while(eeprom_data[33] != 'J' || eeprom_data[34] != 'M' || eeprom_data[35] !=
'B')delay(10);
//If setup is completed without MPU-6050 stop the flight controller program
if(eeprom_data[31] == 2 || eeprom_data[31] == 3)delay(10);
set_gyro_registers();//Set the specific gyro registers.
for (cal_int = 0; cal_int < 1250 ; cal_int ++){//Wait 5 seconds before continuing.
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.
delayMicroseconds(3000);
}
//multiple gyro data samples so we can determine the average gyro offset
(calibration).
for (cal_int = 0; cal_int < 2000 ; cal_int ++){//Take 2000 readings for calibration.
if(cal_int % 15 == 0)digitalWrite(12, !digitalRead(12));
gyro_signalen();//Read the gyro output.
truc_vantocgoc_cal[1] += truc_vantocgoc[1];
truc_vantocgoc_cal[2] += truc_vantocgoc[2];
truc_vantocgoc_cal[3] += truc_vantocgoc[3]; //Ad yaw value to
truc_vantocgoc_cal.
//We don't want the esc's to be beeping annoyingly.
PORTD |= B11110000;//Set digital poort 4, 5, 6 and 7 high.
delayMicroseconds(1000);
PORTD &= B00001111;//Set digital poort 4, 5, 6 and 7 low.
delay(3);
}
//devide by 2000 to get the average gyro offset.
truc_vantocgoc_cal[1] /= 2000;//Divide the roll total by 2000.
truc_vantocgoc_cal[2] /= 2000;

Thiết kế máy bay điều khiển


Trang 24/33

truc_vantocgoc_cal[3] /= 2000;
PCICR |= (1 << PCIE0); //Set PCIE0 to enable PCMSK0 scan.
PCMSK0 |= (1 << PCINT0); //Set PCINT0(digital input 8) ngắt khi trạng thái thay
đổi.
PCMSK0 |= (1 << PCINT1);
PCMSK0 |= (1 << PCINT2);
PCMSK0 |= (1 << PCINT3);
//Wait until the receiver is active and the throtle is set to the lower position.
while(tin_hieu_kenh3 < 990 || tin_hieu_kenh3 > 1020 || tin_hieu_kenh4 < 1400){
tin_hieu_kenh3 = convert_receiver_channel(3);//Convert the actual receiver
signals for throttle to the standard 1000 - 2000us
tin_hieu_kenh4 = convert_receiver_channel(4);
start ++; //While waiting increment start whith every loop.
PORTD |= B11110000;
delayMicroseconds(1000);
PORTD &= B00001111;
delay(3);
if(start == 125){ // 125 loops (500ms).
digitalWrite(12, !digitalRead(12));//Change the led status.
start = 0;
}
}
start = 0; //Set start về 0.
//Load the battery voltage to the battery_voltage variable.
//65 is the voltage compensation for the diode.
//12.6V equals ~5V @ Analog 0.
//12.6V equals 1023 analogRead(0).
//1260 / 1023 = 1.2317.
//The variable battery_voltage holds 1050 if the battery voltage is 10.5V.

Thiết kế máy bay điều khiển


Trang 25/33

battery_voltage = (analogRead(0) + 65) * 1.2317;
loop_timer = micros(); //Set the timer for the next loop.
//When everything is done, turn off the led.
digitalWrite(12,LOW);
}
void loop(){
//65.5 = 1 deg/sec (check the datasheet of the MPU-6050 for more information).
gyro_roll_input = (gyro_roll_input * 0.8) + ((gyro_roll / 65.5) * 0.2); // pid input
deg/sec.
gyro_pitch_input = (gyro_pitch_input * 0.8) + ((gyro_pitch / 65.5) * 0.2);// pid
input deg/sec.
gyro_yaw_input = (gyro_yaw_input * 0.8) + ((gyro_yaw / 65.5) * 0.2);

// pid

input deg/sec.
//tính góc
//0.0000611 = 1/(250Hz / 65.5)
goc_pitch += gyro_pitch * 0.0000611; //Calculate the traveled pitch angle and add
this to the goc_pitch variable.
goc_roll += gyro_roll * 0.0000611;
//0.000001066 = 0.0000611*(3.142(PI)/180degr) The Arduino sin function is in
radians
goc_pitch -= goc_roll * sin(gyro_yaw * 0.000001066);//If the IMU has yawed
transfer the roll angle to the pitch angel.
goc_roll += goc_pitch * sin(gyro_yaw * 0.000001066);
//tính gia tốc
tong_giatoc = sqrt((giatoc_x*giatoc_x)+(giatoc_y*giatoc_y)+
(giatoc_z*giatoc_z));
if((giatoc_y) < tong_giatoc){
goc_pitch_acc = asin((float)giatoc_y/tong_giatoc)* 57.296;//tính góc trục pitch
}

Thiết kế máy bay điều khiển


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×