圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21766|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>6 Y8 k* h+ @, I! M! }& g1 [' z
  2. #include <Wire.h>
    " m: }6 A0 N3 ]6 t9 M
  3. #include <Servo.h>
    + W( l; i8 d* \  Q3 q

  4. + M' Z4 Q: q2 I* M  Y0 p/ I
  5. #include "MePort.h"% c$ Q) p2 W+ H
  6. #include "MeUltrasonic.h"
    * x3 F4 `. k$ Y  k9 K& t% J5 U
  7. #include "MeDCMotor.h"
    8 @# H& p: \- _) I! c/ s+ c
  8. 9 p* Y& G! {* Z, ~
  9. //double Input, Output ;/ c1 B' x0 q1 E" D
  10. float MaxSpeed = 255;
    8 {" E) ^: w* W9 _
  11. float MaxPower = 180;
    3 ~) E5 z( n- z# P2 r- _5 Z8 z( @
  12. float MinPower = 120;; c5 o' D  p; q' z8 e
  13. float Error,ErrorAcc,ErrorDec;2 t& v$ ~" n3 i1 u( K
  14. : M, s1 X, W- k
  15. float Kp=0.14;; Z1 Z; d! i' N$ t. {" X
  16. float Kd=0.00020;//23;
    5 B, u; p- F5 c# P) y
  17. float Ki=0.000201;
    + R) _& V% ^# n" J6 m
  18. & t# @. u# m  {. Z  R4 I5 D
  19. float nPower;
    4 o  x5 r3 t* u; A/ Y( T
  20. MePort lightsensor_6(6);7 X5 b8 {( b1 X$ }0 Q
  21. MePort lightsensor_8(8);& z7 m# I) U( G/ O1 c" i
  22. MeDCMotor motor_9(9);
    8 I5 J. K) g0 q# @
  23. MeDCMotor motor_10(10);
    / X7 G. X8 V* I( @1 \8 h
  24. unsigned long previousMillis = 0;
    7 x' t* i8 [+ G) S
  25. const long interval = 1;
    ( T' F2 t  C, `+ {: P' i

  26. / i2 V2 d6 }2 x) j
  27. void setup(){
    1 v5 H/ a7 I9 T5 s, I
  28.     lightsensor_6.dWrite1(1);
    + |+ l1 m8 D# [0 ?1 r& w2 C8 s# F; N
  29.     nPower = 160;
    0 e$ v. D6 u! H2 T) l
  30.     Error=0;/ x; l/ R+ L- n& e0 w5 J
  31.     ErrorAcc=0;
    - `: R4 `. J0 O5 U; t8 Q
  32. }
      ^/ R9 ^+ _. M& j- G6 q

  33. 9 U" w! K7 [: p
  34. void loop(){: a; a, W! X& i5 W& S# d# W
  35.   unsigned long StartTime = millis();
    0 ^1 t6 C! K0 V% w6 D) P! e1 A& a
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
      u4 |. M# P" c% m
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();, Z% i/ I6 }6 O+ @- ?( ]' \: @
  38.     ErrorAcc +=  nError*Kd ;
    5 C$ X* F8 h* D$ L
  39.     ErrorDec -=  nError*Ki ;
    3 o3 _6 b$ m7 m& m% f
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    5 }) C+ q8 B4 G
  41.     if(nError < 80 && nError > -80){
    - _3 p" Q# r! v2 r' ^* ]1 @
  42.       if(nPower < MaxPower){3 ~4 E' E% h/ R$ |- I
  43.         nPower += 3;3 U& L/ X* N8 e$ Q% b) v; U1 V
  44.       }2 u0 J" R6 B- x& J) V
  45.     } else{3 a% v& C; c7 j+ {4 V4 a5 T
  46.       if(nPower > MinPower){' W; V! _" f" z5 a/ a/ b! D4 _2 q& s
  47.         nPower -= 2;) Q( M' H4 h/ Q/ P0 q) r
  48.       }
    5 O# k, K. b( X7 {7 ^; M9 z" n
  49.     }
    4 J( {: Y5 C- L* J0 A( s; }
  50.     MotoL(nPower-Error);- j- _+ [. ]6 @" k) M# c/ s
  51.     MotoR(nPower+Error);   
    % A& {6 `6 n4 A7 ]  B2 w
  52.   }else{
    # [# K- G- M7 U8 h+ M
  53.     motor_9.run(0);& I; `$ ~& ]; X1 m; }4 m. O- ]
  54.     motor_10.run(0);
      F5 s7 |8 h# ?4 @
  55.   }
    ; h, j3 v+ ?8 ~' a4 M
  56.   do{}while(millis() - StartTime < interval);9 `& T: }0 @3 J/ \9 g# U" M$ r, p
  57. }/ [/ n" }$ O. Q: a& w0 r: R; D

  58. : r+ p9 V" `$ C) v& ?& }
  59. void MotoL(int Power){  D2 H* y1 o/ x
  60.   if (Power > MaxSpeed){
      N3 Y6 h5 p4 U/ D
  61.      Power = MaxSpeed;6 |- `$ }7 ?3 ]
  62.   }
    ; c# V% `& u8 F1 _3 ^
  63.   if (Power < -MaxSpeed){
    9 {* ?+ M: c( F1 l" @2 l8 Q
  64.      Power = -MaxSpeed;
    3 _- e3 V- K( e3 y  }3 u2 d- d/ V8 P
  65.   } $ g; o' o* F# z. l# w* p
  66.   motor_9.run(Power);
    ; Z8 K- n9 ?& \2 e7 O- _+ f$ f
  67. }  
    2 j/ u' h: Z$ h* w- \$ G& R2 @( B1 |
  68. 5 G1 l" u3 J; Q1 Y. D. j
  69. void MotoR(int Power){. G- v  D0 s, ^+ \6 e
  70.   if (Power > MaxSpeed){
    ) |+ a! U3 Y6 u. g6 R" Y
  71.      Power = MaxSpeed;; f1 O# {: f* J
  72.   } ( ^$ Q/ i$ b' o+ Z
  73.   if (Power < -MaxSpeed){
    7 s8 F! g5 l4 _+ \  \0 I( m6 O+ U
  74.      Power = -MaxSpeed;
    . J( F, O0 f& ?, y4 i
  75.   }
    3 {8 j2 X3 u! y$ Q3 T. {5 d
  76.   motor_10.run(Power);
    5 x4 ?, B# A- M. V( N# D% `% P
  77. }  
複製代碼
% s# ~, U8 L5 U0 g" n+ {( D

2 k2 t; d6 `4 ?  s
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
5 N) `3 b( ]# \8 g4 M& c# l, H# ^; b0 e6 t3 m' L, D
您好,不知是否能向您請教。4 c  l  S! U2 l( X# h- `1 G3 y/ q
目前和宋修賢老師在處理Ardui Car
) ?* O$ i0 A' V- z+ v3 a2 d雖然已使用較繁雜的方式處理了跑出黑線外的狀況9 t( U/ \/ a7 e; T, ^

0 U9 Y/ ^7 _! j9 [  _但基於想追求更精簡的程式所以還是想請問一下
% i+ G; E2 D% u! I, f5 s# U就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
# s4 b. L6 W/ ~0 |6 M( U9 S# a; E: x不知道您是否願意教我可以如何處理  ]5 U1 Q/ ^6 @7 ]- R) d6 n, d: ^

  H) Y! J1 N' V6 F" _  y
# W( w5 J. J3 f( C  N, Q1 Y以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    2 P" G! i, F7 {/ H
  2. double CNY70Val = 1000;
    : N) P; d7 U; Q' `1 v2 J- H
  3. int interror = 0;
    + Y2 ~! ~. W2 R. [& J3 c
  4. int olderror = 0;9 _* O( W' P- ]- j3 y
  5. double values;
    4 C% v+ G8 c6 E
  6. ' O% D2 g8 b1 N3 j- F( |

  7. : W9 a# ^6 m2 H7 k. N+ T8 q
  8. void CNY70()! C& b" |0 E: N
  9. {
      c) s8 \" j7 e# r9 y0 y
  10.   valuesRR = analogRead(RR)
    ) o1 Q$ w" D$ [, ~
  11.   valuesMR = analogRead(MR);% ^5 h0 H( }& T+ }
  12.   valuesMM = analogRead(MM);
    ' k/ s8 |# f3 y; B
  13.   valuesML = analogRead(ML);
    ( A- z2 X4 J$ @+ w- L
  14.   valuesLL = analogRead(LL);
    : C- Y1 c2 s( O% O5 O1 w. c
  15. - Z. Q* S6 t. K
  16.   if (valuesRR > CNY70Val)
    * u8 Y1 W4 }, ?7 q* W# Z
  17.     valuesRR = CNY70Val;; ?7 _, W, o' g; |4 A/ s$ t
  18.   if (valuesMR > CNY70Val)+ _* l1 r" K$ a# M
  19.     valuesMR = CNY70Val;/ d; y5 z3 U& ^8 H$ E- i+ \
  20.   if (valuesMM > CNY70Val)% O! L# Z  P. M/ t' {7 q3 g
  21.     valuesMM = CNY70Val;
    $ V( ^: B8 c% T$ s# V
  22.   if (valuesML > CNY70Val); ^3 Z& ]$ A: z8 k  I; p
  23.     valuesML = CNY70Val;
    ! u9 ]5 u8 }+ l, R, W; z+ b
  24.   if (valuesLL > CNY70Val)6 U( E& ^: B; Q: q$ U4 }
  25.     valuesLL = CNY70Val;2 f. F# i+ T0 a6 h3 A6 b; \
  26. 3 B5 v6 Q  l* ]# a% U: p
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;; ^. Y! s: p( i! N9 E) s2 S  F: X
  28. }$ K7 g3 w+ k4 d; `  {

  29. % ~1 I$ W7 f  h5 c8 O; h4 [
  30. void Car()
    # c8 L3 \2 K( A4 o6 Z$ r) U1 \
  31. {- }& u' Q. ]& {( S& }( o
  32.   while (1) {
    + b' u0 n1 n1 M0 a' E
  33.     CNY70();
    $ O5 q* W3 M4 r6 z& I
  34. 4 @. O: z/ K- f+ M
  35.     int error = ((int)values);9 R; S! J5 T& h8 h+ ^( B
  36.     interror += error;
    . Q3 ^8 {7 W2 [5 k9 t! @
  37.     int lasterror = error - olderror;
    # k( {5 Z3 P( J6 H+ G* M
  38.     olderror = error;
    / @. X* `; G# m1 ]# `* a
  39.     int power = error / 5 + interror / 10000 + lasterror;( o( R7 y' X' q8 U0 @

  40. ( L' x! L& u& A+ E4 c  k
  41.     if (power > MotoSpeed)8 Q7 m( U5 n& s  V
  42.       power = MotoSpeed;$ {! N) z+ _8 z4 g! Q8 d
  43.     if (power < -MotoSpeed)
    ) ]4 d9 G# C$ E" t0 w4 F
  44.       power = -MotoSpeed;
    3 I' S. e5 [7 K# B. P% |0 W
  45. 6 u  t- ]$ g( c- ^) E* R
  46.     if (power > 0)
    ) a" l- a; S* A! u2 S+ Q
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。4 q- z/ V3 k6 @, ~4 v
  48.     else
    / c- e" D. X( s' D; J" B4 N0 j7 T
  49.       Speed(MotoSpeed + power, MotoSpeed);) r1 F) P- p9 n8 V
  50.   }
    : [6 [; o# z; o: \
  51. }
複製代碼
8 {/ e7 v! n* d3 V; S
2 {$ G! e" g0 r' F1 b
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-30 01:59 , Processed in 0.026570 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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