圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21676|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    8 W2 q9 F* B3 N( A1 L
  2. #include <Wire.h>
    5 q* u" N' c! C+ J6 E
  3. #include <Servo.h>
    5 @* x6 o8 Y' r' B/ K% D
  4. 2 S4 w* d% q9 D- Q4 n2 m
  5. #include "MePort.h"
      {* t9 A) r- v9 N' P" B" K
  6. #include "MeUltrasonic.h"
    & M0 E, x/ M' @; K5 \
  7. #include "MeDCMotor.h"
    " e2 W! u- d& t; U
  8. - d( R4 B9 Q2 Q. n" J; f
  9. //double Input, Output ;* y% l  }2 _8 l+ w
  10. float MaxSpeed = 255;
    + r: `& i6 m! J% I/ h" M: |2 d& o5 s
  11. float MaxPower = 180;2 h9 d. u1 n2 ?6 y
  12. float MinPower = 120;, c$ K, A# v. f0 \& a% e* k6 w
  13. float Error,ErrorAcc,ErrorDec;
    ) j/ c& n! @$ }6 P0 G/ _

  14. ; \9 u  @2 T- ?) u2 J- P6 d, j
  15. float Kp=0.14;
    8 L6 R: }4 v" s% l, |/ u1 L
  16. float Kd=0.00020;//23;
    . w& c/ y4 z6 v$ ~! v# r) [& T9 R
  17. float Ki=0.000201;
    9 g5 ]5 H* _: ?

  18.   \' j" q! V0 k* j9 [/ |/ |; Y
  19. float nPower;
    / O4 F# L6 F- C, r  p7 }& X
  20. MePort lightsensor_6(6);
    " B  m$ V6 v( Z
  21. MePort lightsensor_8(8);
    " a& D, M! i0 _& T$ M5 E; q1 a' Q6 H
  22. MeDCMotor motor_9(9);
    + U; n) g( r" _" P& ?9 i6 i
  23. MeDCMotor motor_10(10);
    ; G; c4 ~" U# [3 q; D
  24. unsigned long previousMillis = 0;
    + ?2 [/ n+ D" }# c5 g4 U
  25. const long interval = 1;8 v+ Z5 f. |9 A* P' @
  26. 3 |; `; U2 A" ?) s. x( j
  27. void setup(){' P9 O0 K4 R5 i0 \1 W2 C' p
  28.     lightsensor_6.dWrite1(1);7 Y0 ]' L1 r% L; U& @* `' u
  29.     nPower = 160;
    4 u$ s1 ?# a$ C
  30.     Error=0;5 w( ]4 ]6 s! A! i9 R! d' A
  31.     ErrorAcc=0;% s" h. c6 U' Z# K& k1 d
  32. }
    4 q# |8 x0 n- R' W0 F; ^

  33. 1 r5 J9 M, e7 Q8 Y
  34. void loop(){! n- ?; n2 r1 T3 g0 ~
  35.   unsigned long StartTime = millis();7 B( H; q6 ?/ q
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){1 ~" \- @# h* X4 T8 [
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();. W7 e6 \: w' f% O
  38.     ErrorAcc +=  nError*Kd ;/ N$ h6 G7 r+ F6 c
  39.     ErrorDec -=  nError*Ki ;5 J/ Z7 H# k1 l  R
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);, X- e# |# {& o# b$ \4 ~
  41.     if(nError < 80 && nError > -80){( b8 a3 v  l0 b
  42.       if(nPower < MaxPower){1 K2 x" D! I8 D9 y/ p: m" n" V
  43.         nPower += 3;
    1 `6 f. I& B" T3 b( r
  44.       }. m# Q  y( `7 _- p
  45.     } else{0 o' E8 t, S! ?: M' V
  46.       if(nPower > MinPower){2 w+ k  b  N; `, W) a. v" L
  47.         nPower -= 2;3 l( _* b9 D/ Z/ k4 u( s
  48.       }
    + c( v# |3 s; _7 E+ d/ i
  49.     }
    . }* S& `8 C" x" L2 k0 `
  50.     MotoL(nPower-Error);
    . V. e4 r$ a9 i1 o; }# c$ e
  51.     MotoR(nPower+Error);   
    9 e  o- I& Q8 n
  52.   }else{
    ) T$ E: E1 H4 U4 E% s: e  m7 q2 d
  53.     motor_9.run(0);
    7 H& [; w2 S: `- h; @, k0 n2 ?
  54.     motor_10.run(0);: H: J% P' z" _# @* E
  55.   }
    $ Y0 Q. U2 _$ _  `* \6 ?
  56.   do{}while(millis() - StartTime < interval);& E% ?9 r% j4 r* t( Z* F! ]5 n
  57. }
      i' ]3 d. R6 G

  58. / A! E0 {, q2 v8 m
  59. void MotoL(int Power){) N1 U: n) R. ~3 r6 C
  60.   if (Power > MaxSpeed){
    : H" W; b1 D1 K4 V7 m
  61.      Power = MaxSpeed;
    ( m$ j  }1 b, q
  62.   }   @2 W, _$ E6 ]( \+ y& K
  63.   if (Power < -MaxSpeed){
    ( Q. b: G# R0 @% v/ s
  64.      Power = -MaxSpeed;
    # ^* p  }; b+ R' _. R
  65.   }
    ' l: p% T: Q! |5 C; J
  66.   motor_9.run(Power);- z3 @- q: M$ R7 C! j" |" d! p+ x
  67. }  ) U; [6 g# g2 a
  68. ) X9 ]" K6 G) K/ m7 k* N* ?$ n4 u
  69. void MotoR(int Power){
    , F2 @! V4 R, |+ r, }9 _
  70.   if (Power > MaxSpeed){7 B8 E- V7 n( t
  71.      Power = MaxSpeed;
    6 v" x' y* g0 _; I: Y( D/ I
  72.   }   I& Z4 k" I& M0 U: L: ~
  73.   if (Power < -MaxSpeed){
    0 @' V& l& q, {9 E, B8 }
  74.      Power = -MaxSpeed;& A' g5 M1 w9 S1 Q: {$ J  x
  75.   } 2 I& b* q1 o* N. s; s) F$ ^
  76.   motor_10.run(Power);3 a- O, k' ?$ f9 m1 }
  77. }  
複製代碼

, K0 b' c3 I; Z* c* `* `& B
- I/ j7 |7 y; [; E8 y9 k- H1 n" X
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
  }7 D) }0 `* Q* d/ X7 o7 P0 l; M1 i7 o
您好,不知是否能向您請教。( a6 E' d# r$ G2 l
目前和宋修賢老師在處理Ardui Car
6 k/ R8 m! K; F3 A9 }雖然已使用較繁雜的方式處理了跑出黑線外的狀況; y, @& l9 g- P$ A% m2 M

, @! ?+ V' w) m  S( i+ @8 }# i' k但基於想追求更精簡的程式所以還是想請問一下
5 V8 D+ [; N2 O4 Z就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝3 g" Z, E! c2 H7 q
不知道您是否願意教我可以如何處理
; W; [1 P- }0 `  \
* ]1 m5 n  p2 g8 a4 W$ F
$ d7 J2 ~$ s$ p# G* l, J( t以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ! m9 U) \- p# b6 U8 G! m
  2. double CNY70Val = 1000;+ e" F7 V: e3 t; {+ @
  3. int interror = 0;
    - V& O: u1 ?1 B$ k
  4. int olderror = 0;* r: X/ {( g  ~3 Y  B2 Z
  5. double values;
    - a9 _3 w' i9 p3 Y/ [5 c) y5 v) Z

  6. ) C; r+ }) I2 N9 I

  7. ) ]; G+ U& ]$ f
  8. void CNY70()
    % b- A6 ~; u2 k( \
  9. {
    2 B$ n, B; h# J6 `% d; x# J1 ]5 N
  10.   valuesRR = analogRead(RR)+ T  b- Z4 w$ n3 S+ F- l
  11.   valuesMR = analogRead(MR);1 G! n% T2 d) t0 s: u$ G, K# b- y
  12.   valuesMM = analogRead(MM);0 P' I- a% l! O. s5 l' v7 K
  13.   valuesML = analogRead(ML);, T- v3 q, [4 d5 `
  14.   valuesLL = analogRead(LL);* v0 Z  P$ y- |$ h6 W& G" Q8 ^4 g  l

  15. : l" {0 B; S. }; M& P7 B6 h: B
  16.   if (valuesRR > CNY70Val); z+ O1 u: H1 v$ G3 j2 J8 t
  17.     valuesRR = CNY70Val;6 `8 x0 Y; |9 V- G& P3 O# Z, [9 W
  18.   if (valuesMR > CNY70Val)
    * ~* L- {% Y/ ~1 l% ~* ^$ g9 A
  19.     valuesMR = CNY70Val;  ^) D5 d; F& t  L" }
  20.   if (valuesMM > CNY70Val)* p7 p# o/ m- {; j' @' _; _% l
  21.     valuesMM = CNY70Val;
    2 A" J4 h5 i3 V) `( Z
  22.   if (valuesML > CNY70Val)7 h$ `: m5 H2 z8 m; T9 \0 |! l
  23.     valuesML = CNY70Val;
    3 w0 G  e( T( ^$ b2 ^, X; S" ]
  24.   if (valuesLL > CNY70Val)# @. f; S  {, i0 f. n! b
  25.     valuesLL = CNY70Val;
      B* Z/ A/ X7 K& w! v9 V0 b$ J

  26. 7 d; `+ e% }) t0 w: A
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;7 g+ }& L4 y" T1 L0 F; R
  28. }
    % `" V: s$ I1 d7 S5 v
  29. + ]7 R! B6 |0 \
  30. void Car()" I" {' N5 y9 i! \; w- W
  31. {/ U/ X2 c1 i4 H& j+ R
  32.   while (1) {, T% U! I- D! g' x# e4 {- x; E* ?
  33.     CNY70();
    1 I3 G' x" l9 F0 |4 }$ s, t

  34. - T) ?/ l  w! i; y
  35.     int error = ((int)values);4 d3 W) R8 E8 Y- \; [2 ~. ^  \0 f3 u
  36.     interror += error;
    ' }1 u1 p5 e5 Z5 [, ]
  37.     int lasterror = error - olderror;: C9 ]) O/ d/ ]. S% E9 o- ^, |
  38.     olderror = error;5 [5 u0 j# K* X$ o2 g; \( x7 _
  39.     int power = error / 5 + interror / 10000 + lasterror;
    2 y  ]* o2 p* }% S
  40. 6 K4 {. K; L; x' z2 W
  41.     if (power > MotoSpeed)3 ?) i) P2 X7 K) i$ {
  42.       power = MotoSpeed;' ?0 Z0 K5 G/ u+ W8 z4 o4 ^1 }
  43.     if (power < -MotoSpeed)( n3 ^" I4 H, E8 @
  44.       power = -MotoSpeed;
      a% L' _' J  W2 _" ]5 I
  45. " }% J8 W  f- x; g+ x5 }
  46.     if (power > 0)+ t1 |- N6 G4 _& B" q8 t
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    3 I( u3 i8 i6 q/ H6 O
  48.     else
    . W% }5 U7 P- u2 W
  49.       Speed(MotoSpeed + power, MotoSpeed);
    7 u/ x3 K8 E* ~2 K5 C
  50.   }
    4 i# H# ]5 ~5 X
  51. }
複製代碼

' v' ^& i5 \$ A0 c* Z  Q
# @* A/ [9 R' I+ V! W- ^" b
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-19 14:46 , Processed in 0.024285 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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