圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20905|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    - o1 p5 Z3 d, Q& I( H( x) Y, F6 a4 c9 C
  2. #include <Wire.h>7 u) B2 L: [- d0 q+ V- T: R9 K& G
  3. #include <Servo.h>
    & G4 _  ?, q0 ?

  4. & m2 h8 B8 ]* @- D% e
  5. #include "MePort.h"( J; C$ i& l" a) }+ Y: g" m
  6. #include "MeUltrasonic.h"# r' @* E$ Y" R/ Q& i
  7. #include "MeDCMotor.h"! u, w7 |# J) n
  8. $ s: @% c) c6 R- c. A8 [
  9. //double Input, Output ;8 }1 ^, F  m+ ]/ N( G
  10. float MaxSpeed = 255;8 T+ A" @9 ]% V" C4 a/ {
  11. float MaxPower = 180;# t3 `5 p( V2 r- T7 O8 E
  12. float MinPower = 120;
    - y) d. Z& ~2 s- ^3 H: B- d
  13. float Error,ErrorAcc,ErrorDec;; A5 s) A/ p. S0 i) C

  14. ( c0 ]; j1 h  X2 a+ L5 A
  15. float Kp=0.14;
    * J! d3 E. k: F+ |4 ?
  16. float Kd=0.00020;//23;2 O5 p8 \6 n! {) x; ]
  17. float Ki=0.000201;
    ; ]0 u$ P" ?( F8 t/ T

  18. ! N! V; y; T+ w' x, j8 z
  19. float nPower;3 Q; n7 O9 e, q. v: Q
  20. MePort lightsensor_6(6);
    , E* @" i8 O% k; ~6 ^9 S
  21. MePort lightsensor_8(8);
    * E" f1 e; I9 D% f9 p& [
  22. MeDCMotor motor_9(9);
    ( Q9 E2 j* _$ y/ \# S8 J
  23. MeDCMotor motor_10(10);, L& M9 R/ {& w5 Y+ L' y8 i: V
  24. unsigned long previousMillis = 0;  A, G1 D% v6 M9 @9 G
  25. const long interval = 1;* }% k6 [7 ~3 a" E
  26. ' U! g4 T9 s; b5 t9 j
  27. void setup(){
    ! l' i5 |6 g: z
  28.     lightsensor_6.dWrite1(1);$ ^# W8 T2 K) n6 `2 J0 y: V
  29.     nPower = 160;1 a  v3 `! w# l7 K5 D  J
  30.     Error=0;* {' U1 f9 F6 f3 r7 j) ~; C$ ]
  31.     ErrorAcc=0;
    # h# W. h# z  |/ r+ z" z: o
  32. }8 U7 V4 @# ~7 i8 }! Y

  33. ; {. t  w, u& W2 N- s
  34. void loop(){
    . |" v! Y/ w/ U4 X( w
  35.   unsigned long StartTime = millis();
    & W# K; ?3 m6 [- L/ X2 Q
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    ) K  E# T, B% S1 r$ B* b5 c5 y
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();2 J/ T, o" B; `+ I+ U2 ]7 ]" @
  38.     ErrorAcc +=  nError*Kd ;8 Y4 O4 w6 d* W
  39.     ErrorDec -=  nError*Ki ;
    : X4 Z- A  V+ F0 S
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    ! U5 K' X/ H# _7 `0 [# |$ i' c
  41.     if(nError < 80 && nError > -80){9 ?+ ^/ o4 }2 r) B  `2 G
  42.       if(nPower < MaxPower){/ g; x1 ^7 }' n8 a: B
  43.         nPower += 3;5 c2 F& F9 D" ]  f9 l6 s5 Q
  44.       }6 T$ _! u0 \* ^0 V" Z; v
  45.     } else{
    ( X, |1 @9 A6 N% G, d9 |! b9 d1 R
  46.       if(nPower > MinPower){/ h+ n( ?& `: k9 ^
  47.         nPower -= 2;  ^& `. T) {3 X: ]" g0 n
  48.       }
    / p9 e( P) b+ w( R7 S& C2 o
  49.     } 8 Y" V7 |. q& O" Z* ~3 ]
  50.     MotoL(nPower-Error);
    4 H. G, R4 e' ~* ]/ L
  51.     MotoR(nPower+Error);   
    . y0 A/ P# g8 c+ @+ J4 W  w
  52.   }else{
    6 G( b( ^+ X* [: ^6 E( ~
  53.     motor_9.run(0);' c1 V5 h: }+ w0 {. O6 s
  54.     motor_10.run(0);
    ( a  E* C2 v1 Z7 w5 A- `# n
  55.   }4 K  \( e/ I$ I: ^/ `( Z  |3 p  K( j
  56.   do{}while(millis() - StartTime < interval);
    . `+ S0 m% a0 X  C  w  U  U' k5 X
  57. }+ x# i+ ?$ [& W, @% z

  58. - ]& k1 W: V: z+ B) V
  59. void MotoL(int Power){, d+ Q8 a! C8 ~
  60.   if (Power > MaxSpeed){1 C9 }6 y6 L* n" M
  61.      Power = MaxSpeed;
    ; m! {0 z- v- j. d* L& \, w
  62.   }   G7 i/ z2 b) X& S
  63.   if (Power < -MaxSpeed){- k* d" ^9 k" y) F2 I( e
  64.      Power = -MaxSpeed;, {& s( e# N+ O* o0 P  D) m2 `
  65.   } + V. y9 m/ I- I$ ^4 P
  66.   motor_9.run(Power);
    ) `! i0 m# `2 b2 {2 ]  K1 D/ S0 |
  67. }  
    ( T# p8 I* `: T# x/ [3 s$ m

  68. 2 Y5 V* f) ^) S* u( J- j/ O2 G
  69. void MotoR(int Power){8 A! l8 R8 ]+ n
  70.   if (Power > MaxSpeed){$ k2 u! G8 j  r8 g3 {- {
  71.      Power = MaxSpeed;
    2 t+ V. w3 u  z3 _  N
  72.   }
    + ]7 R* E7 `1 u$ c
  73.   if (Power < -MaxSpeed){
    : f' p0 e8 u6 ^; a$ T9 K5 \( x
  74.      Power = -MaxSpeed;/ y& w" s3 f! b1 A% P! E
  75.   } / T0 \* q3 I( W) R  \
  76.   motor_10.run(Power);
    ) `% z1 J8 L/ q4 S1 u  i
  77. }  
複製代碼

9 X) W5 v% a2 ~4 S5 M* h- o" N9 s# Y2 @- `6 T/ Z- g
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 1 D! [7 ^0 ^: \% c1 q0 U' ~( U
% \4 o1 x& L$ c8 u* s& H
您好,不知是否能向您請教。1 ]1 [3 I5 G7 P8 _
目前和宋修賢老師在處理Ardui Car. t; t- n! H' d1 k
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
; \. h/ }5 C6 U7 _4 e. Q- `* j. u5 X
但基於想追求更精簡的程式所以還是想請問一下
: [5 Q, q) b/ }7 a; N! W* \) X  H就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝8 ?2 s. x# t' F6 {( `
不知道您是否願意教我可以如何處理
) P* c4 a% [' A/ C7 S/ G8 B; s4 Z3 u' H

. ^0 g# \. d' i以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    1 s' p4 |6 @; W; l
  2. double CNY70Val = 1000;7 A7 G, A  s" ?# b
  3. int interror = 0;) ^' l+ R8 l) f- e# D
  4. int olderror = 0;( p( Q6 p" `0 p/ t
  5. double values;7 y( E2 v# w! [, a7 r- b# ]
  6. , ?" q% ?7 e0 M

  7. : ]* f3 B$ n8 z8 ]
  8. void CNY70()8 q3 D0 o! W5 C3 V9 _0 N  M
  9. {
    % w: u" V' H, D" e/ ?+ Y
  10.   valuesRR = analogRead(RR)' u: X$ g9 N3 B6 |% z7 o
  11.   valuesMR = analogRead(MR);
    ( B4 {/ T+ q, v
  12.   valuesMM = analogRead(MM);
    0 H" e6 x3 e$ r& e; o4 W
  13.   valuesML = analogRead(ML);% \/ }4 R4 K6 T7 ?* t0 k
  14.   valuesLL = analogRead(LL);
    $ m  g2 N7 Q2 x( U( {# S( P
  15. 5 P8 h' y9 {$ w& \1 _
  16.   if (valuesRR > CNY70Val)
    * q+ _5 ]- t, R! z0 S9 u
  17.     valuesRR = CNY70Val;$ b" V( P& q# o8 Q
  18.   if (valuesMR > CNY70Val)
    3 P2 Q! {8 ?) J/ }2 I
  19.     valuesMR = CNY70Val;
    & a& d* W& w6 |" B
  20.   if (valuesMM > CNY70Val)
    8 r( x+ h0 W8 ?' c) F5 a$ Q- T7 T- g
  21.     valuesMM = CNY70Val;
    * [+ D. R: U5 f# S: P6 `
  22.   if (valuesML > CNY70Val)
    6 b/ X2 M4 l$ H6 U& C" @9 s2 F6 @
  23.     valuesML = CNY70Val;
    9 |7 C( k8 l  J$ j, L
  24.   if (valuesLL > CNY70Val)' l* M( j1 t1 C" }# D
  25.     valuesLL = CNY70Val;
    6 x7 b# U) s8 I- j5 X
  26. ( _4 I4 w- Q, S1 [% q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;9 m: g4 z  r' G6 g3 A# Z# D
  28. }
    % U7 |2 c, z7 F% ]' k8 r

  29. ; ^9 c/ X: _- {8 l; E) u
  30. void Car()
    9 b& L1 u$ u& z; u; a7 b
  31. {3 O6 t2 t* o! `+ W  V# F
  32.   while (1) {
    + P7 H5 l* j2 {! l3 U
  33.     CNY70();. O' x  f4 F9 g7 z4 K1 u% E

  34. + s- A4 J1 I& C0 P
  35.     int error = ((int)values);8 l+ x% x/ x2 b+ D% @; d
  36.     interror += error;" q7 T7 e) X8 F+ x& T# T( f
  37.     int lasterror = error - olderror;( ~, l% T9 b6 X* J
  38.     olderror = error;
    ( n" {' x) H* }$ @
  39.     int power = error / 5 + interror / 10000 + lasterror;8 i) h3 j' V* u" p3 s% z; v

  40. 2 _* ?. J- r+ R7 \/ \2 X
  41.     if (power > MotoSpeed)
    * `$ u. p6 }' h4 J- |
  42.       power = MotoSpeed;3 U* |2 N' Y' V! t8 o) G1 K
  43.     if (power < -MotoSpeed)8 o0 h, W# ?( O, J& m1 L
  44.       power = -MotoSpeed;; X, |7 L) u% g
  45. 1 S4 H5 Y0 {, ]
  46.     if (power > 0)
    ' t$ f. Z5 Z# A$ K0 h
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。1 t- |" k3 u/ w0 n2 b( r5 Y$ ~
  48.     else
    - q% k$ ]* Y+ ?) G
  49.       Speed(MotoSpeed + power, MotoSpeed);' y$ a! W. }! J+ u- A+ w1 H6 l
  50.   }
    2 p1 W: V0 q8 d5 _( @% y
  51. }
複製代碼
) N" S; R. B5 A2 v  b  u! \4 y
7 `& _- q7 t' T. R
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-1 07:32 , Processed in 0.022329 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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