圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 18600|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>' |" a# ?) u: m* _
  2. #include <Wire.h>
    0 z  V2 I2 _- o# d- M4 d( b& L  N
  3. #include <Servo.h>, J. k4 [2 h; [/ R3 ^% J

  4. 0 _6 N1 V( S' o8 _
  5. #include "MePort.h"
    6 D5 r' I/ h5 y4 n* \( h
  6. #include "MeUltrasonic.h"& k5 S- [" p$ d4 X- L
  7. #include "MeDCMotor.h": t  Y% s# M' B5 s1 Y

  8. : ?# l" r9 D, f! N1 I( t  `  I
  9. //double Input, Output ;
    ( @% u; }) K9 S1 K& \
  10. float MaxSpeed = 255;
    1 B7 a& T- L" D. @* S# M6 k0 o
  11. float MaxPower = 180;
    # T: q' S7 y) J- ^6 k8 c# l
  12. float MinPower = 120;, i1 X! W" D+ C4 V# H
  13. float Error,ErrorAcc,ErrorDec;1 x# h; _! @; Q; _0 }5 `

  14. ) j! X8 b/ z1 j; x0 r  S% R
  15. float Kp=0.14;
    7 k5 b% |- u# w7 o
  16. float Kd=0.00020;//23;$ V; q$ T( ?0 [5 A8 r9 Z6 ]
  17. float Ki=0.000201;
    ; ?) G# s# T5 |

  18. 1 s  D) }2 W. X( V
  19. float nPower;
    1 Z  z, S0 W0 g+ N
  20. MePort lightsensor_6(6);
    , }0 |" l$ H; D7 T4 S1 Y
  21. MePort lightsensor_8(8);
    2 I- F. z& v/ H
  22. MeDCMotor motor_9(9);4 [8 y( J1 F/ i! `5 u4 n
  23. MeDCMotor motor_10(10);
    8 {1 {9 g, f( S2 J+ X
  24. unsigned long previousMillis = 0;" z7 N3 V  }+ |4 f* G6 |1 U/ s' h
  25. const long interval = 1;# J4 B' T& C" \+ W5 ~
  26. 9 ^, V( g7 E0 z8 J. z# a$ O$ R  s+ G
  27. void setup(){7 N! H! w7 v* ~9 _
  28.     lightsensor_6.dWrite1(1);
    ' f7 C! d5 l0 [! n" k
  29.     nPower = 160;  Q  E* ]( n- Q
  30.     Error=0;% k6 r3 \) E/ W/ k: N
  31.     ErrorAcc=0;9 n8 Z8 e2 X* `8 i
  32. }  Y+ x& S6 q' U8 [% H

  33. " B$ i* H( z% `8 n2 X
  34. void loop(){9 {) U0 c4 s4 V, {/ u2 U# I% g
  35.   unsigned long StartTime = millis();
    & x5 n5 x. }6 ~
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    2 {5 x& r! e! E
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();' K3 e% I/ e$ [: n) m
  38.     ErrorAcc +=  nError*Kd ;
    ! F1 C1 e, L7 ?7 l1 e1 c6 K
  39.     ErrorDec -=  nError*Ki ;% H# |6 l" P2 J" M9 e6 D6 x$ A; M2 P
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
      r3 \: E7 |. ?
  41.     if(nError < 80 && nError > -80){" J! M6 w* J/ o$ T
  42.       if(nPower < MaxPower){0 B; B6 `% [. `7 X+ r
  43.         nPower += 3;
    3 \  j8 ~1 V+ L
  44.       }
    : M* T4 A1 q( k& L8 S
  45.     } else{
    . H7 @4 S2 n4 E# B: [1 W* ^
  46.       if(nPower > MinPower){3 f& C3 ~1 w. W' a3 x
  47.         nPower -= 2;6 ?% o# H; {2 ?: x- ?
  48.       }" Q. N$ k' ^  n5 C
  49.     } - M# t- e7 {: J. u* g7 h; y; {
  50.     MotoL(nPower-Error);& b- q4 [$ ?; g& y
  51.     MotoR(nPower+Error);   
    # V1 i9 L6 W& J1 _/ \$ F
  52.   }else{
    1 J+ P6 Z* Z8 H' u6 l
  53.     motor_9.run(0);) z$ K$ T2 ]  j7 O3 C# `2 U2 r
  54.     motor_10.run(0);9 x# u6 S6 ^$ `" B1 w0 w
  55.   }
    4 S: I* L: @' d0 z
  56.   do{}while(millis() - StartTime < interval);
    ) O( B/ r4 I0 n8 ~
  57. }
    $ V% j3 w( r, @
  58. ' j5 b! m& [: E8 A! E4 N% h
  59. void MotoL(int Power){4 c/ r- I6 e% O2 U! m( w
  60.   if (Power > MaxSpeed){
    ; G8 l6 Y% u- y
  61.      Power = MaxSpeed;
    1 H* ?* v8 [. ?
  62.   }
    - E' v& Q- l# B$ |
  63.   if (Power < -MaxSpeed){8 S- b9 |. m5 ^
  64.      Power = -MaxSpeed;
    ' \! r. [% |6 ]8 x4 t; z, n, b
  65.   }
    3 Y' n* f- W6 N, r) M+ D
  66.   motor_9.run(Power);( E% ?9 H/ H' N2 j" z5 J
  67. }  ; y8 q% W. ~6 z% p4 A

  68. : b& d) u; E' @+ g" a) @! g) [
  69. void MotoR(int Power){
    # `( H7 ?. k& E; g( U# i6 `
  70.   if (Power > MaxSpeed){; z+ w2 S3 U* f3 h
  71.      Power = MaxSpeed;, ~6 v( E* V4 ^0 [7 J, M
  72.   } . B! F  j: x4 b+ i
  73.   if (Power < -MaxSpeed){
    # `; ^" o! Q/ w" V
  74.      Power = -MaxSpeed;
    # Y# W' X& @# y  s
  75.   } $ G- _! ]$ K% C  @
  76.   motor_10.run(Power);8 L; Z/ j+ Q! C( \; H, X
  77. }  
複製代碼

5 g2 c8 P/ C* h& r9 H; P
% `2 y* k  b5 e# M) V
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
  m* F" b+ g+ v0 b* \4 h$ f6 Q/ M2 Z- K9 ^6 t" m7 m  H/ e1 T
您好,不知是否能向您請教。
. l. w6 ?$ e7 U* ?目前和宋修賢老師在處理Ardui Car2 A% z9 B+ _( z% O% a8 }  z
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
- B, E3 z+ F& M1 t* r
8 \! h& ]+ h. y( |, a6 t但基於想追求更精簡的程式所以還是想請問一下/ U' L2 b5 L2 c# J" w
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝' W3 {) p+ h$ h( h9 B0 i
不知道您是否願意教我可以如何處理
* K/ u( T6 a0 t& K2 u& X7 {# B. S) O; M( X* H4 y

, T5 b5 G( O, |& \* e1 p% ^; F: b: u以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;& x. r) ]8 Q6 g: G$ }- Z2 u
  2. double CNY70Val = 1000;
    " A9 [9 B" h3 W! b6 S( ]( j
  3. int interror = 0;
    ! T6 ]1 o+ S2 I8 t. }  B+ [6 _
  4. int olderror = 0;& c$ {. \: p: i: q. c0 F. J
  5. double values;3 ?7 N+ `9 M1 F: B* R9 _! w
  6. : r$ K* P8 g$ ?8 a" S4 I
  7. # i' i3 N3 c# T1 O4 R9 W. Q7 L5 Q- R
  8. void CNY70()
      I0 }0 y5 P( O$ f: S/ W
  9. {
    ! [3 ?2 s/ f2 Z" y. {7 e6 T
  10.   valuesRR = analogRead(RR)) c. z; ^3 m6 Y" y* ^: ?- c
  11.   valuesMR = analogRead(MR);6 L7 a# }# @& L3 [6 Z2 [
  12.   valuesMM = analogRead(MM);' x# R" |# c' l
  13.   valuesML = analogRead(ML);
    . Z! w) P0 X& B+ E& g! }: V
  14.   valuesLL = analogRead(LL);2 b) a2 `: O' g+ g# D4 R1 T

  15. * [- p7 l8 s; d2 @$ H5 `5 P" V
  16.   if (valuesRR > CNY70Val)+ h8 ]% X: o$ s) x
  17.     valuesRR = CNY70Val;
    / d& {5 _& Q2 \! a
  18.   if (valuesMR > CNY70Val)
    ) Q; m7 V8 W6 p7 b) t3 `( m& u, p
  19.     valuesMR = CNY70Val;
    ) j9 H8 Q& X1 d0 R! K9 P8 f
  20.   if (valuesMM > CNY70Val)
    8 p2 v+ {' g; c( z
  21.     valuesMM = CNY70Val;
    ; B3 ^* `- _% f0 |4 a
  22.   if (valuesML > CNY70Val); h7 p# e' L' z- W8 Q
  23.     valuesML = CNY70Val;$ k- S0 C4 s  M) d$ f! M# ?! v/ E
  24.   if (valuesLL > CNY70Val)
    * E% z3 |- U+ ?6 Y* z7 L0 V$ f
  25.     valuesLL = CNY70Val;
    ) h$ S: u: B4 B8 ~* q
  26. / P: `. m6 L6 i1 Q# x7 d
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    4 H( O4 A5 S) C( S" B. k8 l6 Q1 c$ A
  28. }$ b6 }, w  f6 F1 E/ L

  29.   G$ J( k: v- C2 C; Y0 d
  30. void Car()( n/ c5 L6 Q. c$ H
  31. {
    0 [' R: l: j  \0 G; C
  32.   while (1) {! k4 R) ^; |1 K4 o9 q+ L2 s
  33.     CNY70();
    . K  E1 E0 n) _. B7 R2 G! o

  34. * \. V( i+ o$ l1 [$ k
  35.     int error = ((int)values);- u1 r5 p$ W& c2 Y' f  K; V" ?
  36.     interror += error;
    / P6 R5 x4 U  V6 F+ C0 x
  37.     int lasterror = error - olderror;
    ; K1 X! n) T6 s* r1 t
  38.     olderror = error;) I, d( {: q! L1 B. Z1 \4 f1 t
  39.     int power = error / 5 + interror / 10000 + lasterror;
    8 n3 `' P) z- Y1 Y

  40. + L+ v0 ?  L: E! U3 p$ M& O' }9 j! T
  41.     if (power > MotoSpeed)3 x# q/ z7 f; B9 L: t
  42.       power = MotoSpeed;
    8 X+ Z* |/ o* v) ~: N# c5 N
  43.     if (power < -MotoSpeed)
    ; _) l  h- b1 |0 e8 O* [' |
  44.       power = -MotoSpeed;
      v6 F1 F% t& L

  45. 5 T2 u" N1 c: y- H; m3 B7 D# k
  46.     if (power > 0)
    4 O1 N. k5 N: d) x$ L$ q
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ; [5 y0 W, O; d8 F/ T7 J/ j, E
  48.     else$ F4 n" L# T: D7 F* P6 w
  49.       Speed(MotoSpeed + power, MotoSpeed);
    9 _1 a9 @  j* u' h* u, j
  50.   }
    1 t% E8 j9 G. L) d4 G- G' `
  51. }
複製代碼
8 d# d$ T4 ~- t  Y2 e

# V) n2 V7 G. h2 \; l* Z
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2024-4-26 06:42 , Processed in 0.026248 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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