圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21706|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h># y& @3 Z& V& j2 H$ N" [' I
  2. #include <Wire.h>
    % h  W8 r4 A: {5 y0 k! w4 z1 \
  3. #include <Servo.h>8 P/ R3 W4 S8 z/ p% G' D# l6 _
  4. : w2 s( t! i' O# H0 X2 q: m7 e
  5. #include "MePort.h"
    ( O# k+ i$ r8 ~0 |4 {4 r- @( s
  6. #include "MeUltrasonic.h"
      j0 c" i1 r% R% j8 e
  7. #include "MeDCMotor.h"
    + x* N, [& S% v3 Q
  8. - z$ W7 o2 }+ N% M! Q
  9. //double Input, Output ;
    8 ~  \4 T1 u4 C- y* n9 b
  10. float MaxSpeed = 255;
    2 s& Z* V- c$ }# T8 |
  11. float MaxPower = 180;8 k$ ~4 d+ y! _2 x- @$ B
  12. float MinPower = 120;& U; e7 }+ f; {: R8 G0 U. W
  13. float Error,ErrorAcc,ErrorDec;
    ) y2 k+ a* u/ N
  14. 8 j9 G- i! C3 R
  15. float Kp=0.14;
    ) h9 g& G/ h. C% v" s$ K$ K
  16. float Kd=0.00020;//23;
    8 Y9 |* x$ F) P4 a0 }& ]1 I" H1 v
  17. float Ki=0.000201;. N8 t( F9 G( q# q1 _! [% o

  18. ! `8 Y" ~: i* n& J, V# E6 L
  19. float nPower;% e6 r: u" y! B7 o8 v
  20. MePort lightsensor_6(6);& g- t" c" O9 h; B8 k9 P$ I& f2 O0 d0 d2 i
  21. MePort lightsensor_8(8);
    ) }/ X3 l5 {+ I" q
  22. MeDCMotor motor_9(9);" J; y( |! J, s4 ~
  23. MeDCMotor motor_10(10);
    # T5 U0 g; J+ _$ o
  24. unsigned long previousMillis = 0;
    * l" v: [& g$ D& O* I4 z
  25. const long interval = 1;
    ; R8 E; y8 ^3 }- \/ y' r; Y, E

  26. . d- m9 i& O* v& j" ]
  27. void setup(){
    ) G3 V4 W" W6 E
  28.     lightsensor_6.dWrite1(1);: c2 l3 `9 U9 X+ h6 Y" @# M- }
  29.     nPower = 160;
    9 n. D% L2 H4 Y0 w
  30.     Error=0;
    1 H* T  y. F  u; L- D
  31.     ErrorAcc=0;
    ' N7 t2 `. A  N# ]+ m6 J
  32. }
    / m$ |* C3 t% i- M1 A- ^0 j

  33. ! _2 e1 b% E1 Y8 q) t: A% Y' V! z6 V
  34. void loop(){. j2 C( ~; }0 c
  35.   unsigned long StartTime = millis();
    - V# u3 g$ r; w. e5 k
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    + {3 v1 h, }' m, J! I  R% V" Q) _
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();8 J5 k+ c% A5 E" g
  38.     ErrorAcc +=  nError*Kd ;
    . s6 `4 l1 C! {3 B7 i
  39.     ErrorDec -=  nError*Ki ;
    ) C+ [* i5 H2 C9 L
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);) A3 _, T: i; a2 h
  41.     if(nError < 80 && nError > -80){
    : r/ M* t$ W* e* _9 Q
  42.       if(nPower < MaxPower){, U: O, l% B. V7 k! i. Q6 b
  43.         nPower += 3;0 ]5 H- H: o! Y, V4 o- w. Z# l
  44.       }# K. E" j& U- e  G
  45.     } else{
    * a# O: O/ q( D5 C5 Y
  46.       if(nPower > MinPower){. a3 [, H8 S& u1 r
  47.         nPower -= 2;
    * f8 }0 X) i4 f+ m
  48.       }
    6 W" U+ M4 @. W7 r, X% a4 ]6 D
  49.     } 3 `) {* J: b+ Y3 U
  50.     MotoL(nPower-Error);
    + t% E$ `/ a& j. b+ j  B3 _9 b: \
  51.     MotoR(nPower+Error);   
    2 c8 I# Y! \% P; V
  52.   }else{) m, g2 d) m7 h+ j
  53.     motor_9.run(0);. a* G0 A) m7 o& K
  54.     motor_10.run(0);* y' r+ w6 {# l1 u) \5 b1 Y) d+ @
  55.   }) e8 G/ }  E7 P4 W
  56.   do{}while(millis() - StartTime < interval);
    , W3 o5 l# o% g% S
  57. }
    6 e) T. j- ^: l2 f; V3 h$ ?7 n

  58. + c, G3 W9 J- _0 ^( O
  59. void MotoL(int Power){% g% E+ {  ^2 F
  60.   if (Power > MaxSpeed){
    - e; Q3 L0 ^$ U9 H7 I0 J( @7 w) D  k
  61.      Power = MaxSpeed;" E% l, v* I/ w
  62.   }
    . _( O' g# Y9 n' I/ ]
  63.   if (Power < -MaxSpeed){0 o! k/ M( r8 h+ B
  64.      Power = -MaxSpeed;. {+ m9 `# U6 r* Y- G
  65.   }
    6 l. L) \# n# c% F) t+ z+ V: r" E
  66.   motor_9.run(Power);3 e* K* Z& b9 s+ a' [$ \& u
  67. }  ( q- i) |$ v! N+ b( |

  68. 1 j3 y/ ?' K( J& m
  69. void MotoR(int Power){% i" |1 e, W  t6 h' k" P0 u8 _6 s
  70.   if (Power > MaxSpeed){
    * X; e$ o) ^' Y" k
  71.      Power = MaxSpeed;4 l8 I- E$ @6 i, k( W1 E( |
  72.   }
    , N- D: `) [! E5 _( b' P
  73.   if (Power < -MaxSpeed){
    0 Q3 l$ @, N7 L; v2 m! e% Y* ^
  74.      Power = -MaxSpeed;8 m( @1 e1 `' m
  75.   }
    6 q" `8 A% q8 P9 a# v4 A& g: S
  76.   motor_10.run(Power);
    : j) H4 S  S) y* Z- f2 ^4 h/ q
  77. }  
