圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21708|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    - e/ ^% o2 J. t
  2. #include <Wire.h>
    1 a+ P9 w8 g; w0 c2 @- ?& Y
  3. #include <Servo.h>
    8 J* c8 {( T) i+ }) T

  4. % L) I  K) [! J( b5 ^- Y3 s
  5. #include "MePort.h"
    # v! _& N% }# X# T3 I) E& w
  6. #include "MeUltrasonic.h", L$ C! J8 O( Y3 l. D: {
  7. #include "MeDCMotor.h"
    3 z5 s) `- \8 @0 \
  8.   v/ {- _( Y- l5 |
  9. //double Input, Output ;) i5 L* q# s; E( B
  10. float MaxSpeed = 255;6 S  q( C2 V- w- m
  11. float MaxPower = 180;% b# s6 [1 `, H% a, B
  12. float MinPower = 120;
    7 m) m1 y0 J- s" Z+ g: n2 q( c
  13. float Error,ErrorAcc,ErrorDec;+ q- P) e! W- ~0 W) w

  14. ) ^& }! R, d  a: c6 ^0 t& Q
  15. float Kp=0.14;# I3 d. ]- e3 W# ]
  16. float Kd=0.00020;//23;9 P: n; W; i% s! r) \) D9 m# _
  17. float Ki=0.000201;! x" @  o# R8 L+ \4 h, y8 J

  18. 5 W/ m# [+ ^3 b. }1 Z+ U
  19. float nPower;
    - g5 ?1 g6 @) W# G. N
  20. MePort lightsensor_6(6);
    5 B& w8 T, c1 H
  21. MePort lightsensor_8(8);
    9 Z) H7 {* P) b4 u' W9 |; F- L
  22. MeDCMotor motor_9(9);9 F8 q0 \0 r1 x/ o7 u4 y
  23. MeDCMotor motor_10(10);! Q0 \" t# k; T& k+ Z7 p2 p
  24. unsigned long previousMillis = 0;
    2 N" V6 w" l$ V* J* T
  25. const long interval = 1;* d0 r; n, w: s& f8 _

  26. , Z% Z3 O  ~8 }, P
  27. void setup(){( Q3 [' T& b( E+ r0 B3 J- k
  28.     lightsensor_6.dWrite1(1);! A* V/ b, W/ X( W  Y
  29.     nPower = 160;& g3 l' E0 R1 t1 c# W. {( P) G4 `9 F
  30.     Error=0;
    ; k- |/ h; S* v$ i
  31.     ErrorAcc=0;- u+ g5 V  u0 L# g
  32. }
    ( ]6 K; W: i/ U% b
  33. 9 ]. G* e& h/ ?7 P6 |! }7 i6 J9 V
  34. void loop(){
    / }2 @- o- c3 X- K5 S) M: O
  35.   unsigned long StartTime = millis();
    9 |& A$ F* \; w) K7 K  k
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){$ w8 r( e. K5 P! n0 T) V
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ( [2 s3 u, g# p+ t) W
  38.     ErrorAcc +=  nError*Kd ;
    + L7 R. V" [) F4 m# F- @! M
  39.     ErrorDec -=  nError*Ki ;* {) d" z" o4 ?" P2 p. ?
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);" b; |$ k* h0 [2 j
  41.     if(nError < 80 && nError > -80){
    5 ~( a9 f. E" E/ ^
  42.       if(nPower < MaxPower){
    0 t# w$ F0 b% I) k8 v7 H
  43.         nPower += 3;
    . B" R, u+ w! H  n1 _( e
  44.       }$ B8 S6 Z: \8 L9 q5 ~) {
  45.     } else{
    " N6 x! t" E9 ?$ O
  46.       if(nPower > MinPower){+ i+ Q; h8 ^8 X5 b5 b, ^
  47.         nPower -= 2;1 ^, K0 t( \, t# r( T
  48.       }
    & @. E! d6 N- _, |2 ^" f8 @: k
  49.     }
    . y' T) E2 A& b/ g  x* z% n( T$ L
  50.     MotoL(nPower-Error);
    % p9 P, ^& s; I& R8 c1 R7 g3 a6 z9 i
  51.     MotoR(nPower+Error);   
    - F" ?; G: j9 X1 H2 }% @
  52.   }else{2 C" t; G5 h% S; Y6 \/ [: Y* i
  53.     motor_9.run(0);
    ) @4 Z$ ^) C( H2 {" h5 i( a
  54.     motor_10.run(0);
    # V% M2 ~) @; t6 L& N& L2 G% l, s
  55.   }6 L; Q! ]& z. o1 ~( ?* v
  56.   do{}while(millis() - StartTime < interval);$ n8 P1 }0 E+ p$ l. X4 C3 a
  57. }
    9 l0 k  Y/ e. Q9 Q
  58. % A* x5 r0 O, L2 ]+ ^3 D* H5 T
  59. void MotoL(int Power){
    / v2 y. }, Y) r$ J1 ^$ _# k
  60.   if (Power > MaxSpeed){
    9 Q4 c' e/ _6 S$ [) P8 N( W
  61.      Power = MaxSpeed;' P, W9 h3 {$ |
  62.   } : L; t, [+ L( v6 M& J
  63.   if (Power < -MaxSpeed){9 c7 ?' X# q+ o5 Z+ B
  64.      Power = -MaxSpeed;! a8 M& e* `' h" o# ?# ?0 s3 C
  65.   } $ z# v( F* Q# x! l6 _- w+ o
  66.   motor_9.run(Power);+ w  }0 X& V% l3 g
  67. }  
    ; F% ~2 v* b0 R8 }. c% ~

  68. 3 }& r. i" F0 ?
  69. void MotoR(int Power){
    % W' m8 r: C. X- x  D$ X
  70.   if (Power > MaxSpeed){
    ( b+ }! B$ w  b$ A
  71.      Power = MaxSpeed;
    0 g& h" k8 r+ P3 u
  72.   } / M6 x6 p8 P( y* W; e
  73.   if (Power < -MaxSpeed){, q, C/ D; S. _. H6 E
  74.      Power = -MaxSpeed;9 k8 j- k4 K0 H, s- D$ @$ s* G5 q
  75.   }
    ; n9 c7 }4 Y/ h+ n( v. y2 v
  76.   motor_10.run(Power);1 F- f/ ?) V( K1 p
  77. }  
複製代碼

) n' `) S% L# m' D6 z, M* Y% T+ l- ?% D
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 / N% S% K; T! L; T" m! w! A3 s. t
4 D. }1 @8 |* ?1 R/ t
您好,不知是否能向您請教。! [; @$ h* ]' U  M
目前和宋修賢老師在處理Ardui Car  K) }( |( C  }! ~/ V& i
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
; E+ D( m; u6 w! o# W0 y  m% o8 i$ K( D. F( y
但基於想追求更精簡的程式所以還是想請問一下
; b4 ^3 E4 u' {& }% P5 L就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝( H2 v+ n" d* s
不知道您是否願意教我可以如何處理3 F( B" {; f+ w$ R/ M
& I0 w' ]) e( j/ k2 s! \3 a) B
' k5 {) m. s# m$ O3 \& {* p
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    % }; E7 G  [' S3 I3 {0 E! d. {& F
  2. double CNY70Val = 1000;
    * Y/ ?& I: T! L' b
  3. int interror = 0;$ Z% q$ k# q. ^; h
  4. int olderror = 0;% V8 m- n2 ~, L2 v$ K
  5. double values;- W0 J  a2 Q3 v+ `/ F) |# l, f
  6. 4 F, \- }# T! {7 E
  7. & H2 R" g4 ?& \& J
  8. void CNY70()
    2 _% w0 q0 _- N1 q6 ~- K) W
  9. {' }6 \: G  A7 {5 E! m. I
  10.   valuesRR = analogRead(RR)
    $ J4 `$ h$ M9 ~" _& J( F# X
  11.   valuesMR = analogRead(MR);
    ( k! G8 ~0 k; B
  12.   valuesMM = analogRead(MM);
    " b: P$ \6 @, d2 ]0 S7 ~- j1 x
  13.   valuesML = analogRead(ML);5 O% m, x+ y0 o+ I- r+ V
  14.   valuesLL = analogRead(LL);7 K; A0 Z, L) P' v4 _# M) x

  15. 4 x& Z0 W6 h7 S; n2 c
  16.   if (valuesRR > CNY70Val)
    # Y; x8 t% R& w' }/ Y2 B; t
  17.     valuesRR = CNY70Val;
    ( l" u6 g1 o3 }) L
  18.   if (valuesMR > CNY70Val)3 Y: n. {# z0 Z7 W  h, e$ q7 j8 |
  19.     valuesMR = CNY70Val;
    ' ^' y& }! d1 j- _) ~
  20.   if (valuesMM > CNY70Val)
    9 \5 c. r9 C+ u% o
  21.     valuesMM = CNY70Val;, y# v9 U* [- ^* E* Z
  22.   if (valuesML > CNY70Val)
    % P9 ]/ r  r" o0 x& Q' ^% Q
  23.     valuesML = CNY70Val;
    2 o  v9 \0 \7 ?0 W* `6 C
  24.   if (valuesLL > CNY70Val)
    ! ]: f5 X- _8 r: h6 A/ ]9 Q
  25.     valuesLL = CNY70Val;
    4 v6 y6 ?! q" P1 g
  26. 9 c5 ?: y# z9 M8 I. g" V$ ~
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    " Z- C2 n9 h  d0 i0 i
  28. }2 b* F# s# _0 j& Z

  29. & V8 k- F0 @6 o. q
  30. void Car()
      g3 l; g" G+ ~2 N2 {% a, s
  31. {! X% Y1 S. U2 y( f+ A# F* q3 L8 D* o5 d
  32.   while (1) {
    9 _& w+ A. G8 @+ O3 D
  33.     CNY70();$ G) R* Q, Q! M- q$ m

  34. : C8 X* _7 I$ q6 L( I
  35.     int error = ((int)values);
    8 v- d8 O; S1 P
  36.     interror += error;
    + O/ a9 G9 e; Z9 U; P
  37.     int lasterror = error - olderror;; A" o% ]5 u, g: `) `
  38.     olderror = error;
    ; y: }* N1 E* M$ Y0 ?
  39.     int power = error / 5 + interror / 10000 + lasterror;
    9 m. y3 T2 W6 p8 I

  40. & H7 W+ }/ E" ]1 a
  41.     if (power > MotoSpeed)
    ; U4 `* x8 M  ~' x
  42.       power = MotoSpeed;: V" W0 @' \6 d) ~- t- @
  43.     if (power < -MotoSpeed)/ `4 t9 a* A8 h8 H. p# j* o+ t
  44.       power = -MotoSpeed;( E: P) }9 z9 u& c

  45. . E3 m3 v/ ?8 ^$ o1 `5 y
  46.     if (power > 0): d) \* c+ _5 @  t) I
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。" z2 D' ^* ], r, w1 f' }4 _. n  ^' a
  48.     else1 q, a$ I$ S7 `$ U
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ' f; P' o  f8 T* q" x6 c) p" B
  50.   }1 N( V4 R$ |! n8 b( d& ~! u; v0 z
  51. }
複製代碼

# A$ y5 N9 ]8 ?, m
0 l: s" j' o' h# W
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-25 08:05 , Processed in 0.025207 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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