圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21720|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>/ l- Q: A; b1 s" |( }
  2. #include <Wire.h>  x/ A& @+ `" e6 h1 s
  3. #include <Servo.h>
    ! R+ t9 o# i* c( _- K2 `
  4. ) W0 r& C$ l6 P! B# t( u6 Z
  5. #include "MePort.h"
    ( |! w5 O/ Z1 ^- W) r, n& n
  6. #include "MeUltrasonic.h"8 h& c) U; _, x; B: D/ t* \
  7. #include "MeDCMotor.h"
    4 o+ o6 Z% w# l0 t: w
  8. $ L' X& P; Z7 g. {7 c
  9. //double Input, Output ;
    ! M! ~2 u; ^" z
  10. float MaxSpeed = 255;2 v' X& o6 S! J& }! Y3 B" d6 V
  11. float MaxPower = 180;
    $ }. x1 Q& v4 x3 x( a, O" g
  12. float MinPower = 120;
    8 R# c' ^$ t3 t3 F
  13. float Error,ErrorAcc,ErrorDec;
    8 f( t/ A! l, P! X- ?+ v

  14. $ a8 m7 _7 \4 K# a
  15. float Kp=0.14;
    ! }3 `4 i( f* F3 K/ \
  16. float Kd=0.00020;//23;
    + z! p$ w/ {0 Z: A; `  C
  17. float Ki=0.000201;6 S& W  |: Y7 ^( U8 y

  18. $ ?2 t& j5 w( J+ U5 t! K  K/ S" l: Y% a
  19. float nPower;
    . I7 M; z4 p' x; v
  20. MePort lightsensor_6(6);
    0 b( J/ {. y) l6 R
  21. MePort lightsensor_8(8);
    ; l% S* M- A, `) e/ d
  22. MeDCMotor motor_9(9);
    ' X5 }- G. i6 e7 x8 Z' k
  23. MeDCMotor motor_10(10);% ^& S  p' Z. o8 `- L* \
  24. unsigned long previousMillis = 0;
    1 ]# c! q: T) L5 G7 v/ Z6 N  h
  25. const long interval = 1;
    8 a' \$ A+ A" ^8 s/ Z% _

  26.   ^/ o. l) I$ t4 q; X' i# N) P
  27. void setup(){
    % k( F" Y) s: A
  28.     lightsensor_6.dWrite1(1);
    7 V( `% V: }! a- P2 ^3 Z
  29.     nPower = 160;
    : g( d: h9 f2 N  \) \, c
  30.     Error=0;# F% I, ~" q" z4 K9 H
  31.     ErrorAcc=0;  U3 t1 m6 |. B. S, \, B
  32. }' E% t0 x& u/ P* _
  33. ' O  f6 C; ?  \4 p& _
  34. void loop(){
    * X3 z# f) M! g6 y
  35.   unsigned long StartTime = millis();
    - D' e3 S  J8 y8 v9 u8 [2 u6 y
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    ! ]0 r1 o: ~3 `2 u
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    % u) f8 O8 _' b! Q0 h9 Q
  38.     ErrorAcc +=  nError*Kd ;
    9 C7 E& B; e* g% |
  39.     ErrorDec -=  nError*Ki ;  N  H8 n' _. ^; ?, r
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
      D& P+ q3 ]  Z2 w# c# ?6 A$ `7 ]
  41.     if(nError < 80 && nError > -80){- h4 N4 k+ _5 ~
  42.       if(nPower < MaxPower){+ k- p8 q, E& [6 r% M$ w" B
  43.         nPower += 3;
    4 `% E, `# p+ U. T" J
  44.       }
    , z: \# E" S8 z& k
  45.     } else{
    : y8 y% |+ [' b' R8 x" O
  46.       if(nPower > MinPower){
    * h1 p: e$ }7 q1 Q) Z" `8 U
  47.         nPower -= 2;
    . `& R. R: f; o" j( d
  48.       }
    * f) [$ `" o1 c! z2 }4 Q
  49.     }   z" `+ i3 d% y/ B' n7 L9 b* m
  50.     MotoL(nPower-Error);4 G) k, z6 w$ l4 O# X1 @; d* x8 L  y
  51.     MotoR(nPower+Error);   
    5 U( c9 ?+ {1 S+ m/ P0 J
  52.   }else{$ Q. i; s* _/ ^; g+ S3 [( p* K9 x( l
  53.     motor_9.run(0);
    5 z! ^, I3 j4 h4 _+ \' b& \
  54.     motor_10.run(0);
    - m' |$ q2 ]/ N3 a; E
  55.   }
    9 u' [3 B& R) }  ]$ o6 b7 U2 F
  56.   do{}while(millis() - StartTime < interval);) X1 C4 }. N& `1 W% _* n% f) }
  57. }
    9 R$ Q: P( R$ f$ \4 c9 e3 l

  58. 4 O" w2 j; m9 r+ K  s' A- |
  59. void MotoL(int Power){
    ) V' M5 \  s0 A0 o: n
  60.   if (Power > MaxSpeed){
    ; d, |( t2 s2 m* E! l9 K9 E* [
  61.      Power = MaxSpeed;# \  e  O2 c; N
  62.   }
    " u, E: V( p- c( E- T5 N
  63.   if (Power < -MaxSpeed){; P3 s: K0 Y+ h* \$ W! @2 n8 F
  64.      Power = -MaxSpeed;
    ( a; m' A! Z) K" T
  65.   }
    " z% j: J: A! [) h0 |
  66.   motor_9.run(Power);
    , [2 F% @6 j  o+ s
  67. }  
    # j4 U' P4 L0 J
  68. ) h3 R* ?0 S4 ]+ {' W
  69. void MotoR(int Power){
    5 |0 p4 G0 {  L9 a8 T
  70.   if (Power > MaxSpeed){8 V9 L2 \: _/ Y# O5 o( G$ V+ E
  71.      Power = MaxSpeed;' d3 T& l9 H' L' e
  72.   } ) B( ]( A% T/ M, c* e; I9 s' X& U
  73.   if (Power < -MaxSpeed){
    2 R8 N  d% k! J& V1 Z# U; E
  74.      Power = -MaxSpeed;
    # R2 F' a/ ?' n# u/ j
  75.   } , N* p* B% D  Z! }5 E- r
  76.   motor_10.run(Power);4 c' p9 o9 D: G6 u0 y& l" |
  77. }  
複製代碼

( J- R2 j( r  W7 V
7 u% J$ {$ C$ l
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 - q' }: v. b$ P& h6 _% \  Y) B
4 ~. a; D" L: \
您好,不知是否能向您請教。
' I8 ~) h0 ^2 {6 y. _8 \$ c7 u目前和宋修賢老師在處理Ardui Car
, v! [! b- X; t雖然已使用較繁雜的方式處理了跑出黑線外的狀況
$ s1 ]: |% b! I# D$ a1 }( O6 ?
# X: X, J5 ^4 S/ n但基於想追求更精簡的程式所以還是想請問一下9 O. N2 b% Y) B( v
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
/ Q9 L5 R7 i- t) B4 a! A5 b不知道您是否願意教我可以如何處理  j. G% j; t- ^9 C# G
4 |, J% K1 z6 b" t) j- U) u6 K
! F  ~$ y) _3 C  T, t( C  `7 g- Y
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;: ^1 B1 Y3 {, `/ t/ T( }
  2. double CNY70Val = 1000;' H9 c  k) C; U# W, I
  3. int interror = 0;. W" Y7 L( t1 [) }: Y
  4. int olderror = 0;
    / G+ w4 _8 h$ X. {$ r
  5. double values;
    1 P8 V! S5 J& ]+ r4 ]) e( e" r

  6. 8 p" T8 T6 u1 v4 j

  7.   w( Q) t, n4 z+ T& v
  8. void CNY70()
    + p( A0 T; a7 t; @3 v+ V
  9. {( X# `& D$ D1 Y" C* M7 B# K# j! o
  10.   valuesRR = analogRead(RR); T$ m6 Z9 Z/ n/ `+ o) a6 t
  11.   valuesMR = analogRead(MR);' _" t- @  m3 X+ q2 Y6 d
  12.   valuesMM = analogRead(MM);6 w% [4 S) d5 f
  13.   valuesML = analogRead(ML);
    , N+ [0 b+ Z) l1 i% E% ^7 X
  14.   valuesLL = analogRead(LL);# Y1 q* h6 V" @5 |7 Y! L- ]
  15. 1 S; P- D% `) m7 Y, d5 T
  16.   if (valuesRR > CNY70Val)
    4 `# @# f3 r) j% ?" ~* g
  17.     valuesRR = CNY70Val;- [% g. L: S" ^! `# L. T
  18.   if (valuesMR > CNY70Val)0 f5 Q* e9 s7 E( K
  19.     valuesMR = CNY70Val;" b; K% c6 h& N" d$ G
  20.   if (valuesMM > CNY70Val)
    1 ]( Q9 F) `! c& D; Y
  21.     valuesMM = CNY70Val;
    # \" @+ h6 I6 l7 ^
  22.   if (valuesML > CNY70Val)( [9 n! X. T  b
  23.     valuesML = CNY70Val;: L3 q$ C5 c8 o) b' R. q
  24.   if (valuesLL > CNY70Val)( D7 c# s% P0 H: m* D/ U
  25.     valuesLL = CNY70Val;
    " E# v7 z* f) I- U# j% u2 f2 w
  26.   M( P$ g* w( J
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;. \: ]0 K1 ^* v
  28. }0 d  u% n( e* x7 Z' U% y
  29. 7 h) R" U# i9 n0 |" i! [
  30. void Car()4 O/ X0 E, T; s* \0 r
  31. {# M/ x; A- ]0 ^- `" @3 f: Y
  32.   while (1) {
    ; S" R: h$ c6 x+ ~9 E! G, ]* m
  33.     CNY70();
    $ y2 I# m' s1 F
  34. 6 X, B6 U; u3 `, {$ i9 I# {
  35.     int error = ((int)values);
      b& ^! m( X3 z5 v" X; [
  36.     interror += error;
    9 j  e/ N" x0 Y0 @* }
  37.     int lasterror = error - olderror;
    0 S' q( T9 [' C$ M0 `0 Q) }
  38.     olderror = error;
    " ]7 s. X& n. ]& t- H
  39.     int power = error / 5 + interror / 10000 + lasterror;7 M) U0 a+ a0 }, Z

  40. 1 f0 ~( W2 I' J4 I( _4 a
  41.     if (power > MotoSpeed)
    / ~2 ], u2 n& u% i$ X
  42.       power = MotoSpeed;
    1 n( Q+ j( M' \3 y/ Z0 ^/ `
  43.     if (power < -MotoSpeed)7 \0 u4 X9 V+ o/ b- \) a
  44.       power = -MotoSpeed;5 A+ ?) p. K& Y5 e5 a

  45. " p5 N) j9 L5 j# |7 F
  46.     if (power > 0)
    9 f( g$ r1 G6 R) L7 y3 @6 b8 p
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。  J! B) C" c1 `) h
  48.     else- ?" Q+ f9 h1 ?+ f# b$ ^
  49.       Speed(MotoSpeed + power, MotoSpeed);
    7 w' Y. d' A, j1 ]- ^1 }0 U6 x
  50.   }
    / ?* @6 ^* @# o
  51. }
複製代碼
3 H; F7 h+ @6 T# `

: W% p$ h' Q) P
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-26 19:36 , Processed in 0.021594 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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