Hướng dẫn làm robot 2 bánh tự cân bằng

      87

Hôm nay bản thân xin share với các bạn cách làm một robot tự thăng bằng trên hai bánh xe bởi otworzumysl.com từ xe đồ nghịch bị hư của thằng nhóc làm việc nhà. Vớ nhiên, hai động cơ và nhị bánh xe chưa bị hư nhé. . Để robot tự thăng bằng trên nhì bánh xe cộ thì hoạt động của nó giống như như câu hỏi giữ thăng bằng một cây gậy bên trên ngón tay. Điều này chắc các bạn cũng đã từng thử trước đây. Để giữ thăng bằng, họ phải dịch rời ngón tay của chính bản thân mình nhanh tốt chậm theo phía nghiêng và vận tốc nghiêng của cây gậy. Bọn chúng ta bước đầu tìm phát âm xem làm rứa nào nhưng mà otworzumysl.com hoàn toàn có thể tự điều chỉnh được như thế.

Bạn đang xem: Hướng dẫn làm robot 2 bánh tự cân bằng


I. DẪN NHẬP

Hôm nay mình xin share với các bạn cách làm cho một robot tự thăng bằng trên nhì bánh xe bởi otworzumysl.com từ xe đồ chơi bị hư của thằng nhóc nghỉ ngơi nhà. Tất nhiên, hai bộ động cơ và hai bánh xe chưa bị hư nhé.. Để robot tự cân bằng trên nhị bánh xe pháo thì vận động của nó tương tự như câu hỏi giữ thăng bởi một cây gậy trên ngón tay. Điều này chắc chúng ta cũng đã từng thử trước đây. Để giữ thăng bằng, chúng ta phải dịch chuyển ngón tay của mình nhanh giỏi chậm theo phía nghiêng và vận tốc nghiêng của cây gậy. Bọn chúng ta bước đầu tìm đọc xem làm vắt nào mà otworzumysl.com rất có thể tự điều chỉnh được như thế.

II. B.O.M

Các vật dụng tư cần thiết để có tác dụng một robot 2 bánh tự thăng bằng như sau:

No.

Item

Spec

Q"ty

Unit

Remarks

1

otworzumysl.com Uno

 

1

pcs

 

2

MPU-6050

 

1

pcs

 

3

L298

 

1

pcs

 

4

DC Motor

 

2

pcs

 

5

Bánh xe

60mm

2

pcs

 

6

Biến trở

5Kohm

4

pcs

 

7

PCB đục lỗ

4x6 cm, màu sắc xanh, nhì mặt

2

pcs

 

8

Trụ đồng

 

8

pcs

 

9

Nguồn 5V & 12V

 

1

pcs

 

10

Bus 4

 

1

pcs

 

11

Mica trong/đục

 Dày 5mm

1

pcs

 Làm khung

12

Dây – jack nguồn/ mặt hàng rào

 

1

pcs

 

III. CHUẨN BỊ

Trước tiên, bọn họ phải quăng quật một ít thời gian để khám phá các thông tin cơ bản sau phía trên trước khi tiến hành làm một robot tự cân bằng.

3.1. Chế độ con nhấp lên xuống ngược (inverted pendulum)

Nó giống như việc duy trì thăng bằng một cây gậy bên trên ngón tay. Để giữ lại thăng bằng, bọn họ phải di chuyển ngón tay của mình theo hướng nghiêng và vận tốc nghiêng của cây gậy. Để tinh chỉnh và điều khiển động cơ bánh xe cho robot tự cân bằng qua mạch ước L298N, họ cần một số thông tin về tinh thần của robot như: điểm thăng bởi cần cài đặt cho robot, hướng nhưng mà robot vẫn nghiêng, góc nghiêng và tốc độ nghiêng. Toàn bộ các thông tin này được thu thập từ MPU6050 và chuyển vào bộ tinh chỉnh và điều khiển PID để tạo nên một tín hiệu tinh chỉnh động cơ, giữ cho robot nghỉ ngơi điểm thăng bằng.Về phần lý thuyết và những công thức, các chúng ta có thể tìm đọc qua google với những từ khóa: inverted pendulum (con lắc ngược), self-balancing robot tốt 2 wheel self-balancing.

3.2. Điều khiển vòng bí mật P.I.D

