http://www.gammon.com.au/i2c and https://forum.arduino.cc/index.php?topic=124286.0

http://www.ozbotz.org/files-red-balancing-robot/

https://www.i2cdevlib.com/devices/mpu6050#source

http://playground.arduino.cc/Code/PIDLibrary

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

http://playground.arduino.cc/Code/PIDLibraryRelayOutputExample

PID have three parameter: proportion, integral and derivative

each of them have different role in each application and have to be modified for match with each application. Two main application use PID is position control and velocity control

1: Position control includes and two wheel balacing.

PID được dùng trong điều khiển vị trí và trong điều khiển vận tốc

1. điều khiển vị trí thì có tính toán tốc độ của động cơ để cái xe chạy đến đúng một điểm đặt trước, hoặc điểu khị tốc độ động cơ để robot trở về vị trí cân bằng

Trong loại 1 thì khi đã đạt đc target rồi thì PID turn off

2 điều khiển vận tốc động cơ tức là PID control để giữ motor velocity constaint

trong loại này thì khi đạt được vận tốt target rồi thì PID giữ nguyên giá trị.

Trong cái link sau thì nó có nói về cả hai loại PID

http://www.hocavr.com/index.php/app/dcservo

quote:”Tuy nhiên, theo lẽ thường thì công thức dòng 37 phải là Output=pPart+dPart+iPart nhưng ở đây lại là : Output+=pPart+dPart+iPart (để ý dấu + trước dấu =), nghĩa là Output được cộng dồn thay vì là tổng tức thời như chúng ta đã thảo luận trong phần giải thuật PID. Thật ra việc này cũng dễ hiểu. Trong bài toán điều khiển vị trí, khi sai số bằng 0 chúng ta có thể dừng bộ điều khiển (u=0) nhưng trong bài toán điều khiển vận tốc, khi sai số bằng 0 thì giá trị u vẫn phải được giữ là giá trị trước đó.Vì vậy, trong bài toán điều khiển vận tốc giá trị Output được cộng dồn thay vì gán trực tiếp, bạn phải ghi nhớ điều này trong các ứng dụng điều khiển của mình.”

đây là lúc nó giải thích sự khác biệt.

Cụ thể hơn là trong phần lý thuyết nó có nói về tác dụng của integral part là để trasnh steady state error. Giaỉ thích như thế này là đúng nhưng chưa đầy đủ, vì Integral tồn tại ngay từ đầu lúc tính PID chứ k phải đợi steady state error xuất hiện rồi nó PID mới dùng đến integral part. Vậy ý nghĩa của integral trong bộ PID ngay từ đầu là gì

Tóm lại là ngay từ đầu integral cũng có tác dụng như proportion part và nó cũng dùng để khử steady state error.

ví dụ cụ thể:

1.Bài toán điều khiển vị trí xe: steady state error là dạng có lực F nhưng xe không chạy vì có ma sát tĩnh, Derivertive part thì đã bằng không vì sai số không đổi, lúc này chỉ có integral là có tác dụng lớn nhất để đưa xe về vị trí cân bằng.

2. Bài toán two wheel balacing thì có trường hợp là xe bị nghiêng góc ví dụ 30 độ, Proportion part điều chỉnh động cơ quay ví dụ hiện tại là đã tăng từ 0 lên đến pwm=125 nhưng xe không thể trở về cân bằng được, vì động cơ chưa đủ mạnh. Nhưng xuất hiện trường hợp là góc nghiêng cũng không tăng thêm, tức là xe nó cũng không nghiên thêm mà cũng không giảm góc nghiên được, tức là nó cứ vừa nghiêng vừa chạy, góc không đổi. Lúc này proportion không có tác dụng giúp xe trở về cân bằng, Derivative thì bằng không vì error không đổi. Lúc này chỉ còn có integral part có tác dụng cộng dồn error để tăng pwm giúp xe về cân băng. Còn ngay từ đâuf thì effect of integral part cũng giống như proportion, đáp ứng theo time và theo error.

3. Bài toán duy trì vận tốc thì

http://lopdd07kstn.forumotion.net/t305-topic

quote:”

Các quy luật điều chỉnh

