圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 19935|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>) x6 C9 e& r+ X, t/ M6 s9 [! Z% y
  2. #include <Wire.h>
    ' u; r. @8 o% ~, w1 M# i
  3. #include <Servo.h>7 ?4 G! e1 W  `/ V- T# O
  4. - o+ K6 M8 b6 V6 n1 D7 p
  5. #include "MePort.h"
    - W+ a: t! f+ p+ S% s
  6. #include "MeUltrasonic.h"
    , r. V/ y  o+ @9 h# i
  7. #include "MeDCMotor.h"' J, E  G1 X6 b( D, {
  8. ) |9 U7 h  ^. B2 ]; T$ r/ g7 z
  9. //double Input, Output ;2 b8 h  K/ J- h" w: D& Y$ n- O
  10. float MaxSpeed = 255;
    / y3 j' y/ Z6 j8 u' q. O
  11. float MaxPower = 180;0 }. [1 V  u, |/ S
  12. float MinPower = 120;
    & ]; M2 W* v2 j/ N7 {6 F2 z
  13. float Error,ErrorAcc,ErrorDec;+ Q, u4 p7 e/ ^9 O( [+ m5 r9 H

  14. + z2 ^# v' Y0 V- t
  15. float Kp=0.14;$ B; _7 T# n4 i: f& `9 _
  16. float Kd=0.00020;//23;9 z- g1 e' I  H' g* I5 n" u, r$ b
  17. float Ki=0.000201;
    . j* r" i; d; v4 B% m+ S8 F& T6 c

  18. , C+ X3 p# _( k9 o* @8 R
  19. float nPower;3 |2 g" p2 e& {7 t' \4 r/ ?
  20. MePort lightsensor_6(6);0 A' P8 f  G+ d+ h
  21. MePort lightsensor_8(8);& N! Z2 I3 Q4 m6 V$ B+ W- n# p
  22. MeDCMotor motor_9(9);
    - t* l# z; G2 I6 L
  23. MeDCMotor motor_10(10);% X: D7 _, {, i+ W+ u( V
  24. unsigned long previousMillis = 0;
    * u/ e. }5 K6 b
  25. const long interval = 1;
    3 s8 [4 S$ j; i9 L$ K

  26. 7 O3 z, N8 A- t! A! X4 @0 b3 V4 I
  27. void setup(){, e: M# M! ?5 c% c7 _
  28.     lightsensor_6.dWrite1(1);3 D) M7 v1 N& P) f. G2 ~
  29.     nPower = 160;
    9 N* v- h3 K" d9 e
  30.     Error=0;8 \+ }+ C; T5 T" z: O1 ]
  31.     ErrorAcc=0;
    3 Z9 V" Q3 O3 v3 e7 S- ?) _
  32. }
    5 C7 m% _% l! ]9 P& H& C5 W
  33. $ D1 @4 r$ i; Z+ n$ T
  34. void loop(){8 R) e+ F$ t. i& O
  35.   unsigned long StartTime = millis();
    * R# Q8 g( F5 f* D" M1 d8 W0 P8 p
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){3 G/ B% z- L9 Q. o; r! [+ u
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();3 [2 H7 V% V) q# w8 z6 D- E
  38.     ErrorAcc +=  nError*Kd ;7 Q, D9 `" r" o1 i/ g
  39.     ErrorDec -=  nError*Ki ;
    % X. n) V+ B( r  v# d1 M
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);% I  Q  K  G2 L( d1 n
  41.     if(nError < 80 && nError > -80){& |% h0 }8 z* y( g8 ?
  42.       if(nPower < MaxPower){: ]) j( v5 E& d. b* @
  43.         nPower += 3;% b% J3 M8 X) P7 D$ ?5 ~
  44.       }( q; z- ]$ g: @( B- C2 F. w
  45.     } else{
    / S) x3 C- C3 X+ M
  46.       if(nPower > MinPower){
    6 Y, H1 z( r; A
  47.         nPower -= 2;! C; I' j- `3 ?+ [
  48.       }
    7 U* M0 p7 ?6 T% W8 Q% `# C
  49.     }
    * ~5 c+ `; E; @% l0 _( C1 O
  50.     MotoL(nPower-Error);
    1 a6 ?5 X( z3 a, ^4 i) N
  51.     MotoR(nPower+Error);    $ x/ y6 f4 r/ m  ~5 G
  52.   }else{4 z4 h( |) X6 w
  53.     motor_9.run(0);) ~3 V6 c) J7 ~+ c7 ?4 r+ a- r
  54.     motor_10.run(0);
    * b( q7 ~& T( ?
  55.   }
    ) G$ }: m2 x8 F3 C6 U% B( D% L" l
  56.   do{}while(millis() - StartTime < interval);0 T2 V9 x% D  l, X6 g2 \$ l7 r
  57. }3 G- }% D- d( n, z4 ]( r

  58. 9 l$ j# M; R* x) m1 A
  59. void MotoL(int Power){
    , v/ n* X* O# z2 o+ X
  60.   if (Power > MaxSpeed){
    / T+ d( T( O) q# o
  61.      Power = MaxSpeed;
    % T, Q1 G2 P6 V" r0 \  N
  62.   } % S1 v0 e1 q0 R/ r3 w
  63.   if (Power < -MaxSpeed){& `$ s4 X/ C% w" p) }
  64.      Power = -MaxSpeed;+ j1 e9 S/ O5 t" v) K% J
  65.   } ; |$ X4 f- W$ C# P4 @/ E. y7 }. n
  66.   motor_9.run(Power);+ {3 }" F9 r' w% t+ @# ]. D* a
  67. }  & O0 w  q" z3 n+ k; I7 V1 l
  68. ) F& p% s# ]+ ]0 Z9 H4 M7 A4 C
  69. void MotoR(int Power){. k2 p; ^' Z% Z
  70.   if (Power > MaxSpeed){, [: ?2 A( [7 w2 ?1 w
  71.      Power = MaxSpeed;9 `; O, v& S0 o& A1 a
  72.   } : J- ?9 @8 u% \% x
  73.   if (Power < -MaxSpeed){& O$ ]2 P+ J" f2 j
  74.      Power = -MaxSpeed;5 g2 Z; Z- z4 j4 K# T
  75.   } " e, v6 |* J. Z( Q* r6 `' `& v( K
  76.   motor_10.run(Power);
    & p4 M  v8 D- S; P
  77. }  
複製代碼

" |( z8 ]; N) |. ]% ^) L  X% u1 i1 b3 N& N: S: _
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
. ^# }5 P# x$ v- }9 s# d
3 r! D! x1 ]3 X/ g' {) B, W6 _" ~您好,不知是否能向您請教。
! M$ E2 ~8 I3 ~: A目前和宋修賢老師在處理Ardui Car
% c' `2 A6 R& G" Q( C7 V& J7 u0 [雖然已使用較繁雜的方式處理了跑出黑線外的狀況
) \  k5 |: X0 C" F& R' n
! c5 U) }+ ?4 P) J1 O) J5 v但基於想追求更精簡的程式所以還是想請問一下" ~$ O  d$ A1 U3 t1 R0 X/ k
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
* \. s* e! _& b3 {" L6 V不知道您是否願意教我可以如何處理/ b  B4 A! x, K6 u
2 r8 P, G! t+ P8 ]* p, Z2 Z0 Y

