圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21575|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    , G( Y: u. M$ X
  2. #include <Wire.h>
    + |) T9 P8 V; J# C3 r; J* B
  3. #include <Servo.h>
    4 e, p4 m$ i1 ]' F" z) }7 g+ H) \
  4. ! N' }" g9 @9 ^. M' b5 ~
  5. #include "MePort.h"9 K/ D4 t3 b6 m
  6. #include "MeUltrasonic.h"
    ) R+ z- {, o& f2 a7 |
  7. #include "MeDCMotor.h"
    7 r" h8 S4 D# a9 Y6 s

  8. - P) U6 R* \) I( w. @! s) o5 T
  9. //double Input, Output ;0 n/ f# q  V6 z7 v1 U7 H; d
  10. float MaxSpeed = 255;
    9 C/ B+ o' c  M+ @3 V
  11. float MaxPower = 180;9 m! H& ^# B9 l- z: R3 d+ V6 K
  12. float MinPower = 120;
    2 g/ Y! d' d5 E5 E5 }8 f# l+ i  f! J
  13. float Error,ErrorAcc,ErrorDec;$ w; d+ u" h( t/ s

  14. . n) J& S8 Y& k# r
  15. float Kp=0.14;6 q! j0 }: l4 k# s: L4 u
  16. float Kd=0.00020;//23;6 w! d8 |5 ^3 L
  17. float Ki=0.000201;
    ( {# m! t- t5 w8 h% K
  18. ! V* M, V9 [# d0 a
  19. float nPower;& @6 @; U3 D8 d* z- k' [
  20. MePort lightsensor_6(6);/ ]' k3 _+ I; ^8 e. b# T  g) ?
  21. MePort lightsensor_8(8);
    # p2 c& D$ C& n$ D- O6 s) V( g
  22. MeDCMotor motor_9(9);
    3 P  p6 z! ?% V6 E& ^% I
  23. MeDCMotor motor_10(10);
    / x! S6 j3 t1 [" E( |$ Y
  24. unsigned long previousMillis = 0;
    ) |6 b: ]( m4 _. G2 [- M
  25. const long interval = 1;. ~- p- J% o' o% M! L
  26. " J/ M5 x/ B! V' R$ r
  27. void setup(){
    0 f$ k; n% e$ k/ `  K' K) P
  28.     lightsensor_6.dWrite1(1);4 W8 ]& R. X! s/ E& y5 G3 ]
  29.     nPower = 160;
    7 |/ e" N- k# l6 s9 p
  30.     Error=0;
    ) [2 s' f/ \$ e* m2 s
  31.     ErrorAcc=0;3 |' q) n* o. Z' J
  32. }5 z+ `: j& H/ K0 n! O7 f! f
  33. % Q" }) Z7 Q+ @% k' n  U2 c' U9 ]
  34. void loop(){
    : \5 T$ A8 o5 m4 ~5 \/ ^5 G& s
  35.   unsigned long StartTime = millis();" }6 [( Y# [+ v7 |
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){! z- L, X5 R4 ]& R' n# @% \
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    9 k$ Z* P  [' g: V1 z  s
  38.     ErrorAcc +=  nError*Kd ;: |  G0 m: t& j1 ?
  39.     ErrorDec -=  nError*Ki ;
    $ q3 ?3 K1 u" m+ |' Y
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    7 `6 w) F5 |8 g- r! F! P
  41.     if(nError < 80 && nError > -80){5 i, k5 M! ?7 ?6 v+ f
  42.       if(nPower < MaxPower){
    : ~" y$ V4 W! ]: a0 M2 Q. O+ k. Y
  43.         nPower += 3;. L7 N# K9 i; W4 T4 ~9 e
  44.       }
    * Q$ D7 d' h" u7 S3 {5 [7 J
  45.     } else{
    ; V7 M1 M+ J9 c' X3 u* a
  46.       if(nPower > MinPower){6 G( g  B  E8 J" p" a; r
  47.         nPower -= 2;
    ; L8 ]6 b) Q/ q, V$ B% S% E
  48.       }
    : D/ D+ d0 \" e. W% X
  49.     } 4 b5 K9 l/ V3 o2 ~+ J
  50.     MotoL(nPower-Error);# X/ O+ t3 l0 ?
  51.     MotoR(nPower+Error);    , H* k( w( r* N6 z3 T
  52.   }else{. v7 |9 ^6 |' b& f6 R+ `
  53.     motor_9.run(0);
    6 F3 |: R& i# }! g8 G
  54.     motor_10.run(0);! m5 m3 U3 _" C& ]5 T4 C. K
  55.   }
    ; `/ _7 E8 v6 C# j' m$ o7 J+ k
  56.   do{}while(millis() - StartTime < interval);
    7 ?) Q0 F8 C/ j: j# j9 ?) ?. R
  57. }
    ' c) p% j, \. F& d4 s8 t9 N

  58. 4 X8 q/ j' m2 \3 e7 p! x
  59. void MotoL(int Power){  z8 J6 C  k3 b* v/ P7 ~4 C9 y0 u, t+ r
  60.   if (Power > MaxSpeed){2 R0 H4 _8 P/ y4 B2 e% Y: e8 k) u& g. {
  61.      Power = MaxSpeed;
    4 b4 p( q8 X' }, p& d
  62.   } % z: g% O# d1 {" d3 g
  63.   if (Power < -MaxSpeed){. S& `5 h, C+ T; s& i: y* N) \
  64.      Power = -MaxSpeed;
    + W- Z4 f: R$ e9 h: e, F
  65.   }
    " E0 {3 d& P0 |% x
  66.   motor_9.run(Power);# l( |8 M+ f7 ?4 s
  67. }  
    $ A: \% ~9 G; L1 `6 f0 u% m& u

  68. 9 p+ Z4 }9 h4 V
  69. void MotoR(int Power){3 Z' L# W7 F7 a- J0 w( s
  70.   if (Power > MaxSpeed){
    * a- z7 E5 `& `! `3 L5 ~' e
  71.      Power = MaxSpeed;; o7 o! K% x+ c- A
  72.   }
    : u4 @  r3 G, A4 R; P: B
  73.   if (Power < -MaxSpeed){" W+ c/ k& r& r7 b8 e0 F
  74.      Power = -MaxSpeed;
    ' n; ^2 v. O/ ^
  75.   } ( h. _% [: a) U% c+ g) _
  76.   motor_10.run(Power);
    2 v8 ^9 ~$ M2 \2 a. W, d3 J
  77. }  
