圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21722|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>9 u) b- ~  y# c6 f/ x
  2. #include <Wire.h>8 u9 j) o; C  F1 z! C
  3. #include <Servo.h>
    % |% g' K# f* g+ S# m5 u- e
  4. ) Z8 O) q1 H: O% n( o* `  A
  5. #include "MePort.h"
    . y+ Q% C1 [8 A+ e( z9 Y
  6. #include "MeUltrasonic.h"
    - y) e, ~( T+ ~5 C4 I( r
  7. #include "MeDCMotor.h"% S) n5 ~+ q  J6 I: @0 s3 n
  8. 3 r( I2 d4 g* z
  9. //double Input, Output ;5 l- S0 s$ w6 }: w( E5 q
  10. float MaxSpeed = 255;
    2 j/ [( A& Y7 m. S- G9 v
  11. float MaxPower = 180;
    ! f6 V3 e/ W/ U; r1 ?
  12. float MinPower = 120;4 q+ k+ x& ^' c1 b0 M- |% R
  13. float Error,ErrorAcc,ErrorDec;
    2 B' O4 f5 k7 W; N  d- D! o9 i! l

  14. 0 p' U  l; \6 d7 y7 [, T
  15. float Kp=0.14;% Z0 Z8 p. {, {4 J! t9 ~: c9 ?  L
  16. float Kd=0.00020;//23;
    ! f$ B/ V, L* Y5 A+ \( _
  17. float Ki=0.000201;
    9 s7 X* u8 A5 b  Q2 Q0 O/ l

  18. 9 S! L! a( f! ~7 c# q+ y! [
  19. float nPower;
    ' e$ ]' Y  \& f/ ~" {$ l' @7 `* W
  20. MePort lightsensor_6(6);
    % H0 ^! }' b2 ?9 a& Y8 e
  21. MePort lightsensor_8(8);, O; o7 q6 i8 |; ]9 q( ^
  22. MeDCMotor motor_9(9);
      Y1 G! }7 o2 y1 e& U( {  V% O
  23. MeDCMotor motor_10(10);
    0 w) W3 y3 L4 H4 X; q
  24. unsigned long previousMillis = 0;
    1 q+ b/ d( {) [0 q
  25. const long interval = 1;- P/ T% v. t% F2 v
  26. , M8 p, K4 e, v; l$ L3 M( b$ v
  27. void setup(){
    9 Q0 l: y! g( Q3 ~! ]
  28.     lightsensor_6.dWrite1(1);. v- N& G/ y' ~5 T9 V' Z
  29.     nPower = 160;, R% E  ~. E. g
  30.     Error=0;
      V1 h! R% P6 u
  31.     ErrorAcc=0;9 [4 q, r, d) P/ o9 {; f/ [
  32. }
    6 B) R5 l% n! a& L/ Z8 ]
  33. 3 _, N- {, T) p6 k
  34. void loop(){4 X- W$ `$ S: E
  35.   unsigned long StartTime = millis();, z7 U. ?4 P% n5 E
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    8 s( G$ O+ j. O3 I0 b
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ) y  P7 Y) ]. {* J
  38.     ErrorAcc +=  nError*Kd ;
    / u6 x( t, @# o3 Z
  39.     ErrorDec -=  nError*Ki ;% D: R0 ]4 l( Q, e9 l; b
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ! R) t' z1 S' ~! J6 E/ ]$ q
  41.     if(nError < 80 && nError > -80){2 a7 Q% f5 A( o7 V. D
  42.       if(nPower < MaxPower){
    % z- A5 ?1 f& I, R0 A4 U$ J
  43.         nPower += 3;
    4 G' F# L* a# [5 t2 R
  44.       }1 D7 s4 A2 q  E+ c9 y7 [( [7 k' h9 T% X
  45.     } else{
    3 ?$ Y& h* g7 ~1 o6 N
  46.       if(nPower > MinPower){' P3 ?, T* k% I2 _3 w- ?. g
  47.         nPower -= 2;' F7 i1 }& O0 ^2 Y
  48.       }
    3 g( X6 p  h1 f/ i+ f
  49.     } 4 c1 Y, ^8 `+ A( q7 p- V- }! I
  50.     MotoL(nPower-Error);
    $ }" n  S* R/ g! D* D
  51.     MotoR(nPower+Error);    + U: \; e' x9 u: n- u5 p9 }
  52.   }else{
    : Y0 i4 G% Q' L1 j# e+ T
  53.     motor_9.run(0);( q! U' Q( }" O! q
  54.     motor_10.run(0);* u# J+ I! H% f* P- A! d
  55.   }  z3 e7 R* t9 ?- k9 t" L7 C. P6 x( k
  56.   do{}while(millis() - StartTime < interval);8 z) {5 ]6 G% R0 k
  57. }/ _4 ]' E7 l: i9 F! U6 ?

  58. " G6 _  F3 h6 p4 _# j
  59. void MotoL(int Power){: c& \- E: w. b
  60.   if (Power > MaxSpeed){
    % z5 u1 [! N9 j: c. }* |
  61.      Power = MaxSpeed;
      `" T% [9 ~6 [5 g. d+ B$ ^  Z
  62.   } $ x- a2 X$ \. b1 a) [2 o# S
  63.   if (Power < -MaxSpeed){
    7 U2 l! J0 u4 M9 G. s
  64.      Power = -MaxSpeed;/ W3 d6 b! M% n2 {" `
  65.   }
    , Q% _) w1 `4 R* l/ q
  66.   motor_9.run(Power);- q7 K) x5 \) U- @( U' H7 S
  67. }  6 @9 V+ l) {' {
  68. / ^0 K1 ?) d4 j" ~* S( G( ]
  69. void MotoR(int Power){
    ) a; y+ z) R! m0 X5 F! ~" N
  70.   if (Power > MaxSpeed){/ F  F' n9 O& U' S
  71.      Power = MaxSpeed;3 `% P/ L5 w. U1 c+ a
  72.   } 9 t% z0 J; u+ W$ N; |
  73.   if (Power < -MaxSpeed){. A6 j. v& }/ f) O6 G2 R6 e
  74.      Power = -MaxSpeed;
    6 @3 C' t/ [: @7 }7 G8 E# m
  75.   } % s! S- h& T+ H4 l. W: w+ c* p
  76.   motor_10.run(Power);
    * T7 u% B( C1 R+ ^
  77. }  
