圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21699|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>9 S' J. f% T- e4 D- r
  2. #include <Wire.h>; h1 q' e% B5 a# B
  3. #include <Servo.h>7 o8 s) O& h; d

  4. 3 N+ e  [* T, Y1 N. s
  5. #include "MePort.h"
    6 E" j. a4 j7 W  _8 a* n% L% M
  6. #include "MeUltrasonic.h"
    . Z" {( \! s- a& {* r9 E: K5 q
  7. #include "MeDCMotor.h"" K: n' X" g* |6 b- J0 t. o

  8. 6 U6 W' f) @: ]
  9. //double Input, Output ;. Y4 ]6 G" Q5 N
  10. float MaxSpeed = 255;
    7 q) ~, ^% b. c8 \( w2 T' ^
  11. float MaxPower = 180;2 f- X" q/ I6 M% W8 j+ _
  12. float MinPower = 120;
    6 W  O0 O7 T' U% V1 B5 a9 ]- r
  13. float Error,ErrorAcc,ErrorDec;
    / N2 V# k  M' _8 K& ^
  14. & ]1 M! _8 t# a& n0 f8 c
  15. float Kp=0.14;
    ( b  }# ~. b: z& w% ]3 Q
  16. float Kd=0.00020;//23;6 i% }) ?2 [% }$ ]9 c
  17. float Ki=0.000201;4 {) b8 S0 ?* J+ C9 X5 i% B
  18. 9 W# j, c3 ^, X5 x( H. [% B
  19. float nPower;
    4 z: d& V! R. V+ w( F
  20. MePort lightsensor_6(6);
    6 B1 D; A; l" @  ?
  21. MePort lightsensor_8(8);7 A& D$ q4 _. m
  22. MeDCMotor motor_9(9);
    7 H  U% k9 ~4 |2 @
  23. MeDCMotor motor_10(10);" Z: E6 P# S; F8 Y2 ?& ]
  24. unsigned long previousMillis = 0;
    + O* r% {! ~1 C3 E/ R
  25. const long interval = 1;* ?; |( `9 k' S' `7 v" T
  26. % b% S# l7 f$ j0 I1 z$ n
  27. void setup(){
    * |, x" s$ {( u. D
  28.     lightsensor_6.dWrite1(1);
    2 `" r7 V  {- d
  29.     nPower = 160;$ Q4 p1 G8 y2 Q& [# h6 q
  30.     Error=0;
    , s+ m0 a# o$ v
  31.     ErrorAcc=0;
    . l4 P( {4 k" F* A: j
  32. }
    ) a8 L- S$ }- C$ {, y- F& v
  33. + A2 Y2 O! L: M/ {: S) M  k
  34. void loop(){9 E& @( D9 X( G% a3 k; A
  35.   unsigned long StartTime = millis();* K9 Z: k; Q7 Y  U4 \/ \8 A( k
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    4 y8 D" I% i, u' t7 G
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();) f; P* o6 i* @3 n4 F* L
  38.     ErrorAcc +=  nError*Kd ;
    6 J" l6 @* }8 B8 B4 P2 v/ G
  39.     ErrorDec -=  nError*Ki ;: \0 Q# c6 N5 i
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);7 @( N+ c& D4 z
  41.     if(nError < 80 && nError > -80){4 y6 U# l% O# ?: r$ K; x$ d
  42.       if(nPower < MaxPower){$ W* T/ @& \  K
  43.         nPower += 3;
      c. v; b. F: f6 P) C1 w1 S1 y$ |% y
  44.       }
    0 g. ^# ^) R5 s( U: \( C' d# f7 x0 \7 q
  45.     } else{3 s9 L3 R0 V$ ^$ @- |* u
  46.       if(nPower > MinPower){
    + p; F$ p$ ]: b1 |9 G9 |
  47.         nPower -= 2;/ t" H' E7 N) l2 d% S# p
  48.       }
    ; \5 U. h6 ]0 G+ K  }, P! g
  49.     }
    " X5 |' g* ?6 ]: B
  50.     MotoL(nPower-Error);
      u/ z8 Q; E% ~, B# r
  51.     MotoR(nPower+Error);    ! L# c, u- T4 Q; S) H( L
  52.   }else{2 K2 b% ~* r% I, w9 E
  53.     motor_9.run(0);/ C1 S( T, S% S/ w5 l
  54.     motor_10.run(0);, [2 M2 b  S& G  H" r
  55.   }
    / T# f% d) h+ w) D! K' G
  56.   do{}while(millis() - StartTime < interval);
    # |3 j; ]; f& I4 V& i: [4 f- r" B
  57. }
    " k- ]4 }7 [9 Z

  58. ) H( c6 E- x/ S" I. M* w# N# }$ E
  59. void MotoL(int Power){
    * w2 f: U( Q. _2 s* _# t
  60.   if (Power > MaxSpeed){/ h7 b: [- k$ f4 \- o0 }4 n* b3 D# `
  61.      Power = MaxSpeed;
    % N4 _( ?) R. U, j. b# Q+ l
  62.   }
    % P/ t/ f1 H/ F/ Y
  63.   if (Power < -MaxSpeed){4 r% h$ E# c( Y* S7 E
  64.      Power = -MaxSpeed;
    4 E! y8 {9 ]8 O! D
  65.   }
    . @3 ]5 z* }4 ^4 `( H
  66.   motor_9.run(Power);
      ~- x; H; E/ [  O3 B
  67. }  
    3 Y8 e2 ]7 Z' U" Y* Q- e! }/ A
  68. , l! e% \5 F/ A& f; D+ n7 D
  69. void MotoR(int Power){
    ! ]( h( y  p8 I) ]- O4 x0 h/ T6 I0 V
  70.   if (Power > MaxSpeed){
    7 j: J1 b& |+ K% _* K
  71.      Power = MaxSpeed;7 V0 s5 f3 [1 f: t8 A% a6 N
  72.   }
    ( o7 c, X2 L; s& m
  73.   if (Power < -MaxSpeed){
    - ^& J* n+ T% K1 Y9 D9 b  q
  74.      Power = -MaxSpeed;% M- X3 b7 M& K3 E) M( Q
  75.   }
    $ }4 k  `% C; L: i4 H! n) n9 r
  76.   motor_10.run(Power);
    . {0 Z( h7 ~9 k5 r5 \  }) f$ o; I5 U1 e
  77. }  
