圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21839|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>! k% e- j# v# {+ n) M$ J7 S
  2. #include <Wire.h>* u$ C2 s9 L" T! Z% \
  3. #include <Servo.h>
    2 m: O$ y+ F5 A; F' y9 o4 ^

  4. & m& ~: k' N% V: G( A. Y% I0 t
  5. #include "MePort.h"
    ) V3 J" b# A, D& h. V9 K& x# k
  6. #include "MeUltrasonic.h"6 T+ U8 Q8 c  T
  7. #include "MeDCMotor.h"8 D# H; _& `) \' i) u; L
  8. 1 _: M) U' o2 F& F
  9. //double Input, Output ;; s  s6 t, J3 H( B' N
  10. float MaxSpeed = 255;
    1 d3 |0 P% ~  J# w
  11. float MaxPower = 180;
    ! H( C% W: a2 v
  12. float MinPower = 120;
    6 ?( C7 ]; [8 [2 q
  13. float Error,ErrorAcc,ErrorDec;
    ; ~! G# B- |- L4 Q& @
  14. ( o. f+ d: }; |, q
  15. float Kp=0.14;/ K7 ~/ i; _: [3 v9 m$ ]$ ~
  16. float Kd=0.00020;//23;
    + `% l! r3 Z1 i, l5 i, h
  17. float Ki=0.000201;/ e! J6 S; }. l9 a9 P# E/ E3 H9 e

  18. 2 [- g! Q- `! y9 m, w: [# f' t
  19. float nPower;
    ! v9 k0 ~1 l# ?. O0 c5 T
  20. MePort lightsensor_6(6);
    8 X3 Q7 k) ~7 P; i% i
  21. MePort lightsensor_8(8);; b4 }; P9 t# U7 f/ ]4 n
  22. MeDCMotor motor_9(9);
    & J3 ]* x5 B3 B0 n5 I, R9 x: h7 O+ [
  23. MeDCMotor motor_10(10);
    / j* u/ S( p" j2 [
  24. unsigned long previousMillis = 0;, U" j* J7 R; I3 n# r
  25. const long interval = 1;
    , K7 q2 M7 N% Y6 |: B2 {- ?& C

  26. + D" b% x1 }3 i4 ~( z  Z7 ^$ j- z
  27. void setup(){( N3 S" U2 h5 h+ r# C) u: W
  28.     lightsensor_6.dWrite1(1);8 g2 U+ B) B% O4 Y6 h, ~- C
  29.     nPower = 160;
    % }7 l9 X8 E' h& ]) Q, W4 Z
  30.     Error=0;2 C- D! r& c+ D* ?1 q8 @- k* C
  31.     ErrorAcc=0;
    2 g9 a. I1 G! O0 _
  32. }
    $ `& e- Z& u  U7 }8 ~' `' d- N
  33. ; d0 d, m' O* H0 d: W
  34. void loop(){5 @0 C% B7 q; p: z6 W
  35.   unsigned long StartTime = millis();; [8 m5 z& ~; P
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    - C, l0 b: Y& Y0 d
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    5 q* B1 H( ]) B: E7 e8 \- e- x
  38.     ErrorAcc +=  nError*Kd ;! Z! R/ t4 C( V" S2 y" r: M
  39.     ErrorDec -=  nError*Ki ;
    " N+ N% a6 k# V" a+ a
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);! c6 _* F( w: @1 I% W. w
  41.     if(nError < 80 && nError > -80){' q* c% R' {/ i3 F+ h
  42.       if(nPower < MaxPower){
    ! k8 f- U; a* c5 w" U
  43.         nPower += 3;
    : p6 v$ `5 o( X+ c2 }* V
  44.       }
    ; T' Z+ M" `# p7 t( `" k
  45.     } else{
    . c1 T/ \" b: L. e2 ]) `2 B, q) v
  46.       if(nPower > MinPower){
    2 ^7 D3 ?- G' s5 p2 [' |& ?
  47.         nPower -= 2;
    + L: d! v/ Z; i2 f/ ^
  48.       }9 m; D  W/ x% B$ n: {6 T2 ~
  49.     } : \8 M7 k" Q  u: R- d
  50.     MotoL(nPower-Error);
    + y& A* a6 {) @" a; L/ J
  51.     MotoR(nPower+Error);   
    % x4 m1 Q6 a6 @
  52.   }else{
    " k1 X# U2 I. u" M3 v4 o" T" S
  53.     motor_9.run(0);* v, m) I# [* Y9 @! I( u! [4 E
  54.     motor_10.run(0);
    5 u' X- B5 n4 D2 |3 p
  55.   }- v6 I6 z) n/ A- m: q3 I& T
  56.   do{}while(millis() - StartTime < interval);; D' {& W1 X+ K% }7 p/ f
  57. }; Q1 O- |: ]" B+ h0 Q2 Q( b* T" H
  58. ; w- f; n; p: n! m: M: X: a
  59. void MotoL(int Power){3 C8 ]* X+ v0 L$ p2 T* Y
  60.   if (Power > MaxSpeed){6 [, _" }! ]2 W4 O
  61.      Power = MaxSpeed;
    ' F3 j- i4 F, r6 A/ k/ ~
  62.   }
    ! p8 i3 n' @5 Y# X
  63.   if (Power < -MaxSpeed){9 J4 z9 t4 O/ C4 w
  64.      Power = -MaxSpeed;
    - b# B" a! B+ u, Q4 f+ h0 c3 m( Y3 D
  65.   }
    ; z# k1 Y0 V: W) H4 ?  y/ a5 G* Z
  66.   motor_9.run(Power);- z9 g2 s  Q% Q% e0 C1 c
  67. }  
    4 M& T+ ?& `0 H# k) k

  68. 0 Q. y# y+ c/ G; @# Z( Q
  69. void MotoR(int Power){4 D3 R! q- _8 g; f. M: o7 M
  70.   if (Power > MaxSpeed){
    # H. D4 `  Q, N) K# m6 ?5 t
  71.      Power = MaxSpeed;6 |) x$ H9 C7 W" `; |+ N" G+ Q3 @
  72.   }
    % F4 @1 @0 I' W" i" C3 G* e) U
  73.   if (Power < -MaxSpeed){
    3 G8 O7 e  y! p. {
  74.      Power = -MaxSpeed;1 F- M, t, ]6 y' K+ n' o% {! [- p
  75.   }
    $ |6 f! [! Q+ J: V
  76.   motor_10.run(Power);- |! E: |" V* U% X7 ?1 U
  77. }  
複製代碼

3 N4 T; H/ F2 g# y* s; z9 J& r) i; w7 l" }2 g
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
3 N) B9 }' _7 O/ M# Q: `& w, i# f5 l* p
您好,不知是否能向您請教。
- C# O! {4 v% N9 k/ Q目前和宋修賢老師在處理Ardui Car7 w& H* g; K6 I7 i2 y# s0 I
雖然已使用較繁雜的方式處理了跑出黑線外的狀況4 W* p' E' Q1 o: v
* F' H% f: z) s" \
但基於想追求更精簡的程式所以還是想請問一下
" T9 y9 N+ X" ?% O2 g1 B) ]就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝4 x- o$ a6 }# N% |$ ~2 |3 @4 _- b* q
不知道您是否願意教我可以如何處理
, G( i0 ~5 t4 i8 c+ U$ E
% ]  o+ L  z3 ]' G, A
5 H; z3 N+ q4 X, Z3 W以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;- S& z, d3 E1 @* u
  2. double CNY70Val = 1000;3 f) p8 i7 y% N; B! T$ }. P
  3. int interror = 0;& `% u! |3 T8 R& h
  4. int olderror = 0;+ @# o! M! }3 a, q4 V+ T2 n# \
  5. double values;# V! u/ W/ E  w! G- b
  6. ' x# P" f# _3 X) ]3 f1 l- I; _
  7. 0 a1 J* o5 x9 P2 g
  8. void CNY70()
    # m: w- ], K& `: G* m, X) x
  9. {* W8 G0 O2 D0 U6 L  Q
  10.   valuesRR = analogRead(RR)+ Z' z; D# p- e: j
  11.   valuesMR = analogRead(MR);1 z9 W$ W6 i, B# z
  12.   valuesMM = analogRead(MM);4 N0 e, W- ^# r* D, h" U0 X. A
  13.   valuesML = analogRead(ML);
    $ Q1 E$ `5 W4 ~  r3 J
  14.   valuesLL = analogRead(LL);8 J# |, ^: W- p( b/ b
  15. . ?6 X. |8 N$ g
  16.   if (valuesRR > CNY70Val)- k, o0 [6 F3 E0 H  @
  17.     valuesRR = CNY70Val;
    9 j8 v8 x+ `- h: @, q# l
  18.   if (valuesMR > CNY70Val)5 ^# T4 t! n* W& Z
  19.     valuesMR = CNY70Val;
    " @& ]  t$ h, b) |
  20.   if (valuesMM > CNY70Val)/ b. i1 f4 r) k+ |3 h9 B8 w* V( N
  21.     valuesMM = CNY70Val;
    ) N& G$ ]5 }/ F: q  L6 y* g! h
  22.   if (valuesML > CNY70Val)+ `% w. L$ ^3 t/ o9 i1 v& i
  23.     valuesML = CNY70Val;# d( F1 c+ J4 Q3 g
  24.   if (valuesLL > CNY70Val): L3 d9 G( j3 j- y
  25.     valuesLL = CNY70Val;% ]2 ]0 ^5 K- {" e* D1 @- f
  26. + }- T% Z& M' z* o0 u
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    9 n! h8 u7 L, w% }: H* x& N
  28. }) b. T8 ?' f$ R; Q

  29. . K4 W  v* f8 N4 m; ~, E8 ~) J
  30. void Car()
    $ ?' C2 S( A+ r+ A. a5 D
  31. {
    % q7 p* @& {/ c! x; [% z6 [8 ^
  32.   while (1) {
    ' K9 B* t# S/ `/ x6 R: L+ B- `. _
  33.     CNY70();
    ! a9 [4 f3 ^- r9 Z& @
  34. $ B( W) E" W7 @0 |2 N& i2 ?% N
  35.     int error = ((int)values);
    ) _3 |. L+ B" q$ Y8 B
  36.     interror += error;
    1 k% A( G* q* [9 D* I9 d2 X
  37.     int lasterror = error - olderror;
    : [2 ?3 _8 Z: K  z# _
  38.     olderror = error;
    0 G% D( ?  F3 X* \/ j
  39.     int power = error / 5 + interror / 10000 + lasterror;) `3 b  m% A+ `5 i1 N$ o6 h1 k( l
  40. 7 W5 t6 W& Y( b
  41.     if (power > MotoSpeed)( z. V. U+ G; O5 ?  F* h
  42.       power = MotoSpeed;
    4 G, q* S8 S+ m; m# y7 Z* f
  43.     if (power < -MotoSpeed)
    ' v- H% c* X- h- `1 A
  44.       power = -MotoSpeed;/ ]6 Y  n3 D; ]- O( d  b3 a

  45. 5 E/ H1 a, r) l7 \( G) l2 v
  46.     if (power > 0)8 V1 d- C5 v1 L  K+ O
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    , D- m2 r8 Y- @+ V7 ^# ^" o* w
  48.     else
    0 M. N% D2 }* ?) v2 L# R
  49.       Speed(MotoSpeed + power, MotoSpeed);
    0 `, l" f) W" d; H) ~
  50.   }
    . V. p$ _; o& N" j. M# |( H* M2 g' K
  51. }
複製代碼

4 Z! Z* h7 \4 g. J% }8 E( T" C( A' [8 S4 k
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-4 23:22 , Processed in 0.023449 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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