圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21729|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>$ i/ ^# o! E! }3 J4 ]
  2. #include <Wire.h>
    - ^6 ?$ P1 K1 {% t" @) s
  3. #include <Servo.h>
    & I$ |6 V% F% \
  4. % V7 @0 S8 i& ~5 z" z- X
  5. #include "MePort.h"
    : t, b0 O: E+ l2 J) N( m8 f( _
  6. #include "MeUltrasonic.h"7 @; h  ~& z& h  ^6 v2 e
  7. #include "MeDCMotor.h"
    - l$ p8 F, s2 s! v) G) T3 |+ ?
  8. - ~8 F5 S) Y; m% N4 s
  9. //double Input, Output ;
    ! M( b3 K! m) J3 J. x1 r4 }
  10. float MaxSpeed = 255;
    1 r* O6 ^9 h7 w
  11. float MaxPower = 180;. w/ }& i% t& ?! ^/ W
  12. float MinPower = 120;4 |0 h: q1 v5 s8 {& s' a+ H
  13. float Error,ErrorAcc,ErrorDec;
    . g- i% K8 h5 w

  14.   c* }# b% c& `: B* i7 Y+ W
  15. float Kp=0.14;* a8 O- I( `9 k, n; t
  16. float Kd=0.00020;//23;- q8 S" Y6 e* B( N! _
  17. float Ki=0.000201;
    5 D* F' ?. U6 y) o' L

  18. ; W4 h7 u* a6 W0 Z3 e1 f& `
  19. float nPower;) d) p! r) r, |% G( p: |
  20. MePort lightsensor_6(6);
    # N/ W7 [! ?+ x* u: `' G2 ~
  21. MePort lightsensor_8(8);
      @1 }3 }% `6 P/ v" @( ?- p
  22. MeDCMotor motor_9(9);
    8 [" b8 t* t/ b( g5 a- w7 V3 L
  23. MeDCMotor motor_10(10);
    " ]  K' X0 G5 [+ m+ w
  24. unsigned long previousMillis = 0;1 d, D/ ]" D4 B' ?* o
  25. const long interval = 1;8 h+ p$ i  z' E! O
  26. + n' R: P$ Z* G9 j
  27. void setup(){
    4 D7 }; b/ ]$ }- _9 _- m
  28.     lightsensor_6.dWrite1(1);
    ; M* T+ M8 k  M  r
  29.     nPower = 160;- Y1 ?) ?1 v4 n* G! W) U4 @( l
  30.     Error=0;( R$ D  a* b0 ?' x+ x" [
  31.     ErrorAcc=0;
    : K$ W& o! m  ~
  32. }5 ^  S! P4 }! s9 V$ N

  33. % o; j0 L3 n' O* ]
  34. void loop(){! x) |! W0 \, {% r9 N+ ]( v! ?3 M
  35.   unsigned long StartTime = millis();
    0 B: [2 ]& E# W, ^& C# N
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
      _. l, }3 L& x8 m
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    / x7 F3 S$ B0 h, p9 w7 e
  38.     ErrorAcc +=  nError*Kd ;
    1 i8 s# Y9 q1 r$ g
  39.     ErrorDec -=  nError*Ki ;' v6 ~  f+ Z9 I
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    8 ^7 l' U% c8 ]+ K1 T
  41.     if(nError < 80 && nError > -80){
    7 J4 T5 K. b3 V
  42.       if(nPower < MaxPower){
    ! J9 w5 t& {9 X7 J/ M9 y4 j
  43.         nPower += 3;
    , `) Q; u/ l; u5 F8 J5 X6 w
  44.       }
    - Q- ~7 @" _. Y! w; z" T
  45.     } else{* v, r  h; }0 V' B! K# G
  46.       if(nPower > MinPower){
    9 M2 P  H2 o' M; y) g2 [7 H; Y
  47.         nPower -= 2;; w( \" ]8 W+ k5 k. `7 f, p7 u
  48.       }
    0 N7 O+ ~" i. v" ^. T7 W
  49.     }
    " w  m. I  k$ }/ V" R( O
  50.     MotoL(nPower-Error);
    0 g) H7 t5 N; {: h& A: Q/ o
  51.     MotoR(nPower+Error);   
    ' s! G3 j7 ~3 ~' k  ~
  52.   }else{  l% _8 R0 x( ?" ~# M8 f% l: \
  53.     motor_9.run(0);
    ( \/ g( D! \1 s1 }4 X0 k2 w
  54.     motor_10.run(0);
    & Q/ V' o8 I  l8 a" J5 W( t
  55.   }
    8 \* r5 i; I! B1 q3 ?
  56.   do{}while(millis() - StartTime < interval);( t, r! q: S0 s0 D& r% U
  57. }! N% Y1 u3 _2 I5 I
  58. - V( }; Y: }7 t; C
  59. void MotoL(int Power){3 @; f5 B9 [" _
  60.   if (Power > MaxSpeed){
    2 w4 }: [; h2 F# }5 _$ |* M5 n' D
  61.      Power = MaxSpeed;8 U' F8 H: _0 U# l
  62.   }
    ) I2 I1 H8 s0 A' N
  63.   if (Power < -MaxSpeed){9 l, ^9 C3 Q3 L
  64.      Power = -MaxSpeed;  G1 l8 m6 I% S/ W( _
  65.   } 4 \% F0 s9 h" n' B! @
  66.   motor_9.run(Power);! O# B# d* @4 l% X2 C  Z
  67. }  - N" X! B/ B1 \4 [% K, X
  68. $ \6 H& R0 o6 z+ U6 W" Z* U, g2 ~
  69. void MotoR(int Power){" t; H: \( b! A$ s( b
  70.   if (Power > MaxSpeed){
    6 e* X2 g- K3 {# [  L( U# U
  71.      Power = MaxSpeed;0 ~. X! N) s3 a/ v, _
  72.   }
    ' O7 ], F& o1 u. K
  73.   if (Power < -MaxSpeed){
    " w& f! h- s$ u1 H. u
  74.      Power = -MaxSpeed;
    9 A" e5 ^% x2 |; J
  75.   } : L2 G  j' H' E; N5 w2 p
  76.   motor_10.run(Power);
    8 l+ }4 o2 E4 S8 A# @
  77. }  
複製代碼
9 ~: i2 T/ J- d. j0 c* L
: [) J" o5 s/ k3 i
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 4 O3 j: S4 L$ x% l

' j5 `+ H/ Q2 c- h2 s' E$ T您好,不知是否能向您請教。
  N% g4 V" f2 y目前和宋修賢老師在處理Ardui Car1 f3 I5 _# V0 v
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
0 A# p( n$ K+ Y. x2 b0 f9 }
- @2 G* n# B6 ]9 l- G) i$ r) c但基於想追求更精簡的程式所以還是想請問一下
7 y6 h# ?2 j! C+ A就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
5 d+ D& J+ W8 [& k, K不知道您是否願意教我可以如何處理: O- W& u% ~! ]; z: ?* X# [

- C& R' S! B' y
7 M8 E8 M2 O* i以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    & H4 q# O* _: P$ e7 W
  2. double CNY70Val = 1000;! o% T1 A) u0 \8 b$ u& s4 J  V% f
  3. int interror = 0;& A* o* @/ H/ }- v# I- X
  4. int olderror = 0;
    - c. ^+ }- r! N) X' j% }! w
  5. double values;
    + ]# y" W7 H( Q7 U- `9 E

  6. % U6 j8 I& M* k2 p

  7. " q. \& w6 S$ T4 s. V) S+ @: M
  8. void CNY70()0 W, R" [, Y; b
  9. {
    1 l9 }4 y7 z7 w
  10.   valuesRR = analogRead(RR)+ N1 b9 b- A4 ]: w2 o
  11.   valuesMR = analogRead(MR);- ?  M% ^* a" D
  12.   valuesMM = analogRead(MM);0 Y0 J$ A" R3 ~
  13.   valuesML = analogRead(ML);
    ; h* H. t$ @: D( V+ ]1 Z3 n7 `
  14.   valuesLL = analogRead(LL);% }% W5 c  M1 D  I. W1 I

  15. ' o( o3 e) \/ k9 M0 @! k
  16.   if (valuesRR > CNY70Val)
    ; O: B/ n& R( _0 D" P$ D
  17.     valuesRR = CNY70Val;" D4 ]+ Y0 O5 f$ [7 q/ r9 Q) Q
  18.   if (valuesMR > CNY70Val)
    % f/ w& a: [+ R0 N) w
  19.     valuesMR = CNY70Val;, [% ]* X* e5 v  {1 y6 \
  20.   if (valuesMM > CNY70Val)
    2 E" O; R- D4 M, I3 s
  21.     valuesMM = CNY70Val;0 i* Y- F/ `8 I; O: S6 q
  22.   if (valuesML > CNY70Val)2 a% R9 D+ L* e) A: M
  23.     valuesML = CNY70Val;  @, m! p- X! \; U" Y$ W
  24.   if (valuesLL > CNY70Val)" U' _: L8 r) x4 T3 c
  25.     valuesLL = CNY70Val;- L" k2 o# c. _7 u4 e. H, x% T

  26. ! x5 e) h8 f+ J
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
      P( f( K$ [% t! s4 Q9 h" U2 J
  28. }
    ! ?; n3 f7 o; R4 s) w

  29. ) l# y! n9 r  Q& ?4 e0 H
  30. void Car()$ Z& U+ R% S, V- g. f  W
  31. {5 U& I3 ~. }3 M0 ?; j+ {
  32.   while (1) {1 x5 J: f! o2 V' Q: H. C3 l  C$ n
  33.     CNY70();. V. o5 `# D( Z# p

  34. + Y6 q' l5 c$ _( l' r/ v
  35.     int error = ((int)values);2 x; W& B1 A8 }5 J. t
  36.     interror += error;
    % m! H9 _2 S4 s7 H7 C. N! a- L
  37.     int lasterror = error - olderror;9 a# o1 o& f$ {
  38.     olderror = error;
    * H$ W; i) A! k" ]# Y# E
  39.     int power = error / 5 + interror / 10000 + lasterror;7 j2 p  n3 D7 ]$ u
  40.   N2 \1 t; J2 a6 u+ X
  41.     if (power > MotoSpeed)
    + J, V6 [  l' I7 k: ?+ B5 o
  42.       power = MotoSpeed;
    ( N" L" {. r' O5 ?
  43.     if (power < -MotoSpeed)
    8 Y0 b7 h& H- M  \" X4 ?# ?
  44.       power = -MotoSpeed;
    & H2 ]% \0 U; g

  45. / F4 R4 |$ C& d$ F
  46.     if (power > 0)* h: Y5 _7 U$ F' q# _# t, B( G  X
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。/ f/ y5 V+ l! u8 w* r6 h& l- W
  48.     else
    ' E: a- P5 j- j: o
  49.       Speed(MotoSpeed + power, MotoSpeed);
    5 a$ h. ?0 _5 E' ^; x( Q
  50.   }
    3 L8 g, G7 U2 _& q/ u  P. W
  51. }
複製代碼

8 ^3 ?$ P/ n: q: r6 L1 G5 }( E0 w0 p' }9 V! T* e0 P( `& T' F
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-27 19:26 , Processed in 0.028473 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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