圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21377|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>, M: Y1 S( h3 H! q/ H
  2. #include <Wire.h>
      s! Z1 W# [7 w4 S9 U: s
  3. #include <Servo.h>+ [. x( s! g  u7 ?

  4. ' C3 |% v9 r9 @2 t  U
  5. #include "MePort.h"
    / ?# c1 h$ L6 t: \  I6 ~. `
  6. #include "MeUltrasonic.h"
    : G; j+ {' `- M: E% ]
  7. #include "MeDCMotor.h"
    + d6 F9 i& }5 Y6 p% u; W* k

  8.   s9 P! q  r. [4 Y# T3 s' E
  9. //double Input, Output ;: T" F  a  A  L9 n9 h8 V% A
  10. float MaxSpeed = 255;# \) N3 \( P" e+ {
  11. float MaxPower = 180;
    4 z/ [% I) m# ?% P( S. i- B7 I& E
  12. float MinPower = 120;
    9 @: y8 ]' s/ v, D4 D; u  J
  13. float Error,ErrorAcc,ErrorDec;% K- x/ Z6 \- v  `) G+ V! n
  14. 0 u# W8 [7 ~4 e
  15. float Kp=0.14;
    # _5 \; O% I4 [8 r5 f. X, F
  16. float Kd=0.00020;//23;
    9 F; o1 ]! r6 K, ]1 A0 p+ r
  17. float Ki=0.000201;( B% l) d- y/ f/ A$ Y; a  d; A
  18.   e+ K5 ]4 v# A: {' Q
  19. float nPower;- u. L, M+ v* h2 A- ]8 g. d
  20. MePort lightsensor_6(6);
    # t/ O6 j6 K/ f7 R8 H  B2 F
  21. MePort lightsensor_8(8);
    ' G) V8 f/ T! N. p& g) f
  22. MeDCMotor motor_9(9);
    " C0 [% c( m7 l6 W/ H
  23. MeDCMotor motor_10(10);' |/ G( A2 |+ z* @' G" r
  24. unsigned long previousMillis = 0;
      ?! w# O- e* w# J
  25. const long interval = 1;; H6 r3 U# U, q+ {$ R4 K
  26. + a" [! z* m7 k; P; @
  27. void setup(){) l: w/ t7 `% r5 j# V- i
  28.     lightsensor_6.dWrite1(1);
      I% k1 |9 O+ g! g* ~
  29.     nPower = 160;
    0 q/ X3 w" F  }2 c7 z
  30.     Error=0;4 O: s' X  B6 H6 E
  31.     ErrorAcc=0;. \$ k( E7 W0 \- n$ E, l
  32. }
    * m: j0 K3 a$ ~' \, r

  33. $ u3 X) X5 U% m
  34. void loop(){- e, `3 Q1 C% X2 ^
  35.   unsigned long StartTime = millis();" h( D- m$ Z/ Z$ B5 p
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    % N2 h8 l) t/ p  [
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    0 a2 i5 p6 k2 _' e. e: H
  38.     ErrorAcc +=  nError*Kd ;
    3 x! w- L6 P- M1 e3 ~! l; I3 A" p
  39.     ErrorDec -=  nError*Ki ;1 {+ g# T5 B  J
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
      Z4 r4 [# X% K7 T, G8 O8 R5 r- k
  41.     if(nError < 80 && nError > -80){
      {- i# B( [% m4 M
  42.       if(nPower < MaxPower){
    ) x6 r+ x2 S6 L: A; q' Y- t1 J* P
  43.         nPower += 3;+ i2 b) Z8 K7 k4 b
  44.       }  e0 a! e0 m' _( y6 [
  45.     } else{' V( d$ x% E; t4 K/ x4 h
  46.       if(nPower > MinPower){
    ( x# r3 z/ m  Y
  47.         nPower -= 2;
    ( C* s' v9 {: m" C7 D
  48.       }, `+ ?( ?  E: d: V, v
  49.     } 0 ]* k! D( S7 H
  50.     MotoL(nPower-Error);
    * ~, o+ r7 S* _! b( ?/ y! \  w
  51.     MotoR(nPower+Error);    0 r2 K: C6 B" P! h2 r  S9 z
  52.   }else{; ?+ K$ ?& w* U% K
  53.     motor_9.run(0);4 ~. J  F7 K. B: j' o7 Z
  54.     motor_10.run(0);, y, [4 i2 f- a" w+ K7 E) s
  55.   }6 D0 M" C5 E2 `' G
  56.   do{}while(millis() - StartTime < interval);3 O6 X8 f. ]- m- @
  57. }
    : r1 F9 S0 N( Q7 B1 U+ k4 f
  58. * _& ^7 G* F4 j
  59. void MotoL(int Power){
    9 v* q; ^7 t( s2 b% U; N) B
  60.   if (Power > MaxSpeed){
    . n4 g+ Q2 G' b+ B# x
  61.      Power = MaxSpeed;
      T! h% k% _! q& s
  62.   } : l' J( L; R. N2 b0 ~2 f  ?1 z7 X
  63.   if (Power < -MaxSpeed){& n, Y; Q$ l6 r2 N% o1 [
  64.      Power = -MaxSpeed;
    4 Z% ?6 s, `6 L  Y( [" Q
  65.   }
    + f1 x+ t5 |# _1 F4 v! A
  66.   motor_9.run(Power);, q7 {- e& B0 ^
  67. }  
    # t6 K0 P+ y" f& F/ W
  68. 9 v$ v+ y9 P0 B) t9 j
  69. void MotoR(int Power){
    ! t9 z/ a% d1 g' Q2 A' j" {& i
  70.   if (Power > MaxSpeed){! ?/ I& o/ U; t% k" z$ L9 W
  71.      Power = MaxSpeed;( m+ {9 F" M- E' b
  72.   }
    & b7 y0 ]: s" D2 o4 \
  73.   if (Power < -MaxSpeed){
    3 h8 s9 t5 o) z, d7 O; T
  74.      Power = -MaxSpeed;8 N- ^- y  n- |4 Q* s( f' ?
  75.   } 7 }5 C! ^7 ~' E/ G0 ^
  76.   motor_10.run(Power);, ]1 x. p1 G/ P& L# e, t) M
  77. }  
複製代碼

( i) [1 {; M6 H+ a& l5 _# S1 H7 B% D9 ?% s: n
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 / L4 {) _3 J/ y" [8 D

, r9 U4 I& T; E您好,不知是否能向您請教。" s3 U# M% i( y2 S# ^4 k' q- J
目前和宋修賢老師在處理Ardui Car+ T5 P% f: d' p0 s: ?" [+ {. m
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
7 `* o3 g6 s6 r  y% L2 y3 W) E1 C  h+ X9 W% Y, P
但基於想追求更精簡的程式所以還是想請問一下
0 l1 H' i0 O2 B3 {% v就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝  e& g. `1 @2 V8 ^) d
不知道您是否願意教我可以如何處理' z; G& u8 [7 L5 Q5 j

2 s5 p7 S& q  R6 }. I; I4 D
1 X# W  E  T, f4 j4 u- `以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;5 A4 m' a# x. \8 F
  2. double CNY70Val = 1000;
    ) R+ ?/ W8 F7 f1 e
  3. int interror = 0;& r# K4 i7 j. T2 u, o
  4. int olderror = 0;! n. n, V% e" _
  5. double values;0 `% G0 M  V9 {1 E& d

  6. 0 O( E& J0 I9 ~
  7.   a8 v0 b( n) ~$ [0 d& m
  8. void CNY70(), F$ l2 e# `9 k) V
  9. {
    : k1 z. j$ a) e+ G  [, k# s0 P
  10.   valuesRR = analogRead(RR)
    # a4 U' O% V: d% o/ r! f& [4 O
  11.   valuesMR = analogRead(MR);6 V) B, I) D; |2 ]4 Z; l6 R1 f
  12.   valuesMM = analogRead(MM);
    : z$ ], s3 t$ `: l1 o. N
  13.   valuesML = analogRead(ML);
    / a, d: c  o# k) v$ n
  14.   valuesLL = analogRead(LL);
    0 M1 X  w' ^$ X$ M  V
  15. - [: m: {  q8 j8 s  ]7 B8 N9 o
  16.   if (valuesRR > CNY70Val)
    ; R& z( q6 \' `" q, G
  17.     valuesRR = CNY70Val;6 _4 m# J( l% c: `' D# e
  18.   if (valuesMR > CNY70Val)
    1 r7 n' c& n" z# F
  19.     valuesMR = CNY70Val;
    ( t8 F% w+ h7 c- m
  20.   if (valuesMM > CNY70Val)
    , n$ `+ }: k* z4 v- M& _
  21.     valuesMM = CNY70Val;* [* [+ e8 Q4 ^0 V7 L
  22.   if (valuesML > CNY70Val)
    - C: e$ `5 D) ]5 ~+ A
  23.     valuesML = CNY70Val;
    5 E/ r/ F2 T- s* a2 y
  24.   if (valuesLL > CNY70Val)( F5 ]% w' }7 M+ w. {8 p$ i
  25.     valuesLL = CNY70Val;; y) ?% c7 F- B- E8 y
  26. - P" ~  n4 N# `9 j
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;& c% J# ~* L- L" T$ P4 J4 ^4 D) y3 Q
  28. }) p* W! Q  V3 o- g# S
  29. . R; j7 Y6 I0 A% H: h& c
  30. void Car()
    7 g. V1 }* g" h+ A& h- n4 Y8 `8 x
  31. {& K0 L5 A- M: A/ G& G
  32.   while (1) {8 ]% ]8 r/ ]- J3 u. y, Q. y/ z# L
  33.     CNY70();0 g3 R6 P( U! Z1 H  n! h, i7 e
  34. ! c. G6 k, a# j0 d# `0 K0 w
  35.     int error = ((int)values);
    # M0 |1 Q4 H. k5 F" W
  36.     interror += error;
    ; s: b: w5 A8 W0 v' J
  37.     int lasterror = error - olderror;
    - R; U1 w- H' t
  38.     olderror = error;
    ( X+ @8 F3 e) I3 Y( f& B
  39.     int power = error / 5 + interror / 10000 + lasterror;! |* H$ U5 ?# l% x

  40. 8 o' j. g) u3 T. n% H
  41.     if (power > MotoSpeed)
    5 T2 D$ h3 I4 H" P+ G
  42.       power = MotoSpeed;
    1 V) X, @+ a2 R- Z* z/ V
  43.     if (power < -MotoSpeed)+ U$ s* N+ X% {% B% X% X
  44.       power = -MotoSpeed;
    . ~6 M* U5 }$ Q8 x* l6 y
  45. ! }: w8 O. T8 t" |1 h
  46.     if (power > 0). W& |3 [1 M! ]% p9 |  ^
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。, D9 c, E/ X/ |; }9 F' B
  48.     else4 G' V) a+ I7 m7 d4 |! X0 ]
  49.       Speed(MotoSpeed + power, MotoSpeed);) e9 W/ \2 e9 u2 C
  50.   }: g; p! E4 u% L# m8 ?
  51. }
複製代碼

( l. k# ~+ l8 m/ j1 k
+ a' e; C1 Z3 I
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-9-17 08:11 , Processed in 0.025816 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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