Động cơ không chổi than

Một phần của tài liệu ĐỒ án kỹ THUẬT ROBOT THIẾT kế mô HÌNH và bộ điều KHIỂN PID CHO máy BAY 4 CÁNH 2 (Trang 25)

-Thông số kỹ thuật

Bảng 3.4 Thông số kỹ thuật động cơ 3.3.5 Lựa chọn mạch giảm áp 3.3.5 Lựa chọn mạch giảm áp

- Yêu cầu: Điện áp đầu ra nằm trong khoảng điện áp hoạt động cấp cho Arduino

- Lựa chọn module LM2596 + Giá rẻ

+ Dải điện áp điều chỉnh rộng + Điện áp đầu ra ổn định - Sơ đồ chân

16 TIEU LUAN MOI download : skknchat@gmail.com

Chương 3. Thiết Kế Phần Cứng.

-Thông số kỹ thuật

Bảng 3.5 Thông số kỹ thuật lm2596 3.3.6 Lựa chọn module điều khiển trung tâm lm2596 3.3.6 Lựa chọn module điều khiển trung tâm

- Yêu cầu:

+ Giao tiếp I2C với cảm biến góc nghiêng + 4 ngõ ra PWM điều khiển động cơ + 1 ngõ vào đọc tín hiệu từ tay điều khiển - Các lựa chọn có thể có:

+ Aruino + PIC + AVR + STM32

- Lựa chọn Arduino Uno vì

+ Đáp ứng giao tiếp I2C, 6 ngõ ra PWM + Dễ dàng lập trình, giao tiếp

17 TIEU LUAN MOI download : skknchat@gmail.com

Chương 3. Thiết Kế Phần Cứng.

+ Cộng đồng phát triển lớn, mã nguồn mở + Giá thành rẻ

- Sơ đồ chân Arduino Uno

Hình 3.7: Sơ đồ chân Arduino Uno

- Thông số kỹ thuật

Arduino Uno (Chip ATmega328P)

18 TIEU LUAN MOI download : skknchat@gmail.com

Chương 3. Thiết Kế Phần Cứng.

3.4 Sơ đồ nối dây tổng thể

Hình 3.8: Sơ đồ nối dây tổng thể

3.5 Bảng danh mục thiết bị STT STT 1 2 3 4 5 6 19 TIEU LUAN MOI download : skknchat@gmail.com

Chương 4. Thiết Kế Phần Mềm.

Chương 4 Thiết Kế Phần Mềm 4.1 Yêu cầu thiết kế:

- Đọc tín hiệu từ tay điều khiển.

- Đọc tín hiệu cảm biến.

- Tính toán góc nghiêng.

- Xuất tín hiệu xung PWM.

4.2 Giải thuật điều khiển:4.2.1 Lưu đồ 4.2.1 Lưu đồ

Hình 4.1: Lưu đồ giải thuật điều khiển

20 TIEU LUAN MOI download : skknchat@gmail.com

Chương 4. Thiết Kế Phần Mềm.

Giải thích lưu đồ giải thuật:

- Thiết lập thông số ban đầu: Khai báo các biến đầu vào ra, trạng thái ban đầu, cấp xung khởi động cho esc động cơ.

- Kiểm tra cảm biến: Kiểm tra tín hiệu kết nối giao tiếp I2C với cảm biến. - Đọc tín hiệu cảm biến: Truy cập vào địa chỉ các tín hiệu tiến hành đọc tín hiệu thô từ cảm biến.

- Xử lí tín hiệu cảm biến: Xử dụng thuật toán tính toán giá trị góc từ các tín hiệu thô.

- Tính toán giá trị góc nghiêng, xung điều khiển: Tính toán giá trị góc lệch so với góc đặt, từ đó tính ra giá trị xung điều khiển cần cung cấp cho từng động cơ.

- Xuất tín hiệu điều khiển: Xuất tín hiệu điều khiển qua các chân PWM nối với ESC điều khiển 4 động cơ.

4.2.2 Đọc tín hiệu cảm biếnGiao tiếp I2C Giao tiếp I2C

