圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21670|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    % t/ U: Y# {9 X6 [
  2. #include <Wire.h>! y4 L0 K1 |& e: r; L
  3. #include <Servo.h>- h8 y4 R: A" c# P
  4. ! I$ b! ]" E9 W1 H$ ^
  5. #include "MePort.h"
    : Z1 O# [% x2 V3 l3 w
  6. #include "MeUltrasonic.h"2 `2 n; a/ T* j  Z6 \
  7. #include "MeDCMotor.h"
    , l5 J, u2 ?/ d- K' T# H

  8. " T4 ?% M' c5 H7 \9 L' [
  9. //double Input, Output ;5 w* g, x! L0 g+ E
  10. float MaxSpeed = 255;
    . H' h2 y" J2 G+ _
  11. float MaxPower = 180;/ S0 t1 b' q, O' \
  12. float MinPower = 120;
    : C7 `- W( q% }
  13. float Error,ErrorAcc,ErrorDec;
    - R1 {$ F4 t. P5 n' I( Y
  14. 4 c5 u, j5 u- w$ N" Q
  15. float Kp=0.14;
    + V+ t2 S# m# _: v) G
  16. float Kd=0.00020;//23;8 v1 K$ q5 r- {7 Z1 V+ ]/ j; y4 M
  17. float Ki=0.000201;: [+ J7 f0 Y2 d0 p
  18. 5 w% @# y* z9 F, h
  19. float nPower;
    ; m, G2 q; M6 a' I+ ~+ i' G
  20. MePort lightsensor_6(6);6 \: j6 z6 m9 B. y3 k2 _
  21. MePort lightsensor_8(8);: a; l& P: V) V9 I3 I
  22. MeDCMotor motor_9(9);% F( b) O* z* p9 v( G
  23. MeDCMotor motor_10(10);; R9 A8 l6 H3 p/ Q. H" a- ]. \
  24. unsigned long previousMillis = 0;, O1 \: N4 X# B3 M7 N
  25. const long interval = 1;7 X' p# Q8 ^5 J

  26. + }+ E0 _8 b% ?+ ~" P& p
  27. void setup(){* x0 Q& F" s7 k/ s: J
  28.     lightsensor_6.dWrite1(1);" @. L( U! D) {& X, E
  29.     nPower = 160;. F; r: [) E9 O( W% u+ c
  30.     Error=0;
    2 y  {7 p+ r( f2 J, P9 _5 [
  31.     ErrorAcc=0;
    . m: s' b' N' [# d# D
  32. }
    . h* @8 ?" V7 N8 U7 e
  33. : ]  _% M4 `, Y: i, [0 b- m
  34. void loop(){7 f5 |  @. Q, `: m& V' v
  35.   unsigned long StartTime = millis();. R$ Y& y  e2 f+ G; I# a* [
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){- V: Q4 l8 d' d7 o( ]4 I! k" R- L
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();3 ^* O! w: i/ U7 Q0 w" ^, S
  38.     ErrorAcc +=  nError*Kd ;
    3 H/ z3 \! B0 Z; D8 V, N7 F
  39.     ErrorDec -=  nError*Ki ;1 |' j8 i" b# U2 i6 E
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);# }" t9 @/ a/ F) c, X. W; h7 g
  41.     if(nError < 80 && nError > -80){/ X: b) q/ K( P& J" X' b, y: f
  42.       if(nPower < MaxPower){
    : d1 z  ]  D0 c0 ^5 T6 M9 l: V  U4 N
  43.         nPower += 3;" f1 Z" e$ A1 R
  44.       }
    0 H2 F* m$ t; i+ _* B* ?. D
  45.     } else{
    9 ^. O+ {+ y& x+ |; r) O
  46.       if(nPower > MinPower){+ ~# g4 J. J: l& x. ], `  G
  47.         nPower -= 2;# m" w* u2 [+ w/ ~% n0 j
  48.       }- E9 e8 X) A% {" {/ p
  49.     }
    # H- a6 k2 ^, m9 m( a
  50.     MotoL(nPower-Error);
      ?% L4 t0 l  g. f* A  k
  51.     MotoR(nPower+Error);   
    # P" H$ L: i* K4 Q# [8 H" w
  52.   }else{6 e% V+ w6 J" P/ d- u
  53.     motor_9.run(0);, h8 Y* E  h! V% g
  54.     motor_10.run(0);
    & R1 ?1 g2 c# @2 q2 B
  55.   }* f3 y9 g1 }/ D% `+ `
  56.   do{}while(millis() - StartTime < interval);$ l& n' n0 [7 M1 k  P
  57. }
    3 T$ y. d/ u+ R9 I+ L

  58. 8 s' P: f2 j2 `. Z* o
  59. void MotoL(int Power){
    0 S# h* z; P1 s7 m7 Z+ O; P! N. ~
  60.   if (Power > MaxSpeed){
    - v- C( s* M1 ]" x; d) x
  61.      Power = MaxSpeed;5 E) g; r: I9 }( z
  62.   }
    . Z( P" P+ K3 [& w/ @
  63.   if (Power < -MaxSpeed){% \( H) ^5 v5 y. f: `) B
  64.      Power = -MaxSpeed;
    . P6 m5 @* ^5 T
  65.   }
    & }( l: w* e# }: X) }
  66.   motor_9.run(Power);
    : E' u! |0 G$ G' h' D6 E" v
  67. }  
    7 l' j2 S+ T9 S3 k

  68. 7 D8 }- w' W& U
  69. void MotoR(int Power){
    1 _- O/ Q: z% j: K# [
  70.   if (Power > MaxSpeed){, ]$ D5 Z. e. L+ W' p& U
  71.      Power = MaxSpeed;; g5 ^, X' w2 e+ M
  72.   }
    9 _/ }+ F( I. s& Q
  73.   if (Power < -MaxSpeed){$ ]0 o6 s, }" q8 U
  74.      Power = -MaxSpeed;
    + `+ v$ d" ]. ]4 p' j+ }4 O% v& o" W
  75.   } - T0 n  m" w. q  J5 H" @& C3 y) F
  76.   motor_10.run(Power);
    6 K8 e; C: i) x3 H* ^; b2 K3 m
  77. }  
