圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21792|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>- {/ F5 H3 y0 u$ r
  2. #include <Wire.h>  n% g  }& E8 P, U/ }
  3. #include <Servo.h>5 F2 S# Y8 I! `" i4 W* T* Q
  4. / n2 g8 R+ }; y% S
  5. #include "MePort.h"
    : |" `9 b9 M2 z+ p9 x
  6. #include "MeUltrasonic.h"5 k1 m2 c1 M: X+ V' W$ ?
  7. #include "MeDCMotor.h"
    : {0 \% [1 d$ z. D' [# ^# a( o
  8. $ i  }2 K) v' W: N
  9. //double Input, Output ;
    " ~% R* i0 t' T" F
  10. float MaxSpeed = 255;" Z  O/ x7 X( H4 }# A8 T
  11. float MaxPower = 180;
    . x* P. Z+ U! i8 Y
  12. float MinPower = 120;& F, X* B  z: E4 A1 y0 O! ]9 X
  13. float Error,ErrorAcc,ErrorDec;% e9 k7 D5 ?5 F/ v& e
  14. * i/ A4 t  k4 f# t% W
  15. float Kp=0.14;
    5 X- m/ X  l* _/ A: K
  16. float Kd=0.00020;//23;
    3 g+ A7 Y( m6 a. `; h2 n
  17. float Ki=0.000201;
      B0 f2 U1 I& Z1 X  V  E) U* w0 ^
  18. ) G5 u" T. \% G
  19. float nPower;
      ?. G& d* f$ |& K, v& L. ^
  20. MePort lightsensor_6(6);
    ( ^) \# E" ~6 y9 s# J
  21. MePort lightsensor_8(8);( U; G; Q" s- p8 V! V: \+ \' s! |
  22. MeDCMotor motor_9(9);
    - M9 z+ ?, ?- y8 x! w) q
  23. MeDCMotor motor_10(10);1 X* J% T& q/ T4 i
  24. unsigned long previousMillis = 0;9 D8 ^# O( ]0 \& p) O" V
  25. const long interval = 1;
    + e: `' y# A, d- ~0 }  N- O2 x- O) j
  26. 6 g9 D4 `5 O1 N( h; d
  27. void setup(){- L' ~3 A6 s8 d% m. i, T$ ^
  28.     lightsensor_6.dWrite1(1);
      R6 ^, ]2 a6 H
  29.     nPower = 160;5 v; |7 K) d% Q2 y1 ?
  30.     Error=0;
    5 V& ?) z: ]0 r
  31.     ErrorAcc=0;: y, C% q9 t4 O' O) y6 l7 S
  32. }& ?$ q' ]8 S( L) H& U- E  |. m
  33. ' F! m4 v  x; w9 h& \0 e+ A4 C
  34. void loop(){, w0 N1 k& c0 e* H/ Q
  35.   unsigned long StartTime = millis();$ k; Y  f# j6 J' E" d. k% [, O6 s
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){4 F5 }! l8 b1 H0 O
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();; o2 }# c7 R( n
  38.     ErrorAcc +=  nError*Kd ;
    / b8 y! f3 H# X+ Y) N: A
  39.     ErrorDec -=  nError*Ki ;5 _- [* ?5 ~+ r% T) B5 w- U
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    . ~. h% j1 J7 b" F" }: |
  41.     if(nError < 80 && nError > -80){1 K5 B$ a- w7 {* W4 W' e
  42.       if(nPower < MaxPower){# Q3 s! C8 E/ e5 H/ W; _8 o
  43.         nPower += 3;
    $ {+ N5 m  G& |- D$ p
  44.       }! y! K4 I" |; ]# L) ^3 l
  45.     } else{
    : F2 p- z. ?8 A3 {1 j% c! K
  46.       if(nPower > MinPower){
    ) E3 J9 ~2 n" Z# J
  47.         nPower -= 2;
    % e( E* {$ ~( s! n, Q% O. i6 l; X
  48.       }8 t% S0 ~, A6 T2 w0 {- A) P& _; B( Q! J
  49.     } 8 G0 k6 f4 h) A8 O8 X2 C
  50.     MotoL(nPower-Error);- g$ w" k& N% j0 s6 M5 U
  51.     MotoR(nPower+Error);    6 w' j+ t( o8 j7 Z5 a
  52.   }else{
    ( W, m  b6 _# f# D. G
  53.     motor_9.run(0);
    ( H/ y; J& w/ S
  54.     motor_10.run(0);
    # z' Q/ T8 _8 W
  55.   }
    6 i0 J/ P: f2 s  p; \
  56.   do{}while(millis() - StartTime < interval);
    2 f1 l2 K4 O8 n& }. H8 y4 G
  57. }9 l* J" O& W& P& q4 H
  58. 3 g: E- n; s1 L  B* `
  59. void MotoL(int Power){8 d: p; Q. \" I" }* R- q
  60.   if (Power > MaxSpeed){
    * F5 W" d! p. l  t0 T
  61.      Power = MaxSpeed;
    6 [+ z, i# @7 ^- y7 e
  62.   }
    1 w+ O5 \  N- F6 M0 q' q
  63.   if (Power < -MaxSpeed){
    7 ^, F9 I; h* x4 O5 w4 P
  64.      Power = -MaxSpeed;
    # s0 v* [! m+ X. @9 \0 E
  65.   }
    ! Y  q: I5 D& z! c! x/ W" H% c
  66.   motor_9.run(Power);
    0 L3 I7 B# I5 a7 w6 l
  67. }  
    . x" v, Z2 i$ w8 g* x. m1 W6 z
  68. $ n& Z* h" m/ |/ [. o& L+ ?
  69. void MotoR(int Power){
    & N1 {, j6 T" |- h' V5 E* p
  70.   if (Power > MaxSpeed){
    ) ]' W( y0 m" V7 j5 a9 ^1 t
  71.      Power = MaxSpeed;
    . g; u+ o6 ^8 P+ |) D2 h! I5 o  H
  72.   } ( D' Q0 I7 C+ e6 Z; |1 ?; ], l
  73.   if (Power < -MaxSpeed){; M% ^2 i; t7 ?/ W6 m  Q
  74.      Power = -MaxSpeed;
    " A) k3 D% x. `, W0 K* X5 Q+ {% R
  75.   }
    % s* f( m* V- P5 n* i
  76.   motor_10.run(Power);
    ) e' o& D) I0 c/ B  ~* @7 Q2 z- f
  77. }  