- I2C là tên viết tắt của cụm từ tiếng anh “Inter-Integrated Circuit”. Nó là một giao thức giao tiếp được phát triển bởi Philips Semiconductors để truyền dữ liệu giữa một bộ xử lý trung tâm với nhiều IC trên cùng một board mạch chỉ sử dụng hai đường truyền tín hiệu.

- Do tính đơn giản của nó nên loại giao thức này được sử dụng rộng rãi cho giao tiếp giữa vi điều khiển và mảng cảm biến, các thiết bị hiển thị, thiết bị IoT, EEPROMs, v.v …

- Đây là một loại giao thức giao tiếp nối tiếp đồng bộ. Nó có nghĩa là các bit dữ liệu được truyền từng bit một theo các khoảng thời gian đều đặn được thiết lập bởi một tín hiệu đồng hồ tham chiếu.

Một số đặc điểm quan trọng của giao thức giao tiếp I2C:

Chỉ cần có hai đường bus (dây) chung để điều khiển bất kỳ thiết bị / IC nào trên mạng I2C

Không cần thỏa thuận trước về tốc độ truyền dữ liệu như trong giao tiếp UART. Vì vậy, tốc độ truyền dữ liệu có thể được điều chỉnh bất cứ khi nào cần thiết

Cơ chế đơn giản để xác thực dữ liệu được truyền

Sử dụng hệ thống địa chỉ 7 bit để xác định một thiết bị / IC cụ thể trên bus I2C

Chương 4. Thiết Kế Phần Mềm.

Các mạng I2C dễ dàng mở rộng. Các thiết bị mới có thể được kết nối đơn giản với hai đường bus chung I2C

Đọc dữ liệu MPU qua I2C:

Hình 4.2 Lưu đồ giải thuật đọc tín hiệu từ MPU

22 TIEU LUAN MOI download : skknchat@gmail.com

Chương 5. Kết Quả.

Chương 5 Kết Quả 5.1. Phần cứng

Hình 5.1. Body của Quadcopter.

- Body quadcopter được thiết kế trên phần mềm Autodesk Inventor và được in 3d với độ đặc 50% có sự chắc chắn hạn chế rủi ro hư hỏng khi gặp sự cố va đập.

Hình 5.2. Phần cứng thiết kế trên Altium.

23 TIEU LUAN MOI download : skknchat@gmail.com

Chương 5. Kết Quả.

- Phần cứng được thiết kế trên phần mềm Altium Designer. - Phần cứng được chia thành 2 tầng:

+Tầng 1: các thiết bị công suất được bố trí ở tầng này để thuận tiện cho việc kết nối với các động cơ ở các cánh tay đòn. Bên phải là công tắc nguồn để người điều khiển có thể dễ dàng đóng, ngắt nguồn. Xung quanh là các jack để kết nối nguồn pin với các chân nguồn của driver điều khiển động cơ. Ở giữa là module LM2596 hạ áp từ nguồn pin để cấp nguồn Arduino.

+Tầng 2: Các thiết bị điều khiển được bố trí ở tầng 2 bao gồm Arduino Uno, MPU6050 và các jack ngõ ra cấp xung điều khiển động cơ.

Hình 5.3. Kết quả thi công phần cứng.

Hình 5.4. Mô hình hoàn chỉnh.

24 TIEU LUAN MOI download : skknchat@gmail.com

Chương 5. Kết Quả.

5.2. Phần mềm

Giao diện GUI được lập trình bằng C#-WPF

-WPF, viết tắt của Windows Presentation Foundation, là hệ thống API mới hỗ trợ việc xây dựng giao diện đồ hoạ trên nền Windows.

-WPF được xem như thế hệ kế tiếp của WinForms, WPF tăng cường khả năng lập trình giao diện của lập trình viên bằng cách cung cấp các API cho phép tận dụng những lợi thế về đa phương tiện hiện đại.

Ưu điểm của WPF:

Nó mới hơn và do đó phù hợp hơn với các tiêu chuẩn hiện tại.

