圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20907|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>3 [& w6 w; e1 e3 L3 q$ z$ W4 H* d
  2. #include <Wire.h>. R, P" ~+ B5 V) F5 K, I* g) c
  3. #include <Servo.h>; C+ ]5 a" V1 N$ l

  4. 7 m" }- i4 t) z7 c
  5. #include "MePort.h"
      T. G/ H2 Y9 z8 N) S# c# L' H
  6. #include "MeUltrasonic.h"$ _7 |5 z+ M  D1 @" N1 A+ I
  7. #include "MeDCMotor.h"& P( M' c, l) j

  8. / K/ ~5 t$ ~: Q* F6 O
  9. //double Input, Output ;
    3 p, T( E: }, w/ i- v
  10. float MaxSpeed = 255;
    $ {& U' b  H& ?# P$ n2 t
  11. float MaxPower = 180;
    0 s, v0 O, `% V9 Y8 b
  12. float MinPower = 120;& Z7 x8 b$ j  F9 D5 a' o
  13. float Error,ErrorAcc,ErrorDec;
    5 j& `' [& p5 @4 G  y
  14. % `9 \* j6 ]/ f8 N! B8 R
  15. float Kp=0.14;
    6 s6 D6 h7 S+ ?, l
  16. float Kd=0.00020;//23;
    % d1 O' Z3 o' i8 F. w* X" c' v
  17. float Ki=0.000201;
    $ n9 N8 k$ ?+ P- \( y

  18. * t0 ^" J* R, _/ W* V5 _+ L: i4 I, M
  19. float nPower;  U9 G4 h+ d' R  Y/ _* d
  20. MePort lightsensor_6(6);
    ! S3 D% z4 u, M" f( P- C
  21. MePort lightsensor_8(8);' {+ Y8 O+ L) z. W/ \6 |
  22. MeDCMotor motor_9(9);0 j- \- B) v9 ]% k: Q, {6 ^
  23. MeDCMotor motor_10(10);$ c# `1 \" Z5 g# E$ W3 f
  24. unsigned long previousMillis = 0;
    ( g9 f1 g5 g" c2 s  O
  25. const long interval = 1;
    % {9 y/ _' _" Z3 B! S- n2 U; Z
  26. ( B( Y* ]7 y" d/ r5 ]$ F9 R3 b
  27. void setup(){
    # V  p7 [5 r% d; e! @' F# w
  28.     lightsensor_6.dWrite1(1);
    + q, [: A3 t- c) K- @* h
  29.     nPower = 160;  T5 E$ e0 R+ S. T6 Q
  30.     Error=0;: L% y7 k' L+ ?6 ^6 l
  31.     ErrorAcc=0;  B/ _8 j+ I" W5 M3 k
  32. }: z# F5 j2 _# C. h- t1 W6 S

  33. : h! j0 Y1 e3 t5 ?9 N9 Y) F
  34. void loop(){; \1 h; p7 `1 [1 A
  35.   unsigned long StartTime = millis();: ^- r* C* T2 [4 I8 x
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
      n6 e9 Z& [1 b2 o; R, C4 c
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    $ w9 Z/ Z. w# D7 w0 I1 Q% z
  38.     ErrorAcc +=  nError*Kd ;
    : }' M+ v3 x3 E, l
  39.     ErrorDec -=  nError*Ki ;
    & P( ?: O6 N' ~( {$ Z
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    3 s9 A# B9 j$ c
  41.     if(nError < 80 && nError > -80){( g" |5 k) B0 P1 \& N
  42.       if(nPower < MaxPower){
    & t4 g' w9 ^, i& A' P4 H
  43.         nPower += 3;8 s2 C& T# ]+ W' f( p* `
  44.       }
    % [0 M6 q2 P3 u2 @6 M9 r9 B! E
  45.     } else{
    5 s* n) [# q, e& F% j
  46.       if(nPower > MinPower){
    , J/ [% }4 w: k( Y7 T
  47.         nPower -= 2;
    7 D, J, x3 w* i$ k9 e0 G1 w4 o5 X& D
  48.       }: a" c# {, K; l! O- p7 I2 e
  49.     } % J# h- y- B- S8 Y. D' `, {
  50.     MotoL(nPower-Error);' L# ~0 q6 ^# q( c0 B$ h
  51.     MotoR(nPower+Error);    ) L, w  m7 u  G
  52.   }else{! G" b" d' i' J" X/ L
  53.     motor_9.run(0);
    - j  U: t% J3 d; B8 @6 U
  54.     motor_10.run(0);# D; {! h: L; L$ `* C
  55.   }: x; U' D* V6 C
  56.   do{}while(millis() - StartTime < interval);6 w6 m2 I- W0 Q
  57. }/ F3 f% Q! X8 V& j2 B7 e
  58. # ~9 i+ [. Q$ h. L
  59. void MotoL(int Power){
    - N3 ]3 z" I2 V; B% q+ y. d
  60.   if (Power > MaxSpeed){
    ; I+ f6 v9 Q* y
  61.      Power = MaxSpeed;
    * N' _% K4 _2 i; ^
  62.   } ( P! V: m3 B0 @9 {1 ]
  63.   if (Power < -MaxSpeed){: v5 l) B% G2 \& P" V
  64.      Power = -MaxSpeed;& h1 `, p/ u% q" l- }& u
  65.   } 0 `4 z! d* n* l& w' G, J
  66.   motor_9.run(Power);
    7 x5 J& g0 W8 B  F- i: N% o
  67. }  5 ]: d1 t; T  |. D8 ?  r% q: q

  68. / y* N3 I" J7 i/ ~+ i2 h( c
  69. void MotoR(int Power){
    3 `' u) q& Y8 Z# B+ [
  70.   if (Power > MaxSpeed){
    9 v1 q/ J* G, S- W
  71.      Power = MaxSpeed;
    ' `0 b$ j+ Q0 w; }0 Q
  72.   } 0 e6 b2 G! l. c! i2 q
  73.   if (Power < -MaxSpeed){) U6 R& Q' U& L% V
  74.      Power = -MaxSpeed;
    $ v4 s, y& J4 T6 ]4 I
  75.   }
    % w! T* Z# w/ y, c* B) n* x0 [1 ~
  76.   motor_10.run(Power);
      H* W- l. v2 q
  77. }  