. }' j2 H/ ]- w, ]以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ! {. P- f1 W6 _% \
  2. double CNY70Val = 1000;% t3 z6 T) y: G# p) c
  3. int interror = 0;2 u1 L( F  L. B( n- y
  4. int olderror = 0;5 f* f! r: H; \2 z. G, u: \
  5. double values;- A3 i9 W8 I4 w
  6. 0 q- G0 t, ~9 V) Y

  7. ' a  Z- ^0 C0 L/ I& R
  8. void CNY70()
    3 R0 W5 T5 ?$ E0 n
  9. {
    % n+ L  M+ p- \1 E4 ]$ P
  10.   valuesRR = analogRead(RR)
    8 L! g3 I. d$ T7 ]0 p
  11.   valuesMR = analogRead(MR);7 Q) A$ Z' v9 h3 }# q& b- `% R
  12.   valuesMM = analogRead(MM);) J. p* q- g6 _8 H" [/ F$ \, y
  13.   valuesML = analogRead(ML);0 o4 j( \4 v9 [. n9 G
  14.   valuesLL = analogRead(LL);
    2 O6 O# `( b" c5 c

  15. 1 H/ H$ }6 s) q. Q5 r0 w6 G) G
  16.   if (valuesRR > CNY70Val)+ Q( o% J9 U! J5 Z: {
  17.     valuesRR = CNY70Val;. U7 x2 @9 ~) Z8 V$ _) S* K
  18.   if (valuesMR > CNY70Val)
    # G) ]/ d* u7 w" c
  19.     valuesMR = CNY70Val;
    1 B, H% S( H! t' }4 j+ H
  20.   if (valuesMM > CNY70Val)# h- q# d2 Q. [, W
  21.     valuesMM = CNY70Val;( S) m" a# u* [& x; c# S
  22.   if (valuesML > CNY70Val)0 x' u2 e. W& P" R& g. V
  23.     valuesML = CNY70Val;
    - Q' I/ X+ i5 t7 |. q
  24.   if (valuesLL > CNY70Val): i( e# Y$ n, Q, f+ E& J5 q# l6 x
  25.     valuesLL = CNY70Val;
    / K8 |6 E. D2 w" P4 T$ j* u! {* L9 v; m

  26. 9 W6 e  Z  W1 m& s* w
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    9 p6 W! c, w* a3 S8 j! W- u6 S
  28. }& i$ k; ]2 }7 r2 y  a" j3 t& k; X. s# N
  29. ; S. |# ?: r" J% I7 v: B  r
  30. void Car()
    3 y7 j7 ~+ [+ _* F; {
  31. {
    5 F) _& u8 v" A8 O- N
  32.   while (1) {. ^# J  X4 Y, I, s+ ^8 A
  33.     CNY70();# w7 R% ~2 Z- b! j

  34. % F6 a$ U! d0 i- v+ X0 l9 m' Z' V
  35.     int error = ((int)values);
    6 V( D- Z4 e5 b
  36.     interror += error;
    1 G" r) p* V4 e2 T" N" d+ e
  37.     int lasterror = error - olderror;/ {6 H  |/ E3 E
  38.     olderror = error;
    7 ~& J0 C  n# T. b1 |  }: k/ F
  39.     int power = error / 5 + interror / 10000 + lasterror;
    6 v# U; t0 }8 H) D
  40.   F! s5 a) k+ @& W8 T1 Z  V# x
  41.     if (power > MotoSpeed), l; F9 O0 f; Z( I2 t0 x5 b
  42.       power = MotoSpeed;" L. m& b9 X3 T2 }0 y* _: d" S# B+ v
  43.     if (power < -MotoSpeed)
    * j" W, L# C. j7 U  U2 k
  44.       power = -MotoSpeed;
    & A' E0 `1 x& N1 k& T2 X
  45. $ n$ m; r6 S4 |- U. p' W3 _
  46.     if (power > 0)
    7 N* J. I! y, S( P: o+ A7 v
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。) ?/ r, ?6 m8 [  v% e5 V
  48.     else
    - W5 P" X4 p! f# Q
  49.       Speed(MotoSpeed + power, MotoSpeed);; U2 r) K5 F6 i' i; m8 v' S
  50.   }9 w) R8 e$ Q: w
  51. }
複製代碼
4 k! j+ |$ X0 \) X' T
4 o0 z- \. H$ ~# p" a" ]0 z: O( B# V
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2024-11-23 21:31 , Processed in 0.024561 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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