圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21748|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ; `2 U9 G4 O; N2 [
  2. #include <Wire.h>. @8 s- {; [; N3 u" d1 C
  3. #include <Servo.h>% I8 H/ O; r1 y: ]. u5 ^( J; Q

  4. : y$ ~( |2 M3 M/ D* v6 J7 e+ Z
  5. #include "MePort.h"9 ]$ }" R  R8 k* }# o
  6. #include "MeUltrasonic.h"
    % Y  a5 y5 _- @# ~+ \- ]
  7. #include "MeDCMotor.h"9 f8 }4 i; s  [4 r1 b

  8. * Z8 S9 v, L- P' c1 I( `2 k
  9. //double Input, Output ;
      {/ |- ~) }. `! W" `5 F
  10. float MaxSpeed = 255;
    : X+ B/ w5 z5 l1 N
  11. float MaxPower = 180;
    / e0 \1 C% h; g  z* H
  12. float MinPower = 120;* R4 c4 j% O$ j  r2 `
  13. float Error,ErrorAcc,ErrorDec;$ N2 A5 u5 ?! h% |/ ~$ T5 r1 R" N

  14. " B( I7 s+ W6 Y  L& J+ ]
  15. float Kp=0.14;
    ) J$ Y- q9 M! Z* Z  k1 S/ c
  16. float Kd=0.00020;//23;
    " _9 ?7 e& e4 V: W* m7 Z
  17. float Ki=0.000201;
    8 X5 |' L( y8 F, h& q: V

  18. $ m; R5 B' c- c5 j( H
  19. float nPower;
    ' D3 e3 L# h& _. g* Y, ~
  20. MePort lightsensor_6(6);3 Z) ?9 j* I" G% q6 e: p
  21. MePort lightsensor_8(8);& @, s0 X  R' @, {6 x3 n
  22. MeDCMotor motor_9(9);
    / G# m8 J& h" Y3 y' F; W; Y
  23. MeDCMotor motor_10(10);
    2 k/ `2 g; f* Q# j0 j! n6 }- S
  24. unsigned long previousMillis = 0;2 s: h! ~8 f; X2 Y( Y
  25. const long interval = 1;2 S: c7 B; A( ~$ a! [4 \

  26. 6 j1 w, V( Y; I/ v0 O
  27. void setup(){/ d9 L* a% A* m1 ~
  28.     lightsensor_6.dWrite1(1);- f5 M1 v* y7 }6 D3 ?
  29.     nPower = 160;2 i7 X! C7 _: q1 |) A  W/ y
  30.     Error=0;' R$ I5 M$ g4 G+ K
  31.     ErrorAcc=0;
    # R& R8 R, _6 i1 k7 N/ d* R
  32. }
    ; s$ i3 J" r' [' ~; L
  33. , L. J+ ]! U6 {& A( D$ B
  34. void loop(){, B/ L+ e9 n" U& S  x0 w" y* }7 P
  35.   unsigned long StartTime = millis();! B0 v( ?% V7 V$ W" A2 Z
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){# K0 t4 E  M5 x; Y/ j
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();8 @& \2 B# p& P9 ]( X  U7 w, R
  38.     ErrorAcc +=  nError*Kd ;1 H; b. e, N8 v! R/ s
  39.     ErrorDec -=  nError*Ki ;
    9 h  [+ G9 S, @& o" c
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);5 F* J7 N5 d5 E; ~( {
  41.     if(nError < 80 && nError > -80){, f8 d; w* S9 F+ w
  42.       if(nPower < MaxPower){
    , I4 n4 O( z7 [; z8 @& F
  43.         nPower += 3;
    ( R# i! _. L$ z0 \' S% Z3 e( B
  44.       }
    0 x1 R3 z5 n1 \4 j( j7 P
  45.     } else{4 G8 w. n8 q9 E& ~" u8 S6 h
  46.       if(nPower > MinPower){( {' M6 r7 ^; E" N
  47.         nPower -= 2;# J3 {% f( z2 [0 d
  48.       }6 M! U+ @2 n  l' d  P. y
  49.     }
    2 D+ k7 B1 x" A2 Z( c) P6 I
  50.     MotoL(nPower-Error);
    & ?" d, C! M7 K5 ?$ R; S/ W/ Y
  51.     MotoR(nPower+Error);   
    7 R) q  `; t- ?, Q6 Y" [. v3 ]
  52.   }else{1 v( U4 q; J  ]& F! N' w: z6 G. }
  53.     motor_9.run(0);' g  {4 l5 g" h5 P/ l) v
  54.     motor_10.run(0);7 f3 X2 E, t) t
  55.   }
      C6 g. b" U5 x
  56.   do{}while(millis() - StartTime < interval);
    7 Q9 g/ F7 v/ A; I; i" L% M4 t: {
  57. }0 E1 C6 D& n- z) o" p' l4 a
  58. 3 s- Q+ W9 B8 z% x! v
  59. void MotoL(int Power){+ d1 P7 G2 g! J; q- z2 x6 E2 V0 L; J
  60.   if (Power > MaxSpeed){( ?8 v& _7 v) t+ R2 O% J7 p
  61.      Power = MaxSpeed;
    4 q+ s( m- s+ h
  62.   } . D" \, x' O' V/ ^- t1 I
  63.   if (Power < -MaxSpeed){  m: k7 _/ i0 x4 v2 L
  64.      Power = -MaxSpeed;- g4 I/ t9 f. W; ]- f* P7 b
  65.   }
    $ R4 ]: q7 E0 C! J* {5 d
  66.   motor_9.run(Power);/ _; c9 W& D( W/ t1 I4 I. g# t
  67. }  + H2 @8 Y5 Q$ D

  68. 0 H0 |% N" O# C& v$ I+ N5 k
  69. void MotoR(int Power){- K4 {9 x* z7 n6 V5 K; |
  70.   if (Power > MaxSpeed){& H! Q  a; T7 f9 [' Q
  71.      Power = MaxSpeed;
    2 Y& `) B9 {  D5 h9 o& A1 v
  72.   } ) E3 |, J' M( `: p. ^
  73.   if (Power < -MaxSpeed){1 h  y. c1 z8 _* v
  74.      Power = -MaxSpeed;
    & W# y! A. f/ @# x" p4 \
  75.   }
    ! i9 H! }+ W- @- M+ ]# |  ]( F5 N; ?( g
  76.   motor_10.run(Power);
    1 o" H6 y: W0 \8 m; j! D1 k
  77. }  
複製代碼
! v& j0 k' h: U+ `

  {! I' k  E! w) f& t
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 y2 S, b; a, [* e
2 h4 k, r# ^  \7 f+ z/ W5 D4 t您好,不知是否能向您請教。8 H9 ^" b  M3 Q9 L
目前和宋修賢老師在處理Ardui Car3 p" X- I; V2 F% N) I- b. J" w0 d
雖然已使用較繁雜的方式處理了跑出黑線外的狀況: w# t- @2 q7 i  F

) q& I5 V9 O' @/ J1 Q! w% p但基於想追求更精簡的程式所以還是想請問一下
! y6 P7 F: S+ h% F/ G5 n3 v就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝5 _- ?2 Q7 w5 U5 M& ^, F9 q* j( q4 [
不知道您是否願意教我可以如何處理( s1 t6 c2 G6 ~9 g- t1 O. |& q  x0 |

* H+ L+ E9 e8 k' ~& J# B4 A, ~( ~- `" j$ i
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;/ y$ R# J$ N' d8 R3 c1 I* L  X7 I
  2. double CNY70Val = 1000;
    & B- r3 O' s( p; R" Q# b2 u
  3. int interror = 0;) z) O9 |+ c9 T9 _; Q
  4. int olderror = 0;
    % ^, Q( o' f$ C
  5. double values;  g' j4 U5 {; a6 k; r$ j2 U+ j
  6. / ]' M4 x7 P4 G( I4 Z5 M' m

  7. 6 A8 ~3 f4 i0 r2 F) B+ `" C
  8. void CNY70()) v0 X0 C: B( M+ a
  9. {
    6 e) J2 \9 ~: t- d- R
  10.   valuesRR = analogRead(RR)
    / w7 _. I2 U8 c
  11.   valuesMR = analogRead(MR);
    % N4 T1 P+ ~: d& C
  12.   valuesMM = analogRead(MM);: k& B; n& H$ ^& A5 ]
  13.   valuesML = analogRead(ML);
    & ?/ t; I8 T5 U( t* Z6 ^+ |
  14.   valuesLL = analogRead(LL);
    0 s- V5 M( @* g, T" I, R
  15. 5 F8 u9 V1 \- \$ I3 F- V
  16.   if (valuesRR > CNY70Val)- F- k' p( u* l3 q
  17.     valuesRR = CNY70Val;! a5 [( y9 O: i
  18.   if (valuesMR > CNY70Val)2 e3 s( Z! c  s: T3 x
  19.     valuesMR = CNY70Val;
    ; u+ O$ N5 r$ \8 W! \3 @' l
  20.   if (valuesMM > CNY70Val)
    ; _. O4 `0 X1 h/ Z! U+ T$ i
  21.     valuesMM = CNY70Val;) t) {6 Z0 S: d: h5 o* o
  22.   if (valuesML > CNY70Val)  F2 G4 A5 j; @: p! ?: [7 D
  23.     valuesML = CNY70Val;8 L# X" C. @2 \/ a# }
  24.   if (valuesLL > CNY70Val)
    ' U5 f6 P' g) \' x
  25.     valuesLL = CNY70Val;
    1 S$ x  T- n% d1 A9 j# r2 @: v

  26. , Y8 V0 ?1 g/ S6 j) q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    . U# G' o( L% ^8 U  s. N
  28. }( S: Y- x) [3 K/ M% C

  29. 3 {8 i: Z' @! v5 ]
  30. void Car()& e2 B" F9 z- ~5 M) A9 D) s+ v& e  d6 W
  31. {
    ; G# F: i9 c! Q
  32.   while (1) {
    * L- U0 D! Y) P$ B) p6 S
  33.     CNY70();
      R* B9 Y. G# E, p( `% }! X

  34. 6 s1 w$ H( E- {- Y) e# J! E
  35.     int error = ((int)values);
    # F  `" B% w5 X3 Y, ]; x
  36.     interror += error;
    ' g8 ]% W& ~$ P' B! k# C6 M& x( Q
  37.     int lasterror = error - olderror;& S1 @8 K& X7 o5 W
  38.     olderror = error;
    - n4 E8 d6 M, j# @( U% A
  39.     int power = error / 5 + interror / 10000 + lasterror;! t) L4 X. T- e2 r
  40. . n5 G! h5 c6 t6 U. n
  41.     if (power > MotoSpeed)
    6 y* @+ q2 {- V# Z4 J+ p0 Q
  42.       power = MotoSpeed;: R' N+ q' N& x2 g" _9 n8 S: P
  43.     if (power < -MotoSpeed)2 l1 \) G9 ?3 _7 ~4 L# [' I
  44.       power = -MotoSpeed;
    , E4 O7 x+ a+ x5 D5 j" T
  45. 1 Y9 X% G+ s/ t; I) G
  46.     if (power > 0)# U* n3 o  }3 j- \; |7 Z- |
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。2 _- Z7 F1 d+ n) B
  48.     else2 Q3 R! K. Y$ ^2 ]
  49.       Speed(MotoSpeed + power, MotoSpeed);
    1 c( z& r- `# H1 e4 U- k6 O' e: A3 u; F
  50.   }6 t, L( _9 \3 u8 `# S/ W
  51. }
複製代碼

" C0 g4 R" j  L. n( Z  E" j& n
+ Q: g- u. m3 I+ G( n
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 17:47 , Processed in 0.015500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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