圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21379|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>, `6 B5 O! M3 Q# c
  2. #include <Wire.h>
    ) J7 F, @$ s- H) B) g/ w
  3. #include <Servo.h>
    0 c0 u( E: ^( ~0 W! e. q
  4. ( [% R( y3 u% p5 n, Y" o
  5. #include "MePort.h"
    " q5 x8 x5 M! W- S
  6. #include "MeUltrasonic.h"- _" N9 G) Z2 f# z8 l+ M0 S! u3 F
  7. #include "MeDCMotor.h"
    + t: H8 f! H: @' M* ]

  8. & J2 I1 r6 s% ~) M- e
  9. //double Input, Output ;! Q5 G4 J6 M" x$ C
  10. float MaxSpeed = 255;3 j0 a3 I% @. p' w: }" s) ~+ s0 M
  11. float MaxPower = 180;' T$ ~3 w7 M1 V
  12. float MinPower = 120;8 Q: F$ ?: z0 O, H& M
  13. float Error,ErrorAcc,ErrorDec;
    ( O5 m6 ~' n5 }. {9 N1 b/ M% @' F
  14.   K9 _. C; [, |' ~# i; D9 V9 f
  15. float Kp=0.14;  _% F5 J4 c  H3 o. C3 ?6 K& y
  16. float Kd=0.00020;//23;
    9 p/ ^4 f( ]  Z, B+ y0 L
  17. float Ki=0.000201;) A4 X( O0 Y+ w* z
  18. : ^7 e# U; R% B$ o4 q: E% I
  19. float nPower;
    5 h3 n9 l& O/ {) {
  20. MePort lightsensor_6(6);
    ) ^, ]' H& ~( f; u; T' V2 f3 s
  21. MePort lightsensor_8(8);/ s+ ~0 ]; S, M' U6 c8 M" Q
  22. MeDCMotor motor_9(9);
    " b4 z7 e/ y$ S- J) G% Q" f
  23. MeDCMotor motor_10(10);
    7 X1 g1 e# F: X' S' m
  24. unsigned long previousMillis = 0;  E0 p7 G8 m+ B0 S
  25. const long interval = 1;
    ( ^2 f4 B; w1 T/ i6 u' J
  26. 8 j* y( F2 j5 n  s: e/ @- e1 X
  27. void setup(){
    3 n5 i5 c7 H. l; X: {5 v; w
  28.     lightsensor_6.dWrite1(1);
    : M  x8 J" Z( U, E. V$ J
  29.     nPower = 160;
    8 N* X  U9 G# I3 p' H
  30.     Error=0;
    3 @4 X4 X( ~$ F; }, f9 ^; n( Y6 R
  31.     ErrorAcc=0;
    % H3 y4 U6 s4 `4 _
  32. }
    , A' H. l/ ]6 b5 J  T2 z5 s0 L
  33. $ L. A% a; W4 v! @! f$ P
  34. void loop(){  o8 z' X/ z' }; [+ x
  35.   unsigned long StartTime = millis();
    ( ~  F# q7 c; f
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){0 }) }$ P9 L5 \- n2 ?% D) h
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();9 X+ ^! B# s( M/ }
  38.     ErrorAcc +=  nError*Kd ;7 w$ I  F( s2 G: t5 H# S
  39.     ErrorDec -=  nError*Ki ;6 w" e4 E- C1 I" K% J
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    4 p0 l: v5 A0 I0 [6 }7 n8 o4 a) `+ _
  41.     if(nError < 80 && nError > -80){- M. D' {2 x( C) Q+ a
  42.       if(nPower < MaxPower){
    3 x  Z9 b% R1 J% ~' X
  43.         nPower += 3;! E6 \8 q4 C) e; h+ R  W
  44.       }
    2 L7 \. K- Z7 V8 ]! k7 c" h: x% _
  45.     } else{9 a4 p/ ?& l1 e9 [5 v
  46.       if(nPower > MinPower){# }, l$ Z$ k% }8 k; `" v
  47.         nPower -= 2;' }" p; E- o- H* Q( d
  48.       }* v; A/ L/ L" S& {4 P' V! H% K
  49.     }
    ! b% p' t, Z. x% L, L( Y+ X+ m
  50.     MotoL(nPower-Error);
    % }, @+ Z) J. q) B
  51.     MotoR(nPower+Error);    0 y) I7 X* M3 K
  52.   }else{. p+ d3 O# s' W% H! }
  53.     motor_9.run(0);8 N* L! j0 S8 d0 D) Y
  54.     motor_10.run(0);
    3 v! r3 @) U' O. H
  55.   }
    ; L  [4 v' d$ G( Y6 L% m- O
  56.   do{}while(millis() - StartTime < interval);2 z, Z" |2 k. I: ]
  57. }/ S, f. E( m+ o" E6 `  _6 I8 N

  58. % ~) P1 o( z9 D& ?  \
  59. void MotoL(int Power){7 ^9 B& X9 G* @
  60.   if (Power > MaxSpeed){6 C6 i' ^7 w, E% O5 U
  61.      Power = MaxSpeed;. O3 `) w: y9 d9 N* k3 E2 |
  62.   } - m, T/ T' q* _0 r
  63.   if (Power < -MaxSpeed){* i. F& ]5 R. e4 X( K
  64.      Power = -MaxSpeed;* u6 p% _  v* x# B# E2 S
  65.   }
    * Z4 s( H+ S" V9 g! }' T6 k: P# k5 u- X
  66.   motor_9.run(Power);# \2 J# |' a  L/ W- Q  b4 H
  67. }  
    , I& I  T) L1 B9 [( `$ `* z( n. D
  68. ( ?  k: v8 _/ p
  69. void MotoR(int Power){% I  b* `1 E6 A  ~/ z4 t! i
  70.   if (Power > MaxSpeed){) H- H; I5 K  C% p; k
  71.      Power = MaxSpeed;
    9 Q  v7 Y2 I6 R7 Y7 e' k" B3 r' R) _0 L
  72.   }
    - l$ m! ]) ^# H) c; Q% r
  73.   if (Power < -MaxSpeed){) @% G; @/ z3 e. \  R5 g
  74.      Power = -MaxSpeed;4 @9 b$ W# H0 m( ^6 _
  75.   }
    3 r& M; I% m% ]* C% Q, S0 r$ G5 G
  76.   motor_10.run(Power);- [# w) q( s9 k
  77. }  
