Hướng Dẫn Làm Robot 2 Bánh Tự Cân Bằng

Hôm nay mình xin share cùng với các bạn bí quyết làm một robot tự thăng bằng bên trên nhì bánh xe pháo bằng hoimegame.com tự xe cộ vật chơi bị hỏng của thằng ranh con trong nhà. Tất nhiên, nhị động cơ với nhị bánh xe cộ chưa bị hỏng nhé. . Để robot tự cân bằng trên nhị bánh xe cộ thì vận động của chính nó giống như nhỏng bài toán giữ thăng bởi một cây gậy bên trên ngón tay. Vấn đề này cứng cáp chúng ta cũng đã từng có lần thử trước đó. Để duy trì thăng bằng, chúng ta buộc phải dịch chuyển ngón tay của bản thân mình nhanh giỏi chậm trễ theo hướng nghiêng với vận tốc nghiêng của cây gậy. Chúng ta bắt đầu mày mò xem làm cố như thế nào mà hoimegame.com có thể từ bỏ điều chỉnh được như vậy.

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 bản thân xin chia sẻ cùng với các bạn biện pháp làm cho một robot tự cân bằng bên trên nhị bánh xe bởi hoimegame.com trường đoản cú xe thứ đùa bị hư của thằng ranh mãnh ở trong nhà. Tất nhiên, nhị động cơ cùng nhị bánh xe không bị hỏng nhé.. Để robot tự thăng bằng bên trên nhì bánh xe thì chuyển động của nó tương tự nhỏng việc giữ thăng bằng một cây gậy trên ngón tay. Vấn đề này vững chắc các bạn cũng đã có lần test trước đó. Để duy trì thăng bằng, chúng ta nên di chuyển ngón tay của chính bản thân mình nkhô giòn tốt chậm rì rì theo phía nghiêng và vận tốc nghiêng của cây gậy. Chúng ta ban đầu tìm hiểu coi làm nạm nào nhưng hoimegame.com hoàn toàn có thể trường đoản cú điều chỉnh được như thế.

II. B.O.M

Các đồ dùng bốn quan trọng để triển khai một robot 2 bánh từ bỏ cân bằng nlỗi sau:

No.

Item

Spec

Q"ty

Unit

Remarks

1

hoimegame.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 xanh da trời, nhị mặt

2

pcs

 

8

Trụ đồng

 

8

pcs

 

9

Nguồn 5V và 12V

 

1

pcs

 

10

Bus 4

 

1

pcs

 

11

Mica trong/đục

 Dày 5mm

1

pcs

 Làm khung

12

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

 

1

pcs

 

III. CHUẨN BỊ

Đầu tiên, chúng ta phải bỏ chút thời gian nhằm khám phá những biết tin cơ bạn dạng sau đây trước lúc thực hiện có tác dụng một robot tự thăng bằng.

3.1. Nguyên ổn tắc bé rung lắc ngược (inverted pendulum)

Nó giống như việc giữ lại thăng bởi một cây gậy trên ngón tay. Để giữ thăng bởi, chúng ta đề nghị di chuyển ngón tay của bản thân theo hướng nghiêng và tốc độ nghiêng của cây gậy. Để điều khiển hộp động cơ bánh xe mang đến robot từ bỏ thăng bằng qua mạch cầu L298N, bọn họ buộc phải một vài ban bố về trạng thái của robot như: điểm thăng bởi yêu cầu thiết lập cho robot, hướng mà robot đã nghiêng, góc nghiêng với vận tốc nghiêng. Tất cả các thông tin này được tích lũy từ bỏ MPU6050 cùng gửi vào cỗ tinh chỉnh và điều khiển PID để tạo nên một biểu hiện tinh chỉnh động cơ, giữ lại cho robot làm việc điểm thăng bằng.Về phần lý thuyết cùng những bí quyết, các bạn cũng có thể mày mò qua google cùng với những từ bỏ khóa: inverted pendulum (nhỏ lắc ngược), self-balancing robot tốt 2 wheel self-balancing.

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

