圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21825|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    : D& Z: ?0 Y0 O- Q4 j2 Q
  2. #include <Wire.h>
    2 b$ U* y# U1 `4 U  C
  3. #include <Servo.h>- U$ s: \7 f9 h; H' H# m1 j
  4. 0 o7 Y  `* ^: g1 s( k
  5. #include "MePort.h"
    5 D+ i* Q. N5 ~( X) n* n: j
  6. #include "MeUltrasonic.h"
    2 |' n  H0 _) k" R4 \' N, ?1 p
  7. #include "MeDCMotor.h"
    & a+ F2 m" K$ S6 z1 g

  8. & B; D- |& d' a$ Z) b! G- H
  9. //double Input, Output ;( [. ~  N/ Y# O9 z
  10. float MaxSpeed = 255;
    2 G' n! v# r: d2 I# v
  11. float MaxPower = 180;
    & e/ |1 p( B" g, Q5 _
  12. float MinPower = 120;" x+ k: {% J( E5 b! c# c" N7 N
  13. float Error,ErrorAcc,ErrorDec;2 o* [  Q; y5 ^. ~8 h
  14. - P2 A5 d+ g  \+ G% W' N- X! z
  15. float Kp=0.14;$ M# v8 U, u' ?
  16. float Kd=0.00020;//23;  [1 B6 q& y9 y. ?9 z: V4 }
  17. float Ki=0.000201;+ b- L- U* N& M; c0 R( J
  18. ' F' s2 N8 l5 K. Z
  19. float nPower;
    $ S/ L% x; L( d6 g1 P
  20. MePort lightsensor_6(6);
    # `. q% g: F* S" c* Q3 {
  21. MePort lightsensor_8(8);- M  R- k7 m: }5 z, R
  22. MeDCMotor motor_9(9);8 I3 l4 [. `  h- b2 [
  23. MeDCMotor motor_10(10);
    9 T7 z3 z; ^- {- I! S: k
  24. unsigned long previousMillis = 0;* K2 _' O$ |" p- z8 K
  25. const long interval = 1;
    $ t0 B& Z6 d- t
  26. $ t' w2 b. D' v) E
  27. void setup(){% p. y: j( D5 y$ U: l
  28.     lightsensor_6.dWrite1(1);
    $ w/ Y$ w$ ]; |$ L- I$ F: ?, X
  29.     nPower = 160;
    / Y2 D# U! J. k, {6 f
  30.     Error=0;
    / G" Z. d5 G/ H: R
  31.     ErrorAcc=0;
    ! T+ G3 H9 H. {) P# g( {% n* `( T. ?+ H
  32. }
      \, N% A% }( o+ I

  33. 1 ~9 L3 p4 L5 s$ F4 W1 ^
  34. void loop(){+ g& D, \$ V: M1 v! b' A4 g7 S
  35.   unsigned long StartTime = millis();
    % e) \4 e8 H+ S3 u  \9 {
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    / D7 k5 F3 i  J
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    2 M4 s9 _- P: L2 D5 }
  38.     ErrorAcc +=  nError*Kd ;
    6 B, F# X! T# K. ]2 A/ j5 w2 Q1 {
  39.     ErrorDec -=  nError*Ki ;% W8 g8 J/ f' O
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);, a  y, v- v7 J: J+ @
  41.     if(nError < 80 && nError > -80){
    2 A+ n) i2 f0 T
  42.       if(nPower < MaxPower){
    : X/ Z, ?& W/ A3 w
  43.         nPower += 3;$ I3 B3 }$ q; z( b6 V( V) B4 m: f
  44.       }: k' Z9 o' Y( ?3 Q$ W! }! @
  45.     } else{- K8 D; p& x5 \* d  F
  46.       if(nPower > MinPower){
    6 S, h7 a* N* ^( Y  L3 J3 w
  47.         nPower -= 2;7 N9 g" f$ ^& ]$ W/ N. G! k
  48.       }
    7 m) s0 E/ w! x
  49.     }
    * _3 C& A/ O& V  p) }3 s
  50.     MotoL(nPower-Error);
    , O1 A" T" q3 m% p5 D  P
  51.     MotoR(nPower+Error);    # t$ l% @6 e- a% d& z, M
  52.   }else{2 z% t  S7 J9 j, a0 d: v7 e7 h
  53.     motor_9.run(0);) R9 A; t& f, J* d# W4 b! i
  54.     motor_10.run(0);" e5 a9 t/ V, V) N* K$ T
  55.   }  A4 j" V8 [. M  e$ I; d! `% y
  56.   do{}while(millis() - StartTime < interval);3 `2 e4 u5 A2 h0 X, r
  57. }- {1 W; ~$ ?8 t4 [% b) V0 G
  58. + I$ R9 z+ C3 ~& g7 c
  59. void MotoL(int Power){" m2 A) m0 q1 q
  60.   if (Power > MaxSpeed){
    , `  d- _0 {9 `. J2 g& q9 L
  61.      Power = MaxSpeed;! A% N. k% r( }. N4 f
  62.   } 7 ^  `: o  d/ S" p# P
  63.   if (Power < -MaxSpeed){
    # {+ X; G# C& w( Y: r% N( m$ y
  64.      Power = -MaxSpeed;/ A- z4 T- b8 C, _! |
  65.   } 4 u& d9 H- y& ^3 _
  66.   motor_9.run(Power);" v$ V* d! g$ c, M" u1 b
  67. }  
    ) g) Z& V! A' u2 d# ]" _; I

  68. 1 C  t- B4 d8 s  _1 S5 S+ F
  69. void MotoR(int Power){
    1 F. q$ b! E) N- F$ R5 ?
  70.   if (Power > MaxSpeed){
    9 {6 s5 V; s. [$ M& u9 i
  71.      Power = MaxSpeed;
    9 b& `- R8 L3 c- a! i
  72.   } 0 Q- i# c, @! x* ]+ f: ]  B. l
  73.   if (Power < -MaxSpeed){4 }! n1 ^5 R! y/ O0 b: M/ C  q
  74.      Power = -MaxSpeed;  H/ c# D, c* s0 d1 x# w( e* e
  75.   }
    : f! f9 t/ N, Z0 N$ X0 M; {
  76.   motor_10.run(Power);. P) Z" j0 o7 F* g& I( w
  77. }  
複製代碼
3 z, A$ a: n! ~2 Y1 p! w+ r

- C; `- ^3 g" M! [# ?
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 5 P' l" L5 n$ \

5 L! O, P5 \) f您好,不知是否能向您請教。4 i9 \8 D! r4 p+ c
目前和宋修賢老師在處理Ardui Car
8 W7 B4 m! V( K1 D: R雖然已使用較繁雜的方式處理了跑出黑線外的狀況
) }& T" s  E4 p" D( C  E" g+ N% S1 r; f5 U
但基於想追求更精簡的程式所以還是想請問一下
1 h/ J' }0 v. i% a2 b7 v; N1 F, n) H  J% C就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝& s7 Z  \/ x2 v- n  k, \" |
不知道您是否願意教我可以如何處理
9 S: ?5 e7 \+ ?) }2 T% W8 }2 E- U. k6 r8 b
$ F7 `- c, v# d
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    7 h4 j+ b7 m3 B
  2. double CNY70Val = 1000;
    % W) f1 _+ G( S; E5 V
  3. int interror = 0;
    + E- v, O  P* V' C
  4. int olderror = 0;
    . y9 C8 @- A) z$ C8 }8 I, l9 {
  5. double values;6 d6 h4 A7 y, S+ @

  6. 4 |* G1 R1 b! h% x# }7 [* H0 `
  7. / k+ D, g2 q1 _; C4 @5 Y7 Y
  8. void CNY70(). f" w# L1 S' ~! I
  9. {9 m5 E3 [9 X3 y% k+ X: s
  10.   valuesRR = analogRead(RR)! V5 ^# y* J) q+ u/ s: c
  11.   valuesMR = analogRead(MR);
    ; E" v, q1 K, X7 s6 g+ i0 j, A
  12.   valuesMM = analogRead(MM);
    7 g8 d6 [! T6 J& D+ \; i0 a) E  y
  13.   valuesML = analogRead(ML);" P& n6 t! L3 B7 i' W
  14.   valuesLL = analogRead(LL);  c1 @# ?( F/ N7 m5 I  r

  15.   O5 H. ?9 }+ Q9 d( ?1 w- X% D  T. m
  16.   if (valuesRR > CNY70Val)
    ' U7 ^' k/ V! k& r3 t) o+ k
  17.     valuesRR = CNY70Val;
    5 G; T6 s+ z' }0 T
  18.   if (valuesMR > CNY70Val)' F7 L7 g: u( G+ b$ O) E( j
  19.     valuesMR = CNY70Val;
    7 \4 C7 Q* p" o1 ^
  20.   if (valuesMM > CNY70Val); H% C/ K. t, p7 u' e
  21.     valuesMM = CNY70Val;
    3 D6 _9 [- ^2 l; F- M! L
  22.   if (valuesML > CNY70Val)
    : O: ?7 W: S( I. W/ C* ]
  23.     valuesML = CNY70Val;
    / g5 H; {+ L6 R
  24.   if (valuesLL > CNY70Val)
    / q  k% P9 i& c, ?) R" i9 m+ O3 P
  25.     valuesLL = CNY70Val;
    " ]) ?" b% i6 H' }) W) J
  26. $ k' W& `/ e& N1 A- l1 A
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    7 P' S* Q/ `' ?3 X- w+ s
  28. }
    3 J9 o& J8 g- N. F. Q' Z
  29. + Y* W4 z4 A/ d
  30. void Car()
    0 t# N8 L, G, z; H% j
  31. {9 L( ~  T4 H5 _7 N
  32.   while (1) {: d7 m# M: Y% U4 v
  33.     CNY70();! o7 S, k" C) u* w1 }

  34. 2 O' t5 _" ?) w
  35.     int error = ((int)values);5 ]3 W& c6 Z6 R
  36.     interror += error;
    7 I% O. F: V1 O2 W9 L( |0 d
  37.     int lasterror = error - olderror;
    : K4 Y& E4 v2 T  F5 u4 x
  38.     olderror = error;
    : U7 e( ~5 w! ~: G% c, m
  39.     int power = error / 5 + interror / 10000 + lasterror;% a7 O* b) F. F( \) V. m# t

  40. ; H- q7 [, k" d  r7 G
  41.     if (power > MotoSpeed)# y7 z: |+ O1 s8 }8 n
  42.       power = MotoSpeed;; v/ {; ?! O4 K% J1 j
  43.     if (power < -MotoSpeed)
    ' i% z' W5 b$ y( t4 d* C: M7 V" H" `8 V
  44.       power = -MotoSpeed;
      u* z' \, s( Z) T" ]% X
  45. 1 C1 {6 v3 C% \% [
  46.     if (power > 0)
    . ^& T& f2 C* f9 w* Y5 j
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    + D5 I- Z* R. H1 w! c+ P/ Y! D! h
  48.     else" a+ j( q! `* o
  49.       Speed(MotoSpeed + power, MotoSpeed);
    , n. O' s. p0 K7 Q5 s; s
  50.   }' x8 C7 V: f" |3 Y3 {4 q  I
  51. }
複製代碼

, o( k& D; ?# o$ D0 \  G. i; x- i* @0 L
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-4 03:41 , Processed in 0.028262 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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