複製代碼

; z, a5 i3 [, f7 h! ?( Y9 R/ N. p( Z4 }: v0 [
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯   G0 b1 I1 a4 y4 ~1 T6 S

; y9 q/ o! l$ z' I" Y3 i  M% [$ e6 V您好,不知是否能向您請教。/ E' V6 C7 F5 [& c6 n; D0 M
目前和宋修賢老師在處理Ardui Car
* E  }" @& S  ]0 W' t1 K! _* x雖然已使用較繁雜的方式處理了跑出黑線外的狀況
5 }1 }, q; |5 H, g" v: ?0 ~7 I
: ~+ U5 `8 K' i但基於想追求更精簡的程式所以還是想請問一下
( I8 ]9 ?) D) k0 H. A4 ~就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝2 U  A6 M2 L( ?% u' R
不知道您是否願意教我可以如何處理% Q. _7 I) d. F5 H9 G/ U
, y. y: D- F' k; i4 W' Z

& T; r, x" A. h, _% r; l以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;8 q7 f# v9 f. r2 X' V2 \% N$ V
  2. double CNY70Val = 1000;4 T6 C6 J7 o! o$ o) L( t) T  I4 U
  3. int interror = 0;
    2 x- t4 a; y% C5 ]! ?* Z  h* t
  4. int olderror = 0;) {7 a0 a. C2 y3 d/ |7 k
  5. double values;. [2 ^+ D' L, R  y

  6. ) Z7 Z$ p7 f: W6 I5 g) K8 X* a! d* Q

  7. - S1 ]4 p; N  t& Z
  8. void CNY70()4 z( i7 j6 N" \
  9. {9 V! o! s  ^( m) L
  10.   valuesRR = analogRead(RR)  Y+ z, C7 v% u( ~1 N, f
  11.   valuesMR = analogRead(MR);2 Q* z# D0 C! q% d. ~
  12.   valuesMM = analogRead(MM);
    * U  R9 i8 R2 i2 r# z& L( \( k
  13.   valuesML = analogRead(ML);
    1 j9 e1 v- A" b
  14.   valuesLL = analogRead(LL);
    # q2 ^7 M0 O& {. ^- y! e1 G5 {3 G, h

  15. 0 E3 _6 [4 B' N6 d0 M
  16.   if (valuesRR > CNY70Val)
    0 D' P& u6 o4 i
  17.     valuesRR = CNY70Val;' k) O' l4 t* {7 v' R
  18.   if (valuesMR > CNY70Val)
    7 i% z0 q: [9 q1 p$ V
  19.     valuesMR = CNY70Val;% `8 c( b: e( A  h8 R$ m" {3 j
  20.   if (valuesMM > CNY70Val)' r$ ~4 X- R1 N3 C
  21.     valuesMM = CNY70Val;
    2 D; ~8 Q; U1 t+ I; ^
  22.   if (valuesML > CNY70Val)
      E: R7 |' A8 y: q
  23.     valuesML = CNY70Val;
    ; X7 X: u8 d9 E
  24.   if (valuesLL > CNY70Val). y( _0 t# o2 ]8 u3 `/ |1 ^  g2 q# x
  25.     valuesLL = CNY70Val;
    ; F6 ?4 @: i" s8 R

  26. . O8 Q( a( P' T4 u. C- G& p
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ' v: T0 @. |1 T: Z; Q
  28. }
    ' `- o3 H2 U+ x( R3 j: u
  29. " Y& D1 H' z$ Z! H5 L- |
  30. void Car()
    " A+ u" @& c2 s
  31. {
    ! U+ H% i! x' J/ k
  32.   while (1) {
    * I8 s/ O' i9 X, b) q) u: ~
  33.     CNY70();
      {  E- r0 p( Q# ]! \: c1 g3 _

  34. : ~- `0 g' B0 O$ `: X" p  g
  35.     int error = ((int)values);
    : c0 I! ]  G+ r+ s! y) X
  36.     interror += error;  {; T3 L! j( Z' `2 ]% H/ }' e
  37.     int lasterror = error - olderror;- b7 M/ e( D3 a4 n2 E$ w% e7 |' n
  38.     olderror = error;% ~( a  t0 B* Z) `  X# _: }
  39.     int power = error / 5 + interror / 10000 + lasterror;5 E# }  Q. z* r* |5 w9 V* v

  40. & a' u- N9 F  Q5 e
  41.     if (power > MotoSpeed)  A  ?% X+ A' T- N8 W2 g/ w0 i1 l
  42.       power = MotoSpeed;2 N# |% f5 H5 |
  43.     if (power < -MotoSpeed)
    $ A1 _8 m; t. I- x+ U* t! y
  44.       power = -MotoSpeed;# ?2 c# Y( G0 j  e* M
  45. ) T6 S8 d6 O$ e. u5 t9 _8 G
  46.     if (power > 0)' s' `0 m+ `" O- d, n. q+ f
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。1 ?* j( U; |8 k$ c; B7 `2 H
  48.     else
    5 a& |1 l& q5 ^* R5 t# o8 E& b7 A
  49.       Speed(MotoSpeed + power, MotoSpeed);: i* W, c8 H$ ^6 I# b/ ^
  50.   }
    7 a' G+ P0 q- N" b
  51. }
複製代碼

) h; {2 Y$ A. z  K& Y
6 u3 @! k3 t% s9 A3 }
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-24 22:36 , Processed in 0.023183 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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