圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21709|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    # b$ T" D% }+ T0 v' r4 O- i
  2. #include <Wire.h>& s# ^' M1 N/ B+ S5 v% M& X0 u) }9 M
  3. #include <Servo.h>" C8 k& }6 \* y: {
  4. 8 x4 q9 e6 T# ^7 x
  5. #include "MePort.h"& h  x/ q. q2 b8 L
  6. #include "MeUltrasonic.h"
    3 v9 y% z$ V0 Y" j6 S/ a
  7. #include "MeDCMotor.h"- z' Z' B% p4 C* U

  8. 6 i0 u- H) R# A, l
  9. //double Input, Output ;/ w* b  W8 ^+ H9 B
  10. float MaxSpeed = 255;* a8 Q; G/ e) `9 c2 m
  11. float MaxPower = 180;
    0 {6 L& V1 v8 ~* ^
  12. float MinPower = 120;8 d' @$ X9 n. q; [2 y* x( F; ^
  13. float Error,ErrorAcc,ErrorDec;+ a0 C6 b6 \' M7 n: B4 Q) w8 b) |

  14. & f8 i9 [. p$ y
  15. float Kp=0.14;& ?) v- m" z+ Z: }7 W
  16. float Kd=0.00020;//23;6 ?* ]) ^% a; [
  17. float Ki=0.000201;2 g* V4 {7 ^& j' k* m6 s0 h& E
  18.   o8 X  W+ b# A. M- g% r& U
  19. float nPower;
    , G& B( C- B/ j! d- [  d
  20. MePort lightsensor_6(6);! S1 [0 W% z0 J- C3 u2 n/ q6 K
  21. MePort lightsensor_8(8);9 q. z9 f1 E- E3 U" \
  22. MeDCMotor motor_9(9);, q# l, {3 Y. [9 P) |5 Q6 g2 Q" J7 A( f+ ^
  23. MeDCMotor motor_10(10);  W- ?7 R5 f% ~* q
  24. unsigned long previousMillis = 0;
    ' ]4 s7 W( `# [! ^. {
  25. const long interval = 1;
    9 x$ Y+ @8 ]# [' r; v8 |

  26. " _" d& u7 p0 y4 l
  27. void setup(){8 d& A0 w1 e! |5 n2 Z% ^
  28.     lightsensor_6.dWrite1(1);
    , A7 U$ h9 x  i" w
  29.     nPower = 160;! |. c7 D2 l2 o$ N: q
  30.     Error=0;
    + N5 l/ \- k3 K2 ~; j' }
  31.     ErrorAcc=0;
    7 L1 }0 c. L* A6 o) B! ^; S% x- e
  32. }
    ! O$ s' o! d( ?# L" @
  33. 7 m! K6 }4 V! F$ e9 P7 l0 |6 }7 [- x
  34. void loop(){
    $ [3 n. Y5 E/ N
  35.   unsigned long StartTime = millis();
    $ h" J2 P; E1 o9 {0 r+ s
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    , P2 B( x5 u' N( p1 y3 h
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    - N4 w( N1 \4 H: J9 ~
  38.     ErrorAcc +=  nError*Kd ;4 T, m: C" ]' P1 j
  39.     ErrorDec -=  nError*Ki ;
    " [% n( r; o8 t; `. Y: Y
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);6 ?& T5 Q+ g0 I5 I
  41.     if(nError < 80 && nError > -80){; w- D" O; l8 z
  42.       if(nPower < MaxPower){9 `9 \& E' t3 U8 i0 R9 L& H2 c" V
  43.         nPower += 3;" B; K2 J$ n% r6 W
  44.       }
    / v- c2 u. j# K* P6 F$ a  p; u
  45.     } else{
    6 `' R+ \( k. x. y$ ]5 S
  46.       if(nPower > MinPower){
    ' B/ p9 `) ^$ i* w+ G- e' u
  47.         nPower -= 2;6 X; D. s4 j* g: L  f( i
  48.       }5 R' c5 P3 h& q! q& c' ~6 |# C) r
  49.     } 2 d" O5 @0 n0 _# O. t
  50.     MotoL(nPower-Error);
    & V2 c$ X6 n5 u
  51.     MotoR(nPower+Error);   
    % G5 A* C; R1 S4 p, b9 h9 \
  52.   }else{
    . o  e4 ]- p3 N* W7 c
  53.     motor_9.run(0);/ Z! S+ d) G, I' K  q4 n$ L
  54.     motor_10.run(0);0 r5 U+ d3 J1 z3 m, Z
  55.   }5 M) m" e; r4 E7 E% K0 D
  56.   do{}while(millis() - StartTime < interval);
    2 K- N0 K  j  k( i6 V
  57. }
    9 d5 @: p" _0 G* R9 _/ R

  58. # ~; y" v+ L9 O% c+ N* v
  59. void MotoL(int Power){- ^9 G, w' p& O
  60.   if (Power > MaxSpeed){; R: N! H1 A. U- y) V* |
  61.      Power = MaxSpeed;
    ' F  I; u- {3 B" Q" L
  62.   }
    4 y& c( S1 ]0 x. s
  63.   if (Power < -MaxSpeed){
    " |; X: N* Y- a  m$ }: C0 ]$ A- U
  64.      Power = -MaxSpeed;
    , Z; o& O1 w' M/ t8 S3 h  T
  65.   }
    " O# @* l# ^( g/ a
  66.   motor_9.run(Power);
    4 l6 c' ?1 \' Y0 |" }) g
  67. }  
    ! J; r; A* k* O: F- l7 @) [
  68. 4 U9 d3 [. [  t4 d: C, P& _2 {
  69. void MotoR(int Power){/ J( Q6 ~; C4 u/ C, B1 W
  70.   if (Power > MaxSpeed){% f9 h; ]: ]4 B9 x+ k4 n' s
  71.      Power = MaxSpeed;6 z2 [+ [* s% G& J
  72.   }
    ( v. V  P+ E! Z# T  G: h" j
  73.   if (Power < -MaxSpeed){1 z* c. I2 p. d" Y- G
  74.      Power = -MaxSpeed;
    # @* O! J' ~7 e
  75.   } + C9 q" C) E1 `1 s8 E" Q( f
  76.   motor_10.run(Power);
    : i& a) y/ ]7 |3 r7 @3 F3 L9 K4 I
  77. }  
複製代碼
3 O* J( h1 t) H7 e: D( V' \! L, G

7 R# J( a. U7 J, ]) |  t* W" m
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 7 ]7 o7 H/ a" E: J! [4 f( m
' m8 I# T( u7 n, s  B. a5 Q
您好,不知是否能向您請教。2 e4 \$ m- s% x8 h7 h  Z) _7 F2 Q
目前和宋修賢老師在處理Ardui Car" ]3 r4 e) b5 {" a( }, C# m
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
5 @: C) ]$ K6 w- J  P9 l* X
% ?1 e9 |2 U( e4 D6 r8 Z但基於想追求更精簡的程式所以還是想請問一下( ^7 p+ C3 l! Z6 h9 P; g/ }$ c2 N
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝$ A8 x1 e7 u3 I. v
不知道您是否願意教我可以如何處理
$ n1 A( ], R. P0 R. W
0 {: B" ?: e  p# R( P% l4 ?9 U) P- X
6 ]2 x) }: V1 M# `7 T以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;8 ], r2 ^3 u/ s) m' P
  2. double CNY70Val = 1000;- N  B/ O& J& P- H* h
  3. int interror = 0;: p4 |, o8 a2 w
  4. int olderror = 0;
    ! {2 _+ ~% U" A$ q( c
  5. double values;
    / e8 d' r9 O1 U! v( u+ W1 T
  6. : _: Z% [- L1 ~& z5 @0 s

  7. * v. a2 W% }% k  S, G" p- e
  8. void CNY70()# Q$ W2 [! @* z$ c- n' f
  9. {
    . c" R( K1 D7 D7 u
  10.   valuesRR = analogRead(RR)% Y& `2 \# [! q+ N$ Q% n
  11.   valuesMR = analogRead(MR);. H) f0 {) }* N! b2 O5 b; O4 q; T
  12.   valuesMM = analogRead(MM);/ q9 g, J) G- S4 M5 z, W' m
  13.   valuesML = analogRead(ML);7 y  y$ I2 p% J$ M7 a" i) C
  14.   valuesLL = analogRead(LL);
    & D8 S- E7 Q. J0 {* E# [( J

  15. ) O0 t6 o6 a+ ]0 E7 T  e- p
  16.   if (valuesRR > CNY70Val)( n' ~( b( z6 n# D
  17.     valuesRR = CNY70Val;
    " ]& C. J* u% P+ _! j2 m( r
  18.   if (valuesMR > CNY70Val)$ s4 h" j! [2 U
  19.     valuesMR = CNY70Val;! {6 V+ }- S3 l5 Q: B7 w( c
  20.   if (valuesMM > CNY70Val)- d' s7 N9 a; {) Q2 s
  21.     valuesMM = CNY70Val;
    " v1 Y0 W8 d, K- p  a( b2 r" p
  22.   if (valuesML > CNY70Val)
    1 t! g) n2 t  }/ F0 J+ z
  23.     valuesML = CNY70Val;
    ( a' b4 |* y/ q5 c8 s3 U
  24.   if (valuesLL > CNY70Val)) J5 Q# p, c2 g  ?
  25.     valuesLL = CNY70Val;
    4 q7 o' _8 ~# d4 \) a+ L. Y
  26. 8 J# r8 X7 V) z" ^( t3 S8 {
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ; ]! z) r8 W6 w
  28. }
    $ j$ O- q  u* M* s6 _' z# P6 X
  29. 1 j9 P& I  @! E9 m' f6 n* x! B
  30. void Car()5 N+ ]6 G3 N6 ^, C0 Z8 Y
  31. {0 _6 W" y/ [; G' ?( A8 f2 a' W
  32.   while (1) {1 t" \7 m+ A. P% i4 C; S
  33.     CNY70();
    6 V- y. f9 y6 M; Q% X
  34. 0 N5 ~5 I: L# @4 N) }% @
  35.     int error = ((int)values);, @: d6 x6 b$ b/ G7 y4 P9 k& f# w
  36.     interror += error;
    8 U& P) E$ |# `( v$ q. e
  37.     int lasterror = error - olderror;
    8 U0 F- r. [2 h/ b3 f! Y( u. c# O
  38.     olderror = error;
    . C- H- ?6 x' ^. H, Z
  39.     int power = error / 5 + interror / 10000 + lasterror;  r3 e: H5 M& T; y  l/ ~: ~

  40. . b5 |5 i( J( ~* d5 P
  41.     if (power > MotoSpeed)
    & U. a4 S4 ~( W+ H" v
  42.       power = MotoSpeed;
    & Y( C( c4 z$ m2 [% o8 @  D& f4 C% H
  43.     if (power < -MotoSpeed)1 K" i' n. E. H, w
  44.       power = -MotoSpeed;3 x# f7 b. J  h/ C+ @

  45. % T7 @! R3 \# u. y; z8 |! a
  46.     if (power > 0)$ s0 `' w# n' b( G7 y4 ]/ e
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
      K. i! s$ h2 ]9 F% v' D
  48.     else5 u5 t- Q, m% r2 [; e( C. T; w
  49.       Speed(MotoSpeed + power, MotoSpeed);, U: E0 h7 ^2 R0 ?1 i. D
  50.   }' g6 _9 Z& N2 N! o' D  p* Y: A
  51. }
複製代碼

5 t- h  z$ }0 }1 n2 M8 ~* F9 s/ N% ?; @; O. H
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-25 15:32 , Processed in 0.024465 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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