圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21855|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>6 E( e) _* i* u. _3 n  {6 G
  2. #include <Wire.h>6 `' j; L, @0 Y9 W4 q/ d- K
  3. #include <Servo.h>
    4 i% i0 U- o0 D, C
  4. & L7 y0 `4 e% l9 L* N; F# K
  5. #include "MePort.h"
    1 i/ `+ O* ?" u5 U8 d: J+ a7 u
  6. #include "MeUltrasonic.h"
    ' z; `5 e, D8 P, J
  7. #include "MeDCMotor.h"2 ?- I/ J1 ?1 F* A- M* `

  8. $ E1 q& @* ]) U* ~7 `7 r
  9. //double Input, Output ;5 l7 b. V" f, _- \7 l
  10. float MaxSpeed = 255;
    - T7 J5 c% `; F7 F# T& g* h! c
  11. float MaxPower = 180;
    2 {1 {! }* Y4 p8 I
  12. float MinPower = 120;) R* o+ H2 E: L- H* a
  13. float Error,ErrorAcc,ErrorDec;
    - d' u5 W& T8 R* r$ A, S
  14. $ K' ?2 u& q9 ]0 G4 O3 M
  15. float Kp=0.14;" s1 R, ~: f: ~+ x% E' Q* e
  16. float Kd=0.00020;//23;' g8 c1 ^5 ]' w  J  f: G( P
  17. float Ki=0.000201;
    6 i! X  N& F! f2 s
  18. 5 K- P. ^% x, }  L. E; h. F* v" Q
  19. float nPower;1 ~& R7 O0 |: j+ ~1 h
  20. MePort lightsensor_6(6);$ T6 v( Y! p: @' R7 O+ r
  21. MePort lightsensor_8(8);1 R9 B* B; I. j- C" m) e
  22. MeDCMotor motor_9(9);/ W) B, j1 {+ I( b" j* \, R2 S
  23. MeDCMotor motor_10(10);
    8 @6 {' u$ |2 C3 H8 t
  24. unsigned long previousMillis = 0;4 W; T4 I4 D0 V
  25. const long interval = 1;
    2 o, p8 G6 Q# a3 Q8 @
  26. ; ]! V. g3 m3 \  y
  27. void setup(){
    4 S: |4 ?9 ^9 V/ s' b) j2 G) ]+ ?
  28.     lightsensor_6.dWrite1(1);
    0 t. Q+ r8 k& [- O& Q* l0 P
  29.     nPower = 160;3 `# O/ S' k, Q; H2 Q
  30.     Error=0;
    9 Z/ Q* c: ?$ B5 `4 I
  31.     ErrorAcc=0;: b- K& ]: }( u" t8 b# e% a* o! b1 V
  32. }
    , b/ ~/ l6 y! p8 _% g5 A
  33. ; l' a! c; D2 C+ J" x
  34. void loop(){0 E" a& C) `- m' ^9 j# W9 U) M8 r
  35.   unsigned long StartTime = millis();7 M, M9 ^& C0 X
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    1 S8 T7 t/ C3 X  c' m$ ^
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ! H0 x( D# ]% L2 W! T
  38.     ErrorAcc +=  nError*Kd ;# x9 N* p" F0 C, P' ~' O
  39.     ErrorDec -=  nError*Ki ;. V' ]* t! t' s$ @: U
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);" ^( K2 ?3 e. M  s% W1 T9 X
  41.     if(nError < 80 && nError > -80){( U5 H6 z6 I: ]
  42.       if(nPower < MaxPower){5 [1 m9 ^5 B3 M- G1 r3 ]
  43.         nPower += 3;7 m1 N3 p; v# D* Y3 @% e6 l0 Z
  44.       }
    % B0 o! x) m0 f
  45.     } else{
    + ^' x* N/ p# W& Y: g
  46.       if(nPower > MinPower){
    5 k* c3 P8 i3 X- s) b# E
  47.         nPower -= 2;
    , F8 a% I1 X: Y! m& Z6 g& W
  48.       }
    4 T4 `0 U7 {, j( G
  49.     }
    6 q+ `: k; i# Q+ o, c) a. D
  50.     MotoL(nPower-Error);5 ?& D% e8 v5 H% P& A) a  }+ P
  51.     MotoR(nPower+Error);    * E& }/ N" ?% O1 E1 l4 V/ o" b2 G
  52.   }else{; e% j& x) e( o' ]+ r6 f
  53.     motor_9.run(0);3 s6 x3 Y4 p9 Z! @( ~/ d2 p
  54.     motor_10.run(0);. }0 {6 o' i9 k: C8 N
  55.   }. s# v# q* `) V8 K7 l) l. Q
  56.   do{}while(millis() - StartTime < interval);' ~6 G5 n9 w* K9 y
  57. }( y8 Y. N2 `& ]; ?

  58. / L! J( M* `" ~; ]4 U
  59. void MotoL(int Power){
    1 r, y8 e) b6 _
  60.   if (Power > MaxSpeed){( y4 G0 B2 |4 F( _; }% g: `& ?
  61.      Power = MaxSpeed;- Y1 [/ t/ r3 f, l; L
  62.   } ; h3 T6 L- c. I$ Q2 b+ M2 _* B6 L
  63.   if (Power < -MaxSpeed){  \, }- \' ]8 e% \. ^5 X4 i
  64.      Power = -MaxSpeed;3 n# m  `) v0 Q+ ], J4 V
  65.   }
    5 R4 H6 l9 e+ I9 W; N- C
  66.   motor_9.run(Power);
    & z/ V1 E6 i& Q2 C# Z1 C
  67. }  
    * E* P; ^" y5 W1 k* |" x
  68. " W3 {( }6 y# b- t0 H2 L# x
  69. void MotoR(int Power){
    / f" p8 q7 |' p8 M6 M
  70.   if (Power > MaxSpeed){
    ' d0 i% u2 A* B/ p3 b
  71.      Power = MaxSpeed;( ]+ d2 ?4 ^2 a' ?4 t
  72.   } & n, n- t4 T7 I0 c( @; U* t
  73.   if (Power < -MaxSpeed){
    * z+ D+ n6 a3 I$ k" m5 T% k- G' v
  74.      Power = -MaxSpeed;3 f' @$ H, x0 H3 t4 }; R5 q# R, s
  75.   }
    5 W- _+ e& g8 u1 o
  76.   motor_10.run(Power);
    ) l# @( o  `8 l. m' ^; o
  77. }  
