#quadcopter #maybay #lipo #mpu6050
Đầu tiên, Bạn cần phải đọc thêm bài này để hiểu hơn về Quadcopter.
Về cơ bản, Quadcopter là máy bay điều khiển 4 động cơ được xếp thành hình vuông, các cánh đặt ở 4 cạnh
Với Quadcopter, điển hình nhất ta có các máy bay thương mại của DJI, với giá khoảng 20 đến 40 triệu tùy loại. Hay ta có thể mua các bộ KIT lắp ráp để tự làm cho mình 1 chiếc.
Như hình trên, để máy bay được cân bằng thì các động cơ được quay ngược chiều nhau. Các động cơ được điều khiển sao cho tạo động lực học để máy bay được cân bằng, di chuyển về phía trước ra sau, lên xuống. Việc điều khiển này được đảm nhận bởi Arduino, và điều khiển bằng thuật toán.
Tuy nhiên bài viết này, sẽ giúp chúng ta tự tay làm cho mình một chiếc Quadcopter vởi Arduino, Nào ta bắt đầu. Háo hức rồi đây các bạn.
Các thành phần của Máy bay Quacopter
1. Khung máy bay
Khung máy bay phải chắc chắn, cân đối và cần phải nhẹ, các loại máy bay giá cao thì khung đươc làm bằng sợi carbon nhằm đảm bảo giảm trọng lượng và tăng cứng. Loại này giá cao ở đây ta có thể dùng khung nhựa hoặc gỗ để thay thế.
2. Động cơ
Đây là loại động cơ không chổi than, quay ở tốc độ rất cao.
3. Cánh quạt
Để đảm bảo lực nâng cho máy bay, thì có 2 cách, một là tăng tốc độ của độ cơ, hai là tăng kích thước cánh quạt và tăng momen xoắn các động cơ. Việc tăng kích thước cánh quạt và tăng momen xoắn sẽ giúp máy bay bay êm ái hơn.
4. Bộ điều khiển đông cơ
Ở đây ta có 4 động cơ, vì vậy ta cần có 4 bộ điều khiển tương ứng.
Nhiệm vụ của các bộ điều khiển này là giúp thay đổi tốc độ của động cơ, nâng công suất và điều tốc dựa trên tần số của xung điều khiển phát ra từ Arduino. Khi muốn động cơ chạy nhanh, Arduino sẽ phát các xung vuông có tần số lớn hơn đến các bộ điều khiển này.
5. Pin
Pin của máy bay là loại có dung lượng cao, có thể dùng Pin LiPo, có điện áp ra 3.7V 1 cell. Loại phổ biến dùng cho máy bay là 3SP1 có 3 cell, điện áp ra xấp xỉ 11.1V.
Đi kèm với Pin, bạn cần 1 bộ sạc Lipo 3s để sạc loại pin này
6. Bộ đo quán tính Inertial Measurement Unit (IMU)
Mạch này sẽ đo hướng di chuyển, vận tốc, lực hấp dẫn, v.v. Cấu tạo gồm một con quay hồi chuyển (gyroscope) 3 trục.
Bạn có thể đọc Bài con quay hồi chuyển trên Wiki để hiểu rõ hơn.
7. Bộ điều khiển bay
Ở đây ta dùng Arduino Uno làm bộ điều khiển chính.
8. Bộ điều khiển từ xa (RC transmiter)
Các bộ RC transmiter là các bộ điều khiển chuẩn, dùng chung cho nhiều loại RC khác nhau như xe điều khiển RC, máy bay cánh bằng RC .v.v.
Các lại RC transmiter này có 2 bộ.
- Bộ thu
Bộ thu được gắn lên máy bay để nhận tín hiệu.
Sơ đồ mạch và cách nối dây
Bây giờ ta sẽ tiến hành lắm ráp Khung máy bay, Mạch điều khiển, bộ đo quán tính.
Các linh kiện cần thiết gồm có:
- Bộ thu phát RC (8)
- Khung máy bay
- 4 Động cơ 1000kV, Cánh máy bay và bộ điều khiển ESC đi kèm
- Pin Lipo 3S (hoặc 3C) 2200mAh
- 1 mạch Arduino Uno
- 1 bộ đo quán tính MPU-6050
- 1 bộ sạc 3s Pino
Bạn có thể dùng điốt là 1N4007.
Chân *1 để trống
Nếu muốn đảo chiều cho động cơ, bạn chỉ cần đổi dây 2 và dây 3 ở *2
Kết quả xong khi hàn mạch xong
Mã nguồn chương trình
Chương trình test động cơ
#include <Wire.h> //Include the Wire.h library so we can communicate with the gyro.
#include <EEPROM.h> //Include the EEPROM.h library so we can store information onto the EEPROM
//Declaring global variables
byte last_channel_1, last_channel_2, last_channel_3, last_channel_4;
byte eeprom_data[36], start, data;
boolean new_function_request,first_angle;
volatile int receiver_input_channel_1, receiver_input_channel_2, receiver_input_channel_3, receiver_input_channel_4;
int esc_1, esc_2, esc_3, esc_4;
int counter_channel_1, counter_channel_2, counter_channel_3, counter_channel_4;
int receiver_input[5];
int loop_counter, gyro_address, vibration_counter;
int temperature;
long acc_x, acc_y, acc_z, acc_total_vector[20], acc_av_vector, vibration_total_result;
unsigned long timer_channel_1, timer_channel_2, timer_channel_3, timer_channel_4, esc_timer, esc_loop_timer;
unsigned long zero_timer, timer_1, timer_2, timer_3, timer_4, current_time;
int acc_axis[4], gyro_axis[4];
double gyro_pitch, gyro_roll, gyro_yaw;
float angle_roll_acc, angle_pitch_acc, angle_pitch, angle_roll;
int cal_int;
double gyro_axis_cal[4];
//Setup routine
void setup(){
Serial.begin(57600); //Start the serial port.
Wire.begin(); //Start the wire library as master
TWBR = 12; //Set the I2C clock speed to 400kHz.
//Arduino Uno pins default to inputs, so they don't need to be explicitly declared as inputs.
DDRD |= B11110000; //Configure digital poort 4, 5, 6 and 7 as output.
DDRB |= B00010000; //Configure digital poort 12 as output.
PCICR |= (1 << PCIE0); // set PCIE0 to enable PCMSK0 scan.
PCMSK0 |= (1 << PCINT0); // set PCINT0 (digital input 8) to trigger an interrupt on state change.
PCMSK0 |= (1 << PCINT1); // set PCINT1 (digital input 9)to trigger an interrupt on state change.
PCMSK0 |= (1 << PCINT2); // set PCINT2 (digital input 10)to trigger an interrupt on state change.
PCMSK0 |= (1 << PCINT3); // set PCINT3 (digital input 11)to trigger an interrupt on state change.
Tải về đầy đủ chương trình (Đổi đuôi file .c thành .ino để mở bằng Arduin IDE)
Chương trình setup, cấu hình cho mạch trước khi nạp chương trình chính
#include <Wire.h> //Include the Wire.h library so we can communicate with the gyro
#include <EEPROM.h> //Include the EEPROM.h library so we can store information onto the EEPROM
//Declaring Global Variables
byte last_channel_1, last_channel_2, last_channel_3, last_channel_4;
byte lowByte, highByte, type, gyro_address, error, clockspeed_ok;
byte channel_1_assign, channel_2_assign, channel_3_assign, channel_4_assign;
byte roll_axis, pitch_axis, yaw_axis;
byte receiver_check_byte, gyro_check_byte;
volatile int receiver_input_channel_1, receiver_input_channel_2, receiver_input_channel_3, receiver_input_channel_4;
int center_channel_1, center_channel_2, center_channel_3, center_channel_4;
int high_channel_1, high_channel_2, high_channel_3, high_channel_4;
int low_channel_1, low_channel_2, low_channel_3, low_channel_4;
int address, cal_int;
unsigned long timer, timer_1, timer_2, timer_3, timer_4, current_time;
float gyro_pitch, gyro_roll, gyro_yaw;
float gyro_roll_cal, gyro_pitch_cal, gyro_yaw_cal;
//Setup routine
void setup(){
pinMode(12, OUTPUT);
//Arduino (Atmega) pins default to inputs, so they don't need to be explicitly declared as inputs
PCICR |= (1 << PCIE0); // set PCIE0 to enable PCMSK0 scan
PCMSK0 |= (1 << PCINT0); // set PCINT0 (digital input 8) to trigger an interrupt on state change
PCMSK0 |= (1 << PCINT1); // set PCINT1 (digital input 9)to trigger an interrupt on state change
PCMSK0 |= (1 << PCINT2); // set PCINT2 (digital input 10)to trigger an interrupt on state change
PCMSK0 |= (1 << PCINT3); // set PCINT3 (digital input 11)to trigger an interrupt on state change
Wire.begin(); //Start the I2C as master
Serial.begin(57600); //Start the serial connetion @ 57600bps
delay(250); //Give the gyro time to start
}
Tải về đầy đủ chương trình (Đổi đuôi file .c thành .ino để mở bằng Arduin IDE)
Chương trình bay
void gyro_signalen(){
//Read the MPU-6050
if(eeprom_data[31] == 1){
Wire.beginTransmission(gyro_address); //Start communication with the gyro.
Wire.write(0x3B); //Start reading @ register 43h and auto increment with every read.
Wire.endTransmission(); //End the transmission.
Wire.requestFrom(gyro_address,14); //Request 14 bytes from the gyro.
receiver_input_channel_1 = convert_receiver_channel(1); //Convert the actual receiver signals for pitch to the standard 1000 - 2000us.
receiver_input_channel_2 = convert_receiver_channel(2); //Convert the actual receiver signals for roll to the standard 1000 - 2000us.
receiver_input_channel_3 = convert_receiver_channel(3); //Convert the actual receiver signals for throttle to the standard 1000 - 2000us.
receiver_input_channel_4 = convert_receiver_channel(4); //Convert the actual receiver signals for yaw to the standard 1000 - 2000us.
while(Wire.available() < 14); //Wait until the 14 bytes are received.
acc_axis[1] = Wire.read()<<8|Wire.read(); //Add the low and high byte to the acc_x variable.
acc_axis[2] = Wire.read()<<8|Wire.read(); //Add the low and high byte to the acc_y variable.
acc_axis[3] = Wire.read()<<8|Wire.read(); //Add the low and high byte to the acc_z variable.
temperature = Wire.read()<<8|Wire.read(); //Add the low and high byte to the temperature variable.
gyro_axis[1] = Wire.read()<<8|Wire.read(); //Read high and low part of the angular data.
gyro_axis[2] = Wire.read()<<8|Wire.read(); //Read high and low part of the angular data.
gyro_axis[3] = Wire.read()<<8|Wire.read(); //Read high and low part of the angular data.
}
if(cal_int == 2000){
gyro_axis[1] -= gyro_axis_cal[1]; //Only compensate after the calibration.
gyro_axis[2] -= gyro_axis_cal[2]; //Only compensate after the calibration.
gyro_axis[3] -= gyro_axis_cal[3]; //Only compensate after the calibration.
}
gyro_roll = gyro_axis[eeprom_data[28] & 0b00000011]; //Set gyro_roll to the correct axis that was stored in the EEPROM.
if(eeprom_data[28] & 0b10000000)gyro_roll *= -1; //Invert gyro_roll if the MSB of EEPROM bit 28 is set.
gyro_pitch = gyro_axis[eeprom_data[29] & 0b00000011]; //Set gyro_pitch to the correct axis that was stored in the EEPROM.
if(eeprom_data[29] & 0b10000000)gyro_pitch *= -1; //Invert gyro_pitch if the MSB of EEPROM bit 29 is set.
gyro_yaw = gyro_axis[eeprom_data[30] & 0b00000011]; //Set gyro_yaw to the correct axis that was stored in the EEPROM.
if(eeprom_data[30] & 0b10000000)gyro_yaw *= -1; //Invert gyro_yaw if the MSB of EEPROM bit 30 is set.
acc_x = acc_axis[eeprom_data[29] & 0b00000011]; //Set acc_x to the correct axis that was stored in the EEPROM.
if(eeprom_data[29] & 0b10000000)acc_x *= -1; //Invert acc_x if the MSB of EEPROM bit 29 is set.
acc_y = acc_axis[eeprom_data[28] & 0b00000011]; //Set acc_y to the correct axis that was stored in the EEPROM.
if(eeprom_data[28] & 0b10000000)acc_y *= -1; //Invert acc_y if the MSB of EEPROM bit 28 is set.
acc_z = acc_axis[eeprom_data[30] & 0b00000011]; //Set acc_z to the correct axis that was stored in the EEPROM.
if(eeprom_data[30] & 0b10000000)acc_z *= -1; //Invert acc_z if the MSB of EEPROM bit 30 is set.
}
Tải về đầy đủ chương trình (Đổi đuôi file .c thành .ino để mở bằng Arduin IDE)
Trang chủ của Project này
http://www.brokking.net/ymfc-al_main.html
(Bài viết này tham khảo bài sau)