圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21731|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>( C  X" ]8 b: A
  2. #include <Wire.h>- `* s  M. e: w$ q8 s" b
  3. #include <Servo.h>
    1 ?& l8 h0 J. F1 R0 F  x
  4. ) r8 ^; O$ q8 ^! e
  5. #include "MePort.h"
    7 g0 O$ E, m( Y
  6. #include "MeUltrasonic.h"
    " P0 l& o: n2 \' o# Q( c
  7. #include "MeDCMotor.h"
    0 ]1 m, V: q4 M1 G" m0 W8 ~
  8. 5 B# B, P6 |% v- i8 F
  9. //double Input, Output ;) x' y( h( `. I' u( t$ I; ?
  10. float MaxSpeed = 255;
    8 C4 }: _+ L$ ]& {) x( e0 F
  11. float MaxPower = 180;+ ^7 P, G( j6 Z1 t% M$ Y% [$ @
  12. float MinPower = 120;
    ! ~6 n) d5 o$ z8 ^
  13. float Error,ErrorAcc,ErrorDec;
    4 ~* U! {( s& v" p! f, h0 x
  14. 1 Q0 C! [* o+ j. M
  15. float Kp=0.14;4 A7 a& g- e8 g( B1 p$ P
  16. float Kd=0.00020;//23;* I% @7 ^( m0 F0 v% `: g( B0 O
  17. float Ki=0.000201;
    4 G. w: m1 Q7 s* N

  18. 8 u( J. {) X6 v
  19. float nPower;
    9 ~- b* C6 z) ?: |0 L& b0 M. n2 b- p
  20. MePort lightsensor_6(6);
    8 l2 Y( r& p. ~: n/ k) F# t3 z
  21. MePort lightsensor_8(8);: a1 I) [- W) V+ J' {
  22. MeDCMotor motor_9(9);
    2 t$ X  _2 o1 _' |7 v
  23. MeDCMotor motor_10(10);% l: `7 P) M. R% r
  24. unsigned long previousMillis = 0;3 T, s8 ^7 Y* n
  25. const long interval = 1;
    / q. p* c) R- L

  26. ) V& x1 f" u0 q- X* B1 Z
  27. void setup(){
    " R4 F, S- o8 f+ }/ T% w2 r
  28.     lightsensor_6.dWrite1(1);
    * M% r8 \: x5 X5 j" V
  29.     nPower = 160;' L6 v. D' n3 B1 ^, J
  30.     Error=0;
    " Z- R  Q, C/ S( S: Q- s: o8 o
  31.     ErrorAcc=0;
    0 `3 ?9 [: k8 I1 K+ ^
  32. }2 v5 S+ `) X( u$ ]
  33. ) C; B9 J4 u1 h4 A5 u
  34. void loop(){
      K6 D6 I( f- ?  O2 k4 b4 e! U( z
  35.   unsigned long StartTime = millis();
    , Y( {. r# v9 P2 W
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    $ s5 _4 ?2 r+ p7 q
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();. C3 {' V/ l8 D
  38.     ErrorAcc +=  nError*Kd ;
    7 o$ w1 T  P. e  d7 [2 G
  39.     ErrorDec -=  nError*Ki ;$ w2 P; u# I! ]
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);. h9 i6 k8 Z5 R( E- U  E
  41.     if(nError < 80 && nError > -80){  I% R8 V- b% T3 B- F
  42.       if(nPower < MaxPower){1 L4 I% |; L; u7 I& A/ [% Y
  43.         nPower += 3;& b; t1 Q, }. w. |' k8 G
  44.       }. H; L; ^4 z  d' |
  45.     } else{
    9 ?3 I; v; E1 v! E5 F5 w
  46.       if(nPower > MinPower){4 V; U9 u' H9 K; m- N* x. l
  47.         nPower -= 2;0 _8 Y) f! v- `, n1 j3 g3 ~& K
  48.       }
      ?' D$ ^" B4 I7 ~
  49.     }   o; Y: W+ U/ B( A/ Q
  50.     MotoL(nPower-Error);# C+ b4 J. H( E" B
  51.     MotoR(nPower+Error);   
    ! ~& I  J5 r# r5 |4 @
  52.   }else{5 }- t2 F  c7 E9 z6 s
  53.     motor_9.run(0);
    + p8 u& y5 [. G9 m
  54.     motor_10.run(0);
    0 M+ g( H8 a& v3 z
  55.   }7 W4 G4 |6 @. j" e, S
  56.   do{}while(millis() - StartTime < interval);; y: U3 y- V/ G( Q
  57. }
    0 A( ^/ C- ^; }) C, u9 }* p

  58. - j* w$ _. J& E. c" M/ _4 ?# X) X% G
  59. void MotoL(int Power){
    3 N% l- c8 c$ k5 q5 H& R
  60.   if (Power > MaxSpeed){
    1 W) U8 p- V; H2 @, c' D8 q# F
  61.      Power = MaxSpeed;5 B: L- G: f8 I( w# m
  62.   }
    1 n" ?0 P6 n$ ~: Q% D9 \
  63.   if (Power < -MaxSpeed){
    $ ~) k4 ]; H& C5 c$ F8 x" h
  64.      Power = -MaxSpeed;
    % r: c( B1 Y5 X* c6 d
  65.   } ! V- a- F% n4 f; I2 e# B
  66.   motor_9.run(Power);
    ' D6 [. Z; K' z0 s
  67. }  . T8 E4 o* M  M# r. C1 c! @( }
  68. 5 U9 j7 a9 ~" G& l8 O+ {2 M/ ^
  69. void MotoR(int Power){
    5 @. ?0 ]3 v. d$ ?- `# A4 s, H
  70.   if (Power > MaxSpeed){
    & @. Q5 ]: H/ H/ s
  71.      Power = MaxSpeed;
    - w1 ]- H% i% ]. o  l; {- t
  72.   } 3 \2 y  B# A& G8 K
  73.   if (Power < -MaxSpeed){
    $ E# @* M: d8 @+ M/ w2 @
  74.      Power = -MaxSpeed;" Q1 w& {! N0 {; u
  75.   }
    ' H6 B5 U' W1 A% Z0 ^: n4 i0 h) _
  76.   motor_10.run(Power);7 i4 o* H0 B: u2 g- n6 a
  77. }  
複製代碼
5 }7 Q6 h% e% j- K6 U5 e. w; F3 m2 t" p
; K) n$ s- a6 w, E+ U, m
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ( j( ]3 r& g3 T& ~4 I$ `

