圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21816|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ) V( X2 N$ F8 I( `- O/ D. J8 E
  2. #include <Wire.h>
    1 D$ ]2 P9 v/ e& B
  3. #include <Servo.h>
    9 J  y- o; N1 U4 Q. N3 j2 D/ T3 h/ r
  4. 2 A7 n! G6 q: @3 @
  5. #include "MePort.h"
    2 N" C# n+ E# G; E- V, ]; Y
  6. #include "MeUltrasonic.h"
    / M* a6 e4 g; i" ]+ ?7 @/ S- t
  7. #include "MeDCMotor.h"0 H9 @" n1 R; W" Z% X9 i
  8. : l0 ^9 R2 W5 ?& i9 j- Q/ p
  9. //double Input, Output ;2 x, j& q) q' m, I- W2 {' H
  10. float MaxSpeed = 255;
    7 ~9 O7 u5 \+ w: ]
  11. float MaxPower = 180;
    # H% H% ^1 ^# {9 e- V
  12. float MinPower = 120;
    0 Z+ n1 ]8 p. [8 `! B& v; U
  13. float Error,ErrorAcc,ErrorDec;* S3 N! p, w4 F  n& ?

  14. ' A1 }" b$ i) i+ z$ i3 ~
  15. float Kp=0.14;; ?1 Y: e" ~6 B6 y* a, f
  16. float Kd=0.00020;//23;4 a, Z8 S9 s( Q* r' `! \
  17. float Ki=0.000201;
    / z; q. m% K( P* x+ }: x

  18. 3 q( y1 i3 r- U4 V. p/ Y
  19. float nPower;
    0 C& Q: g# r9 ~1 U
  20. MePort lightsensor_6(6);
    ; Y! u' X. I4 `/ Y6 s, J! d
  21. MePort lightsensor_8(8);7 ?7 w0 J. v+ `  ~: V
  22. MeDCMotor motor_9(9);' N" E: {6 h. b. f! `' Z
  23. MeDCMotor motor_10(10);. B* P; h9 l! c. R# A) ]
  24. unsigned long previousMillis = 0;" Z" }, h. x+ y$ h  F  s0 `
  25. const long interval = 1;
    $ f! @3 U- K/ l; S8 \

  26. & a, d, }$ k5 P. \" s- z
  27. void setup(){
    ) b7 i; R9 _1 ~5 a: B
  28.     lightsensor_6.dWrite1(1);. y& z; S, C& j, g5 K( t3 ?- R
  29.     nPower = 160;
    9 f! g' N/ P1 j! C* V+ u
  30.     Error=0;- s; J9 b" N0 O' N% U
  31.     ErrorAcc=0;
    ) H5 m8 x; w9 R* g" g" o
  32. }
    . O% f$ r' i4 D# A7 R/ T$ k5 y: |7 Z

  33. ; [, K5 M% q1 h2 H9 R3 h, t. h
  34. void loop(){
      W- A: \" a8 e: q/ y2 L
  35.   unsigned long StartTime = millis();
    5 U! d0 b/ S2 F2 V% O: |
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    & V7 b- o" Z- f8 Z7 g! w" W
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();0 a/ H( s2 Z7 `
  38.     ErrorAcc +=  nError*Kd ;
    2 J: c2 F4 o7 ?# t5 }' A, r
  39.     ErrorDec -=  nError*Ki ;+ ]+ t6 N7 A) K( _, \& d
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);# }1 p0 c, k" g" [1 V
  41.     if(nError < 80 && nError > -80){' P6 C5 m- V$ U1 f( x6 `" U
  42.       if(nPower < MaxPower){
    ; @+ t0 U: Q  L% U& d' Y* ^! O
  43.         nPower += 3;8 I6 @! G* h4 ^* T4 [
  44.       }% Q+ m' P. p. \8 f
  45.     } else{) v4 G1 G. U' ~; R) B
  46.       if(nPower > MinPower){
    3 K- G. E0 i: m7 a
  47.         nPower -= 2;, o' P. e( z/ A. x5 p+ f
  48.       }9 t& w" T( e$ F/ u! s9 v0 D
  49.     } * h$ ^2 G4 L' }6 E9 @
  50.     MotoL(nPower-Error);2 G* p, O! M. e# r+ _/ j" x+ O, ^
  51.     MotoR(nPower+Error);    4 r* Z# H- J$ y( F, M/ g4 e( n
  52.   }else{% L8 M/ c: T! a: T
  53.     motor_9.run(0);+ t* z- y# a& |' `2 k* {( ]
  54.     motor_10.run(0);
    1 S* I2 {' L* t, G3 Z3 e
  55.   }3 o' M4 T/ ?, _  N
  56.   do{}while(millis() - StartTime < interval);) Z3 o1 B; x# \5 n9 \
  57. }; z& ]/ s2 W2 I* I/ R5 Y( p8 k* Y6 p

  58. ( R' ]7 q5 p8 I
  59. void MotoL(int Power){# n9 V, o; Q; K* v9 U8 e1 E$ |
  60.   if (Power > MaxSpeed){
    % E0 G  w! Q- m$ C1 ~& _4 T# i
  61.      Power = MaxSpeed;1 E' @# T: K& R7 r# r' Y9 z! ~5 G
  62.   }
      V6 W+ B. L  u4 z& v1 F4 t* p5 C4 P
  63.   if (Power < -MaxSpeed){0 a, k  `  ]0 ~/ G
  64.      Power = -MaxSpeed;: a! P! {6 L6 s: g( {# @4 q
  65.   } ) Z' Q; |- l/ y- K) O4 b
  66.   motor_9.run(Power);
    + ]5 Z4 g- V! K' j( [6 G
  67. }    o8 i+ J, q1 W6 o3 D2 r% n- b

  68. . |  l5 C; D& o& ~& ^4 b
  69. void MotoR(int Power){
    * z5 @& g! `9 c; @
  70.   if (Power > MaxSpeed){
    + a. ]+ t3 H, v& V* b
  71.      Power = MaxSpeed;0 _2 M2 W4 H; i; h+ v, M( q8 }) X* p
  72.   }
    ) L. |, V4 h- v6 i$ @
  73.   if (Power < -MaxSpeed){( H8 N4 L% X5 f7 p
  74.      Power = -MaxSpeed;0 t  R/ i# l0 ?
  75.   } 4 p% [# k0 ]4 _
  76.   motor_10.run(Power);
    : C$ i0 `2 R' H5 ?, {
  77. }  
複製代碼

, {& i0 e" P5 m9 {* ?- c
) W% [- y( k, L6 R
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
" ^5 C3 K( ^) t' G$ m1 K$ E' R6 N% m% x0 v
您好,不知是否能向您請教。
/ W3 t1 i* g! [9 `: W; V( b目前和宋修賢老師在處理Ardui Car0 q0 \) y+ \0 ^/ \& L
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
( r8 N' L. {9 N# T& u2 W2 H) b! s" P  |& x) g  O
但基於想追求更精簡的程式所以還是想請問一下: w. Z0 b" A  w/ t" V& w' g
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
6 V6 ]' O; D) N# m+ ?9 {不知道您是否願意教我可以如何處理8 K7 P# Q: V. Q# B) ^+ N

0 D" W/ n: a! d$ F
1 |  k5 a! h# r: }( I$ ~: k" E以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ; u8 J+ g7 e0 D3 e( e. {" _
  2. double CNY70Val = 1000;
    0 ?7 l: [( Z& _. E2 I) w7 O# K3 Z8 i8 V
  3. int interror = 0;
    6 A# p$ B! l. l! Z  b) a! A
  4. int olderror = 0;! Q2 L% O  `1 f$ `" Z' x% d, A
  5. double values;$ n9 \4 E! }: K- ^1 s) z6 [6 I
  6. 0 {1 `! t2 }& G
  7. & H3 ]. e% k, j: ~+ `# ?) \  W
  8. void CNY70()' r, ?5 ]* N- O" |" b
  9. {
    2 \6 H2 W$ ^! |7 T( w  Q1 ]
  10.   valuesRR = analogRead(RR)
    ' E5 M5 Y! W: `: O
  11.   valuesMR = analogRead(MR);
    0 l6 ^& M5 v6 Q7 m# L
  12.   valuesMM = analogRead(MM);- ^5 U- g% ~. I; a2 ^
  13.   valuesML = analogRead(ML);8 }; z- j$ x" B  ]' E+ r- G
  14.   valuesLL = analogRead(LL);
    9 J" C  |& D3 m" E! P2 i$ w- X7 E; s

  15. 7 U; c- x3 E0 n# r) z
  16.   if (valuesRR > CNY70Val)
    $ O9 ^; T& j( F% ?
  17.     valuesRR = CNY70Val;
    8 j; H$ S+ y; t4 ~
  18.   if (valuesMR > CNY70Val): F" u  B! b, A0 {4 ~
  19.     valuesMR = CNY70Val;
    ) r$ |( ~7 u( W9 {) L( o! y  H# m
  20.   if (valuesMM > CNY70Val)1 H; A3 h/ h4 Y& a' F& J. }( }+ k
  21.     valuesMM = CNY70Val;
    ( j9 R7 M/ A8 _, c7 O
  22.   if (valuesML > CNY70Val)
    # J' r1 w% `, U- s* _
  23.     valuesML = CNY70Val;
    1 y- }5 e& z- q
  24.   if (valuesLL > CNY70Val)
    7 B, L, v2 Q$ ^. L( }+ H; y, M3 h
  25.     valuesLL = CNY70Val;
    : A$ t  j6 b; H7 h8 c& H4 @& K
  26. 1 ?7 z  u$ s+ x6 J
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    + \3 ^6 R2 i% A. _8 s" K( O
  28. }
    : \* T" q6 x1 C

  29. $ U; t, _/ u6 ^' a
  30. void Car()
    : o  g2 Z4 j1 a" D8 C, v( J4 X" ?
  31. {
    ' H4 g- n" F1 E, b, T# a4 r
  32.   while (1) {3 Z; D8 @& y3 D: ?6 n
  33.     CNY70();, R6 n8 C( C' E

  34. ' m3 W0 K2 o  i, \# M1 @
  35.     int error = ((int)values);
    1 R! p( M/ g* `7 K6 l
  36.     interror += error;
    7 Z+ r! \- `1 p7 D. t4 x2 |
  37.     int lasterror = error - olderror;
    ; s1 f0 C  A; ?, f' I
  38.     olderror = error;. x7 R& Q$ J$ r! s3 E) h. }) ~
  39.     int power = error / 5 + interror / 10000 + lasterror;+ W4 T3 ]. P' y# J; C1 Z# h  _0 q! ~
  40. " i3 {: `) c: v9 }' a/ U3 e/ `
  41.     if (power > MotoSpeed)
    : T' Y! y5 k+ h3 }
  42.       power = MotoSpeed;
    ' {5 E- W8 R1 q) I! U% X2 I' q6 a
  43.     if (power < -MotoSpeed): n2 h0 h% n- K! L1 v
  44.       power = -MotoSpeed;# [4 e/ x) N3 S. Y+ u3 O# y3 p

  45. ' b+ d7 I0 c2 ^2 U$ x; D4 w, ]
  46.     if (power > 0)8 u! _# j, y5 c  [) [
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。; d! G9 Y  Q& }" b; O" |
  48.     else9 ~7 a2 x) d3 H5 m, o
  49.       Speed(MotoSpeed + power, MotoSpeed);
    4 L  U% m( x9 P: l
  50.   }
    7 w* ]9 k  c4 A
  51. }
複製代碼
. ]' T8 n/ z3 z7 L$ T% S
/ S9 J# X: n% K* {/ o& l. X
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 06:58 , Processed in 0.025329 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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