圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21797|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>7 V7 T# e; E- t) K, P
  2. #include <Wire.h>5 @( m& ]3 a5 Y  i6 Z! Z5 o
  3. #include <Servo.h>; l5 t. A( B7 R5 S0 M/ D- Q

  4. ( x# E3 g9 F* R0 J+ S5 y" j
  5. #include "MePort.h"
    4 t1 b, N; O$ ]! t) D
  6. #include "MeUltrasonic.h"
    7 Y4 ^- K% E; ?8 U  G% l& v: T
  7. #include "MeDCMotor.h"
    # o) l1 ~) m% s- t) M9 i
  8. ) l( J1 U; h. p1 j
  9. //double Input, Output ;
    3 j; a+ ^4 m: X( L- |* b
  10. float MaxSpeed = 255;
    $ u& |  {: p  g' z+ |4 r, H6 g7 X  k
  11. float MaxPower = 180;
    4 I$ }% ?$ J5 b
  12. float MinPower = 120;2 k. U5 l5 s" D, N8 `6 n& c  r
  13. float Error,ErrorAcc,ErrorDec;
    * }9 X/ f, G+ Z5 ]5 D+ K
  14. 0 V8 f* I7 @: {% Z# L
  15. float Kp=0.14;. B" V+ }2 Y. v' X7 `
  16. float Kd=0.00020;//23;
    # G/ ?. X7 ]+ f6 v
  17. float Ki=0.000201;6 q3 @4 ?% V5 G$ u  y, S' ^

  18. " A" I- ?  Z! r" L
  19. float nPower;
    / x$ A" f: N) `& w+ z. l1 J' b, w
  20. MePort lightsensor_6(6);% _. [' t( w, m; \
  21. MePort lightsensor_8(8);0 Z1 c! O2 Q0 Z$ k& a8 E
  22. MeDCMotor motor_9(9);6 j4 b9 y8 ~; V7 d1 c+ |
  23. MeDCMotor motor_10(10);4 t/ @6 B4 M/ W7 K% x: K7 ~
  24. unsigned long previousMillis = 0;+ |. X) G7 l9 f; ~# E
  25. const long interval = 1;0 t) u- m7 o* U6 c  a

  26. + V$ G' u4 D& ]+ H$ d0 j* |5 G
  27. void setup(){
    ( G2 ~/ q8 t; |2 p" m
  28.     lightsensor_6.dWrite1(1);; B( P) }. T8 P& C) ]  W
  29.     nPower = 160;
    ( H1 b/ w/ h1 Y8 B. K
  30.     Error=0;
    + {9 X, N& n! q$ |6 Y. }; }
  31.     ErrorAcc=0;8 Y' m* t. r+ H8 T* y& D
  32. }
    9 d# ?- {) d/ z- t& S2 {

  33. ( `* }& n5 y2 J  H6 Z: F
  34. void loop(){
    ; G. c4 s( K1 v  Y- c8 V5 w; A$ T
  35.   unsigned long StartTime = millis();
    + R5 e& I' m6 x
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){6 r0 z$ p6 U4 j. l  e
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    2 j5 B2 ?8 Z, \4 `1 @
  38.     ErrorAcc +=  nError*Kd ;
    1 G4 D; ?) m) D  A" a& W5 f7 }
  39.     ErrorDec -=  nError*Ki ;* A! ?* o& t$ F6 F8 E+ u, h) @
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    . \2 ^0 k7 F/ M% |6 q" h6 {
  41.     if(nError < 80 && nError > -80){! C3 @$ k" T6 @$ T. `* D, \  K
  42.       if(nPower < MaxPower){& z7 f/ L2 R/ U! a* U" r0 B8 w
  43.         nPower += 3;9 v) Y/ d: Q5 ^* o( D0 `3 C9 @* I
  44.       }
    ' r7 k' Z# ^8 u4 s% n9 }
  45.     } else{6 w$ O; b3 I7 I0 a) H* J/ @4 u5 b
  46.       if(nPower > MinPower){
    4 N, @. v% |0 b
  47.         nPower -= 2;/ H$ D) P4 h: I! m" V. ^5 i
  48.       }
    9 t8 Q5 |9 G" n# ~* e( k
  49.     } * r: E- K  q# U
  50.     MotoL(nPower-Error);; g1 ?  F* @8 s3 X1 X. ^, G7 F
  51.     MotoR(nPower+Error);   
    5 \% u, E( S. z) Z4 {
  52.   }else{
    ! r0 u: A8 w$ F& h9 C2 g
  53.     motor_9.run(0);
    6 Q8 ~" }& X2 U3 m
  54.     motor_10.run(0);
    & a! S* m) y4 J( w+ u& D1 \# ?
  55.   }7 y4 X5 Y& z: p- @! J* }
  56.   do{}while(millis() - StartTime < interval);. o1 y- Q2 l) @& `! r. k+ [1 _
  57. }. r# F2 `; G/ g! Y5 C  J/ \
  58. 5 N& @: P, t( M2 b5 ]7 i' M% `7 J
  59. void MotoL(int Power){- S3 {4 Q0 X/ m
  60.   if (Power > MaxSpeed){
    $ e6 _( o8 I- k% K! i2 B, v* c
  61.      Power = MaxSpeed;
      R5 P6 A$ l, A7 `0 Y, O, j
  62.   }
    # Z" I4 e8 _, a, ?  X; e
  63.   if (Power < -MaxSpeed){
    ! t, F' M  m- h2 p9 W) B
  64.      Power = -MaxSpeed;% R4 m) J* Z. d8 [
  65.   }
    7 x1 S  K% w/ ~. S/ P
  66.   motor_9.run(Power);" R5 G! u& B8 X, n6 ^9 M  `
  67. }  - w, f2 J0 G& k! P' T5 A+ g
  68. # o. N  [3 Z. _7 ^6 \9 o& L/ Y& c
  69. void MotoR(int Power){
    5 _: y, Y. F# m& B' a) }5 d6 a& f
  70.   if (Power > MaxSpeed){1 Z6 F" {! [- N3 Z# v
  71.      Power = MaxSpeed;
    ! q1 Y. s, A0 a' A- F6 i
  72.   } 1 i, i/ B" }# m. t
  73.   if (Power < -MaxSpeed){
    5 d7 k8 J6 z' D/ V7 o
  74.      Power = -MaxSpeed;9 K: ~& u9 l4 p! Y0 A2 I
  75.   } - j1 N: H/ m. g- y/ @1 M
  76.   motor_10.run(Power);6 X7 Y/ @( n6 b; Q; p% i/ X& G
  77. }  
複製代碼

/ _5 Q# p; t0 D- Q: G! a3 U, \9 M8 e4 D, R4 ^2 R* ]( E
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 # ^4 e  y. ~6 g8 O% A

( }# C1 j. r+ O& Z# g5 G. {您好,不知是否能向您請教。7 B  S. b2 D" X$ s+ y
目前和宋修賢老師在處理Ardui Car, v3 ^3 q6 L4 R  E( N, k+ E1 E
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
/ S1 g$ \: f/ x- m! {# f* I
6 e! b3 L8 O% r$ T7 u" W+ I5 Y. |3 ^但基於想追求更精簡的程式所以還是想請問一下
8 T2 d! W0 H( W3 |! Q4 C" I( ^就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝- L: a; E4 c& o6 F1 P: |
不知道您是否願意教我可以如何處理
8 Y3 g; x: K9 F# }
: Q3 x" ]$ K# X$ F9 P3 s  O$ r( }! ^7 e0 p
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    " A* ~6 z) i- B" M  W$ D
  2. double CNY70Val = 1000;0 O9 s( L9 H# L5 p3 E
  3. int interror = 0;9 P: e$ ^4 s5 L3 \  k8 r
  4. int olderror = 0;) c  r4 N. I* e0 M
  5. double values;$ R! }. d. o) q- Z9 f

  6. + [" t: G$ g1 Y4 p5 B3 {* K

  7. 9 H: Z! N/ p7 U) V; S
  8. void CNY70()
    7 T0 }% C' i3 `( N8 F" S7 R  d
  9. {
    8 C/ m' ^0 {' D, r8 H* O, l
  10.   valuesRR = analogRead(RR)
    3 j% q8 h% a5 s" L1 x: V
  11.   valuesMR = analogRead(MR);' m2 a( W/ L, |' w
  12.   valuesMM = analogRead(MM);) v1 h# }+ m6 Q) S( c7 X6 ~8 l
  13.   valuesML = analogRead(ML);
      i$ M$ x9 [. v( t) w, _
  14.   valuesLL = analogRead(LL);- q  ^. _( X9 l  R2 V$ Q' X

  15. 5 T; P/ f* u+ v
  16.   if (valuesRR > CNY70Val)& G/ o$ H! V- H  J# E
  17.     valuesRR = CNY70Val;
    7 l! Z7 w6 R" c3 C- Z
  18.   if (valuesMR > CNY70Val)) e  {! J7 D9 f* G7 g) X( V
  19.     valuesMR = CNY70Val;% |) N  |# C' ~/ R
  20.   if (valuesMM > CNY70Val)# [9 Y4 }* U! ], K
  21.     valuesMM = CNY70Val;( k2 c6 t7 p7 K: {
  22.   if (valuesML > CNY70Val)( `% O  L" h: N; j5 ^
  23.     valuesML = CNY70Val;  b1 x5 |" _. D2 G1 f+ r
  24.   if (valuesLL > CNY70Val)6 _4 i7 Y4 h$ e9 K& h
  25.     valuesLL = CNY70Val;( a; M* {- M: X" U) ^2 z% c

  26. ' P6 _# D5 J6 y1 R: z
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ; v+ L4 N: R& q; f0 G1 g
  28. }
    1 a, g; l( A# n8 A$ F/ |

  29. 5 a1 t, c8 N) P6 S! b
  30. void Car()+ V3 R' B  n" w
  31. {
    ; g$ Z$ L$ F) l3 u, w
  32.   while (1) {* k3 I3 A+ M9 `  o
  33.     CNY70();
    + o3 f$ I0 m- a
  34. ( T1 `; V+ @/ q4 V) x# u, k
  35.     int error = ((int)values);
    - j2 T' S& d5 k" s
  36.     interror += error;
    5 }% X: N: F' l9 ?7 ^
  37.     int lasterror = error - olderror;. u, J. B! V$ x
  38.     olderror = error;/ I* m) Q9 |. M  ^
  39.     int power = error / 5 + interror / 10000 + lasterror;! e8 a0 I5 R( v( _" s7 {

  40. * n: o0 u  U; e
  41.     if (power > MotoSpeed)
    1 @0 ]5 o6 v. B) v: j, e, k# O" u
  42.       power = MotoSpeed;
    & C! y; K; O. y# O& i# ~; f
  43.     if (power < -MotoSpeed)
    ( |: a& e9 E, U# t
  44.       power = -MotoSpeed;4 t( j1 S- ^, J$ I; Y

  45. ) f$ @3 V% e1 ]$ h/ I8 r0 Z
  46.     if (power > 0)( a6 `' _. ~3 |5 a, {5 [
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    % c6 b. |2 a6 h* ~4 j& d) O
  48.     else
    , ?% u. L/ b+ l* u
  49.       Speed(MotoSpeed + power, MotoSpeed);& b" N6 E; F7 J- A/ F4 R$ @  Z
  50.   }
    $ q( W1 ~4 U# w" A: R
  51. }
複製代碼
7 y0 \' t& K$ }+ ]! N0 G7 k
& x" ?+ F9 z& }  i3 F
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-1 14:15 , Processed in 0.021950 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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