圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21711|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>- j* Z% e  X6 h4 S
  2. #include <Wire.h>+ }" _* o+ I3 d
  3. #include <Servo.h>
    7 J& T4 @+ O! F0 e6 {: }) K5 ~

  4. ' u+ ~* k/ @2 z8 }( f- O
  5. #include "MePort.h"7 w" @0 S1 z7 }, g# K( y9 M6 e
  6. #include "MeUltrasonic.h"" ?+ [' _  J8 s) O# \
  7. #include "MeDCMotor.h"  T# A( r4 @0 D
  8. # D, g/ U1 {( L, U4 L
  9. //double Input, Output ;, H# l; J0 Y  r. r) Y3 r: r. `4 g
  10. float MaxSpeed = 255;
    - g. y+ x' E. V$ w$ A
  11. float MaxPower = 180;5 |# P9 Q) O3 X% D' I
  12. float MinPower = 120;# b3 Y" n9 _/ ?9 u( k9 ?
  13. float Error,ErrorAcc,ErrorDec;
    ! L5 `# }$ r5 b7 v7 Q

  14. - u$ C; D1 _6 |2 W5 s4 s3 y. ^, g
  15. float Kp=0.14;# s2 \8 y) k* P7 `0 h5 |+ o0 P+ s
  16. float Kd=0.00020;//23;
    1 V" o% Z" k$ R: q
  17. float Ki=0.000201;; }! s4 Z, `4 d- r) o5 k
  18. 5 j5 l" Q; a4 e. r
  19. float nPower;
    + Z3 m' G  r0 p0 k: F8 D
  20. MePort lightsensor_6(6);
    & i- q& K- c5 ^; k
  21. MePort lightsensor_8(8);9 e/ P4 R3 S) v/ W' a
  22. MeDCMotor motor_9(9);
    ! I9 i/ H* r1 i2 m' c
  23. MeDCMotor motor_10(10);* q. j. R* C( F( I. T
  24. unsigned long previousMillis = 0;
    + T; O9 W( ]' E
  25. const long interval = 1;  I- i' L& l& ^9 }: `
  26. . ?7 L! g  @' H% M# X8 _! t# H
  27. void setup(){
    ; Y9 B3 F$ D; @/ W+ \- P
  28.     lightsensor_6.dWrite1(1);- U$ R  b* v) l: J" w6 \) v3 o
  29.     nPower = 160;
    5 Q/ u, |# f, t- B
  30.     Error=0;0 H; I. z; C0 {: b
  31.     ErrorAcc=0;' ~5 p1 s) X& H$ ^7 \) w( z
  32. }
    # \, }7 H, @! [; A. v, x: s
  33. ) `0 c+ M* B! [* r
  34. void loop(){
    # `' \+ r" ?4 S! c
  35.   unsigned long StartTime = millis();# z3 r; k0 Y& C7 J  K/ O3 e7 C; o
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){- l7 E5 J/ t- N$ Z. }( s4 e1 o4 e
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();+ s% L. B5 U1 O( e; d
  38.     ErrorAcc +=  nError*Kd ;  F& O- C5 d6 X, g4 O
  39.     ErrorDec -=  nError*Ki ;0 D& v7 T3 A$ G3 B
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    3 d1 H% C$ u0 a: F% M) M
  41.     if(nError < 80 && nError > -80){
    : _7 m' w* G4 U4 ^
  42.       if(nPower < MaxPower){/ G3 O4 \- y( C, `0 n
  43.         nPower += 3;
    2 I# x5 Q8 N8 B
  44.       }
      t) Y% {  h, y- x! I/ O% |
  45.     } else{
    : ~  g# U# w1 s# a/ ?; w7 S
  46.       if(nPower > MinPower){
    # }- }" B9 ?+ x* d, y
  47.         nPower -= 2;
    3 N7 Q5 h4 A3 T) a
  48.       }" K% M3 r. s- N5 A& {* e  V
  49.     }
    ; e  {7 i9 ]6 D* }. v$ f3 T& k# r
  50.     MotoL(nPower-Error);; N- J9 d' E" q$ f
  51.     MotoR(nPower+Error);    ; i) {6 P( F8 e+ z0 {( m/ l
  52.   }else{
    7 v/ n  P0 f% t
  53.     motor_9.run(0);
    / d* w  s3 t; z) I5 D  j
  54.     motor_10.run(0);
    ! o4 L; P# [: i! P, F) p: V, @$ l
  55.   }
    & C. J9 _6 b4 Q
  56.   do{}while(millis() - StartTime < interval);
    & j- A# f! x1 B1 }6 c
  57. }  E: v' {3 E5 Z; Q5 [- l3 @) g

  58. 1 n% D. m1 b# z' _. X% m* w1 U
  59. void MotoL(int Power){! A9 {' X- e9 G7 z
  60.   if (Power > MaxSpeed){
      O& K9 T4 S. K, @7 U) A0 o
  61.      Power = MaxSpeed;7 W' \9 J& Y' n  ~# ^8 u
  62.   }   z* h5 \$ j/ s& N5 E8 d
  63.   if (Power < -MaxSpeed){
    ; t& t8 f. r. v
  64.      Power = -MaxSpeed;4 G0 k$ v5 Y4 t% V8 v6 U/ H
  65.   }
    8 S9 |/ J" h+ n* B
  66.   motor_9.run(Power);
    * {( O- ~; i2 f/ }
  67. }  
    4 L, ?& O; n  y# v" q% A
  68. ! g% L; \! H7 U3 h
  69. void MotoR(int Power){4 r. P# t5 f! }: q1 m
  70.   if (Power > MaxSpeed){8 _( x1 k, O; F  D
  71.      Power = MaxSpeed;( r7 @. f! G$ ^* o$ V
  72.   } 4 Q, }) q1 X: I5 i0 e8 `9 L4 e
  73.   if (Power < -MaxSpeed){/ b  Y# n/ V7 H3 e2 S/ {% c! d  v
  74.      Power = -MaxSpeed;7 c% k% g5 w* }/ @
  75.   }
    0 e# g0 D; r; n1 i. @! S+ F8 K
  76.   motor_10.run(Power);
    ; {+ C1 Z% |: o, j: ~
  77. }  
複製代碼
* t' N: l  r2 O% }, e# x2 ^3 r
; w1 P/ t) O  L  T% V# h
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
, C9 \& }! A* T, }1 f# ~
' A6 G8 y$ u- k- T' w9 T您好,不知是否能向您請教。
4 O) A" W: |. j目前和宋修賢老師在處理Ardui Car$ u# v& a- c: G+ Q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
/ t3 U9 I, M  [
1 ?) Q  Q" ~; {$ {4 |但基於想追求更精簡的程式所以還是想請問一下
+ P! j# E; Z) c就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝( k4 A, I3 F+ v7 _; w) \
不知道您是否願意教我可以如何處理
0 t( C% O) ~$ N; F
# Z! E  ]0 q9 w1 L5 ^2 U" ?, P2 O1 T8 n8 p+ z
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    + E: U/ z8 e% T( i
  2. double CNY70Val = 1000;
    6 R. e0 g* H: q) D
  3. int interror = 0;
    / s. f! K+ |' F
  4. int olderror = 0;
    - W; V, C) d" ?+ w2 G# o
  5. double values;
    - ]" H; e/ ~. j2 ^
  6. - g! l' x1 U5 M! Q

  7. - y( u2 j9 y: d4 z
  8. void CNY70()
    9 h3 z& a; `4 b, i
  9. {
    * H8 N0 k# G" b+ X0 Q  k! K
  10.   valuesRR = analogRead(RR)
    / t; R$ K4 U6 G7 A0 t, z5 V
  11.   valuesMR = analogRead(MR);# s# U% B/ Z3 {& `
  12.   valuesMM = analogRead(MM);
    # E- b7 q$ n* t% ]% B; o, r
  13.   valuesML = analogRead(ML);
    , Y6 K0 r7 ~$ ~2 G& e3 N* T
  14.   valuesLL = analogRead(LL);
    ' K$ f9 o" g! T: j- d4 P

  15. " v1 X/ S3 z1 s8 A8 m
  16.   if (valuesRR > CNY70Val)
    * u- _9 i' ~% @+ f9 y% y
  17.     valuesRR = CNY70Val;) G2 \: }# s' Q: ]8 h
  18.   if (valuesMR > CNY70Val)* n( Z/ u  V2 n( S+ d1 n3 e
  19.     valuesMR = CNY70Val;
    ( `3 X" n% v- i* C
  20.   if (valuesMM > CNY70Val)6 c1 _* D* `: _  }' w
  21.     valuesMM = CNY70Val;0 w$ N' n0 Y  x! Y+ h
  22.   if (valuesML > CNY70Val)5 ?8 D) p% F% L2 a' T4 s! e2 P
  23.     valuesML = CNY70Val;
    $ U: V+ k( C  Q6 p7 U) p4 W
  24.   if (valuesLL > CNY70Val)
    3 f  i) x6 t( j& q- s" v
  25.     valuesLL = CNY70Val;+ W/ o. A) B) ~  d0 T0 i/ B- M' h1 h" a

  26. $ F, U$ n5 X/ r6 ^+ e
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    6 c% S% F! U) k4 {
  28. }7 U% _& I4 U3 u2 n$ W
  29. / C9 ^9 W0 B1 W8 o7 G0 ^1 }
  30. void Car()- x  T* A% _0 Y! _6 e
  31. {
    & o1 |; O& I' f8 d7 L
  32.   while (1) {
    ( U' }: |7 ?3 L  Y$ q" z
  33.     CNY70();  R8 m7 v; m9 p$ l1 G* n0 j; S
  34. 1 `- L1 x7 ~' a& A; G$ ^8 r& F
  35.     int error = ((int)values);
    ; v+ w+ K& A5 B+ ?# T" i# h" L
  36.     interror += error;
    9 y) t- O! V0 T; q5 R6 N
  37.     int lasterror = error - olderror;
    ; H! k/ P1 |! N! p
  38.     olderror = error;; i* G" k" I. G/ P! J8 d! G! I
  39.     int power = error / 5 + interror / 10000 + lasterror;
    , I& m. }* n, L! ]
  40. . b# a* r! J1 @6 }5 z, h# X
  41.     if (power > MotoSpeed)$ x1 _. ]$ B1 B  |
  42.       power = MotoSpeed;4 Y) c+ t1 ^7 o! N  d
  43.     if (power < -MotoSpeed); l9 O: B: ?& V0 l( h2 h1 k
  44.       power = -MotoSpeed;
    : [+ d  y( F2 U

  45. 1 @9 _  E$ \9 g5 E5 ]
  46.     if (power > 0)
    ' B/ J8 \+ `: j& v+ \" r( V
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    9 t1 s. x, ~) C2 b7 a+ v2 g
  48.     else
    : o4 g% Q; V( d+ ]
  49.       Speed(MotoSpeed + power, MotoSpeed);
    9 i, N/ C; X- z# ^6 Z9 r5 e
  50.   }: Y# X7 X8 z0 z' S5 G! q1 y
  51. }
複製代碼
# F/ a. q  _3 l. s" W+ a! ^# ?

4 R" @: w: l. z& ]# K6 g" i) r4 |
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-25 22:28 , Processed in 0.026682 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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