Microsoft đang sử dụng nó cho rất nhiều ứng dụng mới, ví dụ: Visual Studio

Nó linh hoạt hơn, có thể làm nhiều việc hơn mà không phải viết hoặc mua các control mới.

 XAML giúp dễ dàng tạo và chỉnh sửa GUI của bạn và cho phép công việc được phân chia giữa một nhà thiết kế (XAML) và một lập trình viên (C #, VB.NET, v.v.)

 Databinding, cho phép bạn có được một sự tách biệt hơn giữa data và layout.

 Sử dụng tăng tốc phần cứng để vẽ GUI, để có hiệu suất tốt hơn.

 Nó cho phép bạn tạo giao diện người dùng cho cả ứng dụng Windows và các ứng dụng web (Silverlight / XBAP)

Chương 5. Kết Quả.

Hình 5.5.a. Kết quả trả về từ cảm biến hiển thị trên giao diện GUI.

Hình 5.5.b. Kết quả trả về từ cảm biến hiển thị trên giao diện GUI.

26 TIEU LUAN MOI download : skknchat@gmail.com

Chương 6. Kết Luận Và Hướng Phát Triển.

Chương 6 Kết Luận Và Hướng Phát Triển 6.1. Kết luận

6.1.1. Công việc đã thực hiện được

Trong quá trình thực hiện đề tài sinh viên đã làm được những nội dung sau: -Tìm hiểu về mô hình quadcopter.

-Thiết kế phần cứng, thi công mạch. -Lập trình điều khiển hệ thống.

6.1.2. Hạn chế của đề tài

Bên cạnh những nội dung đã đạt được, hệ thống vẫn còn những hạn chế như sau: -Bộ điều khiển PID vẫn còn chưa tối ưu.

-Cấu hình được chọn chỉ phù hợp với điều kiện môi trường học tập, nghiên cứu.

6.2. Hướng phát triển

Các hướng phát triển thêm của hệ thống:

-Tích hợp cánh tay gắp vật, camera giám sát, nhận dạng. -Kết hợp xử lý ảnh, AI

-Cảm biến thời tiết, nhiệt độ, độ ẩm, ….

Tài Liệu Tham Khảo

[1] T. Cao-hoang, N. Tran, C. Nguyen, and C. Nguyen, “Thiết Kế Quadrotor Để Thu Thập Không Ảnh,” no. August 2015, 2014.

[2] V. Van To, “Ứng Dụng Điều Khiển Trượt Thích Nghi Điều Khiển Chuyển Động Của Quadcopter,” 2015.

[3] M. Q. Model, “Thiết kế và chế tạo mô hình máy bay-quadrocopter,” pp. 2–8, 2012.

[4] A. Behjat, S. Paul, and S. Chowdhury, “Learning reciprocal actions for cooperative collision avoidance in quadrotor unmanned aerial vehicles,” Rob. Auton. Syst., vol. 121, p. 103270, 2019, doi: 10.1016/j.robot.2019.103270.

[5] H. Zakeri, F. M. Nejad, and A. Fahimifar, “Rahbin: A quadcopter unmanned aerial vehicle based on a systematic image processing approach toward an automated asphalt pavement inspection,” Autom. Constr., vol. 72, pp. 211–235, 2016, doi: 10.1016/j.autcon.2016.09.002.

[6] T. Tuna, S. E. Ovur, E. Gokbel, and T. Kumbasar, “FOLLY: A self foldable and self deployable autonomous quadcopter,” 2018 6th Int. Conf. Control Eng. Inf. Technol. CEIT 2018, no. October, pp. 1–6, 2018, doi: 10.1109/CEIT.2018.8751883.

[7] K. M. Thu and A. I. Gavrilov, “Designing and Modeling of Quadcopter Control System Using L1 Adaptive Control,” Procedia Comput. Sci., vol. 103, no. October 2016, pp. 528–535, 2017, doi: 10.1016/j.procs.2017.01.046.

[8] A. Faust, I. Palunko, P. Cruz, R. Fierro, and L. Tapia, “Automated aerial suspended cargo delivery through reinforcement learning,” Artif. Intell., vol. 1, pp. 1–18, 2015, doi: 10.1016/j.artint.2014.11.009. [9] https://mechasolution.vn/Blog/bai-21-cam-bien-gia-toc-goc-nghieng-mpu6050 [10] https://vinlifetech.vn/tin-tuc/tong-quan-ve-camera-drone-flycam-p50.html [11] http://schneider.com.vn/tong-quan-ve-bo-dieu-khien-pid-1-2-248038.html [12]https://lhu.edu.vn/Data/News/370/files/07_Thai_Son_Nguyen_Phuc.pdf? AspxAutoDetectCookieSupport=1 [13] https://create.arduino.cc/projecthub/robocircuits/arduino-quadcopter-860741 [14]https://www.renesas.com/us/en/support/engineer-school/brushless-dc-motor-01- overview 28

Phụ Lục Phục Lục 1. Code #include <Wire.h> #include <Servo.h> Servo esc1; Servo esc2; Servo esc3; Servo esc4;

int16_t Acc_rawX, Acc_rawY, Acc_rawZ, Gyr_rawX, Gyr_rawY, Gyr_rawZ; float Acceleration_angle[2];

float Gyro_angle[2]; float Total_angle[2];

float elapsedTime, time, timePrev; int i;

float rad_to_deg = 180 / 3.141592654;

float PIDR, PIDP, PIDY, PIDT, pwmesc1, pwmesc2, pwmesc3, pwmesc4, eRoll, ePitch, previous_eRoll, previous_ePitch;

float pid_pr = 0; float pid_ir = 0; float pid_dr = 0; float pid_pp = 0; float pid_ip = 0; float pid_dp = 0; /////////////////PID///////////////// 29

double kp = 4; //1:4 double ki = 0; //1:0 double kd = 0.5 ;//1:0.5 double a = 0; double throttle = 0; float desired_angleR = -2; float desired_angleP = -1.8;

//volatile bool mpuInterrupt = false; //void dmpDataReady() { / mpuInterrupt = true; //} void setup() { esc1.attach(9,1000,2000);//phai truoc esc2.attach(10,1000,2000);//trai truoc esc3.attach(5,1000,2000);//trai sau esc4.attach(6,1000,2000);//phai sau esc1.writeMicroseconds(1000); esc2.writeMicroseconds(1000); esc3.writeMicroseconds(1000); esc4.writeMicroseconds(1000); delay(2000); pinMode(4,INPUT); Wire.begin(); Wire.beginTransmission(0x68); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(250000); 30

time = millis(); } void loop() { throttle = pulseIn(4,HIGH); //Serial.println(throttle); ////////////Read MPU timePrev = time; time = millis();

elapsedTime = (time - timePrev) / 1000;

//attachInterrupt(digitalPinToInterrupt(2), dmpDataReady, RISING);

//Read Acc Data

Wire.beginTransmission(0x68); Wire.write(0x3B);

Wire.endTransmission(false); Wire.requestFrom(0x68, 6, true);

Acc_rawX = Wire.read() << 8 | Wire.read(); Acc_rawY = Wire.read() << 8 | Wire.read(); Acc_rawZ = Wire.read() << 8 | Wire.read();

Acceleration_angle[0] = atan((Acc_rawY / 16384.0) / sqrt(pow((Acc_rawX / 16384.0), 2) + pow((Acc_rawZ / 16384.0), 2))) * rad_to_deg;

/*---Y---*/

Acceleration_angle[1] = atan(-1 * (Acc_rawX / 16384.0) / sqrt(pow((Acc_rawY / 16384.0), 2) + pow((Acc_rawZ / 16384.0), 2))) * rad_to_deg;

//Read Gyro Data

31

Wire.beginTransmission(0x68); Wire.write(0x43); //Dia chi Gyro Wire.endTransmission(false); Wire.requestFrom(0x68, 4, true);

Gyr_rawX = Wire.read() << 8 | Wire.read(); Gyr_rawY = Wire.read() << 8 | Wire.read();

Gyro_angle[0] = Gyr_rawX / 131.0; /*---Y---*/

Gyro_angle[1] = Gyr_rawY / 131.0; //

/*---Roll---*/

Total_angle[0] = 0.98 * (Total_angle[0] + Gyro_angle[0] * elapsedTime) + 0.02 * Acceleration_angle[0] ;

/*---Pitch---*/

Total_angle[1] = 0.98 * (Total_angle[1] + Gyro_angle[1] * elapsedTime) + 0.02 * Acceleration_angle[1] ;

Serial.println(Total_angle[0]); Serial.println(Total_angle[1]);

/*///////////////////////////P I D///////////////////////////////////*/

////////////////////Góc lệch//////////////////////////////////// eRoll = Total_angle[0] - desired_angleR; ePitch = Total_angle[1] - desired_angleP;

32

//Serial.println(eRoll); //Serial.println(ePitch);

//eYaw = Total_angle[1] - desired_angle; /////////////////Tính toán///////////////////////////////// /*if (Serial.available()>0) { kd = Serial.parseFloat(); } */ pid_pr = kp * eRoll; if (-3 < eRoll < 3) {

pid_ir = pid_ir + (ki * eRoll); }