複製代碼
; u- z2 T& C( m* P# a  s; j
+ _& S' J7 y) Y- s/ n
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* _# p  U* _% U" R
8 k1 U7 ]+ _, ?- |4 d1 W您好,不知是否能向您請教。3 V7 [7 Y% D8 D+ k) r
目前和宋修賢老師在處理Ardui Car! l9 V2 W6 D6 P; ~" p7 v
雖然已使用較繁雜的方式處理了跑出黑線外的狀況# w6 S( W1 t  {% G: l+ U9 a- P% m
7 h+ A6 W' o7 t- j# A& _8 ]0 a
但基於想追求更精簡的程式所以還是想請問一下
2 k* [% Z" p8 Z. \& |1 I就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
' _* }6 K/ o2 h2 M0 k& m不知道您是否願意教我可以如何處理( n: Z% ~; L9 f2 B* [
# g7 `. U- e, J% y- u9 `3 s

% ?  w2 E; C: y, h# h1 h6 h以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
      ^0 z* l- n+ G' ^
  2. double CNY70Val = 1000;
    7 a# J: X0 E6 @  ]- u6 q5 e
  3. int interror = 0;0 q. T/ ?3 i- |+ w- w# O& N
  4. int olderror = 0;
      h$ s' S$ P9 ^
  5. double values;1 d; g" Z. Y. x
  6. # C& r9 l6 x: v  o; f3 I

  7. " V/ H% m) D- T$ p5 Y
  8. void CNY70()
    2 @' }5 W5 P0 t5 G. @9 H# A
  9. {
    . c& q6 J. |" ?  X  j! |
  10.   valuesRR = analogRead(RR)
    ' `, }- D: c, L4 N! K& I0 ~
  11.   valuesMR = analogRead(MR);- N# p7 s! u9 m0 A8 N
  12.   valuesMM = analogRead(MM);
    1 u, o8 j+ I$ }, a% a! y7 E/ i: x
  13.   valuesML = analogRead(ML);
    ; L, B, W# n: I3 b9 @
  14.   valuesLL = analogRead(LL);, |5 ]8 ~, c$ ~0 R$ ^5 Q9 ~
  15. / T1 Y: a9 K- o9 y5 h. ?1 G( _% P
  16.   if (valuesRR > CNY70Val)2 t. Z( b4 ^+ @
  17.     valuesRR = CNY70Val;4 b" F' Y( m9 c5 m
  18.   if (valuesMR > CNY70Val)
    + b. J( W6 G$ X
  19.     valuesMR = CNY70Val;
    2 v/ W  q2 |* A/ a  x
  20.   if (valuesMM > CNY70Val)3 z! Y# ^% E$ S8 D# K- [, i
  21.     valuesMM = CNY70Val;
    * V4 A1 x! Y  O9 \, W: Y
  22.   if (valuesML > CNY70Val)
    0 F! g) v/ C& D! W
  23.     valuesML = CNY70Val;5 k% Y% s* b7 K
  24.   if (valuesLL > CNY70Val)
    & X- W' a9 _4 k5 A$ D7 m; k* B
  25.     valuesLL = CNY70Val;
    ! r8 E. {9 R/ [, @
  26. ! X2 ^) x" y& R( E( Q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    + V. A# Z: R! ]! T0 e
  28. }9 ]1 H( Z* R8 O$ Y7 r; W2 I
  29. ; g6 W! e, L- T" D7 S
  30. void Car()" \* k' \0 P8 f3 I) t4 K& f9 U
  31. {
    $ u; L; E' C# ^; a- h
  32.   while (1) {! c; [) Q: q- _5 L2 N
  33.     CNY70();
    / a. e2 B, _% p3 \
  34. $ P2 ~2 T' E* d, U
  35.     int error = ((int)values);8 N. r: f1 r& K) v
  36.     interror += error;  C/ x  o& K, s( [+ V
  37.     int lasterror = error - olderror;
    & U( D: |! O9 Y, W
  38.     olderror = error;
    & M* v& Z% t* R5 W
  39.     int power = error / 5 + interror / 10000 + lasterror;$ z2 `) y. p2 d  z' a" u+ K

  40. 7 W2 O- m6 }9 Q- {; l1 J5 O8 L
  41.     if (power > MotoSpeed): P/ N0 v: U8 j7 D- b
  42.       power = MotoSpeed;+ K- M( Q! _0 X9 x' q! U  F7 a
  43.     if (power < -MotoSpeed)
    $ j: x# z3 E( V! S
  44.       power = -MotoSpeed;" L4 Y5 j6 s5 k- q0 r% U

  45. 8 n( ~6 e7 z$ p! Z5 _; U9 N
  46.     if (power > 0)
    " a: K  C$ F- v
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。+ [9 K2 [4 Y2 D6 {* f
  48.     else
    & Q9 u% P" I9 A2 a
  49.       Speed(MotoSpeed + power, MotoSpeed);) [, k0 X$ M  M( F  c& m
  50.   }
    5 j4 Y/ M  G" R. Y& B$ ~; Q9 v4 V
  51. }
複製代碼

" f. w+ k4 M+ C$ T, O$ ~& x6 \  ?' _3 d
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-10-30 15:05 , Processed in 0.024455 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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