圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21801|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    6 {; T; q4 o0 z8 }4 v+ ?) P' P
  2. #include <Wire.h>
    ) S) i# h/ O; n  q
  3. #include <Servo.h>
    " w9 u# S/ {" [/ ^, c% S, `$ B( W

  4. * e, ?$ _# _; r4 G' S
  5. #include "MePort.h"4 h% ?/ x9 e( H, ]  ?
  6. #include "MeUltrasonic.h"/ N$ i  r1 [, t! r- w
  7. #include "MeDCMotor.h"$ {3 T* x, d6 P# {- ~# d6 y
  8. 7 r3 Y6 C8 Q7 R! F9 Q& U, ^- @1 e
  9. //double Input, Output ;9 ~+ M! [3 ]' B0 m; s
  10. float MaxSpeed = 255;5 e; {) R  D& X" f" L
  11. float MaxPower = 180;
    ' H" @1 C) d! s* g# D9 A& h3 T' ?
  12. float MinPower = 120;
    : P1 z% j5 v. V& O4 t
  13. float Error,ErrorAcc,ErrorDec;5 d, ~7 N8 X; Y" G  Z# d3 q
  14. ) j3 t& }/ e& b7 C
  15. float Kp=0.14;# K5 d: k' ~+ `4 K$ }8 e0 n
  16. float Kd=0.00020;//23;  F- \* t3 p7 _6 d- e
  17. float Ki=0.000201;* l0 u( x+ t/ ^  D# V3 T

  18. ) ]7 C* i6 Y2 e
  19. float nPower;
    . o5 Z" `# M5 z1 @" @8 H
  20. MePort lightsensor_6(6);. k/ x! T$ {! ^3 G
  21. MePort lightsensor_8(8);: a: G+ x  B& Z" U* }
  22. MeDCMotor motor_9(9);
    9 D1 L8 [( W- E# {, L9 X
  23. MeDCMotor motor_10(10);
    2 D; G6 ]3 h  Q
  24. unsigned long previousMillis = 0;1 @( @2 R0 g. V$ X: D  G
  25. const long interval = 1;/ x/ j( m+ K% A
  26. $ K; h$ U" I; [# V0 }  S2 q
  27. void setup(){  R, o, L( q' v' ~( m
  28.     lightsensor_6.dWrite1(1);
    + j4 o9 K" p: ^& G1 M% {6 B& T$ \
  29.     nPower = 160;, |- W+ F. o) H; L' ?
  30.     Error=0;# s  I3 ^" e3 q. c6 U/ k
  31.     ErrorAcc=0;1 i2 j0 k0 n3 H$ b1 s
  32. }) a4 h6 _( {. _1 U5 A7 r8 N3 _
  33. * L. g" E& \: f* r! M8 X
  34. void loop(){! o1 t9 d2 H2 ?# z  {4 O
  35.   unsigned long StartTime = millis();
    ! a# m# W' U# x- y. S  I6 n
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){9 i0 `2 V+ g' W9 k" ~
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    % t! K% z1 M" D# r4 y* ?9 W
  38.     ErrorAcc +=  nError*Kd ;
    7 l- {4 i, j2 e5 S9 ~
  39.     ErrorDec -=  nError*Ki ;
    ( V2 r" ]8 ?! h- c3 O0 Z
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    * D: R+ D6 d) ^8 E+ P6 I9 X- X9 y1 ?
  41.     if(nError < 80 && nError > -80){
    0 @5 f9 X1 C; _) K1 w! A" x* p
  42.       if(nPower < MaxPower){* {# q( K7 _/ u1 A3 y( l
  43.         nPower += 3;% W3 |. i0 O% Q3 s/ s
  44.       }! A; G$ ^  ?+ x
  45.     } else{- p5 T: l9 C" O. q
  46.       if(nPower > MinPower){( G1 r! U) m, [4 Z$ Q, a
  47.         nPower -= 2;0 Z: \' ?9 w. I$ g; ]7 W
  48.       }: |1 g6 U3 o+ A: a, ^% P
  49.     }
    % O" {/ T  h+ X. |
  50.     MotoL(nPower-Error);
      D; c, ]; S: t. E% m
  51.     MotoR(nPower+Error);    . u, p# O( B0 ?
  52.   }else{- d3 n3 Z6 v5 {4 w
  53.     motor_9.run(0);% y4 S: r6 }+ o6 Q9 D9 S
  54.     motor_10.run(0);0 A* s. O, l2 @2 H
  55.   }2 e; D" e2 K9 U( h
  56.   do{}while(millis() - StartTime < interval);
    ' c- R2 q% Z' M' [& |% A$ E0 T
  57. }
    2 V% m. r. o: q+ k

  58.   I: ], e- b; z! s& M
  59. void MotoL(int Power){
    : l: v: f3 G$ p* I+ n- ^. F: t; e
  60.   if (Power > MaxSpeed){+ C" D/ _# M0 c, [. q. Y
  61.      Power = MaxSpeed;
    5 C; f  y( ]6 G3 h
  62.   }
    0 W* d$ [0 V7 d3 I+ ~! C" n: U
  63.   if (Power < -MaxSpeed){& J- |+ o- g3 x; ]: j4 ]- O7 z
  64.      Power = -MaxSpeed;
    ( }  p: c4 j% t' Q0 C
  65.   }
    . y, U9 R1 K' G2 M
  66.   motor_9.run(Power);
    ; S# y; \8 E  L; z0 t' s
  67. }  ( R* Z! a9 ]2 e$ l# j8 Y
  68. 4 r' I9 a! T6 u& ^! M/ u& R' R
  69. void MotoR(int Power){: E  p% ~6 w7 w" @, }
  70.   if (Power > MaxSpeed){* w  u6 a. X1 L* {( m5 a9 q1 p2 D
  71.      Power = MaxSpeed;
    ! |! v: T/ g9 a, ^* g; I$ u
  72.   } ' B# u. z3 C1 K# ?0 U
  73.   if (Power < -MaxSpeed){
    / u3 g4 {- d6 V9 l+ k& {& u5 U
  74.      Power = -MaxSpeed;
      F+ \# K. O& I+ [3 g
  75.   } 2 n; T( }8 f& j* [' L5 O8 @, o# S+ v
  76.   motor_10.run(Power);6 _, F! i3 @2 y1 E
  77. }  
複製代碼

. o9 i, ^+ `+ I/ |
( x: S) @& R7 F9 J
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ s- X4 Z# t8 k* I# B
0 ~! c2 w3 T0 i% {. E3 Q, `您好,不知是否能向您請教。
7 ^5 Q9 U$ I9 B  |" X+ F1 P目前和宋修賢老師在處理Ardui Car
* X: t/ Z, w. E雖然已使用較繁雜的方式處理了跑出黑線外的狀況% D, D: e1 P+ Y, d( X: e" b

* ^' X9 S' C  W+ h  j# a! d% S但基於想追求更精簡的程式所以還是想請問一下
' j& R, S& |6 |8 f! |% w就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
! A( H8 z$ E8 G1 O7 w  f1 C不知道您是否願意教我可以如何處理: m8 L/ e" A; @) u, k! \3 P
8 y7 o' M* m7 M1 a, V
( ?6 V) n5 {! z# U1 ]
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;+ F8 t  g, j7 r- y  ?8 ~: A- V- j
  2. double CNY70Val = 1000;
    + O, j0 X& O: s; D0 z8 N" R6 k' E1 J
  3. int interror = 0;; u  Q: T, H, i) X
  4. int olderror = 0;8 r2 k, k4 q6 A# W
  5. double values;
    # C1 w  @/ S, y
  6. / I) T: B: ~- k4 I6 {
  7. ! D* ^" E1 N9 F' z% \
  8. void CNY70()
    5 h, `) F, U7 ]* |* b! B+ A( y  h
  9. {) P4 O9 j6 p; y; z# a  T2 x
  10.   valuesRR = analogRead(RR)0 l$ ]: s* M' ?" l
  11.   valuesMR = analogRead(MR);
    $ i4 x/ c- X8 Y0 \! r
  12.   valuesMM = analogRead(MM);
    9 z1 K  ^! w7 r0 G& L# K
  13.   valuesML = analogRead(ML);+ l1 \; m2 F9 ]: @% |7 E, v
  14.   valuesLL = analogRead(LL);3 W# _4 A3 c! P& m" u- a
  15. 2 I4 G# I# a% `6 ]7 [# I
  16.   if (valuesRR > CNY70Val)" |8 R7 O6 w3 n, Z
  17.     valuesRR = CNY70Val;
    8 b+ t# Y' o$ B0 L" i
  18.   if (valuesMR > CNY70Val)1 t2 z8 {& }4 d& ~0 j  ?
  19.     valuesMR = CNY70Val;3 ]( b3 T( u9 P. j( k7 ]( x5 W0 `
  20.   if (valuesMM > CNY70Val)
    0 I! z# A, H" k; O& a$ H4 s( Y
  21.     valuesMM = CNY70Val;
    # ^* a- J: [9 \  N, W, i! \
  22.   if (valuesML > CNY70Val)  [+ `- P7 F; b
  23.     valuesML = CNY70Val;7 r, \, F6 @& e# W7 z
  24.   if (valuesLL > CNY70Val)
    ; r: l0 ^- y4 [* b, \+ ?
  25.     valuesLL = CNY70Val;
    3 r3 Q4 l- Q7 a8 V7 `0 h
  26. 5 a! A) T, \( x! y
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;* N4 i8 n# _) ~; h0 r
  28. }+ z# B0 c; Q1 X5 D
  29. / i1 x3 A4 i( f5 @8 u
  30. void Car()0 m- J; m! x& _: U  i. W4 S" x  T
  31. {( l7 y8 S* g: O2 _+ _# ], q
  32.   while (1) {
      [8 v( y+ x! P$ r% _. N( M
  33.     CNY70();
    ! @: o* y' Z, n( D, P& ]( O0 v

  34. . t4 H- r9 P6 t: h" ^" M/ A
  35.     int error = ((int)values);
    * {5 h  [* @$ U8 m
  36.     interror += error;
    , |4 d# Y+ ^6 `$ m7 f( i, V
  37.     int lasterror = error - olderror;" Z; N4 M! C0 t# @- ^) C
  38.     olderror = error;
    8 l0 E  I7 {2 U  d- y) [. |
  39.     int power = error / 5 + interror / 10000 + lasterror;
    3 w1 P2 J0 P5 N8 C2 [7 M6 l

  40. : \; T- o: f4 w* F7 A( f" L9 H
  41.     if (power > MotoSpeed)% Z& j1 f3 }4 w  @" k' M
  42.       power = MotoSpeed;
      r- Y7 j2 }- h
  43.     if (power < -MotoSpeed)% g& t/ }2 K0 [* I5 Y1 {
  44.       power = -MotoSpeed;; A0 l9 w, L) k; y' ~
  45. 1 T: ]' W! T% g9 s
  46.     if (power > 0)& _: m1 f$ h& h" ?/ U, \
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。( ?8 l$ [, o: R6 N
  48.     else! R6 h9 o3 f- r$ f. {7 k9 t
  49.       Speed(MotoSpeed + power, MotoSpeed);) Q  M" b2 w0 U
  50.   }% |) l6 G  q" A. z' k- ~3 ?6 Z4 t& v
  51. }
複製代碼
& ?: y# }, V8 |1 @

) u1 t9 |1 H* ?4 o" g
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-1 22:57 , Processed in 0.025360 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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