Tại phía trên, quý hiếm thiết lập bộ Phường.I.D (SP) là vấn đề cân bằng được phát âm là góc đối với phương thẳng đứng, vuông góc với robot. Nếu phần cứng đến robot tuyệt vời nhất, cân bằng với đối xứng thì cùng với xây đắp của bản thân góc này đang là 1800, thực tiễn điểm SP của mình là 178.700 . Tại sao là 1800 tuyệt 178.700, chúng ta hãy xem chương trình bên dưới. Tín hiệu hồi tiếp feedbaông xã (PV) là sự kết hợp giữa Gyroscope với Accelerometer được tích lũy từ MPU-6050. Output đầu ra của bộ PID là biểu đạt điều xung vận tốc mang đến nhị hộp động cơ DC 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 hãng InvenSense tích đúng theo 6 trục cảm biến bao gồm:Con tảo hồi đưa 3 trục (Gyroscope).Cảm vươn lên là vận tốc 3 chiều (Accelerometer).Lúc mày mò về MPU-6050, những các bạn sẽ gặp nên thuật ngữ QUATERNION, YAW, PITCH, ROLL. Và theo mình, đây là bí quyết phân tích và lý giải đơn giản dễ dàng và dể hiểu nhất:

Xin phxay người sáng tác trích lược lại nlỗi sau:

Một đồ vật bay rất có thể tiến hành từng nào vẻ bên ngoài vận động. Các nhiều loại hoạt động kia xảy ra xung quanh phần lớn trục nào?

Một sản phẩm công nghệ cất cánh hoàn toàn có thể thực hiện 3 đẳng cấp vận động. Nó hoàn toàn có thể call pitch, roll cùng yaw.

Pitch là hình trạng vận động lúc mũi của sản phẩm bay chúc lên phía trên hoặc ccụp xuống dưới. Chuyển hễ pitch diễn ra bao bọc trục ngang của máy bay.

Roll là kiu chuyn đng Khi mt trong nhì cánh ca vật dụng cất cánh ling xung còn cánh còn li thì ling lên. Ví d, nếu đồ vật bay đã roll thanh lịch bên trái thì cánh trái s ling xung còn cánh phi thì ling lên. Chuyn đng roll din ra xung quanh trc dc thân đồ vật cất cánh.

Xem thêm: Tổng Hợp Cách Làm Bánh Bao Chay Nhiều Màu Đơn Giản Với Khoai Lang Tím

Yaw là kiu chuyn đng Lúc mũi ca sản phẩm công nghệ bay di chuyn qua phi hoc qua trái. Chuyn đng yaw din ra bao quanh trc thng đng, vuông góc vi thân vật dụng cất cánh.

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

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

Khi làm phần cứng các bạn để ý làm phần khung đến robot bắt buộc cứng cáp, Chịu đựng được va đập vào quy trình test với đối xứng thì robot đang đẹp nhất và dễ thăng bằng hơn.Phần form robot: bởi mica, xây cất của bản thân mình không đủ một tầng cất pin do chưa xuất hiện đủ chi phí để sở hữ nó.
*
.Robot bằng đồ dùng nghịch dễ dàng tìm được điểm cân bằng vày bánh của nó bao gồm những tua nhỏ tuổi. Do đấy là thứ nghịch bị hư cho nên nó bị vẹo một tí. Sau kia mình đã tải 2 bộ động cơ DC cùng bánh xe không giống nhằm test. Kết quả thực tốt vời! Đây là nhì phiên bản của em nó.

*

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

Với sơ đồ dùng này, các bạn nên tìm những thông số kỹ thuật P, I, D bằng các phép thử cùng theo mình vẫn mất quá nhiều thời gian. Nhưng hoimegame.com đang còn các chân Analog để có thể thao tác khác. Một bí quyết không giống là điều chỉnh P.., I, D qua Serial nhưng mà nó sẽ không còn công dụng lắm vì hoimegame.com thường xuyên bị treo (pending/ freezing). Qua khám phá, mình thấy có tương đối nhiều tín đồ bên trên những diễn bầy kêu than về vụ việc này tuy thế vẫn chưa tồn tại phương pháp giải quyết....

*

4.3. Sơ đồ hiệu chỉnh P..I.D qua trở thành trở

Với Việc có thêm các trở nên trsinh sống để hiệu chỉnh các thông số Phường, I, D đang làm cho bớt tương đối nhiều thời gian dò mẫm những thông số này làm thế nào để cho robot vận động định hình, quyến rũ. Các thông số Phường, I với D được tìm kiếm như sau:

Đặt tất cả những biến chuyển trở Phường., I, D về 0.Tăng dần biến hóa trsống P. cho đến khi robot bắt đầu xấp xỉ qua lại bao bọc điểm cân bằng tuy thế robot vẫn không bị té.Tăng dần biến trlàm việc D cho tới lúc robot không còn xê dịch. Trong thời điểm này, robot hoạt động kha khá bình ổn tuy nhiên sẽ ảnh hưởng khựng khựng Khi bị ảnh hưởng thủ công.Tăng dần trở thành trở I thư thả cho tới lúc hệ thống chuyển động ổn định mượt mà ngay đến khi tăng cường robot về một phía. Nếu cực hiếm thay đổi trsinh sống I to nó sẽ làm cho robot đáp ứng chậm rì rì.

