圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21810|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    & G  T3 u9 A& [1 x) l
  2. #include <Wire.h>
    ' e% c) G# m' ?$ n- ?7 U' q
  3. #include <Servo.h>' w9 I' P9 o# f) Q) w6 w! K
  4. 2 Q/ z+ m5 R' w
  5. #include "MePort.h"
    * |! ]! Q( m$ F: }' y
  6. #include "MeUltrasonic.h"
    8 {+ G- Y" o) {
  7. #include "MeDCMotor.h"
    * h5 }+ a% S) }% f
  8. 3 `3 I" X. v8 h: V, N: w
  9. //double Input, Output ;
    # r1 w" w3 Z9 p, L3 |& ]
  10. float MaxSpeed = 255;
    1 U2 p! t; p3 s8 r! j& e
  11. float MaxPower = 180;$ y0 \2 c/ D% K! @2 o( X
  12. float MinPower = 120;9 A, q( q! s; S: H5 l
  13. float Error,ErrorAcc,ErrorDec;
    4 ~* @% ?8 b5 N

  14. # D/ L# m. @! t
  15. float Kp=0.14;! b/ w/ {4 J8 [
  16. float Kd=0.00020;//23;4 z6 {5 b2 W' P/ J- q
  17. float Ki=0.000201;. u8 b. a! C( S! L" U

  18. 4 d6 q" Q% S8 z3 u
  19. float nPower;2 B% C. Z% e5 j" _. y8 ~0 ]
  20. MePort lightsensor_6(6);2 e/ x0 F; D0 b5 [
  21. MePort lightsensor_8(8);
    * ?  E7 o+ \7 k5 X
  22. MeDCMotor motor_9(9);
    + d$ V+ C" t* U3 R$ a" `
  23. MeDCMotor motor_10(10);0 I# U+ m8 Y; N' ]( c  @
  24. unsigned long previousMillis = 0;/ y9 V: H/ f' ^4 ^6 u  G6 |
  25. const long interval = 1;
    ; ]' ~; Q) p! `, q
  26. 2 h% h+ W# B' e+ C1 Y
  27. void setup(){# B  I) Q0 v) q; X3 K3 T
  28.     lightsensor_6.dWrite1(1);
    $ o8 d5 M! k5 e( h, s& Y5 O
  29.     nPower = 160;9 b* W7 g7 N* O. P
  30.     Error=0;
    ( e: a8 z7 Y4 h/ Z+ }4 v5 c
  31.     ErrorAcc=0;
    6 _4 M, z8 H; B. Q
  32. }
    7 w2 Y9 ~3 d+ E1 r6 s, b5 h
  33. 8 Y" w0 ?# K2 D0 V
  34. void loop(){% G" y6 L- V/ ?+ W6 _0 S; n3 K
  35.   unsigned long StartTime = millis();4 \& \' r* }9 t& h/ I) O* g8 X
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    . o# h& T# j* X) I  r* e! D% o
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    + x4 D7 E& z; D( ^) ~7 `3 }
  38.     ErrorAcc +=  nError*Kd ;
    3 V$ r" ~1 J1 c2 y
  39.     ErrorDec -=  nError*Ki ;
    ( M5 s% H+ g) K. Y& B
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);- I9 W& ~* T- H8 E8 O
  41.     if(nError < 80 && nError > -80){
    ! X( J) ~; B" V% |4 C; h
  42.       if(nPower < MaxPower){
    1 A7 _5 q! Z2 A! M! F& Q
  43.         nPower += 3;3 s/ J0 l( O) x% y: N6 S) [
  44.       }
    % D9 I6 V( L4 B9 c1 o
  45.     } else{
    0 Y) z$ O! y/ b6 h2 B
  46.       if(nPower > MinPower){
    + b0 \2 Z( ?7 R! `1 {' G0 a- t
  47.         nPower -= 2;- @7 J1 q* y. o( r- P
  48.       }) z6 ~% O8 }: S# b
  49.     } 6 ~1 A' Z5 F1 ~  S9 X' N
  50.     MotoL(nPower-Error);
    8 e( p: W$ n: X9 a5 m( Q5 g$ [
  51.     MotoR(nPower+Error);   
    7 j7 D2 X" N$ J. p$ V0 M
  52.   }else{, ^! v* v( X+ n, [5 J& o7 B
  53.     motor_9.run(0);- J& |8 n# v7 S2 e* E  J; I
  54.     motor_10.run(0);
    " U3 G" N1 f; Z5 O8 y; _( z' \
  55.   }. I  u' h. L2 K$ _: b! P7 B6 q
  56.   do{}while(millis() - StartTime < interval);; U$ W5 p/ Q! y' d5 N3 b
  57. }# w( z6 I9 q/ s8 f- M7 X; s) E

  58. ; f5 x! n8 F+ Z8 O
  59. void MotoL(int Power){
      S# b$ _/ R( M! l* _/ e
  60.   if (Power > MaxSpeed){& V0 e: y: I+ e# c8 |, c9 t
  61.      Power = MaxSpeed;
    1 ?8 }7 _7 v- M$ e
  62.   } ( [9 {! n2 Q' a+ V) h. `7 f1 n
  63.   if (Power < -MaxSpeed){7 U) m7 o* e  B9 @
  64.      Power = -MaxSpeed;
    , c; j. n- `) }+ Q$ U# P, ~
  65.   }
    1 f# H! A8 y9 H! P' Q
  66.   motor_9.run(Power);
    7 t5 W& @- E# A3 `9 y0 v
  67. }  
    " m* p. p3 m1 l
  68. ; ~/ _* C( A! |! ]+ }+ _! y9 W
  69. void MotoR(int Power){$ D1 F2 U) G4 E9 _# V! m
  70.   if (Power > MaxSpeed){8 W# F$ P: f! F/ e. s! D! i
  71.      Power = MaxSpeed;0 P- Y) `0 ^5 ~
  72.   }
    % V7 I& ]# p7 M% X* G' m: `
  73.   if (Power < -MaxSpeed){+ _3 ]! L4 n3 k7 e: j
  74.      Power = -MaxSpeed;1 k& Z5 C' C* c: G/ K2 Y
  75.   }
    7 e8 V4 M2 g; G8 B/ `( F' x
  76.   motor_10.run(Power);
    2 t% L$ z* \/ x" p) v
  77. }  
複製代碼
. X- @& ]; V9 O* I" F' o+ v
6 M' g. |& [2 f, f" ~. b
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
# m+ Y+ u4 Q9 o+ G, ]5 r' K0 I* X* u/ p; `  C
您好,不知是否能向您請教。: {" q, K6 b- y9 h, z% K  i
目前和宋修賢老師在處理Ardui Car
2 Y) ~# J. H7 x5 \# t) L$ G$ H0 Y雖然已使用較繁雜的方式處理了跑出黑線外的狀況2 P0 `  j) X; u: K3 D
( V' p4 M! |) J) z
但基於想追求更精簡的程式所以還是想請問一下" [; Q$ d6 P3 K! T2 {2 ]$ R5 h
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝0 s% N6 y4 B- O
不知道您是否願意教我可以如何處理
" v6 h8 j, h1 q* \* z
/ Q: w9 y8 {9 [+ {* o. j5 i( K# O1 D* n( i" l
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;: B# t8 ^" g6 A" r% x3 l: _) C, I
  2. double CNY70Val = 1000;5 \; K, @. ?7 m* u# i
  3. int interror = 0;
    , @' R( o" B% e6 Y$ N- w0 i8 r
  4. int olderror = 0;2 }- m5 N0 s) n" e
  5. double values;5 k0 N( D5 |3 j

  6. 7 m' v: P, v2 j3 l) c& z
  7. 2 o3 S+ M  t7 L6 n. n
  8. void CNY70()
    9 K1 q2 T5 r. [9 H7 F
  9. {
    4 u) S& {& _# ~& R- K
  10.   valuesRR = analogRead(RR)
    , t1 _. \5 M6 {) M) I8 E: [) ~
  11.   valuesMR = analogRead(MR);0 n/ S8 ^; I& m& X9 U7 H! W! W$ m3 x2 k
  12.   valuesMM = analogRead(MM);6 _& w1 ?( f5 M! G" T
  13.   valuesML = analogRead(ML);* w6 e* q. S! Y2 u8 U
  14.   valuesLL = analogRead(LL);, r* V2 F* r. v
  15. 3 z5 y; Q$ J3 Q3 \) e9 j2 A
  16.   if (valuesRR > CNY70Val)
    0 ^1 {# w; V8 s" L1 x5 @7 Z, A
  17.     valuesRR = CNY70Val;" J1 u) l8 g& g# w1 r" }" o
  18.   if (valuesMR > CNY70Val)
    ' n( D4 }) k: O
  19.     valuesMR = CNY70Val;+ G; T# [. [4 R: x, w1 e4 R
  20.   if (valuesMM > CNY70Val)7 c9 G; N: V7 f( W2 B4 J
  21.     valuesMM = CNY70Val;
    , D! ~% R5 r6 J) m
  22.   if (valuesML > CNY70Val)
    ; E: C  W/ O/ x9 s9 M7 X0 g
  23.     valuesML = CNY70Val;
    # R: a7 |& \0 ~; v! C
  24.   if (valuesLL > CNY70Val)
    ) O8 v6 v7 ]2 d  y, ?) k% E
  25.     valuesLL = CNY70Val;
    1 \* W. `4 L6 M& P( T
  26. 8 b* t0 s/ w6 g
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    8 l$ N$ m. H; D- C0 S: @
  28. }
    4 t- O" b) N  Y- Q

  29. . l$ N* G. N& o1 R: V
  30. void Car()5 x( I9 z: \9 e# ?: u, S
  31. {
    / ]# F, h4 z& h6 E7 H! T3 P
  32.   while (1) {
    4 S" t& _7 ^( Y/ y! N/ R
  33.     CNY70();7 k& g: x7 ]! a, U6 @
  34. 0 O7 U& q. M! x3 v; O, t( R/ l2 a! P
  35.     int error = ((int)values);6 Z8 R% |9 _& p7 p8 l
  36.     interror += error;+ u2 _1 O3 a6 w' x. d
  37.     int lasterror = error - olderror;0 _9 H2 u$ A6 k  E  q, G, w
  38.     olderror = error;
    & V4 K0 x2 ]6 \% w+ n! i: |1 H$ }
  39.     int power = error / 5 + interror / 10000 + lasterror;5 G/ o# N) ^6 k% O: B  B2 w- ~

  40. $ _4 m: }- R+ }2 _+ o
  41.     if (power > MotoSpeed)/ v7 d9 j) d/ @" [& j. F
  42.       power = MotoSpeed;
    1 L& f1 r* M1 l1 \% s
  43.     if (power < -MotoSpeed)
    5 O: s/ w! L+ H  t6 E8 c
  44.       power = -MotoSpeed;
    & d2 T4 s" r+ r+ H3 B; _

  45. 5 k" P! [6 R+ ?( q
  46.     if (power > 0)
    7 u2 m4 J1 W, P+ P! R8 r
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。7 m# [; b. W# ~. R3 [9 Q
  48.     else
    - y* p; T) X0 {1 @4 P
  49.       Speed(MotoSpeed + power, MotoSpeed);
      C: p% }/ S) Y
  50.   }8 `9 Q" i9 |7 I- ?
  51. }
複製代碼
9 P6 @+ [5 c# f, P( i$ Q
6 }7 Z3 X: ~; C  W7 c# n
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-2 20:17 , Processed in 0.024698 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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