圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21860|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>  O  |2 g: ^& ?0 `- P- J( k
  2. #include <Wire.h>
    5 M" p  F( o: ]: @
  3. #include <Servo.h>
    . h1 R- m" X% V- T6 @# v- U5 O
  4. " C" @9 o) K: a4 I5 }4 r
  5. #include "MePort.h"/ `" g3 ]0 B$ V: n* l& T: J' ?
  6. #include "MeUltrasonic.h") `! {. ]3 A- U
  7. #include "MeDCMotor.h"
    2 t4 J& U9 [/ L

  8. 0 b! F1 y1 g4 z+ t0 o
  9. //double Input, Output ;# _* J' Y* t8 `9 W* d/ C* O# ^
  10. float MaxSpeed = 255;
    4 H. f! q1 M7 _& x& p
  11. float MaxPower = 180;
    6 O4 f1 X6 h+ m$ L6 I8 l6 f
  12. float MinPower = 120;
    & }' i& h2 S4 R* M% t0 z
  13. float Error,ErrorAcc,ErrorDec;
    * ^  \) |) d$ @* n8 M/ K

  14. - J5 k. F: k6 K
  15. float Kp=0.14;4 `, [" I* ~+ a. v7 ^+ R6 e
  16. float Kd=0.00020;//23;. t5 W6 \0 n. _6 ]& u1 t
  17. float Ki=0.000201;9 c+ M1 N- m# G: _9 J
  18. : e2 a; ]7 b+ R, l% B/ ]
  19. float nPower;
    6 R/ N# P+ S# {
  20. MePort lightsensor_6(6);9 H( t+ m! g  E! e5 q
  21. MePort lightsensor_8(8);
    ' J; h3 w0 {% ^6 g
  22. MeDCMotor motor_9(9);& F0 W' N3 t9 j! L  l# _
  23. MeDCMotor motor_10(10);
      |- m/ X# p; Q' r7 F
  24. unsigned long previousMillis = 0;7 C; g0 Z9 v. d2 I" X7 r
  25. const long interval = 1;
    - ~( s, |; |$ X3 J6 }6 @& e; \
  26. + o3 C9 o9 i/ C- D' T7 a
  27. void setup(){
    1 u0 ^6 A7 a* F5 u
  28.     lightsensor_6.dWrite1(1);6 |4 N6 A, X9 U  C/ d# Z
  29.     nPower = 160;
    5 r5 {: F/ }" i
  30.     Error=0;
    8 v, Y. T, J8 \) d" W. ]3 B
  31.     ErrorAcc=0;
    1 o" l2 e; m. X6 J6 ^! M# D2 D6 g
  32. }. b  \  ^5 S5 X1 z/ Z
  33. ' i4 x" n# o. q5 |3 ~( m
  34. void loop(){
    + D, S4 P8 C7 E% R3 q, D: w
  35.   unsigned long StartTime = millis();% c( V! C* q' B, d) C2 F  T. u* T
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    ) {* g* U5 r  M- ^$ d' ^) {
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    : m; r5 A# \3 B. Y% v
  38.     ErrorAcc +=  nError*Kd ;7 J* D' g9 \: Y7 Y, V0 G" w* Z6 ?
  39.     ErrorDec -=  nError*Ki ;9 J7 t' F- E. ~& R8 A, W! c% y' \
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
      e  v- w& ~7 B4 g  S
  41.     if(nError < 80 && nError > -80){, C& P' ]+ r" A  F
  42.       if(nPower < MaxPower){" C# A- Z  T' h# P, S
  43.         nPower += 3;
    / ]' D3 f* i$ Z* R5 T! j" a
  44.       }. S% c/ A0 |7 Z( I+ B7 [3 Y" B
  45.     } else{
    5 U9 Y" ]' r& ]) {6 k
  46.       if(nPower > MinPower){
    $ d( L8 R1 p4 F* Q
  47.         nPower -= 2;( p5 a. h/ |& K8 p% Z
  48.       }2 o$ Z( _4 l0 x( [1 P* @
  49.     }
    + q2 Q/ K+ p( t. s
  50.     MotoL(nPower-Error);
    7 \  b. d; S  \3 k2 u4 v9 b( M/ ~
  51.     MotoR(nPower+Error);    9 ^6 o3 I4 Q: l( ^/ d- l$ @
  52.   }else{9 H0 k; [  ]' f# D3 K
  53.     motor_9.run(0);
    # d- v7 ?* g: u7 ]2 y
  54.     motor_10.run(0);- J+ {3 L9 d" X: {5 A+ L( l
  55.   }
    % Z% a1 _1 ~$ Y
  56.   do{}while(millis() - StartTime < interval);
    ; N7 }! h7 C  E) d+ w7 }
  57. }
    7 o5 e/ L2 }- [+ i+ x- S, \

  58. 3 x- A0 v6 N" M) G3 Q2 ]
  59. void MotoL(int Power){- p. O: g8 s# H8 F5 q6 n
  60.   if (Power > MaxSpeed){1 r3 P; \$ w2 g+ m4 r
  61.      Power = MaxSpeed;
    7 I: V/ D7 Z7 O7 j1 ?4 B/ C
  62.   }
    + _  o0 N! B; [
  63.   if (Power < -MaxSpeed){' @8 l) i' l2 L; i3 t
  64.      Power = -MaxSpeed;2 u* i" h6 F* b0 ]
  65.   } * }2 [. o6 l  g9 R) s. Z
  66.   motor_9.run(Power);
    & k/ G) t; o$ R6 v/ D8 V, f" x
  67. }  
    . ~" L4 ~& V9 _/ a( x% t
  68. 1 ]3 M) d1 }; Y) ^. L$ A, B/ X
  69. void MotoR(int Power){% h  f$ N# U2 v
  70.   if (Power > MaxSpeed){3 N# G& K) f5 s! [
  71.      Power = MaxSpeed;
    $ f3 G2 |; \% U+ r! }
  72.   }
    9 d) }6 G$ |" `% \) }
  73.   if (Power < -MaxSpeed){
    . s- N; ^6 G; Z# o
  74.      Power = -MaxSpeed;
    + ^/ f9 A% u9 e) f/ {; b
  75.   } ( _8 t/ S& T2 J$ U
  76.   motor_10.run(Power);) K* D, b7 s; ~( L1 I  I" D
  77. }  
