- Lựa chọn các bộ phận cho Robot tự cân bằng
- In 3D và lắp ráp Robot tự cân bằng của chúng tôi
- Sơ đồ mạch
- Mã Robot tự cân bằng
- Hoạt động của Robot tự cân bằng Arduino
Sau khi được truyền cảm hứng từ động cơ RYNO và các xe tay ga tự cân bằng khác từ Segway, tôi luôn muốn chế tạo một thứ gì đó Robot Arduino Segway của riêng mình. Suy nghĩ một lúc, tôi quyết định chế tạo Robot tự cân bằng bằng Arduino. Bằng cách này, tôi sẽ có thể nắm bắt được khái niệm cơ bản đằng sau tất cả những chiếc xe tay ga này và cũng có thể tìm hiểu cách hoạt động của thuật toán PID.
Khi tôi bắt đầu xây dựng, tôi nhận ra rằng bot này có một chút thách thức để xây dựng. Có rất nhiều tùy chọn để lựa chọn và do đó, sự nhầm lẫn bắt đầu ngay từ hình thức lựa chọn động cơ và vẫn cho đến khi điều chỉnh các giá trị PID. Và có rất nhiều điều cần xem xét như loại pin, vị trí của pin, độ bám của bánh xe, loại động cơ điều khiển, duy trì CoG (Trọng tâm) và nhiều hơn nữa.
Nhưng hãy để tôi phá vỡ nó cho bạn, một khi bạn xây dựng nó, bạn sẽ đồng ý rằng nó không khó như nó nghe. Vì vậy, hãy đối mặt với nó, trong hướng dẫn này, tôi sẽ ghi lại kinh nghiệm của mình trong việc chế tạo robot tự cân bằng. Bạn có thể là một người mới bắt đầu hoàn toàn mới bắt đầu hoặc có thể đã đến đây sau một thời gian dài thất vọng vì không thể làm cho bot của bạn hoạt động. Nơi này nhằm mục đích là điểm đến cuối cùng của bạn. Vậy hãy bắt đầu……
Lựa chọn các bộ phận cho Robot tự cân bằng
Trước khi tôi cho bạn biết tất cả các tùy chọn để xây dựng bot, hãy để tôi liệt kê các hạng mục mà tôi đã sử dụng trong dự án robot tự cân bằng này
- Arduino UNO
- Động cơ DC giảm tốc (Màu vàng) - 2Nos
- Mô-đun điều khiển động cơ L298N
- MPU6050
- Một cặp bánh xe
- Pin Li-ion 7.4V
- Kết nối dây
- Cơ thể in 3D
Bạn có thể kết hợp và lựa chọn bất kỳ thành phần nào ở trên tùy theo tình trạng sẵn có để tạo bộ robot tự cân bằng của riêng mình, chỉ cần đảm bảo rằng các thành phần phù hợp với các tiêu chí sau.
Bộ điều khiển: Bộ điều khiển mà tôi đã sử dụng ở đây là Arduino UNO, tại sao vì nó đơn giản là dễ sử dụng. Bạn cũng có thể sử dụng Arduino Nano hoặc Arduino mini nhưng tôi khuyên bạn nên gắn bó với UNO vì chúng tôi có thể lập trình trực tiếp mà không cần bất kỳ phần cứng bên ngoài nào.
Động cơ: Lựa chọn động cơ tốt nhất mà bạn có thể sử dụng cho robot tự cân bằng, chắc chắn sẽ là động cơ Bước. Nhưng để giữ mọi thứ đơn giản, tôi đã sử dụng động cơ bánh răng DC. Có, nó không bắt buộc phải có một bước; bot cũng hoạt động tốt với các động cơ bánh răng DC màu vàng thông dụng giá rẻ này.
Trình điều khiển động cơ: Nếu bạn đã chọn động cơ bánh răng DC như của tôi thì bạn có thể sử dụng mô-đun trình điều khiển L298N giống như tôi, hoặc thậm chí L293D sẽ hoạt động tốt. Tìm hiểu thêm về cách điều khiển động cơ DC bằng L293D và Arduino.
Bánh xe: Đừng ước tính những kẻ này; Tôi đã có một thời gian khó khăn để tìm ra rằng vấn đề là với bánh xe của tôi. Vì vậy, hãy đảm bảo rằng bánh xe của bạn có độ bám tốt trên mặt sàn bạn đang sử dụng. Hãy quan sát kỹ càng, tay cầm của bạn không được để bánh xe trượt trên sàn.
Gia tốc kế và Con quay hồi chuyển: Sự lựa chọn tốt nhất của Gia tốc kế và Con quay hồi chuyển cho bot của bạn sẽ là MPU6050. Vì vậy, đừng cố chế tạo một cái với Gia tốc kế bình thường như ADXL345 hoặc thứ gì đó tương tự, nó sẽ không hoạt động. Bạn sẽ biết tại sao ở cuối bài viết này. Bạn cũng có thể xem bài viết chuyên dụng của chúng tôi về cách sử dụng MPU6050 với Arduino.
Pin: Chúng tôi cần pin càng nhẹ càng tốt và điện áp hoạt động phải lớn hơn 5V để chúng tôi có thể cấp nguồn trực tiếp cho Arduino của mình mà không cần mô-đun tăng cường. Vì vậy, sự lựa chọn lý tưởng sẽ là pin Li-polymer 7.4V. Ở đây, vì tôi đã có sẵn pin Li-ion 7.4V nên tôi đã sử dụng nó. Nhưng hãy nhớ rằng Li-po có lợi hơn Li-ion.
Khung gầm: Một nơi khác mà bạn không nên thỏa hiệp là với khung máy của bạn. Bạn có thể sử dụng bìa cứng, gỗ, nhựa bất cứ thứ gì bạn thích. Tuy nhiên, chỉ cần đảm bảo khung xe chắc chắn và không nên lắc lư khi con bot đang cố gắng giữ thăng bằng. Tôi đã thiết kế khung gầm của riêng mình trên Solidworks dựa trên các chương trình khác và in 3D nó. Nếu bạn có máy in thì bạn cũng có thể in thiết kế, các tệp thiết kế sẽ được đính kèm trong tiêu đề sắp tới.
In 3D và lắp ráp Robot tự cân bằng của chúng tôi
Nếu bạn đã quyết định in 3D cùng một khung mà tôi đang sử dụng để xây dựng bot của mình, thì các tệp STL có thể được tải xuống từ thingiverse. Tôi cũng đã thêm các tệp thiết kế cùng với nó để bạn cũng có thể sửa đổi nó theo sở thích nhân sự của mình.
Các bộ phận không có cấu trúc nhô ra ngoài nên bạn có thể dễ dàng in chúng mà không cần bất kỳ hỗ trợ nào và việc đổ mực 25% sẽ hoạt động tốt. Các thiết kế khá đơn giản và bất kỳ máy in cơ bản nào cũng có thể xử lý nó một cách dễ dàng. Tôi đã sử dụng phần mềm Cura để cắt mô hình và in bằng Tevo Tarantula của mình, cài đặt được hiển thị bên dưới.
Bạn sẽ phải in phần thân máy cũng như bốn bộ phận gắn động cơ. Việc lắp ráp diễn ra khá thẳng thắn; sử dụng đai ốc và bu lông 3mm để cố định động cơ và bo mạch tại chỗ. Sau khi lắp ráp nó sẽ trông giống như thế này được hiển thị trong hình dưới đây.
Thiết kế thực tế đã được lên kế hoạch với mô-đun ổ đĩa L298N trong giá dưới cùng của Arduino và pin trên đầu nó như hình trên. Nếu bạn đang làm theo cùng một thứ tự, bạn có thể trực tiếp vặn vào máng bo mạch vào các lỗ được cung cấp và sử dụng thẻ dây cho pin Li-po. Sự sắp xếp này cũng sẽ hoạt động, ngoại trừ các bánh xe siêu trơn mà tôi đã phải thay đổi sau đó.
Trong bot của mình, tôi đã hoán đổi vị trí của pin và bo mạch Arduino UNO để dễ lập trình và cũng phải giới thiệu một bo mạch hoàn thiện để hoàn thành các kết nối. Vì vậy, bot của tôi trông không như tôi dự tính trong giai đoạn đầu. Sau khi hoàn thành kiểm tra lập trình hệ thống dây điện và mọi thứ, cuối cùng thì rô bốt hai bánh của tôi trông như thế này
Sơ đồ mạch
Việc tạo kết nối cho Robot tự cân bằng dựa trên Arduino này khá đơn giản. Đây là robot tự cân bằng sử dụng Arduino và MPU6050, vì vậy chúng tôi muốn giao diện MPU6050 với Arduino và kết nối các động cơ thông qua mô-đun điều khiển động cơ. Toàn bộ thiết lập được cung cấp bởi pin li-ion 7.4V. Sơ đồ mạch cho tương tự được hiển thị bên dưới.
Arduino và mô-đun điều khiển động cơ L298N được cấp nguồn trực tiếp qua chân Vin và đầu cuối 12V tương ứng. Bộ điều chỉnh tích hợp trên bo mạch Arduino sẽ chuyển đổi đầu vào 7.4V thành 5V và IC ATmega và MPU6050 sẽ được cấp nguồn bởi nó. Động cơ DC có thể chạy từ điện áp 5V đến 12V. Nhưng chúng tôi sẽ kết nối dây dương 7.4V từ pin đến đầu vào đầu vào 12V của mô-đun trình điều khiển động cơ. Điều này sẽ làm cho động cơ hoạt động với 7.4V. Bảng sau sẽ liệt kê cách mô-đun trình điều khiển động cơ MPU6050 và L298N được kết nối với Arduino.
Pin thành phần |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Đất |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
TRONG 1 |
D6 |
TRONG 2 |
D9 |
TRONG 3 |
D10 |
IN4 |
D11 |
MPU6050 giao tiếp với Arduino thông qua giao diện I2C, vì vậy chúng tôi sử dụng các chân SPI A4 và A5 của Arduino. Động cơ DC được kết nối với các chân PWM D6, D9 D10 và D11 tương ứng. Chúng ta cần kết nối chúng với các chân PWM vì chúng ta sẽ điều khiển tốc độ của động cơ DC bằng cách thay đổi chu kỳ hoạt động của các tín hiệu PWM. Nếu bạn không quen thuộc với hai thành phần này thì bạn nên đọc qua MPU6050 Interfacing và hướng dẫn điều khiển động cơ L298N.
Mã Robot tự cân bằng
Bây giờ chúng ta phải lập trình bảng Arduino UNO của mình để cân bằng robot. Đây là nơi tất cả những điều kỳ diệu xảy ra; khái niệm đằng sau nó là đơn giản. Chúng tôi phải kiểm tra xem bot đang nghiêng về phía trước hay về phía sau bằng cách sử dụng MPU6050 và sau đó nếu nó nghiêng về phía trước, chúng tôi phải xoay bánh xe theo hướng về phía trước và nếu nó nghiêng về phía sau, chúng tôi phải xoay bánh xe theo hướng ngược lại.
Đồng thời chúng ta cũng phải kiểm soát tốc độ quay của bánh xe, nếu con bot hơi mất phương hướng từ vị trí trung tâm thì bánh xe sẽ quay chậm và tốc độ tăng dần khi nó càng ra xa vị trí trung tâm. Để đạt được logic này, chúng tôi sử dụng thuật toán PID, có vị trí trung tâm là điểm đặt và mức độ mất phương hướng là đầu ra.
Để biết vị trí hiện tại của bot, chúng tôi sử dụng MPU6050, là một cảm biến gia tốc và con quay hồi chuyển 6 trục kết hợp. Để có được giá trị đáng tin cậy của vị trí từ cảm biến, chúng ta cần sử dụng giá trị của cả gia tốc kế và con quay hồi chuyển, vì các giá trị từ gia tốc kế có vấn đề về nhiễu và các giá trị từ con quay hồi chuyển có xu hướng thay đổi theo thời gian. Vì vậy, chúng tôi phải kết hợp cả hai và lấy giá trị của bước nhảy và độ lăn của rô-bốt của chúng tôi, trong đó chúng tôi sẽ chỉ sử dụng giá trị của yaw.
Nghe có vẻ hơi quay cuồng đúng không? Nhưng đừng lo, nhờ cộng đồng Arduino, chúng tôi có các thư viện sẵn có có thể thực hiện tính toán PID và cũng nhận được giá trị của yaw từ MPU6050. Thư viện được phát triển bởi br3ttb và jrowberg tương ứng. Trước khi tiếp tục tải xuống các thư viện của họ, hãy tạo theo liên kết sau và thêm chúng vào thư mục lib Arduino của bạn.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Bây giờ, chúng ta đã thêm các thư viện vào IDE Arduino của mình. Hãy bắt đầu lập trình cho Robot tự cân bằng của chúng ta. Giống như mọi khi, mã hoàn chỉnh cho rô bốt thăng bằng MPU6050 được đưa ra ở cuối trang này, ở đây tôi chỉ giải thích các đoạn mã quan trọng nhất trong mã. A đã nói trước đó mã được xây dựng trên mã ví dụ MPU6050, chúng tôi sẽ tối ưu hóa mã cho mục đích của chúng tôi và thêm PID và kỹ thuật điều khiển cho rô bốt tự cân bằng của chúng tôi.
Đầu tiên, chúng tôi bao gồm các thư viện cần thiết để chương trình này hoạt động. Chúng bao gồm thư viện I2C được tích hợp sẵn, Thư viện PID và Thư viện MPU6050 mà chúng tôi vừa tải xuống.
#include "I2Cdev.h" #include
Sau đó, chúng tôi khai báo các biến được yêu cầu để lấy dữ liệu từ cảm biến MPU6050. Chúng tôi đọc cả giá trị vectơ trọng lực và giá trị quaternion, sau đó tính toán độ cao và giá trị cuộn của bot. Các YPR mảng phao sẽ giữ kết quả cuối cùng.
// MPU control / status vars bool dmpReady = false; // đặt true nếu DMP init thành công uint8_t mpuIntStatus; // giữ byte trạng thái ngắt thực tế từ MPU uint8_t devStatus; // trả về trạng thái sau mỗi hoạt động của thiết bị (0 = thành công,! 0 = lỗi) uint16_t packetSize; // kích thước gói DMP dự kiến (mặc định là 42 byte) uint16_t FifoCount; // đếm tất cả các byte hiện có trong FIFO uint8_t FifoBuffer; // Bộ đệm lưu trữ FIFO // định hướng / chuyển động vars Quaternion q; // vùng chứa quaternion Trọng lực VectorFloat; // vector trọng lực float ypr; // hộp chứa yaw / pitch / roll và vector trọng lực
Tiếp theo là phân đoạn rất quan trọng của mã, và đây là nơi bạn sẽ dành nhiều thời gian để điều chỉnh cho đúng bộ giá trị. Nếu robot của bạn được chế tạo với trọng tâm rất tốt và các thành phần được sắp xếp đối xứng (trong hầu hết các trường hợp là không) thì giá trị của điểm đặt của bạn sẽ là 180. Nếu không, hãy kết nối bot của bạn với màn hình nối tiếp Arduino và nghiêng nó cho đến khi bạn tìm thấy vị trí cân bằng tốt, đọc giá trị hiển thị trên màn hình nối tiếp và đây là giá trị điểm đặt của bạn. Giá trị của Kp, Kd và Ki phải được điều chỉnh theo bot của bạn. Không có hai bot giống nhau nào có cùng giá trị Kp, Kd và Ki nên không có sự thoát ra khỏi nó. Xem video ở cuối trang này để biết cách điều chỉnh các giá trị này.
/ ********* Điều chỉnh 4 giá trị này cho điểm đặt BOT của bạn ********* / double = 176; // đặt giá trị khi bot vuông góc với mặt đất bằng cách sử dụng màn hình nối tiếp. // Đọc tài liệu dự án trên circuitdigest.com để tìm hiểu cách đặt các giá trị này double Kp = 21; // Đặt double đầu tiên này Kd = 0.8; // Set này secound đôi Ki = 140; // Cuối cùng đặt cái này / ****** Cài đặt giá trị kết thúc ********* /
Trong dòng tiếp theo, chúng ta khởi tạo thuật toán PID bằng cách chuyển các biến đầu vào là input, output, set point, Kp, Ki và Kd. Trong số này, chúng tôi đã đặt các giá trị của điểm đặt Kp, Ki và Kd trong đoạn mã trên. Giá trị của đầu vào sẽ là giá trị hiện tại của yaw được đọc từ cảm biến MPU6050 và giá trị của đầu ra sẽ là giá trị được tính bằng thuật toán PID. Vì vậy, về cơ bản thuật toán PID sẽ cung cấp cho chúng ta một giá trị đầu ra sẽ được sử dụng để sửa giá trị Đầu vào gần với điểm đặt.
PID pid (& đầu vào, & đầu ra, & điểm đặt, Kp, Ki, Kd, DIRECT);
Bên trong chức năng thiết lập void, chúng tôi khởi tạo MPU6050 bằng cách định cấu hình DMP (Bộ xử lý chuyển động kỹ thuật số). Điều này sẽ giúp chúng tôi kết hợp dữ liệu Gia tốc kế với dữ liệu Con quay hồi chuyển và cung cấp giá trị đáng tin cậy của Yaw, Pitch và Roll. Chúng tôi sẽ không đi sâu vào vấn đề này vì nó sẽ vượt xa chủ đề. Dù sao đi nữa, một đoạn mã mà bạn phải tra cứu trong hàm thiết lập là các giá trị bù con quay hồi chuyển. Mỗi cảm biến MPU6050 có các giá trị hiệu số riêng, bạn có thể sử dụng bản phác thảo Arduino này để tính toán giá trị độ lệch của cảm biến và cập nhật các dòng sau cho phù hợp trong chương trình của bạn.
// cung cấp hiệu số con quay hồi chuyển của riêng bạn ở đây, được chia tỷ lệ cho độ nhạy tối thiểu mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Chúng tôi cũng phải khởi tạo các chân PWM kỹ thuật số mà chúng tôi đang sử dụng để kết nối động cơ của chúng tôi. Trong trường hợp của chúng tôi, đó là D6, D9, D10 và D11. Vì vậy, chúng tôi khởi tạo các chân này như các chân đầu ra làm cho chúng THẤP theo mặc định.
// Khởi tạo các chân outpu của Motor pinMode (6, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); // Theo mặc định, tắt cả hai động cơ analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Bên trong chức năng vòng lặp chính, chúng tôi kiểm tra xem dữ liệu từ MPU6050 đã sẵn sàng để đọc chưa . Nếu có thì chúng tôi sử dụng nó để tính toán giá trị PID và sau đó hiển thị giá trị đầu vào và đầu ra của PID trên màn hình nối tiếp chỉ để kiểm tra xem PID đang phản hồi như thế nào. Sau đó, dựa trên giá trị đầu ra, chúng tôi quyết định xem bot phải tiến lên hay lùi lại hoặc đứng yên.
Vì chúng tôi giả định rằng MPU6050 sẽ trả về 180 khi bot thẳng đứng. Chúng tôi sẽ nhận được các giá trị hiệu chỉnh dương khi bot giảm về phía trước và chúng tôi sẽ nhận được các giá trị âm nếu bot giảm về phía sau. Vì vậy, chúng tôi kiểm tra điều kiện này và gọi các chức năng thích hợp để di chuyển bot về phía trước hoặc phía sau ward.
while (! mpuInterrupt && FifoCount <packetSize) { // không có dữ liệu mpu - thực hiện các phép tính PID và xuất ra động cơ pid.Compute (); // In giá trị của Input và Output trên màn hình nối tiếp để kiểm tra xem nó hoạt động như thế nào. Serial.print (đầu vào); Serial.print ("=>"); Serial.println (đầu ra); if (input> 150 && input <200) {// Nếu Bot giảm if (output> 0) // Giảm về phía trước Forward (); // Xoay bánh xe về phía trước else if (output <0) // Quay về phía sau Reverse (); // Xoay các bánh xe về phía sau } else // Nếu Bot không rơi Stop (); // Giữ yên bánh xe }
Các biến đầu ra PID cũng quyết định nhanh như thế nào động cơ phải được luân chuyển. Nếu bot sắp rơi thì chúng tôi thực hiện chỉnh sửa nhỏ bằng cách xoay bánh xe từ từ. Nếu những điều chỉnh nhỏ này không hoạt động và vẫn còn nếu bot rơi xuống, chúng tôi sẽ tăng tốc độ của động cơ. Giá trị của tốc độ quay của các bánh xe sẽ do thuật toán PI quyết định. Lưu ý rằng đối với hàm Reverse, chúng ta đã nhân giá trị của đầu ra với -1 để chúng ta có thể chuyển đổi giá trị âm thành dương.
void Forward () // Mã xoay bánh xe về phía trước { analogWrite (6, output); analogWrite (9,0); analogWrite (10, đầu ra); analogWrite (11,0); Serial.print ("F"); // Thông tin gỡ lỗi } void Reverse () // Mã xoay bánh xe Backward { analogWrite (6,0); analogWrite (9, đầu ra * -1); analogWrite (10,0); analogWrite (11, đầu ra * -1); Serial.print ("R"); } void Stop () // Mã dừng cả hai bánh xe { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print ("S"); }
Hoạt động của Robot tự cân bằng Arduino
Khi bạn đã sẵn sàng với phần cứng, bạn có thể tải mã lên bảng Arduino của mình. Đảm bảo các kết nối phù hợp vì chúng tôi đang sử dụng pin Li-ion cần hết sức thận trọng. Vì vậy, hãy kiểm tra kỹ các mạch ngắn và đảm bảo rằng các thiết bị đầu cuối sẽ không tiếp xúc ngay cả khi bot của bạn gặp một số tác động nhỏ. Bật nguồn mô-đun của bạn và mở màn hình nối tiếp của bạn, nếu Arduino của bạn có thể giao tiếp thành công với MPU6050 và nếu mọi thứ hoạt động như mong đợi, bạn sẽ thấy màn hình sau.
Ở đây chúng ta thấy các giá trị đầu vào và đầu ra của thuật toán PID ở đầu vào định dạng => đầu ra . Nếu bot hoàn toàn cân bằng, giá trị của đầu ra sẽ là 0. Giá trị đầu vào là giá trị hiện tại từ cảm biến MPU6050. Bảng chữ cái “F” thể hiện rằng bot đang tiến về phía trước và “R” thể hiện rằng bot đang đi ngược lại.
Trong giai đoạn đầu của PID, tôi khuyên bạn nên để cáp Arduino của bạn kết nối với bot để bạn có thể dễ dàng theo dõi các giá trị của đầu vào và đầu ra và cũng có thể dễ dàng sửa và tải lên chương trình của bạn cho các giá trị Kp, Ki và Kd. Các đoạn video dưới đây cho thấy hoàn toàn các hoạt động của bot và cũng cho thấy cách để sửa giá trị PID của bạn.
Hy vọng điều này sẽ giúp xây dựng robot tự cân bằng của riêng bạn nếu bạn có bất kỳ vấn đề nào trong quá trình hoạt động, hãy để lại câu hỏi của bạn trong phần bình luận bên dưới hoặc sử dụng diễn đàn để có thêm câu hỏi kỹ thuật. Nếu bạn muốn thú vị hơn, bạn cũng có thể sử dụng logic tương tự để xây dựng một robot cân bằng bóng.