Trong phần này ta sẽ nghiên cứu ảnh hưởng của các tham số P, I và D đến các đáp ứng của hệ thống. Từ đó có thể hiểu rõ được ý nghĩa của chúng trong công việc điều chỉnh các tham số đó sau này. Các lý giải sau đây chỉ thuần túy ở khía cạnh kỹ thuật. Các lý giải mang tính lý thuyết chặt chẽ có thể tìm thấy trong các tài liệu khác, ví dụ như [2], [3], [3], [4]…

Quy luật điều chỉnh P

Từ công thức (6), nếu cho K_{i}=0 và K_{d}=0 thì tín hiệu ra của bộ điều khiển có dạng

u(t) = K_{p}e(t)

Nghĩa là tín hiệu ra của bộ điều khiển chỉ đơn giản là tích của hệ số tỷ lệ và sai lệch giữa tín hiệu đặt và tín hiệu thực.

Giả sử bài toán ở đây là điều khiển tốc độ động cơ với tín hiệu đặt tốc độ là r=1000 vòng/phút, K_{p} = 15. Ta thử khảo sát xem sự biến thiên của tín hiệu ra của bộ điều khiển theo thời gian sẽ như thế nào.

# Giả thiết tại thời điểm t=0 tín hiệu ra của hệ thống y=0. Khi đó, tín hiệu sai lệch sẽ là e=r-y=1000. Đầu ra của bộ điều khiển là u = K_{p}\times e = 15\times 1000 = 1500. Tín hiệu này sẽ được đưa đến đầu vào của đối tượng cần điều khiển làm cho đầu ra y của nó bắt đầu tăng lên, dẫn đến e bắt đầu giảm.
# Trong một số trường hợp, do quán tính của hệ thống, khi sai lệch e=0 (nghĩa là đầu ra y đã bằng với giá trị đặt r) làm cho u = K_{p} \times e = 0 nhưng tốc độ của động cơ vẫn tiếp tục gia tăng.
# Khi tốc độ vượt quá tốc độ đặt thì tín hiệu ra u của bộ điều khiển đảo chiều, đồng thời quán tính của hệ cũng giảm dần làm cho tốc độ càng giảm nhanh.
# Khi tốc độ giảm xuống dưới tốc độ đặt thì tín hiệu ra u của bộ điều khiển lại lớn hơn 0, làm cho tốc độ lại tăng lên nhưng với quán tính nhỏ hơn…
# Sau một vài chu kỳ dao động như trên thì tốc độ động cơ sẽ ổn định ở một giá trị nào đó, phụ thuộc vào các tham số của hệ thống.

Sai lệch tĩnh
Đối với quy luật điều chỉnh P, khi tốc độ của động cơ bằng với tốc độ đặt e=0 thì tín hiệu điều khiển u=K_{p}e cũng bằng 0 và, do đó, tốc độ động cơ sẽ bị kéo giảm xuống. Vì vậy, muốn u \neq 0 thì e phải khác 0. Nghĩa là phải luôn có một sai lệch giữa tín hiệu đặt và tín hiệu đầu ra thực tế của tín hiệu điều khiển.

Trong ví dụ trên, giả sử sau khi ổn định thì tốc độ động cơ đạt 970 vòng/phút thì sai lệch tĩnh sẽ là e = 1000 – 970 = 30 vòng/phút và tín hiệu ra của bộ điều khiển sẽ là u = K_{p}e = 15 \times 30 = 450.

Giảm sai lệch tĩnh

Nếu tăng K_{p} lên 150 chẳng hạn thì sai lệch tĩnh e chỉ cần bằng 3 là có thể đủ để tạo ra một tín hiệu điều khiển bằng 450 để duy trì một mômen đủ lớn giữ cho động cơ quay. Rõ ràng, khi tăng K_{p} thì có thể làm giảm được sai lệch tĩnh. Tuy nhiên, nếu K_{p} tăng quá lớn thì hệ có thể bị dao động, không ổn định.

Quy luật điều chỉnh PI

Quy luật điều chỉnh P có ưu điểm là tác động nhanh. Tín hiệu điều khiển phụ thuộc trực tiếp vào sai lệch giữa tín hiệu đặt và tín hiệu thực. Tuy nhiên, khi sai lệch bằng 0 thì tín hiệu điều khiển cũng mất nên luôn tồn tại sai lệch tĩnh như đã nói ở trên.

