圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21694|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ! F2 n7 K) F% n$ D9 J
  2. #include <Wire.h>
    $ c6 K; }- ~* Y1 J& o
  3. #include <Servo.h>
    9 |+ ^1 T% ?7 Y8 p, P

  4. + ?# G4 x7 s" d3 n; R% a2 i0 v
  5. #include "MePort.h"- T; A" b, j" Y0 O* a/ D
  6. #include "MeUltrasonic.h"8 `- \' o& J1 @3 o
  7. #include "MeDCMotor.h"
    0 Q  [  ]5 }9 d. D& C, J
  8. % F' h1 x9 @* t1 O1 O! }7 N
  9. //double Input, Output ;; _6 T9 e8 ?' @, [! h
  10. float MaxSpeed = 255;$ m2 b; o+ ]2 a
  11. float MaxPower = 180;) R* P; p* v" m2 E/ L3 |
  12. float MinPower = 120;  d  e7 J; v: g/ b, ?5 b* J
  13. float Error,ErrorAcc,ErrorDec;
    8 H) Y4 G! H, |# m; c' M

  14. % X1 j" B- N9 M4 ^% G
  15. float Kp=0.14;
    5 \$ F, V; l" `# D. }7 K' A
  16. float Kd=0.00020;//23;
    & K9 q+ h! G% E% X. Z% S2 u
  17. float Ki=0.000201;) l+ V  K7 y- [% z
  18. + }- b: J6 M5 y" B  D7 K
  19. float nPower;4 n+ W8 l; g: U# m! J0 g0 E
  20. MePort lightsensor_6(6);: f7 K$ b9 O( ]! Y/ \$ V; U2 D
  21. MePort lightsensor_8(8);1 u, L# j( v: P
  22. MeDCMotor motor_9(9);
    * \5 x  @! h% `3 y* l
  23. MeDCMotor motor_10(10);! ~4 {8 c4 s5 K  @) ?) a: H1 p
  24. unsigned long previousMillis = 0;3 k" [$ I2 W2 d' N$ j
  25. const long interval = 1;& u: b' @) o# q; V, k
  26. ( \1 ~% A3 Z- x
  27. void setup(){4 _2 k+ A" w+ }7 B
  28.     lightsensor_6.dWrite1(1);2 `, e5 T* C. |
  29.     nPower = 160;
    / j* ?  P* W- L3 r$ Q% @$ P) u
  30.     Error=0;
      O# k4 l8 D! s
  31.     ErrorAcc=0;: H0 u  l* e! ^6 N2 o
  32. }
    + b  J5 w2 D, ~3 N6 J
  33. 1 S  o0 ]* J% j( ~7 J
  34. void loop(){
    + ?; q% \/ b- G4 C: P, ?
  35.   unsigned long StartTime = millis();
    " C; |! C8 M: |$ V2 s4 b/ P! Q7 y
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){, w, z  X" k. A# z5 j3 d
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();& {7 z5 w! t3 V/ ]( U8 X5 U  e
  38.     ErrorAcc +=  nError*Kd ;. `- k& D; K/ ^; U' a: ^  B
  39.     ErrorDec -=  nError*Ki ;& W6 \3 C/ w2 m+ P
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ) N6 |. {  @. P6 R; v
  41.     if(nError < 80 && nError > -80){9 [9 `% [7 ^+ _; A& l
  42.       if(nPower < MaxPower){
    2 |& M% @, j9 V( E  q; S% q: ~/ o
  43.         nPower += 3;
    # t7 @& G* ]. B7 B! k3 b$ X
  44.       }
    3 z8 _( k1 {# z
  45.     } else{+ z& v3 Y3 t- Y* g
  46.       if(nPower > MinPower){' x7 O1 k) R# c8 f
  47.         nPower -= 2;
    8 u! P# b/ v& k( |5 x" \  ~
  48.       }
    7 w8 l; Y  X" \" X0 N, w
  49.     }
    ! c; m- K' v+ W! Z  E
  50.     MotoL(nPower-Error);8 H$ e& ~) f' v4 h* K1 g+ p2 {( u
  51.     MotoR(nPower+Error);    ) N1 }0 Z# Q6 S' h# U$ H) T) n
  52.   }else{
    ' K3 Q8 ]" t) V" _
  53.     motor_9.run(0);
    . m- F6 l7 e- ]+ }
  54.     motor_10.run(0);
    ' c  m4 _8 Q0 a2 R: a6 T% t7 R) D
  55.   }
    5 \' |3 k1 E1 ^) W* k5 T- P) Y
  56.   do{}while(millis() - StartTime < interval);
    * g) {6 C6 h4 I; `. j2 ?
  57. }& m" b/ \- ^' m+ x" X! _2 e$ k" x. `, I
  58. 7 I9 u& h$ I- N
  59. void MotoL(int Power){& J) W# w0 \4 A, z2 F4 V- o% W/ M
  60.   if (Power > MaxSpeed){
    5 W' p0 M# v7 u0 i* D
  61.      Power = MaxSpeed;- d0 m: t. V5 b: R& S8 L& d
  62.   }
    $ X( [( B8 M! ^# x
  63.   if (Power < -MaxSpeed){
    & I* V4 b1 L6 T* P
  64.      Power = -MaxSpeed;6 @1 B0 P5 _- f: z* Q' b
  65.   } 1 g# C0 x5 A! Y6 l9 y- N
  66.   motor_9.run(Power);
    : n/ }* E$ J* E$ H. |1 W
  67. }  
    ; O5 e' y% R& M/ m- [" }6 W4 S

  68. . J- s8 J3 X  u' M
  69. void MotoR(int Power){
    - [# Z+ ^8 g) x* W
  70.   if (Power > MaxSpeed){
      ]/ e2 P$ F9 ]) V/ I
  71.      Power = MaxSpeed;
    . M& [" x& C% b. [+ P0 C+ Y
  72.   } 1 I4 A7 O7 o  K
  73.   if (Power < -MaxSpeed){
    5 m; r- D2 r" C1 V$ L5 _! D
  74.      Power = -MaxSpeed;# F: D4 U3 e5 `, ?) G# N
  75.   }
    # X. V! K8 E( T4 L# i% S
  76.   motor_10.run(Power);
    " w) H' `3 z1 U$ _5 L/ A
  77. }  
複製代碼
7 A/ P6 o; F; `: i" H) O3 t5 k
6 E5 P5 v/ s0 L7 a2 J
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
8 Z. \1 {1 m9 A' o% x6 h# \4 T; V, N+ x3 _$ c
您好,不知是否能向您請教。2 P( F; W; c4 t: S. v$ H( U7 }4 e
目前和宋修賢老師在處理Ardui Car) O2 F4 g! z9 O4 z& E& V
雖然已使用較繁雜的方式處理了跑出黑線外的狀況/ F% _& O8 ~, f9 E' s- x

  x! T! o+ h, b! p" \% K( N* Y但基於想追求更精簡的程式所以還是想請問一下" p. s$ f: l8 p+ P$ `" f
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝$ k! S4 `+ }7 M
不知道您是否願意教我可以如何處理) `8 ?/ ^& |2 m% J5 O4 ^

% j- a: [" _7 k8 A/ g% t
3 D9 b: t  @+ g2 ~( w3 ^' q( z# f以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    / E( r% c; A3 z7 Z& i' [, w
  2. double CNY70Val = 1000;
    5 {4 c( K8 Z% i" f* o* G
  3. int interror = 0;
    & c5 X( H0 _  H9 i/ w
  4. int olderror = 0;
    % B% u# i! E" t
  5. double values;
    , F& W$ i3 I$ m% P) M  m
  6. 8 }$ g' `: G2 Z. l  _0 P

  7. . _) F; r- {! Q% @* X; E. b6 g- p
  8. void CNY70()
    8 \/ {1 i+ f& }
  9. {
    3 I; e8 r8 u4 L4 B: p+ {' }( l
  10.   valuesRR = analogRead(RR)  q. L- M9 \8 w7 e8 {: I
  11.   valuesMR = analogRead(MR);: @3 m% O- T8 B4 c* m) @8 L# K6 ^
  12.   valuesMM = analogRead(MM);
    ) k7 |6 `( @3 S1 \+ N
  13.   valuesML = analogRead(ML);4 @' E  P$ w2 w
  14.   valuesLL = analogRead(LL);
    4 M, \  G2 c# ]
  15. " q( t5 ?* _" V/ ?: j  i7 X
  16.   if (valuesRR > CNY70Val)3 {. M4 P! G6 J6 s! w7 k, H
  17.     valuesRR = CNY70Val;8 C' g! p: r! i; }
  18.   if (valuesMR > CNY70Val)1 M' Z1 L7 K/ R, ~% k3 g4 _/ H
  19.     valuesMR = CNY70Val;
    9 _! A1 V( L- ^9 X
  20.   if (valuesMM > CNY70Val)
    ) }2 a4 d3 L. d7 {4 Z
  21.     valuesMM = CNY70Val;
    : g! `. h8 R  F/ b) h
  22.   if (valuesML > CNY70Val)/ Q8 K; }4 y' N, O6 ?+ V
  23.     valuesML = CNY70Val;# \  j! K$ [+ e
  24.   if (valuesLL > CNY70Val)
    * b( u& ^9 h+ |- P2 o
  25.     valuesLL = CNY70Val;
      W0 y4 o1 s4 E8 r# W! z, C

  26. 4 y* R, Y$ Z2 g5 Z
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 d# q+ N- w6 c3 [2 o3 P. \
  28. }. \# d% v7 ~& q7 n5 P3 ]

  29. : V9 c$ E, n3 j1 k& X" y
  30. void Car()
    " h, n8 r) x9 W3 k0 f0 O
  31. {7 v4 j$ E$ [$ v9 z7 B9 W
  32.   while (1) {. H2 d5 Z2 w3 T, n* ]
  33.     CNY70();
    $ i& w; `* Q% l2 W" t- G

  34. ) c+ ?9 o+ _1 H# U
  35.     int error = ((int)values);
    & S; Z% R- @# x* D8 L+ h
  36.     interror += error;
    0 w% B' U- h8 q, g
  37.     int lasterror = error - olderror;
    1 O2 n- ^+ @' b0 ?) |# s# w( E
  38.     olderror = error;
      v  k/ R; @. b
  39.     int power = error / 5 + interror / 10000 + lasterror;
    " u, p5 L' C1 c; ]: u. q

  40. 1 n4 Z+ y  I1 h" t
  41.     if (power > MotoSpeed)& w4 k9 i" f1 e- ^8 ]* {( E
  42.       power = MotoSpeed;
    - q9 `7 E) _+ ?! z
  43.     if (power < -MotoSpeed)( ?: Y  x( I* T# {* P8 H$ B/ {) k" d
  44.       power = -MotoSpeed;, y. j" u, M, t. d* H/ P

  45. 7 ]1 V( X* S, l, }3 w
  46.     if (power > 0)
    ! a' m& Q0 Y1 L! B* }, P1 I
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。$ `% n% m* Z& d$ s8 y
  48.     else
    1 j# I! ]: h! ]4 f2 b
  49.       Speed(MotoSpeed + power, MotoSpeed);
    8 ^3 Z: e/ z1 t+ u; _3 B
  50.   }
    $ S8 _: B/ o3 p8 i, E/ a
  51. }
複製代碼

+ L2 p% q- @$ O9 \  O& S$ Y; v  B/ E
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-22 20:25 , Processed in 0.024910 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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