複製代碼

6 f! r, H/ K; R& H; K) K! _# U- d7 Z( A0 S
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 * y- ]2 @) M. E9 e# a
3 c$ x- P. X! N  [0 X
您好,不知是否能向您請教。. {; L' {  N/ u$ q7 O8 h8 C2 T2 t5 [
目前和宋修賢老師在處理Ardui Car
' x6 e; M1 g2 v  v% y$ n雖然已使用較繁雜的方式處理了跑出黑線外的狀況
6 V. }, N" H) K4 A( I# \$ b
! _' s, p1 R" E" `但基於想追求更精簡的程式所以還是想請問一下
9 ]6 z- X* S4 o2 s- k3 C  k+ {' |就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝3 a/ E* i# z1 E
不知道您是否願意教我可以如何處理
4 p) K# F9 T- x, O, F/ T# I* R& y7 N- e
  ^  r% k- ~7 ], F7 k
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;$ F4 f$ D4 B; C
  2. double CNY70Val = 1000;
    ; b8 B1 d0 w7 O" {+ {( t
  3. int interror = 0;  ~3 n5 v' C, d$ ?: [
  4. int olderror = 0;
    ! Z! E& I0 v+ T
  5. double values;5 J: n: A7 ?1 b; G9 D

  6. 1 |1 I2 f& ~+ P2 e" J+ {# T0 b6 V

  7. 2 p% F) n9 S! s4 A6 M) V% ^
  8. void CNY70()0 P: l1 j% X# {/ f) T
  9. {
    9 i, g) s4 W8 s* W
  10.   valuesRR = analogRead(RR)
    3 p+ w7 Z8 X/ {: V3 i
  11.   valuesMR = analogRead(MR);
    1 D- ]8 O: l" ]
  12.   valuesMM = analogRead(MM);
    . P4 Z1 u' H" R7 w- K/ ?( d7 E: e
  13.   valuesML = analogRead(ML);9 ]' H3 c/ R1 n" p! j# I9 j) E7 F
  14.   valuesLL = analogRead(LL);
    1 k& f8 H) \$ n) @/ P  y% f

  15. ' t: P4 G0 n+ d  G* U8 `: P, R
  16.   if (valuesRR > CNY70Val)" A# w& T! X' V: M1 d! z
  17.     valuesRR = CNY70Val;6 d! H6 z  j& A$ {( e9 m2 C
  18.   if (valuesMR > CNY70Val)
    " N7 a( e/ B6 A$ D" C$ p
  19.     valuesMR = CNY70Val;
    % V* Y" _$ t6 d: s
  20.   if (valuesMM > CNY70Val)
    $ ^4 c% V' M* G3 j; U; S1 Z
  21.     valuesMM = CNY70Val;
    # _, T0 s, f+ k- c$ R. Q" B
  22.   if (valuesML > CNY70Val)
    0 Y/ C- I# Q; l7 o* ]
  23.     valuesML = CNY70Val;
    # I2 L+ r) ^9 d* a3 R+ A6 C5 e. M6 t
  24.   if (valuesLL > CNY70Val)
    3 ~5 \( W9 ]" @/ v) G
  25.     valuesLL = CNY70Val;) \" C% [& h3 i
  26. . {' Z# `4 z, A. k  Y/ g1 p" n4 k
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% |, [- v* Z0 _& q. l' W, G: X
  28. }
    - f: i1 T( p# w1 O' u7 ]
  29. + b5 i/ ~7 C9 j0 f
  30. void Car()
    # t* N4 I- t' Q* c* n: I% `6 n
  31. {3 f7 o9 U! L$ O* q9 F1 E/ @
  32.   while (1) {
    1 }# }3 R4 z# |4 n2 n* ]9 X
  33.     CNY70();
    8 A  K! w5 r" T. Z+ t: T
  34. 8 m" k5 `+ _2 c) n
  35.     int error = ((int)values);* `& t5 i1 u8 U9 A
  36.     interror += error;
    ) j; {' @# b1 \5 g7 _3 }
  37.     int lasterror = error - olderror;7 ?! C" G5 Y6 R: a9 x& ^  `
  38.     olderror = error;
    5 h: \* [7 ?. S! P0 i+ Q/ f
  39.     int power = error / 5 + interror / 10000 + lasterror;4 d7 [& d& Z* d* _0 c5 A

  40. / c+ a+ t5 [; {- i
  41.     if (power > MotoSpeed)" B7 U& Y- K5 N% s9 V
  42.       power = MotoSpeed;
    3 A3 }% {6 h9 R, y; K" j$ }
  43.     if (power < -MotoSpeed)
    ' i$ k/ V# F' V' s$ |( C1 O
  44.       power = -MotoSpeed;
    ( r/ R3 @7 c$ g* Y
  45. " k4 m+ T! V4 f
  46.     if (power > 0); e( J. F8 W0 q) F8 ^! M( Q/ D' r& I" u
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。8 F: v$ w. s/ z( H8 {" V% q) M& X4 u
  48.     else
    2 o/ }: }, M# q+ I3 K5 [: ]* y
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; L0 I0 F+ T- V4 K; }" D1 K
  50.   }
    - R( W+ |) B- w! x  J6 ?7 Q! l' G) ^6 R
  51. }
複製代碼
% `5 Z4 A$ H& y4 t  b- p) V

/ o7 ?- F/ a2 }6 n' y" Q
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-9-17 21:51 , Processed in 0.024967 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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