圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21848|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>+ \0 j/ b/ v9 d) i% r$ S# g
  2. #include <Wire.h>
    1 M" o$ Z: u' r$ ]5 L" o5 K
  3. #include <Servo.h>! k& o3 ^6 I9 O/ {

  4. 9 Q8 b8 H' |& G  n, i
  5. #include "MePort.h"8 K! G3 M) K8 I6 G, c/ d
  6. #include "MeUltrasonic.h"* n# [0 ?' b3 T' w# P9 K3 Y
  7. #include "MeDCMotor.h"% N2 q+ v- K2 J( n% ~
  8. , Q$ V) l6 ]- r8 s. s- N- o
  9. //double Input, Output ;
    * W9 R4 _+ d  p$ O
  10. float MaxSpeed = 255;% z7 @( }' d$ h+ j' U% R; z8 B! K
  11. float MaxPower = 180;7 p: a: D8 S$ W" M( J+ _
  12. float MinPower = 120;
    + G9 I4 Z3 w- M; a
  13. float Error,ErrorAcc,ErrorDec;
    # m0 ~) o3 k% \6 _$ G6 S( p* R1 l

  14. 8 @0 I) j1 U* u9 `& Y! p
  15. float Kp=0.14;- ]8 R4 V; e2 c: {& T. G
  16. float Kd=0.00020;//23;! ]2 O, S$ ~: Y# e6 a
  17. float Ki=0.000201;1 V, n- [4 p' W! s0 r

  18. * K7 E" o( ]( Q  f) [  u
  19. float nPower;) {, V3 r/ p3 M" N* [" T2 O
  20. MePort lightsensor_6(6);
    " u( S& {  h$ i
  21. MePort lightsensor_8(8);5 E1 c, Q' G& T- Z' j+ `0 ~; Q
  22. MeDCMotor motor_9(9);4 |$ l; I; D) I4 n( Z8 g
  23. MeDCMotor motor_10(10);5 t) c2 m9 Y( p( X# A  m. q
  24. unsigned long previousMillis = 0;
    ' `; T5 B1 w; b
  25. const long interval = 1;
    + f' D  _; n* @; z; s0 j. T$ i0 B, `
  26. + Y9 N+ p# |6 o$ i8 ?9 x  t9 x9 Y- f
  27. void setup(){
    & ?7 w  {1 f/ f- Q; Q$ v' C
  28.     lightsensor_6.dWrite1(1);
    ( s& p; {6 ?. `4 @9 J) n9 G3 v
  29.     nPower = 160;
    + ?2 d7 m* ?! {! ~2 p- X
  30.     Error=0;
    * T% v% V% V. s: T4 }
  31.     ErrorAcc=0;
    + S- c) G* f2 L9 f) R1 P  x
  32. }
    ( V  b0 M8 s2 R! ?0 ]

  33. 4 ~0 R1 d! B8 b& t
  34. void loop(){
    # t  q! j. U* E0 F  x0 H! f7 U
  35.   unsigned long StartTime = millis();/ x6 J; a5 z% l; T, g0 P
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){+ X) T6 Y- n) }, H4 y9 Q5 S2 K
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();; k( W6 {1 E9 ]0 I: b1 @
  38.     ErrorAcc +=  nError*Kd ;
    # {4 s, e9 k- a* u+ r: g( `5 [( S
  39.     ErrorDec -=  nError*Ki ;( Q. t( X1 X2 }+ m1 P( h3 B) x: Y
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);5 s, k! J/ q+ R  c# s3 I6 r/ Z
  41.     if(nError < 80 && nError > -80){
    + |; c5 i1 Y7 g9 g) e4 g
  42.       if(nPower < MaxPower){
    # O' o3 O- c0 S$ C2 b  |2 N
  43.         nPower += 3;
    6 ?3 r$ ~! T" Q
  44.       }
    , X7 C! Z' d) N$ n7 v9 P
  45.     } else{# [: c  c; z6 g7 j
  46.       if(nPower > MinPower){
    8 Q( O# s8 P; B6 r/ G1 |
  47.         nPower -= 2;
    ) v2 v9 ?( p* M6 x! G
  48.       }
    # h; U' ^; |, O0 \/ {+ R, Z1 t
  49.     } 1 |1 }, l3 O6 o+ G
  50.     MotoL(nPower-Error);$ M6 f" z; W0 Z9 l- U
  51.     MotoR(nPower+Error);   
    * h6 C% O$ [) |0 b' O7 |& ?9 ?
  52.   }else{
    $ q- O7 [/ |2 ^& t$ ]- v
  53.     motor_9.run(0);6 z8 q; _; n6 x8 r# N" s" ]
  54.     motor_10.run(0);
    1 T5 Z- q6 g8 T$ Q
  55.   }0 d  ?3 i3 S$ t
  56.   do{}while(millis() - StartTime < interval);  B, g0 V4 {8 ~+ L$ `% |
  57. }
    6 N& `" \9 c3 T* T2 F0 K! J

  58. ( S2 N3 a" F" ~( i1 ^
  59. void MotoL(int Power){
    9 B, B; u; M' W* z
  60.   if (Power > MaxSpeed){
    + z) U, [- g6 i3 d4 P4 s/ z+ y
  61.      Power = MaxSpeed;" }- Y4 }0 y' e7 V6 C
  62.   } 4 N0 h% ?8 I2 _, {; a. j3 x+ a) ?1 ^
  63.   if (Power < -MaxSpeed){5 }7 j# K5 M- }3 K
  64.      Power = -MaxSpeed;7 l9 B: G5 d- s4 V/ c8 w! |
  65.   } 1 _5 P2 M% u3 g3 S, @, a
  66.   motor_9.run(Power);
    - X# |& w" f+ X( O
  67. }  
    ( e# |% n# c3 F$ p
  68. % ~5 c  V4 [( T/ c) K- T
  69. void MotoR(int Power){
    " c/ ^3 N+ g( c6 p" w
  70.   if (Power > MaxSpeed){
    & n6 \0 O" D+ Q3 L+ m
  71.      Power = MaxSpeed;, }: [: g  F3 H3 O5 H, P# D0 ]! F
  72.   } " l1 J# w2 v% ?; h! @% O
  73.   if (Power < -MaxSpeed){, m: p  b/ E) N# u0 ^- D; B. h
  74.      Power = -MaxSpeed;6 t2 ?% k' f6 ~0 u
  75.   } 7 v/ N4 U: J% _. T  l
  76.   motor_10.run(Power);
    9 D) L1 S8 N( q% }& K
  77. }  
複製代碼
4 ~6 ^3 R' X$ m3 s- @8 s; k9 V' W7 v
: u* A2 D$ v+ Q! \) q  a+ |3 u
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ) t! a' r8 Z( I- @0 O# X# L  f

" i% Q' d& V) U) Z" N您好,不知是否能向您請教。6 o$ }, H8 _; I1 Z+ R
目前和宋修賢老師在處理Ardui Car  }$ c  s% y/ N
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
' Q* V3 \* w& j* G; {% I+ K% h/ u/ T) J: J( a( X' y9 N
但基於想追求更精簡的程式所以還是想請問一下
2 z0 n$ k0 w% [2 X1 W/ z" Y1 y5 b0 p就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
6 V, m& F5 g8 g3 y" \8 F不知道您是否願意教我可以如何處理( l( a2 I8 _' g3 ~; ~  |* ?$ h

9 E" O: R, k! H* x2 {: j
/ a* y) u7 T, i0 o3 N以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ' y! |1 [) `  U3 w. T$ s) Y6 u1 Y
  2. double CNY70Val = 1000;
    9 t4 j, [# Q. ^4 d
  3. int interror = 0;& y# i1 ?9 O1 }7 K, F, C* _
  4. int olderror = 0;( ^" N4 a+ v9 B& M. b6 l! H% J
  5. double values;/ Z! E0 z/ O5 z
  6. 5 i$ S6 y* }5 \1 Z  x5 F4 A
  7. " q( \& I2 A% R# |
  8. void CNY70(). C  U, }' H9 f3 A/ y, B8 U
  9. {* U; D" n$ Q" l: n
  10.   valuesRR = analogRead(RR)
    ) C# F( q2 d5 i3 N4 Y: U1 _
  11.   valuesMR = analogRead(MR);
    0 g6 v* h" B" ], u
  12.   valuesMM = analogRead(MM);( O1 u! J( c1 u( o1 c& a. C
  13.   valuesML = analogRead(ML);% G6 R# N7 W0 Z" X4 ]2 d2 r, Q* ?
  14.   valuesLL = analogRead(LL);
    # u" |$ c% L$ R2 Y3 @, e
  15. ; F, O' u) ~/ B6 z
  16.   if (valuesRR > CNY70Val)
    . `4 M: Y4 F- P$ i6 B, _/ v0 a
  17.     valuesRR = CNY70Val;9 u! _5 [' r! ^" J7 N8 @9 F
  18.   if (valuesMR > CNY70Val); \) w8 R- t; B# x' E3 ?
  19.     valuesMR = CNY70Val;3 H2 f/ X. C- Z- \8 y7 I) p" {% I! e
  20.   if (valuesMM > CNY70Val)
    / B; R- B" j; X+ @6 u# _
  21.     valuesMM = CNY70Val;* x& u; D- m) n
  22.   if (valuesML > CNY70Val)
    ) U% n7 f( [& I8 c& O
  23.     valuesML = CNY70Val;
    9 s4 i) U$ k! s8 x2 \6 d1 y
  24.   if (valuesLL > CNY70Val)
    2 B; T# ?& y6 g' u& Y" E1 C$ \) B1 k
  25.     valuesLL = CNY70Val;* J9 S( B/ D. B* q1 V
  26. ; b# t# L! x* b: W9 N- s7 H$ v
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;- i6 `+ o- a) V! b2 ~
  28. }
    1 O9 w9 s, ~3 {) B5 Y

  29. " E9 w( \8 k7 F" O# n) K3 w$ U# B
  30. void Car()
      `* X$ @/ a6 `) @
  31. {
    * V7 [2 f3 \  p
  32.   while (1) {0 C' i$ g# m! x) y, t
  33.     CNY70();
    6 e9 w+ }7 s$ ^1 @% e1 E( i0 v

  34. 5 U! E0 o! m" T  [8 z0 B( T
  35.     int error = ((int)values);
    ' }. A/ E* T3 x+ N% A
  36.     interror += error;' W* W+ F8 i7 k1 G4 p$ @$ |
  37.     int lasterror = error - olderror;
    - R* |, L$ ]' I
  38.     olderror = error;4 Q; {! z8 o  S1 l* V" ]' t
  39.     int power = error / 5 + interror / 10000 + lasterror;% z: Z  ~1 l8 \! x

  40. 9 r! C5 Q4 I6 K4 d5 i
  41.     if (power > MotoSpeed), f. S8 ~/ G$ a, Y# R7 m
  42.       power = MotoSpeed;
    & I/ R: P7 ~0 i
  43.     if (power < -MotoSpeed)
    4 q3 v- V2 p, S8 p. ]% X% S* X
  44.       power = -MotoSpeed;
    2 f9 u' R# a# u2 l+ |

  45. 0 ]! a- c) R6 W$ Q; Y
  46.     if (power > 0)' K! H) m0 r% l% M
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    4 }$ J; }/ `1 K) a2 K
  48.     else
    $ B9 \. T; [' y* r, n
  49.       Speed(MotoSpeed + power, MotoSpeed);! @* c! ~" E. B* [9 @8 S# o8 J
  50.   }3 `9 I3 Q* `2 x
  51. }
複製代碼
. h+ p& H' U1 V, B0 P) n9 ~
3 n( P/ Y5 p- X1 U
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-5 12:46 , Processed in 0.025793 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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