Ở đây, giá bán trị thiết lập bộ P.I.D (SP) là vấn đề cân bằng được phát âm là góc đối với phương trực tiếp đứng, vuông góc với robot. Nếu như phần cứng mang đến robot hoàn hảo, cân bằng và đối xứng thì cùng với thiết kế của bản thân góc này đã là 1800, thực tiễn điểm SP của chính bản thân mình là 178.700 . Lý do là 1800 tuyệt 178.700, chúng ta hãy coi chương trình mặt dưới. Bộc lộ hồi tiếp feedback (PV) là sự phối hợp giữa Gyroscope và Accelerometer được thu thập từ MPU-6050. Output của cục PID là dấu hiệu điều xung tốc độ cho hai động cơ DC làm sao để cho PV tiến cho tới điểm cân bằng SP.

3.3. MPU-6050

MPU-6050 là cảm biến của thương hiệu InvenSense tích vừa lòng 6 trục cảm ứng bao gồm:Con quay hồi đưa 3 trục (Gyroscope).Cảm biến vận tốc 3 chiều (Accelerometer).Khi mày mò về MPU-6050, các bạn sẽ gặp nên thuật ngữ QUATERNION, YAW, PITCH, ROLL. Với theo mình, đó là cách giải thích đơn giản và dể gọi nhất:

Xin phép tác giả trích lược lại như sau:

Một vật dụng bay rất có thể thực hiện bao nhiêu kiểu chuyển động. Các loại hoạt động đó xảy ra xung quanh các trục nào?

Một máy bay có thể thực hiện tại 3 kiểu gửi động. Nó rất có thể gọi pitch, roll cùng yaw.

Pitch là kiểu hoạt động khi mũi của dòng sản phẩm bay chúc lên phía trên hoặc chúi xuống dưới. Hoạt động pitch ra mắt xung xung quanh trục ngang của dòng sản phẩm bay.

Roll là kiu chuyn đng lúc mt trong nhì cánh ca máy bay ling xung còn cánh còn li thì ling lên. Ví d, nếu máy bay đang roll sang phía trái thì cánh trái s ling xung còn cánh phi thì ling lên. Chuyn đng roll din ra bao phủ trc dc thân thứ bay.

Xem thêm: So Sánh Kinh Doanh Quốc Tế Và Kinh Doanh Nội Địa, Su Khac Biet Kinh Doanh Trong Nuoc Va Quoc Te

Yaw là kiu chuyn đng khi mũi ca máy bay di chuyn qua phi hoc qua trái. Chuyn đng yaw din ra bao phủ trc thng đng, vuông góc vi thân máy bay.

IV. SƠ ĐỒ MẠCH VÀ size ROBOT

4.1. Phần cứng và khung robot

Khi có tác dụng phần cứng các bạn lưu ý làm phần khung mang lại robot yêu cầu cứng cáp, chịu đựng được va đập trong quá trình test và đối xứng thì robot đang đẹp với dễ cân bằng hơn.Phần form robot: bằng mica, thiết kế của bản thân mình còn thiếu hụt một tầng cất pin do chưa có đủ tiền để mua nó.
*
.Robot bởi đồ chơi dễ tìm được điểm cân đối do bánh của nó có các gai nhỏ. Do đấy là đồ chơi bị hỏng vì thế nó bị vẹo một tí. Tiếp đến mình đã cài đặt 2 động cơ DC với bánh xe cộ khác để thử. Tác dụng thật tốt vời! Đây là hai phiên phiên bản của em nó.

*

4.2. Sơ đồ hiệu chỉnh P, I, D bởi chương trình

Với sơ đồ vật này, các bạn phải tìm các thông số P, I, D bằng các phép thử và theo bản thân sẽ mất quá nhiều thời gian. Tuy thế otworzumysl.com sẽ còn nhiều chân Analog để hoàn toàn có thể làm việc khác. Một cách khác là điều chỉnh P, I, D qua Serial tuy vậy nó sẽ không công dụng lắm bởi vì otworzumysl.com liên tiếp bị treo (pending/ freezing). Qua tìm hiểu, bản thân thấy có không ít người trên các diễn bọn than phiền về sự việc này dẫu vậy vẫn chưa tồn tại cách giải quyết....

*

4.3. Sơ đồ hiệu cao cấp chỉnh P.I.D qua biến hóa trở

Với vấn đề có thêm những biến trở nhằm hiệu chỉnh các hệ số P, I, D sẽ làm giảm không hề ít thời gian tìm mẫm những hệ số này làm sao để cho robot vận động ổn định, mượt mà. Các hệ số P, I cùng D được tra cứu như sau:

