圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21724|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>% \* C2 s/ h6 J4 l% F/ M: T9 y
  2. #include <Wire.h>
    + P0 P! `3 y+ g7 x; V* _' v" ~
  3. #include <Servo.h>; L5 g+ G" O. {9 G% y+ u
  4. : L( l) H7 }: v5 w, G
  5. #include "MePort.h"
    + u- }( Y  F' M
  6. #include "MeUltrasonic.h"6 P7 n; V/ R: M' O5 k- `
  7. #include "MeDCMotor.h"
    2 H; r0 p$ Z+ ^3 Q! K9 w

  8. , s6 g6 @8 y; e7 c* x
  9. //double Input, Output ;
    : I% Q6 h6 ^% S8 ?! O9 {$ m! T
  10. float MaxSpeed = 255;- h5 O, A4 I1 V2 C( I9 K: K
  11. float MaxPower = 180;
    4 y7 C: Y3 I8 u6 }2 s. h+ |2 R
  12. float MinPower = 120;
      [- g4 V: M9 |- g
  13. float Error,ErrorAcc,ErrorDec;
    3 F# {8 R/ V: ?4 U

  14. 9 r# Y5 x$ n: }4 x
  15. float Kp=0.14;
    % E( }/ }  a% P( x
  16. float Kd=0.00020;//23;
    . Q& O4 q) C2 [9 g. n* k& t) d
  17. float Ki=0.000201;
    " ]0 m' m# o* d7 u$ E7 {
  18. 9 H/ K$ J9 j7 P& g& K4 l' t; o
  19. float nPower;% W6 w2 l1 A4 a  w3 Q
  20. MePort lightsensor_6(6);8 o" t0 g, o$ _" \
  21. MePort lightsensor_8(8);1 k# i: H  r' J
  22. MeDCMotor motor_9(9);
    9 M, h0 a: \9 S
  23. MeDCMotor motor_10(10);4 F) B$ f# J$ i( K, W$ G
  24. unsigned long previousMillis = 0;
    5 I; H" R% D2 O8 G& Q3 ^' v; N3 _
  25. const long interval = 1;
    / d. Z: K5 H" @# s1 F3 R& g
  26. : x7 v. H  V, L8 \' ?& g
  27. void setup(){
    0 w! w1 ^, u2 G8 F/ P& x
  28.     lightsensor_6.dWrite1(1);
    + S3 Y6 F2 C* f; i- J
  29.     nPower = 160;
    ) f/ {% O1 p: T  Y9 P
  30.     Error=0;3 a; V6 r3 J7 Z2 Q3 x% `0 C' g$ e
  31.     ErrorAcc=0;
    ) o& @/ w5 P# s
  32. }
    9 {  d+ c1 R! S6 e" M% [9 R
  33. & }* K$ A/ Q/ H5 i* H& Y
  34. void loop(){
      \! v8 t9 i/ x- t# Y; f
  35.   unsigned long StartTime = millis();* y# L$ Z6 X) B9 v2 ~
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){; T4 n  J9 ~  Y  t# Y& k! \
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    : [) w1 v) l. z4 V" v  \
  38.     ErrorAcc +=  nError*Kd ;
    9 m5 z2 t' z5 B
  39.     ErrorDec -=  nError*Ki ;; o4 R' Q# t5 q/ a' S( X& K2 a
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);  J: h) b" ?; c5 |0 u; e3 e2 b
  41.     if(nError < 80 && nError > -80){
    % [7 q( z2 R/ O! j
  42.       if(nPower < MaxPower){
    . L: t3 e6 }  Z' o: G" d
  43.         nPower += 3;
    ! i, H. v6 ?6 k/ B+ @
  44.       }
    * T8 d4 _" v3 M6 V' j1 ~( T
  45.     } else{
    9 K3 t0 c$ x7 k' l1 Y; @
  46.       if(nPower > MinPower){9 u! K. Z8 p' N- a1 p; R! G
  47.         nPower -= 2;
    8 W" v$ z& A, B8 o- h/ _6 s
  48.       }
    8 S+ m- M% [: N! `# s1 a7 y* X* |) L
  49.     }
    ( b0 Y8 E4 J9 Y5 l. K! T
  50.     MotoL(nPower-Error);
    5 u- D0 J3 `) Q! G# R
  51.     MotoR(nPower+Error);   
      X% b# q3 a% }( g6 |: {$ q7 J
  52.   }else{3 b3 n, [! H) _+ F4 t- p/ i
  53.     motor_9.run(0);
    " u8 q, y4 J- ]+ ?
  54.     motor_10.run(0);2 f0 {5 M, I  g5 [1 q" Z& G
  55.   }
    8 X+ Y; E/ v8 B) g
  56.   do{}while(millis() - StartTime < interval);0 I$ ^( O) n6 ~+ x# L) i8 B
  57. }
    " C  d" U4 v8 t

  58. 1 ]/ S) V( r/ W. O5 K+ k" k
  59. void MotoL(int Power){
      W* j  l/ O$ n' v/ Z# p' F
  60.   if (Power > MaxSpeed){# q$ G6 E" }$ c! _$ ~
  61.      Power = MaxSpeed;
    3 Y! Z, u& v) K/ s7 d$ W! S# q* E
  62.   }
      p% _- l, k) h& V. T. Y0 g
  63.   if (Power < -MaxSpeed){
    - ?% D- k. Y2 d% ?
  64.      Power = -MaxSpeed;- v) }2 n2 B+ b. ~  U, M
  65.   }
    6 F* p  ~  f* }* B/ N6 z4 c$ ^( E
  66.   motor_9.run(Power);: _6 V3 m7 P* t/ E7 [( C; Z$ \8 S1 O
  67. }  3 K& V, M: B+ h2 [
  68. 3 Q, Y% U/ `3 F9 G  n" [9 x3 R& L
  69. void MotoR(int Power){
    ) D1 O3 s& p* z+ H
  70.   if (Power > MaxSpeed){  ~6 f3 `$ A% b2 h
  71.      Power = MaxSpeed;
    4 q1 G# X$ C& B* T! E9 z5 Z+ U' g# [  y
  72.   } , c& X! A, Y5 ~# x* p$ U# k
  73.   if (Power < -MaxSpeed){4 s. x: M: c$ o4 P8 U# }  u
  74.      Power = -MaxSpeed;
    ! \$ w% a1 _  {5 ^- a$ e
  75.   } 3 P9 W+ P7 o. }0 X; p7 [
  76.   motor_10.run(Power);
    5 ]. V, }; o, e. N5 V7 s9 S
  77. }  
複製代碼
/ e' l8 C) O& g3 t$ _

$ k5 A; Z# n2 M6 B2 V% k: I, H4 a
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
) L$ p# }# z! F4 x1 }, U1 {6 }: ?% e' \0 x# B' C
您好,不知是否能向您請教。
% n; N* P" b: p' }" X目前和宋修賢老師在處理Ardui Car
' V' M3 @, H# n7 |4 a! e雖然已使用較繁雜的方式處理了跑出黑線外的狀況; G' \' `- m) S) V. _+ `' s
& A' V0 T9 [+ K! \2 O6 I  A4 l& Q
但基於想追求更精簡的程式所以還是想請問一下( T$ X: }/ f/ Z2 a2 C+ V& `7 I6 n
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝; Q0 m9 ~, T  R8 v) E+ }
不知道您是否願意教我可以如何處理
0 Y; A8 W! n: V% j% m8 H5 I
( O, v. C' n0 I4 |1 m9 v+ B7 u! t: f  X3 S4 e  E& |
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ' z0 ]9 L7 ?5 l7 \5 m
  2. double CNY70Val = 1000;7 @0 a4 ^6 x1 {( O* u9 A& S
  3. int interror = 0;
    . s' ~4 G7 j/ ?8 S, R4 ?! S' X
  4. int olderror = 0;
    : B8 G. d4 R6 p' q, B2 ]
  5. double values;9 S" Z9 {5 M/ `2 @( S& W

  6. ' t3 A' E# I9 `+ A) k- U

  7. 9 t# \' Y8 z4 i
  8. void CNY70()
    / y" {' e2 G( Z0 t& {
  9. {4 ~* ~& [$ T7 A! o# x7 J9 M! J2 z
  10.   valuesRR = analogRead(RR)
    2 L% W# H2 |0 x0 x
  11.   valuesMR = analogRead(MR);
    1 w% v, i- P( [0 V7 W, Z3 U
  12.   valuesMM = analogRead(MM);
    4 U4 a+ P1 w/ c) E
  13.   valuesML = analogRead(ML);/ _: z  v; y  w- p8 S# K
  14.   valuesLL = analogRead(LL);
    7 R/ I% t* T+ Q7 o1 G6 F

  15. 0 c7 H  S% r+ e. _. c3 u
  16.   if (valuesRR > CNY70Val)
    # W7 i& `/ @9 g  i1 t9 s
  17.     valuesRR = CNY70Val;
    ( @' ~1 k6 W7 e" t% I, x8 R4 @0 X
  18.   if (valuesMR > CNY70Val)
    1 x  h5 Z7 ?. w5 f
  19.     valuesMR = CNY70Val;" ~6 I5 Y: j# z( I* Q
  20.   if (valuesMM > CNY70Val)
    9 N$ ]  \1 {! ^' u$ u/ \8 Z
  21.     valuesMM = CNY70Val;3 D5 @2 e* y- T* W1 o/ G
  22.   if (valuesML > CNY70Val)
    ; ]4 g8 u+ R4 t1 U
  23.     valuesML = CNY70Val;
    5 r  ^1 L9 n: S$ M
  24.   if (valuesLL > CNY70Val)
    & T6 F& k  t, @. B. J
  25.     valuesLL = CNY70Val;
    : w" R' o# p) A% m' O) U
  26. ; |* W5 y" M; B0 j) w) O9 D
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    2 l' Y8 l7 p7 |. G1 A: `9 S
  28. }
    6 C! t/ d9 E$ @2 p' g

  29. ; [! ^5 K0 V7 Q2 t/ G
  30. void Car()
    / P% z, H  J; Y3 q2 P' y
  31. {' m, w+ o  r- n, k" f( M1 y# I
  32.   while (1) {
    ( @: Q& ~3 ^) q$ L+ V& ]) Z1 M7 k
  33.     CNY70();2 |8 y' T" x1 Z# o8 S0 l
  34. , ~2 ^, L; o7 g" k
  35.     int error = ((int)values);
    ; W; w- w7 ]7 ?
  36.     interror += error;
      A! B% L8 w8 `7 J9 y4 K
  37.     int lasterror = error - olderror;- }. g" i* F5 L! O
  38.     olderror = error;
    - e/ s, W" j- F5 h# x7 ]
  39.     int power = error / 5 + interror / 10000 + lasterror;8 r$ w4 b; L* W- B
  40. 8 {0 m7 u; Z% l. x) k; F
  41.     if (power > MotoSpeed)- g, a$ f3 I5 M, T9 g
  42.       power = MotoSpeed;$ L0 V1 J7 k( m" p: }7 r
  43.     if (power < -MotoSpeed)
    1 B. q  n2 ^/ J
  44.       power = -MotoSpeed;# X* n# t! W. Q
  45. # Q' N4 l" d. r7 v2 n
  46.     if (power > 0)  O4 k6 a5 G+ {7 h
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ( i# b3 i5 F5 ?2 m2 R
  48.     else
    . G! f" s& X- r) T5 M' S+ g
  49.       Speed(MotoSpeed + power, MotoSpeed);) `* C. N3 E. _5 E7 q
  50.   }, K( T+ G3 X. L9 M) v
  51. }
複製代碼

% F0 N  W6 @7 e. r0 K3 ]% C# `. p: S) T* f9 r) i
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-27 09:05 , Processed in 0.024151 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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