圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20568|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    3 r: K5 U( T+ v4 W% x# f
  2. #include <Wire.h>
    , c  P1 r0 B3 S* @' Y, p
  3. #include <Servo.h>) v) A  U* m. |7 \3 j
  4. $ A1 r1 g0 U7 R6 F# ]8 p
  5. #include "MePort.h"
    , z" _/ E3 x3 I& `
  6. #include "MeUltrasonic.h", C6 j7 W9 c6 N5 `" I% N- [
  7. #include "MeDCMotor.h"* O! M' ?5 X6 J
  8. - ]5 Z. b8 W# C* ?# u, t8 @) K
  9. //double Input, Output ;
    5 Q- L1 B) A9 w1 ~, ^' U
  10. float MaxSpeed = 255;
    & q- v# R8 u. T2 A+ ^1 \+ a: A
  11. float MaxPower = 180;
    8 D" T- \* d5 R. z, Y
  12. float MinPower = 120;1 w) g0 o4 C6 i' G) n2 L, s$ d) T0 `
  13. float Error,ErrorAcc,ErrorDec;
    $ f% b: I- F! ]$ I% y

  14. % |# J, B. o. ^
  15. float Kp=0.14;: x6 h+ [1 f# |& |' @
  16. float Kd=0.00020;//23;0 a3 V6 e" w* o, _
  17. float Ki=0.000201;7 k+ v6 f! f* I  ?# X' B1 Y, p
  18. % X9 @0 T2 L0 S4 i9 R' {& n
  19. float nPower;4 G) S0 a5 _! \& J: c
  20. MePort lightsensor_6(6);. N2 Z7 A1 u: U& s1 i2 O( O
  21. MePort lightsensor_8(8);
    4 \- W( s2 K' d! u6 L
  22. MeDCMotor motor_9(9);$ P+ U5 ]4 ]3 S- a5 m  P: L
  23. MeDCMotor motor_10(10);
    , }+ ]+ N7 l  e
  24. unsigned long previousMillis = 0;
    % ]' l# i7 o9 Q& c+ l( \# S; t3 b
  25. const long interval = 1;* m$ S5 `* H- T' c

  26. 8 H* x( R8 S" {3 J" {4 @
  27. void setup(){" s& j& u" o! o+ w5 q, H
  28.     lightsensor_6.dWrite1(1);
    7 \+ k/ a5 V3 t% r; O
  29.     nPower = 160;( A7 C$ f; s# p' D5 b9 H
  30.     Error=0;2 y- Y! w' J2 b) U
  31.     ErrorAcc=0;! j( r$ ~( A+ f1 ]7 {
  32. }
    * p9 s1 f% X. }% K. ~
  33. / {0 a7 ~2 o  I% `
  34. void loop(){
    $ q# r+ C: n- U
  35.   unsigned long StartTime = millis();
    # Q. n* x) v1 {( U! u. M" @
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){, z, r+ O# L+ \
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();( P1 E  \4 m4 a8 O. m+ f- b1 T' e
  38.     ErrorAcc +=  nError*Kd ;1 i3 y" N% |& T$ a. d
  39.     ErrorDec -=  nError*Ki ;
    : W' ^. p0 B, \3 x! R! o! r! l3 p
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);% I. V* W- w7 E! Y$ |5 J: h
  41.     if(nError < 80 && nError > -80){- H1 a& K: b9 R
  42.       if(nPower < MaxPower){
    9 j  V2 v' g/ {7 h: m. t
  43.         nPower += 3;) x- {6 k, f3 R; O( a5 S) l+ N
  44.       }
    ( Y  M- T( `) L7 e. v- g
  45.     } else{
    # \* }4 {4 b* T# T% `1 W, b
  46.       if(nPower > MinPower){
    4 d: P' j3 N( P5 E' N
  47.         nPower -= 2;
    3 `) _% q1 s+ d& |$ l* m$ N
  48.       }8 b( k8 b) |6 o4 `' f
  49.     } / n5 D: O2 v/ }! }  P
  50.     MotoL(nPower-Error);
    3 K( t7 l8 M/ R* F* C) Y) q. o' ~" F
  51.     MotoR(nPower+Error);   
    ; N& r" B! z$ B; o& T9 U8 r  Q
  52.   }else{
    % i: H  U5 e5 F' @/ F0 `
  53.     motor_9.run(0);
    ' [# y2 `/ j( Z% B. Z
  54.     motor_10.run(0);0 t+ V# C, m8 x' G: S) U" J
  55.   }6 n- w+ q) K- F% w
  56.   do{}while(millis() - StartTime < interval);' l0 x7 ^* V7 Q; w( S
  57. }
    - G- j8 E9 c  A  i& ^
  58. 8 m. D- \" B; D: e  G
  59. void MotoL(int Power){8 Q; C! t' D; p* `
  60.   if (Power > MaxSpeed){$ j% V3 }& b/ F6 |/ B5 ~
  61.      Power = MaxSpeed;
    4 n3 f" H$ Z6 f+ N) |
  62.   }
    6 c, J2 y$ e- a4 e- Y7 r0 ?' ~
  63.   if (Power < -MaxSpeed){7 d! i: n- V& J% [* g2 Q
  64.      Power = -MaxSpeed;
    . u2 J9 @( `; V3 w( k' e6 ]- H1 o& o
  65.   } 1 P, r* k  j5 V! g! N: Q
  66.   motor_9.run(Power);
    8 q- f% I6 L3 _, j% c: \: q% M0 E. r# }4 G. M
  67. }  
    ' r; F- w) X/ e7 R, W  D& }1 F0 G0 }2 e
  68. % ]' T& S# P. L- L5 s
  69. void MotoR(int Power){
      }$ ~1 q, ^- e! b4 L
  70.   if (Power > MaxSpeed){
    4 y" q. G4 z* w  y* x. @9 ]
  71.      Power = MaxSpeed;
    ; t1 B- v/ U: K! s$ L0 H
  72.   }
      \5 {" v. K' O$ Z! c; j2 H
  73.   if (Power < -MaxSpeed){
    7 O- Q( M1 b- @3 N$ i6 z9 p
  74.      Power = -MaxSpeed;
    + L* {& S$ ^+ e: A! n( g
  75.   } ) x% w$ @- `: ?
  76.   motor_10.run(Power);4 A# H7 W/ W8 W" v" a# A
  77. }  
複製代碼
0 l& e; }3 i. B4 d' z
8 h4 @* ?1 X2 N0 J! j2 |- Y
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
# a# G6 ^9 b  |- G( b. ?6 b7 @, a
您好,不知是否能向您請教。# c- l" ?6 s3 ]4 s- e
目前和宋修賢老師在處理Ardui Car
; I! d; B& s) p' G雖然已使用較繁雜的方式處理了跑出黑線外的狀況
# f5 V; p* N/ C0 J* V+ j4 X' m) K( m5 x
但基於想追求更精簡的程式所以還是想請問一下
0 I& @, }/ `6 \& E8 Q& ^$ h就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
+ r8 ^) `; x, ~: n9 C. F1 i不知道您是否願意教我可以如何處理' k& ]( O% C1 m  L* `7 T! w4 |/ G2 E