複製代碼

2 J, q) A7 t; o- d- d+ ?: _3 C4 z6 H  X5 g
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 U: N* @; d5 c( |
1 w3 k# p- T: [4 K3 H2 j$ w' h2 ]; ?/ t您好,不知是否能向您請教。2 Z. ~" ~( K1 j& X0 R  ?8 F0 W% Y. `
目前和宋修賢老師在處理Ardui Car6 m, Z5 r& M* x# ]/ `5 y0 o
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
% U- ]' w0 f$ z; g0 ^9 t8 a) _+ n  ]' s. `0 L
但基於想追求更精簡的程式所以還是想請問一下3 u8 i: d  V; j( @( \* W; L6 L
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
3 D; x  \$ C/ o5 r& ]6 I8 m不知道您是否願意教我可以如何處理
5 F% R* A- i) V7 t7 B0 j, g8 A
: |, p& Y' x. \7 f) O, D& G+ p4 W0 |/ v. h: ~6 f
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    4 ^) F7 K4 c. D- {) ~' P4 {8 N
  2. double CNY70Val = 1000;
    $ l/ |9 F# R3 ]; Q  k: O
  3. int interror = 0;- S4 y  A5 l0 X) B$ @! `) ^
  4. int olderror = 0;5 |$ E, {: k+ N+ R5 w& ~
  5. double values;
    1 m% u5 J4 u8 I- H4 L# P

  6. . {+ x2 m, ?' Q5 I
  7. ) d2 j: j# I8 V% X* w
  8. void CNY70()
    ( _" r2 g+ \" K8 H) w
  9. {; @; ]5 J3 p+ G$ ?- D
  10.   valuesRR = analogRead(RR)$ X4 j& X6 d0 F& t& Z9 G- s
  11.   valuesMR = analogRead(MR);1 M- R8 @4 w) {. c  J9 {; F' U( T
  12.   valuesMM = analogRead(MM);9 e& `' m4 O) [% n6 k
  13.   valuesML = analogRead(ML);. {5 O- t' r# a5 L3 Q4 N* U
  14.   valuesLL = analogRead(LL);
    ; F/ n) u/ z( S1 a

  15. ' U" G, s6 T: M
  16.   if (valuesRR > CNY70Val)7 ~% Z4 _, z4 K0 P7 p1 {
  17.     valuesRR = CNY70Val;! y8 m/ x1 y, o, Q
  18.   if (valuesMR > CNY70Val), z9 J7 P8 F; z4 P4 E+ y: O  O8 b9 @4 O
  19.     valuesMR = CNY70Val;
    2 \7 N+ U7 N1 f. s
  20.   if (valuesMM > CNY70Val)
    " b9 m  p) m1 E0 [/ b
  21.     valuesMM = CNY70Val;
    - Y( O( \* j& J
  22.   if (valuesML > CNY70Val)
    8 _* r: U* L( e1 e8 W( u, ?
  23.     valuesML = CNY70Val;
    # U7 _$ S( }* a& K6 |2 a1 T
  24.   if (valuesLL > CNY70Val)" D% ~4 `6 M/ R+ u
  25.     valuesLL = CNY70Val;
    ' p* \+ D' r1 a

  26. 1 Z  B) `' z2 \! u( P6 N
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ! f  G/ Z/ q  g9 w
  28. }, c7 e# F" `, _5 H4 E, c

  29. . O0 C4 x+ V7 f; O0 m4 S/ a7 i! N
  30. void Car()' `8 q, D, v$ h! `
  31. {
    ) x& z. s2 r" A  \
  32.   while (1) {3 b4 X/ R7 H' N  y0 E! X3 \9 {
  33.     CNY70();
    2 B5 W% A1 S4 i: U' C8 Z6 ^- a' P

  34.   _, E! P0 }" Q- W& E( \
  35.     int error = ((int)values);
    % f; X  [+ p- O
  36.     interror += error;
    ( }& n! t1 z1 F7 \( `$ w/ N: t
  37.     int lasterror = error - olderror;2 P/ t% L! g3 j, A1 G1 D
  38.     olderror = error;% a# h9 ]3 ?5 m2 a
  39.     int power = error / 5 + interror / 10000 + lasterror;7 J; a! S8 J8 h9 t
  40. % k3 O- S% V9 K# k9 c
  41.     if (power > MotoSpeed)  W0 Q4 \0 s6 Z" S3 \' f8 ?
  42.       power = MotoSpeed;2 Q. |6 i% {" Z1 g/ r, U
  43.     if (power < -MotoSpeed)
    , o! B$ ^0 P& w( p: B
  44.       power = -MotoSpeed;1 E+ ^) [% q) l& a, }9 S) K* |

  45. ; @. P0 d* f( p# U: t: ?, c
  46.     if (power > 0)
    2 y( `1 U8 [% Q4 q# k8 G2 x
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。. }5 k1 y6 k# I) |: Y1 i2 V+ {
  48.     else
    " j; `" I1 ?8 R, ^( T0 D) B
  49.       Speed(MotoSpeed + power, MotoSpeed);
    & S) e; D# ^) M: X& e
  50.   }* G* a+ k6 u! h1 B  J# v3 E/ H
  51. }
複製代碼
. _' J0 G- T  x; l& ?
, S, j+ L0 j" }+ h
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-1 13:51 , Processed in 0.026907 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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