圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21631|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>) l/ C- b* s  H/ P' W5 d( Y
  2. #include <Wire.h>) v: z4 o8 H3 F& `5 e/ H3 i0 W
  3. #include <Servo.h>
    1 t6 r: X( Y+ s- ~  b2 a5 A

  4.   M, S9 B0 Q2 V
  5. #include "MePort.h"
    & d" `8 r; @9 S* [( |
  6. #include "MeUltrasonic.h"2 u: v+ x* @; A, |( c
  7. #include "MeDCMotor.h"& W; ~& E3 @" N, ]0 W6 B: v+ \9 S

  8. 8 e+ c# c( u+ h  i; y
  9. //double Input, Output ;1 _( u! B3 w9 P
  10. float MaxSpeed = 255;
    ) p) t3 \! f1 o% [% j
  11. float MaxPower = 180;& I1 G( [$ Y$ w6 H4 q
  12. float MinPower = 120;
    ; n8 z& I4 O9 N- Z) o( x+ q
  13. float Error,ErrorAcc,ErrorDec;) j# Q+ \7 \9 I6 M- Z

  14. % r: P8 W+ T/ f. ~  p; j$ R
  15. float Kp=0.14;
    3 Y4 c6 H: P2 D
  16. float Kd=0.00020;//23;- a7 d6 \( Y! W5 o' _4 h
  17. float Ki=0.000201;4 ?7 `5 m  c' \- u' c) E
  18.   q! J" y, q- f5 S) i3 B7 y( b! Y& M
  19. float nPower;* I) ^) j; R7 Q4 s* }2 E$ T
  20. MePort lightsensor_6(6);  ^5 _0 u/ x- {3 k2 U
  21. MePort lightsensor_8(8);9 ?6 [/ W3 E2 B/ a  J
  22. MeDCMotor motor_9(9);
    4 g, L: ^, W/ q$ a9 V
  23. MeDCMotor motor_10(10);
    $ c6 Q$ Y1 n; `! A7 b# n
  24. unsigned long previousMillis = 0;9 T7 W9 u* C& b2 [+ }" u$ {, u
  25. const long interval = 1;$ R. [5 f: g0 ^! ~$ F. ]) V0 F$ ~

  26. 0 X  `5 t3 d( R. S  H
  27. void setup(){2 w& `6 l% ]/ M! c& l& b
  28.     lightsensor_6.dWrite1(1);1 i) N  J. y1 b5 i! Y# e
  29.     nPower = 160;
    8 R* b3 T! ~* l& s* w6 s
  30.     Error=0;
    8 Z; p0 `' Y6 [7 I2 d
  31.     ErrorAcc=0;
    ' w) {6 b. l! K# o
  32. }% n9 |+ a" @% C8 d% h3 Z
  33. " ?' v1 b* ]' a1 I$ N
  34. void loop(){
    8 n' Q, O6 z9 w5 b9 W, s* M
  35.   unsigned long StartTime = millis();, C, c& W0 o$ }! o
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    # ]$ j) ?7 [! ^9 W
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();7 K% Y2 H3 _# m% J& a
  38.     ErrorAcc +=  nError*Kd ;- p5 K. H0 D1 J/ f5 A8 m( M. ?! m
  39.     ErrorDec -=  nError*Ki ;
    / y+ l5 J' s, ]
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    . c- ^) A+ u/ V
  41.     if(nError < 80 && nError > -80){
    , A( D* K  f# h
  42.       if(nPower < MaxPower){3 N' T1 ]1 t+ g' a* p2 y: i
  43.         nPower += 3;
    # C7 S, [. l  S% {+ F8 @9 B
  44.       }
    ' F/ o7 C: f. B) @
  45.     } else{
    ( [% g3 O: p- X# W
  46.       if(nPower > MinPower){
      o4 K1 `( Z' }2 E+ ~6 L( T
  47.         nPower -= 2;
    ' {0 n* V( b3 I: Q* N7 u
  48.       }- M+ j. Q- Q" ]3 [" j; Z
  49.     } ; `2 |5 ^; t, \, G! v" l9 U2 Y
  50.     MotoL(nPower-Error);
    # Y8 T$ C) m0 T$ ^
  51.     MotoR(nPower+Error);    2 P4 i% K' K4 B5 y  B
  52.   }else{
    & H6 U) {+ m3 R2 O' E4 M8 ^
  53.     motor_9.run(0);& M  m6 M# H/ l: J" s1 y2 g
  54.     motor_10.run(0);  n* {, S4 ^, |' X/ v8 f
  55.   }
    . ?  w7 X; G, `
  56.   do{}while(millis() - StartTime < interval);
    ! I% y$ Q& y- H7 ~* |6 r( E7 J
  57. }
    $ z- }3 X2 N1 g& g
  58. 7 V" `/ {  \2 b
  59. void MotoL(int Power){
    4 z% s: Y' d/ A5 Z
  60.   if (Power > MaxSpeed){
    : O: }* I& `+ @. B
  61.      Power = MaxSpeed;
    ( O2 T' i* s& W% T- [' l
  62.   } . {& ]4 ?9 S  C2 r
  63.   if (Power < -MaxSpeed){) \. ]/ H& p+ e/ k. \/ t
  64.      Power = -MaxSpeed;
    9 |3 K: e/ b. g, X4 w
  65.   } 7 R( J" N: y8 z2 P) }7 A
  66.   motor_9.run(Power);
    9 K8 c$ A( T/ y: H
  67. }  5 x& W9 |( u& z9 l& W

  68. $ K3 g  b# Y/ N' }
  69. void MotoR(int Power){
    7 [4 Q( H8 C1 K  w) t
  70.   if (Power > MaxSpeed){
    . n5 e( y3 Z/ I- s: ?% J
  71.      Power = MaxSpeed;
    : w  \/ u2 j. z6 W8 @
  72.   }
    9 C0 v7 b/ l( t0 m% M$ ~# l
  73.   if (Power < -MaxSpeed){
    : v6 ^& ^1 ^1 q& x$ ]7 N, v
  74.      Power = -MaxSpeed;+ Z1 G8 _- p& T/ {& v
  75.   } . A9 {6 s& C, i/ n' [7 |% U& }
  76.   motor_10.run(Power);
    ) {" `3 M8 t% ^& D: o
  77. }  
