CƠ SỞ LÝ THUYẾT
Nguyên lý xe hai bánh tự cân bằng
Đối với xe ba hoặc bốn bánh, sự thăng bằng và ổn định phụ thuộc vào trọng tâm nằm trong bề mặt do các chân bánh xe tạo ra Trong khi đó, xe hai bánh như xe đạp gặp khó khăn trong việc thăng bằng khi di chuyển, vì nó dựa vào tính chất con quay hồi chuyển của hai bánh xe đang quay Xe hai bánh tự cân bằng, với hai bánh có trục trùng nhau, giữ trọng tâm ở giữa để duy trì sự cân bằng Tuy nhiên, vị trí chính xác của trọng tâm toàn bộ xe hai bánh vẫn chưa được xác định, và việc di chuyển bánh xe đủ nhanh để giữ trọng tâm luôn dưới toàn bộ xe là một thách thức.
Hình 2.1: Nguyên lý xe hai bánh tự cân bằng
Góc giữa sàn xe hai bánh và chiều trọng lực có thể xác định được về mặt kỹ thuật Do đó, để duy trì sự ổn định, tay lái cần được giữ thẳng đứng và vuông góc với sàn xe, với góc cân bằng đạt 0.
Hình 2.2: Trạng thái xe khi cân bằng và di chuyển
Khi tay lái nghiêng về phía trước, hai bánh xe sẽ di chuyển về phía trước, và khi nghiêng ra sau, hai bánh sẽ lùi lại Hầu hết mọi người có thể nhanh chóng kiểm soát tay lái trong vài giây Để dừng lại, chỉ cần điều chỉnh trọng tâm xe ngược lại với hướng di chuyển, giúp giảm tốc độ Vì cảm nhận và phản ứng thăng bằng của mỗi người khác nhau, xe hai bánh tự cân bằng chỉ phù hợp cho một người sử dụng.
Hình 2.3: Quá trình đi lên và đi xuống.
Bộ điều khiển LQR
LQR (Bộ điều khiển bậc hai tuyến tính) là một phương pháp trong lý thuyết điều khiển hiện đại, áp dụng cách tiếp cận không gian trạng thái để phân tích và ổn định hệ thống Phương pháp này sử dụng thông tin phản hồi trạng thái đầy đủ để điều chỉnh hệ thống một cách hiệu quả.
Hình 2.4: Tổng quan bộ điều khiển LQR
LQR là hệ thống điều khiển được tối ưu hóa theo tiêu chuẩn chất lượng nhất định, đảm bảo hiệu suất cao Trạng thái tối ưu của hệ thống phụ thuộc vào yêu cầu chất lượng đã được thiết lập, cũng như sự hiểu biết về các đối tượng và điều kiện hoạt động của hệ thống điều khiển.
Các thiết lập của bộ điều khiển, máy móc hoặc quy trình được xác định thông qua một thuật toán toán học nhằm giảm thiểu hàm chi phí, trong đó các yếu tố trọng số do con người cung cấp Hàm chi phí thường được định nghĩa là tổng các độ lệch của các yếu tố chính như nhiệt độ hoặc độ cao mong muốn so với giá trị mục tiêu của chúng.
Ta có thể tuyến tính hóa hệ thống về phương trình trạng thái dưới đây [2] :
Trong đó: x(t) = [x1(t), x2(t), , xn(t)] T : Vector trạng thái u(t) = [u1(t), u2(t), , un(t)] T : Vector tín hiệu điều khiển
Chỉ số hiệu suất (hàm chi phí) [2] được trình bày như sau:
Q : Ma trận trọng số bán xác định dương
R : Ma trận trọng số xác định dương Đây được gọi là bài toán điều chỉnh toàn phương tuyến tính
Hình 2.5: Sơ đồ điều khiển LQR liên tục
Kỹ thuật này bao gồm chọn luật điều khiển u(t) = -Kx(t) [2] để ổn định nguồn gốc tối thiều hóa chỉ tiêu chất lượng
Với K là ma trận được tính:
Và P được tính theo phương trình Riccati [2] với P là nghiệm xác định bán dương của phương trình đại số Ricaccti:
A T và B T là các ma trận được chuyển vị từ các ma trận liên tục của hệ thống
Chú ý trong trường hợp này K và P không phụ thuộc vào thời gian
Q là ma trận xác định (có thể coi như ma trận bán xác định) R cũng là ma trận xác định
Q và R là các ma trận trọng số liên quan đến các biến trạng thái và tín hiệu đầu vào Việc lựa chọn các giá trị trong các ma trận này là cần thiết để tối ưu hóa hiệu suất của bộ điều khiển.
Xét đối tượng tuyến tính rời rạc mô tả bởi phương trình trạng thái [2] :
𝑥 𝑘 ∈ 𝑅 𝑛 𝑣à 𝑢 𝑘 ∈ 𝑅 𝑚 (2.6) x(k) = [x1(k), x2(k), , xn(k)] T : Vector trạng thái u(k) = [u1(k), u2(k), , un(k)] T : Vector tín hiệu điều khiển
Nếu hệ ban đầu là liên tục, thì ta rời rạc hóa hệ liên tục để sử dụng phương pháp điều khiển LQR
Sau đó luật điều khiển tối ưu các tín hiệu điều khiển được định nghĩa như sau:
Với 𝐾 𝑘 được định nghĩa như sau [2] :
Với 𝑆 𝑘 là nghiệm bán xác định dương của phương trình Riccati có phương trình như sau [2] :
Nghiệm phương trình Riccati rời rạc: lần lượt thay k = (N-1) 0 vào phương trình Riccati sẽ tìm được Pk
2.2.3 Bài toán LQR rời rạc thời gian vô hạn
Xét đối tượng tuyến tính mô tả bởi phương trình trạng thái rời rạc [2] :
Chỉ tiêu chất lượng dạng toàn phương [2] , trong đó thời điểm cuối 𝑁 = ∞
Tín hiệu điều khiển tối ưu:
Và P là nghiệm bán xác định dương của phương trình đại số Ricaccti Trong trường hợp này K và P không phụ thuộc vào k
2.2.4 Các lời giải bài toàn LQR thời gian vô hạn bằng matlab
Nghiệm phương trình đại số Riccati liên tục [2] (Continuous algebraic Ricaccti equation):
Lời giải bài toán LQR (Linear - Quadratic regulator) liên tục [2]
Nghiệm dương đại số Riccati rời rạc [2] (discrete algebraic Ricaccti equation)
Lời giải bài toán LQR (Linear - Quadratic regulator) [2] rời rạc
Bộ lọc Kalman
Bộ lọc Kalman là một thuật toán tối ưu cho việc xử lý dữ liệu hồi quy, với nhiều phương pháp xác định tối ưu tùy thuộc vào tiêu chuẩn đánh giá Nó tích hợp tất cả thông tin sẵn có để ước lượng giá trị hiện tại, đồng thời mô tả các yếu tố thống kê của hệ thống nhiễu như nhiễu ồn, nhiễu đo và sự không chắc chắn trong mô hình động học Bộ lọc này cũng xem xét các thông tin liên quan đến điều kiện ban đầu của giá trị quan tâm, giúp nâng cao độ chính xác trong quá trình phân tích dữ liệu.
Bộ Lọc Kalman là công cụ hiệu quả để ước lượng giá trị x ϵ R trong các tiến trình kiểm soát bị gián đoạn, được mô tả qua các phương trình tuyến tính ngẫu nhiên khác nhau.
Giá trị thay đổi ngẫu nhiên 𝑤 𝑘 và 𝑣 𝑘 thể hiện cách xử lý và đo độ nhiễu, với nhiễu trắng được tách biệt và sắp xếp theo bản chất thông thường Cụ thể, p(w) được mô tả bằng phân phối chuẩn N(0, Q) và p(v) được mô tả bằng phân phối chuẩn N(0, R).
Trong thực tiễn, ma trận tương quan tiến trình nhiễu Q và ma trận tương quan đo độ nhiễu R có thể thay đổi theo từng bước thời gian hoặc giá trị Tuy nhiên, giả thuyết cho rằng chúng là hằng số vẫn được áp dụng.
Ma trận A m x n trong phương trình (2.18) kết nối giá trị tại thời điểm k-1 với giá trị hiện tại k, trong bối cảnh thiếu hụt khổng ở hàm lái và đo nhiễu tiến trình Mặc dù A có thể thay đổi theo thời gian, nhưng trong bài viết này, nó được coi là hằng số Ma trận B n x l liên quan đến hoạt động kiểm soát tùy ý u ∈ R đối với x Tương tự, ma trận H m x n trong phương trình (2.19) liên quan đến giá trị đo 𝑧 𝑘, và mặc dù H có thể thay đổi theo thời gian, nó cũng được xem là hằng số trong ngữ cảnh này.
Bản chất toán học của bộ lọc
Theo định nghĩa, 𝑥 𝑘′ ∈ R (siêu âm) là ước lượng trạng thái priori tại bước k, trong khi 𝑥 𝑘′ ∈ R là ước lượng trạng thái posteriori tại bước k với giá trị 𝑧 𝑘 Từ đó, ta có thể xác định sai số giữa ước lượng priori và posteriori.
Tương quan sai số ước lượng priori là:
Và Tương quan sai số ước lượng priori là:
Bài viết bắt nguồn từ việc lấy đạo hàm phương trình của bộ lọc Kalman nhằm mục tiêu ước lượng trạng thái posteriori 𝑥 𝑘 Sự khác biệt giữa giá trị thực 𝑧 𝑘 và giá trị chuẩn tắc H𝑥 𝑘 được thể hiện qua công thức (2.19).
Độ lệch (𝑧 𝑘 − 𝐻𝑥 𝑘 ′) được gọi là đại lượng cách tân hay giá trị thặng dư, phản ánh sự khác biệt giữa giá trị chuẩn tắc 𝐻𝑥 𝑘 ′ và giá trị thực 𝑧 𝑘 Giá trị thặng dư cho thấy mức độ biến động trong hệ thống và có vai trò quan trọng trong việc đánh giá hiệu suất.
A của 0 nghĩa là hai thành phần này hoàn toàn nhất quán nhau
Ma trận K n x m trong công thức (2.27) được xác định là độ lợi hoặc hệ số pha trọn tối thiểu hóa tương quan sai số posteriori (2.26) Để thực hiện sự tối thiểu hóa, trước tiên thay thế (2.27) vào giá trị xác định cho 𝑒 𝑘, sau đó thay thế vào (2.26) để trình bày giá trị trong cậy chỉ thị Tiếp theo, lấy đạo hàm vết của kết quả đối với K, thiết lập kết quả bằng 0 và giải quyết K Kết quả tối thiểu hóa K từ (2.26) được trình bày như sau:
Hơn nữa, tương quan sai số ước lượng priori 𝑃 𝑘 ′ tiến tới 0, độ lợi K đánh giá thặng dư thấp hơn
Phụ cấp bằng K có nghĩa là thống kê sai lệch đo lường R tiến tới 0, trong khi đo lường thực tế 𝑧 𝑘 lại đáng tin cậy hơn Ngược lại, dự đoán đo lường H𝑥 𝑘 ′ lại ít tin cậy hơn Hơn nữa, thống kê sai lệch ước lượng priori 𝑃 𝑘 ′ tiến tới 0, dẫn đến việc đo thực tế 𝑧 𝑘 trở nên kém tin cậy hơn, trong khi dự đoán đo lường 𝐻𝑥 𝑘 ′ lại đáng tin cậy hơn.
Bản chất xác suất của bộ lọc Điều chỉnh (2.19) làm rõ cách ước lượng 𝑥 𝑘 ′ khi tất cả các giá trị 𝑧 𝑘 đều có nghĩa, cho thấy rằng bộ lọc Kalman duy trì hoặc xác định khoảng thời gian đầu tiên của phân bố trạng thái.
Ước lượng trạng thái Posteriori được biểu diễn bởi E[𝑥 𝑘 ] = 𝑥̂ 𝑘, cho thấy giá trị trung bình của phân bố trạng thái Tương quan sai số ước lượng Posteriori, được mô tả bởi E[(𝑥 𝑘 − 𝑥̂ ) (𝑥 𝑘 𝑘 − 𝑥̂ ) 𝑘 𝑇 ] = 𝑃 𝑘, phản ánh sự phân bố trạng thái trong khoảng thời gian thứ hai Hơn nữa, xác suất p(𝑥 𝑘 |(𝑧 𝑘 ) được mô tả bằng phân phối chuẩn N(E[(𝑥 𝑘 ], E[(𝑥 𝑘 − 𝑥̂ ) (𝑥 𝑘 𝑘 − 𝑥̂ ) 𝑘 𝑇 ]) = N(𝑥 𝑘 , 𝑃 𝑘), cho thấy mối liên hệ giữa các biến trạng thái và sai số ước lượng.
Thuật toán bộ lọc Kalman gián đoạn
Bộ lọc Kalman sử dụng hình thức kiểm soát phản hồi để ước lượng tiến trình, bao gồm việc ước lượng trạng thái tại các điểm nhất định và phản hồi dưới dạng giá trị nhiễu Phương trình của bộ lọc Kalman được chia thành hai nhóm: phương trình cập nhật thời gian và phương trình cập nhật giá trị Phương trình cập nhật thời gian dự đoán giá trị hiện tại và xác định sai số ước lượng để đạt được ước lượng priori cho thời điểm tiếp theo Trong khi đó, phương trình cập nhật giá trị kết hợp giá trị mới vào ước lượng priori nhằm cải thiện ước lượng posteriori.
Phương trình cập nhật thời gian được coi là phương trình chuẩn tắc, trong khi phương trình cập nhật giá trị được xem là phương trình chính xác Thuật toán ước lượng cuối cùng tương tự như thuật toán chính xác - chuẩn tắc, nhằm giải quyết vấn đề số liệu được trình bày như hình dưới.
Hình 2.6: Thuật toán bộ lọc Kalman
Bộ điều khiển PID
Bộ điều khiển vi tích phân tỉ lệ (PID) là một cơ chế phản hồi quan trọng trong các hệ thống công nghiệp, được sử dụng phổ biến nhất trong các bộ điều khiển phản hồi Nó hoạt động bằng cách tính toán sai số, tức là hiệu số giữa giá trị thực tế và giá trị mong muốn, từ đó điều chỉnh đầu vào để giảm thiểu sai số Các thông số PID cần được điều chỉnh phù hợp với đặc tính của từng hệ thống để đạt hiệu quả tối ưu.
Giải thuật tính toán bộ điều khiển PID bao gồm 3 thông số riêng biệt, do đó đôi khi nó còn được gọi là điều khiển 3 khâu bao gồm:
- Khâu tỉ lệ: Xác định tác động của sai số hiện tại
- Khâu tích phân: Xác định tốc độ biến đổi sai số trước đó
- Khâu đạo hàm: Xác định tốc độ biến đổi sai số
Bằng cách điều chỉnh ba hằng số Kp, Ki và Kd, bộ điều khiển có thể được tùy chỉnh cho các thiết kế đặc thù Đáp ứng của bộ điều khiển được thể hiện qua độ nhạy sai số, giá trị vọt lố và mức dao động của hệ thống, nhằm mục tiêu ổn định hệ thống hiệu quả.
Hình 2.7: Bộ điều khiển PID
Lý thuyết bộ điều khiển PID
Sơ đồ điều khiển PID được đặt theo tên của ba khâu hiệu chỉnh, tổng của 3 khâu này tạo thành biến ngõ ra, ta có:
Pout, Iout, Dout là các thành phần đầu ra từ ba khâu của bộ điều khiển
Độ lợi tỉ lệ, được ký hiệu là Kp, là hệ số dùng để điều khiển sự thay đổi giá trị đầu ra tỷ lệ với giá trị sai số thực tại Khi nhân sai số thực với hệ số Kp, chúng ta có thể điều chỉnh kết quả đầu ra một cách hiệu quả.
Khâu tỉ lệ cho bởi:
Pout : thừa số tỉ lệ đầu ra
Độ lợi tỉ lệ (Kp) là một thông số điều khiển quan trọng, ảnh hưởng đến sự ổn định của hệ thống Khi Kp lớn, đầu ra thay đổi mạnh mẽ trong khi sai số (e) chỉ thay đổi nhỏ, nhưng nếu quá cao sẽ dẫn đến sự không ổn định Ngược lại, độ lợi nhỏ khiến cho bộ điều khiển kém nhạy và đáp ứng chậm, vì đầu ra chỉ thay đổi ít khi sai số đầu vào lớn Nếu Kp quá thấp, tác động điều khiển sẽ không đủ mạnh để đối phó với các nhiễu trong hệ thống.
Khâu tích phân có sự phân phối tỷ lệ thuận với biên độ sai số và thời gian xảy ra sai số Tổng sai số tức thời theo thời gian (tích phân) giúp tích lũy bù đã được hiệu chỉnh trước đó Sai số tích lũy sau đó được nhân với độ lợi tích phân và cộng với tín hiệu đầu ra của bộ điều khiển Biên độ của khâu tích phân trên tất cả các tác động được điều chỉnh bởi độ lợi tích phân.
Iout : thừa số tích phân đầu ra
Ki : độ lợi tích phân e : sai số
Khâu tích phân giúp tăng tốc độ đạt đến điểm đặt và giảm sai số ổn định, với tỷ lệ phụ thuộc vào bộ điều khiển Tuy nhiên, do khâu tích phân phản ứng với sai số tích lũy trong quá khứ, nó có thể dẫn đến việc giá trị hiện tại vượt quá giá trị đặt.
Khâu đạo hàm(Vi phân)
Tốc độ thay đổi của sai số quá trình được xác định bằng cách tính độ dốc của sai số theo thời gian và nhân với độ lợi tỉ lệ Biên độ của phân phối khâu vi phân được gọi là độ lợi vi phân.
Thừa số vi phân được cho bởi:
Dout : Thừa số vi phân đầu ra
Khâu vi phân (Kd) trong hệ thống điều khiển làm chậm tốc độ thay đổi đầu ra và là yếu tố quan trọng để đạt điểm đặt Khâu đạo hàm được sử dụng để giảm thiểu sai số (e), nhưng đồng thời cũng có thể khuếch đại nhiễu, làm cho hệ thống nhạy cảm hơn với các biến động Nếu nhiễu và độ lợi vi phân đủ lớn, hệ thống có thể trở nên thiếu ổn định.
Phân tích, lựa chọn phương pháp điều khiển
Dựa trên lý thuyết các phương pháp điều khiển, nhóm đã phân tích phương pháp điều khiển kinh điển PID và điều khiển tối ưu LQR, từ đó rút ra những kết luận quan trọng về hiệu quả và ứng dụng của từng phương pháp trong thực tiễn.
Ưu điểm bộ điều khiển PID là dễ dàng thiết kế và không phụ thuộc nhiều vào mô hình toán học của đối tượng điều khiển
Bộ điều khiển sẽ thực hiện giảm tối đa sai số bằng cách điều chỉnh giá trị điều khiển đầu vào
Bộ điều khiển PID được thiết kế cho hệ thống với một đầu vào và một đầu ra, cho phép mỗi bộ PID quản lý một đầu vào riêng biệt Tín hiệu PID cuối cùng được tạo ra từ sự kết hợp của các bộ PID thành phần khác nhau.
Để đạt được kết quả tối ưu, các thông số PID trong tính toán cần được điều chỉnh phù hợp với đặc tính của hệ thống Mặc dù kiểu điều chỉnh có thể giống nhau, nhưng các thông số phải phụ thuộc vào đặc thù của từng hệ thống cụ thể.
Điều khiển LQR là phương pháp điều khiển rất tốt nếu ta biết rõ phương trình toán học của hệ thống và biết rõ các thông số mô hình
Lý thuyết điều khiển điều khiển LQR là một phương pháp điều khiển mạnh để điều khiển hệ thống tuyến tính được mô tả bằng phương trình trạng thái
Kỹ thuật LQR tạo ra bộ điều khiển vòng kín ổn định với năng lượng cung cấp cho hệ thống la nhỏ nhất
Đối với LQR chúng ta có thể điều khiển với số lượng tín hiệu đầu vào và đầu ra của một hệ thống là tùy ý
Nhược điểm lớn nhất của giải thuật điều khiển LQR là yêu cầu phải có phương trình toán học chính xác và thông số hệ thống cụ thể của đối tượng Điều này là cần thiết để đảm bảo bộ điều khiển hoạt động hiệu quả quanh vị trí làm việc của hệ thống.
Sau khi phân tích các đặc điểm lý thuyết của hai phương pháp điều khiển, nhóm đã chọn phương pháp điều khiển tối ưu toàn phương tuyến tính LQR cho hệ xe hai bánh tự cân bằng Quyết định này được đưa ra dựa trên những ưu điểm vượt trội của LQR trong việc tối ưu hóa hiệu suất và đảm bảo sự ổn định cho hệ thống.
Có thể điều khiển được số lượng ngõ vào ngõ ra tùy ý mà không cần phải thiết kế các bộ riêng như phương pháp điều khiển PID
Nhóm đã xác định điểm làm việc tối ưu, điều này giúp LQR thực hiện điều khiển chính xác, từ đó nâng cao hiệu suất hoạt động của hệ thống tại điểm đã chọn.
LQR yêu cầu thông số và mô hình toán học của hệ thống phải chính xác, do đó nhóm đã tiến hành tham khảo và đo đạc các thông số cần thiết Qua đó, họ đã xây dựng thành công mô hình toán học, cho phép lựa chọn phương pháp điều khiển LQR thay vì PID.
Phương pháp điều khiển cổ điển, đặc biệt là LQR, đã được áp dụng rộng rãi, mang lại cơ hội kiểm nghiệm thuật toán điều khiển mới Qua đó, nhóm nghiên cứu có thể phát triển và rút ra kinh nghiệm cho các hệ thống tiếp theo.
Giao tiếp I2C
2.6.1 Giới thiệu về giao tiếp I2C
I2C, viết tắt của "Inter-Integrated Circuit", là một giao thức giao tiếp được phát triển bởi Philips Semiconductors Giao thức này cho phép truyền dữ liệu giữa một bộ xử lý trung tâm và nhiều IC trên cùng một board mạch chỉ bằng hai đường truyền tín hiệu.
Giao thức này, với tính đơn giản của nó, được sử dụng rộng rãi cho việc giao tiếp giữa vi điều khiển và các thiết bị như màng cảm biến, thiết bị hiển thị IoT, EEPROMs, và nhiều thiết bị khác.
Sử dụng hệ thống cực máng hở (open drain) giúp ngăn ngừa hiện tượng ngắn mạch, điều này rất quan trọng khi một thiết bị cố gắng kéo đường dây lên cao trong khi các thiết bị khác lại kéo xuống thấp.
Thiết bị chủ (Master) và tớ (Slave)
Trong hệ thống bus I2C, các thiết bị được phân loại thành thiết bị Chủ (Master) và thiết bị Tớ (Slave) Chỉ có một thiết bị Master hoạt động tại một thời điểm, điều khiển tín hiệu đồng hồ SCL và quyết định các hoạt động trên đường dữ liệu SDA.
Tất cả các thiết bị kết nối với bus I2C đều là thiết bị Slave, tuân theo hướng dẫn từ thiết bị Master Mỗi thiết bị Slave được phân biệt bằng một địa chỉ vật lý 7-bit cố định.
Khi thiết bị Master cần truyền hoặc nhận dữ liệu từ thiết bị Slave, nó sẽ xác định địa chỉ của thiết bị Slave trên đường SDA trước khi tiến hành truyền dữ liệu Điều này đảm bảo giao tiếp hiệu quả giữa thiết bị Master và thiết bị Slave cụ thể.
Tất cả thiết bị Slave khác không phản hồi trừ khi địa chỉ của chúng được chỉ dịnh bởi thiết bị Master trên dòng SDA
Hình 2.8: Địa chỉ thiết bị trong I2C
Giao thức truyền dữ liệu
Giao thức sau đây (tập hợp các quy tắc) được theo sau bởi thiết bị Master và các thiết bị Slave để truyền dữ liệu giữa chúng
Dữ liệu giữa thiết bị Master và các thiết bị Slave được truyền qua một đường dữ liệu SDA duy nhất, sử dụng các chuỗi số 0 và 1 (bit) Mỗi chuỗi này được gọi là giao dịch (transaction), và dữ liệu trong mỗi giao dịch có cấu trúc cụ thể.
Hình 2.9: Cấu trúc truyền dữ liệu của I2C
Khi một thiết bị chủ hoặc IC khởi động một giao dịch, nó sẽ chuyển SDA từ mức điện áp cao xuống mức điện áp thấp trước khi SCL chuyển từ cao xuống thấp.
Khi thiết bị Master gửi điều kiện khởi động, tất cả các thiết bị Slave sẽ hoạt động ngay cả khi đang ở chế độ ngủ và chờ nhận bit địa chỉ.
Giao thức I2C sử dụng 7 bit để xác định địa chỉ của thiết bị Slave mà thiết bị Master cần gửi hoặc nhận dữ liệu Tất cả các thiết bị Slave trên bus I2C sẽ so sánh địa chỉ này với địa chỉ của chính chúng để xác định xem liệu có cần phản hồi hay không.
Bit này xác định hướng truyền dữ liệu giữa thiết bị Master và Slave Khi thiết bị Master cần gửi dữ liệu đến thiết bị Slave, bit được thiết lập là '0' Ngược lại, nếu thiết bị Master cần nhận dữ liệu từ thiết bị Slave, bit sẽ được thiết lập là '1'.
ACK/NACK, viết tắt của Acknowledged/Not-Acknowledged, là một cơ chế giao tiếp giữa thiết bị Master và thiết bị Slave Khi địa chỉ vật lý của một thiết bị Slave trùng với địa chỉ được phát bởi thiết bị Master, bit này sẽ được thiết lập là '0' bởi thiết bị Slave Ngược lại, nếu không trùng khớp, giá trị bit sẽ giữ ở mức logic '1', là trạng thái mặc định.
Nó bao gồm 8 bit được thiết lập bởi bên gửi, chứa các bit dữ liệu cần truyền tới bên nhận Sau khối này là một bit ACK/NACK được thiết lập để xác nhận hoặc từ chối việc nhận dữ liệu.
‘0’ bởi bên nhận nếu nó nhận thành công dữ liệu Ngược lại, nó vẫn ở mức logic ‘1’
Sự kết hợp của khối dữ liệu theo sau bởi bit ACK / NACK được lặp lại cho đến quá trình truyền dữ liệu được hoàn tất
Điều kiện kết thúc (Stop condition)
Sau khi các khung dữ liệu cần thiết được gửi qua đường SDA, thiết bị Master sẽ nâng mức điện áp của đường SDA lên cao trước khi đường SCL chuyển từ mức cao xuống thấp.
2.6.2 Giao tiếp I2C hoạt động như thế nào?
Giao tiếp I2C được khởi xướng bởi thiết bị Master, cho phép gửi hoặc nhận dữ liệu từ thiết bị Slave Bài viết này sẽ đi sâu vào cách thức hoạt động của cả hai kịch bản này.
Gửi dữ liệu đến thiết bị Slave
Trình tự hoạt động sau đây diễn ra khi một thiết bị Master gửi dữ liệu đến một thiết bị Slave cụ thể thông qua bus I2C:
Thiết bị Master gửi điều kiện bắt đầu đến tất cả các thiết bị Slave
Thiết bị Master gửi 7 bit địa chỉ của thiết bị Slave mà thiết bị Master muốn giao tiếp cùng với bit Read/Write
Hình 2.10: Truyền nhận dữ liệu giữa Master/Slave
TÍNH TOÁN VÀ THIẾT KẾ HỆ THỐNG
Tính toán và lựa chọn linh kiện
- Khối cảm biến: Bao gồm các tín hiệu từ cảm biến gia tốc góc MPU-
6050 và tín hiệu từ Encoder của động cơ, các tín hiệu này sẽ được gửi về khối xử lý
Khối xử lý nhận dữ liệu từ khối cảm biến, thực hiện các phép tính cần thiết và gửi giá trị điều khiển để điều chỉnh động cơ, từ đó giúp xe duy trì sự cân bằng và đảo chiều quay hiệu quả.
- Khối động cơ: Bao gồm khung xe gắn hai động cơ giảm tốc JGA25 có
- Khối nguồn: Cấp nguồn cho vi điều khiển và driver điều khiển động cơ
Nhóm em xử dụng phần mềm Fritzing để tiến hành mô phỏng lại phương pháp kết nối phần cứng
Hình 3.2: Sơ đồ đi dây cho hệ xe hai bánh tự cân bằng
Trong phần mềm đi dây, Encoder của động cơ không được kèm theo, vì vậy Vcc và GND của Encoder cần được kết nối vào 5VDC và GND của Board Arduino Cụ thể, chân tín hiệu của Encoder 1 được nối với chân A vào chân 3 (ngắt 1) và chân B vào chân 4 của Arduino Đối với Encoder 2, chân A được kết nối với chân 19 (ngắt 4) và chân B vào chân 5 của Arduino.
// đọc trạng thái kênh A, LOW or HIGH
// đọc trạng thái kênh B, LOW or HIGH
Arduino Mega 2560 là phiên bản nâng cấp của Arduino Mega 1280, với điểm khác biệt lớn nhất là chip nhân Trong khi Arduino Mega 1280 sử dụng chip Atmega 1280, có 128KB bộ nhớ flash, 8KB SRAM và 4KB EEPROM, thì Arduino Mega 2560 mang lại hiệu suất cao hơn và khả năng mở rộng tốt hơn cho các dự án điện tử.
Arduino Mega 2560 là một vi điều khiển hoạt động dựa trên chip Atmega2560 Bao gồm:
54 chân digital (trong đó có 15 chân có thế được sử dụng như những chân PWM là từ chân số 2 đến 13 và chân 44 45 46)
6 ngắt ngoài: chân 2 (interrupt 0), chân 3 (interrupt 1), chân 18 (interrupt 5), chân 19 (interrupt 4), chân 20 (interrupt 3), và chân 21 (interrupt 2)
16 chân vào analog (từ A0 đến A15)
4 cổng Serial giao tiếp với phần cứng
Bảng 3.1: Bảng thông số kỹ thuật Arduino Mega 2560
Chip xử lý ATMega2560 Điện áp hoạt động 5V Điện áp vào 7V-15V Điện áp vào giới hạn 6V-20V
Cường độ dòng điện trên mỗi 3.3V pin 50mA
Cường độ dòng điện trên mỗi I/O Pin 20mA
Tốc độ xung Clock 16 MHz
Cảm biến gia tốc góc MPU 6050
Hình 3.4: Cảm biến gia tốc góc MPU-6050
Cảm biến MPU-6050 là thiết bị đo lường 6 thông số, bao gồm 3 trục góc quay (Gyro) và 3 trục gia tốc hướng (Accelerometer) Đây là loại cảm biến gia tốc phổ biến nhất trên thị trường hiện nay, với nhiều ví dụ và mã code hỗ trợ cho hầu hết các loại vi điều khiển Sử dụng cảm biến này cho mô hình xe tự cân bằng, MPU-6050 sẽ là lựa chọn tối ưu.
Cảm biến MPU-6050 của hãng IvenSense là giải pháp cảm biến chuyển động đầu tiên trên thế giới với 6 trục cảm biến (có thể mở rộng tới 9 trục), bao gồm 3 trục gyroscope và 3 trục accelerometer, cùng với một Digital Motion Processor (DMP) tích hợp trong chip nhỏ gọn (4×4×0,9mm) Với bus I2C chuyên dụng, MPU-6050 có khả năng tiếp nhận dữ liệu từ một la bàn 3 trục bên ngoài, cung cấp kết quả MotionFusion 9 trục hoàn chỉnh.
MPU-6050 được trang bị ba bộ chuyển đổi ADC 16 bit cho đầu ra con quay hồi chuyển và ba ADC 16 bit cho đầu ra gia tốc kế Thiết bị này hỗ trợ theo dõi độ chính xác của chuyển động nhanh và chậm với các thang đo có thể lập trình cho vận tốc góc trong khoảng ±250, ±500, ±1000, ±2000°/giây (dps) và giá trị gia tốc từ ±2g, ±4g, ±8g đến ±16g.
Giá vận tốc góc trongkhoảng: ±250, ±500,± 1000,± 2000 degree/sec
Giá trị gia tốc trong khoảng: ±2g, ±4g, ± 8g, ± 16g (1g=1m/s 2 )
Các chân kết nối của MPU- 6050
Con quay hồi chuyển (Gyroscope)
Tích hợp ADC 16 bit cho phép lấy dữ liệu đồng thời của các con quay hồi chuyển
Tăng độ chính xác và độ nhạy của cân bằng nhiệt độ giúp giảm sự hiệu chỉnh của người dùng
Cải thiện hiệu suất và giảm thiều khi hoạt động ở tần số thấp
Tích hợp ADC 16 bit cho phép lấy dự liệu đồng thời của các gia tốc kế
Dòng ở chế độ công suất thấp: 10𝜇A ở 1.25Hz, 20𝜇A ở 5Hz, 60𝜇A ở 20𝐻𝑧, 110𝜇A ở 40Hz
Phát hiện hướng và điều hướng
Ngắt do người sử dụng lập trình
Cảm biến GY 521 sử dụng giao thức I2C với địa chỉ I2C mặc định Trong cấu hình này, không sử dụng ngắt ngoài và các chân phụ trợ như XDA, XCL, và AD0 sẽ không được sử dụng.
I2C là giao thức giao tiếp nối tiếp đồng bộ, trong đó dữ liệu được truyền qua dây SDA và tín hiệu đồng hồ SCL Giao thức này hỗ trợ hai chế độ hoạt động là "Master" và "Slave".
MPU6050 ở chế độ Slave mode, giao tiếp với Arduino Tốc độ truyền dữ liệu là 400KHz
Lập trình giao thức I2C trên chip xử lý, ta sử dụng thư viên “Wire.h” trong Arduino
Bảng 3.2: Thông số cảm biến MPU-6050
XDA Chân dữ liệu (Kết nối với cảm biến khác)
Hình 3.5: Sơ đồ mạch module cảm biến MPU-6050
Hiệu chỉnh con quay hồi chuyển và gia tốc kế:
Đặt cảm biến theo chiều ngang trên một bề mặt phẳng Trong đó x và y nằm trong mặt phẳng song song với phương ngang, z theo hướng trọng lực
Theo lý thuyết, trục z nên có giá trị 1g, trong khi các giá trị trên trục x và y bằng 0 Tuy nhiên, trong thực tế, các giá trị trên trục x và y lại khác 0, trong khi giá trị z vẫn giữ ở mức 1g Chúng tôi đã thực hiện việc đọc giá trị gia tốc kế 50 lần và tính trung bình Kết quả cho thấy các giá trị trung bình trên trục x và y vẫn khác 0, trong khi sai số giữa giá trị z và 1g của trục z là 0.
Để hiệu chỉnh con quay hồi chuyển, cần đặt cảm biến ở trạng thái yên tĩnh, đảm bảo rằng số đọc trên cả ba trục đều bằng 0 Tuy nhiên, nếu số đọc thực tế không bằng 0, điều này cho thấy giá trị đọc trên trục của con quay cần được điều chỉnh.
Gia tốc góc: Sau khi hiệu chỉnh, lấy giá trị đó và tính toán giá trị góc sử dụng công thức sau:
Góc lệch = arctan(-accX / accZ)
Vận tốc góc: Sau khi hiệu chỉnh con quay, chia cho mức tăng (độ nhạy LBS) trong đó giá trị 131 LSB (°/𝑠) để thu được vận tốc góc
Giá trị của con quay hồi chuyển có độ chính xác cao nhưng dễ bị trôi theo thời gian, trong khi giá trị gia tốc kế không bị trôi nhưng lại thiếu sự ổn định Để khắc phục vấn đề về góc nghiêng, việc kết hợp cả hai giá trị từ gia tốc kế và con quay hồi chuyển vào bộ lọc Kalman sẽ giúp thu được giá trị góc ổn định hơn.
MPU6050 giao tiếp với Arduino thông qua giao thức I2C Cảm biến được kết nối với Arduino như hình dưới:
Hình 3.6: Sơ đồ kết nối giữa Arduino và MPU-6050
Trên thị trường hiện nay có nhiều loại động cơ phục vụ cho các mục đích khác nhau, nhưng hệ xe hai bánh tự cân bằng yêu cầu độ chính xác và ổn định cao Để đạt được điều này, việc xác định góc quay và vận tốc của động cơ là rất quan trọng, và bộ đếm xung Encoder là một phần tử không thể thiếu Với Encoder, người sử dụng có thể dễ dàng tính toán tốc độ và số vòng quay của động cơ trong một khoảng thời gian, từ đó hỗ trợ cho các nghiên cứu và ứng dụng lớn một cách hiệu quả hơn.
Việc chọn động cơ phù hợp cho mô hình phụ thuộc vào thiết kế của hệ thống Một mô hình quá nặng không nên sử dụng động cơ nhỏ với momen thấp, vì điều này có thể gây hư hại cho động cơ trong quá trình hoạt động lâu dài Ngược lại, mô hình nhỏ không cần thiết phải sử dụng động cơ lớn với công suất momen cao Do đó, việc lựa chọn động cơ phải dựa vào thiết kế cụ thể của mô hình.
Nhóm sẽ chọn động cơ JGA25 kèm Encoder, nổi bật với độ chính xác cao và hoạt động ổn định Mô hình này được ước chừng tổng quát, phù hợp cho các ứng dụng yêu cầu hiệu suất và độ tin cậy.
Hình 3.7: Động cơ Encoder JGA25
Bảng 3.3: Thông số kỹ thuật động cơ Động cơ JGA25 370 CE
Tốc độ quay 250RPM Đường kính động cơ 25mm
Chiều dài 55mm Đường kính trục 4mm
Tỉ số truyền qua hộp giảm tốc 1:34
Hình 3.8: Sơ đồ mạch điện nguyên lý chung cho cầu H
Mạch cầu H là một thiết kế đơn giản cho phép điều khiển động cơ DC quay theo cả hai chiều Có nhiều loại mạch cầu H khác nhau, tùy thuộc vào việc lựa chọn linh kiện có dòng điện và điện áp điều khiển lớn hay nhỏ, cũng như tần số xung PWM Những yếu tố này sẽ ảnh hưởng đến khả năng điều khiển của mạch cầu H.
Xây dựng mô hình toán học cho hệ xe
Khảo sát mô hình xe hai bánh tự cân bằng:
Hình 3.12: Mô tả thông số của hệ xe hai bánh tự cân bằng
Các thành phần trong hệ được chú thích trong bảng dưới:
Bảng 3.5: Ký hiệu và ý nghĩa của các đại lượng
Ký hiệu Ý nghĩa m (kg) Khối lượng 2 bánh xe
M (kg) Khối lượng thân xe
W (m) Chiều rộng của thân xe
D (m) Chiều dài của thân xe
H (m) Chiều cao của thân xe
Khoảng cách L (m) giữa trọng tâm thân xe và trục bánh xe ảnh hưởng đến hiệu suất vận hành Hệ số ma sát ƒw giữa bánh xe và mặt đường cùng với hệ số ma sát ƒm giữa thân xe và động cơ DC cũng đóng vai trò quan trọng trong việc tối ưu hóa khả năng bám đường và hiệu quả hoạt động của xe.
Jm(kg.m 2 ) Momen quán tính động cơ DC
Rm (Ω) Trở kháng động cơ DC
𝑟𝑎𝑑) Sức điện động cảm ứng của động cơ DC
𝑟𝑎𝑑) Momen lực của động cơ DC
N Tỉ số giảm tốc g (m/s 2 ) Gia tốc trọng trường θ (rad) Góc xoay trung bình của bánh xe trái và phải θ ℓ,r (rad) Góc xoay của bánh xe trái và phải
𝜓 (rad) Góc nghiêng khung xe
𝜙 (rad) Góc quay của xe xℓ, yℓ , zℓ (m) Trục tọa độ bánh xe trái xr , yr , zr (m) Trục tọa độ bánh xe phải xm , ym , zm (m) Trục tọa độ trung bình
𝐹 𝜃 , 𝐹 𝜓 , 𝐹 𝜙 (Nm) Momen theo các hướng khác nhau
F ℓ,r (Nm) Momen của bánh trái phải iℓ, ir (A) Dòng điện động cơ trái và phải ʋℓ, ʋr (V) Điện áp động cơ trái và phải
Chúng tôi áp dụng phương pháp Euler – Lagrange để phát triển mô hình động học Giả định tại thời điểm t = 0, xe di chuyển theo chiều dương của trục x, góc tịnh tiến trung bình của hai bánh xe và góc xoay của xe được xác định một cách cụ thể.
Tọa độ trung bình của robot trong hệ quy chiếu:
Tọa độ của bánh xe bên trái trong hệ quy chiếu:
Tọa độ của bánh xe bên phải trong hệ quy chiếu:
Tọa độ tâm giữa 2 trục động cơ:
Gọi T1, T2 lần lượt là động năng của chuyển động tịnh tiến và chuyển động quay đối với hệ, ta có:
Phương trình động năng của chuyển động tịnh tiến [5] :
Phương trình động năng của chuyển động quay [5] :
2𝑛 2 𝑗 𝑚 (𝜃̇ 𝑟 − 𝜓̇) 2 (3.9) Lần lượt là động năng quay của phần ứng động cơ trái và phải
Lấy đạo hàm L (2.11) theo các biến 𝜃, 𝜓, 𝜙 ta được:
(𝑀𝐿𝑅 cos 𝜃 − 2𝑛 2 𝐽 𝑚 )𝜃̈ − (𝑀𝐿 2 + 𝐽 𝜓 + 2𝑛 2 𝐽 𝑚 )𝜓̈ − MgL sin 𝜓 − 𝑀𝐿 2 ̈𝜙 ̇ 2 sin 𝜓 cos 𝜓 = 𝐹 𝜓
Momen động lực do động cơ DC sinh ra:
Sử dụng phương pháp PWM để điều khiển động cơ nên chuyển từ dòng điện sang điện áp động cơ:
𝐿 𝑚 𝑖̇ 𝑙,𝑟 = 𝑣 𝑙,𝑟 + 𝐾 𝑏 (𝜓̇ − 𝜃̇ 𝑙,𝑟 ) − 𝑅 𝑚 𝑖 𝑙,𝑟 (3.22) Xem điện cảm phần ứng tương đối nhỏ (gần bằng 0), có thể bỏ qua ta có:
Từ đó, momen lực sinh ra:
Ta thu được phương trình động lực học mô ta chuyển động của xe như sau:
Phân tích điều khiển hệ xe hai bánh tự cân bằng
Hình 3.13 : Sơ đồ phân tích điều khiển hệ xe
Xây dựng bộ điều khiển cho hệ xe cân bằng
Từ (3.28), (3.29), (3.30), ta có hệ phương trình mô tả hệ thống xe hai bánh cân bằng có dạng sau [3] [4] :
Ta có thể tuyến tính hóa quanh điểm làm việc hệ thống (3.31) về dạng:
Lúc này, ta có ma trận trọng số như sau:
Để tinh chỉnh bộ điều khiển LQR, các thông số Q1, Q2, Q3, Q4, Q5, R2 được sử dụng làm trọng số tối ưu cho các giá trị tín hiệu và tín hiệu điều khiển cho góc tiến tới cũng như góc xoay Để xác định trạng thái nào được ưu tiên trong quá trình điều khiển, người dùng có thể tăng độ lớn của trọng số tương ứng và theo dõi kết quả.
Sau khi xác định được các thông số điều khiển phù hợp, chúng ta sẽ xây dựng thông số hối tiếp K với tín hiệu điều khiển U = -Kx Thông số K được tính toán thông qua phương trình Riccati, và MATLAB cung cấp hàm LQR() để tính K dựa trên các ma trận A, B, Q và R.
Hình 3.14: Sơ đồ điều khiển LQR cho hệ xe 2 bánh tự cân bằng
Thiết kế, mô phỏng bộ điều khiển
Hình 3.15: Mô hình hóa hệ xe hai bánh tự cân bằng
Bộ điều khiển LQR trong khối Subsystem mô phỏng hệ xe hai bánh tự cân bằng, nơi các tham số đầu ra sau khi tính toán sẽ được đưa vào khối gain Tại đây, các tham số này sẽ được nhân với ma trận K đã được tính toán trước, nhằm xác định các tham số điều khiển cho hệ xe hai bánh tự cân bằng.
Tham số K được tính toán thông qua phương trình Riccati, sử dụng hàm LQR(A,B,Q,R) trong Matlab, khi các ma trận đã được xác định.
Khối Scope cho phép kiểm tra khả năng đáp ứng của hệ thống, đồng thời đánh giá sự ổn định của xe hai bánh tự cân bằng.
Hình 3.16: Sơ đồ khối mô phỏng hệ xe hai bánh tự cân bằng
Việc mô phỏng sẽ xử dụng các thông số chính xác từ mô hình thiết kế thực tế vì vậy cần đo đạc, tính toán một cách cụ thể
Mô hình xe hai bánh được thể hiện trong Hình 3.13 sau khi thực hiện tính toán động lực học Trong đó, khối Fcn chứa các phương trình đạo hàm cấp hai cho các góc theta, psi và phi Các khối Interator đóng vai trò là khối tích phân, giúp chuyển đổi đạo hàm của các góc về giá trị chính xác Cuối cùng, các khối in và out lần lượt đại diện cho tham số ngõ vào và ra của hệ thống xe.
Sau khi hoàn tất việc tính toán các thông số, chúng ta sẽ chạy chương trình để các biến được cập nhật giá trị trên cửa sổ làm việc của MATLAB.
Tìm các ma trận A, B tại vị trí cân bằng với matlab:
Hệ phương trình toán học của hệ thống :
Tính ra theo các biến ta được: syms m M R Jw n Jm L n a beta fw g W J_psi Jw vl vr J_phi x1 x2 x3 x4 x5 x6 x7 x8 x9
%Theo phương trình động lực học mô tả chuyển động của xe f1 = ((2*m+M)*R^2+2*Jw+2*n^2*Jm)*x3+(M*R*L*cos(x4)-2*n^2*Jm)*x6- M*L*R*x5^2*sin(x4)-a*(vl+vr)+2*(beta+fw)*x2-2*beta*x5; f2 = (M*L*R*cos(x4)-2*n^2*Jm)*x3+(M*L^2+J_psi+2*n^2*Jm)*x6-
M*g*L*sin(x4)-M*L^2*x8^2*sin(x4)*cos(x4)+a*(vl+vr)-
^2*x5*x8*sin(x4)*cos(x4)-W/2/R*a*(vr-vl)+W^2/2/R^2*(beta+fw)*x8;
%Theo bien x3 =(J_psi*a*vl + J_psi*a*vr - 2*J_psi*beta*x2 + 2*J_psi*beta*x5 - 2*J_psi*fw*x2 + L^2*M*a*vl + L^2*M*a*vr - 2*L^2*M*beta*x2 +
2*Jm*L*M*g*n^2*sin(x4) + L*M*R*a*vl*cos(x4) + L*M*R*a*vr*cos(x4) + 2*Jm*L^2*M*n^2*x8^2*cos(x4)*sin(x4) +
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
2*J_psi*R^2*m + 2*Jm*L^2*M*n^2 + 2*Jm*M*R^2*n^2 + 2*L^2*M*R^2*m + 4*Jm*R^2*m*n^2 - L^2*M^2*R^2*cos(x4)^2 + 4*Jm*L*M*R*n^2*cos(x4)); x6 = -(2*Jw*a*vl + 2*Jw*a*vr - 4*Jw*beta*x2 + 4*Jw*beta*x5 +
2*R^2*a*m*vl + 2*R^2*a*m*vr + 4*Jm*fw*n^2*x2 - 4*R^2*beta*m*x2 + 4*R^2*beta*m*x5 - L*M^2*R^2*g*sin(x4) - 2*Jw*L*M*g*sin(x4) -
L^2*M^2*R^2*x8^2*cos(x4)*sin(x4) - 2*Jw*L^2*M*x8^2*cos(x4)*sin(x4)
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
2*J_psi*R^2*m + 2*Jm*L^2*M*n^2 + 2*Jm*M*R^2*n^2 + 2*L^2*M*R^2*m + 4*Jm*R^2*m*n^2 - L^2*M^2*R^2*cos(x4)^2 + 4*Jm*L*M*R*n^2*cos(x4)); x9 =-(W^2*beta*x8 + W^2*fw*x8 + R*W*a*vl - R*W*a*vr +
%Theo Function block teta_dd =(J_psi*a*vl + J_psi*a*vr - 2*J_psi*beta*teta_d +
2*J_psi*beta*psi_d - 2*J_psi*fw*teta_d + L^2*M*a*vl + L^2*M*a*vr - 2*L^2*M*beta*teta_d + 2*L^2*M*beta*psi_d - 2*L^2*M*fw*teta_d - 4*Jm*fw*n^2*teta_d + L^3*M^2*R*psi_d^2*sin(psi) -
2*L*M*R*beta*teta_d*cos(psi) + 2*L*M*R*beta*psi_d*cos(psi) -
L^3*M^2*R*phi_d^2*cos(psi)^2*sin(psi) -
L^2*M^2*R*g*cos(psi)*sin(psi) + J_psi*L*M*R*psi_d^2*sin(psi) + 2*Jm*L*M*g*n^2*sin(psi) + L*M*R*a*vl*cos(psi) +
L*M*R*a*vr*cos(psi) + 2*Jm*L^2*M*n^2*phi_d^2*cos(psi)*sin(psi) + 2*Jm*L*M*R*n^2*psi_d^2*sin(psi))/(2*J_psi*Jw + L^2*M^2*R^2 +
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
2*J_psi*R^2*m + 2*Jm*L^2*M*n^2 + 2*Jm*M*R^2*n^2 + 2*L^2*M*R^2*m + 4*Jm*R^2*m*n^2 - L^2*M^2*R^2*cos(psi)^2 +
4*Jm*L*M*R*n^2*cos(psi)); psi_dd = -(2*Jw*a*vl + 2*Jw*a*vr - 4*Jw*beta*teta_d +
4*Jw*beta*psi_d + M*R^2*a*vl + M*R^2*a*vr - 2*M*R^2*beta*teta_d + 2*M*R^2*beta*psi_d + 2*R^2*a*m*vl + 2*R^2*a*m*vr +
4*Jm*fw*n^2*teta_d - 4*R^2*beta*m*teta_d + 4*R^2*beta*m*psi_d - L*M^2*R^2*g*sin(psi) - 2*Jw*L*M*g*sin(psi) -
2*L*M*R*beta*teta_d*cos(psi) + 2*L*M*R*beta*psi_d*cos(psi) -
2*L*M*R*fw*teta_d*cos(psi) + L^2*M^2*R^2*psi_d^2*cos(psi)*sin(psi)
- L^2*M^2*R^2*phi_d^2*cos(psi)*sin(psi) -
2*Jw*L^2*M*phi_d^2*cos(psi)*sin(psi) - 2*Jm*L*M*g*n^2*sin(psi) - 2*L*M*R^2*g*m*sin(psi) + L*M*R*a*vl*cos(psi) + L*M*R*a*vr*cos(psi)
- 2*Jm*L^2*M*n^2*phi_d^2*cos(psi)*sin(psi) -
2*L^2*M*R^2*m*phi_d^2*cos(psi)*sin(psi) -
2*Jm*L*M*R*n^2*psi_d^2*sin(psi))/(2*J_psi*Jw + L^2*M^2*R^2 +
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
2*J_psi*R^2*m + 2*Jm*L^2*M*n^2 + 2*Jm*M*R^2*n^2 + 2*L^2*M*R^2*m + 4*Jm*R^2*m*n^2 - L^2*M^2*R^2*cos(psi)^2 + 4*Jm*L*M*R*n^2*cos(psi)) phi_dd =-(W^2*beta*phi_d + W^2*fw*phi_d + R*W*a*vl - R*W*a*vr + 4*L^2*M*R^2*psi_d*phi_d*cos(psi)*sin(psi))/(2*J_phi*R^2 + Jw*W^2 + Jm*W^2*n^2 + R^2*W^2*m + 2*L^2*M*R^2*sin(psi)^2)
Xác định các ma trận A và B
Thay các giá trị sau vào ma trận A và B ta thu được ma trận A và B tại vị trí cân bằng:
The matrix of partial derivatives is constructed as follows: each row represents the derivatives of a function \( y \) with respect to various variables \( x \) Specifically, the first row contains the derivatives of \( y_1 \) with respect to \( x_1, x_2, x_4, x_5, x_7, \) and \( x_8 \); the second row includes the derivatives of \( y_2 \) with the same variables; this pattern continues through to \( y_6 \) Each entry in the matrix signifies how each function changes in relation to the different variables, providing a comprehensive view of the relationships between the functions and variables involved.
B = [ diff(y1,vl) diff(y1,vr); diff(y2,vl) diff(y2,vr); diff(y3,vl) diff(y3,vr); diff(y4,vl) diff(y4,vr); diff(y5,vl) diff(y5,vr); diff(y6,vl) diff(y6,vr)]
% syms m M R Jw n Jm L n a beta fw g W J_psi Jw vl vr J_phi x1 x2 x3 x4 x5 x6 x7 x8 x9
Ma trận A tại điểm cân bằng
0, -(2*J_psi*beta + 2*J_psi*fw + 2*L^2*M*beta + 2*L^2*M*fw +
4*Jm*fw*n^2 + 2*L*M*R*beta)/(2*J_psi*Jw + 2*Jw*L^2*M +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
+ 2*M*R*beta*L + 2*J_psi*beta)/(2*J_psi*Jw + 2*Jw*L^2*M +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
0, (4*Jw*beta + 2*M*R^2*beta - 4*Jm*fw*n^2 + 4*R^2*beta*m
+ 2*L*M*R*beta + 2*L*M*R*fw)/(2*J_psi*Jw + 2*Jw*L^2*M +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
2*L*M*R*beta)/(2*J_psi*Jw + 2*Jw*L^2*M + J_psi*M*R^2 +
2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
Ma trận B tại vị trí cân bằng
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
2*Jw*L^2*M + J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 +
J_psi*M*R^2 + 2*J_psi*Jm*n^2 + 4*Jm*Jw*n^2 + 2*J_psi*R^2*m +
-(R*W*a)/(m*R^2*W^2 + 2*J_phi*R^2 + Jm*W^2*n^2 + Jw*W^2), (R*W*a)/(m*R^2*W^2 + 2*J_phi*R^2 + Jm*W^2*n^2 + Jw*W^2)];
Ta tiến hành thay các ma trận A, B, Q, R đã được tính và chọn vào lệnh lqr(A, B, Q, R) tìm được ma trận K:
%% Tính thông số K của LQR
Đồ thị biểu diễn kết quả mô phỏng của hệ thống:
Hình 3.17: Ngõ ra góc theta theo thời gian lấy mẫu
Hình 3.18: Ngõ ra góc Psi theo thời gian lấy mẫu
Hình 3.19: Ngõ ra góc Phi theo thời gian lấy mẫu
Kết quả mô phỏng cho thấy rằng các ngõ ra có đáp ứng ổn định, với thời gian từ 10 đến 30 giây để các thông số trở về trạng thái cân bằng, tức là các đáp ứng đạt giá trị bằng 0 Đối với tín hiệu điện áp, sau khi hệ thống hoạt động tại điểm cân bằng, điện áp sẽ được ngắt cho đến khi có tác động làm thay đổi tín hiệu góc nghiêng và góc tới khỏi vị trí cân bằng.
Hệ thống đã được xác định là ổn định với các thông số của ma trận hồi tiếp K đã tính toán Tuy nhiên, có thể điều chỉnh từng thành phần của ma trận Q và ma trận R để cải thiện độ ổn định cho các thành phần tùy chọn như teta, phi, psi, teta_dot, psi_dot, phi_dot, cùng với điện áp cung cấp cho từng động cơ.
Để tăng cường sự ổn định và giảm dao động của góc tới θ, cần tăng tương đối Q1 so với các thành phần khác Tương tự, để góc nghiêng ψ ổn định hơn, cần tăng Q3 Điều khiển LQR cho hiệu suất tốt hơn so với các bộ điều khiển khác, đồng thời cho phép điều khiển linh hoạt ngõ vào và ra tùy theo hệ thống Với khả năng điều khiển chính xác, LQR cải thiện đáng kể việc duy trì hệ xe ở vị trí cân bằng.
GIẢI THUẬT VÀ ĐIỀU KHIỂN
Lưu đồ giải thuật
Hình 4.1: Lưu đồ giải thuật hệ xe hai bánh tự cân bằng
Khai báo biến là việc định nghĩa kiểu dữ liệu và đặt tên cho các biến trong lập trình Khi khai báo, cần xác định rõ ràng kiểu dữ liệu, loại biến và dấu của biến để tối ưu hóa quá trình biên dịch mã, tránh khai báo thừa và cải thiện tốc độ xử lý Để đọc tín hiệu từ cảm biến góc nghiêng MPU, giá trị trả về là độ (degree), do đó cần có phương pháp chuyển đổi giá trị này sang đơn vị Radian.
Giá trị kalAngleY được đọc từ cảm biến, trong khi offset là hệ số khi đặt cảm biến Sự sai số trong giá trị này có thể khiến xe không cân bằng, vì vậy cần trừ đi sai số để có được giá trị điều khiển cho góc nghiêng Đối với động cơ JGA25, mỗi vòng quay sẽ trả về 11 xung từ encoder.
Chuyển qua Radian: góc này sử dụng để điều khiển robot đi tới hoặc đi lui
11𝑊 (𝑋𝑢𝑛𝑔 𝑅 − 𝑋𝑢𝑛𝑔 𝐿 ) Với Xung_L và Xung_R lần lượt là số xung encoder của hai đông cơ trái và phải
Góc Phi sử dụng điều khiển robot xoay trái hoặc xoay phải:
Các đại lượng này được sử dụng trong bộ điều khiển LQR để duy trì sự ổn định cho xe Khi xe nghiêng, động cơ sẽ đảo chiều và điều chỉnh nhằm ngăn chặn robot bị đổ Tín hiệu xung PWM từ Arduino có thể nhận giá trị từ 0-255 do thanh ghi chỉ có 8 bit.
4.2 Kết quả mô hình thực tế
Hình 4.3: Mô hình sản phầm hoàn thiện
4.3 Hoạt động của mô hình
Hình 4.4: Giá trị góc nghiêng psi trong quá trình chạy mô hình
Hình 4.5: Giá trị góc tới theta trong quá trình chạy mô hình
Dựa trên đồ thị thể hiện giá trị các góc điều khiển, mô hình đã đạt được giá trị đáp ứng tại vị trí cân bằng, nhưng vẫn chưa tối ưu Thời gian làm việc của hệ thống tại điểm cân bằng cần được cải thiện để đạt hiệu suất tốt nhất.
Qua quá trình nghiên cứu, nhóm đã có cái nhìn tổng quát về lĩnh vực điều khiển hệ thống phi tuyến Đồ án đã giới thiệu một số ứng dụng hữu ích và tiên tiến nhất của công nghệ này trên toàn cầu, nhằm chứng minh rằng đây là một công nghệ tiềm năng, cần được nghiên cứu và ứng dụng nhiều hơn nữa Công nghệ điều khiển hệ thống phi tuyến hứa hẹn sẽ mở ra kỷ nguyên mới cho công nghệ 4.0.
Từ yêu cầu đề tài, nhóm đã thực hiện và nghiên cứu được những vấn đề sau:
Thiết kế khung Robot phù hợp việc cân bằng, khả năng di chuyển của Robot
Thiết lập được mô hình toán và hàm trạng thái cho mô hình
Xây dựng chương trình mô phỏng hoạt động bằng MatLAB-Simulink
Giao tiếp được giữa Arduino và MPU 6050
Đọc giá trị góc tốt nhất, hạn chế nhiễu khi sử dụng bộ lọc Kalman
Robot có thể tự cân bằng
Ngoài những vấn đề đạt được, nhóm cũng có những vấn đề cần cải thiện và các hướng phát triển cho đề tài trong tương lai:
Phát triển thêm hệ thống xử lý ảnh để giám sát theo dõi theo đường đi của Robot
Phát triển thêm hệ thống điều khiển Robot di chuyển thông qua module IOT
Hệ thống điều khiển thích nghi cho phép xe thực nghiệm với người đứng lên có trọng lượng khác nhau, đồng thời điều chỉnh theo sự thay đổi trong quá trình hoạt động của xe.
Nhận dạng thông số hệ thống bằng các phương pháp nhận dạng để có thể áp dụng giải thuật LQR
Ứng dụng các giải thuật điều khiển thông minh dùng mạng neuron,… trong điều khiển hệ thống
Nâng cấp giải thuật điều khiển để áp dụng cho hệ xe một bánh tự cân bằng…
Học viên dự kiến sẽ áp dụng các phương pháp thích nghi trong tương lai, tự dò tìm thông số điều khiển phù hợp thông qua quá trình điều khiển online.
Một hướng phát triển tiềm năng là áp dụng các phương pháp nhận dạng để xác định các thông số mô hình động cơ Qua đó, có thể tính toán giá trị LQR tối ưu nhằm điều khiển xe di chuyển tới, lui và quẹo trái, quẹo phải một cách hiệu quả trong thực tế.
Mặc dù nhóm đã nỗ lực nghiên cứu và thực hiện đồ án, nhưng do thời gian và kiến thức còn hạn chế, chúng tôi chỉ có thể phát triển ứng dụng ở mức độ đơn giản Việc triển khai ứng dụng thực tế đòi hỏi nhiều kiến thức và hiểu biết sâu hơn về công nghệ Chúng tôi nhận thức rằng đồ án vẫn còn thiếu sót và rất mong nhận được ý kiến đóng góp từ thầy.
[1] Nguyễn Thị Phương Hà, Huỳnh Thái Hoàng (2005) Lý thuyết điều khiển nâng cao trang 236 – 242
[2] Huỳnh Thái Hoàng (2014) Bài giảng Lý thuyết điều khiển nâng cao, chương 3 trang
90 - 115 Điều khiển tối ưu toàn phương tuyến tính LQR
[3] Trần Anh Tứ (2014) Luận văn thạc sỹ “Nghiên cứu, thiết kế, thử nghiệm xe hai bánh tự cân bằng”
[4] Nguyễn Văn Đông Hải, Hướng dẫn điều khiển LQR cho hệ xe hai bánh tự cân bằng
“https://www.youtube.com/watch?vqPCHMAXg&t$26s”
[5] Đào Văn Hiệp (2004) Giáo trình Kỹ thuật Robot trang 47-52
[6] Nguyễn Thị Hồng Phương (2011) Bài toán điều khiển được và phương trình Riccati
[7] Nguyễn Trường Thịnh (2014) Giáo trình Kỹ thuật Robot trang 216-221
#include // Cung cấp thư viện I2C
#include "Kalman.h" // Thư viện bộ lọc Kalman
#define ToRad PI/180 // định nghĩa hằng chuyển đổi giá trị độ sang Radian
#define ToDeg 180/PI // định nghĩa hằng chuyển đổi giá trị Radian sang Độ
Kalman kalman ; // Khởi tạo một hằng Kalman dùng để gọi các lệnh trong thư viện Kalman uint32_t timerloop, timerold; // Tạo ra thời gian lặp để lấy mẫu
// Chân điều khiển cho Motor //
#define leftpwm 10 // Điều khiển PWM cho động cơ 1
#define leftdir_t 6 // Điều khiển chiều
#define rightpwm 11 // Điều khiển PWM cho động cơ 2
#define rightdir_t 8 // Điều khiển chiều
#define rightdir_n 9 volatile long leftencoder;
Đọc và lưu trữ giá trị của encoder trái bằng cách sử dụng biến volatile để đảm bảo rằng giá trị của biến này có thể thay đổi một cách không xác định Biến volatile long rightencoder được sử dụng để đọc và lưu giá trị của encoder phải.
#define leftencoder_a 3 // đọc trạng thái kênh A, LOW or HIGH
#define leftencoder_b 4 // đọc trạng thái kênh B, LOW or HIGH
Dữ liệu MPU6050 bao gồm biến `mpudata` để xác định góc hiện tại, cùng với các giá trị gia tốc `AcX` và `AcZ` cho trục X và Z Giá trị vận tốc góc quay được tính theo trục Y thông qua biến `Gyro` Biến `timer` được sử dụng để cập nhật và tính toán thời gian lấy mẫu, đồng thời đọc dữ liệu từ MPU và thời gian cho bộ lọc Kalman để tính góc psi Cuối cùng, mảng `i2cData[14]` lưu trữ các giá trị đọc từ cảm biến MPU.
Dữ liệu LQR bao gồm các thông số như PWML, PWMR và các giá trị xung PWM cho cầu H với các biến k1, k2, k3, k4, k5, k6 Biến boolean falldown được sử dụng để điều khiển động cơ, với giá trị chạy là true và dừng là false Các góc theta, psi, phi và giá trị vận tốc góc tương ứng thetadot, psidot, phidot được định nghĩa để theo dõi trạng thái của hệ thống Giá trị trước đó của các góc được lưu trữ trong thetaold, psiold, phiold Điện áp ra của động cơ trái và phải lần lượt là leftvolt và rightvolt Các biến addtheta và addphi lưu lại giá trị đặt để động cơ di chuyển theo yêu cầu Các biến ForwardBack và LeftRight điều khiển hướng di chuyển của động cơ, với ForwardBack cho biết tiến, lùi hoặc dừng và cân bằng Hàm setup() được sử dụng để khởi tạo các tham số cần thiết cho hệ thống.
{ // Set up các ngỏ vào ra cho hệ xe // pinMode(leftpwm, OUTPUT); pinMode(leftdir_t, OUTPUT); pinMode(leftdir_n, OUTPUT); pinMode(rightpwm, OUTPUT); pinMode(rightdir_t, OUTPUT); pinMode(rightdir_n, OUTPUT);
// mặc định nhận giá trị HIGH pinMode(leftencoder_a, INPUT_PULLUP); pinMode(rightencoder_a, INPUT_PULLUP); pinMode(leftencoder_b, INPUT); pinMode(rightencoder_b, INPUT);
// Khởi tạo chuẩn giao tiếp bandte giữa Arduino và máy tính
Wire.begin(); // Khởi tạo thư viện cho MPU hoạt động
// Write to all four registers at the same time while (i2cWrite(0x19, i2cData, 4, false)); while (i2cWrite(0x6B, 0x01, true)); while (i2cRead(0x75, i2cData, 1)); if (i2cData[0] != 0x68)
Serial.print(F("Error reading sensor")); while(true);
} delay(100); // Chờ cảm biến ổn định while (i2cRead(0x3B, i2cData, 6));
AcZ = (int16_t)((i2cData[4] 6000) // thời gian lấy mẫu 6s { readMPU6050(); // đọc giá trị từ cảm biến // tính góc theta theta = gettheta(leftencoder,rightencoder)*ToRad;
// tính góc nghiêng phi, 0.54 là sai số góc nghiêng tùy thuộc vào mỗi con cảm biến psi = (mpudata + 0.3)*ToRad;
// tính góc xoay phi phi = getphi(leftencoder,rightencoder)*ToRad;
// Cập nhật và so sánh thời gian lấy mẫu// float dt = (float)(micros() - timerloop)*1000000.0; // Gán lại thời gian đầu cho vòng lặp timerloop = micros();
// Cập nhật lại giá trị vận tốc góc vào// thetadot = (theta - thetaold)/dt; psidot = (psi - psiold)/dt; phidot = (phi - phiold)/dt;
// Cập nhật lại giá trị góc vào// thetaold = theta; psiold = psi; phiold = phi;
// Tính toán đưa ra xung PWM cấp vào hai động cơ getlqr(theta + addtheta, thetadot, psi, psidot, phi + addphi, phidot); motorcontrol(PWML, PWMR, (mpudata+0.3), falldown);// điều khiển motor
// Gửi dữ liệu góc nghiêng lên//
//hàm con đọc encoder motor trái // void left_isr()
{ if(digitalRead(leftencoder_a)) leftencoder ; else leftencoder++;
//hàm con đọc encoder motor phải // void right_isr()
{ if(digitalRead(rightencoder_a)) rightencoder ; else
// Đọc giá trị góc Psi // void readMPU6050()
AcX = (int16_t)((i2cData[0] 0 digitalWrite(leftdir_t, HIGH); digitalWrite(leftdir_n, LOW); analogWrite(leftpwm, lpwm);
} else { digitalWrite(leftdir_t, LOW); digitalWrite(leftdir_n, HIGH); analogWrite(leftpwm, lpwm);