pid_dr = kd * ((eRoll - previous_eRoll) / elapsedTime);

PIDR = pid_pr + pid_ir + pid_dr; // PID Roll if (PIDR < -1000) { PIDR = -1000; } if (PIDR > 1000) { PIDR = 1000; } pid_pp = kp * ePitch; if (-3 < ePitch < 3) { 33

pid_ip = pid_ip + (ki * ePitch); }

pid_dp = kd * ((ePitch - previous_ePitch) / elapsedTime); PIDP = pid_pp + pid_ip + pid_dp; // PID Pitch

if (PIDP < -1000) { PIDP = -1000; } if (PIDP > 1000) { PIDP = 1000; } //throttle = pulseIn(3,HIGH); if (throttle < 1050) { esc2.writeMicroseconds(pwmesc2=1000); esc3.writeMicroseconds(pwmesc3=1000); esc1.writeMicroseconds(pwmesc1=1000); esc4.writeMicroseconds(pwmesc4=1000);} else {

//////////Motor Mixing Algorithm//////////////////////////// pwmesc1 = throttle - PIDR + PIDP ;

pwmesc2 = throttle + PIDR + PIDP ; pwmesc4 = throttle - PIDR - PIDP ; pwmesc3 = throttle + PIDR - PIDP ;

//////////Giới hạn PWM/////////////////////////////////////