複製代碼

8 [* g/ S0 t8 Y& Y# ~3 O9 l: d, F; I$ l% q
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 $ E( B$ O2 B8 o, n
  d% u& N8 M( w+ b* V6 ~' U: D
您好,不知是否能向您請教。& X6 U0 f: B) i5 B: v
目前和宋修賢老師在處理Ardui Car
9 D4 U- [3 k' O# d& H& q雖然已使用較繁雜的方式處理了跑出黑線外的狀況3 e8 B% P/ c8 L6 `4 D* j& }

7 v4 }3 f( m  z) ]# r8 \% W但基於想追求更精簡的程式所以還是想請問一下# _8 I' c' `6 y3 y+ x2 E
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
, a. ~! N/ I* \  x+ g不知道您是否願意教我可以如何處理
9 D- y# e1 f# w" m$ ~9 m! q: y- _1 _+ J- s  z2 a
6 h# U2 w+ }/ K' p4 s
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;, |: X! U* ^* d  d3 d- l' Y
  2. double CNY70Val = 1000;
    ; J6 B4 |0 F1 H: Y6 F
  3. int interror = 0;
    5 R$ K& b3 `3 N- B( x1 W3 N, _
  4. int olderror = 0;3 m' |8 ^0 L6 q
  5. double values;- D# M% _7 u9 y. e

  6. , H* Z6 A4 i: g

  7. 0 d& I, h7 v& p/ i+ u4 y
  8. void CNY70()6 ^7 S/ `4 q3 n# ?" T" a. ~& k; I
  9. {5 U$ q3 o; k- R* u$ c/ ?1 X
  10.   valuesRR = analogRead(RR); W. r1 _" E$ i9 V- ]& s
  11.   valuesMR = analogRead(MR);
    7 _/ B) Z( }# W
  12.   valuesMM = analogRead(MM);
    - B) e3 Q7 I" x3 `0 h4 b
  13.   valuesML = analogRead(ML);3 M& a7 c1 B' V9 w0 H
  14.   valuesLL = analogRead(LL);' J) [- T. a0 h2 J

  15. 6 v- ~6 n2 B/ b1 |
  16.   if (valuesRR > CNY70Val)
    $ L1 b/ ]8 }* s7 \9 t
  17.     valuesRR = CNY70Val;
    & f/ c9 N( @+ T7 p: {
  18.   if (valuesMR > CNY70Val)' i8 {4 w  J  t' f7 A
  19.     valuesMR = CNY70Val;
    4 k* l+ `4 J0 ~: |9 i# C. u' X
  20.   if (valuesMM > CNY70Val)
    & X3 T( I: h* S. w
  21.     valuesMM = CNY70Val;
    ; c) S* u, N+ B- ^2 Q/ N% i+ q
  22.   if (valuesML > CNY70Val)
    $ {8 Y# z8 v; g# l. M; f
  23.     valuesML = CNY70Val;
    4 z& T) M$ p& G& U3 {
  24.   if (valuesLL > CNY70Val): y! |( V: U% R+ @: |+ k  ^
  25.     valuesLL = CNY70Val;
    . V7 S  n. Q! u. W6 L2 N
  26. $ O# h) Y, U5 T) }! h( z
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;7 U: ^3 c2 Y- I
  28. }
    9 l( C2 B) m7 U
  29. % |! g/ c* q: g6 p" v, C* W2 i" A7 n
  30. void Car()1 Y7 N' u2 y6 b
  31. {3 t5 @# q% E  o5 ~& z
  32.   while (1) {
    " D7 L9 M# I0 X7 ]/ X* N
  33.     CNY70();
    , v- B9 V0 _; m! C" P6 U

  34. " R+ B0 ]+ H4 [6 G+ S7 q
  35.     int error = ((int)values);
    9 e$ u+ ~$ A  H( {: n6 `
  36.     interror += error;$ ]' [( T& L( F% B# {$ Y
  37.     int lasterror = error - olderror;
    5 `9 E* h; P* X) A+ _+ T& e
  38.     olderror = error;
    . L: W( [: H2 q, _3 I8 y
  39.     int power = error / 5 + interror / 10000 + lasterror;
    & Q& A3 K' x% V. O" E/ x

  40. " \& b+ G) i" X6 J  M# _
  41.     if (power > MotoSpeed)8 R! I& g' M; f0 P9 ?% n' R) l( S
  42.       power = MotoSpeed;
    ; Q! U% a6 i$ l( Z8 _
  43.     if (power < -MotoSpeed)
    % _( h% k5 C5 ~4 H' j
  44.       power = -MotoSpeed;8 f1 v( I% t5 ^2 H5 u
  45. # B- c/ B( U% q4 e! U  D' S
  46.     if (power > 0)- h+ j6 T# _% C( a! @+ F  B
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    5 z* n0 h5 |: i1 B' k) a
  48.     else
    - v' q+ l7 u+ V$ p
  49.       Speed(MotoSpeed + power, MotoSpeed);9 k6 A7 l- k% H) w$ {
  50.   }
    6 D: Q/ |7 i  D. `! `( U6 a) y
  51. }
複製代碼

3 N' A6 H5 ^. P  V
/ B- h, \0 q. R/ w
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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