圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21719|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ' g: ^( m$ r9 n2 X1 q- p
  2. #include <Wire.h>
    ' z' e% o0 `1 |, x% j- A
  3. #include <Servo.h>
    : j+ P4 N% V0 f1 Y5 n
  4. " b5 `4 \  \+ I3 g; g/ G
  5. #include "MePort.h"8 @' `* R) [- a: i& e* K
  6. #include "MeUltrasonic.h"
    - a& x# h" }" t% \1 X- e' t
  7. #include "MeDCMotor.h"4 V, O& T2 u; U1 p8 e3 i
  8. $ s% C" }& n( o7 N* P0 s5 B. X
  9. //double Input, Output ;' v8 s, W, d% U9 X
  10. float MaxSpeed = 255;9 N7 f  g" t; I# P3 A- o' p+ }
  11. float MaxPower = 180;
    2 V0 ^6 i* R' h
  12. float MinPower = 120;
    2 O4 Z7 \' I" E$ F. U
  13. float Error,ErrorAcc,ErrorDec;
    - ]3 s& I* V. S; P7 f( p

  14. 6 I/ M! |9 [8 m, K2 q9 \# b2 P
  15. float Kp=0.14;( s1 R$ G8 T/ e1 j- j% E; {
  16. float Kd=0.00020;//23;- ]1 v$ v+ ^* J; k1 v  Y# P
  17. float Ki=0.000201;4 b7 x+ R, C7 w/ f7 I

  18. ) \, X: b, x) Q$ h! u! x9 n4 W: Y
  19. float nPower;
      U5 W% O& [/ q3 _- N
  20. MePort lightsensor_6(6);/ _: b' J( @6 J7 }, {
  21. MePort lightsensor_8(8);& f5 I* r& n' z$ k0 z. ?% k
  22. MeDCMotor motor_9(9);
    / w. v3 L6 F; k! ]
  23. MeDCMotor motor_10(10);5 O8 Z/ @  [  N% X
  24. unsigned long previousMillis = 0;
    3 e! l; R9 t) ?1 S' C
  25. const long interval = 1;+ b- A6 X( `2 l( h2 g8 t: Z

  26. + v7 {1 d3 [* y- r4 O
  27. void setup(){
    ! O$ s& Q7 e! I3 W/ X* B1 M! z' F
  28.     lightsensor_6.dWrite1(1);1 r0 O- r; `0 M* e% J% |
  29.     nPower = 160;$ x( `. Y" m5 h+ x/ m8 l
  30.     Error=0;$ h! R- r& j9 A. |; l; G% ^
  31.     ErrorAcc=0;+ O' k  a; u+ y( |" R( R" k7 c
  32. }
    7 q7 K0 N: o/ M7 K5 }: V& n
  33. . A$ ]% d/ K0 ~. d1 ]* I) b
  34. void loop(){$ j' `. n" t  P$ [, k
  35.   unsigned long StartTime = millis();  z3 J  w$ p" @1 _8 e* h
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){' x' Y. @# H0 i  f- V+ l
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ) C" R0 D! J# K8 L1 ~5 l
  38.     ErrorAcc +=  nError*Kd ;6 L2 q( Y6 Z" T- k& Y2 t* e
  39.     ErrorDec -=  nError*Ki ;: P# y; [+ z; c# T# F+ Y1 y
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);- ~( ]* S/ J' p8 O6 p! \$ U0 l8 p
  41.     if(nError < 80 && nError > -80){0 |( e0 `* n5 x, Q
  42.       if(nPower < MaxPower){" N, g/ {* b  Q! V/ c! d8 K
  43.         nPower += 3;( D$ }7 A; C1 p. Y4 y
  44.       }
    $ K2 Y" M" P3 ^9 G! U) y; n7 {+ @
  45.     } else{* x9 a5 g9 V, N" t/ T8 o
  46.       if(nPower > MinPower){
    ( g3 @7 Y$ q4 e" H7 |: g) B" i
  47.         nPower -= 2;
    6 _2 O3 H( K8 A7 A
  48.       }* i9 i" m' `% h& s5 i7 a0 ]+ w
  49.     }
    ! q& a1 ?& F  q, v: W: w
  50.     MotoL(nPower-Error);
    8 A7 X) v: J3 [4 }8 l4 K( y( e
  51.     MotoR(nPower+Error);    6 W0 F9 C7 Q8 @4 @# ^
  52.   }else{
    : G3 x- C+ [% D8 U
  53.     motor_9.run(0);. ~  _& L& Y) ?* V  s1 w
  54.     motor_10.run(0);4 \) i& r4 I% v  @# G
  55.   }
    6 ^$ l" S$ J: W
  56.   do{}while(millis() - StartTime < interval);
    6 a6 Q$ Y% z$ r, M+ ?
  57. }
    9 E3 Q+ \' ?+ h$ I) T& a
  58. 8 h  j( T3 m3 m
  59. void MotoL(int Power){, a" G& K0 z0 y4 \
  60.   if (Power > MaxSpeed){
    0 J3 p" D3 s/ d
  61.      Power = MaxSpeed;
    % [9 ~( y7 L9 i
  62.   } ) W. m! ?7 e/ t: F0 M, V
  63.   if (Power < -MaxSpeed){
    ( u# [# F6 t. f0 c3 t* u
  64.      Power = -MaxSpeed;
    9 S/ D' W0 @' y( @( V& w( J, k
  65.   }   V+ B- e' l0 D/ ~
  66.   motor_9.run(Power);
    8 U' S" F& y" b: G' S
  67. }  # h- Q# I! k  n' G4 G1 g& Z
  68. 0 s" a8 V6 i6 C6 m( `! U
  69. void MotoR(int Power){* b& g! \: }/ h% K, s3 K
  70.   if (Power > MaxSpeed){3 S# t) u, L, Q
  71.      Power = MaxSpeed;! ?/ ~# m" x4 ]
  72.   }
    7 u/ g8 D- K* s& H4 e$ O& Q; f; K
  73.   if (Power < -MaxSpeed){
    / X0 m: R; }1 E0 d
  74.      Power = -MaxSpeed;0 b9 f% S- v# J% l. q5 _
  75.   } ! R/ @& D6 f% r3 i
  76.   motor_10.run(Power);
    2 C, W3 o0 z" [7 N* O% G
  77. }  
複製代碼
' `6 i& g& I) q  U/ v9 x2 k
6 r5 p$ d3 E1 L) I+ w
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ' R3 K8 f# g3 P3 ]0 U/ K! O) C

3 n: _/ `6 _9 o' S- w您好,不知是否能向您請教。" |4 G8 Q7 W' f" T+ r) L
目前和宋修賢老師在處理Ardui Car
/ Q* ]: [# {: D) E雖然已使用較繁雜的方式處理了跑出黑線外的狀況$ u6 [5 Y+ |# u4 [. }
. X- Y( P* z! n, G, F
但基於想追求更精簡的程式所以還是想請問一下
6 i' P" i2 R  Z2 a- J  p  S; j就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝. K/ K( d* \0 N$ o' O
不知道您是否願意教我可以如何處理8 p$ I8 w7 E; P& B7 |7 R
( B1 u8 D! ^! G7 t( F# ]1 ?$ }

) a' ]2 c6 z9 i8 d以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;0 I; [4 w/ }1 Q4 H/ b
  2. double CNY70Val = 1000;
    1 i$ D. n& @4 v7 ~. s
  3. int interror = 0;# ]# E- Z# Q& h, J: f' H
  4. int olderror = 0;; t' Y6 |4 ~. |: h% s- y
  5. double values;8 z! T. b5 J, N/ x

  6. + `! p" S; ^) n8 m+ B) {

  7. ) {% K$ h9 X" {/ P' z) L: z5 g$ R
  8. void CNY70()% x, u1 [; |4 @1 s! H+ \$ C
  9. {! s1 X; Z& h/ d8 I1 A: Y+ @
  10.   valuesRR = analogRead(RR)
    / b$ S! \  A, B* c1 ?' P
  11.   valuesMR = analogRead(MR);4 a0 M: Y) [2 G6 i% F, h
  12.   valuesMM = analogRead(MM);! X) s, l/ ]9 O. h/ w) V  m6 k
  13.   valuesML = analogRead(ML);( B2 O' F5 C! N1 V1 \
  14.   valuesLL = analogRead(LL);( M6 E8 q: e; H; Z; C, U! t
  15. 8 C' y% T- G5 F. `: {* o
  16.   if (valuesRR > CNY70Val)0 Y) l& y  A$ H  s
  17.     valuesRR = CNY70Val;" q! s- n0 m, ?+ s% H
  18.   if (valuesMR > CNY70Val)' x+ H2 Y- C4 R' M6 S7 i
  19.     valuesMR = CNY70Val;! r& D8 D# Q( u7 `9 e
  20.   if (valuesMM > CNY70Val)
    8 _" T- M* W- a% a; q
  21.     valuesMM = CNY70Val;. T5 \5 K2 x% H1 s5 F2 l" a
  22.   if (valuesML > CNY70Val)
    % h* v& c1 t4 H! D3 f
  23.     valuesML = CNY70Val;7 t9 h1 o5 X  A: p' O* N& o5 R- C  d" i1 @
  24.   if (valuesLL > CNY70Val)
    - a2 e! ?; Z  S) u9 M; ^
  25.     valuesLL = CNY70Val;2 s( ]  p  M& z$ @% U5 k

  26. ; r! c" F7 j9 b* Y& t
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    9 E4 L5 E4 h8 ~& V
  28. }7 X! H4 g- A  h# G+ b  P+ @

  29. 9 H1 [3 [) d- c8 Y+ j; S7 t0 l3 m
  30. void Car()
    - e4 r: S+ D# o* _- D" n" P  `% |
  31. {
    ; K3 M8 o: ~: f7 l
  32.   while (1) {5 d1 U/ P7 e4 m; t) b& y% o  U2 f
  33.     CNY70();
    " d+ R6 e8 h0 M+ J% ]" m3 q1 W

  34. / {  |8 M) T  o4 d( O8 ]8 X4 F
  35.     int error = ((int)values);
    3 V5 K, \! \! f3 s2 T2 A* a/ f
  36.     interror += error;2 p/ V" o# n: `. V2 Z# r
  37.     int lasterror = error - olderror;
    9 V$ C$ X6 r: M5 ]+ O* B$ {
  38.     olderror = error;5 b+ q4 A( h7 Y. Z/ V" d% |1 ?
  39.     int power = error / 5 + interror / 10000 + lasterror;% B: h% h" A& h5 M7 L* Q. D
  40. " B8 N. J# u0 d( T' M7 _+ s/ `! B
  41.     if (power > MotoSpeed)
    2 }3 Y9 d' ]: S% c2 b
  42.       power = MotoSpeed;' S4 k6 D8 T0 k. _9 P
  43.     if (power < -MotoSpeed)9 e" W& u0 G4 G( r; j8 D" a
  44.       power = -MotoSpeed;# t' a: b* O. t9 F( o

  45. ; A, s8 Z* h9 a# u$ |- b& e! i
  46.     if (power > 0)% V7 s& S8 z/ ~) L
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。2 @7 L& e6 n( k0 T
  48.     else# a  Z2 E8 C0 l4 E/ i0 O
  49.       Speed(MotoSpeed + power, MotoSpeed);0 [6 ~# D9 c6 I0 q: u+ ^) h, [
  50.   }
    7 E, j5 p2 v: Q( C% S* _
  51. }
複製代碼

& r( {- s) K4 w( X+ B. g8 e. ]
2 W0 e: s) k( s% {; U
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-26 17:33 , Processed in 0.025594 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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