複製代碼

% ?. C& u$ ]# W. N, I1 f8 N
7 S( l  l/ @$ x- f3 h6 W2 A
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
! K$ V+ A9 ^( T0 f  O# E
# Z7 i5 ], t6 ?8 \# _2 T2 k2 Z您好,不知是否能向您請教。; u7 L# b, p7 |- R! ]
目前和宋修賢老師在處理Ardui Car
+ y. Y5 @8 q' z( p雖然已使用較繁雜的方式處理了跑出黑線外的狀況
1 m0 e1 h7 Z7 k' \+ Y9 x6 f1 r# D# g6 Q
但基於想追求更精簡的程式所以還是想請問一下& e4 v- r! W+ r8 G- l
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
* D% Z, ]; a; ]$ k9 w不知道您是否願意教我可以如何處理' C) ~1 C+ w$ \& U- [, P

  R) H1 r( F  R' p# t
0 p* D" H$ C; I$ F/ N以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    % E: N& {* f4 D2 ]+ ~3 Y
  2. double CNY70Val = 1000;/ A6 _# }& C# R: n, E! F9 @& g- z
  3. int interror = 0;4 R: d& p3 n+ I: ]# r% ~4 Z
  4. int olderror = 0;
    " o, m- u( Z! s5 I3 S9 l" ]% P+ p
  5. double values;. P. z' J9 g/ M* z4 i
  6. : F/ t: {$ r3 n; {" e+ j4 C
  7. 3 b- `5 v! m% ^4 Y3 [
  8. void CNY70(), R: u& C3 R6 I
  9. {. Y( y- j2 d7 Z+ k# e
  10.   valuesRR = analogRead(RR)
    4 ^- k, L  U: N' l% I' i2 D8 Q
  11.   valuesMR = analogRead(MR);
    , |4 S" H' N6 {0 D9 }) q6 Y- \
  12.   valuesMM = analogRead(MM);1 Z' U- G9 t2 a
  13.   valuesML = analogRead(ML);/ n6 v! [$ j9 C  o6 R1 R9 Z
  14.   valuesLL = analogRead(LL);
    / Y5 Q5 |! s0 X4 y: b8 j
  15. ( H+ l% G$ r) ^
  16.   if (valuesRR > CNY70Val); o8 w! U# z* k8 v& p" ~& I
  17.     valuesRR = CNY70Val;
    - l) D: q- d: |( ?" C
  18.   if (valuesMR > CNY70Val)" b- A: Q( t$ ?. B
  19.     valuesMR = CNY70Val;
    # D  q! w! I+ ]: B3 [+ r& U3 \0 |
  20.   if (valuesMM > CNY70Val)$ J, |+ x4 h0 `. K' y  f
  21.     valuesMM = CNY70Val;2 G; ?  g7 g( ~2 U! ^. E
  22.   if (valuesML > CNY70Val)1 b$ O% X) M' M. a
  23.     valuesML = CNY70Val;
    2 M6 [0 a4 D2 ?1 R8 Q3 n
  24.   if (valuesLL > CNY70Val)
    / h$ Y5 @: E* O& j% X% d( J
  25.     valuesLL = CNY70Val;2 Q  c% u# J2 X0 V& e8 g
  26. * c7 E* L  f7 ?) F, u8 j* T6 [: \
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;3 Z7 i: d- I" L( F
  28. }
    / Q. ^9 \  P" b* v; Q3 p* L! S
  29. " Y( A7 f0 q. a! H
  30. void Car()% V4 N9 D4 k+ K, D8 j
  31. {
    - @: ^+ V. E! b" V- e2 B5 [
  32.   while (1) {
    ) I' F, |$ ^) L6 T7 ?; \' ?
  33.     CNY70();
    7 V/ j8 A% e* u* \- Z2 g3 Y$ v* f
  34. ! O6 K, m, g. ?  g
  35.     int error = ((int)values);* o) V1 o7 M: J+ R+ p5 W
  36.     interror += error;, y/ X5 p* R5 W0 u# C: g6 n1 ~
  37.     int lasterror = error - olderror;8 p1 D9 C6 P  Q* ?% h1 l: d
  38.     olderror = error;
    . K2 ?7 ], [# M+ n. Q: C- ^
  39.     int power = error / 5 + interror / 10000 + lasterror;
    $ t  Y) z# `( Y/ A' u
  40. : t& B- }) L3 R
  41.     if (power > MotoSpeed)5 s% U. ^+ _2 s5 C* N! p/ ?3 H
  42.       power = MotoSpeed;- V; T5 K! j/ y' E* B
  43.     if (power < -MotoSpeed)
    & r4 e, n6 U( m
  44.       power = -MotoSpeed;: x0 ]9 c3 k$ k2 y
  45. $ M8 q/ ^3 W/ m" q3 A/ E
  46.     if (power > 0)& Y% K5 n( J3 }( c8 b
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    / k5 n; I: y2 A/ B  p, {
  48.     else4 _% Q' H' W% e; ~
  49.       Speed(MotoSpeed + power, MotoSpeed);
    * R* a2 S6 d+ E' e/ Z
  50.   }
    . e& K) ~7 }2 f. t, U; b0 ]; a
  51. }
複製代碼

5 [% V9 S6 D6 }7 o" U0 c( w
: I% q/ e, ?0 g  m; q* I0 N* D
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-5 23:04 , Processed in 0.027151 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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