Nghiên cứu Khoa học
Xe mô tô tự cân bằng
Hình 1: Mô hình dự kiến |
Đây là mô hình được vẽ bằng phần mềm vẽ chuyên dụng soliwork. Với phần mềm này, mô hình có tính chính xác đến từng mm. Xe được cấu tạo với hai bánh không đồng trục, mang hình dáng của một chiếc môtô thu nhỏ. Giữa phần khung xe có thiết kế các vị trí sắp xếp các module phục vụ cho đề tài.
Thông số kỹ thuật:
Đây là động cơ nhỏ gọn nhưng lực kéo và đẩy mạnh, phù hợp với việc bẻ lái cổ xe.
Đây là động cơ DC 24v. Động cơ mạnh, bền, tiêu thụ ít điện, tuy nhiên loại động cơ này không có hàng mới tại việt nam nên nhóm tận dụng loại động cơ đã qua sử dụng
Arduino Nano là một bo mạch nhỏ, đầy đủ, và thân thiện dựa trên atmega328 (Arduino Nano 3.x) hoặc Atmega168 (Arduino Nano 2.x).
MPU6050 là IC tích hợp cảm biến tích gia tốc kế và cảm biến từ trường, từ cảm biến này có thể đo được tốc độ góc theo 3 chiều không gian(gyro), và hình chiếu vector trọng trường lên 3 trục trong không gian(Accelrometer).Ngoài ra từ các giá trị này, người ta cho đi qua các bộ lọc số (chẳng hạn như AHRS Kalman...) để thu được giá trị đã loại bỏ nhiễu, các giá trị này tiếp tục được dùng để xác định các giá trị thứ cấp như tốc độ dài, tọa độ không gian.
Thông số kỹ thuật:
Mạch điều khiển động cơ L298 giúp bạn có thể điều khiển tốc độ và chiều quay của động cơ DC một cách dễ dàng, ngoài ra module l298còn điều khiển được 1 động cơ bước lưỡng cực. Mạch cầu H l298 động cơ có điện áp từ 5V đến 35V. Trên mạch cầu H l298 có tích hợp một IC nguồn 7805 để tạo ra nguồn 5V để cung cấp cho các thiết bị khác.
Thông số kỹ thuật:
Đây là mô hình bằng sắt mạ kẽm đảm bảo sự an toàn của các module có trong xe, chống hư hỏng khi va đập. Thiết kế được nhóm tâm đắc nhất bới tính thẩm mỹ và gọn gàng.
PID là cách viết tắc của các từ Propotional (tỉ lệ), Integral (tích phân) và Derivative (đạo hàm). Tuy xuất hiện rất lâu nhưng đến nay PID vẫn là giải thuật điều khiển được dùng nhiều nhất trong các ứng dụng điều khiển tự động.
PID được viết dựa trên 3 hệ số: tỷ lệ (P), Tích phân (I), Đạo hàm (D):
A – Hướng xe thằng về phía trước. B – Trọng lực. C – Lực hướng tâm. D – Lực ly tâm. |
Hình 12. Nguyên lý cân bằng của xe. |
Điều khiển xe cân bằng dựa trên nguyên lý:
Khi xe bị nghiêng so với vị trí cân bằng, xe cần có một lực đủ lớn để kéo xe khỏi góc nghiêng trở về trạng thái ban đầu. Thực tế có một phương pháp phổ biến nhất là dùng con quay hồi chuyển. Tuy nhiên, nhận thấy phương pháp này phải xây dựng mô hình cồng kềnh và đó là phương pháp khá phổ biến nên nhóm không đi theo hướng này.
Lý thuyết về lực ly tâm và thực nghiệm quan sát cho thấy khi xe bị nghiêng, nếu bánh xe được bẻ lái sang hướng nghiêng của xe sẽ tạo ra một lực ly tâm kéo xe ngã về hướng ngược lại. Nhờ đó, mục tiêu của nhóm đề ra là sử dụng thuật toán điều khiển PID để điều chỉnh góc quay của xe sao cho lực ly tâm vừa đủ và chính xác nhất. Mục đính cuối cùng là giúp xe cân bằng.
Sơ đồ 1: Sơ đồ tổng quan |
Đây là sơ đồ tổng quan thể hiện mối liên kết giữa các thành phần chính của xe. Arduino được cấu hình giao tiếp I2C để nhận dữ liệu từ MPU6050, thông qua bộ lọc để xử lý sau đó tính toán bằng thuật toán điều khiển PID để truyền góc điều khiển (GDK) xuống điều khiển động cơ cổ xe. Đối với động cơ cổ xe cần có nguồn 5V được lấy trực tiếp từ LM2596S. Driver L298N nhận tín hiệu PWM từ board Arduino để điều khiển tốc độ bánh sau.
Sơ đồ ngắt Timer, điều khiển động cơ bánh sau. |
Ở đây có thể thấy sơ đồ bao gồm 2 khối riêng biệt, một khối vòng lặp bao gồm các biến ban đầu, vòng lặp xử lý dữ liệu MPU6050 và thuật toán điều khiển PID. Bên cạnh khối này chính là khối ngắt timer, khi xe khởi động, chế độ timer đồng thời cũng được bật và tín hiệu PWM được truyền xuống cho mạch lái để điều khiển tốc độ động cơ bánh sau.
Khi bắt đầu xây dựng thuật toán để lập trình điều khiển, nhóm đã gặp không ít khó khăn đối với MPU6050 này, cảm biến này có độ nhạy cao nên rất dễ bị nhiễu, việc xác định góc cân bằng của MPU so với vị trí đặt trên thân xe cũng là vấn đề cần quan tâm. Không hẳn lúc nào góc cân bằng của MPU cũng là 00, để hiệu chính được góc cân bằng này nhóm đã dùng đến một biến phụ để loại bỏ độ sai lệch của MPU đối với góc cân bằng, điều này giúp việc hiệu chỉnh bớt phức tạp hơn.
Đối với góc nghiêng của xe, nhóm đã sử dụng cảm biến độ nghiêng MPU6050 để đo. Cảm biến có nhược điểm là độ nhiễu cao. Để sử dụng dữ liệu của cảm biến một cách chính xác thì cần phải lọc nhiễu, do đó nhóm đã quyết định dùng bộ lọc Kalman để sử lý nhiễu cho cảm biến. Sau khi sử dụng bộ lọc này, cảm biến trả về giá trị đúng và ít bị dao động khi ở vị trí cân bằng giúp việc lập trình dễ dàng hơn.
Ban đầu, nhóm chủ yếu tính toán dựa trên số nguyên ( ép kiểu của các thông số và dữ liệu ở dạng interger để tính toán ) nên có sai lệch trong quá trình xử lý dữ liệu MPU cũng như hiệu chỉnh thông số thuật toán PID. Sau một thời gian quan sát và nhóm đã nhận ra sự sai lệch này. Đối với MPU, dữ liệu của cảm biến này trả về là số thực nên ta có thể sử dụng số thực để tính toán và hiệu chỉnh, việc này giúp đảm bảo đáp ứng về thời gian thực một cách chuẩn xác nhất. Đồng thời, việc sử dụng số thực để hiệu chỉnh còn giúp tránh được độ sai lệch quá cao gây ra hiện tượng vọt lố khi điều khiển, bên cạnh đó, ta có thể hiệu chỉnh một cách dễ dàng, thỏa mái và việc qua sát sau mỗi lần hiệu chỉnh là rõ ràng nhất giúp cho việc hiệu chỉnh có hiệu quả. Sau một thời gian thực nghiệm, nhóm đã nhận định rằng phương pháp dùng số thực để tính toán rất hiệu quả.
Sơ đồ 4: Thuật toán điều khiển cổ xe. |
Thuật toán này có nói đến max_angle, min_angle. Đây chính là góc giới hạn dùng để hạn chế góc quay của động cơ. Động cơ dùng để bẻ lái cổ xe là động cơ servo, khi gắn nó vào phần cổ xe của mô hình và lập trình điều khiển thì không thể tránh việc chênh lệch giữa góc quay bên trái và góc quay bên phải. Do đó, nhóm dùng phương pháp giới hạn góc quay ( ở đây nhóm cho góc giời hạn so với vị trí cân bằng là 450 ) để góc quay bằng nhau đối với hai phía của cổ xe.
Tốc độ bánh sau có một phần quyết định cho sự cân bằng của xe, ví dụ như khi chúng ta đi xe hai bánh, xe đi tốc độ chậm thì việc thăng bằng khó khăn hơn, nếu đạt tốc độ ổn đinh thì việc giữ thăng bằng rất đơn giản. Khi đó đáp ứng cần có để giữ sự thăng bằng rất nhỏ. Tương tự, việc giữ cho mô hình có khả năng tự thăng bằng cũng dựa trên nguyên lý này, do đó tốc độ của bánh xe sau phải đáp ứng vừa đủ, không quá nhanh hoặc quá chậm khi ở vị trí cân bằng.
Để tránh gây ra các vấn đề không mong muốn trong điều khiển, nhóm đã quyết định cho việc điều khiển tốc độ động cơ bánh sau hoàn toàn độc lập bằng cách cho quá trình điều khiển vào timer. Timer chỉ có nhiệm vụ truyền tín hiệu PWM từ vi điều khiển xuống mạch lái.
Sau khi hoàn thành mô hình, nhóm đã bắt tay vào triển khai thuật toán điều khiển PID với mục đích tìm ra các bộ thông số có thể giúp xe giữ thăng bằng. Tuy chưa đạt được kết quả tốt nhất nhưng những bộ thông số mà nhóm hiệu chỉnh được có thể giúp xe giữ thăng bằng trong khoàng thời gian 1-2m, với phương pháp này, nhóm có thể đánh giá được tính hiệu quả của thuật toán PID trong điều khiển và tạo tiền đề để cải thiện thuật toán sau này tốt hơn.
Thực tế, việc cân bằng đối với xe hai bánh không đồng trục và xe hai bánh đồng trục hoàn toàn khác nhau. Xe hai bánh đồng trục chỉ có một thông số để điều chỉnh là tốc độ của 2 bánh xe để giữ xe cân bằng. Trong khi xe hai bánh không đồng trục có tới hai thông số cần hiệu chỉnh là tốc độ bánh sau và góc bẻ lái của cổ xe bánh trước. Ở đây, nhóm mặc định tốc độ của bánh sau là 150 (58.8%) so với tốc độ lớn nhất là 255 (100%) để việc điều chỉnh thông số trong thuật toán điều khiển PID đơn giản hơn.
Thuật toán PID là phần quan trọng nhất và được nhóm đầu tư nhất. Đây là phương pháp điều khiển cổ điển và phổ biến. Thuật toán được thể hiện qua công thức:
Gdk = mean_straight +(Kp*alpha)+(Ki*I_value)- (Kd*D_value)
Trong đó:
Để tính được độ sai lệch so với ban đầu của xe, nhóm đã dựa vào góc đo được khi xe bị nghiêng, tất nhiên phải kèm theo thông số hiệu chỉnh để giảm độ sai lệch không mong muốn. Ở đây, góc cân bằng mà xe có được là 1150. Thông số Kp là thành phần thể hiện tốc độ bẻ lái của cổ xe được hiệu chỉnh thủ công, Kp càng lớn thì tốc độ bẻ lái càng cao. Thông số I_value là thành phần quán tính đáp ứng tốc độ mong muốn, nó được lấy từ trung bình dãy tích phân của góc nghiêng đo được lúc xe bị ngã với n mẫu. Với yêu cầu khoảng thời gian đáp ứng để xe vực dậy được là không vượt quá 0,25s tương ứng với 5 mẫu, n càng lớn thì tính đáp ứng càng chậm. Thông số D_value là thành phần vọt lố của xe, được tính bằng độ sai lệch giữa mẫu tích phân đầu tiên và mẫu thứ 2. Các thông số Ki, Kd cũng được hiệu chỉnh thủ công để thuật toán điều khiển chính xác, đáp ứng đủ nhanh mà không bị vọt lố.
Với mean_straight = 115 ( góc cân bằng), limit_angle = 45 ( độ rộng góc giới hạn) là không thay đổi, off_set ( thông số hiệu chỉnh đồ sai lệch của MPU so với vị trí cân bằng). Những bộ thông số mà nhóm hiệu chỉnh được, cho kết quả khả quan trong việc giữ thăng bằng cho xe là:
- Bộ thông số đầu tiên, chỉ hiểu chỉnh Kp, xe đứng được 1 – 2s, đáp ứng của xe vừa đủ để vực xe ra khỏi góc ngã.
off_set = - 4;
Kp=3.5;
Ki=0;
Kd = 0;
- Bộ thông số thứ hai, hiệu chỉnh thêm Ki, xe ít dao động tại vị trí thăng bằng, khi xe đạt đủ tốc độ ngay tại vị trí thăng bằng thì xe có thể giữ thăng bằng ở một đoạn khoảng 0,5m:
off_set = -4
Kp=3.4
Ki=0.11
Kd = 1
- Và bộ thông số ổn định nhất cho đến lúc này giúp xe có thể được trong khoảng 1 – 2m.
off_set = -5.2
Kp=3.4
Ki=0.14
Kd = -1
Nguyên tắc để hiệu chỉnh bộ thông số trên là:
- Đối với off_set, nếu tăng off_set thì xe sẽ nghiêng sang trái và ngược lại. Khi xe có xu hướng nghiêng bên trái hoặc phải nhiều hơn nhóm sẽ hiệu chỉnh thông số này sao cho cổ xe có xu hướng lái về góc cân bằng tốt nhất.
- Thông số Kp tương ứng với tốc độ bẻ lái của cổ xe, với góc ngã càng lớn thì tốc độ bẻ cổ lái phải nhanh để đáp ứng được thời gian xe vực dậy. Nếu tăng Kp thì tốc độ càng nhanh và ngược lại.
- Thông số Ki là phần quán tính để bù vào phần Kp chưa đáp ứng kịp ( xe có xu hướng nghiêng 1 bên). Ki càng lớn thì quán tính càng cao, lúc này dễ có trường hợp bị vọt lố tại vị trí cân bằng khiến cổ xe dao động qua lại hai phía tại góc cân bằng. Để triệt tiêu sự vọt lố này, nhóm sử dụng đến thông số Kd.
- Kd là thành phần vọt lố để giảm thời gian trể lúc xe bẻ lái đế góc yêu cầu, khi thời gian trể lớn thì nhóm tăng Kd và ngược lại, nếu bị vọt lố thì nhóm trừ thành phần Kd này để giảm độ vọt lố đó ( Kd âm).
- Lưu ý đối với các thông số này, chúng tôi đang thử nghiệm trên bề mặt gạch men phẳng, rộng. Vì bánh xe được thiết kế bằng cao su nên sự ma sát với bề mặt tiếp xúc trên những chất liệu khác nhau sẽ cần có những hệ số hiệu chỉnh khác nhau để đảm bảo xe có thể hoạt động tốt nhất.
Nhờ sự giúp đỡ của thầy hướng dẫn, nhóm với tinh thần nghiên cứu khoa học đã đạt được một số thành tựu sau:
Ngoài những thành tựu đã đạt được, nhóm còn đề xuất hướng phát triển tiếp theo sau khi hoàn thành đề tài này là:
ü tiết kiệm năng lượng
ü tính thẩm mỹ cao
ü tính ổn định và an toàn