圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 18602|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    * V- C" Z$ V5 f( C* P3 G
  2. #include <Wire.h>% [: f+ Y; w$ L) i! i
  3. #include <Servo.h>
    4 s" P9 j; {, y7 @
  4. 9 L& Z8 E, Q# `- \+ @8 p/ Z1 [
  5. #include "MePort.h"
    * b1 r: Y4 e" s: E9 e+ r1 q
  6. #include "MeUltrasonic.h"
    4 }4 Q& L$ O1 _* k! K
  7. #include "MeDCMotor.h"
    - ~5 i/ \/ S$ o6 @. ~

  8. ) ~* b  U' M8 a/ f+ ~
  9. //double Input, Output ;
    " c2 t2 }3 C2 U. x
  10. float MaxSpeed = 255;
    ! L7 [  }. \: u1 D( t& K
  11. float MaxPower = 180;' k+ X7 C: J( {
  12. float MinPower = 120;  f5 e; a2 H5 c3 T# h5 I
  13. float Error,ErrorAcc,ErrorDec;. k5 @6 i& |+ a) V- w8 C5 F

  14. 3 ]% S- Z2 p% _* W0 L
  15. float Kp=0.14;: u8 E( l. l9 @9 z  O
  16. float Kd=0.00020;//23;
    ) u- F$ k$ c6 d" ~& I/ Z5 C
  17. float Ki=0.000201;. g+ w2 m2 v; x9 Z' ^

  18. 0 X/ s& M0 V! X. N6 t! b
  19. float nPower;
    5 e" w  r, B, L1 N. c* G
  20. MePort lightsensor_6(6);
    ' u/ y% V1 u9 ?8 P* c/ c
  21. MePort lightsensor_8(8);& j4 |( z% p( ?+ U$ b- V
  22. MeDCMotor motor_9(9);
    ( C" P: k7 |/ |3 U- S, |+ c1 N
  23. MeDCMotor motor_10(10);' U- {; B- E  `( I0 i
  24. unsigned long previousMillis = 0;
    6 l% _# M' y0 m* Y3 `1 U  J
  25. const long interval = 1;
    + P7 U* a( D% \/ E- Q& M  S! R3 ]
  26. 9 a  Y6 L+ G. m  Q! W
  27. void setup(){
    ) B+ D; Q1 m% y0 v7 H
  28.     lightsensor_6.dWrite1(1);- I0 `/ a1 X6 e
  29.     nPower = 160;1 t  Z5 z$ S+ R0 K( w# K
  30.     Error=0;
    ; u# z1 k/ R0 Z% T
  31.     ErrorAcc=0;% t# O- s) U1 ^, j6 @1 j
  32. }* _: ^1 m  Y! l  k  ?
  33. 5 H0 s& u# a! y7 W7 N. {; K
  34. void loop(){
    0 z9 {/ H0 d2 l  N
  35.   unsigned long StartTime = millis();
    . m0 [2 i$ y0 T2 G' g+ p
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    , I. g' w/ _. K- X9 j: _
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();, G) @' r' Y1 i+ H( }+ r1 t
  38.     ErrorAcc +=  nError*Kd ;9 y; P) N# z5 C3 W1 _' W
  39.     ErrorDec -=  nError*Ki ;8 |# ~/ f% N3 ?+ V  d3 h7 {9 k
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    9 f0 h% X2 M! ?; c; x
  41.     if(nError < 80 && nError > -80){" ]" Q0 z% x+ k
  42.       if(nPower < MaxPower){  N8 n" i6 c9 V* d  s* w' v7 A
  43.         nPower += 3;; L! M8 n( D# K5 H+ O  }( C
  44.       }( z1 G# r6 A6 v+ q5 k! A' E! }
  45.     } else{
    6 l# k7 @- t* G2 I6 K* v) m& q# G
  46.       if(nPower > MinPower){) H; C, I5 I+ m$ e( B
  47.         nPower -= 2;
    , x$ u, [& w! j: ]
  48.       }, Z; T: |" I2 O8 a/ E
  49.     }
    0 d" G. w( F$ J" e6 Z- r
  50.     MotoL(nPower-Error);" G' b% ~* s& V( K
  51.     MotoR(nPower+Error);   
    ( x# y+ }$ ^* \- L# \
  52.   }else{
    ) C& t1 j' K* \- M' ~3 i
  53.     motor_9.run(0);
    : l& R9 p+ W( K! _3 f
  54.     motor_10.run(0);
    0 T, J& p  R- k1 I. {! t( b
  55.   }
    % Z, K* \7 X/ P( p% u
  56.   do{}while(millis() - StartTime < interval);* Q- H6 P: ^0 ~0 A3 Y
  57. }
    . q9 ^8 U2 K* P8 [- {( \
  58. 7 q, x- K9 i9 r# u; W% ^
  59. void MotoL(int Power){
    3 J9 \6 s8 [. k' y8 L! p# _
  60.   if (Power > MaxSpeed){* j$ X8 c9 Z7 B7 P
  61.      Power = MaxSpeed;
    3 r! `. u. E3 I. o5 |3 S
  62.   }
    ; G: I" `$ {6 q& ^) c* \" X
  63.   if (Power < -MaxSpeed){3 {) p) ?8 S) X; L/ P
  64.      Power = -MaxSpeed;
    1 }# H5 ?- \6 x4 m( k5 \
  65.   }
    2 C% _6 d  j" u  J% w4 E
  66.   motor_9.run(Power);6 R( z0 z1 a% H% t) J/ k5 s4 ?
  67. }  
    # g8 r- ^* H8 F5 Q
  68. 7 M, K3 J/ b* u4 M
  69. void MotoR(int Power){7 u& H9 E" _) x' i# m' |
  70.   if (Power > MaxSpeed){
    / \2 x1 D/ [/ }4 u9 B0 g6 z) b3 a
  71.      Power = MaxSpeed;$ z( X( s/ n+ i  D% h6 g
  72.   }
    ) K# C2 w9 m4 _% R
  73.   if (Power < -MaxSpeed){
    + O& {: q! Q. Z+ H6 B: h
  74.      Power = -MaxSpeed;
    ! g. T# b4 d, z( l9 w
  75.   }
    6 L6 @/ d2 Z6 h5 s: a& }
  76.   motor_10.run(Power);
    & N  B) F  u+ [+ k$ J# E
  77. }  
