圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21378|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    - u# R- F* n; |+ \1 {
  2. #include <Wire.h>! l, x! Y' c8 [5 ]
  3. #include <Servo.h>* t/ |& j( u/ g1 C4 F% x" l

  4. $ @2 _: c! W, z0 q7 M
  5. #include "MePort.h"
    + C! H" r* A" @9 Z
  6. #include "MeUltrasonic.h"1 ~* C. G; D1 w
  7. #include "MeDCMotor.h"
    0 o  i# s3 I$ B! T( \# H
  8. ( F: Z6 H1 C7 j! J$ I4 u$ P
  9. //double Input, Output ;
    6 p( O# S# T/ K8 z& C$ h
  10. float MaxSpeed = 255;% `$ E, H: H5 {+ o9 L# ?0 g" |
  11. float MaxPower = 180;
    # D& N* G1 S' B1 h# }, Z* O
  12. float MinPower = 120;
    - B2 i" l* r$ A# [" @7 u, m
  13. float Error,ErrorAcc,ErrorDec;  `8 m* B1 W7 G+ ?$ Z2 Y% I! q8 H. W# _
  14. 4 j/ f3 U0 U( n9 {3 I! d, _- T7 Q
  15. float Kp=0.14;8 Z/ H4 d. C3 @5 i% K7 L
  16. float Kd=0.00020;//23;" c8 z+ R9 ^+ o& K( ^
  17. float Ki=0.000201;2 ?/ o- ~! \4 u& y0 y% T) `9 k
  18. ' c4 ^8 n! L# @: W
  19. float nPower;  `, d# ~# g! x
  20. MePort lightsensor_6(6);2 F7 U: E1 O8 X- c# ]
  21. MePort lightsensor_8(8);0 @) o5 k3 b+ ^' S4 H$ @7 X: \( V
  22. MeDCMotor motor_9(9);
    $ h  d4 `' x) H  d5 o" M
  23. MeDCMotor motor_10(10);
    * i3 {8 |1 {0 z: R2 O4 O0 ^0 G
  24. unsigned long previousMillis = 0;
    1 O, w- O/ N' O% q* ~2 M: |
  25. const long interval = 1;% j4 M: U. b  L+ [0 n* J
  26. ; q5 w1 t8 c: ~* k
  27. void setup(){1 u7 d6 n8 ]9 O; L% L0 F
  28.     lightsensor_6.dWrite1(1);* M/ Y4 q+ G* G
  29.     nPower = 160;
    % t- u- ?# K$ ~4 `* U& e5 i
  30.     Error=0;
    7 l1 d& N, k' R  ~; e
  31.     ErrorAcc=0;
    - t9 i* D3 X& h' F
  32. }
    4 O* V& _: O% f

  33. / o& @# ^7 ^* _9 E, Y( S& ?2 d
  34. void loop(){3 `: P& a, R" w
  35.   unsigned long StartTime = millis();
    " q( L( w$ e& w! c- C* R, Y' H
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){5 _# i" |! U3 P+ q  Q- o
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    * e2 M2 w5 u! r" l6 L
  38.     ErrorAcc +=  nError*Kd ;
    ; R' ~, `1 h$ z! ]1 k* E
  39.     ErrorDec -=  nError*Ki ;! W/ }( G; N7 ?/ B; i
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    # `) p" w) j3 X. K1 r( ]
  41.     if(nError < 80 && nError > -80){
    2 f2 ^' d# c$ I, s$ E) s% T& I( A
  42.       if(nPower < MaxPower){
    " k3 H3 S: S. P$ O& f+ @
  43.         nPower += 3;
    ; p. z3 p* R  ?& S" r
  44.       }
    ) e. t2 L. J( h! {, S' s" d: T" E7 x
  45.     } else{3 c1 ~0 \* B2 C- e* V% Y+ a
  46.       if(nPower > MinPower){
    ) \8 s) b, f! q, j
  47.         nPower -= 2;
    4 ~* F. c0 r) `  k% z
  48.       }
    2 q. @6 [, Y( w  _, [, J
  49.     }
    + a% V* q) K/ g9 p
  50.     MotoL(nPower-Error);
    9 t+ U( M4 n0 @' k4 a% r
  51.     MotoR(nPower+Error);    7 ^; s% r. u) J: I
  52.   }else{/ t( Y9 ~* B+ N5 P/ n+ o
  53.     motor_9.run(0);
    # d9 v9 U7 {$ n- U
  54.     motor_10.run(0);+ J+ @, l& ]! L% H/ S1 |
  55.   }
    ) i; f. V; f1 e% @& G
  56.   do{}while(millis() - StartTime < interval);% |7 Q8 G  r" t- G1 r
  57. }
    . i: S' N5 `  q3 X3 u8 o: K
  58. 2 Q9 C5 z# R. A* r& s9 A: D
  59. void MotoL(int Power){
    4 |7 G) {: u; ^3 P
  60.   if (Power > MaxSpeed){+ n. h# P* u# E) ]
  61.      Power = MaxSpeed;0 e0 l& o& K8 b
  62.   } , @! N; d1 d4 f# j
  63.   if (Power < -MaxSpeed){5 F. _* f7 f7 i" C. J+ X
  64.      Power = -MaxSpeed;
      N$ ]) m- G3 N
  65.   } 7 ?' m  m7 A: a9 e, h8 r* `6 R6 C- \
  66.   motor_9.run(Power);
    ; A3 `; {% {9 e& i3 g9 f
  67. }  
    : O# x  T- ~; C% K

  68. ) u9 |& A/ ?% {* P4 `, O  R+ L/ }
  69. void MotoR(int Power){, r/ ^+ q$ N' Q
  70.   if (Power > MaxSpeed){% w8 Y$ l5 _7 g
  71.      Power = MaxSpeed;
    : L8 h! q+ j& M6 k: |/ ]9 n5 [
  72.   }
    ; U6 m* U6 |& l% h
  73.   if (Power < -MaxSpeed){
    6 w3 ?$ u' m* H2 e
  74.      Power = -MaxSpeed;
    . j  `+ t/ E) A. O7 a
  75.   }
    4 o0 G; u$ S& W
  76.   motor_10.run(Power);
    2 H5 T2 u* @1 F( ^
  77. }  
複製代碼

+ i# V" X" o; q' _% s2 P3 |
. y6 k  P% \" E, k# b0 N8 H$ j) k
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 n+ K* q* {/ `" L. k  `8 F. ]# a
' y0 W9 o3 Y( A& c; N. Z您好,不知是否能向您請教。
+ _; K0 W9 t7 R' q/ Y目前和宋修賢老師在處理Ardui Car! ?0 R) H) z3 b! s! X
雖然已使用較繁雜的方式處理了跑出黑線外的狀況; m  N8 H$ A$ L( M+ a, w1 [
2 Y( [* ~7 T1 D
但基於想追求更精簡的程式所以還是想請問一下1 `# p0 @4 `+ Z0 F7 S/ ?+ k
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
( w% c% |1 L! k不知道您是否願意教我可以如何處理
! {6 v/ B8 q& X' p. B9 E- X7 F- J( l2 P: [7 l
$ D2 d, A- c% P% p
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    9 \0 p) O$ G" H8 H0 s- g/ x* Q, Y
  2. double CNY70Val = 1000;
    . h% q) F: G! `2 J4 O5 _, o
  3. int interror = 0;) W% |; p4 x7 `" Y) J/ [
  4. int olderror = 0;$ J3 Y! M) J8 U3 m! [' ]3 F
  5. double values;; S% o/ T/ S! b) I

  6. ! p2 V, |  E1 a* e6 @! S% i
  7. / V& a8 f5 p8 U  z) Z$ f6 m
  8. void CNY70()1 ?# j# u  S5 l  v4 S8 R
  9. {4 U! e$ J2 X/ C& i/ J3 R$ t
  10.   valuesRR = analogRead(RR)3 A- k  s: f3 a- X( O0 z
  11.   valuesMR = analogRead(MR);+ K4 ~% c5 |3 S/ D4 B3 G/ t
  12.   valuesMM = analogRead(MM);
    " d# J7 e+ ~  K5 V: l; i
  13.   valuesML = analogRead(ML);$ d7 j# H8 I# {4 X% h
  14.   valuesLL = analogRead(LL);2 Z: E3 ?; V( K' @! b" ]

  15. ; P* P6 O! p( f. u- |
  16.   if (valuesRR > CNY70Val)
    ) }! ]# ?0 K, M/ g/ F& U# K
  17.     valuesRR = CNY70Val;3 c& V3 `7 k7 y0 q- g
  18.   if (valuesMR > CNY70Val)
    # F2 ?7 F. I. B) ?0 H8 E
  19.     valuesMR = CNY70Val;
    ' Q/ Z% s4 p+ H8 K5 P" x
  20.   if (valuesMM > CNY70Val)
    % d9 r) L" J; l5 O, D% ?& i# `
  21.     valuesMM = CNY70Val;
      j5 c% Y" a5 u8 v+ m  `, a
  22.   if (valuesML > CNY70Val)
    - M3 q- O7 z/ ?+ |! O  g. O
  23.     valuesML = CNY70Val;; x/ n' n( _* @9 i* I
  24.   if (valuesLL > CNY70Val)- L  a! m5 j' @; p
  25.     valuesLL = CNY70Val;8 ~) s7 }, U$ i8 Z! w4 @

  26. 4 i0 S3 D) A7 U& r# z& n
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;2 L+ J! `5 A: z- [3 I
  28. }# B- t: L) q3 e! b# t. E: l
  29. 4 L# P- S% Y- W) \! z, o2 h0 P
  30. void Car()
    ; h! S. a" d  v  [  [* ?! r8 _
  31. {. I6 J: ]; H  ~2 s9 c. y. f
  32.   while (1) {, p% D  |2 W/ I$ l) Y: _
  33.     CNY70();2 x$ K9 d' z, v2 G- L" r6 s

  34. " P# w7 J% n/ H# Z- O
  35.     int error = ((int)values);
    . X8 O/ a/ f: c& Y# p
  36.     interror += error;
    ' q/ Z' ]! h) G  s, O: l
  37.     int lasterror = error - olderror;) N# v6 {; i: h! Z
  38.     olderror = error;
    & m) i: ?' E3 w) r' D% f
  39.     int power = error / 5 + interror / 10000 + lasterror;
    - y- b" h5 m; Z; y* \

  40. . \/ E) z9 U8 j& O
  41.     if (power > MotoSpeed)
    2 P3 i( R: n1 t
  42.       power = MotoSpeed;
    , @3 e  t" j' a0 k
  43.     if (power < -MotoSpeed)
    # ^/ t5 f/ M" ^' ~6 v; v8 c' t3 u
  44.       power = -MotoSpeed;
    - g) Y/ n1 T" j/ t8 y, d  j" W! J

  45. * q9 \0 ^, v! S  K1 K* ?6 ~! _7 c; H4 W
  46.     if (power > 0): U9 t/ e" w" {
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ' C1 {; ?) E8 M+ s
  48.     else1 G- z# z8 J) C  f/ O& Y. f
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; C; E- L# p) S( M# F! k+ E( ~
  50.   }5 O/ K0 h: o  J! k" x# F7 Q
  51. }
複製代碼
; ^/ v% I  c. [% Z% M
# b. e" P0 z' A: c. f* {* t
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-9-17 09:51 , Processed in 0.024777 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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