圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21745|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    + i4 t3 f7 \1 p" i( T( {% \
  2. #include <Wire.h>
    0 n  v4 S5 P0 s7 s
  3. #include <Servo.h>" b* e5 A* l- {. @
  4. 8 a. m1 L- I( A) L- F; D
  5. #include "MePort.h"
    4 X) g) t9 G) k( N
  6. #include "MeUltrasonic.h"& y6 ]- w" S; r* e/ z, R
  7. #include "MeDCMotor.h"8 O% {/ D# \0 g4 ~. P
  8. 6 \5 m0 U: C8 k
  9. //double Input, Output ;
    9 R, v5 M. h2 P' G
  10. float MaxSpeed = 255;' q# n$ |  v% V, i* K
  11. float MaxPower = 180;; K" ?1 A. ~/ R7 y, R. Y8 ^
  12. float MinPower = 120;
    ! u! b" G4 b' Q' ]& h9 W' x4 F
  13. float Error,ErrorAcc,ErrorDec;
    + r, z) t/ M$ p3 Y, {, Q0 }
  14. 0 g+ k  s0 m5 \
  15. float Kp=0.14;' y8 w& Q3 U. T
  16. float Kd=0.00020;//23;
    , S7 t' N* g9 V% c1 \- |
  17. float Ki=0.000201;
    - `! p5 d8 f) t7 r, }( @8 |
  18. % K5 k& a9 v) f/ ^9 k; e9 }* l
  19. float nPower;
    ' |* ~5 b/ R, q, _) N' Y
  20. MePort lightsensor_6(6);  N0 r1 a+ `2 {) c
  21. MePort lightsensor_8(8);
    & t. P0 i- s. v( x4 D  J
  22. MeDCMotor motor_9(9);
    ( a7 x* E7 B# Y% Y. _3 H: j: p- X0 F( W
  23. MeDCMotor motor_10(10);
    . v8 P( u% ]) A3 S
  24. unsigned long previousMillis = 0;
    - K' a( {$ k) O- `0 }6 Y
  25. const long interval = 1;, f- Z0 R8 |6 i9 m( K/ c5 e

  26. 4 d3 e: G0 r3 u8 K/ z* p3 n3 b6 Y
  27. void setup(){
    2 H+ h) Y; R& c$ n! _+ j3 O
  28.     lightsensor_6.dWrite1(1);8 A5 _2 m+ o+ e3 Z. `% k
  29.     nPower = 160;' H9 I5 d) E) D; v
  30.     Error=0;4 f7 J& D" h* A  j( Z* ~
  31.     ErrorAcc=0;6 n. X$ }' S* S/ Z9 ]- U" G
  32. }
      h8 @' J* \8 @* I  r) m3 _( Y# E
  33. ' W: D3 s4 ?4 K+ T- L4 ~9 U; \4 ]
  34. void loop(){
    ) T2 }$ h8 t! t$ k
  35.   unsigned long StartTime = millis();
    : G, G5 \/ L* S% j; f
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    ; @5 C, S2 D" J+ W, g
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    * N, r0 S7 p) _  X2 m
  38.     ErrorAcc +=  nError*Kd ;0 j/ L6 A5 V- K; v
  39.     ErrorDec -=  nError*Ki ;
    4 S2 E4 ~0 s' _& N
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    + [. w; f2 z/ F4 o( K" I
  41.     if(nError < 80 && nError > -80){* ^6 w. B7 s) h
  42.       if(nPower < MaxPower){
    8 E# h9 f. g# P5 [7 X# x
  43.         nPower += 3;
    ! V7 b7 E- |3 b  n$ B* I$ U1 l
  44.       }
    - {) _. t8 h3 g; w4 q# |
  45.     } else{) C1 _2 H+ m/ g2 l# |9 k& m) r
  46.       if(nPower > MinPower){
    $ b" Q1 \. _3 C: `5 x( I# T
  47.         nPower -= 2;8 W+ p1 D6 i7 N# @% a
  48.       }/ a+ h3 b' c5 V- Z) K: f+ `
  49.     }
    - X+ I5 ~: d& K4 J
  50.     MotoL(nPower-Error);
    ) _8 g+ \& S5 ?) T
  51.     MotoR(nPower+Error);    3 K9 K( {1 S* P0 p) k9 t
  52.   }else{
      P, X% f: ^$ y- n, O& ^7 G- |
  53.     motor_9.run(0);4 l; e; E" ?9 B2 B/ n# _- J
  54.     motor_10.run(0);' w+ t0 V: x) {4 r, Y+ f
  55.   }2 P/ |. q/ `0 g( g) m6 _; ?: f7 K
  56.   do{}while(millis() - StartTime < interval);
      s2 Y  c4 m) N  ]" O1 n; Y
  57. }+ F8 p. M4 p& O' n

  58. $ {. k& a1 p2 S7 P
  59. void MotoL(int Power){
    1 ^7 |. _( r0 U
  60.   if (Power > MaxSpeed){
    $ l* C- x: Y, n! @+ D' M; O
  61.      Power = MaxSpeed;& Y4 T: G2 W& `+ ?
  62.   } - D2 ?( B1 T5 L8 L1 z* z4 U
  63.   if (Power < -MaxSpeed){  i9 M7 z$ Z% B! s
  64.      Power = -MaxSpeed;
    6 o+ F& ^' Y6 @1 c4 E: e% F
  65.   } 9 }, I( k$ j( ~3 O
  66.   motor_9.run(Power);" A7 F- E$ t$ N* n4 ~
  67. }  ! n  m& \6 f3 c- Y3 A/ w& E1 a! p
  68. 8 r3 t1 z0 p/ ?, Y' i
  69. void MotoR(int Power){/ m3 s! |0 k' m
  70.   if (Power > MaxSpeed){
    6 @! X8 v( e3 f# ]( \% w
  71.      Power = MaxSpeed;
    " k: q4 U, ~: l4 T1 j* c  ?
  72.   } 1 [6 @# X7 _- E% w
  73.   if (Power < -MaxSpeed){
    ; a8 m6 W/ Q2 A1 i' [7 r* ~
  74.      Power = -MaxSpeed;% a4 r, z6 f6 F9 q- s5 s
  75.   }
    8 s" X- m8 k; g  g) S3 S7 q
  76.   motor_10.run(Power);% h! b) ~7 C4 b8 t1 }
  77. }  
複製代碼
2 T& j6 ]7 N) C& ~7 I$ G: R

