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 Ngược lại, xe hai bánh như xe đạp gặp khó khăn trong việc thăng bằng khi di chuyển, vì điều này dựa vào tính chất con quay hồi chuyển của hai bánh xe khi chúng quay Xe hai bánh tự cân bằng có cấu trúc với hai bánh có trục trùng nhau, và để duy trì sự cân bằng, trọng tâm của xe cần được giữ ở giữa hai bánh Tuy nhiên, vị trí chính xác của trọng tâm toàn bộ xe hai bánh thường không xác định được, và có thể không đủ khả năng để di chuyển bánh xe đủ nhanh nhằm giữ trọng tâm luôn ở dưới.
Hình 2.1: Nguyên lý xe hai bánh tự cân bằng
Về kỹ thuật, góc giữa sàn xe hai bánh và chiều trọng lực có thể xác định được Do đó, để duy trì sự cân bằng, tay lái cần phải được giữ thẳng đứng, vuông góc với sàn xe, với góc cân bằng là 0.
Hình 2.2: Trạng thái xe khi cân bằng và di chuyển
Khi tay lái được 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, chúng 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 xe, chỉ cần kéo trọng tâm ngược lại hướng di chuyển, giúp giảm tốc độ Do khả năng cảm nhận và phản ứng thăng bằng khác nhau giữa các cá nhân, xe hai bánh tự cân bằng chỉ được thiết kế 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 tuyến tính bậc hai) 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 đủ để đảm bảo sự ổn định của hệ thống Sơ đồ minh họa cho loại hệ thống điều khiển này được trình bày dưới đây.
Hình 2.4: Tổng quan bộ điều khiển LQR
LQR (Linear Quadratic Regulator) là một hệ thống điều khiển tối ưu, được thiết kế để hoạt động theo tiêu chuẩn chất lượng nhất định, thể hiện qua chỉ số hiệu suất 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à tác động của các yếu tố và điều kiện hoạt động trong quá trình điều khiển.
Các thiết lập của bộ điều khiển, máy hoặc quá trình được xác định thông qua thuật toán toán học nhằm giảm thiểu hàm chi phí, với 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 độ lệch của các yếu tố chính, như nhiệt độ quá trình 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
Ma trận trọng số Q và R đại diện cho các biến trạng thái và tín hiệu đầu vào trong hệ thống điều khiển Việc lựa chọn các giá trị trong 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 trong xử lý dữ liệu hồi quy, với nhiều phương pháp xác định sự tối ưu tùy thuộc vào tiêu chuẩn đánh giá Nó cho phép hợp nhất tất cả thông tin đầu vào, xử lý các giá trị có sẵn và ước lượng giá trị hiện tại, đồng thời mô tả các thống kê liên quan đến hệ thống nhiễu, bao gồm nhiễu ồn, nhiễu đo và sự không chắc chắn trong mô hình động học, cùng với thông tin về điều kiện ban đầu của giá trị quan tâm.
Bộ Lọc Kalman là công cụ quan trọng trong việc ước lượng giá trị x ϵ R của các tiến trình kiểm soát bị gián đoạn, được mô hình hóa bằng 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à 𝑣 𝑘 mô tả cách xử lý và đo độ nhiễu Chúng được tách biệt với nhau, thể hiện dạng nhiễu trắng và sắp xếp theo bản chất thông thường Cụ thể, p(w) tuân theo phân phối chuẩn N(0, Q) và p(v) tuân theo phân phối chuẩn N(0, R).
Trong thực tế, 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ị, nhưng giả thuyết cho rằng chúng là hằng số vẫn được duy trì.
Ma trận A m x n trong phương trình (2.18) liên kết giá trị tại thời điểm k-1 với giá trị hiện tại k, trong khi chịu ảnh hưởng của nhiễu trong quá trình Mặc dù A có thể thay đổi theo thời gian, nhưng trong trường hợp này, ta coi nó 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 𝑧 𝑘, mặc dù H có thể thay đổi theo thời gian, nhưng cũng được xem là hằng số trong bài viết 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 cũng đại diện cho ước lượng trạng thái posteriori tại bước k với giá trị 𝑧 𝑘 Từ đó, 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 tìm ra phương trình ước lượng trạng thái posteriori 𝑥 𝑘 Mục tiêu là đánh giá 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ư 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 𝑧 𝑘.
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 lựa chọn để tối thiểu hóa độ lợi hay hệ số pha trọn tối thiểu của tương quan sai số posteriori (2.26) Quá trình tối thiểu hóa bắt đầu bằng cách 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 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 𝑃 𝑘 ′ cũng tiến tới 0, khiến cho đo thực tế 𝑧 𝑘 trở nên ít đáng tin cậy hơn, trong khi đo lường dự đoán 𝐻𝑥 𝑘 ′ lại cho thấy độ tin cậy cao hơn.
Bản chất xác suất của bộ lọc Điều chỉnh (2.19) xác định rõ ước lượng 𝑥 𝑘 ′ khi tất cả các giá trị 𝑧 𝑘 đều có nghĩa, cho thấy bộ lọc Kalman duy trì khoảng thời gian đầu tiên của sự phân bố trạng thái.
Ước lượng trạng thái Posteriori phản ánh trung bình của sự phân bố trạng thái, trong khi tương quan sai số ước lượng Posteriori cho thấy giá trị của sự phân bố trạng thái Cụ thể, p(𝑥 𝑘 |(𝑧 𝑘 ) được mô tả bởi phân phối chuẩn N(E[(𝑥 𝑘 ], E[(𝑥 𝑘 − 𝑥̂ ) (𝑥 𝑘 𝑘 − 𝑥̂ ) 𝑘 𝑇 ]) = N(𝑥 𝑘 , 𝑃 𝑘 ).
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 một số điểm và thu thập 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ạo ra ướ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 để 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ị 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.
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, nổi bật với khả năng tính toán sai số giữa giá trị thực tế và giá trị mong muốn Nó hoạt động bằng cách điều chỉnh đầu vào để giảm thiểu sai số tối đa 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 trong quá trình điều khiển.
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ộ điều khiển có thể được tùy chỉnh cho các thiết kế đặc biệt thông qua việc điều chỉnh ba hằng số Kp, Ki và Kd Đáp ứng của bộ điều khiển được thể hiện qua độ nhạy sai số, giá trị vọt lố và độ dao động của hệ thống, nhằm mục đích ổ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ệ, ký hiệu là Kp, là hệ số được sử dụng để điều chỉnh giá trị đầu ra theo tỷ lệ với giá trị sai số hiện tại Việc thay đổi này giúp tối ưu hóa quá trình điều khiển bằng cách nhân sai số với hệ số Kp.
Khâu tỉ lệ cho bởi:
Pout : thừa số tỉ lệ đầu ra
Độ lợi tỉ lệ (Kp) là thông số điều khiển quan trọng, thể hiện sự thay đổi lớn ở đầu ra với sai số (e) thay đổi nhỏ Nếu Kp quá cao, hệ thống sẽ trở nên không ổn định; ngược lại, độ lợi quá thấp sẽ dẫn đến phản ứng đầu ra kém nhạy và chậm Do đó, việc điều chỉnh độ lợi tỉ lệ là cần thiết để đảm bảo hiệu suất tối ưu của bộ điều khiển, tránh ảnh hưởng từ nhiễu trong hệ thống.
Phân phối của khâu tích phân tỉ lệ thuận với biên độ sai số và quãng thời gian xảy ra sai số Tổng sai số tức thời theo thời gian (tích phân) cho phé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ả 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 trong hệ thống điều khiển giúp tăng tốc độ chuyển động đến điểm đặt và giảm sai số ổn định, với hiệu quả phụ thuộc vào bộ điều khiển Tuy nhiên, do khâu tích phân phản ánh sai số tích lũy từ 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
Kd : Độ lợi vi phân e : sai số
Khâu vi phân giúp làm chậm tốc độ thay đổi đầu ra của bộ điều khiển, điều này rất quan trọng để đạt được điểm đặt của bộ Để giảm biên độ vọt lố do khâu tích phân gây ra và tăng cường độ ổn định của bộ điều khiển, khâu đạo hàm được sử dụng Tuy nhiên, khâu này cũng có khả năng khuếch đại nhiều, làm cho nó nhạy cảm hơn với nhiễu trong sai số, và có thể dẫn đến sự thiếu ổn định của hệ thống nếu nhiễu và độ lợi vi phân quá lớn.
Phân tích, lựa chọn phương pháp điều khiển
Dựa trên lý thuyết của các phương pháp điều khiển, nhóm đã tiến hành 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ế để quản lý hệ thống với một đầu vào và một đầu ra, tức là mỗi bộ PID sẽ điều khiển một đầu vào riêng biệt Tín hiệu PID cuối cùng được tạo ra thông qua sự kết hợp của các bộ PID thành phần khác nhau.
Để đạt được hiệu 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 được điều chỉnh dựa trên đặc điểm riêng của từng hệ thống.
Đ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 LQR là yêu cầu phải có phương trình toán học chính xác cùng với thông số hệ thống của đối tượng Điều này là cần thiết vì bộ điều khiển LQR chỉ đảm bảo hệ thống hoạt động hiệu quả trong vùng lân cận của vị trí làm việc.
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 để điều khiển hệ xe hai bánh tự cân bằng Quyết định này được đưa ra dựa trên những lợi ích mà phương pháp LQR mang lại cho việc duy trì sự ổn định và hiệu suất của 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 đã lựa chọn một điểm làm việc phù hợp hơn cho hệ thống, điều này giúp LQR điều khiển chính xác và tối ưu hóa hiệu suất hoạt động tại điểm đã chọn.
LQR yêu cầu độ chính xác cao trong thông số hệ thống và mô hình toán học Nhóm đã tiến hành tham khảo và đo đạc các thông số, từ đó 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 ứng dụng rộng rãi, tạo cơ hội cho nhóm kiểm nghiệm thuật toán điều khiển mới Qua đó, nhóm 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 bộ xử lý trung tâm và nhiều IC trên cùng một bảng mạch chỉ với hai đường truyền tín hiệu.
Giao thức này, với tính đơn giản nổi bật, đượ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ị cảm biến, màn hình 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, xảy ra khi một thiết bị kéo đường dây lên cao trong khi các thiết bị khác kéo xuống thấp.
Thiết bị chủ (Master) và tớ (Slave)
Trên 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à xác định các hoạt động trên đường dữ liệu SDA.
Tất cả các thiết bị tuân thủ hướng dẫn từ thiết bị Master đều được gọi là thiết bị Slave Mỗi thiết bị Slave kết nối trên cùng một bus I2C sẽ được gán một địa chỉ vật lý 7-bit cố định để phân biệt.
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ụ thể của thiết bị Slave trên đường SDA trước khi tiến hành truyền dữ liệu Quá trình này đảm bảo giao tiếp hiệu quả giữa thiết bị Master và thiết bị Slave đã được chỉ định.
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ẽ hạ mức điện áp của đường SDA từ cao xuống thấp trước khi đường SCL chuyển từ cao xuống thấp.
Khi thiết bị Master gửi tín hiệu bắt đầu, tất cả các thiết bị Slave sẽ tự động hoạt động, ngay cả khi chúng đang ở chế độ ngủ, và chờ nhận bit địa chỉ.
Giao thức I2C sử dụng 7 bit để truyền tải đị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 các bit địa chỉ này với địa chỉ của chúng để xác định thiết bị nào sẽ nhận hoặc gửi dữ liệu.
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, khi 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 (Acknowledged) và NACK (Not-Acknowledged) là hai trạng thái quan trọng trong giao tiếp giữa thiết bị Master và Slave Khi địa chỉ vật lý của một thiết bị Slave trùng khớp với địa chỉ mà thiết bị Master phát ra, bit ACK/NACK sẽ được thiết lập thành ‘0’ bởi thiết bị Slave Nếu không có sự trùng khớp, bit này sẽ giữ ở mức logic ‘1’, tức là trạng thái mặc định.
Khối dữ liệu bao gồm 8 bit, được thiết lập bởi bên gửi để truyền tải thông tin đến bên nhận Sau khối này, có một bit ACK/NACK để 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 truyền qua đường SDA, thiết bị Master nâng mức điện áp của đường SDA 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 bắt đầu từ 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ẽ khám phá chi tiết 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 toán và gửi giá trị điều khiển để điều chỉnh động cơ đảo chiều quay, giúp duy trì sự cân bằng cho xe.
- 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ều khiển động cơ, Encoder không được tích hợp sẵn, vì vậy Vcc và GND của Encoder cần được kết nối với 5VDC và GND trên Board Arduino Cụ thể, chân tín hiệu của Encoder 1 được kết 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 nối vào 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, với bộ nhớ flash 128KB, SRAM 8KB và EEPROM 4KB, thì Arduino Mega 2560 mang lại hiệu suất cao hơn và khả năng xử lý tốt hơn.
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ị lý tưởng để đo 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 có sẵn cho hầu hết các loại vi điều khiển Sử dụng cảm biến MPU-6050 cho mô hình xe tự cân bằng là một 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 gyroscope 3 trục và accelerometer 3 trục, cùng với một Digital Motion Processor (DMP) tích hợp trong chip nhỏ gọn (4×4×0,9mm) Nó sử dụng bus I2C riêng để nhận đầu vào 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 sở hữu ba bộ chuyển đổi ADC 16 bit cho việc số hóa đầu ra của con quay hồi chuyển và ba ADC 16 bit cho đầu ra của gia tốc kế Thiết bị này được trang bị thang đo chính quy có thể lập trình, cho phép theo dõi độ chính xác của chuyển động nhanh và chậm với giá trị 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
Sử dụng địa chỉ I2C mặc định mà không cần ngắt ngoài, các chân XDA, XCL và AD0 sẽ không được sử dụng trong cảm biến GY 521 Cảm biến này hoạt động dựa trên giao thức I2C.
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 hoạt động với hai chế độ chính 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, giá trị trục z nên là 1g, trong khi các giá trị trên trục x và y bằng 0 Tuy nhiên, thực tế cho thấy các giá trị trên trục x và y lại khác 0, trong khi giá trị z vẫn giữ ở 1g Chúng tôi đã thực hiện 50 lần đo giá trị gia tốc kế 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 các trị z và 1g trên trục z là 0.
Để hiệu chỉnh con quay hồi chuyển, cần đặt cảm biến ở vị trí yên tĩnh, sao cho 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 của con quay trên một trong các trục vẫn có sự sai lệch.
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ị từ 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 không ổ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 giúp thu được giá trị góc ổn định.
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 động cơ phải có độ 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 dùng có thể dễ dàng quy đổi tốc độ và số vòng quay của động cơ trong một khoảng thời gian, từ đó hỗ trợ tốt hơn cho các tính toán trong các dự án lớn.
Việc lựa 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 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 chọn động cơ có công suất và momen quá cao Do đó, cần cân nhắc kỹ lưỡng để chọn loại động cơ thích hợp dựa trên thiết kế mô hình.
Nhóm sẽ lựa chọn động cơ JGA25 có gắn kèm Encoder, vì đây là loại động cơ đảm bảo độ chính xác cao và hoạt động ổn định.
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 mạch đơn giản được sử dụng để điều khiển động cơ DC quay thuận hoặc quay nghịch Có nhiều kiểu mạch cầu H khác nhau, tùy thuộc vào lựa chọn linh kiện với 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 là những yếu tố quan trọng cần xem xét để tối ưu hóa khả năng bám đường và hiệu quả của phương tiện.
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 rằng tại thời điểm t = 0, xe di chuyển theo hướng dương của trục x, chúng tôi xác định góc tịnh tiến trung bình của hai bánh xe cùng với góc xoay của xe.
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, R2 được sử dụng, trong đó Q1, Q2, Q3, Q4, Q5, Q6 là các trọng số tối ưu tương ứng với 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 điều khiển, ta 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 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 dựa trên phương trình Riccati Tuy nhiên, MATLAB đã hỗ trợ hàm LQR() để tính toán thông số K khi đã biết 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 tính toán sẽ được chuyển 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 để xác định 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 dựa trên phương trình Riccati, sử dụng hàm LQR(A,B,Q,R) trong Matlab để xác định các ma trận cần thiết.
Khối Scope cho phép kiểm tra sự đáp ứng của hệ thống, đồng thời đánh giá tính ổn định của hệ 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ể
Hình 3.13 minh họa mô hình xe hai bánh sau khi thực hiện tính toán động lực học Trong mô hình này, khối Fcn chứa các phương trình đạo hàm cấp hai liên quan đến các góc theta, psi và phi Các khối Integrator đó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 nhận 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 presented consists of the derivatives of various functions \(y1\) through \(y6\) with respect to the variables \(x1\), \(x2\), \(x4\), \(x5\), \(x7\), and \(x8\) Each row corresponds to a different function, while each column represents the derivative with respect to a specific variable, highlighting the relationships between these functions and their respective variables This structured representation is essential for analyzing the behavior of these functions under varying conditions.
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
Hình 3.20: Tín hiệu điện áp cấp cho bánh trái và bánh phải(volt)
Kết quả mô phỏng cho thấy các ngõ ra có đáp ứng ổn định, với các thông số trở về trạng thái cân bằng sau 10 – 30 giây, tức là các đáp ứng đạt giá trị bằng 0 Đối với tín hiệu điện áp, khi hệ thống hoạt động tại điểm cân bằng, điện áp sẽ bị 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ố ma trận hồi tiếp K đã tính toán Tuy nhiên, chúng ta có khả năng đ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 Q1 so với các thành phần khác Tương tự, để góc nghiêng ổn định hơn, nên tăng Q3 Điều khiển LQR cho kết quả tốt hơn so với các bộ điều khiển khác và cho phép điều khiển linh hoạt ngõ vào và ra tùy theo hệ thống Với LQR, khả năng điều khiển chính xác giúp 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à quá trình định nghĩa kiểu dữ liệu và đặt tên cho các biến trong lập trình Việc xác định rõ ràng kiểu dữ liệu, loại biến và dấu của biến là rất quan trọng, giúp tối ưu hóa quá trình biên dịch mã và giảm thiểu tình trạng khai báo thừa, từ đó cải thiện tốc độ xử lý Khi đọc tín hiệu từ cảm biến góc nghiêng MPU, giá trị trả về là độ (degree), vì vậy cần có phương pháp chuyển đổi giá trị này sang đơn vị Radian.
KalAngleY là giá trị góc được đọc từ cảm biến, trong khi offset là hệ số liên quan đến vị trí lắp đặt cảm biến Giá trị này có thể bị sai số, ảnh hưởng đến khả năng cân bằng của xe Để điều chỉnh, ta cần lấy góc đọc được trừ đi sai số để có giá trị điều khiển cho góc nghiêng Đặc biệt, encoder động cơ JGA25 trả về 11 xung cho mỗi vòng quay.
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 để đảm bảo sự ổn định của xe Khi xe nghiêng, động cơ sẽ đảo chiều và điều chỉnh để ngăn robot bị đổ Tín hiệu xung PWM từ Arduino sẽ 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ị 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 hoạt động của hệ thống tại điểm cân bằng cần cải thiện để đạt hiệu quả tốt nhất.
Trong quá trình nghiên cứu đề tài, nhóm đã có cái nhìn tổng quát về điều khiển hệ thống phi tuyến Đặc biệt, đồ á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 thế giới, 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 rộng rãi hơn Công nghệ này 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 linh hoạt 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 và 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, nhằm nâng cao hiệu quả và tính linh hoạt trong quá trình học tập.
Một hướng phát triển quan trọng là áp dụng các phương pháp nhận dạng để xác định thông số mô hình động cơ Điều này cho phép tính toán giá trị LQR tối ưu, từ đó hỗ trợ việc điều khiển xe di chuyển tới, lui, và quay trái, 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 hạn chế về thời gian và kiến thức, đồ án chỉ đạt được mức ứng dụng đơn giản và chưa thể triển khai thực tế Việc triển khai đòi hỏi nhiều kiến thức và hiểu biết trong các lĩnh vực công nghệ khác Chúng em nhận thức rằng đồ án vẫn còn nhiều thiếu sót, vì vậy 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 bên trái bằng cách sử dụng kiểu khai báo volatile, cho phép biến thay đổi một cách không xác định Tương tự, thực hiện việc đọc và lưu giá trị của encoder bên 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 từ cảm biến MPU6050 bao gồm biến xác định góc hiện tại (mpudata), giá trị gia tốc theo trục X và Z (AcX, AcZ), và giá trị vận tốc góc quay theo trục Y (Gyro) Thời gian lấy mẫu và cập nhật dữ liệu được quản lý bởi biến timer, đồng thời sử dụng cho bộ lọc Kalman để tính toán góc psi Các giá trị đọc từ cảm biến được lưu trữ trong mảng i2cData[14].
Dữ liệu LQR bao gồm các thông số như PWML, PWMR và giá trị xung PWM cho cầu H, cùng với các thông số ma trận K Biến boolean falldown được sử dụng để điều khiển động cơ, với giá trị true cho chạy và false cho dừng Các góc theta, psi, phi và giá trị vận tốc góc tương ứng thetadot, psidot, phidot được lưu trữ để theo dõi chuyển động Giá trị trước đó của các góc được lưu trong thetaold, psiold, phiold Điện áp ra của Motor trái và phải trong LQR được xác định bởi leftvolt và rightvolt Các biến addtheta và addphi lưu lại giá trị đặt để động cơ di chuyển theo hướng mong muốn Biến ForwardBack quy định hướng di chuyển với 1 cho tiến, -1 cho lùi và 0 cho dừng và cân bằng, trong khi biến LeftRight xác định hướng di chuyển bên trái hoặc bên phải Hàm setup() được sử dụng để khởi tạo các tham số cần thiết.
{ // 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 rightencoder++;
// Đọc giá trị góc Psi // void readMPU6050()
AcX = (int16_t)((i2cData[0]