圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21684|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    + U: u. b0 R& l$ H. H* o$ }: Z
  2. #include <Wire.h>
    3 O7 K: p: i$ }2 m6 ^% u  q
  3. #include <Servo.h>2 z  ~# _( D% ^
  4. 1 z5 Q0 m* |& b2 E% R+ C
  5. #include "MePort.h"
    . {5 _9 W) D: x
  6. #include "MeUltrasonic.h"
      `5 l+ C9 b4 k) b( H% [  d2 ^
  7. #include "MeDCMotor.h"
    7 x) k' Z0 h6 L% l

  8. . e7 C/ }& \9 i% y/ e
  9. //double Input, Output ;$ S& u7 Z# w* P" r" P$ D
  10. float MaxSpeed = 255;, {* v& S4 R* u$ q6 U
  11. float MaxPower = 180;
    ; _3 u/ E: R: I3 l2 c
  12. float MinPower = 120;
    7 s, Y: r& O2 W
  13. float Error,ErrorAcc,ErrorDec;/ I' F3 y0 }4 W* D6 Q& k0 b
  14. * f, }! z* P4 M, e# n; ?
  15. float Kp=0.14;
    1 C% G& y5 p# i4 D# r
  16. float Kd=0.00020;//23;( q3 g' t( h' T1 j8 G$ g- h! B; i* n
  17. float Ki=0.000201;
    5 l3 o4 f9 b' Y4 Z6 o0 e

  18. - T3 M; }) N" B4 ?4 k) `$ G
  19. float nPower;
    , O7 I* C/ E; g$ h; x- ~: R
  20. MePort lightsensor_6(6);; A; m: w/ a" }0 G( X  ~
  21. MePort lightsensor_8(8);
    ' ^+ R; P- Y" v# [4 \( C
  22. MeDCMotor motor_9(9);
    3 K# j/ T* L9 m" O7 Z! {- {# X1 @
  23. MeDCMotor motor_10(10);) W0 v% ]! V: D& O7 k2 X
  24. unsigned long previousMillis = 0;+ [8 I2 T( e6 A6 d0 o/ Z- F
  25. const long interval = 1;
    * d3 K9 k2 t0 B/ o; }5 {
  26. ) H  p7 _* ^& F9 [1 e  N3 w0 H
  27. void setup(){
    & l+ ?& i- Z( `/ x3 `" b
  28.     lightsensor_6.dWrite1(1);
    % S; i" e: I2 x9 Z  _
  29.     nPower = 160;( t6 b. G: ]$ z" e) G# z
  30.     Error=0;6 |" M- t$ e3 B1 k
  31.     ErrorAcc=0;5 x# s6 k- \5 \% l) h
  32. }) d; W0 ^" R& n: K" H, `- e5 }

  33. ( M& Q2 E( v) [6 K( n
  34. void loop(){
    : M# q+ b, t( ?2 h
  35.   unsigned long StartTime = millis();
    ; S% F7 t' p' ^7 u. ^, m5 x2 o; S
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){. F" E. o* a& [' t; ~: {
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    & J0 V# v2 W0 x6 m1 M
  38.     ErrorAcc +=  nError*Kd ;0 Q; |) y* E7 V3 C, G8 N
  39.     ErrorDec -=  nError*Ki ;
    % ~. \& C: h2 j1 ^. B* y( h7 k8 z
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ( m( n* Z. y+ Q
  41.     if(nError < 80 && nError > -80){
    1 ^3 m5 O7 N5 g/ M. P3 v7 {
  42.       if(nPower < MaxPower){% m2 Z8 ]- s( I8 x
  43.         nPower += 3;
    2 v, \5 ]% H$ S  S. Q+ |+ Q
  44.       }
    " Y* l- u( ^% ?4 K1 a
  45.     } else{
    ) {/ C3 U4 [# U# g* v5 V, P
  46.       if(nPower > MinPower){
      \9 g  Q) j+ |9 t$ O# S. ^! a5 q
  47.         nPower -= 2;
    ! j5 M7 o; J. j
  48.       }( e9 V$ z! @+ O# P, I
  49.     }
    3 [% H! Z$ `2 \" [! o) D) {) C
  50.     MotoL(nPower-Error);/ L: ]; g/ R6 h! I
  51.     MotoR(nPower+Error);   
    : @1 S7 V# I9 [9 c& Y( Q
  52.   }else{0 U+ T* d1 ]! x& b% q5 w1 l% `
  53.     motor_9.run(0);
    3 Z* `+ f/ G) f
  54.     motor_10.run(0);' a8 Q, r: j0 C1 G2 M$ v0 @; g
  55.   }& r+ W) |% u7 K2 `
  56.   do{}while(millis() - StartTime < interval);
    $ g2 m" ~( D- D  H; ^) W8 l
  57. }" [( O5 @1 G. [( C5 P8 |8 L/ G& U' ]
  58. 8 w) ]) L9 v) @( M0 e' L) u% U
  59. void MotoL(int Power){6 H4 V7 J6 [1 O+ D) g# t
  60.   if (Power > MaxSpeed){8 i! ]. k* I7 X7 M
  61.      Power = MaxSpeed;+ W( J3 ?# C8 G" e, e
  62.   } ( g, D5 {' d# @; g
  63.   if (Power < -MaxSpeed){4 @" o' N8 o4 B% _4 V
  64.      Power = -MaxSpeed;% F* Q/ X! f0 V" D) l7 K9 n, x- t
  65.   }
    , \1 F2 a8 {% I$ r! ?, D0 e0 c: E
  66.   motor_9.run(Power);2 m+ d  U7 N) N  P, e! e6 x
  67. }  
    $ r; T) `; g& N3 n
  68. , ?* f# S  E: C
  69. void MotoR(int Power){9 Y# X% U3 h) l* D/ ~5 \! @9 Y/ r
  70.   if (Power > MaxSpeed){
    7 A  L0 l$ x* f6 m
  71.      Power = MaxSpeed;
    + p# I+ l- w- c9 ~( A8 F3 h( n
  72.   }
    / M' z$ g4 u4 P# j8 P
  73.   if (Power < -MaxSpeed){4 _8 Q1 s; x" k. {! c7 `! h
  74.      Power = -MaxSpeed;
    ) j; m2 T7 x  g, {7 S
  75.   } & D( E; \# j6 @: @
  76.   motor_10.run(Power);  X! B& Z2 m; b0 [
  77. }  
複製代碼
' I; X, b- p' r6 Q$ B$ Z% ~  n
7 {, c: V1 C0 p. w8 W
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
% _3 C9 H) e6 Z: U' C
- W2 ~! p" E' l- z5 \您好,不知是否能向您請教。8 U" H* X) J) h- L- L0 D. _! d
目前和宋修賢老師在處理Ardui Car
% Z' _: b' g+ A3 {/ m雖然已使用較繁雜的方式處理了跑出黑線外的狀況, w6 i' {" X0 @- A* H
, g6 s* s& [' Q5 I  P8 n' T8 Z
但基於想追求更精簡的程式所以還是想請問一下
2 o) L$ `+ F4 I7 E# h* C就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
5 e8 l! {( I2 }不知道您是否願意教我可以如何處理" s! l3 ~" V9 {: C3 ^' c% L
0 N3 w! M/ m% [

" s+ d1 @& X* \/ @3 Y6 a) {以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    2 g) b( W0 X. r5 S6 d
  2. double CNY70Val = 1000;8 V+ A( G. K% |/ P1 x  f
  3. int interror = 0;
    8 j( z2 I( ?& p
  4. int olderror = 0;9 C, ^4 ^, H5 {7 ^
  5. double values;( G' ]! P% _5 r  U

  6. / F; ]+ G3 V' V, ]+ Z' x
  7. 5 x5 W) Z: [3 r0 @& S# a
  8. void CNY70()- f2 u. r) R5 L8 y" Z
  9. {: N  A4 N" J. C) K" N! H2 z
  10.   valuesRR = analogRead(RR)
    % P3 y2 T! d  G; |: Q/ r
  11.   valuesMR = analogRead(MR);
    4 {; B) o; G" D  ]9 s
  12.   valuesMM = analogRead(MM);& n  [/ r+ h- f/ l- B" x6 `: x$ b* y
  13.   valuesML = analogRead(ML);8 r$ p0 N6 P7 o' J5 m4 d, \
  14.   valuesLL = analogRead(LL);# q& Z+ @4 f1 w2 S

  15. / V/ }. X  E( |. Q4 }
  16.   if (valuesRR > CNY70Val)
    ; J! ?" ]$ Q* O' X
  17.     valuesRR = CNY70Val;3 w5 J* z& _9 g$ z; a; G1 P4 d
  18.   if (valuesMR > CNY70Val)) @8 b7 U1 c* X) b
  19.     valuesMR = CNY70Val;0 y) o1 h& n( h8 m9 X
  20.   if (valuesMM > CNY70Val)0 o* U$ z* s+ R7 o# H
  21.     valuesMM = CNY70Val;
    8 j  z( H- K4 Y7 N0 S
  22.   if (valuesML > CNY70Val)% N: M' w) m% H, m" B
  23.     valuesML = CNY70Val;
    + N+ k/ z' F" t' Z% U4 X# ]
  24.   if (valuesLL > CNY70Val): p$ u7 L8 s% o3 F6 M
  25.     valuesLL = CNY70Val;( C  S0 D" @. S8 y/ w
  26. . Q6 Q. N& v# }
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    4 U7 t5 [& n* P  z
  28. }
    7 ?' I% O1 s: A4 }

  29. , J+ `  Y3 M2 p% @% d3 ~; B( W
  30. void Car()- C2 {  V7 [  a+ w
  31. {
    9 @  J, _2 h$ y1 F0 V
  32.   while (1) {
    ' e* h0 `0 n  t: b% N
  33.     CNY70();
    . @6 [3 I; _# q9 T/ r! P( D5 s
  34. * W, w/ d# t; w# L, m" L' D% e
  35.     int error = ((int)values);
    + I: t5 X6 p0 u3 O
  36.     interror += error;
    * \( h4 V5 ^7 f5 P+ r/ K
  37.     int lasterror = error - olderror;
    + \# C$ k. [- T; c2 b, a
  38.     olderror = error;; ]. J7 q3 F& H" Z+ e( q* t
  39.     int power = error / 5 + interror / 10000 + lasterror;
    , [! D' U. i8 I4 u5 w
  40. + Y( U5 |  G1 h, a( n" X* A
  41.     if (power > MotoSpeed)  v9 ?5 O! P) V$ Y) P) Z1 D
  42.       power = MotoSpeed;
    5 w* F0 f) z5 Q" \3 {6 t
  43.     if (power < -MotoSpeed)! w* M7 P+ e4 W: L( m, g
  44.       power = -MotoSpeed;! o; o. h7 M6 f: h
  45. 3 f% u7 V* }6 P3 z
  46.     if (power > 0)  e, `" W3 K1 C0 P2 z, L
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。* d, a1 W; E# T, d  L
  48.     else' c  ^- [' Q( k( b8 Z
  49.       Speed(MotoSpeed + power, MotoSpeed);2 P3 z( ?+ q, ]% A9 Y1 Z$ S3 e
  50.   }8 b0 A) K; g: H6 ^' g
  51. }
複製代碼
9 ]& L6 ^4 Y* q8 T4 ^6 }

8 K! l0 `3 \  C) `% x
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-20 18:07 , Processed in 0.027164 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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