圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21834|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>$ P( ?6 _; A! ]7 h+ e7 |
  2. #include <Wire.h>. d; ]" R" X5 I# h
  3. #include <Servo.h>7 E  u# V# t* G0 b
  4. + O9 D/ q( I% ~: L! U' h
  5. #include "MePort.h"2 M, y; M7 q' ~6 R; Q! {5 D
  6. #include "MeUltrasonic.h"
    2 K+ D6 n: h8 Y4 L; |
  7. #include "MeDCMotor.h"& a1 x# z% g; i3 n

  8. + d( D2 e, i3 L% T! Q) G
  9. //double Input, Output ;: w/ ^9 S5 R: j8 N6 l* t
  10. float MaxSpeed = 255;4 k; C% N* ^+ x5 X/ l+ v8 V2 o1 X
  11. float MaxPower = 180;
    5 Z: C# A  H& q7 F, \" d6 ?( c7 g/ o
  12. float MinPower = 120;6 |0 W5 W5 {& U9 g# \- x
  13. float Error,ErrorAcc,ErrorDec;
    ; V) F/ D7 t: C/ H( U: k; q
  14. 4 Q2 q/ y& }; n3 i$ F
  15. float Kp=0.14;# o' d- Z2 C# L: s
  16. float Kd=0.00020;//23;
    1 i. ]# j& [+ T# Q' `
  17. float Ki=0.000201;" f9 {% T. ]/ T+ E1 c$ K6 P! N, R

  18. ) e' ]0 K. n0 _* ~
  19. float nPower;
    9 u; y' D3 H. s6 Z9 v, V
  20. MePort lightsensor_6(6);8 c0 j) u' T/ B7 [& h' n* {
  21. MePort lightsensor_8(8);/ d6 ^! |! N$ j7 ]
  22. MeDCMotor motor_9(9);6 t: z+ e4 T+ ^# E6 ?
  23. MeDCMotor motor_10(10);
    " Z( q2 h5 l0 p) h* n+ ~" I
  24. unsigned long previousMillis = 0;9 n0 d0 r' k1 ~: N$ D
  25. const long interval = 1;
    3 ^. t6 G# {, G
  26. 4 P# |# J1 G% e) }; [9 v
  27. void setup(){
    + Z1 P* c! N$ L6 R" j/ o
  28.     lightsensor_6.dWrite1(1);+ |$ {$ v1 D- u2 c  h8 s$ X
  29.     nPower = 160;
    * `3 f5 z: N4 K
  30.     Error=0;* w5 \( K' ~3 x* t( Y
  31.     ErrorAcc=0;
    : ]. }" f4 ~/ b3 A4 F* x
  32. }/ p( o4 i( F4 S# F/ e$ t' q

  33. , i; x# [; S9 Z: d3 A- C7 D
  34. void loop(){
    # V8 s! J: a# p& M% y
  35.   unsigned long StartTime = millis();
    3 s/ R& {, a# j- t" e" l
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    1 _$ d- m8 p2 H1 G
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    & X# R7 d6 d% x, c2 P# z; A
  38.     ErrorAcc +=  nError*Kd ;
    0 P7 V- \" v3 ^: F& n# F
  39.     ErrorDec -=  nError*Ki ;4 y  U3 O  S8 H+ x7 }
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    - k( G0 y+ s# n* v
  41.     if(nError < 80 && nError > -80){& t; ^1 O' k, q
  42.       if(nPower < MaxPower){: p/ y1 G6 A. U, J  ]7 Y1 r
  43.         nPower += 3;: K* N* e( x( g$ k+ C- n/ H& V- {
  44.       }+ |/ ]" G& E2 x4 J  ]# M6 L  l
  45.     } else{
    6 q$ }( e8 g* D2 G, C$ w4 H
  46.       if(nPower > MinPower){* c; g! @8 d; o( H, T0 p4 `& x
  47.         nPower -= 2;
    ( [: t) q; o' D1 f3 q
  48.       }+ x8 C+ n0 g$ s$ x: j4 t0 s
  49.     }
    3 M0 L2 c% r3 D3 A# y
  50.     MotoL(nPower-Error);/ _  m4 \: h$ _6 J) [# S
  51.     MotoR(nPower+Error);    0 o9 U6 S3 B% F- e
  52.   }else{
    ' |- Z" f8 s$ k
  53.     motor_9.run(0);' C; R* `; J8 W9 D0 D# Q1 i
  54.     motor_10.run(0);5 D1 v0 a6 K) i& V9 v* q
  55.   }9 v. W; p! R% X
  56.   do{}while(millis() - StartTime < interval);
    ( a2 P( {9 J' h. E, a. O0 _
  57. }
    ; F! B3 U8 @; F9 {' h& R7 U
  58. ; V3 d/ o% }* N$ f5 H; B. r& o
  59. void MotoL(int Power){0 u. g1 b6 \, Y( j
  60.   if (Power > MaxSpeed){  H, z/ P- f2 G# `: s  q
  61.      Power = MaxSpeed;& [) y, M# @7 e0 K1 R! R
  62.   }
    . [+ R" G' y+ y3 r! O5 D
  63.   if (Power < -MaxSpeed){5 P% Q5 e. t9 l" Q7 Z
  64.      Power = -MaxSpeed;
    / Y+ t6 w% }# S- J
  65.   } ) i: _! v" w2 K3 x$ ~1 j
  66.   motor_9.run(Power);
    / W+ A" |2 y# `
  67. }  5 }9 _( z$ m6 d. X! n8 n9 W$ ~
  68. / ~/ r& ~0 r! z) N% j$ L
  69. void MotoR(int Power){
    ' O+ N6 W$ M& [& y5 Y, C
  70.   if (Power > MaxSpeed){
    2 @3 u# U  L- M) l/ M0 z+ q; t
  71.      Power = MaxSpeed;
    - e" h  g: ~  c) G: C
  72.   }
    ( s+ Y/ M) y& O) C) F' a2 D8 J
  73.   if (Power < -MaxSpeed){2 G/ l  H' w' y7 M2 A0 z8 ?/ h% W
  74.      Power = -MaxSpeed;
    + Y; ~! n# E. f/ k$ w
  75.   } / U) a" P: L. w* Q
  76.   motor_10.run(Power);
    ' v( i/ u% K+ w9 s% A6 S  U  ^1 N
  77. }  
