圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21697|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>* H! a& K- }( ?
  2. #include <Wire.h>1 F$ m% r: X, q* f0 p* n
  3. #include <Servo.h>; |& t- F+ X: O; [' ^" t# v
  4.   V, o: f' g; R2 K" g* R  N8 m# X
  5. #include "MePort.h"
    $ A& O' B' G0 \4 a( x, d" Q
  6. #include "MeUltrasonic.h"' ~2 r/ B# t# ?$ t$ G$ C6 H
  7. #include "MeDCMotor.h"- v) f3 [9 n- b: D0 J

  8. - }) ~, a/ ]7 k! S
  9. //double Input, Output ;4 @; y; h- Y2 q, {
  10. float MaxSpeed = 255;
    . u. u+ V) I+ G1 Z; I& I0 q. ^4 g4 C
  11. float MaxPower = 180;
    2 j. @. Q8 g) Q2 g
  12. float MinPower = 120;
    * S% c+ g) s' p" G3 D
  13. float Error,ErrorAcc,ErrorDec;+ j- @* ]" Z$ M' h5 M

  14. 6 }. n  q4 |) G9 T% j( f3 `
  15. float Kp=0.14;3 L( l. r/ g% J1 f3 z
  16. float Kd=0.00020;//23;
    9 L( g8 N5 j6 R( i2 f& W
  17. float Ki=0.000201;
    ! {# i: d, M0 C, P' h3 \
  18. + Y3 U$ g+ U, Y1 ?6 ]$ H" V
  19. float nPower;' I/ |9 A" Z; Q0 \6 N# R5 U
  20. MePort lightsensor_6(6);
    5 {1 C) j/ c& M' ^  L
  21. MePort lightsensor_8(8);' r% {9 a9 S4 o' S7 T0 Q. |, {  q7 b
  22. MeDCMotor motor_9(9);
    4 J* Y: E1 y/ J
  23. MeDCMotor motor_10(10);
    : p/ a3 ?; r4 R+ B/ J( {
  24. unsigned long previousMillis = 0;0 o0 B" f0 o& q
  25. const long interval = 1;% q2 K% l) {) J, }
  26. & t9 h4 m  s: D; `
  27. void setup(){
    6 k5 z( N8 }! t3 r1 B
  28.     lightsensor_6.dWrite1(1);# c4 O5 s0 L! v, ?# t. S
  29.     nPower = 160;
    , B6 [( z6 r4 M9 B
  30.     Error=0;
    0 R0 x! g8 X6 w) e; ^
  31.     ErrorAcc=0;
    : {4 j% f- ~" M2 G) z
  32. }
    $ J' m/ v& ?- F; s) F0 ?2 c7 O5 q

  33. 9 z' d% y/ x2 c' I; }1 Z) j5 ~
  34. void loop(){
    * i( q" J) |1 m) x  w
  35.   unsigned long StartTime = millis();2 J0 ]% w3 U( i' U& t! Y4 c
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    5 M8 z; S7 D% I4 w* M. `
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    % A! {" n# u) O( E& i9 Q. G
  38.     ErrorAcc +=  nError*Kd ;
    % k0 G& a: a2 ^# V! M9 ?2 I7 u5 D; @
  39.     ErrorDec -=  nError*Ki ;4 [0 P9 \2 u0 i% m# _
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);. V; b! d1 |0 D* J6 u8 _6 m- e
  41.     if(nError < 80 && nError > -80){
    ; ^9 D6 [1 H+ }* W
  42.       if(nPower < MaxPower){
    & |( f7 }1 a# x
  43.         nPower += 3;! Q) x9 K3 D  E# G$ h
  44.       }& ?, G: I4 |; I( h* V
  45.     } else{
    ( b" l( O) ]1 a$ m* j( ^+ w
  46.       if(nPower > MinPower){- Z8 J7 ~4 H2 q; T' Q% L7 k
  47.         nPower -= 2;4 V1 G; Q" x# E  S; m8 q' p, `3 M
  48.       }
    ! a! w' C+ F! V
  49.     } 2 c8 w8 c% O) ^7 G
  50.     MotoL(nPower-Error);
    & {) h& ^- w7 U8 m& }% _! a: D
  51.     MotoR(nPower+Error);    ! d4 b5 y& R6 f( E! s$ p
  52.   }else{6 e& r% ]$ ^: b
  53.     motor_9.run(0);
    2 p8 _6 u' I# u7 _3 c/ n
  54.     motor_10.run(0);) s0 {: {$ g. d/ f7 O1 H
  55.   }
    5 U* @% ^* ~+ E" ~( @
  56.   do{}while(millis() - StartTime < interval);
    8 R% g$ P  b3 {1 B) _& t
  57. }# j- ]1 x: l8 X# Y
  58. 9 _1 A1 `0 t; m" ~
  59. void MotoL(int Power){$ |1 P9 R0 y4 H5 s' t
  60.   if (Power > MaxSpeed){! @+ `0 R) H* E
  61.      Power = MaxSpeed;  M( |) W& _. }3 U& E
  62.   }
    & \* n, P; ~" Z4 I
  63.   if (Power < -MaxSpeed){
    * t" C8 C. M% S' S: ?' D0 p
  64.      Power = -MaxSpeed;
    3 i, d# p9 _. U
  65.   } " H& X9 \4 U! z+ F/ M* e: p% }
  66.   motor_9.run(Power);
    : m. s, H1 O- s, I& n+ G$ m
  67. }  6 m" G  i: g, ]) w& a. e0 V* J

  68. & M/ W$ ?! _) f5 ^) N6 i( d, y
  69. void MotoR(int Power){
    3 A0 C; _: x  I: d: O
  70.   if (Power > MaxSpeed){
    * K* x- |. P  G0 Y- y( f
  71.      Power = MaxSpeed;, j6 k! Y  `' B, \
  72.   } 1 j0 V% O8 q. w& }
  73.   if (Power < -MaxSpeed){
    0 v! g9 R8 r. x4 \, k" t
  74.      Power = -MaxSpeed;+ h+ {( P) f6 z8 |- L2 F+ ^
  75.   } 3 ^4 j. A( |% A+ S
  76.   motor_10.run(Power);6 k5 Y! D' W' C3 ~+ G
  77. }  
複製代碼
6 w/ L+ l* {0 X7 @- d8 \

9 x! J' E5 D2 N( s
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 7 E3 T! [0 a8 d; s, V2 [

0 ~5 W6 O! j6 y1 ~2 `+ b您好,不知是否能向您請教。
* y# w9 s( y. B) S目前和宋修賢老師在處理Ardui Car
+ j+ M. S4 h* U- y雖然已使用較繁雜的方式處理了跑出黑線外的狀況
% _( V2 c* p8 ^4 p. R1 p
, g# E0 K; M/ M8 S7 G  M8 w& D/ h, b但基於想追求更精簡的程式所以還是想請問一下
. n! q! d3 E4 W3 a1 c就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
: y: ]1 P4 d/ R! |/ a6 ^; A9 E/ L不知道您是否願意教我可以如何處理1 S0 b, x: P) N2 Z

; J  q# w. S9 n5 u4 c, e
8 R7 X; g. C* T, z+ @* h, H% r以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    : r. j3 K3 ^3 z9 N2 ~7 T: ?; b* }3 b
  2. double CNY70Val = 1000;3 G9 w7 b- b$ l3 S" f- X
  3. int interror = 0;
    8 X8 J, C+ m8 K; u+ M8 I' d% N
  4. int olderror = 0;' O# H" F& \/ m# W. e
  5. double values;3 N, `6 V" m9 X( }1 \0 y! Z

  6. 6 p& Z6 ]9 g- K9 W3 t) y

  7. ( `' x  i( H% {- u1 f: P0 ]7 c) R" E
  8. void CNY70()
    * Z& k' R3 ~4 g
  9. {- t: S; ^2 ?. T* l4 S/ ?
  10.   valuesRR = analogRead(RR)' p" q0 ?. B- `% G7 U4 A1 g
  11.   valuesMR = analogRead(MR);( ~" i" [. k7 m3 c% }
  12.   valuesMM = analogRead(MM);+ p5 P9 m, r* W$ s
  13.   valuesML = analogRead(ML);; }1 |0 w/ s9 ]2 x
  14.   valuesLL = analogRead(LL);
    8 s0 {3 y1 T0 Y! H& e  B1 E

  15. ( X* c4 s( R  C9 h; }
  16.   if (valuesRR > CNY70Val)6 L5 N% Z$ r0 {: x& d- _: ?0 q
  17.     valuesRR = CNY70Val;
      i# Z5 {$ ^$ `  ^9 k, l( ^9 ^$ Y
  18.   if (valuesMR > CNY70Val)" G1 x! y9 }" a: S; U# m
  19.     valuesMR = CNY70Val;
    4 }$ }3 w2 U5 n  b: O( @
  20.   if (valuesMM > CNY70Val)) u4 m! w" E2 ?* H7 }4 r4 ?
  21.     valuesMM = CNY70Val;
    6 y. Z$ i+ C2 I4 s/ ?, v0 ^
  22.   if (valuesML > CNY70Val)
    6 ^+ s7 G3 I9 @$ x- x  z% j- o
  23.     valuesML = CNY70Val;
    6 T3 z3 U9 R+ o
  24.   if (valuesLL > CNY70Val)
    . _$ O% y; I/ J" j- e' C& }! O6 W
  25.     valuesLL = CNY70Val;/ |, }4 R0 Q4 z" X% t0 }# x9 [0 K* n
  26. 6 A$ C* P- |3 {* J+ E
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    : d2 g( ?9 _4 E7 n9 I% U
  28. }
    4 e. k2 k9 X% I  n& U) }
  29. ! h% A7 @" X# v4 w' ^4 \" o8 ~
  30. void Car()( }6 v: E( \- @3 q8 N) d* V3 t' o
  31. {& ~' r8 x6 N! M
  32.   while (1) {2 Z" q. _  y7 t
  33.     CNY70();, D/ q& F1 M& J9 D9 o7 n
  34. / W8 L3 d3 M  U8 `  M  G
  35.     int error = ((int)values);
    + K  s$ L+ T$ p7 O8 i5 m3 j
  36.     interror += error;  g( Y4 \8 _" J) T' f9 O7 Y
  37.     int lasterror = error - olderror;
    1 N5 y' V* B  o1 [
  38.     olderror = error;
    5 P. Z% ?& @1 G: [5 x) T, S
  39.     int power = error / 5 + interror / 10000 + lasterror;
    7 z  y6 D+ [+ d& `0 s. P% @( Z
  40. 3 m3 P+ V' f" t8 t
  41.     if (power > MotoSpeed): m- r- U/ E8 Q0 b+ R% Z
  42.       power = MotoSpeed;3 N8 Q4 }8 @" D  S
  43.     if (power < -MotoSpeed)7 S4 S" M' Z; D
  44.       power = -MotoSpeed;
      z; r0 C3 U3 Q5 W, L7 o% g
  45. % G6 `1 j& {8 E) Z9 Z
  46.     if (power > 0)0 J( A- G+ l8 i/ l
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。+ g, Z( Y! p4 S9 @  p
  48.     else6 J5 T* H- a% M; F# f1 X: }0 \
  49.       Speed(MotoSpeed + power, MotoSpeed);- F" p0 `) s3 [- M9 }  `
  50.   }; H: l- y4 K2 p
  51. }
複製代碼

% h  b, E! V9 U* M/ ?, z8 v. _
3 A1 m# W/ V8 M# c
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-23 08:13 , Processed in 0.023245 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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