34

if (pwmesc1 < 1000 ) { pwmesc1 = 1000; } else if (pwmesc1 > 1500) { pwmesc1 = 1500; } if (pwmesc2 < 1000) { pwmesc2 = 1000; } else if (pwmesc2 > 1500) { pwmesc2 = 1500; } if (pwmesc3 < 1000) { pwmesc3 = 1000; } else if (pwmesc3 > 1500) { pwmesc3 = 1500; } if (pwmesc4 < 1000) { pwmesc4 = 1000; 35

}

else if (pwmesc4 > 1500) {

pwmesc4 = 1500; }

//////////////////Xuất tín hiệu điều khiển////////////////////////// esc2.writeMicroseconds(pwmesc2); esc3.writeMicroseconds(pwmesc3); esc1.writeMicroseconds(pwmesc1); esc4.writeMicroseconds(pwmesc4); } //Serial.println(kd); //Serial.println(pwmesc1);//9//phai truoc //Serial.println(pwmesc2);//10//trai truoc //Serial.println(pwmesc3);//5//trai sau //Serial.println(pwmesc4);//6//phai sau //Serial.println( ); previous_eRoll = eRoll; previous_ePitch = ePitch; } 36

Một phần của tài liệu ĐỒ án kỹ THUẬT ROBOT THIẾT kế mô HÌNH và bộ điều KHIỂN PID CHO máy BAY 4 CÁNH 2 (Trang 25)

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

(44 trang)
w