Đặt toàn bộ các đổi thay trở P, I, D về 0.Tăng dần biến hóa trở P cho tới khi robot bắt đầu dao rượu cồn qua lại bao bọc điểm cân đối nhưng robot vẫn không xẩy ra ngã.Tăng dần biến đổi trở D cho tới khi robot không thể dao động. Thời điểm này, robot vận động tương đối ổn định nhưng sẽ bị khựng khựng khi bị ảnh hưởng bằng tay.Tăng dần trở nên trở I trường đoản cú từ cho tới khi hệ thống chuyển động ổn định mượt mà ngay tất cả khi tăng mạnh robot về một phía. Nếu như giá trị trở nên trở I to nó sẽ khiến cho robot thỏa mãn nhu cầu chậm.

Với robot của mình, các thông số PID tìm kiếm được là:

KP = 10.50.KI = 67.44.KD = 0.88.

V. THƯ VIỆN VÀ CHƯƠNG TRÌNH

5.1. Lịch trình chính

Chương trình thiết yếu và việc áp dụng những thư viện được xem thêm từ nhiều nguồn khác nhau, trang xem thêm chính: https://github.com/lukagabric/Franko

#include "PID_v1.h"#include "LMotorController.h"#include "I2Cdev.h"#include "MPU6050_6Axis_MotionApps20.h"#if I2CDEV_IMPLEMENTATION == I2CDEV_otworzumysl.com_WIRE #include "Wire.h"#endif#define LOG_INPUT 0#define MANUAL_TUNING 1#define LOG_PID_CONSTANTS 1 //MANUAL_TUNING must be 1#define MOVE_BACK_FORTH 0#define MIN_ABS_SPEED 5//MPUMPU6050 mpu;// MPU control/status varsbool dmpReady = false; // set true if DMP init was successfuluint8_t mpuIntStatus; // holds actual interrupt status byte from MPUuint8_t devStatus; // return status after each device operation (0 = success, !0 = error)uint16_t packetSize; // expected DMP packet size (default is 42 bytes)uint16_t fifoCount; // count of all bytes currently in FIFOuint8_t fifoBuffer<64>; // FIFO storage buffer// orientation/motion varsQuaternion q; // quaternion containerVectorFloat gravity; // gravity vectorfloat ypr<3>; // yaw/pitch/roll container và gravity vector//PID#if MANUAL_TUNING double kp , ki, kd; double prevKp, prevKi, prevKd;#endifdouble originalSetpoint = 178.70;// 181.13double setpoint = originalSetpoint;double movingAngleOffset = 0.15;// 0.3- OK, 0.15 - OKdouble input, output;int moveState=0; //0 = balance; 1 = back; 2 = forth#if MANUAL_TUNING PID pid(&input, &output, &setpoint, 0, 0, 0, DIRECT);#else PID pid(&input, &output, &setpoint, 10.50, 67.44, 0.88, DIRECT);// time 5ms và 10ms, sometimes Kp(17.35, 16.86) Ki(302.05, 301.05) Kd(1.21)#endif//MOTOR CONTROLLERint ENA = 3;int IN1 = 4;int IN2 = 8;int IN3 = 5;int IN4 = 7;int ENB = 6;LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, 1, 1);//timerslong time1Hz = 0;long time5Hz = 0;volatile bool mpuInterrupt = false; // indicates whether MPU interrupt sạc has gone highvoid dmpDataReady() mpuInterrupt = true;void setup() // join I2C bus (I2Cdev library doesn"t do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_otworzumysl.com_WIRE Wire.begin(); TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif // initialize serial communication // (115200 chosen because it is required for Teapot chạy thử output, but it"s // really up lớn you depending on your project) Serial.begin(115200); while (!Serial); // wait for Leonardo enumeration, others continue immediately // initialize device Serial.println(F("Initializing I2C devices...")); mpu.initialize(); // verify connection Serial.println(F("Testing device connections...")); Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); // load và configure the DMP Serial.println(F("Initializing DMP...")); devStatus = mpu.dmpInitialize(); // supply your own gyro offsets here, scaled for min sensitivity mpu.setXGyroOffset(39); mpu.setYGyroOffset(14); mpu.setZGyroOffset(6); mpu.setZAccelOffset(1788); // 1688 factory mặc định for my test chip // make sure it worked (returns 0 if so) if (devStatus == 0) // turn on the DMP, now that it"s ready Serial.println(F("Enabling DMP...")); mpu.setDMPEnabled(true); // enable otworzumysl.com interrupt detection Serial.println(F("Enabling interrupt detection (otworzumysl.com external interrupt 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // phối our DMP Ready flag so the main loop() function knows it"s okay khổng lồ use it Serial.println(F("DMP ready! Waiting for first interrupt...")); dmpReady = true; // get expected DMP packet kích thước for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); //setup PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(5);// 10 - OK, 5 - GOOD, 1- CHANGE PID pid.SetOutputLimits(-255, 255);// 80 - OK Strong enough else // ERROR! // 1 = initial memory load failed // 2 = DMP configuration updates failed // (if it"s going khổng lồ break, usually the code will be 1) Serial.print(F("DMP Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); void loop() // if programming failed, don"t try to vì anything if (!dmpReady) return; // wait for MPU interrupt or extra packet(s) available while (!mpuInterrupt && fifoCount = 1000) loopAt1Hz(); time1Hz = currentMillis; if (currentMillis - time5Hz >= 5000) loopAt5Hz(); time5Hz = currentMillis; // reset interrupt flag & get INT_STATUS byte mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & 0x10) || fifoCount == 1024) // reset so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, kiểm tra for DMP data ready interrupt (this should happen frequently) else if (mpuIntStatus & 0x02) // wait for correct available data length, should be a VERY short wait while (fifoCount 1 packet available // (this lets us immediately read more without waiting for an interrupt) fifoCount -= packetSize; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); #if LOG_INPUT Serial.print("ypr "); Serial.print(ypr<0> * 180/M_PI); Serial.print(" "); Serial.print(ypr<1> * 180/M_PI); Serial.print(" "); Serial.println(ypr<2> * 180/M_PI); #endif input = ypr<1> * 180/M_PI + 180; }void loopAt1Hz()#if MANUAL_TUNING setPIDTuningValues();#endifvoid loopAt5Hz() #if MOVE_BACK_FORTH moveBackForth(); #endif//move back & forthvoid moveBackForth() moveState++; if (moveState > 2) moveState = 0; if (moveState == 0) setpoint = originalSetpoint; else if (moveState == 1) setpoint = originalSetpoint - movingAngleOffset; else setpoint = originalSetpoint + movingAngleOffset;//PID Tuning (3 potentiometers)#if MANUAL_TUNINGvoid setPIDTuningValues()void readPIDTuningValues() int potKp = analogRead(A0); int potKi = analogRead(A1); int potKd = analogRead(A2); kp = map(potKp, 0, 1023, 0, 25000) / 100.0; //0 - 250 ki = map(potKi, 0, 1023, 0, 100000) / 100.0; //0 - 1000 kd = map(potKd, 0, 1023, 0, 500) / 100.0; //0 - 5#endif