複製代碼
9 d& t9 s# d* ~4 Z8 h" @- b

5 F5 R) ?3 J5 [8 J2 d5 `
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
% S! m6 A% \" o7 a' g8 A2 n
+ h0 E% B+ @5 v7 U* C! Z1 q您好,不知是否能向您請教。
& i2 \  l+ F; V# X+ k) k目前和宋修賢老師在處理Ardui Car
. z0 m% k" N6 J# v7 P9 B雖然已使用較繁雜的方式處理了跑出黑線外的狀況+ z& f5 ~7 C3 h/ B/ n

+ `9 N( r! q9 G6 F5 t# {, S$ c1 |但基於想追求更精簡的程式所以還是想請問一下
6 S. g$ l* K; p' u+ s& K就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝/ [. I! s; |3 [# j5 {" Q7 I  ]
不知道您是否願意教我可以如何處理1 ]7 L( q+ t# D+ X7 |/ O
8 b' {2 g/ Y# n# s9 Z2 P8 C
2 j7 `) ?8 Y- S
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ! ~, e% [/ G3 Z9 l8 P
  2. double CNY70Val = 1000;
    1 M. {# O/ n! F% j
  3. int interror = 0;9 J" f# Q+ V' i, t5 Q9 Z7 y
  4. int olderror = 0;2 o3 m8 q9 p# n4 v) f2 u+ n
  5. double values;
    8 x( Y" [% t! G* g  ^  ~- E
  6. % Z" r2 B) v- ~4 O* ~

  7. " ^8 [2 x, F2 j; u% ?
  8. void CNY70()
    ; P/ P4 s7 s% W" H
  9. {
    + F4 r$ H% R! k. m3 E  R& _$ q- I
  10.   valuesRR = analogRead(RR)6 W0 r  L4 R2 v3 U
  11.   valuesMR = analogRead(MR);
    6 z+ s4 l! {+ m8 b+ K
  12.   valuesMM = analogRead(MM);- [! L, S* U" Y- \1 |" K! S6 U
  13.   valuesML = analogRead(ML);* Z5 a/ W! h- E# h  o9 e
  14.   valuesLL = analogRead(LL);
    $ ?' h1 W8 }5 U6 J' C- `
  15. ! }# ?( z5 o7 d' w+ W
  16.   if (valuesRR > CNY70Val)% R! h3 r& A2 c, L
  17.     valuesRR = CNY70Val;
    * l( _# x! N6 O% u( n
  18.   if (valuesMR > CNY70Val)
    / y/ M! V, V4 I3 g! D8 A* p8 K
  19.     valuesMR = CNY70Val;
    , }2 M- N; Z3 ?0 C, [( r
  20.   if (valuesMM > CNY70Val)
    % t- B7 |3 t! m: O: d) [/ k
  21.     valuesMM = CNY70Val;) J/ }" G# h  k8 z; n
  22.   if (valuesML > CNY70Val)
    * s0 W+ @' N  n
  23.     valuesML = CNY70Val;- a. n% S" u! u( E
  24.   if (valuesLL > CNY70Val)
    5 [( h3 O3 @$ D. H- N1 Y
  25.     valuesLL = CNY70Val;# f3 j# N9 Y0 s

  26. - M# B, X& b" h$ _2 ~+ R7 c
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    8 n( \. Q+ [# u0 \' O1 V# B
  28. }
    . T2 t2 s' b" k2 g8 m- [
  29. - Z/ q- [/ h- Z5 g
  30. void Car()0 ]  d' U7 Q8 j* R9 J* m7 t
  31. {
    / g3 o4 T/ L1 s: i; Y0 j8 b
  32.   while (1) {
    * h/ A0 \/ r7 K7 y1 B
  33.     CNY70();( W8 @! v8 p3 `) E) s! X

  34. : ?- Q* u) o5 D: X
  35.     int error = ((int)values);; Y% M) V5 |0 r8 a  `) M
  36.     interror += error;5 a1 D# {+ K9 U* W; M
  37.     int lasterror = error - olderror;) b* h: z& I  v3 w8 |  }4 |" m
  38.     olderror = error;7 @7 z- v5 f' S* l8 K
  39.     int power = error / 5 + interror / 10000 + lasterror;
    # o, i# H9 j5 g6 L. H9 n
  40. 9 D5 a6 {" h3 k9 y
  41.     if (power > MotoSpeed)
    + Y' U) a, R+ w" A- r
  42.       power = MotoSpeed;% m! ^1 X  N9 z' @( ~
  43.     if (power < -MotoSpeed)
    8 w  J0 m! a4 }8 [+ @0 k2 h0 l+ K
  44.       power = -MotoSpeed;9 X: y% u/ P5 }

  45. 2 C; o1 M  Z7 h5 G1 O2 q
  46.     if (power > 0)
    % ~5 C- i6 M" O. L2 L- A- X
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    . \0 p, A6 J4 }
  48.     else6 E& q# ~) S: A0 o' o( t4 w9 e- F
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ) n6 [& D( J6 W( G
  50.   }+ K1 x$ d5 w9 v( Z# R6 t
  51. }
複製代碼
* ]; w; N2 c. e  L7 |
0 P& P# j- a9 \1 W+ ?% O1 G8 [) v
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-23 22:54 , Processed in 0.023090 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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