圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21687|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    6 \9 D4 G8 G. O) O' o6 g3 F
  2. #include <Wire.h>
    ) M1 s- O/ u, L
  3. #include <Servo.h>
    5 s2 w  k# L3 @  x% n8 A2 b5 b

  4. 8 w# {: \+ F; \8 E- _) L
  5. #include "MePort.h"
    - F. w* w/ A7 {+ H: F/ w) H
  6. #include "MeUltrasonic.h"& m0 k- k* u4 u3 o
  7. #include "MeDCMotor.h"
    ; i. Y/ G, R) T. @
  8. # l: f# g, Z" d
  9. //double Input, Output ;& e* V4 L0 g, y; F. b
  10. float MaxSpeed = 255;
    ; V7 Y1 ]# ~+ k5 ?
  11. float MaxPower = 180;
    " V/ Q5 s& f+ @' w0 s! U
  12. float MinPower = 120;  I% [  w" J/ u( K5 s+ u4 m* B8 q
  13. float Error,ErrorAcc,ErrorDec;
    5 x, Y2 m# S. c/ G- i

  14. - N2 A& k9 V, [% R# O
  15. float Kp=0.14;
      c9 a: @. A2 h6 ?6 D7 ~+ G
  16. float Kd=0.00020;//23;6 x: F' F% c" L' v/ U0 ]9 h% e6 E5 K
  17. float Ki=0.000201;: j) d) @( U# ]" |  T% S+ U5 u4 k% s

  18. 4 V( r/ {5 _: x$ ~) _4 Z( C
  19. float nPower;
    2 V4 ~  m  K: \4 _3 U
  20. MePort lightsensor_6(6);
    3 U  B6 C' T4 g5 E( b+ o
  21. MePort lightsensor_8(8);$ W, m7 C# l; f% ]
  22. MeDCMotor motor_9(9);
    7 W; V' T& C, k: v* x# ~  _
  23. MeDCMotor motor_10(10);$ H1 X6 H# |9 Q4 z: Y9 P
  24. unsigned long previousMillis = 0;
    ) y5 S6 l% q: B* C, Y; ]$ ^4 E
  25. const long interval = 1;' e' H" m% R1 K+ t0 d2 \

  26. ' C* P' i" l2 E' _% t, B# D* q0 N- ]4 O
  27. void setup(){
    8 ^; F: }; i" u8 l: u
  28.     lightsensor_6.dWrite1(1);
    : E9 X1 g' S9 s6 l# X/ E1 Q* G5 B+ ?. `
  29.     nPower = 160;
    0 D  H! {/ A- ~
  30.     Error=0;
    % E: O$ z9 T; I- x( b, {
  31.     ErrorAcc=0;
    3 s7 U6 c% Y, J4 v
  32. }
    % j, A( r2 w# L: U& `7 f! o
  33. : H2 V' ?: J* j1 B# t/ c
  34. void loop(){" {3 [, N+ A% s  D) ^2 T
  35.   unsigned long StartTime = millis();
    & i* }1 ]1 b2 A1 [) S* c* K
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){$ l+ K8 F' [( w& D4 {/ q! y; j
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();1 }) Y7 ]7 L/ l  p/ ?; B
  38.     ErrorAcc +=  nError*Kd ;5 X4 A# K- ]! P; i0 V7 H
  39.     ErrorDec -=  nError*Ki ;8 _7 n7 L+ l/ b5 l$ o
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    / B; y+ w) S; g! v
  41.     if(nError < 80 && nError > -80){" m: C: V% I7 r/ N
  42.       if(nPower < MaxPower){9 V% F1 d9 H$ L8 g
  43.         nPower += 3;
    1 f$ s9 h& y4 s; L0 d- y7 a
  44.       }
    ! s% u/ z( S2 `9 F  U$ `, o
  45.     } else{
    5 d" |! \& d: r' K6 ^5 e
  46.       if(nPower > MinPower){. \8 R8 M  m$ n# H3 ~: R9 w
  47.         nPower -= 2;
    0 U# i+ K" Y& t1 R' ?
  48.       }+ T1 c4 B1 H4 L
  49.     } / x5 l: ]1 p5 \/ P* l" Y
  50.     MotoL(nPower-Error);
    9 D4 e$ B  D; B# G4 E: H
  51.     MotoR(nPower+Error);    3 H; J+ Y! i+ |. `0 U3 R( {
  52.   }else{
    4 A8 O1 E9 P2 J' t% B) I: l
  53.     motor_9.run(0);# H3 u+ p! D  _0 o( V
  54.     motor_10.run(0);
    ; d" N- V" X6 o( C) Q! O) M
  55.   }* r; o) }! P0 v
  56.   do{}while(millis() - StartTime < interval);
    ( u2 ~" l  @# e' P' R! Y+ \% I. K
  57. }
    0 [- g% l/ {, [* A  f

  58. 5 u0 ^( R9 B7 h1 W- S/ j) q
  59. void MotoL(int Power){
    3 S+ j' y$ ?  f4 t- R
  60.   if (Power > MaxSpeed){
    / n! O/ ^1 G( ^3 r$ R0 o
  61.      Power = MaxSpeed;4 q* o6 N/ Y* x: i
  62.   } " w& o+ u2 b0 ]5 H
  63.   if (Power < -MaxSpeed){8 \3 D: o! N6 I6 z4 [2 k9 T' Y
  64.      Power = -MaxSpeed;
    ' f& s! R- H4 ]; B( G3 G3 S; z
  65.   } 5 G- H4 x/ }7 u" y9 Y
  66.   motor_9.run(Power);! g* Q" \- g: `* J) a* b9 Y
  67. }  8 g9 P1 E' u  h$ K/ E

  68. " X; _! Z; \) Y5 O6 e/ t
  69. void MotoR(int Power){
    . @3 h* C% y* W- p" d. V: Q# b
  70.   if (Power > MaxSpeed){
    . h6 _+ o; @# H
  71.      Power = MaxSpeed;) N$ c3 B, A& M- f- d8 u
  72.   }
    8 _. i# L5 m, a" K+ m' {
  73.   if (Power < -MaxSpeed){
    " o! c$ W0 ^7 Z4 U
  74.      Power = -MaxSpeed;
    , `: |7 J0 F- p: p5 n4 \. v
  75.   } 4 m% m2 M# l9 w7 H8 C) j, t  t
  76.   motor_10.run(Power);$ q# z* u8 t5 }* z
  77. }  
複製代碼
  d0 ?0 m6 ]- g% M/ K" G9 \
; ^' W9 Y! C5 D' o
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
; u* c  ]! X* u. `4 U+ r% _6 c. W: M% V7 }. b; A
您好,不知是否能向您請教。0 k7 k6 P2 b# ~& E- F
目前和宋修賢老師在處理Ardui Car) S6 H$ c; K% q
雖然已使用較繁雜的方式處理了跑出黑線外的狀況- \' S& z: R6 a8 e/ g( [
$ ]. |' f8 }3 R, Q7 Z* e2 H
但基於想追求更精簡的程式所以還是想請問一下
# p5 w8 o4 M4 g! r: A1 A- R就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝7 A: c8 a: T( ]- H* t. E" J' Q
不知道您是否願意教我可以如何處理& h  g" {+ W! n2 [4 F/ j; x4 [9 ~- X