複製代碼

5 N! r) d* _6 ?' }) ?- P) Q2 t% R3 o$ ~
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ( W& b, N* n1 F: @
" f; y; v" T% i$ h2 N
您好,不知是否能向您請教。+ f& S* v) V# z5 ?2 b( H4 X# L
目前和宋修賢老師在處理Ardui Car
( i# h+ }: h: z3 t3 z" M% [雖然已使用較繁雜的方式處理了跑出黑線外的狀況5 D/ q5 B7 p( ]7 }% N

& N# h3 _/ S: [1 D7 `7 m. J但基於想追求更精簡的程式所以還是想請問一下+ Z. F. b* Q6 P1 p; S
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
" \. w- j% b: V+ P5 o& l不知道您是否願意教我可以如何處理
! l7 P) d1 j; Q1 ~$ v4 ~9 A: q. m+ v: |1 x. ^
& G0 q0 E  _5 m8 q" n6 g
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;4 U$ N3 r% ?' W: T# z+ O  E9 d% p) |) t
  2. double CNY70Val = 1000;
    # Z  a+ n9 A" u1 H& O
  3. int interror = 0;% \! M* q7 }$ Y+ J% T, m( \
  4. int olderror = 0;
    ; k4 q( ^8 t! w4 _" m, w1 e9 Z) D* m
  5. double values;  \2 z% X! q0 V6 w* O* p
  6. ) `0 P! H  f4 M/ E8 [

  7. ' b4 d6 M# r8 O. T: s& }
  8. void CNY70()' |6 u; g" m) f# T* @: h
  9. {. |8 `* l! T5 S( j) h; o% L
  10.   valuesRR = analogRead(RR)
    " j" R; L  u% k( J0 O: ?- u1 ~
  11.   valuesMR = analogRead(MR);
    " J8 p2 J& ~: `1 x( r
  12.   valuesMM = analogRead(MM);  X# a  \; S4 Z- T  [- F+ I( T
  13.   valuesML = analogRead(ML);
    8 B# s) _6 G7 x, o. r& ^' m5 {
  14.   valuesLL = analogRead(LL);% N. D0 i, `4 g" M- j
  15. ' c& c/ ?* ~% h6 N
  16.   if (valuesRR > CNY70Val)
    2 j( ^! ?" j$ b; r6 [0 Y/ j
  17.     valuesRR = CNY70Val;
    # j) B  `, h  r! J
  18.   if (valuesMR > CNY70Val)' a. m/ M% R8 I
  19.     valuesMR = CNY70Val;
    ) Z9 {; ~& X! @, m
  20.   if (valuesMM > CNY70Val)& D' x+ x, I) _) F, \2 c; T9 J
  21.     valuesMM = CNY70Val;% X: Q0 `" D: U  u
  22.   if (valuesML > CNY70Val)4 H- u/ Z& |% H+ d
  23.     valuesML = CNY70Val;
    ; s- ~4 S% r) n  ]7 y6 M. ^) }4 {
  24.   if (valuesLL > CNY70Val)0 A' G% ~' b) ]' J* s( x- i/ ]
  25.     valuesLL = CNY70Val;
    # S6 \6 E4 o3 z  F5 k

  26. , z/ ~4 F7 h3 l, _+ z6 V
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;- U5 ?4 ]% P+ z7 R4 j0 f3 t+ B
  28. }
    ' k& W0 {, a1 f. z) E

  29. 2 l/ N7 k  s  v4 S
  30. void Car()
    1 X1 P. A5 U3 ~
  31. {
    $ j: O2 P! H8 h# X# Q& h) c) |" E* d
  32.   while (1) {3 b$ h2 _1 r5 Z  {, H$ S
  33.     CNY70();
    5 J% V3 T$ N2 D2 c& S

  34. % t+ x% {) @. p& D' p+ X' _
  35.     int error = ((int)values);, j/ T; ^2 T2 n9 u+ a% \% n
  36.     interror += error;% n) |  w5 w* q) a8 O; S7 L
  37.     int lasterror = error - olderror;
    ' I8 Y. W6 `1 t0 ?2 r
  38.     olderror = error;
    $ ^/ d5 }( B3 ?& o- J
  39.     int power = error / 5 + interror / 10000 + lasterror;$ z* J  \% U5 V& E" y

  40. 8 q- w5 ~4 b* @) h0 D
  41.     if (power > MotoSpeed)6 d2 W! y, J2 p3 S/ j2 F$ @0 \
  42.       power = MotoSpeed;' O! b. W: H5 X. t. C' B7 ?+ M
  43.     if (power < -MotoSpeed)
    : [  @5 {7 Q+ g1 W4 [; E: z
  44.       power = -MotoSpeed;
    * M6 ?/ |# V7 U

  45. ' S+ M, `% N* E/ v" V# u# d4 }
  46.     if (power > 0)
    4 `1 ~0 o/ H: F8 b1 W" y# s* X
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    9 s. l" o/ i0 i& l1 Q
  48.     else7 {6 \, M5 s1 v+ p0 a  B! [1 c! b
  49.       Speed(MotoSpeed + power, MotoSpeed);% ]' \4 q* I! y6 }' H
  50.   }+ _& g" A. x. N$ Q1 ^$ S
  51. }
複製代碼
' n: v0 v  x; z! b+ B: e  p" w
# j8 S& f+ L) V+ U% `- j
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-16 14:44 , Processed in 0.027369 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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