Vậy làm thế nào để triệt tiêu sai lệch tĩnh?

Câu trả lời là phải đưa ra tín hiệu điều khiển cho đến khi nào sai lệch tĩnh bằng 0 thì giữ nguyên giá trị điều khiển đó.

Đây chính là đặc tính của khâu tích phân với tín hiệu ra được viết lại như sau:

u_{i,k} = K_{i}e_{k} + u_{i,k-1}

# Giả sử tại thời điểm k=0 u_{i,0} = 0.
# Tại thời điểm k=1 thì u_{i,1} = K_{i}e_{1} + u_{i,0} = K_{i}e_{1} tương tự như bộ điều khiển kiểu P.
# Tại thời điểm tiếp theo u_{i,2} = K_{i}e_{2} + u_{i,1} và cứ như vậy tín hiệu điều khiển lần sau bằng tín hiệu điều khiển ở lần trước đó cộng đại số với tích giữa hệ số tích phân và sai lệch làm cho sai lệch e (dương hoặc âm) giảm dần (hệ ổn định).
# Giả sử tại thời điểm k=n sai lệch e_{k}=0. Khi đó u_{i,n} = u_{i,n-1} (rồi u_{i,n+1} = u_{i,n}…). Nghĩa là u_{i,k} sẽ không thay đổi nữa khi e_{k} = 0.

Với bài toán điều khiển tốc độ động cơ với tốc độ đặt là r=1000 vòng/phút, giả sử K_{i} = 0.25 ta thấy:

# Giả thiết tại thời điểm t=0 u_{i,0} = 0. Nếu tại thời điểm t = 1 mà y_{1} = 200 thì e_{1} = r – y_{1} = 1000 – 200 = 800 và tín hiệu ra của bộ điều khiển sẽ là u_{i,1} = K_{i}e_{1} + u_{i,0} = 0.25 \times 800 + 0 = 200. Tín hiệu này sẽ được đưa đến đầu vào của đối tượng cần điều khiển làm cho đầu ra y của nó tiếp tục tăng, dẫn đến e bắt đầu giảm.
# Tại thời điểm t=2 giả sử y_{2} = 500 thì e_{2} = r – y_{2} = 1000 – 500 = 500 và tín hiệu ra của bộ điều khiển sẽ là u_{i,2} = K_{i}e_{2} + u_{i,1} = 0.25 \times 500 + 200 = 125 + 200 = 325 (giá trị u_{i,1} = 200 của chu kỳ điều khiển trước được cộng thêm 125). Đầu ra y tiếp tục tăng.
# Tại thời điểm t=3 giả sử y_{3} = 800 thì e_{3} = r – y_{3} = 1000 – 800 = 200 và tín hiệu ra của bộ điều khiển sẽ là u_{i,3} = K_{i}e_{3} + u_{i,2} = 0.25 \times 200 + 325 = 50 + 325 = 375 (giá trị u_{i,2} = 325 của chu kỳ điều khiển trước được cộng thêm 50). Đầu ra y tiếp tục tăng.
# Tại thời điểm t=4 giả sử y_{3} = 900 thì e_{4} = r – y_{4} = 1000 – 900 = 100 và tín hiệu ra của bộ điều khiển sẽ là u_{i,4} = K_{i}e_{4} + u_{i,3} = 0.25 \times 100 + 375 = 25 + 375 = 400 (giá trị u_{i,3} = 375 của chu kỳ điều khiển trước được cộng thêm 25). Đầu ra y tiếp tục tăng.
# Tại thời điểm t=5 giả sử đầu ra đã bám theo đầu vào, nghĩa là y_{5} = 1000 thì e_{5} = r – y_{5} = 1000 – 1000 = 0 và tín hiệu ra của bộ điều khiển sẽ là u_{i,5} = K_{i}e_{5} + u_{i,4} = 0.25 \times 0 + 400 = 400 (tín hiệu ra của bộ điều khiển được giữ nguyên giá trị u_{i,4} = 400 của chu kỳ điều khiển trước). Tín hiệu đầu ra bộ điều khiển không thay đổi và tốc độ được giữ nguyên.
# Giả sử tại thời điểm t=6 tốc độ y_{6} = 1100 thì e_{6} = r – y_{6} = 1000 – 1100 = -100. Tín hiệu ra của bộ điều khiển sẽ là u_{i,6} = K_{i}e_{6} + u_{i,5} = 0.25 \times -100 + 400 = -25 + 400 = 375 (tín hiệu ra của bộ điều khiển đã được bớt đi giá trị -25 so với chu kỳ điều khiển trước). Tín hiệu đầu ra bộ điều khiển giảm làm cho tốc độ động cơ cũng giảm xuống.

