圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21741|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    1 _5 ], C3 H: r, J; U
  2. #include <Wire.h>5 K4 Q* Q, ]: F! O4 N5 I
  3. #include <Servo.h>* k) X/ S5 G: ?- |8 _. X/ L

  4. ! [- d. c2 F) Z$ t  z9 R4 y
  5. #include "MePort.h"
    % A$ k" m5 q) {
  6. #include "MeUltrasonic.h"
    2 t8 j8 Q) B) H  G7 p
  7. #include "MeDCMotor.h"
    - |( |' {- n6 i# h) ~: a
  8. $ t& H' g$ D8 p
  9. //double Input, Output ;$ Q7 [) g! X) M; R7 ^/ v% X$ W
  10. float MaxSpeed = 255;6 I1 A. u& }# I& \) l' b, W6 I
  11. float MaxPower = 180;
    4 s  g& P2 g0 ~6 |, g9 C+ ]' [" B
  12. float MinPower = 120;5 Z  q2 A6 k& s& K8 i. z7 ]
  13. float Error,ErrorAcc,ErrorDec;# c; M2 j6 S/ x, ~/ O/ M
  14. 0 a5 ^! G: w: c( K
  15. float Kp=0.14;
    0 y& P: @2 E( ^, a; D: x) Q- A; X, q
  16. float Kd=0.00020;//23;. H% m# }% g8 ~% z
  17. float Ki=0.000201;. n! `% J3 ]+ G- q& U0 D

  18. 5 [# y( ~: T! u$ P1 y
  19. float nPower;
    % u+ G! x4 m% V& O
  20. MePort lightsensor_6(6);
    ) a  X1 H' \  c. t* F2 z
  21. MePort lightsensor_8(8);! k8 V' A5 t) \) f# ]$ E+ J
  22. MeDCMotor motor_9(9);7 H' d, K4 ]0 S' F, ]* c
  23. MeDCMotor motor_10(10);
    0 P5 c9 S- o& V; k: N
  24. unsigned long previousMillis = 0;
    5 @; T  I) j! R3 z1 y/ e
  25. const long interval = 1;6 ]4 p3 j% N! {8 J6 X1 z5 n
  26. & L# P& ^5 k' S: O) \6 o2 ~
  27. void setup(){
    5 F' U3 T8 k  e- p. \3 ^+ G3 J7 ~
  28.     lightsensor_6.dWrite1(1);% @  t" F, C' S
  29.     nPower = 160;$ X# D1 {% o$ B
  30.     Error=0;
    * E: v7 ~: ~$ k1 S# N$ s; ]
  31.     ErrorAcc=0;
    . M  ]' _7 ~4 i/ O
  32. }
    " C' j( E0 r3 O9 P% c
  33. 8 B! t- Z0 n6 P7 I( H# t
  34. void loop(){
    : Z" n- O3 Y1 G% p% Y
  35.   unsigned long StartTime = millis();
    ( T( _- a# @5 f; Q
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    1 }  {: }) i3 p2 I. O
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();' V) I$ a& T& F/ y# n6 X: B
  38.     ErrorAcc +=  nError*Kd ;
    % |2 ^" \$ m; z/ Z) Q0 _
  39.     ErrorDec -=  nError*Ki ;
    % r& T# z3 C" l2 d: s0 o) g2 s
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    % V! V# Z; V7 U0 j
  41.     if(nError < 80 && nError > -80){3 J3 G, t* s8 Y
  42.       if(nPower < MaxPower){
    8 L" u4 d0 C+ B
  43.         nPower += 3;
    , T& {8 Y& G# M
  44.       }5 c$ y3 B. w7 K
  45.     } else{
    4 e9 T# m0 \) f4 S9 M) R. D
  46.       if(nPower > MinPower){; @* q, B0 A% b  S
  47.         nPower -= 2;2 B! m' q" _5 D3 c  Y  F
  48.       }: k* n5 @: M' m4 z. I+ q2 a
  49.     }
      {8 P4 L0 D; L/ d5 ^% ?+ x& X
  50.     MotoL(nPower-Error);2 O6 F8 r' V; d
  51.     MotoR(nPower+Error);   
    . N3 ~* o" B( T4 ^  I2 [; v
  52.   }else{
      ?7 f- c8 _* w( M- x, L
  53.     motor_9.run(0);3 {' \, [9 X) ?! E1 ~
  54.     motor_10.run(0);
    ( P4 U3 r4 F& s: y7 e
  55.   }) t  D7 r3 z( N4 H  a/ `8 D7 \
  56.   do{}while(millis() - StartTime < interval);
    ; i$ Q' A" V8 w7 T, J
  57. }: |5 }1 Z% s' P4 M7 t5 V

  58. 7 q$ R6 V2 z2 y/ q' z4 k
  59. void MotoL(int Power){7 ~* g7 O) P3 t* i! h
  60.   if (Power > MaxSpeed){! \$ ]8 N& }* ^: I2 k2 \
  61.      Power = MaxSpeed;
    7 K" K) ^; J4 ?( M9 K: A' @
  62.   }
    , @( _$ z. o, u5 T, R
  63.   if (Power < -MaxSpeed){
      U( H, r9 R  U/ V! X" d! l
  64.      Power = -MaxSpeed;
    8 }, q% o1 k+ Z/ H
  65.   } 7 }7 P0 Q2 M; X; V, P2 a3 ^% d
  66.   motor_9.run(Power);: B! X2 q9 b' f' r8 R. a
  67. }  
    , X1 M. {$ V: k% _' Z2 h' Q1 t4 H

  68. 9 Z: b) L3 {# P/ \8 ]4 m
  69. void MotoR(int Power){
    % C, r4 ^  D5 U2 a3 [
  70.   if (Power > MaxSpeed){! X5 _  P6 M/ g
  71.      Power = MaxSpeed;
    7 g/ O+ E( z* B3 u
  72.   } $ O9 y) G+ U. L9 {0 L- U% _
  73.   if (Power < -MaxSpeed){
    7 g) e; n7 M; n5 A, L0 ?
  74.      Power = -MaxSpeed;4 c. G- C; [5 n' h4 ^4 ]/ t
  75.   } 8 D8 I$ m+ F3 \/ x
  76.   motor_10.run(Power);, T" f* D/ P+ @0 h& |5 h
  77. }  
複製代碼
+ c1 r. g" S( {( ~- X

  U3 I; P( U6 @' K2 O
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
" k- g# w" Q. `3 L6 ^, u; U& k) Z1 T
您好,不知是否能向您請教。7 q1 z+ m+ {2 B( V5 m8 n. O7 F
目前和宋修賢老師在處理Ardui Car
5 K0 u  p! E( u9 [, h2 E% Q雖然已使用較繁雜的方式處理了跑出黑線外的狀況. u  C. m0 r& ~! ~# e/ d. z
. k$ }# c7 H1 e2 |) [
但基於想追求更精簡的程式所以還是想請問一下% j9 c, @( R9 s4 J" a% c2 Y7 p; B
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
# y0 A' C, J3 J不知道您是否願意教我可以如何處理1 G. \1 u8 T% z

& e& f# M; |- q, U) v+ R
' v' r+ K+ e0 k以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;3 c" \6 J, ?& P7 S% G
  2. double CNY70Val = 1000;0 c+ ]( p. R; Z& N. d
  3. int interror = 0;6 O  n( X  z- q( y8 u
  4. int olderror = 0;
      T6 J* E5 i0 `: u; _+ o! t
  5. double values;
    $ \, @' M+ b8 y

  6. % L  {& V9 J# p6 E! Z' f/ K

  7. 8 A6 f' o' S8 H; u" O; ]5 V7 D. D
  8. void CNY70()
    $ l' T% O; W; T$ J. c8 i
  9. {9 v7 \. V0 ]' o# x
  10.   valuesRR = analogRead(RR)
    % N7 t, n( P! f$ ?3 x' w: @  J
  11.   valuesMR = analogRead(MR);
    ( s/ G5 w  U. ~% F
  12.   valuesMM = analogRead(MM);) W5 M8 M/ I! p4 I1 v) n; ^; `
  13.   valuesML = analogRead(ML);
    & M. r& p* Z* r! B1 ?* h3 s/ q
  14.   valuesLL = analogRead(LL);7 ?- u2 f& q9 @0 S
  15. , W8 w" s: r1 }) V) j
  16.   if (valuesRR > CNY70Val); q  {6 b3 ~& j# J3 p/ J
  17.     valuesRR = CNY70Val;
    4 `) \# y* Q. |9 L; i
  18.   if (valuesMR > CNY70Val)2 |# r1 w9 H! w$ h" U- m4 r9 h3 N
  19.     valuesMR = CNY70Val;
    . M( E1 T0 N+ i/ @
  20.   if (valuesMM > CNY70Val)& Z, B# n/ h7 P
  21.     valuesMM = CNY70Val;0 C& O* C# g" ^; R% B
  22.   if (valuesML > CNY70Val)9 I% h; V) s/ F/ B/ J7 |
  23.     valuesML = CNY70Val;7 {, {9 g2 a$ ^; d
  24.   if (valuesLL > CNY70Val)5 `  i6 w$ P& @" A
  25.     valuesLL = CNY70Val;% d3 U, s; S5 T( L+ K* Q$ x! V/ ]
  26. 2 i: }, `, ~3 {" v: p: a2 b
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    / h+ Y1 H) Z& I$ l
  28. }
    & I9 x$ Q$ r; Q$ z: D6 \7 q

  29. 7 R8 @# d1 {% n) M/ a! }1 S
  30. void Car()
    ! ^# h& x* D( J# S5 z
  31. {
    # }8 J, S. `" q  X
  32.   while (1) {
    0 V5 p: L% b' e  v+ e$ C
  33.     CNY70();
    5 W. X! D! Y; e3 ^

  34. 6 m- V3 h4 l7 I+ u7 g: a
  35.     int error = ((int)values);
    ' p; I$ `6 Q4 D0 \: D, v
  36.     interror += error;
    0 }+ b1 k3 T5 O8 a1 w2 {
  37.     int lasterror = error - olderror;$ [/ R* O2 l/ I0 {# N/ N
  38.     olderror = error;
    $ k! K( s3 P2 {, u0 Y
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ' q! r8 ]5 E5 N" t( Y
  40. # `. j" M# E" i
  41.     if (power > MotoSpeed)
    7 R) Y6 O5 P+ @/ B/ C/ Z; s
  42.       power = MotoSpeed;: v) I8 G. S% g& _# a' t; D
  43.     if (power < -MotoSpeed)
    : t2 l# m! m) T4 b
  44.       power = -MotoSpeed;
    ! Z' i# t& ?( w* ]6 k9 T! M
  45. + ]" f" W. j" J& A
  46.     if (power > 0)
    * h$ _5 T! B+ Z! S0 k6 z! F5 {+ a5 Z
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    6 ?  q3 j: Y+ m3 |* I/ |& f
  48.     else% k% ]7 I- ?8 {% |
  49.       Speed(MotoSpeed + power, MotoSpeed);- ?' ~3 E( \; ?
  50.   }& c9 ^2 q5 W3 A$ J" x* C0 j/ h5 v
  51. }
複製代碼
0 b  y- k- w/ X" c
! J( J1 \& R" T, Q) }# O1 d  A$ g  k
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 02:37 , Processed in 0.024477 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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