圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21735|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    : j. l' A0 W7 {  _
  2. #include <Wire.h>+ q1 Q+ w" Z" F* d5 Z7 l
  3. #include <Servo.h>
    ' b/ v1 J- h8 V0 t# d4 q2 Y8 u, ~  y
  4. + h6 l2 R) p" s! W# T) d5 `( @8 m
  5. #include "MePort.h"
    # L9 \# e( i8 u, d
  6. #include "MeUltrasonic.h"
    ( m! n( Y9 g3 c$ D4 i2 K( c
  7. #include "MeDCMotor.h"( ~! a0 c0 e5 D1 V$ u5 F
  8. ; B+ n- U& K# L- d4 o. u8 _
  9. //double Input, Output ;
    - ]' Y  m# {/ C7 @: D0 w! O
  10. float MaxSpeed = 255;' c7 Y$ d2 M# Q2 d- s  p7 _
  11. float MaxPower = 180;
    2 L5 Q3 r" T) d+ |0 B* n
  12. float MinPower = 120;( X6 a3 C- m6 d7 J1 n
  13. float Error,ErrorAcc,ErrorDec;
    $ E- v# D2 q3 X6 \& k, M# }0 W7 B
  14.   a5 i4 B* N7 i
  15. float Kp=0.14;
    8 M& v- j% i* C! k/ r! N
  16. float Kd=0.00020;//23;- e' P5 `' E! w0 f# l  i: K
  17. float Ki=0.000201;
    ! \. N; O- \/ [
  18. % A9 N! I! u+ B2 ?+ q' ]
  19. float nPower;
    : W  Q$ O2 ~" b9 {( g
  20. MePort lightsensor_6(6);5 v+ g* r, n7 W! l% \; H- I
  21. MePort lightsensor_8(8);& w2 _: F0 m* W
  22. MeDCMotor motor_9(9);5 Z0 s2 Q$ X. z( r
  23. MeDCMotor motor_10(10);
    $ m& C- D% M9 @* m9 Y! M
  24. unsigned long previousMillis = 0;
    / f! ^7 X  j  r1 C
  25. const long interval = 1;
    ' P5 G0 _4 j: O. \; f3 k, r/ M
  26. ( j2 t9 U  G2 K6 U- `( N
  27. void setup(){: ~& F/ r$ s7 T# g" j0 f
  28.     lightsensor_6.dWrite1(1);2 i8 O4 T$ |* N5 g
  29.     nPower = 160;; }( M4 L; q* N- T( J  X
  30.     Error=0;0 i  ?4 H! G- k5 x5 W. T# L% l
  31.     ErrorAcc=0;
    " ~  K1 `" N" o; @5 H
  32. }8 s4 C. a5 g+ S3 r8 S

  33. 6 j+ @9 N: N1 o% `2 w# _! F
  34. void loop(){- k1 C8 r) x" }9 R6 ^
  35.   unsigned long StartTime = millis();
    5 c8 ^; H+ @  R4 M; |5 e
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){$ Z! [- u" r9 E, p% Y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();4 U7 j' n) v  w. I  Y7 ?( K
  38.     ErrorAcc +=  nError*Kd ;4 k1 j& U( v2 ~' Y
  39.     ErrorDec -=  nError*Ki ;8 Y. n) Q6 B- q- v, D. T
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    8 G; M( @3 W! ~% L' Z6 W& f
  41.     if(nError < 80 && nError > -80){( H3 u9 @# z9 l: M$ i' k
  42.       if(nPower < MaxPower){
    / ]- |/ e: f# o  [6 a$ l; N' U, L
  43.         nPower += 3;
    $ w0 B( t& `9 q5 [
  44.       }
    + l- x# q: n7 M  W( h7 y* a" m
  45.     } else{; q4 V2 _8 Q9 p( }) b
  46.       if(nPower > MinPower){
    . D9 q) Q0 \/ @# J0 v& J
  47.         nPower -= 2;
    7 B8 @4 Z% [( _# N" B% x& d6 ]
  48.       }% f% R4 @0 R$ f+ F  O- F
  49.     }
    $ F, a% d6 M4 m! C! b0 s- I+ s
  50.     MotoL(nPower-Error);, a: t. f' @) H9 L
  51.     MotoR(nPower+Error);   
    9 {0 g5 L5 h# f
  52.   }else{
    2 h# f# g0 \" ~* l8 ~
  53.     motor_9.run(0);7 ]8 \' r! x& `! M7 f3 ~& x
  54.     motor_10.run(0);4 E6 C1 t! y' b, H7 I6 q  A
  55.   }3 W, j- C8 A6 h4 U6 {- A
  56.   do{}while(millis() - StartTime < interval);6 p! V+ C$ z& _9 y4 d  P- r1 L2 p
  57. }5 J9 R+ V. L; v6 {
  58. - s+ A% I. q8 U, M! `# ~  S
  59. void MotoL(int Power){
    * y) T6 t0 L3 p  ?# ?
  60.   if (Power > MaxSpeed){
    % k8 P* D  @+ J- T3 q
  61.      Power = MaxSpeed;- }8 q& e2 W7 p0 y2 B4 K( q
  62.   }
    $ A. d( q! _4 l% }$ b. D
  63.   if (Power < -MaxSpeed){: c) V6 ?6 }8 O5 }5 m4 d
  64.      Power = -MaxSpeed;; f- R/ R0 P7 m& K" A1 ~
  65.   }
    0 F0 p4 c0 d& s  n* c4 D0 Q9 X
  66.   motor_9.run(Power);
    5 x$ t4 |: o5 {$ w) {$ `" w
  67. }  % ~. o, ~1 l  t2 a9 P

  68. 5 v/ l. ]: g! W: u
  69. void MotoR(int Power){
    3 x3 r  e- s& V6 X0 r- g
  70.   if (Power > MaxSpeed){  G" v( C$ C. y
  71.      Power = MaxSpeed;
      a+ Q! Q) X, `! ^2 j! G
  72.   }
    ' G! N. _) N4 _: D/ v
  73.   if (Power < -MaxSpeed){$ G. ?6 U1 w9 D9 U9 V7 |' J
  74.      Power = -MaxSpeed;
    6 ]4 p" w0 ]7 B# L
  75.   }
    3 h2 l4 g4 N. ]) p
  76.   motor_10.run(Power);
    , z9 |/ ~8 o9 k
  77. }  
複製代碼

+ R' _8 e# u. r5 y  G1 E, _, \6 |( Z, \& M, W$ e9 ]# i3 G
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 # y  {, S' L. h- p! i; g: O* e
' q* i! M# K$ ^/ s5 @
您好,不知是否能向您請教。
- ]9 x7 E% R. h) z目前和宋修賢老師在處理Ardui Car
6 {% l8 g( m( m0 m7 l雖然已使用較繁雜的方式處理了跑出黑線外的狀況$ c. m2 u+ w! U

, Y* D8 ~8 I2 \- [但基於想追求更精簡的程式所以還是想請問一下
' [% _8 w0 A/ a$ T: H就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝, \3 j# R" x: X+ x$ m
不知道您是否願意教我可以如何處理
* I1 _2 ]4 m  D9 W
0 y: O  Y" {6 }; ~2 ?' P. \) R- L" E) f& O. ^
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ) m- r) Z5 N& w  _
  2. double CNY70Val = 1000;
      b5 P) U. v9 S
  3. int interror = 0;5 v" S/ p4 s( \- @' S9 F% J
  4. int olderror = 0;! `9 h+ R0 k* S7 {# O5 y* @% i
  5. double values;3 c  g7 X4 t: q  _* s9 Z
  6. ; e8 {  d- r$ R! U
  7.   i1 y' ^$ s; b2 g. G  c- \
  8. void CNY70()
    # E' t/ n( Q0 L, h" w
  9. {9 Y& r$ G" z% ^8 _
  10.   valuesRR = analogRead(RR)
    . P) M1 ?. v5 d+ d+ M  A! y
  11.   valuesMR = analogRead(MR);
    4 Y- l3 C- v3 Y2 o
  12.   valuesMM = analogRead(MM);0 D2 m: }$ [- M% x4 Z1 C
  13.   valuesML = analogRead(ML);: ~+ r9 y/ I% a4 v" \
  14.   valuesLL = analogRead(LL);$ o/ R* b( U6 w% C. }4 ]8 G

  15. 8 Y" i( J3 M; N6 a2 T: u! T
  16.   if (valuesRR > CNY70Val)
    ) W. W& n, O. d! C$ S& X- T8 Q
  17.     valuesRR = CNY70Val;: E3 V+ u  m4 d) W' H5 y
  18.   if (valuesMR > CNY70Val)
    ) e6 M1 R& M3 l3 t1 i6 Y5 {
  19.     valuesMR = CNY70Val;) g2 F& h1 W) _, E" V/ |+ n$ p; q0 d
  20.   if (valuesMM > CNY70Val)
    & ~! N# Y3 O/ u  @/ ?/ D
  21.     valuesMM = CNY70Val;0 E0 o* q7 q$ W1 l; G1 k7 I/ R
  22.   if (valuesML > CNY70Val)
    7 v$ R! t) W8 P. K: U+ K1 `% y8 W) M
  23.     valuesML = CNY70Val;
    & [( P' R" B/ U4 p
  24.   if (valuesLL > CNY70Val)8 t& z  \4 M/ n4 k
  25.     valuesLL = CNY70Val;
    ; D( y& ^% C; J) e5 J3 [

  26. % ]! x. x( d$ _9 `+ h
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    " R3 W* E' q. l- Z7 C
  28. }
    ' @7 p* a3 O( e( {; a; w

  29. * I( h6 v" u- ]" ]: G0 k
  30. void Car(): X# f1 L* V* N; ]3 y
  31. {. I; f- z( ^6 C# J
  32.   while (1) {/ A5 y4 W- t" m* [
  33.     CNY70();6 G- e" @8 P+ a0 F% B' c, q
  34. , g4 L: E9 n( }" {. x6 E
  35.     int error = ((int)values);% Q# Q, m5 l% g+ [& s7 ^
  36.     interror += error;
    ' c7 q" m% R/ a) T/ h
  37.     int lasterror = error - olderror;) T" M9 C! t" [% `3 r; N& X0 E2 ]
  38.     olderror = error;
    ; T, C8 R$ X+ P; W( H. }
  39.     int power = error / 5 + interror / 10000 + lasterror;7 `( z) |0 w; K9 _3 [3 Z: D

  40. . U0 C1 T0 i" s4 x* [
  41.     if (power > MotoSpeed), m& b6 ]3 F6 a+ {0 y8 @
  42.       power = MotoSpeed;
    2 S# M6 E, a, ?) `) a9 A( |, [
  43.     if (power < -MotoSpeed)
    & Y" E4 T5 U# B( ^
  44.       power = -MotoSpeed;
    ) S) J. r' F( C$ t, L
  45. 7 P9 }) y' q3 s# n: \. \/ b' G* R3 X
  46.     if (power > 0)
    & p# k: S4 K' E: }: b
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ! B  j2 t0 k+ P+ ]  p% S+ E
  48.     else2 o+ r2 Z6 h- _- b% b
  49.       Speed(MotoSpeed + power, MotoSpeed);
    1 M  Y5 W8 }7 x: `0 A
  50.   }
    - @- R0 ^9 L$ z3 @+ j8 M) c+ C
  51. }
複製代碼
+ O/ Y9 T7 d" g0 X, u* |. g

. v$ @' ?% ?" r
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 11:50 , Processed in 0.026277 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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