複製代碼
) S- }+ @5 T9 V9 ?+ \7 ~5 {% E

5 y7 Y2 h! M! Z; i( n
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
8 b; ]' z2 w0 ?& P$ t: a6 D- H, g
您好,不知是否能向您請教。; [( j3 U, \1 g& i. J5 f! r8 s6 _
目前和宋修賢老師在處理Ardui Car: K( a! i* z2 H) w5 T  K
雖然已使用較繁雜的方式處理了跑出黑線外的狀況: q% D, a: c* z' E0 @6 v4 [; M4 i
1 u5 v" `2 i3 Q5 H9 [1 a
但基於想追求更精簡的程式所以還是想請問一下; ~& {6 z1 e+ v8 l# z* _
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
) ^: `4 Y3 K) d6 ^9 b- H5 ^9 w  u不知道您是否願意教我可以如何處理% }1 k1 ]: y1 ?) S
8 e( _: }. s- {  c
2 ~* w# t2 p, [9 W: k. h; J; \
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    / }: t  K7 k0 T
  2. double CNY70Val = 1000;) ~  w, R) C. a
  3. int interror = 0;
    3 L+ k8 J8 \9 ]5 R
  4. int olderror = 0;
    7 r* ]" ]$ |1 W1 `+ O5 j* s
  5. double values;
    + t* n9 I  `. J- L
  6. 0 U& A  q; j, a$ e
  7. 1 z9 B0 b7 M) \3 S& P. J4 Y
  8. void CNY70(); F7 L4 G, K. ^) J7 w
  9. {9 U1 G0 @! _: Q
  10.   valuesRR = analogRead(RR)
    - Y/ F6 G4 q& y7 F  V
  11.   valuesMR = analogRead(MR);: g, {) F0 D, d, x. p5 |( T! v: c/ ~
  12.   valuesMM = analogRead(MM);
    , {2 Z1 {, v3 r3 u6 O5 ^$ w$ E
  13.   valuesML = analogRead(ML);+ a# h* P- C' O/ l% h, `$ x
  14.   valuesLL = analogRead(LL);+ x" m" e5 u( x- H. A: d- C

  15. " Q4 r' X. e" J; a) l
  16.   if (valuesRR > CNY70Val)
    9 @: e$ y6 [% L
  17.     valuesRR = CNY70Val;
    4 ]- A; X) e1 w( q7 `9 A
  18.   if (valuesMR > CNY70Val)
    " N' A, ]; p% i: P
  19.     valuesMR = CNY70Val;
    % ?- g& D. G" z' l
  20.   if (valuesMM > CNY70Val)
    2 I5 j0 R8 ?0 `. ?+ q5 J9 g
  21.     valuesMM = CNY70Val;
    6 o- `* `- T- _% P8 U  W
  22.   if (valuesML > CNY70Val)
    ) u; T- f3 r* |7 t
  23.     valuesML = CNY70Val;
    3 _/ d" \2 I( @6 ^
  24.   if (valuesLL > CNY70Val)
    8 d* S6 \1 x, T
  25.     valuesLL = CNY70Val;
    8 a) i2 N! ?: T: H; e( r

  26. . D; R2 Z4 q  S! Z+ q8 o( g( G0 Z' I& y
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    / t) L+ g7 c# f' N& V
  28. }* |7 u, M* k. T: j+ V

  29. & P/ g; [8 Z. N. n
  30. void Car()
    : O" S5 Y4 N! O/ r7 I
  31. {* x' T& \$ i4 @$ u6 \2 N
  32.   while (1) {
    % g* s4 ^( j: Q" e! P2 E/ q
  33.     CNY70();
    7 ?$ N0 H' A, p0 t

  34.   Z/ L% a0 I8 v3 ?( `9 p
  35.     int error = ((int)values);
    : J3 {# M2 j3 ^0 b) f
  36.     interror += error;
    ' Q( H2 S; c0 v# m
  37.     int lasterror = error - olderror;$ P0 x8 M( |  t5 {: m" y
  38.     olderror = error;
    2 `. B* r4 r7 {. }$ G
  39.     int power = error / 5 + interror / 10000 + lasterror;0 m- K5 u% m6 x/ D" w  {

  40. 7 h* g" }! R) M5 z5 x& C
  41.     if (power > MotoSpeed)
    4 i) C. Z0 E! E
  42.       power = MotoSpeed;- i8 y( C; O5 P' z9 X
  43.     if (power < -MotoSpeed)
    9 A+ n. t+ g4 e
  44.       power = -MotoSpeed;
    * z$ K* j6 G4 a4 R, Q* B! I% m

  45. & ?! {! o( V1 b6 }+ @
  46.     if (power > 0)
    + }$ h6 C3 [# f1 w+ h$ Y( G
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    + Y- s& O1 i2 e
  48.     else
      h7 |. M- m' H
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ' \* A8 j) E8 M% U8 C) ?
  50.   }
    ; R8 w: B2 j  {. C2 D* y% u
  51. }
複製代碼
: ~" r, R0 ^9 A# `+ j4 R
8 y9 a) V* v* `2 `3 f
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-27 00:25 , Processed in 0.024901 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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