5.2. Những thư viện đến dự án

Các bạn phải inlcude các thư viện sau vào lịch trình chính:

V. LỜI KẾT

Việc điều khiển các thông số PID qua các biến trở đang giúp chúng ta hiểu rộng về điều khiển vòng bí mật có hồi tiếp vốn là rất phức hợp và các mô phỏng vật thể qua MPU-6050 cho ta cảm giác thực về các hoạt động trong ko gian. Các chia sẻ ở bên trên trong phạm vi gọi biết của tôi, chắc chắn rằng sẽ có không ít sai sót, mong được góp ý để rất có thể làm tốt hơn.Robot hai bánh tự cân bằng hoạt động khá giỏi ngay cả sinh sống mặt con đường gồ ghề, nghiêng, trên thảm, bên trên nệm và sở hữu thêm những vật nhẹ trên nó. Nó cũng có thể lấy lại thăng bằng khi bị chuyển phiên trái - cần hay đẩy cho tới - lui.Dự án robot nhì bánh tự cân nặng bằng là một trong trải nghiệm thú vị vì chưng lần đầu tiên con trai tôi thích món đồ chơi vì chưng tôi tạo sự và bước đầu có các thắc mắc về otworzumysl.com (cu cậu bắt đầu học lớp 5 à). Nó cũng giúp tôi giảm bớt căng thẳng và trong khi tìm lại được sự thăng bằng cho chủ yếu mình.
*

MERRY CHRISTMAS 2017 - CHÚC CỘNG ĐỒNG otworzumysl.com VIỆT NAM NGÀY CÀNG PHÁT TRIỂN.