複製代碼

$ B8 }* n  ~9 r$ @1 v3 G6 K
3 w4 v: g# O! L6 T3 L
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 + T! _1 x' O% z& o  L" ]

4 b, ^1 s0 p: v5 Y$ S您好,不知是否能向您請教。
! j8 [! @5 W/ Q3 Q% D目前和宋修賢老師在處理Ardui Car+ z" g9 U' N0 v# }7 N9 c) l
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
: R) a( x' U% \/ @* c
  u" ]* j  ?2 _. |但基於想追求更精簡的程式所以還是想請問一下- x7 e% i+ x3 Y
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
, Z7 y9 c8 }6 x7 V. _不知道您是否願意教我可以如何處理* A7 e, G) b  d, m' a0 R/ a6 C
- `) ~6 |  W/ [2 k' a7 o: V! _
" E- m; Y3 ~7 [" I: G& r  Q2 Z
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    # h. h$ c# G( Z0 ]
  2. double CNY70Val = 1000;3 w; }+ C8 P1 G$ ]2 R6 w
  3. int interror = 0;
    * i/ F9 r4 Q: Z
  4. int olderror = 0;
    7 f4 w% X5 X, \& t9 ~5 A& q
  5. double values;1 R% I" n3 o  @, I3 U$ V

  6. 6 P, u1 B& ^# V: B: `% T
  7.   W" b  ?! Q6 N& p& l+ w4 R
  8. void CNY70()
    # v+ m1 m2 u6 `# p: z6 \# |! J
  9. {
    1 W2 e: O' F8 P+ A6 M
  10.   valuesRR = analogRead(RR)
    $ |. P3 s+ O/ B% }4 i6 w0 K
  11.   valuesMR = analogRead(MR);
    ! M/ j( c' i% J0 P* G
  12.   valuesMM = analogRead(MM);" F* y0 @+ c% K7 i7 J  w6 X
  13.   valuesML = analogRead(ML);
    ' t- T7 m0 C' D4 q$ Y- f
  14.   valuesLL = analogRead(LL);% a- p7 w1 H" w
  15. 7 O- f5 |1 \! u1 \- j. e
  16.   if (valuesRR > CNY70Val)
    " F  F$ {5 ^. r0 B$ K  w. ~4 z8 r) }+ L
  17.     valuesRR = CNY70Val;
    : c& L6 X  N( c! M( D+ c6 x8 ]
  18.   if (valuesMR > CNY70Val); }% d( k2 m4 O) [+ X7 \; \
  19.     valuesMR = CNY70Val;
    * G! N5 @- U2 r8 ~! T& o
  20.   if (valuesMM > CNY70Val)
    $ `3 T' V5 r" u! I
  21.     valuesMM = CNY70Val;! M/ k8 o( E# K3 K
  22.   if (valuesML > CNY70Val)
    ( T6 [( w' {& k: ?+ S$ {
  23.     valuesML = CNY70Val;  B. G9 g7 f+ z9 v, Z- y
  24.   if (valuesLL > CNY70Val)9 O3 o- R- ]4 l8 @, K& F
  25.     valuesLL = CNY70Val;
    . u) x, q  }' Y$ v2 O

  26. 3 @$ [3 r6 H- P- D) d; d$ ~. F. {
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    9 n' T4 l0 r/ V( `
  28. }
    : w4 ]; ^0 l3 G; \: ]* f
  29.   M$ C  X8 y# g9 e
  30. void Car(): u( |) b8 Z1 ?! \0 q# v0 x$ l
  31. {
    . V, j  ]# b3 Q; W3 P9 M/ e
  32.   while (1) {& {+ b; N/ D0 E: u- H
  33.     CNY70();$ W  S( D: {# R( N( P
  34. , o( z- L7 E+ E2 Q# p$ D/ A
  35.     int error = ((int)values);& ?6 F( e" f! @" p3 c1 v
  36.     interror += error;: e# P# d& B3 C' k" {
  37.     int lasterror = error - olderror;
    0 w9 A7 Q5 x3 s, ?
  38.     olderror = error;
    4 Q7 x0 ]' t$ ~% t8 \
  39.     int power = error / 5 + interror / 10000 + lasterror;
    % A( U) l2 T( l& v: r

  40. ( H$ A. C" N, ~: y: B" ]
  41.     if (power > MotoSpeed): M& g& b( Z- j$ L5 i' e2 Y
  42.       power = MotoSpeed;8 W( J3 {& [  E4 E4 z& i
  43.     if (power < -MotoSpeed)
    4 E, Z- U0 j% Z! t: h3 E! O
  44.       power = -MotoSpeed;
    6 X9 n  l; \: E: A: H4 U4 G$ ]
  45. + V) ?; W0 d, ?( k8 o* Q
  46.     if (power > 0)
    6 m: X/ z9 Z# ]. e* I
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ! [- Y0 k8 l9 [, M3 w( R1 E' Q: x* k" w
  48.     else
    # O! U( F; O# \. B. j
  49.       Speed(MotoSpeed + power, MotoSpeed);7 l* J" \6 D% `; @9 k
  50.   }, n) b7 ~* k0 p' a
  51. }
複製代碼

; ]) s" K  z# g: u/ v7 ^2 Q, h" p0 ~4 q2 V, `* j
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-1 09:37 , Processed in 0.021399 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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