圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21746|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ' i- p% z  A' [3 {9 o: W
  2. #include <Wire.h>6 q+ H9 x! s, z8 U& ~$ K, r$ i$ w
  3. #include <Servo.h>
    ; G* U/ S1 Q5 t$ p0 \- Z

  4. $ }( o7 q1 C; m* E$ s( x
  5. #include "MePort.h"
    5 ?5 R# v* Y8 h" W5 R9 b
  6. #include "MeUltrasonic.h"
    ) Y9 B( R! n3 h8 b
  7. #include "MeDCMotor.h"
    / A; [0 \4 o/ y! S" \/ h" m; v

  8. ) j, I1 r# H9 V2 G! F) H
  9. //double Input, Output ;4 }$ b4 G/ O- C- o0 R' x. M( y
  10. float MaxSpeed = 255;
    8 q2 e% _+ _0 G' X
  11. float MaxPower = 180;
    ) u2 b9 V" b& |
  12. float MinPower = 120;
    0 B5 B" q. g' i2 s! ^6 L
  13. float Error,ErrorAcc,ErrorDec;4 b' ]: d3 R# Q; Y3 r
  14. - Y# l9 j  B" S! x* m8 ^
  15. float Kp=0.14;# N. }5 \" h. j. i' N4 R
  16. float Kd=0.00020;//23;
    . q6 b/ l3 G& B1 s" n8 |1 e; B
  17. float Ki=0.000201;
    * f( \4 c- H" K: B
  18. 5 B4 w  |6 ~8 S+ u6 r
  19. float nPower;
    - z) T9 v2 J; m5 Y3 r9 w$ z
  20. MePort lightsensor_6(6);+ O  N! J' @, J( I
  21. MePort lightsensor_8(8);+ Z! ~" v2 E: ?0 n" U' N2 Z
  22. MeDCMotor motor_9(9);& S# ~- H( U+ H6 q& L2 h, w+ `
  23. MeDCMotor motor_10(10);
    $ W4 U7 C9 M9 O9 Z  s
  24. unsigned long previousMillis = 0;4 @3 J% m4 Y0 M
  25. const long interval = 1;
    + D" y9 n& z! ^8 x* D7 T5 J
  26. " q$ Z& J' t' @4 O6 Z( D
  27. void setup(){8 D( h2 \+ J- b( @- {
  28.     lightsensor_6.dWrite1(1);
    / Q* ]0 j1 i4 S# G, A
  29.     nPower = 160;% Y, [- b6 A1 k3 N, y0 F! K
  30.     Error=0;3 k: ^! k% V" _# X& [
  31.     ErrorAcc=0;4 a/ F" k2 s! j" a
  32. }
    % C' [' A: I* o3 l
  33.   |: n; |' L4 x8 p3 j* F
  34. void loop(){
    # z4 K& ~# i1 ~# U9 `# O
  35.   unsigned long StartTime = millis();1 Y$ z/ u0 R8 m( g# ^; V$ x0 B3 s* d
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){  L4 q. {- \3 U- ?# Y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();8 c9 G# d. l1 i0 E
  38.     ErrorAcc +=  nError*Kd ;5 w# g" o1 r& C; V6 p$ p
  39.     ErrorDec -=  nError*Ki ;
    1 {9 S: V0 {! F7 N  e1 l; o9 U
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    $ _2 J4 [. N( \
  41.     if(nError < 80 && nError > -80){
    % ~2 \: Y$ R, U, W' \2 u
  42.       if(nPower < MaxPower){! {( W3 X$ g+ n$ _& [
  43.         nPower += 3;5 t1 k+ D8 k* l+ ]- g: O
  44.       }* |: f9 t5 ~* K' [: e
  45.     } else{% C0 f# \, j7 D$ b8 ]) r0 N
  46.       if(nPower > MinPower){" ?+ e, H  R$ k
  47.         nPower -= 2;6 N$ B: i5 ]; Z$ l" d& @
  48.       }7 T2 C* C$ [; Y' H) _" n- N: p  w
  49.     }
    " z* k3 R- J: j9 f; Q" t8 m
  50.     MotoL(nPower-Error);. x0 x1 w+ v0 C1 C9 @+ T5 ]' p
  51.     MotoR(nPower+Error);    ) ^" H) Y4 N  M# u9 }- ^7 \
  52.   }else{
    & g6 ?; l" g9 f( G0 }5 A6 l
  53.     motor_9.run(0);  ]$ K) s; b+ I, \6 F- N
  54.     motor_10.run(0);
    4 ?9 p$ |# N* R9 c1 c
  55.   }, {( D" {/ `+ A3 H
  56.   do{}while(millis() - StartTime < interval);7 b% P& g0 j$ s$ T! j
  57. }) {/ R  v6 q$ l. h+ h% m& \
  58.   Q3 D! s% S  z1 \" H
  59. void MotoL(int Power){2 b5 q, K. z# G" I
  60.   if (Power > MaxSpeed){( P) d( i; R/ {
  61.      Power = MaxSpeed;
    - {% v5 D; |/ B1 x( |* l) [
  62.   } 8 a# ~3 j$ b: [3 b0 f3 t  j  @
  63.   if (Power < -MaxSpeed){! m7 M+ N' r2 O' M% X8 j- O/ @! d0 T1 x
  64.      Power = -MaxSpeed;1 T/ Z3 d5 c% L/ W- q, j
  65.   }
    * B5 q5 @/ b, t+ A2 z) D! M
  66.   motor_9.run(Power);4 K' F# ?2 {" d7 ~
  67. }  
    & e& Y& o' }1 o

  68. " {/ s" U0 h% g7 v' k
  69. void MotoR(int Power){  B5 O, M6 V. u' M- E/ \
  70.   if (Power > MaxSpeed){4 B/ `. A3 v9 T4 P$ A' S
  71.      Power = MaxSpeed;" \1 ?* _+ Y4 Q6 N
  72.   }
    2 y( j  E  R1 g8 }0 k. M
  73.   if (Power < -MaxSpeed){7 @$ v7 i! F  i  ~
  74.      Power = -MaxSpeed;* m6 l9 L" z( N- c& v6 l  Y
  75.   } 4 |0 H0 `" K9 c1 G8 |
  76.   motor_10.run(Power);
      a% T' U' @4 P3 p: e3 |
  77. }  
複製代碼
2 e; _" j3 B8 X& x: J) _
2 a' [% y: |$ \
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 $ {1 z0 V* `1 K
0 n2 K' ^( o3 s& k9 d9 K
您好,不知是否能向您請教。2 A/ K( T0 j* R3 H0 d9 T
目前和宋修賢老師在處理Ardui Car
) `& H( Z# H7 M+ h( `6 L雖然已使用較繁雜的方式處理了跑出黑線外的狀況. f: D1 o0 A; H; O
" g& h6 |- ^% A- A5 ~2 S) y' n. C* T
但基於想追求更精簡的程式所以還是想請問一下* M: {- {6 c: j8 O7 M: |
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
- p9 |2 t, e1 d2 w不知道您是否願意教我可以如何處理' T1 l) Z; \- ?
) K. Y) ^( ^' |9 w1 [# x* A8 I

- u/ i0 c3 ~' u以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;. _/ S; a$ ?2 M, S
  2. double CNY70Val = 1000;
    ( j' P# Q5 E2 r+ P$ [/ A+ X( S
  3. int interror = 0;
    0 C2 {9 g0 T  V8 d
  4. int olderror = 0;
    ) F0 [) O( M% X5 K7 c# H0 a4 N7 f
  5. double values;
    % M8 c' R( D) q: Z
  6. * ?% C5 G, Y' r. t" D

  7. - {5 w  V, G! ?6 E
  8. void CNY70()
    0 c/ n5 j) F, h% j7 P7 W. R4 n
  9. {
    7 P  z: p6 ?4 I& n0 f. n9 O
  10.   valuesRR = analogRead(RR)
    1 ]- Y, }, i+ P1 D4 N5 g8 X
  11.   valuesMR = analogRead(MR);
    " |, ], l- C% H& N# L
  12.   valuesMM = analogRead(MM);
    9 K" V2 R: T: v) [* l6 \
  13.   valuesML = analogRead(ML);( X. B# K- ]# f0 i! i# `: F, N) y
  14.   valuesLL = analogRead(LL);" j! M8 d( z2 s
  15. 1 t; b/ n6 C! ^! J! s0 I, U
  16.   if (valuesRR > CNY70Val)
    & ?; C$ F; H) j/ a1 B) i* Z6 j
  17.     valuesRR = CNY70Val;# X) j& n7 z7 w7 I; T% i( Y. p2 A
  18.   if (valuesMR > CNY70Val)% ]: F( `' E  M# K, t
  19.     valuesMR = CNY70Val;8 k9 k4 y1 p- y6 l" Z
  20.   if (valuesMM > CNY70Val)
    $ L- ^9 Y. W2 ~  [/ ?! t
  21.     valuesMM = CNY70Val;+ @, A. l  G# y
  22.   if (valuesML > CNY70Val)
    3 r4 S5 i/ }  J# Z
  23.     valuesML = CNY70Val;
    / O: ~, z1 z7 r2 R% Y* T
  24.   if (valuesLL > CNY70Val)' u$ n/ d5 N. B/ i* U$ i. M1 w. w
  25.     valuesLL = CNY70Val;
    ! }' [0 e4 x& S' A2 g8 N5 I

  26. 5 B$ d9 `: M) _; O$ G- q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    7 |2 R4 L0 d% I9 \  T
  28. }
    0 x/ I* u) f8 I7 i
  29. 8 }9 T* j4 f% b2 q
  30. void Car()
    : }3 j9 t5 Z, T7 L6 A
  31. {8 k8 _! ]& |4 l3 Y
  32.   while (1) {
    ) i4 [, f. f9 |: z9 C' J4 H
  33.     CNY70();  i1 X" G( H; g

  34. ( k, D# @2 k8 i- Q5 Q  _
  35.     int error = ((int)values);
      H$ X; n8 C/ U, @/ c. ?, w
  36.     interror += error;
    " r( R, R# l( ~0 d0 k; ~
  37.     int lasterror = error - olderror;6 I0 ~+ u/ i( h3 `/ ]" ^
  38.     olderror = error;5 r5 Q" {* L  Y  B
  39.     int power = error / 5 + interror / 10000 + lasterror;0 g1 i4 y  z9 U; s: N9 N
  40. 7 p) y2 J! j0 [" ?  G% I5 f6 \
  41.     if (power > MotoSpeed); a) o, T1 d! E" I
  42.       power = MotoSpeed;  t- ?: ~) B8 _5 G" M% Y
  43.     if (power < -MotoSpeed); P7 ~1 \4 Q. _# n5 B/ x) \
  44.       power = -MotoSpeed;2 X. \  c: s0 e* Y2 Z/ \6 _
  45. , d' B& ]6 w$ f4 ?2 X
  46.     if (power > 0)
    . X* P; W0 ^* F
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。9 ^) D" \' y+ Y; m6 a% j% ?, }3 q
  48.     else: }% @3 Q& T, P
  49.       Speed(MotoSpeed + power, MotoSpeed);
    * r; }+ J: A1 J
  50.   }* s% L1 U/ Z* k9 g. d5 N6 ~
  51. }
複製代碼

. U: r" l2 v) t4 e& K" ?3 C; O+ k8 E$ v
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 13:55 , Processed in 0.023476 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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