圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21733|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ( i/ M, F. ]; E4 Y3 R2 V8 ?
  2. #include <Wire.h>
    1 D8 c( `4 a* n1 B6 n
  3. #include <Servo.h>  Q, \- L7 B2 k/ t
  4. % M# z  F  x& u# X8 N. O
  5. #include "MePort.h"
    7 z1 Q! q, c+ M( h" v
  6. #include "MeUltrasonic.h"9 ]& B4 m/ [# |
  7. #include "MeDCMotor.h"
    0 S: ^6 I8 ]9 W1 i
  8. 6 T+ U' p, i7 g0 B3 x
  9. //double Input, Output ;
    $ z0 ]/ j' \1 ]5 n/ k
  10. float MaxSpeed = 255;
    + ]' f3 t- V( _/ r
  11. float MaxPower = 180;
    - h" h6 T' Y. ^( T' H! t' D
  12. float MinPower = 120;
    : X& a0 ?1 }0 e+ q; J
  13. float Error,ErrorAcc,ErrorDec;
    ' Q1 y- V# ~- x' S6 M& D
  14. $ @* k: N0 e8 M4 b
  15. float Kp=0.14;, [$ h5 X& {; p$ c
  16. float Kd=0.00020;//23;
    * T1 B3 X$ o! x; |4 Y4 L1 Q1 F
  17. float Ki=0.000201;8 \: F* O3 l" ?9 v0 p

  18. # P8 S* p: @/ a% W
  19. float nPower;2 U* p3 F5 F7 _1 \
  20. MePort lightsensor_6(6);
    1 a- f+ R" j" @, V! J& g5 E/ o
  21. MePort lightsensor_8(8);0 w3 E# m% J& S3 e% c3 h" S, B7 q
  22. MeDCMotor motor_9(9);
    ! y! X# W/ n% n  O5 T7 ~
  23. MeDCMotor motor_10(10);
    - `' m5 P/ `2 c. l
  24. unsigned long previousMillis = 0;2 F9 H2 x$ \5 Y' n- k3 E# f
  25. const long interval = 1;  i' D1 c2 O7 ?

  26. $ [9 r  ]# J  Z& o8 O
  27. void setup(){- d3 _7 T6 i( r  T1 \" y, A
  28.     lightsensor_6.dWrite1(1);% x' |8 w- c/ x' o' L+ x
  29.     nPower = 160;0 M+ A; r5 v! l. {/ X/ \! E: z
  30.     Error=0;
    & Q% h% @- u- }$ t9 i, M+ t1 X
  31.     ErrorAcc=0;
    5 v3 p) `6 f3 k& ~; V' k1 Y; n
  32. }# a3 u: a3 o* ]3 Z& x! I4 ]: T
  33. 2 L, X+ v) n2 C% o# [% s& Z5 G
  34. void loop(){
    7 S6 V- E3 P9 x$ c) |# T
  35.   unsigned long StartTime = millis();
    % h' N: l7 h; Y* I8 T% T- F9 b
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){" l4 ?; V' ?. z
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    % ?1 Q, R0 S: i/ L0 l
  38.     ErrorAcc +=  nError*Kd ;. W2 D, {. r5 Y. Z2 v
  39.     ErrorDec -=  nError*Ki ;
    5 U5 R+ D' F0 m8 T! P, M
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);9 P7 `6 b5 F& a& g
  41.     if(nError < 80 && nError > -80){3 P* @' `5 s9 L# c# [
  42.       if(nPower < MaxPower){
    8 q" w+ L$ C8 P4 e6 d. t1 F* C! I
  43.         nPower += 3;
    / |3 D$ t- o/ @  b* k) u7 ]" b
  44.       }
      k- k! b1 h1 U( k
  45.     } else{& S- `8 m; A9 l6 A
  46.       if(nPower > MinPower){  a1 V+ ]% G- ?' c: x4 l! F
  47.         nPower -= 2;4 c  X4 v5 H0 \- b
  48.       }
    ; A8 Q3 d( r7 o. V
  49.     } 4 j- A5 B" n* F0 I( @. ]8 H
  50.     MotoL(nPower-Error);6 m  d+ _2 Z( E9 K* }' E
  51.     MotoR(nPower+Error);   
    5 ]. D& b8 |% n+ p% c+ Y% r
  52.   }else{1 q. O6 \6 o9 E8 p6 @' \. F
  53.     motor_9.run(0);
    8 u' E, w- x  ?+ n7 c0 H8 R* g
  54.     motor_10.run(0);3 Z% Z: k0 Y2 D% ~" W# O
  55.   }) d3 R# [0 x& n3 a
  56.   do{}while(millis() - StartTime < interval);
    ) K! d6 Z1 E. T; p& O  f) W
  57. }
    8 T5 L/ f+ u8 I; N" }. S9 c

  58. 3 n  @% C9 m- W8 @' n% b9 s8 S
  59. void MotoL(int Power){: c4 }! a9 p( _" P& Z5 Z2 M; C
  60.   if (Power > MaxSpeed){
    ( y# b* M' L) l) N& R0 U
  61.      Power = MaxSpeed;9 E; ~& J  X: S
  62.   }
    9 w. `$ ~6 N$ F4 h; w3 ]
  63.   if (Power < -MaxSpeed){& B( `6 P6 T1 t1 R* b
  64.      Power = -MaxSpeed;
    9 B$ ]: e" H1 T7 k! K
  65.   }
    6 A) U0 ~# I6 y: N
  66.   motor_9.run(Power);
    9 ~3 k' O7 j6 l- X. H: U
  67. }  + ]8 f1 h: ]- W& s
  68. ) S3 {5 T2 r& C( o- O5 ?
  69. void MotoR(int Power){3 @% S: V- `: J
  70.   if (Power > MaxSpeed){, e* O  T  _' e: o+ a; S& y
  71.      Power = MaxSpeed;. c$ E$ y  G- d" X9 m1 O
  72.   }
      f) D% U, R4 K  x/ Z9 f$ s- w
  73.   if (Power < -MaxSpeed){
      F. t9 f$ c: F' i
  74.      Power = -MaxSpeed;, R* x# h0 P. x5 H
  75.   }
    + H: h  j, T  O7 d$ l
  76.   motor_10.run(Power);
    : i2 A# d" B( R
  77. }  
複製代碼

- g1 `2 N" T/ Z8 `+ y# U2 e2 {% x( o9 }: R; `
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 # J( t+ ?, i8 B, b9 `1 M; a

) c; F0 g6 m. c8 W您好,不知是否能向您請教。
" a* ^$ N+ \( U, e3 {$ i目前和宋修賢老師在處理Ardui Car* J. V$ i- e, j+ z1 Y" W
雖然已使用較繁雜的方式處理了跑出黑線外的狀況' q! v6 U: l- u0 z4 \