Với robot của chính bản thân mình, các thông số kỹ thuật PID tìm được là:

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

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

5.1. Cmùi hương trình chính

Cmùi hương trình chính cùng Việc áp dụng các thư viện được tham khảo từ nhiều nguồn khác nhau, trang tìm hiểu 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_hoimegame.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; // phối 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 kích thước (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 and gravity vector//PID#if MANUAL_TUNING double kp , ki, kd; double prevKp, prevKi, prevKd;#endifdouble originalSetpoint = 178.70;// 181.13double setpoint = originalSetpoint;double movingAngleOffmix = 0.15;// 0.3- OK, 0.15 - OKdouble input đầu vào, output;int moveState=0; //0 = balance; 1 = back; 2 = forth#if MANUAL_TUNING PID pid(&đầu vào, &output, &setpoint, 0, 0, 0, DIRECT);#else PID pid(&đầu vào, &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 pin has gone highvoid dmpDataReady() mpuInterrupt = true;void setup() // join I2C bus (I2Cdev library doesn"t vì chưng this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_hoimegame.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 Demo output, but it"s // really up to you depending on your project) Serial.begin(115200); while (!Serial); // wait for Leonarbởi 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 and configure the DMPhường 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 default 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 hoimegame.com interrupt detection Serial.println(F("Enabling interrupt detection (hoimegame.com external interrupt 0)...")); attachInterrupt(0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus(); // set our DMPhường 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 cỡ for later comparison packetSize = mpu.dmpGetFIFOPacketSize(); //thiết đặt PID pid.SetMode(AUTOMATIC); pid.SetSampleTime(5);// 10 - OK, 5 - GOOD, 1- CHANGE PID pid.SetOutputLimits(-255, 255);// 80 - OK Svào enough else // ERROR! // 1 = initial memory load failed // 2 = DMPhường. configuration updates failed // (if it"s going khổng lồ break, usually the code will be 1) Serial.print(F("DMPhường. Initialization failed (code ")); Serial.print(devStatus); Serial.println(F(")")); void loop() // if programming failed, don"t try khổng lồ vì chưng 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; // remix interrupt flag và 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 và 0x10) || fifoCount == 1024) // remix so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMPhường data ready interrupt (this should happen frequently) else if (mpuIntStatus và 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(yquảng bá, &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 đầu vào = ypr<1> * 180/M_PI + 180; }void loopAt1Hz()#if MANUAL_TUNING setPIDTuningValues();#endifvoid loopAt5Hz() #if MOVE_BACK_FORTH moveBackForth(); #endif//move baông chồng và 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() kd != prevKd) #if LOG_PID_CONSTANTS Serial.print(kp);Serial.print(", ");Serial.print(ki);Serial.print(", ");Serial.println(kd);#endif pid.SetTunings(kp, ki, kd); prevKp = kp; prevKi = ki; prevKd = kd; 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. Các thư viện mang đến dự án

Các chúng ta bắt buộc inlcude những thỏng viện sau vào chương trình chính:

V. LỜI KẾT

Việc điều khiển và tinh chỉnh những thông số kỹ thuật PID qua những thay đổi trsống sẽ giúp bọn họ đọc rộng về điều khiển vòng kín đáo gồm hồi tiếp vốn dĩ là khôn xiết phức tạp và các mô bỏng vật dụng thể qua MPU-6050 cho ta cảm thấy thực về các hoạt động vào không gian. Các share sinh sống bên trên trong phạm vi gọi biết của tôi, chắc hẳn rằng vẫn có khá nhiều sai sót, mong được góp ý nhằm rất có thể làm cho giỏi hơn.Robot hai bánh tự thăng bằng chuyển động tương đối giỏi trong cả ngơi nghỉ mặt đường nhấp nhô, nghiêng, bên trên thảm, trên nệm và sở hữu thêm những vật vơi bên trên nó. Nó cũng hoàn toàn có thể lấy lại cân bằng lúc bị xoay trái - yêu cầu xuất xắc đẩy tới - lui.Dự án robot hai bánh từ bỏ cân bằng là một đề nghị độc đáo bởi vì lần thứ nhất con trai tôi mê thích mặt hàng nghịch vày tôi làm nên cùng ban đầu tất cả những thắc mắc về hoimegame.com (cu cậu bắt đầu học tập lớp 5 à). Nó cũng góp tôi giảm sút căng thẳng với dường như kiếm tìm lại được sự thăng bằng cho chính mình.
*

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