: U) k: j! ?. N0 \" u
2 J, r8 m) \) L, m+ b: q4 F以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
      d0 X1 F0 o/ I9 ^
  2. double CNY70Val = 1000;. W6 U3 ]9 [& a: D& ^$ s" r8 ~1 C
  3. int interror = 0;: R. r: W( w  P! ~5 R/ o/ W) |
  4. int olderror = 0;
    - N4 N' V! K; x/ J- R' y
  5. double values;
    0 r' L" x& A4 W
  6. : i8 i4 P2 i0 F. D! j0 c" P
  7. 3 t6 w! _% Y% V3 N" ^7 L" _& U( Y
  8. void CNY70()3 F, v/ {6 _7 f- [
  9. {# Y/ V: g9 N5 ^  E3 c, t
  10.   valuesRR = analogRead(RR)
    " m' |7 H$ z$ G. b  ]! e9 Z% |+ q
  11.   valuesMR = analogRead(MR);2 P$ o% {2 }) A/ t( U  y
  12.   valuesMM = analogRead(MM);& m' i& y/ K0 l  N; m7 j
  13.   valuesML = analogRead(ML);( b+ H. U% D7 x/ Z: Q& {/ j" N1 |
  14.   valuesLL = analogRead(LL);
    - u% `3 w; {6 P2 r" p& \( h; _. L6 h

  15. ( x# s; U5 M3 J  C$ g. y
  16.   if (valuesRR > CNY70Val): I7 f* Q/ U6 @# I; l: \* x' H7 R
  17.     valuesRR = CNY70Val;
    0 ]! r( z3 u0 Q- N  U/ {3 a3 f
  18.   if (valuesMR > CNY70Val)
    ' T. W  r, ~8 ^2 b9 i1 L( i
  19.     valuesMR = CNY70Val;' j: D. C) {. |
  20.   if (valuesMM > CNY70Val)
    ( g1 Z/ k9 ?% C2 M$ E- X. F; I
  21.     valuesMM = CNY70Val;5 N5 b5 ~6 R! w0 O
  22.   if (valuesML > CNY70Val)
    * d: {9 N7 u4 L  `/ O( C
  23.     valuesML = CNY70Val;$ r' g1 \: o) W* y  g3 m4 ~* G
  24.   if (valuesLL > CNY70Val)0 Q$ x1 E: z  M- Y  H; ?+ Y
  25.     valuesLL = CNY70Val;/ X& t+ t# l5 \
  26. 4 Q( |8 `+ E9 }3 b
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;* P  W, R$ a4 j7 c2 f6 `
  28. }8 ]$ x8 C! |$ ]2 z

  29. ; Q" h9 p5 _7 j, G. R" C
  30. void Car()* J8 W0 d( C  ^* @$ Z
  31. {+ R' D, c& {' Q# S( R
  32.   while (1) {
    2 [- N' t( ?: E
  33.     CNY70();
    & K/ ]' n3 ]" h  U$ p
  34. . h: V3 G, d3 Y3 G
  35.     int error = ((int)values);1 I2 ]4 P* v% g; \# ?
  36.     interror += error;! @7 \& a# Z: \7 K2 l# Y
  37.     int lasterror = error - olderror;
    2 p/ u2 Z- Y" ?6 Q3 S
  38.     olderror = error;$ ^  E# `, F, B2 K
  39.     int power = error / 5 + interror / 10000 + lasterror;9 t  B, I/ w5 G4 y- {
  40. % W2 G9 n5 M& i
  41.     if (power > MotoSpeed)8 H5 F! ]" x1 O  t) V4 P
  42.       power = MotoSpeed;
    ) Q, d. a( f  i1 p/ f
  43.     if (power < -MotoSpeed)7 }' `% K7 f% g( k0 w1 _
  44.       power = -MotoSpeed;
    6 H; c% ^( y& y' U/ d  b
  45. . a$ A0 E1 Z+ r. R- T
  46.     if (power > 0)
    4 j6 ^0 t  Q$ s
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
      g, q( \& z+ p  I% ?! `0 y. y
  48.     else7 {# N& [0 n, ^/ V/ p: J
  49.       Speed(MotoSpeed + power, MotoSpeed);
    - ^1 v; {. k# b5 N
  50.   }; `4 S! ]0 ]0 r  c4 X7 a
  51. }
複製代碼

- ]) G& U9 b7 O: u; q
8 ?/ U0 _, |8 J: e9 w9 R6 j  D6 }
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-21 11:27 , Processed in 0.022905 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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