圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21865|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
      Y; S; p( T6 t! U5 n( d9 N
  2. #include <Wire.h>: [7 ]) Y6 F+ V) L
  3. #include <Servo.h>
      Y' c/ D- C5 c# B3 G  Q/ C

  4. " o3 ]% `' j; r2 E! a4 T
  5. #include "MePort.h"9 w- A8 ^( ?2 H0 e
  6. #include "MeUltrasonic.h"5 Z/ T( d) S6 e% j4 d5 V/ A
  7. #include "MeDCMotor.h"
    ; H( O7 h4 ^: L1 V' H4 r6 s
  8. * V0 G) ^5 o2 v& Z
  9. //double Input, Output ;
    ! o  I% }1 `3 {* w3 m, o
  10. float MaxSpeed = 255;3 g5 \6 \' o& P2 h) N8 m
  11. float MaxPower = 180;" |' M* ~# y( w
  12. float MinPower = 120;
    ' l2 X* }: ~2 A$ h% o0 ^3 x5 e
  13. float Error,ErrorAcc,ErrorDec;" L: V1 e' z& |' D# X/ w. n, L
  14. " A& I- i. J5 Z) V+ o' q* @
  15. float Kp=0.14;
    ( C- x! Y% q5 e# e9 e7 S# A
  16. float Kd=0.00020;//23;5 H$ ]" Q$ [( g* f0 k
  17. float Ki=0.000201;& U$ V$ X4 v8 ]6 J, \% Q
  18. + m* Y' K1 T# l6 H3 c
  19. float nPower;; c/ b) f( S$ W# h- ?' v4 s/ H, g
  20. MePort lightsensor_6(6);0 B/ a2 V: h9 S+ h
  21. MePort lightsensor_8(8);
    & A/ [6 P3 S3 l/ S' ]
  22. MeDCMotor motor_9(9);" {1 ^. f, r$ R$ y, `+ j. l+ M. m: B: _
  23. MeDCMotor motor_10(10);9 p! u& J6 E( T8 X" B' s2 i& w: a
  24. unsigned long previousMillis = 0;
    % {/ l/ f! X5 k" l, G2 ~7 R+ W1 O
  25. const long interval = 1;1 q% O5 @  U* i9 d2 }: m5 d, r
  26. : E" H! p4 i2 z8 n- G
  27. void setup(){
    " M- G' W& C- A1 P- v
  28.     lightsensor_6.dWrite1(1);2 o0 I( l5 V6 ~' H5 p5 A1 n9 G
  29.     nPower = 160;
    & I6 e/ ]% ^, N. g& g; e) K
  30.     Error=0;4 c! C& [& Y! S
  31.     ErrorAcc=0;' M0 h& s2 P3 B  I$ @$ t) @
  32. }  _0 \+ u4 v/ U8 D

  33. $ x, S* ^/ k7 [3 m* C( S& O
  34. void loop(){
    . l8 ]1 c! R1 E! i& v
  35.   unsigned long StartTime = millis();- |7 F0 |3 I+ Z! _
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){5 j3 {) B9 c% D# x
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    $ s2 I& _; o( f7 _) d
  38.     ErrorAcc +=  nError*Kd ;
    ' T( _( r2 M' y* P$ E3 u
  39.     ErrorDec -=  nError*Ki ;
    & _5 }0 B3 v& P0 \! ^# m
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);/ |9 j9 x9 o( d% r
  41.     if(nError < 80 && nError > -80){3 K: v$ T& P* s4 a: j& n
  42.       if(nPower < MaxPower){
    8 ?( B! q; I6 T; [4 q% h
  43.         nPower += 3;0 `" c4 I$ F+ ?) }9 C( c2 T
  44.       }
    3 q* J: X# }! M/ P% n
  45.     } else{( p, b1 m& f  x7 x
  46.       if(nPower > MinPower){" i; D% T! S% M4 Z+ C' G$ f" ^  y
  47.         nPower -= 2;& n) ]) r. j1 m5 {' \" t9 b+ e
  48.       }
    / r+ J& {, D4 m8 }/ P( A; M9 D
  49.     } 7 v3 U5 }- w5 }( c% o' O5 x
  50.     MotoL(nPower-Error);
    ( |" \( w. G0 x. Q) ^. C
  51.     MotoR(nPower+Error);   
    , P2 T. H% F/ j# E% d; s
  52.   }else{( \1 J% z3 Q: ]" W$ z
  53.     motor_9.run(0);
    2 f- z. V7 \7 m; r
  54.     motor_10.run(0);* \6 f. e: x0 \' V# @
  55.   }9 P7 j( d3 `) Q( X9 Z/ b
  56.   do{}while(millis() - StartTime < interval);# a' [, W* }6 B) H$ ?1 n0 d
  57. }
    - ~4 A( b8 A" U& J* M( Y0 z1 I# ?
  58. , l1 S3 B/ g$ {( J
  59. void MotoL(int Power){% C$ K, G& T  [2 v- n7 ^; v
  60.   if (Power > MaxSpeed){
    5 _! X' z: I  E+ f  j* Q  G( E/ S
  61.      Power = MaxSpeed;* i' }6 g7 c% i3 B
  62.   }
    + ?  r* x- I+ Z* e9 z  x
  63.   if (Power < -MaxSpeed){% a- G! T" V. E* Z8 u
  64.      Power = -MaxSpeed;$ V' n3 j" p2 Y  k
  65.   }
    8 W; g" T0 }9 g( @
  66.   motor_9.run(Power);
    , G9 A& g4 U( @! \& j3 j9 Z) h! B) |3 n
  67. }  ! P  u( ?9 w( c# G/ a3 R7 ]3 i
  68.   F/ X! B+ T1 T7 U% u; j# S1 j
  69. void MotoR(int Power){
    ; N0 e3 M! b! M4 @
  70.   if (Power > MaxSpeed){# O+ ?  s2 k+ x
  71.      Power = MaxSpeed;
      A4 |& n( m) ~8 l) e
  72.   } 6 G( [) S$ F# X
  73.   if (Power < -MaxSpeed){
    ; I+ g* J6 e: z6 b/ w
  74.      Power = -MaxSpeed;% @2 \4 B& _; z; k" o
  75.   }
    & ~* t7 f. ], F' K) ]0 K- n1 g
  76.   motor_10.run(Power);* h! H, U5 P! V3 E5 Y+ a* @5 [
  77. }  
複製代碼

: ]/ X1 R, ~9 i" y) R' v' n: n- @0 z' i% q
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 0 \$ t" g) \& ~6 `
) x6 o6 T( q" p9 Z" o
您好,不知是否能向您請教。' Y, \- |- v2 L- Q: w
目前和宋修賢老師在處理Ardui Car" Z0 t3 O% [+ u! N
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
. L1 ?5 ~2 p3 I4 c/ ~
' ~7 q) l8 T% h* n但基於想追求更精簡的程式所以還是想請問一下3 ^3 D6 B4 |/ D! x9 W/ G
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
+ m+ f5 u# y7 m3 x: _不知道您是否願意教我可以如何處理0 n) M  a: q" v6 b0 {

* }* K+ {+ X. y$ T  K+ O7 _. C& w% V, k% n9 c
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;2 p7 W2 u; q7 p" C5 e! l6 J( R
  2. double CNY70Val = 1000;
    6 f  Z* ]$ M; L9 |
  3. int interror = 0;
    : {- [; ~5 |+ R9 R9 Q
  4. int olderror = 0;
    ( u; l7 i6 n- m
  5. double values;
    5 P+ Q5 }9 B0 Q

  6.   n% z$ ~& X1 T( Z( m3 Z) M
  7. , G* `; C6 ]: F
  8. void CNY70()% ^# j6 J+ Z7 \8 [5 t- B
  9. {
    ! R3 k6 R+ v7 a  a: k- |3 o. w
  10.   valuesRR = analogRead(RR)
    9 [& f! ?# m' s4 N1 u$ k3 |
  11.   valuesMR = analogRead(MR);( p3 f- F& X' x, b0 J
  12.   valuesMM = analogRead(MM);
    $ z% _6 \: c0 D2 m6 F' R( K' t
  13.   valuesML = analogRead(ML);
    4 k: H8 |6 p: b; H2 d1 R! P
  14.   valuesLL = analogRead(LL);# U1 _$ d9 A! q( q# @, |

  15. , q8 e  C# S+ I  l" m9 `& b
  16.   if (valuesRR > CNY70Val): l2 h, g7 E$ X5 q4 j9 r
  17.     valuesRR = CNY70Val;
    ( \4 }. T5 k9 K% _
  18.   if (valuesMR > CNY70Val)' Y; Y# u9 ^% b7 O2 A: s0 p
  19.     valuesMR = CNY70Val;
    ' S# }! k5 e9 y& U8 c+ P* K
  20.   if (valuesMM > CNY70Val)
    & J, K: d7 i4 F7 e+ Q
  21.     valuesMM = CNY70Val;
    6 |4 z8 L; B$ E. Q. N+ ^( ~
  22.   if (valuesML > CNY70Val)
    & ?/ U: Y( s* [& B: A
  23.     valuesML = CNY70Val;8 O& K% m7 e/ Q: u
  24.   if (valuesLL > CNY70Val)" Q( m! k; d! ^( C9 p5 ?8 e+ ^) F9 ]
  25.     valuesLL = CNY70Val;
    , z9 o% [' p$ [4 k& p' ]

  26. & \& m4 f& Q& _$ f/ I2 Y4 {$ v
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;! A; i' |2 K' V' O3 l
  28. }+ \  {) w( O; k% [: P$ m8 O/ B0 J% C

  29. & J( b1 G7 o0 Q3 p4 {+ J
  30. void Car()  ?' F$ E) f! l, E8 s( Q: E8 d3 ?$ D
  31. {  m5 f' n) j$ o) z  J; [$ i
  32.   while (1) {1 }4 {+ M/ d) o% K) M' H
  33.     CNY70();0 R& D; S' ^: x$ O. P! C
  34. # x6 ~* P) N& Y! f% F, _
  35.     int error = ((int)values);
    & Q; a9 r3 l2 u6 d! v# B* k8 H3 h
  36.     interror += error;8 v) F4 H& n# v; g* ~9 L$ ~
  37.     int lasterror = error - olderror;
    - G9 _- q- G6 B
  38.     olderror = error;
    , }" g# Q0 ~4 c( C* P8 |! z
  39.     int power = error / 5 + interror / 10000 + lasterror;+ Y' s" j1 X/ V$ G! P& H

  40. + b2 a* I& ~# h$ o. Y2 [
  41.     if (power > MotoSpeed)
    $ G+ Q" c9 S' _5 y7 Y8 d* K% j
  42.       power = MotoSpeed;
    4 p$ ^1 ?% \/ X. W+ k
  43.     if (power < -MotoSpeed)+ P! h! U4 c; W2 o8 ]4 C
  44.       power = -MotoSpeed;$ c1 p( o. S- Z. E( D: j
  45. 6 ^3 s( k: f, e4 G$ |5 q  s
  46.     if (power > 0)& n+ N$ K  O/ u
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    - }  |* p$ l5 M
  48.     else6 b; w- a; Y1 p! Q8 F8 O
  49.       Speed(MotoSpeed + power, MotoSpeed);
    / ^/ V! ]- @7 |5 y- x1 B( X8 o8 f
  50.   }# q& y4 S8 Q. t! Q  S; z  j
  51. }
複製代碼
* }5 i) F. R, v- k2 i$ H/ X
7 l& Z+ H" l4 A6 t  U0 F5 ]7 x
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-6 17:43 , Processed in 0.026759 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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