圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21819|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
      Y2 R: g7 s; G
  2. #include <Wire.h>
    - H: l/ e- c- P  e
  3. #include <Servo.h>7 P# W- A7 K$ U6 `+ X& Z, `2 S+ ~$ U
  4. 6 r  J! n+ K) I" L7 J; S1 \
  5. #include "MePort.h"9 [% `) C$ [; E9 ]; b( }" Y, {
  6. #include "MeUltrasonic.h"3 J3 A9 D. T' w; A/ ~
  7. #include "MeDCMotor.h"
    4 i& k( W( N1 S2 b' Z1 O% }9 ^

  8. 8 F# p( j; x* E1 Z6 M
  9. //double Input, Output ;
    ) ]; i. g( a* [+ D* v
  10. float MaxSpeed = 255;
    5 Z9 k2 L4 r) T! i% P
  11. float MaxPower = 180;
    , e& O" S( _, |% l' N' o
  12. float MinPower = 120;/ ^+ L: y1 `9 R' `" K, ?
  13. float Error,ErrorAcc,ErrorDec;, C8 i7 K  G+ e0 E9 u- w
  14. & e* ^' z1 i8 i* M. ]
  15. float Kp=0.14;( f+ `' o) b3 i6 J
  16. float Kd=0.00020;//23;5 o: B: A: Q+ H$ \
  17. float Ki=0.000201;
    5 C! o8 E* y, A+ G
  18. 6 Y# ^  s2 c- y* W$ e" X$ g+ `* a- [
  19. float nPower;7 ~3 x7 s) z6 Q. Z/ t9 K
  20. MePort lightsensor_6(6);
    8 `. X, I9 [; e
  21. MePort lightsensor_8(8);  |' j* A1 ~3 h; {6 E: w, m2 }2 I8 U
  22. MeDCMotor motor_9(9);
    , f) W+ s+ ~/ A" m- Z
  23. MeDCMotor motor_10(10);* {) `0 E4 H& K
  24. unsigned long previousMillis = 0;3 J9 V. U. q7 O
  25. const long interval = 1;
    2 L  I- Q+ x4 g9 x0 C7 g

  26. $ e  V; \  T9 O& d  x$ W
  27. void setup(){
    / g8 v6 K# R4 \2 E7 m0 q
  28.     lightsensor_6.dWrite1(1);
    - @8 K; U3 P# ~
  29.     nPower = 160;
    , T: h0 x2 |" _4 l  {( j
  30.     Error=0;
    2 P: l. k' R( ^; Q- x! K4 {
  31.     ErrorAcc=0;% |: P; R+ e" {  H9 L
  32. }; y: R( f4 F5 j! ~
  33. $ p8 N( b( A  K! m, z
  34. void loop(){
    6 y0 T( a9 |0 c1 D  n
  35.   unsigned long StartTime = millis();) }2 n) x% ~7 ]' X$ o6 r9 [- j
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    9 R) E- }0 j( Y# o( b3 q+ D
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();8 A8 B; m& Y$ D4 ~, y. V  I0 `. A
  38.     ErrorAcc +=  nError*Kd ;
    * E' [5 q! U( S' m" `7 a% o. [
  39.     ErrorDec -=  nError*Ki ;& }/ I7 k* T/ C6 c
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    9 o2 z" d7 n$ x7 e1 y+ A: Q
  41.     if(nError < 80 && nError > -80){3 O4 c+ R# C& i& d; l
  42.       if(nPower < MaxPower){8 s0 F4 B, z, C' J9 g  G
  43.         nPower += 3;
    - k3 G% @0 w) }+ i* L  _
  44.       }
    7 D) c) K" r! z$ u' B9 H: e
  45.     } else{
    4 I, f# d3 f* D. r4 `) S6 w5 A
  46.       if(nPower > MinPower){1 v5 F3 h) t1 M0 e6 P( I  ^
  47.         nPower -= 2;$ p3 \7 H! m6 M! d( a
  48.       }- b* ]  ], f, m: ]) O
  49.     } 7 m" C# }' K% p$ F
  50.     MotoL(nPower-Error);
    + S# e/ n7 t2 E" U. H
  51.     MotoR(nPower+Error);    7 p) O( L, }& X2 {& t
  52.   }else{
    1 F7 P% p# t+ q- @6 K) T+ l% L
  53.     motor_9.run(0);, f4 M5 E" K4 u/ C# o  A  O% g% ?5 b
  54.     motor_10.run(0);  N. x# O& c* }, ]
  55.   }
    4 v: f! v1 E- x  s# E) U, `" S- A
  56.   do{}while(millis() - StartTime < interval);( m7 y' X8 i- O, {
  57. }- _- V5 [8 _$ `$ ]
  58. ' Z5 ?! ?3 a5 W2 r
  59. void MotoL(int Power){
    2 [/ H# i4 B+ ~: l- f' d) t; g
  60.   if (Power > MaxSpeed){
    " ]) m7 [. J5 f0 W5 i% h
  61.      Power = MaxSpeed;
    . D) ]+ N: _( |
  62.   } 4 A/ f- n# q9 E: r* w
  63.   if (Power < -MaxSpeed){
    ; h- i* N" Y+ M: n
  64.      Power = -MaxSpeed;) U) _! _' [7 R1 H
  65.   } * D  v% e# |! u, c/ i8 T+ ^7 O
  66.   motor_9.run(Power);% d* ?1 s6 k% @+ R( x- g
  67. }  
    8 s1 o" C' p4 P6 \* i) C2 F% v
  68. + ]4 Q1 y2 X, O0 u
  69. void MotoR(int Power){6 B. n+ n) y  Y+ m! d0 W) ?
  70.   if (Power > MaxSpeed){
      ^8 A5 A6 D5 _  |" K
  71.      Power = MaxSpeed;
    9 Z7 K* b" B& O* O. k
  72.   }
    $ P; ~% l3 Y; b! W# X0 m" c+ S& u- l
  73.   if (Power < -MaxSpeed){+ q/ v  i9 S( w
  74.      Power = -MaxSpeed;
    ! J0 D! i: f9 ^4 }" G& @3 O
  75.   } 1 l, w6 S4 O/ x  h
  76.   motor_10.run(Power);4 }  w, }) N( b, l# x# H! U: [
  77. }  
複製代碼
9 H% P# S9 X" V
: N/ z9 q& H3 @3 u; ?" I
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯   Q+ S3 g. t  I7 ~
0 S- O- m7 w; ~" P
您好,不知是否能向您請教。4 a5 G' E" J4 T$ G
目前和宋修賢老師在處理Ardui Car  m3 t# ^4 p  ]+ O7 v" U1 t
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
# d5 e, l& ~8 ?& E! V! g8 r2 S9 `* Y9 l% r6 ]
但基於想追求更精簡的程式所以還是想請問一下
3 L3 n4 n8 w4 n就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝5 l$ Y/ }% v' Y
不知道您是否願意教我可以如何處理
4 x$ h- R5 z2 j' l$ B  a! T4 P/ r; y0 s2 @1 u! y% }5 f, K, l6 o

