圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21784|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    4 S9 `% B6 l3 W2 k& w7 m+ U
  2. #include <Wire.h>
    ' }. U2 C: c3 @+ C
  3. #include <Servo.h>' l8 B7 _) c" r/ M  B1 ~
  4. + T9 U! e7 b, _( t- Q
  5. #include "MePort.h"% l2 L- P9 T6 L6 x
  6. #include "MeUltrasonic.h") A+ i' J* M& \3 X, w% R! W8 H
  7. #include "MeDCMotor.h"
    6 G! f7 d7 Z6 U+ h
  8.   d- p+ t& _+ w+ L1 {8 e2 b6 Q/ O) p
  9. //double Input, Output ;
    , n4 s/ G; E6 k% s
  10. float MaxSpeed = 255;! l$ G% {) s. E" V0 y* D
  11. float MaxPower = 180;; }$ @& a  i3 J
  12. float MinPower = 120;
    2 N, r: r1 T: c: v+ S
  13. float Error,ErrorAcc,ErrorDec;  K1 t; t# l/ b% f5 S: x
  14. 7 I) F: x$ |; [
  15. float Kp=0.14;
    / z$ l! [) }' d" f0 v. B- V3 G0 n1 q
  16. float Kd=0.00020;//23;
    ! h7 r. R2 n% [3 _( o
  17. float Ki=0.000201;
    / ?' r8 L7 r+ z3 g  Y* U
  18. & `& o1 @  n/ K, n& ^) K
  19. float nPower;$ T/ A. {$ C  R9 c& L) t
  20. MePort lightsensor_6(6);
    0 }' j. |- R2 X' C
  21. MePort lightsensor_8(8);
    1 ~( }0 g) @, |6 k. I
  22. MeDCMotor motor_9(9);
    6 i$ Y6 \/ p* y% |7 x
  23. MeDCMotor motor_10(10);. m2 q+ D/ f0 Z: `+ N: y# E
  24. unsigned long previousMillis = 0;! T  S0 n0 J" F
  25. const long interval = 1;( [$ z( |5 I. f* W( T! t- Z" J

  26. $ M+ X2 o9 E( c5 }  a0 e8 D
  27. void setup(){( C  {' u+ ~# R% j5 w
  28.     lightsensor_6.dWrite1(1);
    , w, W0 c5 Y: k# {  N
  29.     nPower = 160;
    ; M3 G3 t+ [+ L6 r! `( t6 u0 I
  30.     Error=0;
    2 S; [7 N/ G7 E) ~. F  Z
  31.     ErrorAcc=0;1 K3 L8 [2 |9 G) c  W
  32. }
    * Z1 C, `0 w0 y5 ~7 W0 _& J4 n5 J

  33. ; m  P2 N; I1 t
  34. void loop(){
    * k1 J& r2 u# f7 r
  35.   unsigned long StartTime = millis();
      \3 x0 i# Y$ d1 m% z
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    8 b1 u5 A% v) K+ j
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();9 ^0 i0 P5 e9 n/ x: C  V
  38.     ErrorAcc +=  nError*Kd ;0 ]- _. ~/ B6 O* L& H" R
  39.     ErrorDec -=  nError*Ki ;+ C" o1 H4 Z. X! ~* N
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);7 Y; j3 m" v% [1 Q9 M, E
  41.     if(nError < 80 && nError > -80){6 H- k  |* B- R9 _
  42.       if(nPower < MaxPower){. U$ m7 g  u8 {( E1 _
  43.         nPower += 3;  Y% D6 Z0 P+ J( N: M. X
  44.       }
    & s: }6 E: _  ]* H# p6 k2 l
  45.     } else{9 b# g0 d6 q- I) i9 g5 Q7 W
  46.       if(nPower > MinPower){
    + ~1 L0 x+ x% U* a3 x
  47.         nPower -= 2;4 ?4 L; i1 h% V" d( Q' l& ?' b
  48.       }
    3 ?) A" e5 Q9 F) l5 o, u
  49.     } # E8 K& [3 U) d3 }0 w' ]
  50.     MotoL(nPower-Error);
    - z) G1 q) Z6 X# p, R. F
  51.     MotoR(nPower+Error);   
    $ n5 T  I; x* p) M2 I
  52.   }else{
    * Y, a' l8 N0 _
  53.     motor_9.run(0);
    . b0 W+ p; e% v6 r  u2 F3 Q
  54.     motor_10.run(0);8 y6 h: ^/ X- J2 x* [
  55.   }
    ) r9 j9 L+ z/ @- Z
  56.   do{}while(millis() - StartTime < interval);/ \% ~8 i* w; Z0 T' [
  57. }
    + s+ w2 {! \. f

  58. - \# i' k0 m3 F8 c3 F
  59. void MotoL(int Power){
    4 e- c, I, L6 [
  60.   if (Power > MaxSpeed){" q" v7 V! M9 K9 @0 E3 C
  61.      Power = MaxSpeed;. L& X9 Y  L+ I; \- b+ \
  62.   } ! B4 L5 c7 f" |  l% X
  63.   if (Power < -MaxSpeed){  I) V7 D% Q  I# U
  64.      Power = -MaxSpeed;
    # K$ s& H9 ?/ A/ k, d" ~/ R
  65.   }
    0 g% ^: R1 h# x2 w' a* [
  66.   motor_9.run(Power);3 C$ {% {* K, y8 F* @% a/ `
  67. }  , }9 u3 N+ i( u$ j

  68. 8 O# g2 C$ O/ H$ N
  69. void MotoR(int Power){
    $ }: o* \7 R9 U4 ]7 b7 G4 T* H
  70.   if (Power > MaxSpeed){
    : e( o+ o4 U3 k+ N
  71.      Power = MaxSpeed;. P+ \7 \& {  n. v2 C
  72.   }
    " t0 l5 ]; `3 s' K
  73.   if (Power < -MaxSpeed){! v- o9 ~& v8 b/ P
  74.      Power = -MaxSpeed;
    9 V( Z# S8 `3 |) U1 w/ L; F
  75.   }
    ' y' l  Z) q3 c) k* f4 p' [
  76.   motor_10.run(Power);
    8 _$ J& g! Y+ l: `
  77. }  
複製代碼

  E: T, B* \, U4 J6 I
. p/ d2 Q$ @; `& D% i* b, k
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* G7 }2 s( {' Q( R5 ]
3 w' Y2 ]/ x  y% I8 ], I9 ]1 Q您好,不知是否能向您請教。
& p. f, W- G0 [- ^目前和宋修賢老師在處理Ardui Car: s/ r, o" U& P7 N" X, S' U
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
4 U! f8 R- R5 s% c. A; B! v) G% n% C. a5 ^6 h
但基於想追求更精簡的程式所以還是想請問一下3 J" p8 D$ {) Y$ W- `; V
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝- r6 R# i. @% Q/ o
不知道您是否願意教我可以如何處理
' r9 S) A# k! L9 C  g6 L9 }) G) O
7 Q; p/ j% w( {7 B. o/ L3 Z3 b0 O+ X6 ^# k! V
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    1 x& {1 N7 \7 Y
  2. double CNY70Val = 1000;
    5 n6 K# A" |( |& J# s, J
  3. int interror = 0;
    2 N( L' l& C. S3 @: F
  4. int olderror = 0;
    : b. ]' I: f. w- X6 L/ m
  5. double values;
    : @. R: b* `" t

  6. - S8 O3 s3 Y+ Q& b# r

  7. 2 I/ `* f2 L0 m0 @0 I$ R+ s* m& o
  8. void CNY70()% B2 M9 D* |% R& k4 |
  9. {+ N  I( E: f9 ^! S9 Q* ]/ [( k
  10.   valuesRR = analogRead(RR). g1 g  h% e) ~
  11.   valuesMR = analogRead(MR);
    + N& i: m' I$ ~! {7 u' E1 o7 p
  12.   valuesMM = analogRead(MM);3 A! y' L: y3 Y; @4 F$ O' b7 M' j: D
  13.   valuesML = analogRead(ML);
    , _( o+ x- X9 W2 B4 F
  14.   valuesLL = analogRead(LL);  j1 J* N- h+ x! {% S0 c
  15. # C* i& I, X5 @3 I6 J$ w) u) P
  16.   if (valuesRR > CNY70Val)
    ( N5 z2 b8 X6 B6 C$ ?; q
  17.     valuesRR = CNY70Val;+ j( q! e8 O# V' v- [# ~0 }7 x
  18.   if (valuesMR > CNY70Val)* H1 Q4 X( b6 K
  19.     valuesMR = CNY70Val;2 Q: J/ V  |7 f0 z
  20.   if (valuesMM > CNY70Val)
    9 [7 n: u# h0 y' ~: ^
  21.     valuesMM = CNY70Val;
    2 ?3 w6 w4 ]! y) o% b
  22.   if (valuesML > CNY70Val)# P9 B1 _3 z6 z% O+ }
  23.     valuesML = CNY70Val;9 D$ J. C6 H" ]' j+ h! ~
  24.   if (valuesLL > CNY70Val)
    / j+ E6 L9 I. o* v* E* l
  25.     valuesLL = CNY70Val;( ^$ o# \' s/ ~+ e. A! S" I  g1 v$ V

  26. ; I( s+ z0 _, V. g$ j8 S5 ]7 O' p+ o
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ) q4 v) p( f$ o7 u3 i8 h0 I: m
  28. }; C  K4 A1 T( n2 y1 c
  29. $ G2 U3 v4 G, X
  30. void Car()5 M% Y( C6 D5 w' R2 C& a
  31. {
    # R- _6 d: H1 G$ }
  32.   while (1) {
    0 J) B% N3 ?3 d* b$ w
  33.     CNY70();
    * U6 t7 W- y: c! e7 `
  34. $ n- z& F1 ^" t% s
  35.     int error = ((int)values);
    ! g3 U4 o8 q% x: y* T5 C
  36.     interror += error;; \  K& q# c. d; B
  37.     int lasterror = error - olderror;/ h- ?6 ^( R% L7 _
  38.     olderror = error;
    0 Y; m, b! Q4 `0 {+ x3 q
  39.     int power = error / 5 + interror / 10000 + lasterror;/ u% O0 i: h+ R2 Z: t$ J
  40.   s! M/ v1 ~5 G; E( |/ R
  41.     if (power > MotoSpeed)( t) n9 U3 ^( Y( q: f5 Q& `: P7 a
  42.       power = MotoSpeed;' f1 J, Z; Q2 F5 K
  43.     if (power < -MotoSpeed)
    3 D: b: R$ a/ X7 G2 o% V! E
  44.       power = -MotoSpeed;& i( @) b, w! ?0 t  I5 z3 [

  45. % i' i3 b" |$ _9 n2 H3 {. Z! s2 ^
  46.     if (power > 0)
    8 ^: c0 S0 M% i: ]0 m; U" |
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ' E" ^+ u9 o$ p* f5 B5 O, S
  48.     else' p# e2 e$ X  O  V
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; L& T# w2 B  m: V0 N
  50.   }
    7 x1 h4 d" x" K8 n& V1 V; \9 E! W
  51. }
複製代碼
+ H1 D" F/ ?' F+ t
7 u( [* b" _- J
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-30 15:30 , Processed in 0.036511 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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