圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20910|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>; A8 K" Z8 |3 b+ f) I/ G4 i( }
  2. #include <Wire.h>
    , Y6 s" \8 M: N7 Z9 v
  3. #include <Servo.h>
    6 j. b' R2 a" X  e0 s3 |2 u+ g

  4. & A7 B7 \, q" e7 W+ o( H- V5 ?
  5. #include "MePort.h"6 n# i8 Y2 R- R& F& @% O* B8 S- Y# f
  6. #include "MeUltrasonic.h"
    6 ]8 l8 p6 ^+ a0 |5 n7 l
  7. #include "MeDCMotor.h"
    ' W3 Q% H5 ?# ~0 N; ]5 d" U
  8. 8 t1 v% Z0 z( k& i  U0 ?/ m0 f
  9. //double Input, Output ;
    ' e5 _: H9 ~! J' `. e$ R8 a
  10. float MaxSpeed = 255;
    ; y$ y) _2 U; m" Z1 ~2 O* U
  11. float MaxPower = 180;+ ?; T( s) D, {/ p+ m( c3 p
  12. float MinPower = 120;
    ( y, y9 J: d/ }: L) ?- n( _
  13. float Error,ErrorAcc,ErrorDec;3 s& x' P1 z7 i' |- \. b- r

  14. : Q- ?0 L1 ~" q( x
  15. float Kp=0.14;2 F" E: c) q2 {4 L6 b5 k
  16. float Kd=0.00020;//23;
    - F1 h6 Y3 L: q1 Q& Z3 @
  17. float Ki=0.000201;* ]' u7 a/ B9 g! V3 H" G

  18. ! M+ e# F3 s  W. l% O: v
  19. float nPower;
    9 O7 r9 g. J8 s- L1 E
  20. MePort lightsensor_6(6);  |' V. E! U* e3 H. i
  21. MePort lightsensor_8(8);1 I5 }; z* z- s1 y: \
  22. MeDCMotor motor_9(9);& w9 J+ l( e1 U- r: S7 h, Z
  23. MeDCMotor motor_10(10);
    5 U, j: k3 C- I! O
  24. unsigned long previousMillis = 0;( J( p6 W" {) T$ [
  25. const long interval = 1;+ i9 o. E; |0 m; }/ P6 x8 n

  26. + g% ~- v6 L& L; [& o; d. ^0 x. F
  27. void setup(){$ J! K2 q5 |- l, H
  28.     lightsensor_6.dWrite1(1);
    % L: H9 L* w, \
  29.     nPower = 160;6 n# B! s4 C  f& T' l" N6 m
  30.     Error=0;" K# Q2 J3 d: k
  31.     ErrorAcc=0;4 a2 m& t/ ^% v: f5 ?# d2 L
  32. }
    0 w0 T5 K3 v* x8 x" E# m& z
  33. * U; T+ Z6 i1 x/ w; u
  34. void loop(){
    ( s: E" A& p" p% z4 U. n8 g% f: h
  35.   unsigned long StartTime = millis();
    9 I6 p+ y3 B/ O9 q6 ]$ `  G" N3 z
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){- p( T2 X; {8 K. `. G+ D/ J. {& S
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();+ S+ X5 {" C( y+ B
  38.     ErrorAcc +=  nError*Kd ;
    1 G9 w$ o! P2 K9 ^/ j6 X8 R) v  n8 m
  39.     ErrorDec -=  nError*Ki ;
    ; S  \, |2 N! L4 o/ |* |
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ; B1 z: M% q2 t% j# \7 I) J
  41.     if(nError < 80 && nError > -80){
    0 f9 n- e( j" n& [
  42.       if(nPower < MaxPower){
      h2 @- s" c) s8 G, d* |
  43.         nPower += 3;/ V* H+ e, J$ s$ m, R' w
  44.       }
    : |( s5 v( ]* Z% U, n) w$ B- k& ?
  45.     } else{5 {9 W/ T) T! v* |
  46.       if(nPower > MinPower){6 r0 A& ~( s: L2 k8 P6 ~
  47.         nPower -= 2;
    6 ^# L( L6 N: u$ a0 x6 u
  48.       }
    + E+ `( T7 K1 i' Y6 e' r  H5 P' i5 v$ B
  49.     } 0 Z7 v5 S+ I3 ]3 l
  50.     MotoL(nPower-Error);: k7 Z: E2 D! w0 v( U! [/ v
  51.     MotoR(nPower+Error);    3 l+ A, ?' P2 c% J; n! D; W8 M
  52.   }else{) y# o' n( _- ]
  53.     motor_9.run(0);$ S" }& ~) Q2 G, Y  Z% E+ A$ {
  54.     motor_10.run(0);  z! I" @( X3 b6 l8 @$ i) v
  55.   }
    & b9 V7 A  j/ I- `  o0 P
  56.   do{}while(millis() - StartTime < interval);
    5 P5 E/ I1 R5 ^; a
  57. }+ W8 j; G) u6 m# X
  58. $ U+ L& n6 ^& W6 ~( a
  59. void MotoL(int Power){1 f: ?3 Y3 {0 v6 l. c0 z
  60.   if (Power > MaxSpeed){
    , y2 p/ i9 e) J  U$ d0 T! g
  61.      Power = MaxSpeed;; M* q8 |2 l! ]( B2 A/ [# r7 |
  62.   }
    4 t2 q, v! v0 q7 Y. [; j6 `
  63.   if (Power < -MaxSpeed){6 n- @. [) ~0 ?. D( F: z9 w! Z; r
  64.      Power = -MaxSpeed;
      q; |  \" k( X) @9 j5 i1 d
  65.   }
    ! @# G& `" ?6 G  [- K" E
  66.   motor_9.run(Power);; k3 P. n- G3 G. G# A4 J( ~
  67. }  
    ) R0 ^9 V7 N  ]1 U/ J' c& m

  68. . u: D  G" f+ X: x5 n0 [
  69. void MotoR(int Power){
    + v9 `$ d8 f$ G- l
  70.   if (Power > MaxSpeed){( C' s& h% t  w* z  _
  71.      Power = MaxSpeed;
    & F" x3 _) [. e' G. {0 H5 b0 v
  72.   }
    ' t' ]$ E: F. F( b" k
  73.   if (Power < -MaxSpeed){
    . H) u8 X8 d- O. h0 I/ r. O- w
  74.      Power = -MaxSpeed;
    ( p+ a, v7 Z: R0 h( d
  75.   }
    ! }6 N5 U6 D# G5 P
  76.   motor_10.run(Power);$ d5 x; _2 D" L4 r. E
  77. }  
複製代碼

! Q+ u# H7 L. N1 s8 I+ w3 Q
! ~  _* n" B" x- f
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
. a, \. I2 e7 [. Q' R7 E- W$ D4 d$ {( L
您好,不知是否能向您請教。8 _5 y! l5 L. l$ L) `8 ~4 Z2 p
目前和宋修賢老師在處理Ardui Car0 Z9 N2 L5 f7 Z  w* Z3 H  ?  D9 L
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
" l  S; e, b4 J4 N
3 O% p& C/ I% ]  a但基於想追求更精簡的程式所以還是想請問一下
9 E3 X4 @# c+ Y" z% x就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝' i" k& G5 X6 H2 }7 ]
不知道您是否願意教我可以如何處理
# `' W. P& g$ T$ K+ T/ \& F
' o+ {5 [8 i  s0 ^* I
% G4 h7 e+ C; r以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ' S$ B/ b( \8 v% K5 r: Y8 {
  2. double CNY70Val = 1000;
    ! ^$ e$ r. q8 V: }1 j
  3. int interror = 0;* T6 F) y" N- m. O/ ]8 b: `# C
  4. int olderror = 0;
    / `" e+ l6 Z9 P  _6 Z
  5. double values;
    1 `9 ^# M# a) |8 ]7 p( _( L8 U
  6. " x$ n" g  b9 K2 g
  7. # m( O; g3 U: D' v0 \: P% W
  8. void CNY70(): t0 g! {% d+ F7 t4 P8 q; Y! T( J) Q; O
  9. {+ _3 }! \1 b+ @) G" X4 e2 f* E! F: j
  10.   valuesRR = analogRead(RR)5 d2 H0 v& O! `& J3 {# k
  11.   valuesMR = analogRead(MR);9 O3 z' _  p; ]# f6 s' c; }
  12.   valuesMM = analogRead(MM);' z  Z1 P6 k+ _; }) h: |& U! _
  13.   valuesML = analogRead(ML);# Y8 C* _8 _  j- v0 d+ D
  14.   valuesLL = analogRead(LL);, G; J4 ~1 v( b6 W2 Z& @

  15. 9 \- l  J4 O- o( X8 R
  16.   if (valuesRR > CNY70Val)! U9 B7 ?9 p' o6 K2 T% _
  17.     valuesRR = CNY70Val;
    7 l# Q% j+ C: [3 O& f. [0 B
  18.   if (valuesMR > CNY70Val)
    " F9 X' T8 P: w: u
  19.     valuesMR = CNY70Val;
    5 z1 h% l" o$ Z) S( P, n3 M
  20.   if (valuesMM > CNY70Val)
    5 D( l  y4 [3 h* r9 ?0 D
  21.     valuesMM = CNY70Val;" C6 A" C8 ~9 u# M
  22.   if (valuesML > CNY70Val)  U" \  s/ o3 O
  23.     valuesML = CNY70Val;
    ) O+ ?7 p  `7 P! a0 Y. X3 v4 f0 t
  24.   if (valuesLL > CNY70Val)
    6 ]  {; a% Z# K" v/ w5 t, _0 q3 I
  25.     valuesLL = CNY70Val;, |+ u6 }; ]3 }2 q+ T3 K
  26. & ?3 K  p1 Z% t+ I' d
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    # w  n: |2 C! w4 s$ G0 p/ t
  28. }
    0 @1 u' \: a! }5 ?0 x
  29. # |' ~# e0 Z/ A& \4 m4 U
  30. void Car(), C* Y, J( e+ A: w
  31. {
    ' Y! }$ N4 |0 U8 A
  32.   while (1) {
    # d1 d' w1 U9 t; p5 R
  33.     CNY70();. j2 X8 H3 s1 H7 h
  34. ' c0 i/ s( n9 L
  35.     int error = ((int)values);
    1 C2 t' p. R- j- I9 l. S+ N
  36.     interror += error;
    . l- F0 w% |+ K$ Q; E! k9 j
  37.     int lasterror = error - olderror;  u' u3 O( V- g  W8 A& o
  38.     olderror = error;) Z  M$ p3 W* N! }+ L2 j
  39.     int power = error / 5 + interror / 10000 + lasterror;! R5 _5 L( u3 R% a/ y! {- g0 f
  40. % |& y/ t% y& l8 _
  41.     if (power > MotoSpeed)
      j0 f; ?; {: \5 G/ _. c$ i# U
  42.       power = MotoSpeed;  J% ?+ ?  |" \) @% s
  43.     if (power < -MotoSpeed)3 U/ C5 j3 E' U! @- }# g
  44.       power = -MotoSpeed;9 c2 J& _" z% h2 T

  45. , X! C/ v) b  |7 h! B
  46.     if (power > 0)
    0 O4 D0 S; E9 z( g/ \, |: T( [) ?5 N& b
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。/ g/ c' B& n- {$ H; o7 f+ h6 R
  48.     else, n) @! [+ b* E- ^- ^( r  r6 g
  49.       Speed(MotoSpeed + power, MotoSpeed);8 y6 K9 {# l0 E& K' L& t
  50.   }8 i! y# |8 O. @9 T
  51. }
複製代碼
: D  e3 Y6 g" C6 U/ C9 A/ U

9 j3 x! l) q/ s+ \' ]
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-1 20:16 , Processed in 0.029974 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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