圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21822|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ' p" Q4 K& _. o) T
  2. #include <Wire.h>
    & }) w" q# ~. N1 C2 I4 Z
  3. #include <Servo.h>+ e' e/ F: U* i# g1 y

  4. ' B. E! ~& U6 e  \/ U
  5. #include "MePort.h"4 ]# o( @2 v) c( @3 \
  6. #include "MeUltrasonic.h"
    4 w8 T6 l: i1 k' H
  7. #include "MeDCMotor.h"+ i6 V; n0 |7 M, P& F4 @" M
  8. - I, h8 J: D3 q# \6 H
  9. //double Input, Output ;
    5 J6 A2 k9 p+ A. R
  10. float MaxSpeed = 255;' U9 J8 P* x$ g, _
  11. float MaxPower = 180;
    ! j9 v- X9 o' G# }  F9 M
  12. float MinPower = 120;
    " ~; w0 h0 R& F9 G
  13. float Error,ErrorAcc,ErrorDec;
    ( M- I/ y# j7 r+ ~
  14. 5 |# ^! d$ W% j- N- X
  15. float Kp=0.14;+ K6 c* W7 X; d4 K' q
  16. float Kd=0.00020;//23;
    % n9 V; v9 l6 H6 A! g. B% z$ Y
  17. float Ki=0.000201;
    3 p0 ^: R4 U6 t5 _/ ~  `

  18. , x5 j* \; O$ Z
  19. float nPower;$ o$ ^% \5 y/ X4 ]$ x) ?
  20. MePort lightsensor_6(6);2 c. o1 |& f/ o7 v  g
  21. MePort lightsensor_8(8);; |) X3 l7 N! K* j5 d
  22. MeDCMotor motor_9(9);' O+ P$ {4 w, |  \; X: ]  y: q7 \
  23. MeDCMotor motor_10(10);4 m  N; r/ b1 R
  24. unsigned long previousMillis = 0;
    2 {- I/ D6 y- ]" u
  25. const long interval = 1;2 K4 G$ B6 w! Q* \9 J
  26. . p- w* {/ g' {) k, ^* A& n
  27. void setup(){* {' O, ^' R( r/ @
  28.     lightsensor_6.dWrite1(1);
    9 L& j5 Q, ~# h5 w' t7 E: q
  29.     nPower = 160;
    4 t2 S6 }2 R3 L1 T
  30.     Error=0;
    : F7 X9 e. D8 G7 v2 i
  31.     ErrorAcc=0;# \: a" t* H+ X5 P2 }+ J; R! U. {5 R
  32. }
    5 ?0 z7 j, X2 ~9 n5 [& w
  33. * w) Z. e6 T' ^. h5 k
  34. void loop(){! b. T: O- G6 T# _; O" k- t+ c; q
  35.   unsigned long StartTime = millis();
    " s. c% F3 O2 R! c9 c/ P
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    9 z+ s$ z! D, \8 A, |  I
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();2 G; u1 S, S6 j  c) j
  38.     ErrorAcc +=  nError*Kd ;( M- X6 q! n5 W' W/ z
  39.     ErrorDec -=  nError*Ki ;
    8 M0 r+ j6 G! I  G. y, W) ]
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    / ?% L  v0 @! @$ F- \
  41.     if(nError < 80 && nError > -80){+ l- F  e3 Z. G$ _7 F
  42.       if(nPower < MaxPower){- T( x- S: u/ u* Z: v' f
  43.         nPower += 3;: I! U) ]- o# s" O) T: j; t, B* K
  44.       }2 d- r8 Q. ]7 X/ A3 V
  45.     } else{6 b' ?; v' R8 C1 @; Z/ x% c# b
  46.       if(nPower > MinPower){
    3 T$ d  y8 S6 U1 W+ G
  47.         nPower -= 2;
    - Q6 n% f% Z: e5 V, V7 V
  48.       }
    ( |+ y2 P0 l1 p! N
  49.     } 9 U8 n3 Y- Y' L" Z& }1 w; W7 f6 W
  50.     MotoL(nPower-Error);
    ! m0 Z& O6 l, R) R% I5 M
  51.     MotoR(nPower+Error);    ; I' t. t  C9 C3 `; J; k
  52.   }else{! Z1 y! |4 a, \- m5 C
  53.     motor_9.run(0);( G* |! ~, d7 v' [1 |% v6 W
  54.     motor_10.run(0);  V$ E0 R# ^5 E6 K$ O$ q: `
  55.   }! o$ N) W$ O' C: t9 m( y" D6 M) w
  56.   do{}while(millis() - StartTime < interval);
    ' Y, P$ p. S. E) g" M% Y3 n0 B
  57. }7 W9 c/ |/ k/ C" m1 V! l5 A' J
  58. " `5 _* U: b. a/ \
  59. void MotoL(int Power){
    - _9 l, {5 z1 \# f4 k& l# L* @  Q
  60.   if (Power > MaxSpeed){! f: r% _: B: s
  61.      Power = MaxSpeed;0 [+ @1 c$ j) {
  62.   } - q7 J3 f, |( g: C
  63.   if (Power < -MaxSpeed){
    * A6 o( J3 ?6 @$ k, {  O% a% r
  64.      Power = -MaxSpeed;; j5 j- @: Z% r% M2 d6 @) K
  65.   } , c1 N+ j/ d2 h: L& U" e. X
  66.   motor_9.run(Power);6 p+ ], C, O0 r( I8 c8 y$ S
  67. }  " G0 ]9 \' N3 R+ P9 E, }1 _  x

  68. / d5 i5 S7 `3 E7 E) ~2 L9 o
  69. void MotoR(int Power){
    4 s9 I( v8 n! R$ J! @6 o& T
  70.   if (Power > MaxSpeed){) F  S- q7 G) k
  71.      Power = MaxSpeed;
    - F: O& d0 x3 l
  72.   }
    * U+ T9 ~0 [" E3 ^6 p
  73.   if (Power < -MaxSpeed){  D$ P/ I8 H, L3 I
  74.      Power = -MaxSpeed;
    2 K4 P( e$ I  M0 l. [$ m5 D+ |, u2 O, ]
  75.   } ; y2 u+ Q4 n4 e+ q
  76.   motor_10.run(Power);3 `( Y  a9 t! ]* G
  77. }  
複製代碼

8 i# K1 J7 B* G8 W- ~8 V# k! m7 K& y7 s4 t" U' O7 V
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 " M( e3 W& f0 D& w0 k6 T% E7 C: j

" f" O- \, l2 l6 y/ c您好,不知是否能向您請教。
5 P2 i# [* E: e目前和宋修賢老師在處理Ardui Car
$ z# o0 K* {. F4 v; z2 V' k雖然已使用較繁雜的方式處理了跑出黑線外的狀況
; }* u4 }2 c$ q% X6 W% V; c1 R4 x* d2 O# k" I7 N5 G
但基於想追求更精簡的程式所以還是想請問一下
$ H4 a1 f+ Q+ Q: I& B7 `就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
. c0 }1 |1 E: r1 }不知道您是否願意教我可以如何處理
7 x6 k% S" Y/ P2 R: T
! j' y5 K$ F, |- \+ n; n" [" t+ O4 J; u9 {& h
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;/ x/ l  ^, H; }, o' u" T7 E
  2. double CNY70Val = 1000;
    & f: E5 W/ X' T) \. s% p4 u" M
  3. int interror = 0;
    3 }6 Q- b% f1 X0 ]
  4. int olderror = 0;  j8 c6 z8 N+ k9 s
  5. double values;6 v/ F- r+ Z- I

  6. 7 ]' {" \9 F; _2 r

  7. , ~/ M8 v. g' w! x! d
  8. void CNY70()0 E+ `6 |% y4 S  X3 D: Z
  9. {
    ; p) n+ S0 R5 s% h
  10.   valuesRR = analogRead(RR)' |$ m# r6 X4 r
  11.   valuesMR = analogRead(MR);
    ! d$ m; ?, m4 |
  12.   valuesMM = analogRead(MM);
    * \/ _) x. M; V9 i* c2 ~- D( f
  13.   valuesML = analogRead(ML);
    7 k: C9 `, ]) ?) [
  14.   valuesLL = analogRead(LL);
    ) W$ |7 `2 o* u( ]6 D6 B% {) |
  15. ) q& v! v3 O( Y1 k( O
  16.   if (valuesRR > CNY70Val)/ u+ H0 C4 g  _$ E6 I$ j0 d
  17.     valuesRR = CNY70Val;
    " E% d) L1 ], n9 h) t, e: L
  18.   if (valuesMR > CNY70Val)  B/ l+ U6 l+ b% q2 |* N
  19.     valuesMR = CNY70Val;9 O$ h) [" \8 m
  20.   if (valuesMM > CNY70Val)
    9 e  q3 d, y" ~6 D8 T$ i
  21.     valuesMM = CNY70Val;0 @3 t9 D  D( y. B3 w" Q
  22.   if (valuesML > CNY70Val); G2 e. }( e9 r* Z; p# B: G7 s
  23.     valuesML = CNY70Val;3 z8 c; v: V% D% s6 c
  24.   if (valuesLL > CNY70Val)
    4 r1 h6 Q0 Z2 P7 Z+ M
  25.     valuesLL = CNY70Val;# Y: z8 J( r/ y, x, r$ `/ P

  26. % |0 h4 n3 K, h1 Q- J7 e% W2 L
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;1 ?6 d) X8 ]) m1 {& L$ \
  28. }% c& |2 |( H& W2 b2 O* G. e( s
  29. 2 r5 E- c2 V: g9 b" f3 I* M
  30. void Car()
    . @- N  E% k. b3 |+ `. K
  31. {
    ' W$ ~2 [+ k+ \! q- V5 [0 |" F7 v+ B
  32.   while (1) {
    , C0 f$ w0 h" U0 e, x' k! P: b6 V
  33.     CNY70();
    + @& D" s/ I* Z  J
  34. ' x1 E3 q; V/ ?$ a
  35.     int error = ((int)values);
    7 n0 Q% x  I% |2 k0 S0 Y
  36.     interror += error;/ }0 U3 V1 X8 R9 h1 @
  37.     int lasterror = error - olderror;) G8 Y8 i, k) S: L) l2 k- C
  38.     olderror = error;
    7 i# U8 o1 h' i7 S
  39.     int power = error / 5 + interror / 10000 + lasterror;. C5 @( L8 s( v) B+ {$ I6 {
  40. ( Y; q  r: M3 ^9 l
  41.     if (power > MotoSpeed)+ x! b( f" c( g
  42.       power = MotoSpeed;  h' I5 L% G0 m0 i
  43.     if (power < -MotoSpeed)7 y! y) J6 M# ^3 @4 j) J
  44.       power = -MotoSpeed;
    + g& w% d+ `" ~6 W' J- T$ W$ S

  45.   g' L6 p! E# t5 N$ e
  46.     if (power > 0)
    8 r* a2 o" g4 }6 m3 s& g
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    3 b8 E% @& @* Z; {5 i, J3 L6 h
  48.     else6 n# F( ]: E, t, Q1 T, d& ^
  49.       Speed(MotoSpeed + power, MotoSpeed);% {) {5 U8 _5 _- k& B
  50.   }
    # A# U2 P8 \; C# G* e+ {
  51. }
複製代碼
7 A4 \3 V8 O& i6 a; o

! c; P4 D9 x& ]5 x, z7 ]. s
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 18:10 , Processed in 0.022569 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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