複製代碼
2 V4 V( Z- }1 m4 p

5 o2 A0 s$ u& i6 `+ V7 ]
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
) q6 L$ o1 }0 Z$ n! l0 d7 H: [: I% x: I/ r3 z
您好,不知是否能向您請教。
$ _2 N% [% m" N目前和宋修賢老師在處理Ardui Car
' s: O3 [3 q& ^2 l( A雖然已使用較繁雜的方式處理了跑出黑線外的狀況
' H+ b% Q6 A+ v4 a7 @' {7 }0 C& r2 u; C
但基於想追求更精簡的程式所以還是想請問一下
# w- j2 w) [; W& `! T就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝+ o" I. b  H, V  u& f5 b  }
不知道您是否願意教我可以如何處理
8 S: h! p. d  h/ F$ X' T% c# k# t" U( W
& Z  {, r& L9 ^& ]
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;- W* v( N  v) ^4 ^/ `2 K- M# Y
  2. double CNY70Val = 1000;
    : j5 c9 y3 f0 y
  3. int interror = 0;. ^4 ?, g& C: m- l1 |  E8 ^
  4. int olderror = 0;) @  m: R1 X% W! l  {
  5. double values;
    + W" L# {  D( z
  6. 9 p- C5 _$ q5 i, [  E
  7. 6 A1 Z3 [$ N( h% ~
  8. void CNY70()8 W, ?! z" V0 k% i  [6 n( q
  9. {# Y4 ]! ^& ^7 ^- ?6 Y, ~
  10.   valuesRR = analogRead(RR)1 V6 t  _( C7 h3 U4 n$ q) a/ J
  11.   valuesMR = analogRead(MR);% G) ~& O, U5 ?! C; D* @8 f2 v
  12.   valuesMM = analogRead(MM);
    * t* `: V; n' ~0 k$ C
  13.   valuesML = analogRead(ML);
    5 N% n- T2 Y6 d2 s
  14.   valuesLL = analogRead(LL);
    " S2 B% S, _9 Y. R2 Q" B- b# J
  15. 2 d( h/ h/ j. y4 ^+ d
  16.   if (valuesRR > CNY70Val)
    ; e  e  h* }7 {( m$ `
  17.     valuesRR = CNY70Val;
    . w8 [* C4 p6 _0 \. Y* Q; `
  18.   if (valuesMR > CNY70Val)
    & _% N' ^, F" w3 v6 }5 t4 I" R* \6 r+ p
  19.     valuesMR = CNY70Val;" v" Y+ ~& M" `
  20.   if (valuesMM > CNY70Val)
    8 o9 n8 R0 @2 E) J8 B
  21.     valuesMM = CNY70Val;' i0 q4 K! e" J3 e6 @; i
  22.   if (valuesML > CNY70Val)  E# h; n. f8 v, a' \% S
  23.     valuesML = CNY70Val;
    - ]8 |  {& h' `4 P" W1 Q5 p
  24.   if (valuesLL > CNY70Val), a# L; G) Y; z! m) Y
  25.     valuesLL = CNY70Val;
    # X: D& l, I/ `! B
  26. - o5 {0 u& M5 N7 a& q+ I, K
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ! r0 u+ T6 n; Y* r
  28. }( ^' z  e# }7 \, I7 @0 j
  29. 8 y0 o/ j. ~; P& F' f
  30. void Car()! \$ @1 e, N# _: F( K+ K) G
  31. {
    " S/ d2 W% E5 I: |- A; I2 o2 x
  32.   while (1) {3 A, ]3 P$ X- m$ u0 I
  33.     CNY70();
    / X+ `; T- T/ e1 k# {; ?+ o0 _& D7 D* ?

  34. 3 V% c$ F7 A2 T: Q7 f: a( a2 M
  35.     int error = ((int)values);
    : \0 h9 J3 ?8 Z
  36.     interror += error;) Q! I% Q" U& L0 s4 U0 ?3 r
  37.     int lasterror = error - olderror;
    ) ?9 ?, a) l: |- f8 z. Q
  38.     olderror = error;1 r3 L5 ~9 [& W5 m) ]! Z. h& I
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ! D3 u) U  `0 }- |' |" A; Q
  40. / J5 ^  ]# Q6 b; T6 l
  41.     if (power > MotoSpeed)8 h% i6 h' N* S2 z. z
  42.       power = MotoSpeed;
    0 B- h7 h) E/ v3 f: o
  43.     if (power < -MotoSpeed)
    3 n/ r) @3 }. M- t
  44.       power = -MotoSpeed;" n& ~0 d" N$ }, P9 \
  45.   d7 }; R  Z; n8 L2 n5 }
  46.     if (power > 0)/ L1 U0 d8 D% P2 R7 N
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。! i* W* A1 ^( E# K2 U2 A3 ?, @0 d7 f
  48.     else0 g  |; W) Z7 c4 G5 L
  49.       Speed(MotoSpeed + power, MotoSpeed);
    . P7 X8 h2 l: B8 ~: h+ N
  50.   }4 M, {9 h- c  {
  51. }
複製代碼

& i! M% W4 s( [% z# C# P3 F) h* S" a
+ @+ v4 |2 u/ b' i$ c
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

QQ|Archiver|手機版|小黑屋|圓創力科技有限公司 IOP Robotic Technology Co.,Ltd Tel: 07-3924582 Fax: 07-3924001

GMT+8, 2025-12-6 10:18 , Processed in 0.022725 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表