圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21701|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>( _" o( M) S0 j( F* s
  2. #include <Wire.h>
    0 B* i6 L/ d% D, ]6 u' q9 e
  3. #include <Servo.h>7 o, a! l9 l2 r9 E
  4. ( @3 i) I2 Y; M- Y4 Q$ ~
  5. #include "MePort.h"
    # q, Z. a: _! g
  6. #include "MeUltrasonic.h"; X& h  e4 W& p1 Q& Y; g
  7. #include "MeDCMotor.h"
    6 e- _  V9 L- E" O) s
  8. 6 _' h, Q( k" Q( w% e/ v6 t
  9. //double Input, Output ;4 `# T' q0 P9 y# K( ?8 s3 q9 ?
  10. float MaxSpeed = 255;, g1 P3 Q1 i! u4 ^
  11. float MaxPower = 180;
    ' I1 X, M  {, y
  12. float MinPower = 120;8 n# a0 z, i3 \: Q/ R% c
  13. float Error,ErrorAcc,ErrorDec;# x/ k+ W6 k! F* R' L
  14. 8 f5 w4 F6 c4 L0 o  w
  15. float Kp=0.14;% v5 L8 H5 J8 |, X# {/ k& M
  16. float Kd=0.00020;//23;. `+ q$ [; k/ \$ J$ Z9 @8 e
  17. float Ki=0.000201;/ w! n; U/ O0 b2 q
  18. 2 a; B( R# H  t0 j& i. l* M5 W
  19. float nPower;- j& o3 P' L) L1 c* [
  20. MePort lightsensor_6(6);
    % D7 p: Z# v# ~
  21. MePort lightsensor_8(8);. ^& p  [1 K! {
  22. MeDCMotor motor_9(9);1 d7 i. o) ]+ Y# J
  23. MeDCMotor motor_10(10);0 s2 F8 \# u" A. K3 I
  24. unsigned long previousMillis = 0;
    6 c1 c8 C  l3 t/ o  S' X! e
  25. const long interval = 1;/ y; Z8 ^/ w/ e# g, D8 m$ A
  26. / F3 @0 {* N. j+ \/ a( [0 y7 j
  27. void setup(){
    5 T& b: y9 G$ ^8 U! V
  28.     lightsensor_6.dWrite1(1);
    5 A3 X0 \: c: U) z  l+ T) d6 \
  29.     nPower = 160;
    8 W8 H9 r$ @+ u* q- D6 P8 P
  30.     Error=0;8 f, {! ?4 A. ~" o1 D+ Z+ ^
  31.     ErrorAcc=0;; }; A* j) z; z; b1 B: `2 }' b% q
  32. }
    ' C6 e& l8 U; P; {1 g- {

  33. 4 w- h, d; w7 q$ T
  34. void loop(){
    : q7 L# U- A5 O; R; \$ Z
  35.   unsigned long StartTime = millis();3 w: r' ^9 G. v0 {& _
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){9 c" s# m2 a% Q, s3 y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    1 L/ u: U1 D6 I" }4 }
  38.     ErrorAcc +=  nError*Kd ;
    ) j9 [2 n6 {; M2 ?
  39.     ErrorDec -=  nError*Ki ;: `' k6 ~% @& j# e
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    4 l+ r- |( j9 l' L
  41.     if(nError < 80 && nError > -80){
    # T* u5 N( P& I' E3 d4 V6 t  ]
  42.       if(nPower < MaxPower){9 G9 m: c  w1 [7 p. h
  43.         nPower += 3;
    ; S9 j/ p1 ^/ P; S
  44.       }
    ; n# c4 {* f1 i1 K! g& D
  45.     } else{. M3 Y5 T4 B+ \) u0 v( x' f
  46.       if(nPower > MinPower){6 [1 I" ?0 B/ Y6 {5 W4 k
  47.         nPower -= 2;
    " G" i7 g4 n" w; a7 S# j
  48.       }
    : Q( c* N8 |; E+ {
  49.     } + K" {' g. G5 S8 E  T% j
  50.     MotoL(nPower-Error);
    * y& K9 ~* J  r5 C
  51.     MotoR(nPower+Error);   
    0 ?) j: }9 n( G9 [  g8 W; E
  52.   }else{& p3 p6 K& E5 Q' [( [+ ?- l% g
  53.     motor_9.run(0);
    0 g" E9 _& e7 N! W
  54.     motor_10.run(0);
      ^* e5 F* m5 i! S. @( z6 \
  55.   }5 G$ a3 `5 e1 `6 l" M* }+ i
  56.   do{}while(millis() - StartTime < interval);
    $ u2 J2 B% `! P  u8 R/ T) ]& S
  57. }
    ) ~) m5 O! J. f; |

  58. / e* C: m0 `# u2 h3 v/ g7 @7 S
  59. void MotoL(int Power){
    " r+ b  ^% a: d, I' `
  60.   if (Power > MaxSpeed){
    7 c( Z! J3 Z2 M- v- m% t4 g/ n
  61.      Power = MaxSpeed;( c$ T$ @% e- c9 h/ m, M7 J
  62.   }
    0 d) F0 K; v9 B- H6 g
  63.   if (Power < -MaxSpeed){" X/ d2 i" X: o/ y
  64.      Power = -MaxSpeed;
    $ t3 ?; X9 F- Q# j
  65.   } - v5 P' D, o$ e" k* k9 c" O
  66.   motor_9.run(Power);
    & {5 C5 e  g7 n8 q9 A! q
  67. }  
    ) T( |. p5 {% K1 q4 @
  68. 9 O1 L6 a3 L& e/ j  `; O
  69. void MotoR(int Power){6 F" w8 Z( g$ b
  70.   if (Power > MaxSpeed){. }9 x- _% n" I6 C
  71.      Power = MaxSpeed;
    # w# g% c/ S# h* c8 d3 A# D
  72.   } 7 E' W& m$ r4 p) \
  73.   if (Power < -MaxSpeed){' d) p9 i' }# y
  74.      Power = -MaxSpeed;9 }$ ], h7 ~8 [4 M7 S# Q0 ~
  75.   }
    : F1 C, `+ Y( s3 m' R
  76.   motor_10.run(Power);
    ( Q" n8 {. C8 l9 z
  77. }  
複製代碼

- g3 {" E6 G; @8 M# a3 \# P2 G* G0 l' R! i+ @
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
8 K* J; n0 w3 P6 W1 `9 x7 c3 O/ p% {6 o* f8 y6 U
您好,不知是否能向您請教。
; i  R& Y# f* N1 f6 u3 v( Q4 D目前和宋修賢老師在處理Ardui Car3 \8 ]( [$ |3 P1 g
雖然已使用較繁雜的方式處理了跑出黑線外的狀況8 a8 {6 K  y7 ]; X0 J' Q/ g1 o
$ C0 I$ L) g' ^% Q$ k$ o6 p# V
但基於想追求更精簡的程式所以還是想請問一下
) p" `/ i+ _1 s/ B就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
. h& B6 Z* \* o+ B; f( t) a$ r5 U4 J2 N不知道您是否願意教我可以如何處理$ ~0 \7 k8 [( u: O# W
6 P1 W/ \8 V$ t) i

" @( c; }/ Z: @以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;  V/ O; g9 p: l, v. x+ Q
  2. double CNY70Val = 1000;  {1 Q0 v. u7 d2 ?( R/ \9 R
  3. int interror = 0;
    4 i; b. o1 G' x8 k: q
  4. int olderror = 0;$ f) C& p. ]% N) d# k
  5. double values;
    0 t2 [" |0 G$ E# H' X# @9 t

  6. 1 p4 T8 O9 C1 M2 m' u+ \7 `

  7. 8 s/ o, L" D  ^& g
  8. void CNY70()
    ; x- D- J* @% E& L( J, S) X5 B
  9. {
    # L* Y8 ~4 l6 q/ O' W9 h
  10.   valuesRR = analogRead(RR)
    ) o. X/ h" b. N, p7 Z! `
  11.   valuesMR = analogRead(MR);6 D# Z0 c7 E4 ^9 N
  12.   valuesMM = analogRead(MM);/ k5 |1 m0 T3 G5 I4 u/ a
  13.   valuesML = analogRead(ML);6 p" k# Y' U" \0 h
  14.   valuesLL = analogRead(LL);
    " j; d; M) g; H& H$ v. b

  15. 1 F. T) n, c# {, a; u$ M
  16.   if (valuesRR > CNY70Val)
    ( \5 `, b' y$ ]7 e6 z
  17.     valuesRR = CNY70Val;
    2 N% [7 Q' p9 t9 S# T& G* _
  18.   if (valuesMR > CNY70Val)8 }- R$ ~% Q* I' y3 Y% a
  19.     valuesMR = CNY70Val;9 `5 \2 n0 M% [1 @; D
  20.   if (valuesMM > CNY70Val); G5 q( D# t9 M0 C7 ]
  21.     valuesMM = CNY70Val;
    2 D1 a, s5 [; t, i& P  Q& Z
  22.   if (valuesML > CNY70Val)
    0 x+ \5 e/ T9 n9 [
  23.     valuesML = CNY70Val;" L6 }1 r4 @  e9 Q/ j/ G
  24.   if (valuesLL > CNY70Val)
    , d! o: `' \/ l7 ?! c
  25.     valuesLL = CNY70Val;
    7 a" P  Y' f6 g* L2 K  [
  26. & J! |6 \3 @. c6 T+ _% u
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    & o  {, _( W* [# b1 B* }
  28. }& u, B/ y8 J$ o
  29. & w( C) Q. W. x, o$ H$ W1 v
  30. void Car(), y  f* n7 ~. c: M" W6 |
  31. {% x8 A5 U8 o+ m, x/ P) h/ e
  32.   while (1) {/ V% e& B6 g0 d3 h5 G
  33.     CNY70();, `# `: c. R" K( p; }

  34. $ G8 v7 `" h3 {7 ?# x4 |  G; a
  35.     int error = ((int)values);
    5 D4 S. Z4 ^% C8 X- r( r
  36.     interror += error;& A- C0 |2 e& ]' t- b0 W
  37.     int lasterror = error - olderror;/ ?# s* X9 T0 P' G8 n0 g
  38.     olderror = error;
    1 Q9 ]. k" `: s9 P
  39.     int power = error / 5 + interror / 10000 + lasterror;. U" k- J7 p6 o8 f3 n5 {( X

  40.   D; t' e% i' p, `3 g
  41.     if (power > MotoSpeed)4 B5 ]" p) ]6 x
  42.       power = MotoSpeed;9 X' b$ T5 Z% j. s# w
  43.     if (power < -MotoSpeed)
    & \4 v0 o: [( |0 X
  44.       power = -MotoSpeed;
    : Q* I1 Q+ d# C  Q8 S" L. U

  45. # l/ W) D; k. S- c2 K" @
  46.     if (power > 0)+ F3 U( g$ N5 g  S
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。$ o, Q" O$ g4 o. W3 H( j6 n! t
  48.     else
    ) Z5 G" r6 n! g8 b. L- z
  49.       Speed(MotoSpeed + power, MotoSpeed);
    9 w. t( Q( R% Q: C
  50.   }
    / Q6 @9 \1 h% r
  51. }
複製代碼
. [- ?% H/ @9 ]' p

5 q. I9 v! I. w9 v- S, I. N; A
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-24 12:31 , Processed in 0.024465 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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