圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20564|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>& f% u$ k  \5 ?0 \' I
  2. #include <Wire.h>" g0 R& w, r1 n' I1 c
  3. #include <Servo.h>
    / b0 [9 i1 r; y: H6 t
  4. ; J9 d+ q2 O; Z# x/ o
  5. #include "MePort.h"- f- Y9 V! a8 @5 d% ~( H7 M
  6. #include "MeUltrasonic.h". h9 N4 g* L) t" _  e4 A3 D
  7. #include "MeDCMotor.h"# W- Z$ N' ^- P7 }2 O

  8. ) @, x) o" ]: {, N# ]- L
  9. //double Input, Output ;
    9 N. q4 [/ }5 r2 C. ?
  10. float MaxSpeed = 255;
    ! J+ Y  @8 n% T( @
  11. float MaxPower = 180;
    * u8 M  Q* Y/ D" W; x2 T/ R
  12. float MinPower = 120;
      `. r% [3 T9 |2 m  k
  13. float Error,ErrorAcc,ErrorDec;1 X1 S. z& P9 O) \) F
  14. $ |: E- v( B, W4 K! ?0 ]
  15. float Kp=0.14;
    6 S& o/ p* x  e9 E$ Y5 v  f3 T
  16. float Kd=0.00020;//23;  L8 c( c. s' b7 z% g
  17. float Ki=0.000201;
    " l- \9 E3 w, V0 f' u

  18. 7 B6 |; f$ W" U; C# j1 A. v& x# p' e# h+ W
  19. float nPower;
    / ~$ l& T4 D, B8 t8 r. p3 {) `& Z3 \1 t
  20. MePort lightsensor_6(6);! j5 u5 {* X; p3 T, _6 k6 L, q$ Z6 |
  21. MePort lightsensor_8(8);
    & I, A) z0 m: y$ l0 I% ?
  22. MeDCMotor motor_9(9);+ D" u7 T& M# x6 X9 F
  23. MeDCMotor motor_10(10);* n- W8 Y, i2 g4 X
  24. unsigned long previousMillis = 0;
    ; W+ P0 }& S; c+ A2 [3 U
  25. const long interval = 1;) o; l. S' `0 a) X! n+ S

  26. ! v4 E+ G! U, F  @4 A
  27. void setup(){3 y: f; r4 n7 _: U
  28.     lightsensor_6.dWrite1(1);
    1 e; _' E0 ~4 j0 T8 d
  29.     nPower = 160;7 ~+ y% I5 z# b3 J
  30.     Error=0;) z/ w; n5 y: [. d1 Z! Z9 t5 v! \( t
  31.     ErrorAcc=0;7 o  A/ ^, b0 j; Z; E5 d* y
  32. }
    7 @% ~3 u( p% M+ g

  33. - S& M5 M3 }" U' g0 m0 z
  34. void loop(){
    / S( k3 K, }4 ~" x; B' K
  35.   unsigned long StartTime = millis();: A; K5 r1 Y; E- o# ~
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){  f9 P1 ^: F5 Z4 J  }  D6 J( D
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();8 [& N( F0 `  {# Y$ `0 n- B& U  [
  38.     ErrorAcc +=  nError*Kd ;/ U; z9 k$ f/ K# r9 V
  39.     ErrorDec -=  nError*Ki ;
    + {7 O3 V8 A9 _6 C6 F
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);8 i  b6 E3 d# Z" x( \
  41.     if(nError < 80 && nError > -80){! T, C/ |( b4 l" q- u: a
  42.       if(nPower < MaxPower){2 l& I0 L- B& e, `
  43.         nPower += 3;
    7 c0 h" n7 V: t; d+ l7 M  Z
  44.       }6 E: I$ i* _# g: E, E
  45.     } else{
    * o4 |$ P; {: l9 }% e
  46.       if(nPower > MinPower){
    2 S- L' k. a" }. s% H
  47.         nPower -= 2;! ^; u3 W) t4 ^! i0 ~; @
  48.       }
    $ {6 j! `& J2 A5 }
  49.     } $ n+ x, N! V7 X
  50.     MotoL(nPower-Error);3 A9 e  U5 s1 S5 }6 G, u
  51.     MotoR(nPower+Error);   
    : \/ Q9 c2 N% W3 z! F' K5 b; i
  52.   }else{- Q* H8 ?2 z8 H! O5 [
  53.     motor_9.run(0);1 G0 N5 h# j! _: c
  54.     motor_10.run(0);( D- x- }- I" {3 `
  55.   }
    + ?" Y( t0 o0 Q  s+ z: a" G' Z$ ?
  56.   do{}while(millis() - StartTime < interval);
    . J( o/ w- Q0 V8 u7 f8 e" Y' w  b  G6 m
  57. }
    % H8 E/ G4 D  F/ B8 j# @
  58. 2 b( d( a. R2 t; L4 _
  59. void MotoL(int Power){) A% P+ |; W) D" C: a' f
  60.   if (Power > MaxSpeed){
    + L: [, `1 T8 F3 }  a! s3 c0 ~( G" f
  61.      Power = MaxSpeed;
    . L1 H( C% J/ X& U3 g! Q- S
  62.   }
    3 x0 Z5 N+ p8 {
  63.   if (Power < -MaxSpeed){
    9 y/ N3 \5 o( g$ n9 E# O
  64.      Power = -MaxSpeed;6 p% D3 W$ U# x* J1 @7 X* k9 e; l2 K
  65.   } + T' j. ~; G/ N: c, G3 @1 B
  66.   motor_9.run(Power);
    - J, Y3 S6 |0 z% R' J5 r
  67. }  
    ; M; r$ n/ h* b6 f
  68. , x5 r" T- j4 f5 H6 `/ v% C9 \
  69. void MotoR(int Power){
    ( `5 p  o' c* d3 @) A% E1 f
  70.   if (Power > MaxSpeed){/ y1 n6 k! K2 o$ m9 G9 ]
  71.      Power = MaxSpeed;
    8 g- l/ O4 E/ ?' E2 b0 }
  72.   } * u5 l9 A! w# o3 P# b* W, r$ Y
  73.   if (Power < -MaxSpeed){1 g+ P/ n  V# l  y% e* G1 q% R
  74.      Power = -MaxSpeed;% p9 b- ^3 G8 c( G: s7 e
  75.   } 6 e/ S7 D; N; N4 M3 j" I
  76.   motor_10.run(Power);# [. D; r) B3 K& r& w; m. Q" ]
  77. }  
複製代碼

$ z; E! L3 h- P5 [' T0 t# K/ [, A9 z& M" A- s: z7 O- V' R
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ; {' X: ~. X8 o5 l9 I1 x; o
' G2 z1 }8 X2 E+ D! B
您好,不知是否能向您請教。
( _7 }6 ?4 z- N目前和宋修賢老師在處理Ardui Car
7 _' p" r5 o- w% D! u4 B8 k雖然已使用較繁雜的方式處理了跑出黑線外的狀況1 U! f! K6 e- x  x$ y) Z
+ @- ~3 D7 `, R0 S6 S5 o: C  X
但基於想追求更精簡的程式所以還是想請問一下& X1 \3 [: e  E% a" s0 M
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
: P" c) S8 U3 x8 I9 G- s不知道您是否願意教我可以如何處理  W4 d0 m1 T9 s# j
& h$ R5 A& _1 F- _& }& y5 P

! p5 v* K7 z$ o1 m以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;5 W5 e: A: q2 l& Z9 A* E5 j* M3 ]
  2. double CNY70Val = 1000;
    2 d! o* g3 T( D2 o
  3. int interror = 0;9 @3 X2 f! n4 ^7 N4 Z
  4. int olderror = 0;
    ; j" ?+ C( F  x
  5. double values;* `0 H$ D* h$ X

  6. " U1 Y- a6 c% M' [

  7. 3 E: a/ L. {& C! G) k! f1 ?
  8. void CNY70()
    * u7 t4 O2 E% S! f8 w! ^2 a" L5 z6 D/ [9 x
  9. {
    & w- t* P0 T( B$ V( w2 X
  10.   valuesRR = analogRead(RR)
    $ A" f% \3 p6 O3 O4 W  s2 _
  11.   valuesMR = analogRead(MR);
    9 B# M! b2 W( D4 B% b+ E( Z
  12.   valuesMM = analogRead(MM);+ \  B) t; a1 q+ f
  13.   valuesML = analogRead(ML);! i% G3 H$ ?0 p* ^4 V2 s7 U
  14.   valuesLL = analogRead(LL);# e  B( B% F$ m
  15. ! w2 X7 B3 B  n2 n/ c) M# g7 ~
  16.   if (valuesRR > CNY70Val)
    - L* s  }* p# D2 f* V
  17.     valuesRR = CNY70Val;7 @$ k0 p5 r& ~' G& J
  18.   if (valuesMR > CNY70Val)
    9 c- o& Y& r* O3 y- \& [
  19.     valuesMR = CNY70Val;& Y: p0 [- U, r( x; `
  20.   if (valuesMM > CNY70Val)
    / e8 }0 u. E4 {+ V
  21.     valuesMM = CNY70Val;
    1 n# n/ |% U" D; G( u' ?4 V
  22.   if (valuesML > CNY70Val)
    # {' Z( k2 w6 ]& c* z
  23.     valuesML = CNY70Val;
    6 m5 p' f- ~- {* W- Y
  24.   if (valuesLL > CNY70Val)
    0 [- |# p2 t$ v( \# g7 m
  25.     valuesLL = CNY70Val;% Y- a/ M( G9 x  t: ~6 p1 H  K
  26. 2 ~2 W0 ]! f7 J! g4 @, i3 D  z$ H/ X4 k
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;+ [% X# J) z9 y4 \+ V( a8 h
  28. }% R+ p, v7 @4 v' H9 f8 V
  29. 1 c. v* o- ^; W4 L' H9 a
  30. void Car()
    5 J! B6 c) Z, F# l; t$ D
  31. {
    8 U/ \  ^) e3 b5 Q8 j' |
  32.   while (1) {
    . n9 e* a% x2 j  B% k0 q1 n
  33.     CNY70();
    3 h  u3 b4 \+ B# L; [. c
  34. % p- p( n/ G& i. v
  35.     int error = ((int)values);
    3 T) j5 y0 s( a* a! z
  36.     interror += error;( U+ O# D! `: \( Y; K
  37.     int lasterror = error - olderror;
    - X) B' `) J% F8 a/ M. ]) ^
  38.     olderror = error;$ K+ O2 m9 O8 s5 {8 |% D9 B/ l
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ) z' [2 N9 T# W$ P; q
  40. , j4 H7 B+ w, h( X  C& Z' I
  41.     if (power > MotoSpeed)
    7 C' e- I7 {$ r* B3 @  G, u) j
  42.       power = MotoSpeed;
    . G+ i* [. j6 w- M
  43.     if (power < -MotoSpeed)4 v1 L6 }# F( `) S8 L/ y) e4 M
  44.       power = -MotoSpeed;
    2 j& C' B. l- B4 `9 S

  45. 4 H& B5 A7 k1 z' ^
  46.     if (power > 0)' {, ]  Q! {# R* Y5 e
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。" R3 a; Y8 l9 h- g! O5 C
  48.     else* X9 f/ u% y& a, ~1 m3 U  `7 k6 z
  49.       Speed(MotoSpeed + power, MotoSpeed);
    , y8 ^4 b3 }  Z$ R: R
  50.   }
    4 s+ h" O- M$ o+ c& h$ j/ Z
  51. }
複製代碼

4 P" s7 M: @# y1 }8 g, J0 c# f. g3 ]+ z3 ~& U/ D
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-4-18 10:33 , Processed in 0.024571 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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