圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21531|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>, L8 Y" A) D; a2 L
  2. #include <Wire.h>
    6 |4 k+ J: d6 s1 F2 \
  3. #include <Servo.h>
    0 L; x$ e, K; r5 w! @" P! `( ~

  4. * T1 ~3 c+ ~; x1 x
  5. #include "MePort.h"
    ' f' P# h2 z9 J. {4 t  g
  6. #include "MeUltrasonic.h"9 ?' x0 ~: p4 \/ A) b
  7. #include "MeDCMotor.h"# a: H: S! M' E8 m+ Z6 |9 @

  8. ( A. i+ P* q  W# p, k$ j4 C, }
  9. //double Input, Output ;
    ' n7 y7 j+ v6 t; Y6 C4 T7 i
  10. float MaxSpeed = 255;8 S/ x3 T( X: ^; ^
  11. float MaxPower = 180;
    6 a* g, z% e# a  v& N. ^
  12. float MinPower = 120;2 e+ a6 @9 x' B1 @4 ~4 l3 l
  13. float Error,ErrorAcc,ErrorDec;: g9 |/ L# Y# W% P6 p
  14. 9 W1 L7 s* I" a" Y( J
  15. float Kp=0.14;
    / W  N) M7 J  y, X! G
  16. float Kd=0.00020;//23;
    # W8 D, r' x" B
  17. float Ki=0.000201;& t6 w" n4 e1 }5 @% t; K

  18.   e8 l# b2 W9 {0 k9 u
  19. float nPower;: d& m0 G7 I/ S4 t' |" v
  20. MePort lightsensor_6(6);" D0 C" a# `: K5 T
  21. MePort lightsensor_8(8);
    ; R) ^0 ?3 R5 T
  22. MeDCMotor motor_9(9);# I3 v# h$ M' c6 m! _" w' e
  23. MeDCMotor motor_10(10);+ A- E, k* L% s2 i0 [% J0 ^
  24. unsigned long previousMillis = 0;9 h3 @( S7 a) T* y0 o/ g
  25. const long interval = 1;
    9 Q; C% T/ v* t! l/ e
  26. 4 U& n6 c& }' V/ u# v0 D
  27. void setup(){9 b( a' ^7 m& h3 P. \1 x
  28.     lightsensor_6.dWrite1(1);; \+ C  I2 h: `
  29.     nPower = 160;
    5 [1 R: s6 J& [6 z$ r
  30.     Error=0;$ v! u9 A4 k& m: F, x4 v
  31.     ErrorAcc=0;
    , K" [% F6 T3 ^, Y- l
  32. }5 Q! i* N' [; H% |! m+ B

  33. ' I  H8 o( S: ]: h4 _2 ~
  34. void loop(){
    / X( n% n/ o  R6 W
  35.   unsigned long StartTime = millis();; \' W2 B9 V2 Q9 J: H1 i; g. K
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    & N& v  S  M: A1 m
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();* d7 [7 p! G0 d. |
  38.     ErrorAcc +=  nError*Kd ;+ H) m9 n1 K8 \3 ?
  39.     ErrorDec -=  nError*Ki ;2 {+ G0 }- V$ G$ Y' ~
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    4 W$ \7 L8 C/ @5 K0 j7 q: }( K
  41.     if(nError < 80 && nError > -80){3 v$ r: t" m: P- @3 V( _7 o
  42.       if(nPower < MaxPower){; S( r6 Q# {3 ]  P) C% j  p5 j/ N
  43.         nPower += 3;1 R" D# i; p9 k9 K/ I# _5 X0 ~" _
  44.       }
    , H. [  R5 q* j: B% w- e$ k
  45.     } else{
    / b1 X1 \% P' _0 Z+ Z
  46.       if(nPower > MinPower){
    1 l" W9 G* Q* y
  47.         nPower -= 2;
    % n9 y6 _; ?9 x* O  y3 B
  48.       }
    3 Y' I' \6 l- T. C; |
  49.     }
    / v4 ?( E! a/ j8 c7 w
  50.     MotoL(nPower-Error);
    $ L/ j, _9 X& u# a( ?8 x( l
  51.     MotoR(nPower+Error);   
    4 I" f3 B- w: r! W  g- X# N8 |( a
  52.   }else{% g& t5 ?; h" C1 o5 |' m
  53.     motor_9.run(0);0 T9 e9 d0 e/ L& W
  54.     motor_10.run(0);
    1 d. U% [2 v: D7 u' O: h, a; n
  55.   }
    4 w, ^# D7 O3 S7 x" ?7 F
  56.   do{}while(millis() - StartTime < interval);* D: K  Q) {+ p8 L9 W8 F7 E) \5 E
  57. }* u/ s* M* [: L9 G9 J' K1 ?; W
  58. 9 Z# \6 n: |3 [" @: s$ n8 S% z
  59. void MotoL(int Power){9 Q0 o, I1 P4 d4 b
  60.   if (Power > MaxSpeed){5 |$ h: r3 E' k6 ]
  61.      Power = MaxSpeed;
    9 \6 c" n" r9 e+ P0 [8 d0 x9 }
  62.   }
    # L) j1 o: E  c7 g/ B; b, }
  63.   if (Power < -MaxSpeed){  v9 r% _; _( w. T; ^
  64.      Power = -MaxSpeed;+ Q- a2 ~6 p3 e' V6 m  S) M  J
  65.   }
    2 Z- i9 C) m% P% r7 H
  66.   motor_9.run(Power);& t# M$ p2 E( R. y- u
  67. }  , w- c/ v* Z' d6 U( F6 g: }

  68. ' o) `6 b' y4 `# k4 t
  69. void MotoR(int Power){
    + q# L% M. [: W6 p) P5 Y3 Z- L
  70.   if (Power > MaxSpeed){! s& X/ y; x, ?' f* B
  71.      Power = MaxSpeed;+ q& g5 z: n3 S! v" N* v7 C( H
  72.   }   U: Y% ^4 O$ `0 a3 v
  73.   if (Power < -MaxSpeed){: s. t! f$ p% W, r2 b
  74.      Power = -MaxSpeed;/ }5 ~$ {5 X3 u8 R! c- ]
  75.   } . a; O: T) X% u& p7 d
  76.   motor_10.run(Power);
    4 ]2 u9 V; Z! `. B( Q. U8 ?6 x
  77. }  
複製代碼
/ u3 a% W9 e* Z5 n3 e& A5 c

& v% J7 G  r1 w& C8 o. [8 J
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
% `& _$ N! L8 t4 B  W
  Q/ I: e8 P* ?# m: ~您好,不知是否能向您請教。
$ o; M' X% ?4 @5 Z. u  c) U目前和宋修賢老師在處理Ardui Car5 h& h$ R3 Q" j& f1 i
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
0 ^! D$ `: z! ]% F( e  _5 I# D
: B) o% g" b8 K6 b' y4 C! D4 q! Y# S但基於想追求更精簡的程式所以還是想請問一下3 K) I0 G9 }) W* w! m) o, c% B2 i
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
( G- [4 g5 W0 u! w6 x% S6 a不知道您是否願意教我可以如何處理5 G0 I. y% ?* U- @5 h: A8 v& v4 [
0 F; Q0 h+ b# P0 o6 Z1 _

0 \6 n; ^4 b8 x以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;! ~) U* |4 Z# U
  2. double CNY70Val = 1000;6 E2 T" h- Q' }. N  j
  3. int interror = 0;
    : \" u1 p, y$ h# d' b3 {1 D
  4. int olderror = 0;) a" W. g) x5 [( u
  5. double values;
      W. _* N2 }; [* w
  6. 1 ^7 \. L( N; z8 Y" e5 Q

  7. + T5 \- ^; K8 I4 u
  8. void CNY70()# D. m: F% E' {8 _$ \
  9. {
    ; _  y* w' l2 f' |0 t" B
  10.   valuesRR = analogRead(RR)8 m" x& N% Y8 Q
  11.   valuesMR = analogRead(MR);
    ! q# u# {" E& a/ _6 V4 N) e
  12.   valuesMM = analogRead(MM);; I" P6 R  y  t. N4 a2 I! @% S
  13.   valuesML = analogRead(ML);3 J2 \" O8 E# P+ V2 U
  14.   valuesLL = analogRead(LL);
    % R- I2 P1 L9 g$ `$ \
  15. . k0 c0 K9 b2 Z$ ^
  16.   if (valuesRR > CNY70Val)
    + X! F% r: O2 d( R1 S) W. W5 u
  17.     valuesRR = CNY70Val;& x; v% f0 i+ h$ S0 d9 P( w" @6 e9 D
  18.   if (valuesMR > CNY70Val)0 r# v2 ^1 M' f
  19.     valuesMR = CNY70Val;' d; K: d* ^0 m: v
  20.   if (valuesMM > CNY70Val)& p- d+ |) B! ]2 a% y8 q! O. N
  21.     valuesMM = CNY70Val;
    8 }: H$ [5 X0 e2 R4 L! j
  22.   if (valuesML > CNY70Val)
    ; w5 I  g6 h% U; n2 g
  23.     valuesML = CNY70Val;
    $ O2 C1 l0 R& F) f; V! Y; z: T
  24.   if (valuesLL > CNY70Val)6 c/ L/ ]  C1 h/ {
  25.     valuesLL = CNY70Val;
    , E. p! Y6 J- A

  26. 5 ?" ]  Z$ `* E
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;) j; u' b8 U5 d* j
  28. }0 x$ A( p* r$ s" u7 ^! {

  29. 2 x5 i, [4 ^  H( a. q: A7 ?! o5 S
  30. void Car()
      g# Q" }$ R" ?# \0 T
  31. {* L8 t  z! y/ b. q* I
  32.   while (1) {
    : z2 t5 c  r+ O& g# ?3 I' k( R) f
  33.     CNY70();' w! G+ S  K1 @1 ^6 O7 _! b
  34. $ s1 T( y8 K) V- j$ K
  35.     int error = ((int)values);" O8 k) c. \* Z7 `
  36.     interror += error;
    & K& v/ a4 c/ C( ~) `
  37.     int lasterror = error - olderror;
    ) s) Y, R9 b2 ]( V
  38.     olderror = error;0 T- N! c$ n6 G7 M
  39.     int power = error / 5 + interror / 10000 + lasterror;  _4 u$ T9 X5 j7 z6 t

  40. ) h' ?% e2 W- x8 i8 e$ P
  41.     if (power > MotoSpeed)  t, B! }. A5 R, Q
  42.       power = MotoSpeed;3 f$ Z6 w7 |3 P1 E  s" \) d
  43.     if (power < -MotoSpeed)
    3 v( R/ [1 s1 Y
  44.       power = -MotoSpeed;3 }/ E7 l6 L5 ?) K0 G9 h) x
  45. % u0 t0 F1 ~5 W$ J1 A1 f1 }
  46.     if (power > 0)( h" ]! w3 H1 E+ H* t
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。2 G+ N. v( n2 v! p5 ?
  48.     else5 }8 L9 Y: @( o, E, R
  49.       Speed(MotoSpeed + power, MotoSpeed);
    / t, ~0 x+ w# @7 `: W1 N+ F
  50.   }
    : B7 W3 A" R2 V# D% \
  51. }
複製代碼
1 R* H/ |1 Y6 e: |
4 D" k( R! W& K' `. p7 k# I0 F" T, c
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-10-21 01:57 , Processed in 0.025254 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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