圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20563|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    6 a* i7 t$ Z2 @" S7 O
  2. #include <Wire.h>
    4 H5 v" Y+ }8 P* x3 J
  3. #include <Servo.h>/ Q/ f+ {" e% f+ ^% l$ T  H8 t
  4. 0 ^. b) `9 Z* E) z* _% z7 c/ k" I0 S
  5. #include "MePort.h"
    2 I7 Z9 X1 N5 Y) r; o: v; O
  6. #include "MeUltrasonic.h"0 O& D+ @3 k7 v
  7. #include "MeDCMotor.h"
    6 K3 G4 W" }2 D& a/ }. O3 M

  8. 8 P+ A1 e2 \8 h4 \4 c
  9. //double Input, Output ;2 Y6 @3 u4 p+ ^( ~3 z$ \- Y- f& k: ]
  10. float MaxSpeed = 255;/ J1 C/ Q0 S9 j8 F, D
  11. float MaxPower = 180;
    ; o: v1 t+ j4 f7 }. A' |) X: E' B" M% }
  12. float MinPower = 120;
    6 n5 y1 Q* W) P3 a
  13. float Error,ErrorAcc,ErrorDec;. {5 V4 P- M0 K: ^9 l, ]
  14. + _, V5 T; A, s5 B/ o1 C2 Q
  15. float Kp=0.14;
    & N$ i" m" \( G+ @# R2 T% o
  16. float Kd=0.00020;//23;0 Y/ r- J  b- g% i; S9 |" p0 A
  17. float Ki=0.000201;( N9 m9 N4 R5 M6 P: k

  18. $ g1 f2 j4 x/ E
  19. float nPower;5 q& r) x$ @8 M, k& t% V" N
  20. MePort lightsensor_6(6);1 c6 K3 D: p# b) i
  21. MePort lightsensor_8(8);* Z8 E5 w. c' V8 U: P9 \" Q
  22. MeDCMotor motor_9(9);9 z. o( B* X0 ?& o0 }3 r
  23. MeDCMotor motor_10(10);2 G! `+ k7 P1 a5 m
  24. unsigned long previousMillis = 0;* f& p, `* ^2 |- ?. w9 C  Q1 q$ u* e
  25. const long interval = 1;3 m# A* X  S. h# W0 e2 R- ?# C

  26. : p# X* w; q- A9 T
  27. void setup(){. |# M7 e1 _9 [1 x$ Y+ j+ o& U
  28.     lightsensor_6.dWrite1(1);" f. W, |, g+ I0 j
  29.     nPower = 160;
    / a  {( U) T2 d. `
  30.     Error=0;
    3 `6 i) ?# N2 ~4 e- r
  31.     ErrorAcc=0;
    % c0 s  `9 F. U& o  g1 t
  32. }
    8 T" n% W2 b5 v" L# j5 u
  33. ) r- k0 D5 i7 T6 c( n/ D
  34. void loop(){0 Y/ c( u" C, v. w
  35.   unsigned long StartTime = millis();
    / ^. G( y; O+ u
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    . ?. D  @6 G! Z1 Z- r- Q/ c1 n/ H
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();3 d2 I. |# y& B* y5 a5 F
  38.     ErrorAcc +=  nError*Kd ;* o6 u0 `- m9 b# ?; }$ ~8 J, }: X
  39.     ErrorDec -=  nError*Ki ;
    - T% R4 h: V: x, W: l& }. X* a
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    $ i: ?. T6 q" p0 H! L" @7 U) x. B
  41.     if(nError < 80 && nError > -80){/ `0 ?/ k( q' L+ f" d# Q; e* ?; ]
  42.       if(nPower < MaxPower){
    " l$ ?( X1 g8 x6 `
  43.         nPower += 3;2 g' X: Y& q5 K* d; r5 |
  44.       }: K% N% T! v- T; Z7 y$ d+ t7 K
  45.     } else{
    6 u6 U2 n  `4 r# ?/ b' H5 R+ \
  46.       if(nPower > MinPower){
    ' Q1 Y! j7 k) U/ Z( p2 ^* t8 o
  47.         nPower -= 2;
    5 o1 ^/ v- ^5 O3 `  n1 c5 h
  48.       }" R4 v* v" v0 Y; N
  49.     } 5 O. |+ Z) p5 T! l9 w" ]8 E
  50.     MotoL(nPower-Error);
    - I' J0 l2 P9 ^+ n8 i  w+ r
  51.     MotoR(nPower+Error);    / i" ^3 q/ j' Q4 i" \3 d& P
  52.   }else{" M) g) J' w: B$ a; k+ i5 c
  53.     motor_9.run(0);
    & o# G+ m, L$ p3 g% Y% i3 G. |0 L: Y
  54.     motor_10.run(0);
    . x% f+ ~1 C9 m6 ~- J, d  d
  55.   }5 z2 n* d& }1 W7 d3 }
  56.   do{}while(millis() - StartTime < interval);9 O' ^7 D" k! V* }; ^
  57. }
    1 q1 }' W8 l8 [4 i: S4 t( N* g! _* X! M  z
  58. 1 u3 Z# b; r1 S; x; a- ?/ _
  59. void MotoL(int Power){
    * U/ E, d8 M2 g2 p2 X
  60.   if (Power > MaxSpeed){5 |- T6 N. l1 q* V
  61.      Power = MaxSpeed;
    " `5 q7 O% `+ l3 U  E% J( h
  62.   } + y6 g  N5 b2 w) Y8 O6 j
  63.   if (Power < -MaxSpeed){
    2 A: N; j3 {9 s
  64.      Power = -MaxSpeed;. ~, s  m3 E% U8 w0 x5 m* e
  65.   } $ V7 K, I2 ]  A0 A  ~, n8 m
  66.   motor_9.run(Power);
    , L' J& w% A% L  ]+ w0 B
  67. }  6 p) n" |9 e. R) Y7 Q8 B# k
  68. 0 j& ^; C$ r. T9 s# R" @/ C9 C  n
  69. void MotoR(int Power){
    $ [! Y# V$ y3 I; W! t" y( Z
  70.   if (Power > MaxSpeed){
    , \- [- R7 A+ b7 r; g8 P. z/ H# i5 d! u
  71.      Power = MaxSpeed;
    7 O8 M: i8 ]/ J5 r3 k" P
  72.   }
    6 k! s1 r6 X; |& d
  73.   if (Power < -MaxSpeed){
    " N3 {  D1 b6 b1 }7 B' d( e
  74.      Power = -MaxSpeed;
    " F3 j( D+ [* c6 J( ~( [& G6 S% z  B
  75.   } 9 L; l. N. S5 ?6 q* u
  76.   motor_10.run(Power);
    2 o0 g& x. T3 p: o
  77. }  
複製代碼
) m7 r% D. f6 {' g* Q8 O

6 z3 R# x+ D. k/ I+ e
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 : G1 U, w4 N/ J: B5 d
3 V: o. a% H4 ^0 Y6 R# D  g
您好,不知是否能向您請教。2 D" F1 P" @. ^  c" v, n
目前和宋修賢老師在處理Ardui Car
/ S0 G3 @9 T! @: t0 a4 b. I2 t雖然已使用較繁雜的方式處理了跑出黑線外的狀況
; k8 J0 B/ B# M+ b( S) G* [+ {" x( _
但基於想追求更精簡的程式所以還是想請問一下
  K, Q# v. X; U6 e就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝  d: w( x3 V. ]. W9 q* M
不知道您是否願意教我可以如何處理; K1 b% l" N7 ]9 K
. {: i4 L6 h) h
2 ?0 ]7 Y% e& J) E+ k1 H! P- R
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ; m) d, ~2 n- ?5 c5 W9 O0 x7 `
  2. double CNY70Val = 1000;
    5 T8 p  Q. _0 u4 K8 }$ t
  3. int interror = 0;
    6 M) L1 v! |7 R: |9 b7 d
  4. int olderror = 0;; C2 g# P' P" X. o* u! C
  5. double values;
    1 i1 d  Y0 i5 C2 v' ^
  6. & W9 t7 O# ?! v. ~
  7. 2 H2 }( L8 f' U. u. m  ]' k3 `
  8. void CNY70()# j+ B- U: G5 R- ]1 e4 f
  9. {* h! |* U# E1 N8 p, L* V
  10.   valuesRR = analogRead(RR)
    : y7 Z1 \; ?* y% Z  U, M
  11.   valuesMR = analogRead(MR);( [8 d+ {2 g6 @3 }1 r
  12.   valuesMM = analogRead(MM);* H' k7 k+ K" k, t
  13.   valuesML = analogRead(ML);$ o7 m# z' Z5 g8 e
  14.   valuesLL = analogRead(LL);
    - {/ K; c. s( C; j! J

  15. 4 p' o# a. S$ @% T; u
  16.   if (valuesRR > CNY70Val)
    ; S* g8 k" v& U, C5 C
  17.     valuesRR = CNY70Val;
    7 l, Q1 f. B9 }0 P; }
  18.   if (valuesMR > CNY70Val)
    ' ?$ O+ m/ t( a) i
  19.     valuesMR = CNY70Val;! k! X# z1 R$ r0 g1 D
  20.   if (valuesMM > CNY70Val)+ b  Y) o# V5 \+ d& W) y# X
  21.     valuesMM = CNY70Val;
    - Q( f, ?. [: {5 Q
  22.   if (valuesML > CNY70Val)
    8 A* @, M0 _& k: T5 W
  23.     valuesML = CNY70Val;3 A9 W( m% {- ]5 a$ q
  24.   if (valuesLL > CNY70Val)' Y  U+ N6 o' a( T+ w
  25.     valuesLL = CNY70Val;7 _8 K6 U( ?5 y3 h( k% P
  26. " Q, }* _& `( [" h$ I
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    8 j) o! |; F6 k. z
  28. }
    ! h- A, P/ L* V/ X. L3 h* F
  29. 3 B+ R0 u( [6 g/ f. O0 A- f; S
  30. void Car(); W* {. R# y/ `! ]9 a
  31. {
    % ^; M  T1 v4 }8 z% h; Q2 o
  32.   while (1) {% S7 K7 L4 W( r1 [# }" N+ h
  33.     CNY70();
    ; d" |" s6 Z# I  s; W

  34. . t7 p2 N' l( z" l, @) O- h4 v
  35.     int error = ((int)values);
    4 R6 f8 t* ~2 \# o% i
  36.     interror += error;7 ]# c; `+ c$ k8 E
  37.     int lasterror = error - olderror;
    9 t9 `( y9 ]7 d+ S
  38.     olderror = error;' ^) M( p9 [5 P  d( y0 q
  39.     int power = error / 5 + interror / 10000 + lasterror;) l1 [$ H' X& Q  @; n$ h
  40. $ [2 l  w; D* F$ j
  41.     if (power > MotoSpeed)
    $ Q) x$ Z8 g8 |5 N: f
  42.       power = MotoSpeed;
    - J) Q. W, @: e) O. _
  43.     if (power < -MotoSpeed)
    0 R! X. I8 A* f0 l
  44.       power = -MotoSpeed;
    5 r) F9 T/ G% v

  45. ! t* w. Q1 ?8 ~3 ~9 A
  46.     if (power > 0)6 ]4 y4 ~2 W0 O% `# G
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ' W* w: L5 }! r
  48.     else
    8 U3 ?3 N! s7 y( m8 {! E
  49.       Speed(MotoSpeed + power, MotoSpeed);$ v% J7 H. S2 o6 M( K3 U
  50.   }
    7 _1 Y' q; g4 \  h3 d
  51. }
複製代碼

& R: Z- C4 [$ j4 N6 ~& V/ ~% j, E+ v3 y$ D$ N0 f
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-4-18 10:21 , Processed in 0.024255 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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