Như vậy, nếu tại thời điểm t=n đầu ra bám kịp tín hiệu đặt (sai lệch bằng 0) thì tín hiệu ra của bộ điều khiển u_{i,n} cũng sẽ không đổi. Tại bất kỳ một thời điểm nào nếu sai lệch lại khác 0 thì tín hiệu ra của bộ điều khiển lại tiếp tục thay đổi nhằm kéo đầu ra bám theo tín hiệu đặt.

nó giải thích rõ tại steady state error in maintaining velocity problem. Trong dạng velocity này thì giá trị của integral là cộng dồn (subsume) at the beginning

Tuy nhiên trong dạng position control thì nếu cộng dồn integral này từ đầu luôn thì không đúng lắm vì nếu xe đến cân bằng rồi thì output PID should be zero. nếu ta cứ cộng dồn integral part thì cái xe phải dao động qua điểm cân bằng cho đến khi nào integral về không thì xe mới dừng lại. Theo mình nghĩ (chưa được kiểm tra) thì khi xe về cân bằng thì nên tắt integral đi hay là set cái integral này bằng không để nó không drive car anymore. Vì nếu không tắt(set to zero) integral thì sẽ diễn ra tình trạng sau:

Xe phải dao động quanh điểm cân bằng cho đến khi nào integral itself bằng không

Image result for sine wave

giả sử hàm trên là hàm error theo thời gian thì tính từ lúc bắt đầu cho đến lúc nó cắt trục hoành (tức là đã đến điểm cân bằng lần đầu) giá trị integral cộng dồn là diện tích và nó lớn. Nếu đến cân bằng mà không tắt thì PID different of zero tiếp tục drive card forward and integral now reduce.

============================================================

Cascade PID two pid connected in series

More about the Control System…

But things are a bit more complex… We have really two PID controllers in a cascade configuration (the output of one controller connected to the next one). The output controller is a speed controller and the inner controller is the stability controller.

BROBOT_control1

ABOVE: B-ROBOT  control algorithm loop

We could use only one stability controller (the second one) but this would mean that the control´s output would be the desired robot tilt angle, so the user would control the robot angle directly. The problem is that if the center of gravity is not perfectly located above the wheels axis , so the robot needs a little tilt angle to keep the balance and if the user sends a command of tilt=0 then the robot will maintain its balance whilst moving… When adding the second controller (speed controller) the system compensates automatically for this. The user sends a command to the robot speed=0 and this controller will send the “correct” tilt angle to the second controller (stability controller) to mantain the robot balanced and not moving! For the users it is much simpler to set the desired robot speed and the system will find the right robot angle to achieve this speed.

explain:

the cascade PID make system give your robot has two extreme ability

  1. (Wrong thinking)put the weight (unbalanced axis) on it and its automatically balance even. Kind of you can put anything on robot and its automatically balance. don’t care how and where you put that weight.
    1. explain: when we put a thing on robot, the balance point (neutral point) will change.
    2. firstly, the neutral angle is still zero, then after put a weight on it, the robot will react to balance. In deep, the stability PID (second PID) will increase/decrease speed to clear the angle error (error = sensor_angle – neutral_angle). Suppose that we put the weight and make the angle turn to +15 degree. Then Stability PID will move the motor to the right to reduce this angle gap. Current error is 15-0 degree
    3. Next, the speed of motor will feed back to the first PID (speed PID). Which is error = current_speed – set_point_user_speed. The set_point_user_speed is zero. The output of speed PID is desired_angle. Normally, when user input a wanted_speed, then this PID will tranfer to a desired angle and give that desired angle to second PID (stability PID) and this PID will transfer that desired angle to needed speed and transfer to motor. The needed speed actually is acceleration or PWM to motor for example.
    4. Normally, the desired angle from first PID will be zero or neutral angle is zero. But when we put a weight on robot, the second PID generate a speed on motor, that inturn feedback that speed to first PID. Cause the set_point_user_speed is zero or we want robot standing still, its output angle would be new neutral_angle.
    5. Think like this, input to first PID is feed_back speed and user_speed, output is desired angle. When user put some wantted speed then output is desired angle. Now user_speed is zero, feed_back speed has changed so output is new neutral angle. because new neutral angle is the only answer to make robot stop with new weight on it.
  2. easy to make robot move, and perfect moving. With only one PID, user need to adjust direct angle to make robot move(adjust angle is the one way to make robot move). This direct adjust is not convinient because user will change speed so fast, that will make a kind of jig or big jump on PID and make robot fall down.So the first PID is used for that purpose. give it a desired speed, it will calculate the desired angle to achieve that speed. With PID, output control will smoothly change and don’t make output control jump around (no more jig).
  3. Extremly smooth at balancing point. With the cascade PID, the robot will stand firmly at balancing point, without it, robot will slightly move back and forward around the center point.

