圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20974|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>0 d3 v. j( d% w
  2. #include <Wire.h>
    / g% K  g! r/ ]& f' y
  3. #include <Servo.h>
    / X! v  I% ]4 }8 a8 m
  4. ! Z+ c* {$ ^, q/ Y: K1 L* s
  5. #include "MePort.h"
    ) h$ \3 e- |2 l+ h1 G5 F
  6. #include "MeUltrasonic.h"3 z2 G, H- U/ E0 {
  7. #include "MeDCMotor.h"
    3 ~0 H/ k3 Y1 y2 t
  8.   U3 O: w7 {/ d# G
  9. //double Input, Output ;
    " S6 B1 F7 y+ Z+ M
  10. float MaxSpeed = 255;% L& U' `# A- y, o
  11. float MaxPower = 180;
    7 V3 W. r/ C+ g% n- q
  12. float MinPower = 120;" S" |4 H; S  P# W' I
  13. float Error,ErrorAcc,ErrorDec;
    ; O9 [- a# _- w; |- P8 K' B

  14. $ a" L: k2 W* o# k7 l# O8 z; I) `# E
  15. float Kp=0.14;! U8 m9 S5 S1 \7 A! a
  16. float Kd=0.00020;//23;: G- K+ O2 e% a! [( T1 i  |/ ~5 }) o
  17. float Ki=0.000201;
    " j- b1 g. ?3 N3 c
  18. ; _9 J$ ?! c: Y$ I- R
  19. float nPower;3 w0 ]3 W9 T' j" L
  20. MePort lightsensor_6(6);
    5 e# m; r5 D7 ?1 F) Q, z  T; R5 y
  21. MePort lightsensor_8(8);7 ~% w! C" d7 ?, ~
  22. MeDCMotor motor_9(9);* h- ~4 W7 E, r9 ?4 P' k* s
  23. MeDCMotor motor_10(10);% p7 }2 r# _4 j
  24. unsigned long previousMillis = 0;3 q: _1 J. q& d- ]2 E1 I
  25. const long interval = 1;2 C) J# V2 c  `7 @6 w- q6 q
  26. 4 m6 m4 m; Z- m9 \
  27. void setup(){4 ^8 |! i7 F; k! X! g$ L5 t
  28.     lightsensor_6.dWrite1(1);
    3 O) |7 [) Y; y8 f- |
  29.     nPower = 160;& J: ]) G. i1 `: t9 S
  30.     Error=0;9 Q- Q& Y6 _: R" i% W" E
  31.     ErrorAcc=0;4 ^* \; v3 d% M0 \, O+ ^/ F
  32. }: u& U+ ?# b5 \  Y# H- C) _$ K# A, z
  33. 8 l6 ?2 ^- b* v7 y5 b; I+ ^  {
  34. void loop(){
    + _; m1 \: ^- g8 k
  35.   unsigned long StartTime = millis();" V& G- W2 m' @) b+ g" y* E' l
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    4 K8 [! K( ]7 h- l/ O5 u0 J6 d- H+ j
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();  ?, o: ~7 S8 C* x
  38.     ErrorAcc +=  nError*Kd ;
    - I+ S5 E$ P6 h( K
  39.     ErrorDec -=  nError*Ki ;* A" J5 K6 w+ t  k& E1 x/ z4 }
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    6 U/ R( l& j9 C, k8 }
  41.     if(nError < 80 && nError > -80){+ O0 U* X* U% W# D1 r
  42.       if(nPower < MaxPower){3 w, y: I. [5 d9 M; i8 n
  43.         nPower += 3;( J4 n# Y* {( a$ S, U
  44.       }9 X3 _8 l8 b- i3 v2 }% T# o6 c  T
  45.     } else{
    + {% E' a" c3 a
  46.       if(nPower > MinPower){" M: M- y8 E% {7 ^0 N: }
  47.         nPower -= 2;( G0 l; W6 x9 o2 p7 M% W# A' u  {7 f
  48.       }! T: q/ J' H  O# p3 A3 c
  49.     } " c4 o7 E0 |4 V+ T
  50.     MotoL(nPower-Error);/ f. b8 D0 c7 [$ S, E
  51.     MotoR(nPower+Error);    9 f" Q# ?3 z3 ?, @1 w1 U3 }9 u8 g0 |' y
  52.   }else{
    . h5 A" |& b" E, [* Z
  53.     motor_9.run(0);/ M& q7 Y7 u1 S+ [7 ^
  54.     motor_10.run(0);
    4 k* B, n! [1 e) s
  55.   }
    # C; K- s8 _4 R4 k
  56.   do{}while(millis() - StartTime < interval);* G; c$ g1 N! J
  57. }; D( W) l- }( w! l
  58. . o4 [8 B; _  S+ I/ B( p8 z6 R
  59. void MotoL(int Power){3 u$ }$ n) f( k- |% |% [
  60.   if (Power > MaxSpeed){! H! J, q& ?6 Z; ~+ H% v7 S* G' K
  61.      Power = MaxSpeed;1 E, T/ Z! P- J
  62.   } ; d* a- H) _+ X7 @3 |2 q9 @
  63.   if (Power < -MaxSpeed){4 j' r) _/ x7 H: T
  64.      Power = -MaxSpeed;. O0 h0 W3 m# |( \
  65.   }
    $ N" ~% k% e+ r, m9 A, p
  66.   motor_9.run(Power);( L- Q1 Y% ]7 o. w/ O
  67. }  
    1 o4 j; n& `8 D+ D/ M4 {
  68. % T- J! B+ b, B/ N0 Y* ?" m
  69. void MotoR(int Power){
      I. Y& u3 o9 c  r
  70.   if (Power > MaxSpeed){
    6 Q2 G6 k* c* d8 T7 u/ b
  71.      Power = MaxSpeed;0 k1 ?1 M1 I, p3 Z
  72.   } 3 u$ G! a& o; h( z
  73.   if (Power < -MaxSpeed){
    # w8 w$ o$ V4 c
  74.      Power = -MaxSpeed;
    & s4 z% `+ |' L" A$ i/ V* E- }
  75.   }
    + t  _- Q% q/ u8 m. K* M% w
  76.   motor_10.run(Power);
    " {. p8 R  e0 u, M9 ^' c" L7 }
  77. }  
複製代碼
# z" Y, V# Y; |% p  O# A
. u. a: \6 {% X# f' r, z
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 6 K# A* |) y# _  B/ `
& M& B2 c* h/ j" s, Z* \
您好,不知是否能向您請教。
' J1 P/ `, Q! v: l( X1 T- @" C目前和宋修賢老師在處理Ardui Car
) W& p: }" X/ F/ ~雖然已使用較繁雜的方式處理了跑出黑線外的狀況
7 j1 i8 r% \' `1 `' k5 ]
3 p" U) ~8 t! [0 y4 r$ t6 C但基於想追求更精簡的程式所以還是想請問一下' s8 }2 Z, Q- H- B
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
* o7 }1 W5 d" ?4 f# j1 b# e" x# ^( d不知道您是否願意教我可以如何處理  A/ k6 S$ C6 W) o
, X. S6 g' j$ }
, V8 x. R" ?. @2 O
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;0 r/ S) M. i+ M) v- y( Q7 X* M# ]6 ~
  2. double CNY70Val = 1000;" q; Y' E9 l) b& \
  3. int interror = 0;
    2 D4 d7 L8 ]+ B9 m; P* O# {
  4. int olderror = 0;9 r, C1 t) ]9 J* a8 Y
  5. double values;& ]- a+ _! T% N5 x
  6. 1 o0 a9 A4 f- S
  7.   J2 \7 u! a% N4 O& n4 n
  8. void CNY70()
    . T1 Z. T" j, Q  e5 Y2 g
  9. {: L) H5 t0 A7 ]& y% F
  10.   valuesRR = analogRead(RR)
    / u" G: N6 L1 q/ {
  11.   valuesMR = analogRead(MR);& w, @3 i% @3 w& S3 a
  12.   valuesMM = analogRead(MM);
    # N6 ~$ `& K; z: _
  13.   valuesML = analogRead(ML);& g8 e" v& K; \4 T
  14.   valuesLL = analogRead(LL);
    1 I- A, t" F/ h
  15. ) Q( u0 }% S# h; w7 V
  16.   if (valuesRR > CNY70Val)3 s/ l* N/ |$ z4 I: i
  17.     valuesRR = CNY70Val;) G& w; U  }% s4 W
  18.   if (valuesMR > CNY70Val)
    $ E: C( S, C; f! r; d
  19.     valuesMR = CNY70Val;! i! i) a7 T( E7 b( R0 t7 `
  20.   if (valuesMM > CNY70Val)
    & x# E/ s3 T. w& Z
  21.     valuesMM = CNY70Val;
    8 p8 r1 @5 M) [; W. S3 P/ X4 I
  22.   if (valuesML > CNY70Val)1 c, D# K& {" n. u9 W0 Q
  23.     valuesML = CNY70Val;% }$ `; W0 G0 x" P9 Z
  24.   if (valuesLL > CNY70Val)  H5 _- K2 _& K! G+ K. S- Y
  25.     valuesLL = CNY70Val;
    9 y5 D: y! m! e- @

  26. ) k0 Y" x3 m% T2 ?3 x; a
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    1 G; Y% n/ {( Z9 P7 m8 ?+ O9 G- c
  28. }) x# e& r; n! j- j

  29. ( X0 T7 C: Y4 r( }* q3 j
  30. void Car()
    4 m3 l8 m7 K+ j1 y
  31. {2 w5 {9 ]3 W. |
  32.   while (1) {; _. c8 [+ w7 c# y8 i9 P
  33.     CNY70();- P- A* `. D% G

  34. : t" v& q$ J/ v6 Q/ b+ i
  35.     int error = ((int)values);& r. k' R( I& A7 N
  36.     interror += error;
    ; Z" l( A! J4 q& R, L# Z0 X; Z2 g
  37.     int lasterror = error - olderror;- h3 U; C( V# `: [5 p" j( k
  38.     olderror = error;
    0 [# P& A5 m4 ]4 |, |
  39.     int power = error / 5 + interror / 10000 + lasterror;
    + u! {  p. E% i0 ~/ L. }) H$ c3 m
  40. ' f# Z2 n- G  n. i* F* ~9 n
  41.     if (power > MotoSpeed)
    " M* ]2 I4 `) D
  42.       power = MotoSpeed;
    & h8 H5 G# Q6 i3 {4 i
  43.     if (power < -MotoSpeed)' a/ u9 ~" \3 H7 W* n2 ^' y
  44.       power = -MotoSpeed;. w7 |* L+ S  |8 {1 G5 d

  45. . F# E% q0 y: q8 p
  46.     if (power > 0)
    2 U$ v+ b" G) B
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。8 g2 Y2 w+ I& x- e3 d% P2 g
  48.     else) A9 p$ A5 C: `  B3 W
  49.       Speed(MotoSpeed + power, MotoSpeed);
    7 f1 ~( f0 ?/ T& x% t( k
  50.   }3 R& ?$ [+ I+ o
  51. }
複製代碼
6 a; o9 Z& X; v- a
: {! R! Y# v9 Y8 X7 p
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-12 10:03 , Processed in 0.026782 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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