圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21390|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    : o  W) V# p: [% Y0 I5 K" t
  2. #include <Wire.h>
    0 P7 v" W8 Y! y
  3. #include <Servo.h>
    " B, i9 n5 T$ L

  4. / Y* L9 F- T5 X5 k
  5. #include "MePort.h"; k5 P9 y  J# Y8 Y; d5 T
  6. #include "MeUltrasonic.h"" u$ x; G. ?9 ]  y$ ^; y
  7. #include "MeDCMotor.h"
    ( h" ?( i0 }* i

  8. ! {7 b$ g) o4 w
  9. //double Input, Output ;; B6 L4 H3 X- `" M7 q
  10. float MaxSpeed = 255;5 {/ l: `6 t; I3 M- ]9 `
  11. float MaxPower = 180;9 x" k- W8 y- s/ p: K* S% ?! \
  12. float MinPower = 120;& q! j' L9 n$ e4 R. q
  13. float Error,ErrorAcc,ErrorDec;8 \) U; M6 a, Q9 N( K7 S

  14. 3 b# j/ J% b- n/ J8 \0 i
  15. float Kp=0.14;' P2 C7 s' d* L
  16. float Kd=0.00020;//23;3 k" z: N7 ]; A- u/ a6 z
  17. float Ki=0.000201;
    % c, Q# y6 s+ V" |- P3 t0 s

  18. 7 v: T9 D  n) T* S1 N! o0 h
  19. float nPower;' ~( |7 f, M' u
  20. MePort lightsensor_6(6);
    * c# {% O5 c6 e1 c+ V* c
  21. MePort lightsensor_8(8);# l9 P0 R7 ?: L/ [
  22. MeDCMotor motor_9(9);
    6 z' k' C' Z, Q* i% G; k
  23. MeDCMotor motor_10(10);
    2 ~4 @6 f  }( U
  24. unsigned long previousMillis = 0;4 p7 T; C7 Z% V9 F
  25. const long interval = 1;' V* x4 B$ Q3 l1 ~' U1 \

  26. . n9 j; F  x7 v, Q$ |4 D
  27. void setup(){
    4 v% D/ R$ E! P5 Y0 b5 V
  28.     lightsensor_6.dWrite1(1);( m+ ]/ Y9 s; @" i
  29.     nPower = 160;. h5 c* u' R) P  M, U1 i' A
  30.     Error=0;
    4 r5 Q. M9 S6 N  ~
  31.     ErrorAcc=0;
    " h5 G  M) ]2 }" ?9 [2 L% C! u
  32. }
    ! k: i# f6 F! X5 D$ U3 Q
  33. % e7 p* F% D- s- w$ s  |  V
  34. void loop(){
    8 t! T* D" o: f5 e/ }
  35.   unsigned long StartTime = millis();+ ?% ^2 B- e7 D" S! d
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    % T+ l$ a( n1 v$ b( q( b
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    2 Y1 B; w+ [  `& a2 T) F
  38.     ErrorAcc +=  nError*Kd ;
    0 Y4 v' l+ y: h  ]$ y0 f$ W
  39.     ErrorDec -=  nError*Ki ;0 `; z- V) x* E
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ! q- {# G3 [6 `- _/ ?& R
  41.     if(nError < 80 && nError > -80){
    & o7 y* L- G% D; @) q& u& ]: Q
  42.       if(nPower < MaxPower){3 V9 q0 {0 Z7 X8 Z* P" n- T6 G
  43.         nPower += 3;
    7 o% l' q# G: u/ X) [3 `; a7 k
  44.       }! K6 n- Z4 L3 W  s5 ~2 O- e
  45.     } else{3 K+ S- @0 B3 |! m0 s( F2 q
  46.       if(nPower > MinPower){
    ( o6 e5 Y! P1 o! B' ]: S+ ]2 K
  47.         nPower -= 2;
    % [5 {5 K) A4 z& H
  48.       }7 m: B$ u& c/ P) l0 y
  49.     } 8 }+ M- q( m: p8 V/ V2 C6 h
  50.     MotoL(nPower-Error);
    ( f; M$ ^, v* e
  51.     MotoR(nPower+Error);    ( s5 G1 @+ c* `  @9 B1 y
  52.   }else{% t" U1 E8 q4 J# z* h- ^, Q5 `4 j
  53.     motor_9.run(0);$ A1 z) K; D2 d; e9 I. L0 m
  54.     motor_10.run(0);5 R2 `; K+ @+ T* t1 X, @9 n" h
  55.   }
    . y! D+ o' G! V2 C: y& N. l
  56.   do{}while(millis() - StartTime < interval);
    1 `# c" M: F2 v- f- n( F: A. |3 {
  57. }
    / k& j: q; M9 d% i$ J0 T# Z  K

  58. / B: G, j7 B4 o( t* A8 R. r
  59. void MotoL(int Power){
    / ^8 }1 Z1 n# B6 ?: n. H
  60.   if (Power > MaxSpeed){
    : p4 n6 f; j7 Q+ L2 S* j- {
  61.      Power = MaxSpeed;
    7 r2 u' n# H% Y7 U% Y
  62.   }
    5 Y( U% I& @) f, `
  63.   if (Power < -MaxSpeed){; L1 A- O2 ?/ H6 T: s
  64.      Power = -MaxSpeed;
    # X: V, S4 w) e5 k, C7 {6 P0 S
  65.   }
    ; c' N* s! I1 x  ^! C
  66.   motor_9.run(Power);
    5 J' ^( Q% R' ~4 G
  67. }    e+ o2 k) p) J& P

  68. . b$ f8 J: s* v* b3 k
  69. void MotoR(int Power){5 z  E: \0 Y+ b4 X" D& m
  70.   if (Power > MaxSpeed){. e* d' p0 |3 ^. f0 D, p8 D0 ]
  71.      Power = MaxSpeed;
    ! f% i. N5 k* |
  72.   } ' c! n% `" u$ {9 B  V, M6 O
  73.   if (Power < -MaxSpeed){
    & [* m. [/ y+ R$ j
  74.      Power = -MaxSpeed;7 V; x* ^. K" |4 H( N7 c! G
  75.   } ( k& B$ U2 j' W5 A9 P" K
  76.   motor_10.run(Power);
      Q# I" l6 y1 R
  77. }  
複製代碼

) O' C3 h, w% q3 L4 L8 l% I3 K0 H
# B* w, X& h$ ^/ E- `9 H1 p
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 $ V$ p2 q% u! _5 x  h! x/ U
& o$ s, w% c6 B0 K+ e. ?3 s4 Z+ Q
您好,不知是否能向您請教。
, |* d3 S; |7 F, O' B目前和宋修賢老師在處理Ardui Car; ]7 w- h5 X# \9 x% c" }" ?
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
" F8 [, J1 H  G& a0 K9 ]4 Y5 a2 G, c' j3 [  M% @$ {. s3 `' T2 ~
但基於想追求更精簡的程式所以還是想請問一下
+ ~) e1 y, I" J就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
" {0 R; {4 l9 \7 t% Z3 ^不知道您是否願意教我可以如何處理
% |3 N6 O2 t# {6 s: `, s, J8 h4 M6 W/ t
' S0 T& K4 @! s2 |; }
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;. W% `5 e. A2 }. S3 I3 k$ Y4 V* ]
  2. double CNY70Val = 1000;
    : C4 W0 }. r6 K0 i: M
  3. int interror = 0;
    0 {6 H1 e2 l: |
  4. int olderror = 0;  Y! ^) b' A" ^5 Q) \" x
  5. double values;
    . r( p4 f/ h% Z' a6 O7 B

  6. 3 O  i( ^( b6 E; O
  7. 6 U8 F6 g- s% U& B% N
  8. void CNY70()
    $ Z$ p* ]8 B) q7 E
  9. {
    7 q6 y1 I! q/ Q, c6 i
  10.   valuesRR = analogRead(RR)
    4 F! t: i8 U2 a' k1 z; j
  11.   valuesMR = analogRead(MR);4 ^7 z! B, f0 [7 G
  12.   valuesMM = analogRead(MM);7 ~+ O/ G! G, m! ]5 E& O+ I3 _4 @' f
  13.   valuesML = analogRead(ML);
    2 b7 t* R1 l& ~  T
  14.   valuesLL = analogRead(LL);
    1 C+ ~4 w+ q+ o
  15. 6 |/ E% f( U" ^' [4 q
  16.   if (valuesRR > CNY70Val)
    , b; w& H- U$ _: }0 ?
  17.     valuesRR = CNY70Val;1 D3 T: o/ w* z$ U) T
  18.   if (valuesMR > CNY70Val)+ k) Z5 _* j! z0 a' x! s5 j
  19.     valuesMR = CNY70Val;* r0 V: S! \* A. ]3 l- h
  20.   if (valuesMM > CNY70Val)
    - |" X  I  @1 G% Q! y& c; u8 f
  21.     valuesMM = CNY70Val;( A% c; |% b% D+ }$ _: T  u
  22.   if (valuesML > CNY70Val)
    , _" M4 \" @% q
  23.     valuesML = CNY70Val;. O1 e1 B% M: X! H  b0 G2 ?3 t
  24.   if (valuesLL > CNY70Val)" t1 U  v6 k! W: }) J
  25.     valuesLL = CNY70Val;" u7 ~: ~# J5 D* [  b6 {
  26. & U) H4 C8 T7 F9 }
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;- [  W* X5 a2 i
  28. }
    : F/ T; H' ~# `& v( B

  29. " o3 i; A5 z- a  R: m4 y3 o
  30. void Car()
    ! j0 e6 A4 y6 v5 f2 W' ~4 y
  31. {
    & O) Z2 t9 N2 Z/ E5 [  |3 I8 F$ _
  32.   while (1) {  s  L+ n" d- p; G2 Y+ E" R. ?
  33.     CNY70();( `! P$ V0 @. D! _8 U; x" |, ?+ X
  34. ! }2 j( j) h# P
  35.     int error = ((int)values);* C% R+ y) Y: x7 l
  36.     interror += error;) ?* h' ]8 U7 P  k. }6 F
  37.     int lasterror = error - olderror;
    ) ^/ ?  o* l  Q( Z5 s# a) N" ~5 F5 b
  38.     olderror = error;
    & v- S5 t# ?; J, F+ T$ F# G. X
  39.     int power = error / 5 + interror / 10000 + lasterror;
    3 E& u/ M- N7 f+ q* {* G2 }
  40. 5 A% I5 h, g0 v. O3 i* [9 ?
  41.     if (power > MotoSpeed)
    0 ~/ y6 q; H2 w+ [) U) K
  42.       power = MotoSpeed;
    & S' P" G' h3 e+ K; O
  43.     if (power < -MotoSpeed)6 e) o& P+ W& I- S9 E% m* l
  44.       power = -MotoSpeed;
    ; D7 N5 q5 a  M4 j
  45. 1 C+ ~( B& y; Q. |' b% G
  46.     if (power > 0)! i5 h& J( U8 ~! e/ t# X; M
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ; w/ h8 C  J  \5 v* j+ S6 [4 S$ G
  48.     else  V- N! D7 K$ }
  49.       Speed(MotoSpeed + power, MotoSpeed);
    + p# V4 a( ?" v+ K- w2 `; ~
  50.   }
    + F" f- J# c- {
  51. }
複製代碼
1 F3 @- d  ^8 d; |3 \& q" e
3 a( `. r% v  @4 x, `" ^. M2 D
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-9-18 15:23 , Processed in 0.028528 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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