圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21689|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>! n- B* f' B$ q* ]
  2. #include <Wire.h>1 X/ w; [" T0 V* f/ k
  3. #include <Servo.h>
    6 U  J1 F3 l& \  W( X* f% |9 ^
  4. . C( t$ p& U/ R3 O
  5. #include "MePort.h"
    & \+ ^4 @" z6 R8 B" S
  6. #include "MeUltrasonic.h"5 \* O: O) j& I" \( L8 R
  7. #include "MeDCMotor.h"
    $ f. }$ z, H( V

  8. / m) t6 C6 K% _+ H
  9. //double Input, Output ;1 S% l" ?4 n$ g+ d) L% _/ `6 [6 ^
  10. float MaxSpeed = 255;
    ! I$ I9 J% e. x# N' L3 r0 z  q) y5 S
  11. float MaxPower = 180;
    " Y0 \+ D/ N5 Q! p  _* M  a
  12. float MinPower = 120;
    # E1 a) ]" W, x4 {- a8 G
  13. float Error,ErrorAcc,ErrorDec;+ m! X& R9 |' N. T- N
  14. 5 s0 F0 j+ U7 E
  15. float Kp=0.14;
    , ?3 L% Y; h  T2 l: c9 _$ A0 e
  16. float Kd=0.00020;//23;6 N& b6 j7 w% P* y$ i1 G; D# e5 r
  17. float Ki=0.000201;4 |- R1 Z: @5 j3 J! X
  18. 3 e3 L7 k4 z* c5 w
  19. float nPower;
    1 @$ V/ S; `, R! ?7 Y9 J
  20. MePort lightsensor_6(6);/ l5 H( I/ z9 Z$ F  B; v
  21. MePort lightsensor_8(8);! y& E: [  V& V
  22. MeDCMotor motor_9(9);
    # I) F$ B! P; n9 I* N
  23. MeDCMotor motor_10(10);3 i* a) P0 R! z; [: f- Y; A& c
  24. unsigned long previousMillis = 0;( l7 z5 \" c$ U1 P! w% o
  25. const long interval = 1;6 l( }/ O& g5 \$ X

  26. 3 l7 ]5 ^, ]* o- a
  27. void setup(){- H$ C7 R" d6 U. W, J
  28.     lightsensor_6.dWrite1(1);- `7 J1 `- O5 Y! k) X0 v& q6 z1 Z
  29.     nPower = 160;
    + Y+ Q- X+ y% _9 t$ x7 I& C  L
  30.     Error=0;  {- o3 `( \# ]1 s/ T
  31.     ErrorAcc=0;
    8 Z5 W1 E9 y% T0 M
  32. }
    0 d' v+ F; H: {* O

  33. 3 R" y) F4 t- |' Z+ Z7 h
  34. void loop(){' \6 S; h# x$ v8 H7 P: T
  35.   unsigned long StartTime = millis();
      m5 r: u  a9 ^3 I- t! j6 {( D" e
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
      j. [: }; Q% P& k
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ( Q# b, S: w4 J3 S( }
  38.     ErrorAcc +=  nError*Kd ;
    / k) t, u. X5 {. F% d$ P
  39.     ErrorDec -=  nError*Ki ;
    - R: x' w. i4 C! O5 `- `
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    1 ^. W( B; p# T3 U8 r- X7 |, z
  41.     if(nError < 80 && nError > -80){) j7 M% d) T" f& Y
  42.       if(nPower < MaxPower){+ s/ B+ D4 p) o8 I  z
  43.         nPower += 3;5 W2 ~4 u1 c/ B) s1 i' Q5 n, ?2 Q
  44.       }' ~; Q% `. L* x7 {* a5 h
  45.     } else{
    / W, x9 z  \, W3 q
  46.       if(nPower > MinPower){
    $ {5 p! {3 F$ f1 C7 s0 P5 G, [
  47.         nPower -= 2;4 [& T. l9 j2 [6 `1 o* ]2 J
  48.       }
    ! s$ m$ v# z; O
  49.     }
    5 ~' T3 N$ w! q* I. w
  50.     MotoL(nPower-Error);
    ( [4 s: |8 b/ Y6 R: |& x) ]
  51.     MotoR(nPower+Error);    ; W9 L: a9 ^+ @+ H
  52.   }else{
    : q2 H1 b2 |/ t2 ~0 G/ z/ p1 b
  53.     motor_9.run(0);3 {4 z2 `2 \' N1 i
  54.     motor_10.run(0);. _% }; E& M  z
  55.   }8 x; F' G7 t5 ^+ t, I7 ?/ ]: r
  56.   do{}while(millis() - StartTime < interval);( l, t* p. p$ E1 q- e% U# S1 ]
  57. }
    . q/ U/ i) v) S3 x
  58. # p) K7 B4 W8 |
  59. void MotoL(int Power){
      I- Z& R7 x! c
  60.   if (Power > MaxSpeed){
    % E3 A; V+ A7 T: r5 S
  61.      Power = MaxSpeed;
    5 f" S$ ~, a# G2 E
  62.   } 9 A3 c: y) S! {7 r6 n! |$ \0 V* T
  63.   if (Power < -MaxSpeed){' _: J) a* A3 s* x8 u4 v
  64.      Power = -MaxSpeed;7 @" b7 p  b# s! a5 Z
  65.   } : D1 ^! d+ v* M6 g% e
  66.   motor_9.run(Power);
    . ]0 e" E, A* p7 v% ^
  67. }  - m) u' v2 C. d3 r1 O

  68. + g1 Q7 [% k+ M2 A" j
  69. void MotoR(int Power){$ e% N" _" [5 x$ h; ^* O/ e* Z
  70.   if (Power > MaxSpeed){  T/ n, s4 l, N& E( _% w
  71.      Power = MaxSpeed;' F: Q2 F8 N: ], B+ r! E/ q
  72.   } 1 O; f! y! E  y1 A8 O
  73.   if (Power < -MaxSpeed){& z) Y' [- d6 t. n0 W& q% Y/ }
  74.      Power = -MaxSpeed;# ^* D2 E8 A8 T  e* v: e
  75.   }   S6 f7 O& w8 J8 h( o
  76.   motor_10.run(Power);" ?' J# E5 I  r, h5 W: Y
  77. }  
複製代碼
4 v. [( k' Y9 A# U7 I

$ j3 b8 a" i8 D% a
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ) V* X0 {5 y; c9 r( g. a1 H
2 f3 Z* Z* b. p) {
您好,不知是否能向您請教。8 f; K) w* J& Z* f
目前和宋修賢老師在處理Ardui Car$ c" {: _9 P& H3 T
雖然已使用較繁雜的方式處理了跑出黑線外的狀況( t2 X% ~- H% Z

8 R6 `4 m# a! u# N但基於想追求更精簡的程式所以還是想請問一下) M2 h! A" ]4 u* {4 H/ ~3 _: s4 \
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
' w; X3 Z. z1 p: L# P不知道您是否願意教我可以如何處理& Z$ S; S5 C/ Z, E. \. C

# X$ y, K4 y+ s  q& U4 }! }4 m& G( b5 ^6 l, `# ]
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    * i1 E' l5 X1 p7 q
  2. double CNY70Val = 1000;
    & U2 m4 L0 p* y3 I
  3. int interror = 0;
    3 K# b3 v% ]3 p( @! W- y- e* @
  4. int olderror = 0;' r* s4 w  {& u2 ]1 e6 P( `
  5. double values;  }; M( y2 h# n  ~& c" J% j8 R! C
  6. # {2 r% q/ R9 U; V) k
  7. . @- d5 a' d# e) S' U  w2 ]3 {
  8. void CNY70()+ v  f1 l6 L! d! b$ R6 m# \
  9. {$ V' E: ~5 H8 n7 Y! k
  10.   valuesRR = analogRead(RR)1 h4 m* w0 R8 U' c/ y9 D+ O! }0 A
  11.   valuesMR = analogRead(MR);/ u- G0 O9 V9 V8 Y1 {
  12.   valuesMM = analogRead(MM);
    8 R+ N. b, @/ T/ [$ X# t
  13.   valuesML = analogRead(ML);7 F  C8 T8 o; u) Z
  14.   valuesLL = analogRead(LL);' W' r/ r- ]0 r
  15. 7 y3 h/ p) _1 D1 n+ X+ w8 f
  16.   if (valuesRR > CNY70Val)
    & {: N% R- X+ g+ x5 A3 r
  17.     valuesRR = CNY70Val;0 E0 J8 M& I+ [1 Q8 `9 s6 p
  18.   if (valuesMR > CNY70Val)
    ' \# m5 r' L7 ^4 Y. S! g
  19.     valuesMR = CNY70Val;
    : a# g8 U* c) Q
  20.   if (valuesMM > CNY70Val)  W  e$ Q) b0 f$ V% _! B! |% ?
  21.     valuesMM = CNY70Val;
    * S3 z- z+ `8 H' D
  22.   if (valuesML > CNY70Val). ~  p; D8 O9 ?* A. |
  23.     valuesML = CNY70Val;$ V( s* I/ v. n5 W' a% i
  24.   if (valuesLL > CNY70Val)
    1 m/ S& x' m4 f+ H8 ~
  25.     valuesLL = CNY70Val;4 ^- y/ G! o8 R) x. C  z

  26. 8 ]$ b2 t- F2 ~
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    9 R$ r9 A: _8 P5 l
  28. }
    1 ?7 g6 K" g& U- S  ~1 V
  29. , r& l. L/ a9 P& }, E: r$ [( J
  30. void Car()# z+ A3 ?( S1 h4 m1 F: e
  31. {" Q0 x; D+ Y+ j: Q# G
  32.   while (1) {9 G( y7 ~. s* O% N1 E
  33.     CNY70();1 d% q& m% [2 X  @+ p- K8 H; G1 m

  34.   L3 ^3 {- J, N
  35.     int error = ((int)values);: v# f& h; u( ~) j  W+ E
  36.     interror += error;
    1 ?0 _. f& W  k, f5 `
  37.     int lasterror = error - olderror;
    1 R% C  E5 J% M* ~' K: u2 Y
  38.     olderror = error;
    . t: G0 C, J- M* U# ~! _
  39.     int power = error / 5 + interror / 10000 + lasterror;
    % L  z$ s4 w( W8 T/ R- L
  40. 0 J3 E# i7 c1 F
  41.     if (power > MotoSpeed)+ o1 y7 x: q# h) f  C; s& ^: \2 r  B
  42.       power = MotoSpeed;  m1 V# e' V2 A6 z; I1 ?
  43.     if (power < -MotoSpeed)
    & s& b2 B( [( a" G( M. h5 x1 M
  44.       power = -MotoSpeed;
      n2 f1 w9 m- u
  45. 4 I, ~1 w6 {0 H$ G
  46.     if (power > 0)7 p6 y/ U! g. T4 ]; d7 e
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    3 t: q! g! L& a: G
  48.     else
    0 a* m2 |% Q4 p1 V. j
  49.       Speed(MotoSpeed + power, MotoSpeed);+ t; t# z8 J! z$ H
  50.   }. Q. q: L4 e- e% A0 i/ A
  51. }
複製代碼

5 l5 W! Q; G6 f* e" F
! _- |5 R2 \/ i" A0 ~; r
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-21 20:21 , Processed in 0.025798 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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