" h; G. ]+ \* D* e, q( y& Z但基於想追求更精簡的程式所以還是想請問一下
' ?% _+ K% a$ e就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
4 \% w& d8 N7 Y! x* a. z不知道您是否願意教我可以如何處理( O6 A0 r& Z0 R( ]$ X  N
/ ~4 s% Q, X; p7 S6 `
6 B8 B# h3 A* ~% ]+ `
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    * c/ D! ^. [$ Z7 r
  2. double CNY70Val = 1000;) H) K! Y5 }4 `  Y  W: @
  3. int interror = 0;
      P5 {" L4 N2 }0 b
  4. int olderror = 0;
    # r5 v) o' z. m' i. r
  5. double values;
    / ?+ p+ S  O) M3 E+ z6 [: E% N2 q
  6.   T7 ^# ~( o! _0 @$ d0 z3 T

  7. 7 |; _/ V0 _+ [0 a& G2 D0 l5 X
  8. void CNY70()
    ) h0 ^! d( \6 t5 ~9 O# t# G4 d
  9. {5 j1 W! i' b$ X0 e
  10.   valuesRR = analogRead(RR)9 n! m/ T  A" w* S1 p3 ]+ s1 u9 c
  11.   valuesMR = analogRead(MR);9 O& b7 S  H# U3 o# P" W
  12.   valuesMM = analogRead(MM);7 w% Y" k- Q! |  s, q& `. G$ J& Q" M
  13.   valuesML = analogRead(ML);' V6 x; g2 W7 ^6 k% L# z
  14.   valuesLL = analogRead(LL);
    & u. n* |. A8 s: P' ^0 u; W

  15. % p+ b* x0 _. F. c" X4 N% H- K
  16.   if (valuesRR > CNY70Val)0 j0 d! C2 H$ E  x7 Q( X1 S& F
  17.     valuesRR = CNY70Val;
    - n- a5 S" C$ h& M" }0 a
  18.   if (valuesMR > CNY70Val)
    8 [: N6 U" M# {% |5 v, d
  19.     valuesMR = CNY70Val;* k1 P2 B1 A, B, R1 H- T
  20.   if (valuesMM > CNY70Val); a$ I- I( K7 s) @8 Z1 C4 d+ G" G% s
  21.     valuesMM = CNY70Val;! y4 C+ {' ]4 r( @
  22.   if (valuesML > CNY70Val)4 |1 L$ k+ B! Q- F( z' T6 G
  23.     valuesML = CNY70Val;1 f' R% _+ z/ x* O- p2 B2 b
  24.   if (valuesLL > CNY70Val)
    ! \9 |$ L; y6 i
  25.     valuesLL = CNY70Val;
    & e4 Y1 N/ P4 S( f( Y3 l

  26. 0 I' C5 p: i2 l/ l* B
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    $ D; M8 G6 @- m$ v( x& p
  28. }+ E! ~% g5 v. N+ z7 N

  29. 6 K- G% N7 D" [0 {1 f: x1 t1 s
  30. void Car()& N8 o: X$ w+ f0 O9 n1 Y
  31. {
    9 u' K5 b; `7 R% Q8 c2 M
  32.   while (1) {4 g5 B/ N! K" w. t- g
  33.     CNY70();# g+ J: v0 }+ y
  34. 1 T* c3 D3 Q- h4 J& U) I5 ^0 D+ J7 E
  35.     int error = ((int)values);, u: V* w' U1 E% l* S: _' ]. v# z4 t
  36.     interror += error;3 l4 @4 e& _8 l" Z& \
  37.     int lasterror = error - olderror;( t( U7 \+ X3 q' K' V# j6 T  I$ E
  38.     olderror = error;" |' N* K; L" D% I- a
  39.     int power = error / 5 + interror / 10000 + lasterror;& f8 i1 d* |$ |& P* ^

  40. 9 N) L% S' S6 Y; q1 G4 H# ~" \. ^
  41.     if (power > MotoSpeed)
    , M  c. ^) }- d8 F2 n. e/ m
  42.       power = MotoSpeed;# @  [3 I/ B! A! Z
  43.     if (power < -MotoSpeed)
    8 d1 O/ d- ]2 `4 h1 r8 k5 d
  44.       power = -MotoSpeed;* z$ m" P' a0 d) a0 y: ~9 J2 p
  45.   c; ^5 q& z, Q" o/ V
  46.     if (power > 0)
    % v) y& p1 c  y3 g' v9 B9 n
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。% S  }# Z, C0 O/ o1 I7 }- E8 ^  q; \
  48.     else
    7 I* ~- U8 [/ n3 P) }% o# s
  49.       Speed(MotoSpeed + power, MotoSpeed);3 k: H& j) w1 ]& A6 u- D
  50.   }
    ( V3 X; ^, c, c) T, V3 _0 l  A
  51. }
複製代碼

, x7 h: z* K% q6 B6 v0 Q# A# g4 F0 ]/ F7 P4 I
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 06:01 , Processed in 0.023424 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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