3 }8 J4 X. g5 c0 N, D2 M3 N3 t
! D; @( v) Y5 D9 s+ _1 K& T以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;# k9 f7 `7 V! {7 R: ^1 t& `
  2. double CNY70Val = 1000;, Y8 j. U6 R! n* z
  3. int interror = 0;1 A6 L2 C" P9 ]  A& k5 w) P
  4. int olderror = 0;, f$ p6 P0 K: g3 c
  5. double values;7 z; J) S( t, A) h; s0 E8 G/ L
  6. ( y. Y( f& x2 E4 r* Q" ^! ]& X2 J: i* W
  7. ; d8 ?) W9 c2 S% o7 s
  8. void CNY70()) A! m* n7 O- Z& |7 u# a4 |: a6 G
  9. {6 {* {6 s+ T/ W8 L7 d; i; u
  10.   valuesRR = analogRead(RR)
    + V9 N+ K4 {) @: E* \
  11.   valuesMR = analogRead(MR);
    3 R# ^$ |: `) j/ Y) {8 k
  12.   valuesMM = analogRead(MM);; M4 G& P! {$ E* a- Q1 W% L' }, w, |
  13.   valuesML = analogRead(ML);
    , z2 N  C  j2 v
  14.   valuesLL = analogRead(LL);
    6 A& K9 X" g. D/ @# O  ~
  15. + G7 G# ^* e6 b% [
  16.   if (valuesRR > CNY70Val)$ p! _0 M" a6 E. T! V! F
  17.     valuesRR = CNY70Val;
    . s6 N! J5 z. c1 T
  18.   if (valuesMR > CNY70Val)
    2 G% }$ |0 i( ]! _" Y5 T! \
  19.     valuesMR = CNY70Val;
    ( U- t; a& U; U, d+ M2 A3 X, T
  20.   if (valuesMM > CNY70Val)
    . f) D( g; R( F
  21.     valuesMM = CNY70Val;: @+ M: J& p# F9 b1 [( l
  22.   if (valuesML > CNY70Val)
    3 l5 {6 G  W* k9 p& H$ R
  23.     valuesML = CNY70Val;
      @0 F8 ~' J+ C) L2 |3 R; Y' o
  24.   if (valuesLL > CNY70Val)
    . F! [, W6 |" |% ^
  25.     valuesLL = CNY70Val;2 A8 x4 m6 Q7 F2 p! W1 x
  26. 5 @0 @! D/ {% z; }3 I5 h/ h0 ]
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    5 \# N: W5 h8 j' |. R) q; F# @
  28. }
    # F; ]* H9 E. p( E
  29. & b+ a6 Y' ~5 M1 i  m3 m+ [/ A- K
  30. void Car()  O3 {3 h5 _: Z, g. y
  31. {% ]- a; \3 ^2 b, [! V
  32.   while (1) {3 w8 q9 ]& u$ U* H! v2 V: \
  33.     CNY70();
    0 {$ E4 j0 h* q0 f, U
  34. ) T3 a% L/ F! n. Y! }4 v3 n
  35.     int error = ((int)values);8 K; k+ M" d4 C
  36.     interror += error;; N" ?; ~3 H5 j; Z
  37.     int lasterror = error - olderror;
    5 q% m# X; K3 ?- K2 H8 L
  38.     olderror = error;: M; I4 E$ Z0 o3 s0 B$ P, j
  39.     int power = error / 5 + interror / 10000 + lasterror;; N, L2 |1 [4 Q( B
  40. 7 u. a& N  E  S2 f& u
  41.     if (power > MotoSpeed)
    : H5 Z& t# x6 f( ]
  42.       power = MotoSpeed;
    $ q8 h% Z0 ?$ G9 s/ y: {; Q
  43.     if (power < -MotoSpeed)
    1 D5 w- [1 N/ t, B3 [
  44.       power = -MotoSpeed;; S1 p6 C) l6 y( [  C
  45. ; d. q# g- V4 P" T4 Q
  46.     if (power > 0)
    1 e) J/ f( [7 [
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。: G; R: o4 p8 z1 B8 [7 y
  48.     else
    # X$ X1 E, b' I. M5 Q9 y- ?
  49.       Speed(MotoSpeed + power, MotoSpeed);' i: {  F" C: B
  50.   }
    $ |* \# L4 w' d  c4 f1 j
  51. }
複製代碼

$ Q+ R5 Z% J7 f6 D7 R! o, v( J! {; U: z0 r3 Q1 u
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-4-19 14:55 , Processed in 0.028337 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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