圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21693|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
      H) x, I. u/ D" K5 r; T
  2. #include <Wire.h>, E, ]4 O; x" f, B. b7 [
  3. #include <Servo.h>; c6 e+ K9 h7 s; Y+ G: F
  4. 3 K% u4 _$ e7 t* E8 Z
  5. #include "MePort.h"
    % t: P# j  a# ]
  6. #include "MeUltrasonic.h"
    ' r+ `% u. ^# Y$ h
  7. #include "MeDCMotor.h"+ _/ u* a- s) t' I; `$ W

  8. + p/ D  U/ o. f; H" Z& w  M0 E3 H
  9. //double Input, Output ;5 S2 ?7 {4 a% @5 r! o: a( }
  10. float MaxSpeed = 255;/ B' x3 N9 Z; h9 P0 P! ]
  11. float MaxPower = 180;
    : p4 O  I: B/ |' W
  12. float MinPower = 120;
    % K8 c3 ^' w* ?
  13. float Error,ErrorAcc,ErrorDec;( a/ Q4 N/ m3 k. n/ V* ]

  14. + D; l2 o6 s2 {" W: }" j' x7 W
  15. float Kp=0.14;, I# B+ K3 f2 o) w
  16. float Kd=0.00020;//23;$ z2 R' h) t2 I& J
  17. float Ki=0.000201;8 o0 m5 e* F1 n. E4 ^1 F" n

  18. # H5 f6 a1 f0 j: N8 F2 l1 p, E
  19. float nPower;; ?! ~- D2 S! t
  20. MePort lightsensor_6(6);' o/ t" U/ W! h7 u. }
  21. MePort lightsensor_8(8);
    3 y3 q& F& K! _7 t7 G
  22. MeDCMotor motor_9(9);
    # Q6 T8 N7 N* F: [
  23. MeDCMotor motor_10(10);
    0 ^# q5 a* k+ E( G
  24. unsigned long previousMillis = 0;6 V4 g  g! y  }4 a9 }
  25. const long interval = 1;6 z0 T; D+ i1 f7 c+ F
  26. / x) i% l- `' j. i3 n( g; u0 a' |
  27. void setup(){
    / }+ K5 _2 `( M# Q/ n
  28.     lightsensor_6.dWrite1(1);
    ; L" ^8 {& M1 Y) R) p
  29.     nPower = 160;5 F: m3 n" x  ^
  30.     Error=0;
    9 n/ T* Y+ G' d8 U0 N# a0 V
  31.     ErrorAcc=0;8 v5 Z8 u5 v8 M/ P$ @& D( t
  32. }' b2 i; A0 K) G  Z2 k8 O- s: B

  33. ! [1 A$ Q7 P2 z# y' L, _, n9 Q! H
  34. void loop(){
    ' V; t. l6 b$ y& b* ^1 n- l
  35.   unsigned long StartTime = millis();3 p2 X! b/ M' v
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){3 E7 G& ?+ M: o) f1 G
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();. k+ X. N& s) q" X* U
  38.     ErrorAcc +=  nError*Kd ;
    6 K% s, }8 j+ N& r7 v
  39.     ErrorDec -=  nError*Ki ;
    6 V' Q. G6 h2 T+ g8 D
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    " m: O% U8 |& D
  41.     if(nError < 80 && nError > -80){
    3 T+ D& X6 s7 P! E
  42.       if(nPower < MaxPower){. ~! |' R! u' ]" Q
  43.         nPower += 3;
    5 d' s- J/ o. i
  44.       }
    , }+ S8 c( Y: Y  a7 D7 p" M
  45.     } else{; Q/ z# ]! i  w: c+ R
  46.       if(nPower > MinPower){
    % E7 s& @0 e0 e' H5 s
  47.         nPower -= 2;
    ( C1 L  Q& n) K) A
  48.       }- h' L* d: p) y' z
  49.     }
    6 d, R0 s, a% t/ M
  50.     MotoL(nPower-Error);
    ( S: ^# o) E  V; ^. h+ M
  51.     MotoR(nPower+Error);   
    ( R! I. y! B$ V- E, c, g) W; S
  52.   }else{
    + ^0 u! T. o+ b( V& n1 c6 C
  53.     motor_9.run(0);. Q! ^7 c  G5 w0 ?& F
  54.     motor_10.run(0);
    % k' F0 D5 r6 A5 A1 D, n, d
  55.   }& t4 Z0 V6 X! |
  56.   do{}while(millis() - StartTime < interval);. Y2 p5 [1 V' I4 t/ I
  57. }. L/ D7 S9 `/ |' P" o* z

  58. ! Z9 u8 E7 C$ \& X/ O6 Q5 n
  59. void MotoL(int Power){
    0 C2 \- e% `/ Z, @
  60.   if (Power > MaxSpeed){3 d6 X2 X. }9 ?1 L% G
  61.      Power = MaxSpeed;: |) A4 Q. s  J# k7 b
  62.   }
    , c7 T* K- v6 a* N& d5 s' v
  63.   if (Power < -MaxSpeed){
    $ m+ e) Z2 }3 L: r8 R) C0 f1 [
  64.      Power = -MaxSpeed;
    & f( |: ]: c0 U5 n
  65.   }
    - x+ W5 d! q7 @- }" R2 w  V2 A+ I" f
  66.   motor_9.run(Power);9 ~! K+ N, l; y
  67. }  
    - q( |# _! q1 u7 d

  68. 9 ^( o% _& g* p( p( C
  69. void MotoR(int Power){
    8 k- p3 P& i  e- Q
  70.   if (Power > MaxSpeed){' M1 Z* S1 W) r5 ^3 }
  71.      Power = MaxSpeed;; a, N* @# D; c6 D" g( z+ C& Z
  72.   } ) R( T) Q$ l2 P% n+ z
  73.   if (Power < -MaxSpeed){- R9 x; ^# `& ^! L+ M
  74.      Power = -MaxSpeed;
    ) L: B0 S8 F5 B; F( V7 s
  75.   }
    ( A; z$ p! j: u0 b
  76.   motor_10.run(Power);3 Y( ]0 j4 W; K! K! g4 n# L* K2 n
  77. }  
複製代碼
& V( q* r) ?* ^  C" ^, ^

  k& S6 o* K6 {7 R4 M3 h
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 # d8 y& e( B4 Q' t
9 L& N% v# |+ Z' C
您好,不知是否能向您請教。  U: J5 ^2 V1 c+ Z- x! a1 A7 ?
目前和宋修賢老師在處理Ardui Car2 Z' P0 V5 ^! y: y& @! t9 Q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
3 E, g8 e4 b' Y, ?' U" _% G' Z  ~  H7 S4 X, o6 a7 ^
但基於想追求更精簡的程式所以還是想請問一下3 N+ j4 L# s) y7 T1 k. g! R4 S
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
& S) `8 u3 B' Z, w' v& u) ]不知道您是否願意教我可以如何處理" j$ t2 q6 A* F" D: o& o8 L
3 j" e( M& b. t$ v- j) ?4 [$ u
" m& r' J; e. q' O, b' I! v6 b
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;$ M9 S- \- p% [# Q8 c, R3 Z8 h
  2. double CNY70Val = 1000;  s7 l, Q4 A: L- P! u
  3. int interror = 0;
    & K% \% @. E6 j2 ^  L6 F
  4. int olderror = 0;( G" X( o4 q) E2 P8 `4 Z7 [
  5. double values;; K4 Y" J- d" m/ h6 u

  6. 5 h( }4 ?/ S: _* s1 j; p' M
  7. $ c# l% X; F' D$ E+ I6 U& I
  8. void CNY70()
    & m0 ]1 P! i" }' A  [% B# \+ |
  9. {, c: ]) b$ h: t- D, c1 n
  10.   valuesRR = analogRead(RR), G$ V9 [1 b" J+ F0 Y% w, w6 i/ ^
  11.   valuesMR = analogRead(MR);1 B. @0 x0 o$ P7 ^
  12.   valuesMM = analogRead(MM);
    ) x! h5 r6 q, o; |+ l7 t
  13.   valuesML = analogRead(ML);
    * v& o' f8 d  n2 g% V( o
  14.   valuesLL = analogRead(LL);
    " |3 r  b  M6 ~- T

  15. 3 l5 v+ a( E$ I! N( H# A2 u. Y
  16.   if (valuesRR > CNY70Val)
    " L3 B; @3 a6 \1 d! L8 q
  17.     valuesRR = CNY70Val;
    & y, w, x" b# Q
  18.   if (valuesMR > CNY70Val)
    * z4 I, K! @6 S( X
  19.     valuesMR = CNY70Val;
    + v# z" q, Z; ]* I
  20.   if (valuesMM > CNY70Val)9 |* p) F& ~/ S( ]/ x8 X2 p) z/ |
  21.     valuesMM = CNY70Val;. j1 ]( K# m9 A8 w
  22.   if (valuesML > CNY70Val)
    6 D" P( ]6 s( B6 l. q9 J
  23.     valuesML = CNY70Val;) J8 }, q; i- T5 K# a
  24.   if (valuesLL > CNY70Val)2 V  E6 U4 @% b& y
  25.     valuesLL = CNY70Val;2 q  y$ [) D/ d, R; |
  26. - x2 j  H/ G0 C. d
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 k7 P! u7 r  m# f3 P
  28. }
    / C5 U) O7 Q; @  k$ {3 F6 U
  29. & w9 V0 Z0 `+ f1 ?
  30. void Car()3 y5 w( m4 W' ?
  31. {/ h- L+ n# w0 c/ ?7 ?1 c* }
  32.   while (1) {
    6 T- ?% N: m" S7 t: L# X
  33.     CNY70();
    ( C$ P# p9 p+ e6 b" K2 ?
  34. 6 w4 _, l4 T3 J. V
  35.     int error = ((int)values);
    + f  P1 v$ K6 E3 }; u( s# s! i
  36.     interror += error;
    8 P# B. ?. z. _4 k) h
  37.     int lasterror = error - olderror;- e$ y) Y- P, e! |$ ^
  38.     olderror = error;
    / P% L/ S- }) A  [/ J3 p/ Y
  39.     int power = error / 5 + interror / 10000 + lasterror;& d5 J2 t( g  l; e8 ~; V1 o

  40. , n7 ^+ g7 b0 X! S& A' h( G
  41.     if (power > MotoSpeed)
    : S. D0 r& L/ r/ q8 I/ R4 s$ h
  42.       power = MotoSpeed;- `4 R" {& s; E
  43.     if (power < -MotoSpeed)
    ; U0 R; o' d4 [7 @- u) F, }- a
  44.       power = -MotoSpeed;
    7 @# o9 ?. [3 B" ^& u6 e( J
  45. . |: }2 y9 ~1 }. K* M
  46.     if (power > 0)8 Y" q" o5 l& y( Q
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    & t% j, Y& ?4 s! W5 {9 s& J
  48.     else/ _7 S; [, c9 _2 c
  49.       Speed(MotoSpeed + power, MotoSpeed);" W7 O4 a8 ]! v1 {
  50.   }
    : Z6 S" ]0 j& @
  51. }
複製代碼
; i6 l. P- Z  N1 }8 z/ q
+ H/ Q& P: {( Y2 x1 N1 a
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-22 18:36 , Processed in 0.018608 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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