複製代碼
# f3 c& V' G+ R$ Q! \1 {
- N; ~# A. ~! X6 J0 a  ~
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
; D& x+ {. Z) }+ `- L$ G
+ e: v' H2 Q; V! p$ \' x4 N3 b2 G您好,不知是否能向您請教。
& K8 {# K' X) F: O. Z/ p; W目前和宋修賢老師在處理Ardui Car2 ?7 D7 t' \8 Q$ c1 v/ T" l
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
- Q/ M6 a! V. x* z5 \. r
' i  w+ u7 z- d但基於想追求更精簡的程式所以還是想請問一下
- h- k$ {% D- g# T* [) Z就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝$ N9 V8 p; a8 O9 |% L" t7 Z. S
不知道您是否願意教我可以如何處理8 h" `, |, l9 R! q' \
2 m: t5 n' n( r1 F0 \0 _, q
3 a* G6 F, A9 D: F8 X& E; j
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ( [. p- J7 k+ k* i& B$ \
  2. double CNY70Val = 1000;( R) t" B* M" q9 W  v7 \- e
  3. int interror = 0;" r! v: b. _& m
  4. int olderror = 0;; E8 S$ f# C; f0 h) N
  5. double values;
    ( R  z3 f. K, L# C% [: I/ V
  6. ' p, [9 ]+ U4 G& }

  7. - C3 H* J6 j8 x- L: f3 `
  8. void CNY70()+ @% @" i% t3 ]+ O+ {
  9. {
    9 Q7 O2 b2 N! g2 k8 m7 n
  10.   valuesRR = analogRead(RR)6 \. i" F0 p+ ?3 e  q
  11.   valuesMR = analogRead(MR);
    $ v9 O2 G/ i" W8 X5 ~
  12.   valuesMM = analogRead(MM);
      L, h' ^0 N) I' `
  13.   valuesML = analogRead(ML);9 R6 w! o( f* i" E3 U% P9 `
  14.   valuesLL = analogRead(LL);
    8 j- ]* w) J0 p9 W3 D

  15. 1 Y$ u! @8 g$ ~" o
  16.   if (valuesRR > CNY70Val)
    " `0 E5 n  q. f" y1 y) ~
  17.     valuesRR = CNY70Val;
    5 W5 N$ X5 D4 F/ Q1 {' Q7 t
  18.   if (valuesMR > CNY70Val)% n2 o# M* a! O& x+ |
  19.     valuesMR = CNY70Val;
    - \5 U( O' m- S% p3 K
  20.   if (valuesMM > CNY70Val)8 L. z# Y- I" ]6 Q
  21.     valuesMM = CNY70Val;
    * z2 l2 F9 c( f* p1 l# `! W1 v
  22.   if (valuesML > CNY70Val)
    9 l$ g( f- T( T( }: R
  23.     valuesML = CNY70Val;
    - K0 x; Q8 W& U# S* w  q; h, L
  24.   if (valuesLL > CNY70Val)# m. \0 i1 p! s6 z4 `
  25.     valuesLL = CNY70Val;
    , q, c: Z4 @- }
  26. 7 n1 }, ]# {- h) i3 W$ `
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;( l0 E+ _# v0 F$ ~$ w* k* Z; |
  28. }1 k+ J! h+ I8 L1 H

  29. & h% k7 l4 h- a8 `. E. r
  30. void Car()1 A1 u  p; O/ Y8 L: ^2 G
  31. {
    5 z# U" V/ g: A* O, Z2 u
  32.   while (1) {6 f( K8 |9 j* t  d
  33.     CNY70();
    9 k0 D1 w9 @! K$ X

  34. * |3 O$ G2 u  g0 S4 H4 l1 @5 d
  35.     int error = ((int)values);0 F* g* }( Q0 ?1 K: s
  36.     interror += error;: a0 V* n3 _$ _- B5 \3 J
  37.     int lasterror = error - olderror;3 o1 m& Y  X: k, ?4 @. v
  38.     olderror = error;
    ; X6 O) ~# S. [' A1 r- v
  39.     int power = error / 5 + interror / 10000 + lasterror;
    , U/ B8 L" v& g1 g% _3 A

  40. 0 T- z7 P1 a! i2 g  E
  41.     if (power > MotoSpeed)
    " G& U; ]6 Q/ [' `# _" [4 z
  42.       power = MotoSpeed;( F  J( j7 U, @1 u/ D5 e6 u! P, G
  43.     if (power < -MotoSpeed)) u" y! H. R3 e4 C* D
  44.       power = -MotoSpeed;
    7 N7 I8 z* d" f: I

  45. ( x/ R& C+ R2 [- {; [* _% E( @) ?
  46.     if (power > 0)
    + @& J3 U1 }7 w* R, k2 M6 [
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。1 |: ]0 g) Q2 `) R2 i
  48.     else
    ' L; J* v4 C( t( x- J
  49.       Speed(MotoSpeed + power, MotoSpeed);
    . C+ k& e8 P! \- N# p' V
  50.   }
    * m9 U% w2 |+ G3 X8 t
  51. }
複製代碼
5 g% z7 a7 I& Q* Y% A
$ m# O- C6 D0 z1 Q: Q3 U8 T
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2024-4-26 08:59 , Processed in 0.024259 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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