PID is a transfer function that input is anything and output is another thing. For example, input is angle (error = sensor measure – 0 degree) than output is pwm- speed of motor

ex2. input is user control speed (error = current_robot_speed – user_desired-speed), then output is needed_angle to achieve this speed.

NOTE:

1.pid is a transfer function and you need to adjust P,I,D to get the demand behavior.

2. standing capacity:  from the falling down position, lift the robot up to a certain angle and the PID will do the rest. For instance, the robot start from ground 90 degree. Then we lift him up to 70 degree (by body design or aid from a hand) then the second PID receive the input 70 degree. it will drive the motor very fast to the right and then the angle reduce to balancing point. OK we got the robot up 🙂 cheer^^

3. We have two PID so we should tune the second PID first by setting the desired angle = zero. Because the first PID only used for transfer from speed to angle so we will tune it after robot get balancing. try to find out the suitable kp,ki,kd when tranfer from speed to angle. Another question is why the output of first PID is angle? In order to understand this, we have to know PID is a transfer function from this input (whatever) to output(whatever too). When we want the output is angle so it exports the angle, when we want the output is PWM signal, it’s PWM signal. Depend on the purpose we want to use. In this balancing robot, the first PID is used to transfer from user_speed to needed_angle to control speed of motor. We can also say, with different set of kp,kd,ki we have different output. Also note that, this balancing robot B-Robot use angle to control speed of robot. so the first PID output to desired_angle. If we use another way (through adjust acceleration/2nd PID output or directly to speed of motor) to control its speed, then the first PID output don’t generate desire_angle anymore. Conclusion, PID generate what we want. In this B-Bot we want angle, so it simple produce angle for us. 🙂 cheer

4. How to balancing with additional weight. The effect is impressive and the theory behind is simple. When put a weight on robot, the robot will be tilled and then move backward/forward. the speed will continue to increase up to the point robot reaches to new balancing position. The key is we have to adjust the input to PID, that means we have to make PID think that the sensor angle now is zero to not drive the motor anymore. So do it by sensor_angle = real_sensor_angle – “something”. One simply way to calculate “something” is adding up the step of motor. We also can multiply with some coefficient like sensor_angle = real-sensor_angle – “something”* m. And the coefficient m is what we have to find through empirical.

does this work when we push a robot a certain force?

Here how the code work when put a weight on it is clear but what happen when we push robot a force. Because when we push it, robot will till an angle. This effect similar as we put a weight on it. So if the code of additional weight change the sensor_angle, does it ruin the balancing characteristic of push a force situation?

-> answer: the effect of push a force similar like put a weight. and when we push a force, the sensor_angle will be changed as it be in put a weight. However, in put a weight case, robot will be balanced when the “something” counting up/down. Suppose when we put a weight, the robot move to left, and “something” in sensor_angle = real_sensor_angle – “something” will count up. Then it balance and stop there. In case of push a force, this “something” will be count up and difference is robot not balcance and it continues to move to right. Then this “something” will be reduced and the sensor_angle = real_sensor_angle. So in sum, the additional weight make “something” parameter increase and don’t reduce after it reaches the new balancing point. The push a force increase this “something” and then reduce it.

continue to write tmr, try to use another way not through step of motor. and think is it similar like what PID give us. Not correct 100%

 

Advertisements