圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21660|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>% f1 i  X2 P' y) q3 ^
  2. #include <Wire.h>
    ' r' A1 u7 J8 F* w
  3. #include <Servo.h>
    - B8 `' s! f; M$ G: D

  4. 1 ?8 N& k7 h: }8 _  L
  5. #include "MePort.h"( ^1 G3 u* ?7 x$ N$ ~, x+ j
  6. #include "MeUltrasonic.h"3 M4 j$ Z4 t) q4 }8 z
  7. #include "MeDCMotor.h"
    6 J6 N2 s! T$ Y/ j/ t  n3 [. R% a
  8. " c; C% w( V9 a9 b( B/ q
  9. //double Input, Output ;$ `$ A' s. x6 u/ ~! F
  10. float MaxSpeed = 255;* H' ^: S, }0 N: o5 o
  11. float MaxPower = 180;5 N/ S8 u+ j. Y/ J
  12. float MinPower = 120;
    6 a+ C2 p$ s! Z* Q% J4 k& F1 T0 ?
  13. float Error,ErrorAcc,ErrorDec;# A! ~0 h8 \- ?# u3 k2 d8 j

  14. 6 s5 g6 ~* ^0 y
  15. float Kp=0.14;) B: ]( f$ Z) W: I5 d. K/ R) {
  16. float Kd=0.00020;//23;2 S( P5 |) y; y! ^  k1 h" w
  17. float Ki=0.000201;. [# \3 G, C/ p$ r7 c* Y; _
  18. * Q: n/ Y& H, d% i8 k
  19. float nPower;* _: J, x% A0 o5 K1 v
  20. MePort lightsensor_6(6);, u, X3 g5 G2 `" x& \( \# A% |0 p' H7 R
  21. MePort lightsensor_8(8);* x, J9 o; C: {+ M5 d
  22. MeDCMotor motor_9(9);
    ; F5 M9 i* k) Z2 R3 e8 j+ x
  23. MeDCMotor motor_10(10);
    + ~( S5 q; ~' L3 x' h- b
  24. unsigned long previousMillis = 0;0 g3 j4 J  E/ {& Y/ M
  25. const long interval = 1;
    - E6 D- `; ]( G" l, i9 F1 N+ i

  26. 1 b  d$ ^# _/ ~0 d) [  F9 ~
  27. void setup(){9 p5 b. V- o( u
  28.     lightsensor_6.dWrite1(1);4 S6 W) L: {3 t  D
  29.     nPower = 160;
    & ~9 i3 V2 X1 R2 t% F7 w
  30.     Error=0;
    % S) w  s$ U  a6 T, W, _4 e4 g6 M
  31.     ErrorAcc=0;' J/ z5 J& m8 H( U% p) }
  32. }% X# E0 s1 L) U  B
  33. ( t( a) \. E! f5 g, w0 D9 N% O4 R
  34. void loop(){; n# w& x8 f! D1 B
  35.   unsigned long StartTime = millis();9 C) @: |  K- y% g6 ^9 D
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){# N; }3 ]9 z2 M6 u! b9 M& H
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();- `& m( p7 P2 e4 v# U; X4 [! G
  38.     ErrorAcc +=  nError*Kd ;
    8 L0 Q) D% h$ d
  39.     ErrorDec -=  nError*Ki ;
    1 Y( ^0 _0 k  p2 i$ a6 S6 [, Y
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);# U% X9 s/ I; T) ~4 D
  41.     if(nError < 80 && nError > -80){9 w1 [% T1 v  _- X
  42.       if(nPower < MaxPower){
    & I8 Z; X& W; i$ C0 B* M# y: Q8 y& T4 [
  43.         nPower += 3;
    # N! d% S7 o1 ~4 V& d
  44.       }
    4 I6 i( r$ L) r! `# b1 |. H6 R2 C
  45.     } else{5 p% v7 v9 V+ ^9 F) c
  46.       if(nPower > MinPower){- m7 ]! R% `" ^5 J
  47.         nPower -= 2;7 k1 m! t! D6 Y) t" J3 h6 f: I) B
  48.       }0 X3 t6 h( L& n
  49.     }
    # N+ c+ d: {5 r/ O
  50.     MotoL(nPower-Error);: |% p4 z* a9 u3 o  T
  51.     MotoR(nPower+Error);      j/ v7 T: k  Z' g& {/ J( F4 h
  52.   }else{
    7 c1 g( D6 A, y; c! R& H
  53.     motor_9.run(0);. n1 A, p& X# ?) P6 d
  54.     motor_10.run(0);
    2 W3 C3 ?" O. j% v  j
  55.   }/ a& d, S% c. ]
  56.   do{}while(millis() - StartTime < interval);
    5 V+ [2 C4 L( K5 e9 }4 x2 Z& D
  57. }
    ( q4 y8 A) R% Y- l5 `  a
  58. ' N/ G  k* h% B& M8 r( B5 Y
  59. void MotoL(int Power){0 O0 s! @  U( y* w& Z) Z
  60.   if (Power > MaxSpeed){
    7 h# A/ }, @. Z* R3 a
  61.      Power = MaxSpeed;# @( b$ J: Z  d/ C% _; I
  62.   }   s. ^  \6 a* n
  63.   if (Power < -MaxSpeed){
    , j9 f; y' t5 V# M9 o2 R
  64.      Power = -MaxSpeed;
    * R( q7 r, n+ T$ s& z$ h- X& w
  65.   } - \* r6 v1 P; k, c2 l6 E
  66.   motor_9.run(Power);% k$ L6 b) D7 w* [) f5 ?
  67. }  : K: D! p9 t# g$ R- j/ q

  68. 9 l( v! z/ L: ^# _4 B' }4 R
  69. void MotoR(int Power){0 ?; I4 P' h, l2 n
  70.   if (Power > MaxSpeed){
    : ?( y/ {- F6 U3 I( c
  71.      Power = MaxSpeed;
    / Y" K* B" z* R' B& l
  72.   }
    : H: z# `) N; _/ S4 x" f
  73.   if (Power < -MaxSpeed){
    & f2 m/ P) W7 \& t8 F7 w( f
  74.      Power = -MaxSpeed;
    ) u" a0 p3 k) ?9 B7 K
  75.   } 0 u" _; s& Q, j' _1 N: F1 c% i; o
  76.   motor_10.run(Power);
    : B' n+ V( m, I% t) L! X
  77. }  
複製代碼

" X. K: }, S/ |8 s' P: b! n% e6 w0 @4 F+ E; j0 _% E+ M" h0 Z
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 : P( Z  @1 Z# ]7 s  }6 M
  b9 t! u  x7 ?5 c5 ]! Y$ U$ ?5 ]
您好,不知是否能向您請教。! c, d  W6 P" s3 r2 r2 V- s$ @
目前和宋修賢老師在處理Ardui Car
: F  k1 a: _7 ^; d* g雖然已使用較繁雜的方式處理了跑出黑線外的狀況7 g. _. j( N$ j$ x5 o

1 M$ u0 F" W# E% ?: p但基於想追求更精簡的程式所以還是想請問一下* i: E6 ?& f3 d" l( c, V5 ^: h& h7 C
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝5 V0 J; ?. z' u* E; J: C' \+ N
不知道您是否願意教我可以如何處理$ Z& ^/ n; j0 d: U  {3 g

: M4 {# Y3 d9 C- I1 l' Z2 t4 ~- k. Q- e/ b# ^7 b% a
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    0 g1 M0 B, b5 W7 s8 o
  2. double CNY70Val = 1000;9 W7 q2 k, m( v& d: f- w% d
  3. int interror = 0;6 M% H( @; l9 W
  4. int olderror = 0;& C2 ~' T2 d! @9 a8 Q; t, S2 }$ n  P4 v
  5. double values;+ u+ O! _. H; n

  6. 9 P. t1 b4 c$ g
  7. $ J& T' e0 J" Z1 [9 y$ P; H9 V
  8. void CNY70()
    : [, \9 E* a2 Z( A
  9. {& M/ d, m7 e- A1 T3 U) D) i
  10.   valuesRR = analogRead(RR)
    : ^0 @+ N4 }  F6 i
  11.   valuesMR = analogRead(MR);
    2 c" h, `8 ^& ?8 U& n4 n) d0 l
  12.   valuesMM = analogRead(MM);; F: C0 g) q0 |4 s5 R# U
  13.   valuesML = analogRead(ML);: s( B. e1 x( O& ^1 }
  14.   valuesLL = analogRead(LL);
      t1 d" p) B' I( q, r3 T9 x
  15. 6 o; A: u- x1 o& q% H5 \( O
  16.   if (valuesRR > CNY70Val)
    5 O+ k2 t" _) Q  ~9 W- [
  17.     valuesRR = CNY70Val;( }; v) v/ o- T# b6 U
  18.   if (valuesMR > CNY70Val)& [& L- h3 O. y9 T2 I9 i
  19.     valuesMR = CNY70Val;
    2 ?% s- X/ F1 j. ?
  20.   if (valuesMM > CNY70Val)' t5 L! Q5 G  ]
  21.     valuesMM = CNY70Val;# R/ |& n6 n* g. r0 ]
  22.   if (valuesML > CNY70Val)
    ' a8 ^" }) r; G8 g* s$ W
  23.     valuesML = CNY70Val;
    * c. y4 n( B2 I6 b- h% K
  24.   if (valuesLL > CNY70Val)
    1 u( d- A: }  q: O
  25.     valuesLL = CNY70Val;
    " Z+ D/ q3 F; ^

  26. - M. h* o$ r9 \: U* \; I5 g
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 j- l2 n8 J# r- k7 A" r" }
  28. }# \0 [! H1 o5 k4 D, E; t; k8 [8 c
  29. 1 e  N5 ^* ~9 ~3 }* I8 q$ Y
  30. void Car()$ q; }) c, b- z4 w$ H4 Z
  31. {% u. [5 P7 a( U" i
  32.   while (1) {% j1 D+ Z, ]( B
  33.     CNY70();7 F& ?6 x7 O( v+ N5 w
  34. & |. P$ ~* d& J: g. i( X
  35.     int error = ((int)values);
    2 Q0 R3 F3 I- E' @& @
  36.     interror += error;
    ( U- p$ C9 O3 ]( \9 Y9 v+ @
  37.     int lasterror = error - olderror;0 h5 l  S$ O) f7 N. B/ |- t* C
  38.     olderror = error;
    ) {# J+ d+ ?' T; R: R5 V. c: M2 a
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ' Z0 {/ u$ u5 ^1 x/ x5 h
  40. 4 c$ i( u7 q( D! o; e0 B7 L
  41.     if (power > MotoSpeed)* A9 s3 k9 a, l7 Q) q
  42.       power = MotoSpeed;
    ) L. {$ N  S* Y8 H
  43.     if (power < -MotoSpeed)( ~( O& r$ i2 ?; Y0 ?2 {
  44.       power = -MotoSpeed;
    3 g' `$ V8 q0 Z- E1 n! ?+ H. \

  45.   r3 B# k: Q5 S( d" N% D5 X
  46.     if (power > 0)
    - m9 V+ C3 b* X3 J
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    . Q0 q! X$ ?- M5 m$ G0 I+ A/ s3 D
  48.     else: T! B8 ]. x0 J- R  ~) b4 P
  49.       Speed(MotoSpeed + power, MotoSpeed);; n  H2 a% \1 \2 r- L5 o. M
  50.   }5 Z( o& \1 M, N* t
  51. }
複製代碼
$ s; a" I; n% i4 b
0 ~5 Y& u! I. s1 {5 b; b9 m
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-14 19:16 , Processed in 0.024169 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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