+ p% i! y8 U7 T8 g5 Q0 C您好,不知是否能向您請教。0 q! r$ y! K" Z2 b4 @
目前和宋修賢老師在處理Ardui Car
! c8 `* d) V* \, J9 D雖然已使用較繁雜的方式處理了跑出黑線外的狀況
( a0 X! Y* b  x$ `" K8 d" ?# V% o2 |; y( T  E. y" T8 U" i6 F
但基於想追求更精簡的程式所以還是想請問一下
3 I0 M( j4 L- B: x  Q9 U1 V就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝# j2 u/ x8 i: m" b; {* Q" x
不知道您是否願意教我可以如何處理. j/ c' x4 {6 g
: K! J! U; p1 _1 Y) R! q

2 K; B: q: z. }以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;" M1 B- i% L" q8 r3 I
  2. double CNY70Val = 1000;" Q& m" o( e* L/ J  m' e+ I
  3. int interror = 0;
    , A3 ~+ G* Q! u
  4. int olderror = 0;9 a6 I2 Z$ L- w# Y
  5. double values;' n1 D" t; |! i9 w* D8 S6 q

  6. / H9 W5 g8 s4 [. W: z

  7. : ~4 z, k9 e9 Y( R1 l( ~' s& E, k% Q
  8. void CNY70()
      H. m4 v( S0 S! p) Z' l
  9. {
    & {0 h+ j  m$ P- J
  10.   valuesRR = analogRead(RR)
    + t7 X8 ~1 x: c9 O, d8 R
  11.   valuesMR = analogRead(MR);7 J: |- I5 n  I4 i0 [$ w- F+ G1 P! F
  12.   valuesMM = analogRead(MM);
    % H$ D+ ]3 ^* p; Q8 r, u
  13.   valuesML = analogRead(ML);
    $ k/ d# J& C& {
  14.   valuesLL = analogRead(LL);
    , l" y& [4 k% U( s/ P; Q

  15. % Y% V: s6 S! T6 R
  16.   if (valuesRR > CNY70Val)5 |4 d* o7 M2 m  a* n$ o. p7 T1 ~& ?, S
  17.     valuesRR = CNY70Val;0 X/ v9 W0 C4 I2 `) I
  18.   if (valuesMR > CNY70Val)" Q& j7 d- z0 I3 t2 c0 v0 V4 R
  19.     valuesMR = CNY70Val;8 A8 u( }% b1 g+ J7 a
  20.   if (valuesMM > CNY70Val)
    + z& s4 G2 S5 X0 c. v% D2 b2 g3 W
  21.     valuesMM = CNY70Val;2 w9 M" V+ v& h: l9 i+ Y
  22.   if (valuesML > CNY70Val); e# D2 F7 I& D  `* H: `, @
  23.     valuesML = CNY70Val;1 I4 N' @& ?' i4 v
  24.   if (valuesLL > CNY70Val)
    0 H( y) O9 R5 \$ O' W
  25.     valuesLL = CNY70Val;9 \5 C0 l0 M1 o  x8 \

  26. * j8 W5 Z; a' n, m  g
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;9 T% ?& k: Z) W
  28. }' Q  z$ S: d, {+ X5 Q+ m
  29. 1 y; Z- k3 _5 s+ {: A  A7 `& ?
  30. void Car()
    " D5 E* K8 a2 l+ P
  31. {
    - L+ T7 V! D1 e+ e
  32.   while (1) {
    ( V4 F+ a, H9 \
  33.     CNY70();4 m" M, S, q0 W0 d5 j
  34. 1 J! B5 L) |# Y2 S6 l1 e
  35.     int error = ((int)values);) G7 I0 B' C% b4 V: J+ b
  36.     interror += error;
    - h/ ]; u* e3 K/ [8 s
  37.     int lasterror = error - olderror;* K: [. \3 l. X& Q/ n3 ?# N
  38.     olderror = error;
    ( [) ]2 Y! \5 b" R3 U6 B9 Y: h
  39.     int power = error / 5 + interror / 10000 + lasterror;* j8 r8 C6 b4 x5 s5 N2 I9 H

  40. 4 e) z' s. \" |! Q3 d& p
  41.     if (power > MotoSpeed): w7 G2 r5 X5 d5 l' q: E9 K4 Z
  42.       power = MotoSpeed;- i) R- N) x  Y  F9 W, g
  43.     if (power < -MotoSpeed)5 H( t# y  p2 X' c
  44.       power = -MotoSpeed;
    . y- a* x6 a) v2 P" Z- O# P
  45. " R; l  n/ J; o2 n( c; \
  46.     if (power > 0)
    ! Q0 h# u2 _0 x- P
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    1 v) a  Q* w+ @5 a1 W
  48.     else5 t2 y0 H4 l( S
  49.       Speed(MotoSpeed + power, MotoSpeed);
    1 u3 Z5 R4 P$ `# K3 Y1 k. x0 p
  50.   }
      U, Y/ v2 b" G- Z3 d8 m' `. b% p7 d
  51. }
複製代碼
1 J2 x3 F, }' D5 k
8 l. t# ]+ m7 ^0 V" l5 n# H
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-28 01:07 , Processed in 0.025170 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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