複製代碼
9 |7 ]- j8 s- @1 T

& W7 Q1 S! U: V
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 2 X9 z1 T' ?' Y$ |$ O9 [6 U/ w% x* ]

6 r1 b: B" |4 }" y您好,不知是否能向您請教。% x8 w1 w+ g2 q3 b
目前和宋修賢老師在處理Ardui Car
* W; _6 T& J% o9 R! o& N雖然已使用較繁雜的方式處理了跑出黑線外的狀況! n1 L7 }; h% c5 n2 z

( _: e0 @! M6 E' Z% G但基於想追求更精簡的程式所以還是想請問一下
0 Q  I! |$ F+ l; M就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
  q+ `1 W& B+ |8 x# |$ [不知道您是否願意教我可以如何處理4 q9 B  K* _+ n8 ^" J  I

8 s. K  ^2 z4 r; k, P" q) V( l, h9 T$ `9 T
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;( S, x: P# {: t
  2. double CNY70Val = 1000;
    * f" ]! d( A4 v& b5 g. X
  3. int interror = 0;
    # u2 R5 x9 z1 A. B% `! u/ u
  4. int olderror = 0;# r" j+ \$ C4 T7 h0 f( M+ _& W! \; a
  5. double values;7 j8 L( A: P2 p* n8 \# _3 O
  6. 4 u# p" c# L. D0 j, Y
  7. 2 i0 D4 @" \/ i! b% t1 F  Z
  8. void CNY70()
    ' l2 v: I. {  K- Z8 O) O( j( r( j+ r
  9. {8 [  i  z9 I0 ~+ K5 q9 n
  10.   valuesRR = analogRead(RR)
    4 C$ N0 E5 X8 V% u- c* p
  11.   valuesMR = analogRead(MR);9 m( s; y& Z* Z! S% K- E
  12.   valuesMM = analogRead(MM);
    ; j, T- {/ p0 |+ C# C2 u" J
  13.   valuesML = analogRead(ML);( _" Y& Z! o3 d# N) I* @" V4 i
  14.   valuesLL = analogRead(LL);0 U( ]: b! f& ^6 [

  15.   f$ U6 Q- M9 j
  16.   if (valuesRR > CNY70Val)
      _9 b$ l/ D6 H' [$ ~6 t: W/ y, L
  17.     valuesRR = CNY70Val;
    1 C+ N5 _7 n" x: [* X" u6 B
  18.   if (valuesMR > CNY70Val)* x; i" m% u7 ^) q& I8 g0 ~
  19.     valuesMR = CNY70Val;+ u; y  {& z8 C/ Q' ]
  20.   if (valuesMM > CNY70Val)4 A. c1 c. {  ]3 _( J
  21.     valuesMM = CNY70Val;. L4 U9 k7 B/ I+ }7 H6 P$ `& k
  22.   if (valuesML > CNY70Val)" Z6 U* @0 u+ X" o5 L/ A" O( w
  23.     valuesML = CNY70Val;# B& f8 `5 m8 H- q$ ?- I  l% @
  24.   if (valuesLL > CNY70Val)3 F. V/ W$ Q& i0 g
  25.     valuesLL = CNY70Val;
    - S, G' h9 q" e+ ], }$ l
  26. + U) ?: w4 _( g  L% Q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    3 q! d- Y  t- G: O
  28. }
    ' Q; A( d6 h! K% ^6 m
  29. ) ]# I- [0 h& |' _
  30. void Car()
    , M8 y+ m* w, e" O% ?% w( _0 Q
  31. {
    ' w  _: a0 z9 U' L7 e5 k- ~
  32.   while (1) {# ]* c' v3 ?* @/ q+ q
  33.     CNY70();
    7 P' C/ g) u$ H# {" e

  34. & W- c6 J! O8 Z7 o
  35.     int error = ((int)values);8 Y' h# O3 B, ~: q+ X6 c# m
  36.     interror += error;- a' j$ H: G9 N, Q$ V
  37.     int lasterror = error - olderror;
    : m5 u8 h5 L2 ^' P* t. _& q2 R& V1 ^  ~
  38.     olderror = error;
    & I0 _3 i# W% }. \; _# b/ t
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ( ], Z8 l  |+ x8 {4 [+ e: ]3 O
  40. , f; V8 x2 E# b+ Y
  41.     if (power > MotoSpeed)
    * w9 r7 z1 U* L3 S" f! ^
  42.       power = MotoSpeed;
    ' n1 g/ H0 u- D: G+ e% Y
  43.     if (power < -MotoSpeed)
    6 Q( {0 |8 Z" m# M. d6 S
  44.       power = -MotoSpeed;
    0 N1 q1 V: ]' G2 z2 }
  45.   G5 X. s# {3 `' j0 `" M
  46.     if (power > 0)
    , b0 E5 P8 u5 E9 @
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。8 O( A9 a' H* |) |- A! ^/ ]+ E
  48.     else" o2 _% j3 n$ h6 a/ |& s5 g4 C
  49.       Speed(MotoSpeed + power, MotoSpeed);  o5 P9 z7 {9 W
  50.   }. s. z7 Q# Q$ A; u; n' T
  51. }
複製代碼
1 P$ W! Q8 i9 R6 J7 j! ?

7 I# o3 b* M, z+ N) J$ X$ H* Z
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-4 16:52 , Processed in 0.022906 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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