! P# C1 G7 A2 v+ N0 |# s# e* g以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    % g0 ?) H$ b, t/ I5 K! ?: i
  2. double CNY70Val = 1000;
    8 m3 r8 p- c, L1 ]. H" m
  3. int interror = 0;( I3 a/ P5 ?1 l* X# a* r! S
  4. int olderror = 0;
    ! y& s* m6 Z  Y0 K' ?! Y
  5. double values;3 f# b) c7 ?8 b0 y9 |% i! `; W# Y& I
  6. , o9 A6 d# a5 G) V0 Z

  7. : I6 u. T+ T- O* y, S& R2 N$ w
  8. void CNY70()
    3 B( o, H* L/ y4 k) j2 e+ f
  9. {+ d( ]8 _" ~) j8 D. g& Q
  10.   valuesRR = analogRead(RR)
    " ~' I5 s' w. X
  11.   valuesMR = analogRead(MR);5 s2 O: P( Q" d1 U: L. ?. D* y+ X5 g' `
  12.   valuesMM = analogRead(MM);
    + \, d2 m, M  D$ n: R- c- o8 f
  13.   valuesML = analogRead(ML);; `% _' i: t7 _0 ~; V9 T
  14.   valuesLL = analogRead(LL);
    + S; R' T% e! Q/ e' J

  15. * ^5 w* H* u. I" Y, `' B, T
  16.   if (valuesRR > CNY70Val)" }1 s1 _* |8 M( F
  17.     valuesRR = CNY70Val;
    ! s+ B: v/ c1 r+ ~
  18.   if (valuesMR > CNY70Val)
    . {- L4 a7 H( ?5 G1 ]) G: R- D  J
  19.     valuesMR = CNY70Val;
    4 w% G$ Y0 _5 @) k0 u
  20.   if (valuesMM > CNY70Val)+ b$ X  @2 K% g9 _  }
  21.     valuesMM = CNY70Val;6 F4 u8 c- g. R, D$ M
  22.   if (valuesML > CNY70Val)
    * U3 @0 Q) m/ N; s
  23.     valuesML = CNY70Val;
    1 |& T2 ~# P8 r  s
  24.   if (valuesLL > CNY70Val). w/ T& B0 L) _7 i; ]2 F
  25.     valuesLL = CNY70Val;/ A# q8 a& E7 ^5 `/ u

  26. " y  ?! {& G& \$ D( @
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;$ O( q' x! O1 e$ o, L
  28. }
    3 L# v2 _3 T( v5 M3 x

  29. ; Y  A6 p; z3 u% n  f; O
  30. void Car()
    2 r5 f9 o$ d0 U9 u( D
  31. {
    ; E$ O' i6 I3 m. |1 x4 f& s- q6 l
  32.   while (1) {
    5 ?; \% y  g- m! N: U3 u; l
  33.     CNY70();0 {( e0 v  |5 [

  34. ( ^5 F6 z$ m4 H
  35.     int error = ((int)values);! Q" ?" r8 G8 R: E
  36.     interror += error;. P4 ]1 [8 a0 N, Y
  37.     int lasterror = error - olderror;
    . C. M" j4 X/ s; X) g2 r6 V, t
  38.     olderror = error;
    " x9 p# ^! r! W/ y& e
  39.     int power = error / 5 + interror / 10000 + lasterror;2 X( G1 E& v0 u
  40. 8 R+ r  f9 G$ B0 b. v
  41.     if (power > MotoSpeed); Q) D  L7 W8 \4 p* F6 W
  42.       power = MotoSpeed;# n( N. K' v6 m6 a% B
  43.     if (power < -MotoSpeed). _1 C5 A: L8 t( n) H3 K
  44.       power = -MotoSpeed;& v6 P( X$ P/ a2 I, \: E% J: g9 {
  45. 9 T, G. J0 k: T9 x! |
  46.     if (power > 0)  z$ E' N% z7 {9 b7 W
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。5 d/ P( U/ J( ~$ n: L
  48.     else& Z9 u, F& w. F( \5 P) Z% n
  49.       Speed(MotoSpeed + power, MotoSpeed);' v$ C% d6 P; w& ^  {0 C, h0 H- Y
  50.   }
    3 O! k6 Z7 V4 |1 K/ H
  51. }
複製代碼

: Q! o5 i  b+ @0 G3 s; G, ^( ]  w& @
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 09:45 , Processed in 0.023072 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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