圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21740|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>, d8 p2 A5 w1 p" \' r: ?
  2. #include <Wire.h>8 i& i- ?5 f  Z6 C( Z
  3. #include <Servo.h>
      }' n3 h2 L+ E/ U

  4. % ]2 b2 c( `$ W7 M
  5. #include "MePort.h"$ J# y+ t" j! f+ R0 N( m
  6. #include "MeUltrasonic.h"
    3 F* T/ n. P8 i) J/ j
  7. #include "MeDCMotor.h"
    / `( M/ V6 X! q8 p1 ]
  8.   \0 _! ^) m+ m& G- z
  9. //double Input, Output ;- F9 w0 N) n# |7 X; E
  10. float MaxSpeed = 255;
    * J: O: k" I3 Q8 r/ b
  11. float MaxPower = 180;
    # D1 U5 l7 n' `2 d1 f
  12. float MinPower = 120;
    / i3 j' z& X5 o( _- C# o
  13. float Error,ErrorAcc,ErrorDec;% m; M8 u1 H2 r
  14. 1 }+ h$ {! \1 J  ]& n9 s9 ~( }
  15. float Kp=0.14;8 Z" y0 {& Z; l% D: }0 l
  16. float Kd=0.00020;//23;
    , R" L7 o) G5 I* J2 h
  17. float Ki=0.000201;) ~: A6 H1 s, a$ h

  18. 4 U/ V% W( v  z5 @2 O: I1 j; x
  19. float nPower;
    $ p4 y4 T4 h2 S  ]8 V# E, @% t
  20. MePort lightsensor_6(6);
    + N% G- {9 J# K& x. a3 a
  21. MePort lightsensor_8(8);. w  `: Q" W6 L; u7 H: N; P
  22. MeDCMotor motor_9(9);, ~# \' k1 z6 ~) C7 r5 H# O
  23. MeDCMotor motor_10(10);7 X2 J5 w" |3 d& g
  24. unsigned long previousMillis = 0;. L% i* K# I3 w! |, ]
  25. const long interval = 1;
    . l  h, T+ b) D" ]" f

  26. 1 J' j$ s5 t: @1 H5 D% i
  27. void setup(){: R- y0 V9 ~- X0 A0 g
  28.     lightsensor_6.dWrite1(1);
    # }  [; Z0 M2 P3 H+ a
  29.     nPower = 160;) x) E# e9 s; [4 ]
  30.     Error=0;
    . i2 c$ `8 ~' o  s5 m
  31.     ErrorAcc=0;
    6 }  U/ u+ T  j
  32. }9 j' N$ v& w$ v

  33. 6 H7 l/ _$ n0 Z1 U% s) q  T
  34. void loop(){
    $ J: b! t6 ]5 F! b
  35.   unsigned long StartTime = millis();
    0 ^' R. M7 _) i( y2 N) \% @8 C- S% `
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){8 D: }8 W1 m9 ]7 T. j
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    / U1 k0 B+ W6 ?0 K* S/ A2 ?
  38.     ErrorAcc +=  nError*Kd ;0 c6 u. V0 u! _: U& l
  39.     ErrorDec -=  nError*Ki ;, D4 m2 P+ g7 |, l8 ~+ T
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);2 ~6 K0 p0 r, j
  41.     if(nError < 80 && nError > -80){
    4 a* [$ K, _8 G. O+ \
  42.       if(nPower < MaxPower){- b4 H' r8 w% \- G* p9 k9 e
  43.         nPower += 3;
    & E9 o. \7 }$ v0 Q" `
  44.       }
    # m; Q6 L) Q6 m3 Z  M
  45.     } else{
    ' B% k& m0 n5 k5 j
  46.       if(nPower > MinPower){
    ! N' K/ r" t. B" L8 n
  47.         nPower -= 2;. p6 I1 k) @0 S0 u2 b# k
  48.       }
    - r/ w" x5 I3 C6 n
  49.     }
    - L+ r& ^* x' ^; c9 i& c( B
  50.     MotoL(nPower-Error);# @+ i3 [0 K2 J' _; F
  51.     MotoR(nPower+Error);   
    ; t+ R/ K& m5 [- @5 M( g" K
  52.   }else{' Z7 f2 s: U! m' N
  53.     motor_9.run(0);# J" ?+ u% Y( I5 h
  54.     motor_10.run(0);
    6 G5 d( R) t! r: E2 D, f8 _9 c
  55.   }
    ; D# G. m! Q. ]1 {
  56.   do{}while(millis() - StartTime < interval);. p: `- }& g- d4 {
  57. }, Q3 B( {" I( x5 q4 y

  58. 4 K2 o7 C* \8 j1 U8 n
  59. void MotoL(int Power){: M7 t: g; X: A8 G& V# |- r1 }
  60.   if (Power > MaxSpeed){* o. w9 X9 z. i' l, _, m
  61.      Power = MaxSpeed;: \, t! m5 e4 [0 _9 j
  62.   } : S! h; E, ~, o/ e$ `
  63.   if (Power < -MaxSpeed){
      q( }* O. y' X" {9 P" `8 Y, C
  64.      Power = -MaxSpeed;$ [' [2 L& v  ~+ \/ `9 I8 L+ M9 {
  65.   } 0 O7 e! L8 e6 T! |: H
  66.   motor_9.run(Power);4 o6 ~. ]5 G' k$ D
  67. }  
    - w8 r& S! n3 i
  68. 3 z/ V9 F! |6 v( W  x
  69. void MotoR(int Power){
    . A: b  O: p6 W& T3 E7 g
  70.   if (Power > MaxSpeed){
    # t6 b7 R% I* g& A4 w  F
  71.      Power = MaxSpeed;: E  [1 U9 }% `9 d: s' v  o$ N/ G, P
  72.   } 3 y+ M$ V8 v4 ?+ @$ e
  73.   if (Power < -MaxSpeed){
    8 u* o; c( K: L' _2 J+ X7 C
  74.      Power = -MaxSpeed;) k: H; Y# w9 m5 s: r7 r
  75.   }
    & _% e4 u% x# Q
  76.   motor_10.run(Power);( s9 ~9 i2 R, v
  77. }  
複製代碼
9 p1 |* q- Y6 d- p  H

" f* G# e$ |' J) S  E$ U: ~4 S' j1 E
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 " r. s5 C- k3 V; @, h) I

# K; v6 N; ^& {, s- K& o$ ?您好,不知是否能向您請教。
, G% J$ _3 L* V! Q2 P目前和宋修賢老師在處理Ardui Car
0 S6 n) x/ m0 {! P雖然已使用較繁雜的方式處理了跑出黑線外的狀況& U$ _. V3 u1 b0 G' ]

2 ]4 r- G& }/ E1 U: d0 n" P, p但基於想追求更精簡的程式所以還是想請問一下
* P6 ?# ]! ?* O( x* c  X就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝3 [  {* [; A) F% Q: c
不知道您是否願意教我可以如何處理
1 e6 M/ }+ K( r& z( p
- U) J1 W* F* b2 }( }4 U3 Q
% R/ }. Z9 n% v+ i! j+ C# p  _以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    4 b: k) @1 @! p4 |
  2. double CNY70Val = 1000;0 k9 ^! y4 f+ s0 X: }4 ]& _% v
  3. int interror = 0;
    5 J' V5 ]$ D6 D9 ^1 I' c
  4. int olderror = 0;2 l$ }1 d5 P% r( Z) z5 E, m' C. G
  5. double values;
    * {7 E- O3 a) c: N' H  u$ a! f

  6. 2 W) Z( v$ g- T5 p' M

  7. , B6 X" F  A' a
  8. void CNY70()+ C! w+ y1 o) d2 W! @- ^# \
  9. {% ?$ E; f  ?" E
  10.   valuesRR = analogRead(RR)
    6 E! u  `- v! @8 z3 a
  11.   valuesMR = analogRead(MR);$ A6 [$ a: i/ G1 e1 N
  12.   valuesMM = analogRead(MM);3 F. `+ ?5 K# H. }9 y5 \1 a5 L9 I
  13.   valuesML = analogRead(ML);
    5 ^5 K+ _$ S& J- R4 [
  14.   valuesLL = analogRead(LL);$ L  f6 Q! ?# g4 c, f4 S1 c
  15. & Y! B! T# m. ?$ {
  16.   if (valuesRR > CNY70Val)4 M5 C" V9 A* v4 {' w, D8 m/ r, A
  17.     valuesRR = CNY70Val;/ l- c# \, H, U/ l" i/ T) t- }
  18.   if (valuesMR > CNY70Val). K  L6 j& J' N5 b2 N7 W
  19.     valuesMR = CNY70Val;
      k6 o# u) z: R: n/ d. q3 F6 b
  20.   if (valuesMM > CNY70Val)
    : a. F" Q) l2 ]7 _- N% D; o& W
  21.     valuesMM = CNY70Val;1 o* _* ]- d) g! l
  22.   if (valuesML > CNY70Val)
    ) z4 Q7 n5 I1 ^. m8 D
  23.     valuesML = CNY70Val;
    9 s# e6 v- e7 `" Y! P" d4 f
  24.   if (valuesLL > CNY70Val)
    2 M% |* m+ Q6 q1 ~# q0 L2 U
  25.     valuesLL = CNY70Val;
    $ h7 g7 ]) X( k. [1 ]) h* {- Z

  26. 5 \5 I9 |* r5 `4 n  K
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;' e) W; N0 F# r  ~- v7 C8 q
  28. }
    7 K6 u) L4 w4 }/ ^4 A7 p

  29. / f# G$ k9 w; S- Y1 w
  30. void Car()4 y( f1 a" O+ L( j  r
  31. {
    $ B6 a" X& I- F7 ?
  32.   while (1) {
    + F# c. H9 o( K! ^2 e9 m3 P6 E2 `
  33.     CNY70();6 ~2 u  q% n, }$ }
  34. - n% P. K' \( m7 |: i% O5 e: X' ]
  35.     int error = ((int)values);) Z. E: m! g, R! I- p0 S, O
  36.     interror += error;5 z& A  p0 P- x: c
  37.     int lasterror = error - olderror;
    . C) {# U& w. ], l" a; `- n) P. _
  38.     olderror = error;5 i( B8 X$ I3 \
  39.     int power = error / 5 + interror / 10000 + lasterror;
    $ |* h3 z* g  F8 [) |

  40. / r% W6 Q% g3 n* Z4 z, C
  41.     if (power > MotoSpeed)" X1 x0 h6 x) G. _" F
  42.       power = MotoSpeed;4 Q! @8 O1 b" e6 T/ H  x1 }: i* w
  43.     if (power < -MotoSpeed)" t+ d# v0 ^* x3 Y6 J
  44.       power = -MotoSpeed;
    + |" B! i4 W) o$ Y  W
  45. 4 Z4 c7 z5 D/ T. W9 D! Y; b
  46.     if (power > 0)9 C$ R$ I) s* e3 w( Z9 R* k
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。% j/ b5 V' _; R9 t
  48.     else
    % h/ b; ^- W8 {* L5 m1 K
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ' f3 L% B/ y0 N" j  Z2 g, a
  50.   }# g' P: c6 u# D2 R0 t8 o
  51. }
複製代碼
4 h8 D. C( P" p7 s

! R0 W( }, A0 O9 t  n
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 19:31 , Processed in 0.025308 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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