2 ?. }/ w! L6 [, j& ?
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 + f1 p) F7 }# ~9 W$ P% z

( v5 Z4 i5 c. I8 w1 H" d您好,不知是否能向您請教。& y8 c  r1 B( d& U0 |+ o7 q
目前和宋修賢老師在處理Ardui Car* S  ^! a$ E9 O' H
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
4 Q( S1 @$ Z" G% s& d2 B% d7 g3 S- l2 {* E7 W, C: o% x+ j
但基於想追求更精簡的程式所以還是想請問一下
0 Y) o' i. a( y$ a* j/ I" }就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
, s4 B0 Q; _( n不知道您是否願意教我可以如何處理0 t  A& O& s+ M* y: S2 E

$ D9 ^5 x& z% X- K8 A, Z
4 a: ?1 n0 I* Q以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;* \, Z6 O6 |$ M$ U" S" {. q& f# c
  2. double CNY70Val = 1000;: Z2 C3 K+ g- M
  3. int interror = 0;2 k. D( }; L" T" `( p  p% Z; D3 o
  4. int olderror = 0;4 W+ P5 t/ s  Q/ S  |" u
  5. double values;* P7 h, ^, l6 H$ L5 c
  6. 6 T8 X0 j! i9 }$ \5 r
  7. & _0 r' V. ~0 p2 ^+ o* E
  8. void CNY70()4 @& u5 M. z4 ?5 m. s$ q& o8 t
  9. {4 h$ t2 B: y0 H3 ~* g7 T
  10.   valuesRR = analogRead(RR)" v1 {! C! b/ c6 q: j& E/ q
  11.   valuesMR = analogRead(MR);
    8 {4 n# ~$ g& T
  12.   valuesMM = analogRead(MM);
    $ i2 R3 z/ A% D* z- L. C
  13.   valuesML = analogRead(ML);) A& a) |: H0 p, C* s
  14.   valuesLL = analogRead(LL);
    7 r, e' Y  I9 i% F" R$ X

  15. 4 `# L# `6 u+ f
  16.   if (valuesRR > CNY70Val)) D3 l* U0 m# ^+ ]4 u
  17.     valuesRR = CNY70Val;4 c: r+ h5 b& Z& ?  w
  18.   if (valuesMR > CNY70Val)
    . N5 N( A' Q. @( L& x8 y
  19.     valuesMR = CNY70Val;
    $ e6 B: p, m4 L+ h- g1 ~
  20.   if (valuesMM > CNY70Val)
    0 s/ ]9 Z3 K1 y, a3 a# {
  21.     valuesMM = CNY70Val;' [+ q9 Z+ _# Z0 P# P4 S
  22.   if (valuesML > CNY70Val)
    # `' e* _! O& _# g) N  s9 X0 W
  23.     valuesML = CNY70Val;) q# u  V; c* l' q  O8 I
  24.   if (valuesLL > CNY70Val)
    3 {# d' Q$ d1 O$ t* h9 {
  25.     valuesLL = CNY70Val;- ]0 ]* r/ O( S; Q
  26. : ~! Q% y9 Q( O
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    2 Q5 a0 y1 X5 G# K4 o0 g9 u/ L' k# `9 s
  28. }
      G" X* i7 x- y( {/ I- C
  29. , g& B# V- Q/ l5 V1 Y! x. ?+ j
  30. void Car()8 w6 r1 l: {: J% d
  31. {, W  f3 @; \& c5 }# ?2 i! k" G- X
  32.   while (1) {8 p/ ~( G1 o1 s1 Z8 {
  33.     CNY70();# Q# {; `$ l2 H7 J

  34. ) e$ L, Y9 T; D% O
  35.     int error = ((int)values);( h6 ?3 }2 Z0 n0 A9 @$ ]2 H" h4 q
  36.     interror += error;. W. G8 w& D- T8 s7 w( e& h$ Y
  37.     int lasterror = error - olderror;
    , v0 g5 I6 ?+ H% {
  38.     olderror = error;
    ' |+ L. s- v- \& q, m# ]
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ' a  @0 F( _0 B0 q0 h" N
  40. 0 Q; d4 K- F" f# U) K% j; L
  41.     if (power > MotoSpeed)
    5 E- X/ B7 \# |' a* M
  42.       power = MotoSpeed;6 u( @1 j5 _. F" C
  43.     if (power < -MotoSpeed)
    ( {4 x/ ]. p' ~3 I' q( u
  44.       power = -MotoSpeed;
    3 g3 v" \5 f8 [" c/ Z/ B* l2 q

  45. : q8 I) K5 K* z: T
  46.     if (power > 0)
    6 X( I( I. [% b! l, r
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    : r5 \2 A3 j6 I$ z* G
  48.     else% \4 a# A) d2 [" C5 X
  49.       Speed(MotoSpeed + power, MotoSpeed);' l8 I5 a8 Q) }/ b- Q
  50.   }
    9 I* a) D  A2 w6 N' E1 V4 m+ l
  51. }
複製代碼
: w! w2 [+ J. x! Y$ S6 N( X
3 Y' {' }" n2 X2 U6 S/ j5 A
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-29 10:31 , Processed in 0.019361 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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