圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21710|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>7 d: y4 [% P; C6 `
  2. #include <Wire.h>+ d" t" I9 {! ?3 G& Y" G
  3. #include <Servo.h>
    / r3 C9 L/ v, P8 u
  4. / M9 R& {6 g2 f: B
  5. #include "MePort.h"  _4 |& B8 y" _9 r* M  F
  6. #include "MeUltrasonic.h"& H, |! |; B% \
  7. #include "MeDCMotor.h"2 ^$ `6 e7 b1 z- z7 g0 s% R

  8. 8 ?( Z9 t' Z5 j0 b: F. G7 u7 ?7 H
  9. //double Input, Output ;0 i7 X  d6 G0 U
  10. float MaxSpeed = 255;% H9 x# t: F! [8 Y8 h: n
  11. float MaxPower = 180;; N" R* n. j7 {( I: l6 j7 ]
  12. float MinPower = 120;* u& l8 \9 g/ h$ ^9 ]0 r9 u
  13. float Error,ErrorAcc,ErrorDec;
    ' X; G( l. n, u: l0 D

  14. & |  H  c: c9 L8 C9 D5 [
  15. float Kp=0.14;9 y) w4 F, \# o/ j
  16. float Kd=0.00020;//23;
    1 l! `1 Y4 M  }
  17. float Ki=0.000201;% ~9 X4 D% A1 d& G# U+ v% w4 M

  18. . w. P2 w! ]( P
  19. float nPower;+ e# n" c. M! L0 C+ @" Z
  20. MePort lightsensor_6(6);, n1 M& o0 z- i
  21. MePort lightsensor_8(8);
    6 V5 [# [" V7 p' l
  22. MeDCMotor motor_9(9);
    " a2 a  m! ]+ u. L- Q$ M9 i# ?
  23. MeDCMotor motor_10(10);8 n1 h6 _8 J7 F- t5 ]
  24. unsigned long previousMillis = 0;) P/ |) e) k% t6 r2 C) ]8 i% G1 F
  25. const long interval = 1;: S+ g/ j5 Q3 b. _
  26. : o% a# _$ B& W4 y6 a/ E9 B* ?. L
  27. void setup(){4 }" s4 ^4 Z* q0 J
  28.     lightsensor_6.dWrite1(1);
    7 j+ Y; A0 x! [7 u
  29.     nPower = 160;" }5 j/ ^2 Q: g5 o
  30.     Error=0;
    6 m- x* s* i* v  |
  31.     ErrorAcc=0;
    ' {, v2 b* h3 p. C: K9 g& K. g. Z
  32. }
    $ Y- s1 k! G7 p6 i5 {
  33. & u4 l! m9 M- w" s* T
  34. void loop(){) \. n, I3 {1 a
  35.   unsigned long StartTime = millis();+ m+ u2 o. l8 h
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    / J& b0 d$ q, P6 I: t' t4 E/ `
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();6 Q# A- ]: h5 ?! c" |- C
  38.     ErrorAcc +=  nError*Kd ;4 ?9 Y9 u9 O) @% y) c
  39.     ErrorDec -=  nError*Ki ;+ _$ k$ e+ v: Q+ O; E4 V
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    / G1 ?" U1 \6 q
  41.     if(nError < 80 && nError > -80){
    & h- W7 L7 c6 f8 V( r
  42.       if(nPower < MaxPower){# Q7 j* x5 i5 z5 o" l4 v4 e4 E
  43.         nPower += 3;
    * g3 L5 V- W) d7 t
  44.       }; q* W8 D0 ]& I. n. Z$ ]3 _
  45.     } else{) Z5 O' {+ M# ]6 V0 D
  46.       if(nPower > MinPower){0 E* X9 x, b2 h. A& A/ m
  47.         nPower -= 2;
    $ r9 y5 _& f5 F8 n; y
  48.       }
    " K3 \. Z! a9 a- i5 Z1 _
  49.     }
    : B- d1 \2 p( Y
  50.     MotoL(nPower-Error);9 h0 x8 E% }* |& _! F2 n
  51.     MotoR(nPower+Error);    # e1 _2 P* r% W' }4 z
  52.   }else{
    4 L5 h: k9 a3 d
  53.     motor_9.run(0);2 l6 Q2 X9 j2 ?4 k* F9 v; v
  54.     motor_10.run(0);$ i7 t! ~* _0 o. h" `9 l0 p
  55.   }5 p" e; m  l) ~' U  b( {1 V0 I
  56.   do{}while(millis() - StartTime < interval);
    1 L' r( ]% |4 }6 o! U9 Z# q" c
  57. }
    - ^7 K3 F9 J3 h
  58. 5 M& L' _: v, Z8 K: A1 m" J
  59. void MotoL(int Power){: c+ e/ H; b0 ?' H( l, x9 Q
  60.   if (Power > MaxSpeed){$ |4 f7 [: J/ `# \- v# }
  61.      Power = MaxSpeed;+ V7 i# y& x* D/ X8 B' G2 X
  62.   }
    / q; P& r' K2 X* t5 `: J: u6 k* `
  63.   if (Power < -MaxSpeed){
    + Y' u/ {, |3 W1 m9 e' b
  64.      Power = -MaxSpeed;6 n3 \7 L/ e" |7 @. `. D% \
  65.   }
    ' q( M8 f0 P2 E  d" P+ U: k
  66.   motor_9.run(Power);1 e# T0 M/ ?7 f2 x+ b4 e) d( Y1 T
  67. }  ; k& q8 g: |9 D9 R$ K1 T; X- X
  68. ' l, g" Q1 q' p. S$ e& u
  69. void MotoR(int Power){* l0 A  k2 {6 m2 s. y7 W9 u2 z
  70.   if (Power > MaxSpeed){
    : o/ j% W% T) O
  71.      Power = MaxSpeed;
    % o# Y9 }$ Q! R" `
  72.   }
    - R/ A# d7 P- _. J1 I
  73.   if (Power < -MaxSpeed){
    / |3 }4 ]2 D' @) H
  74.      Power = -MaxSpeed;
    ( o1 v- a( ~5 ]8 P8 ^7 x( z
  75.   }
    7 ]( l; z$ W7 c! s
  76.   motor_10.run(Power);
      \& o- a% R0 d+ o
  77. }  
複製代碼

4 X/ ~, o8 z) n8 o
7 ]6 B  x7 E# q2 b  J" b8 Q0 s( X. j
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
* H+ N5 C/ c) Z. M: Q+ W9 a( ?$ p9 k
您好,不知是否能向您請教。
7 z0 E1 |7 v0 S- ~7 p* b9 A  |. E. N目前和宋修賢老師在處理Ardui Car4 R! l) y- Y, U
雖然已使用較繁雜的方式處理了跑出黑線外的狀況* p9 X$ t5 P) u! i7 v0 T8 g
! O5 o# _. H2 q0 \# m
但基於想追求更精簡的程式所以還是想請問一下% p. r+ z' E0 }3 O. E% J
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
7 f6 {, x  o# B* J不知道您是否願意教我可以如何處理1 K/ v" N3 M; u; ~) G7 \
2 Z! b# A+ F3 A9 F4 z9 k

" d/ Z3 v/ a2 r% B; O以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    2 h$ q5 y8 x2 Y) x% m2 Y
  2. double CNY70Val = 1000;
    6 y  H8 a. _3 @1 ~
  3. int interror = 0;* D  y) B# r6 F. q0 x7 E) Z
  4. int olderror = 0;* Y3 A5 y" s& U- j# [0 d' b, E' u; e0 P
  5. double values;
    5 k$ O# i' M% R5 e4 Z8 @# M
  6. % l- [5 R/ b+ K/ d+ O
  7. % p* J6 n8 O2 I1 `8 t* s
  8. void CNY70()
    4 i9 y0 s2 ]- f9 V( j/ m, y6 r
  9. {  T. Y" c9 e; H0 {# I# q* C# |
  10.   valuesRR = analogRead(RR)$ m. D2 a: z: C
  11.   valuesMR = analogRead(MR);
    9 P$ \( M% y, x
  12.   valuesMM = analogRead(MM);- O# D4 x. ^- c7 w& s
  13.   valuesML = analogRead(ML);
    4 S# `7 N6 f. f7 }# w4 T% w1 |# @
  14.   valuesLL = analogRead(LL);) ~! V( C) p8 r5 T& n
  15. 2 W2 z) p/ [4 X8 _: i
  16.   if (valuesRR > CNY70Val)+ y- Y/ R/ X2 `; b7 a5 l+ f
  17.     valuesRR = CNY70Val;) X4 I1 E( G! k. y* z
  18.   if (valuesMR > CNY70Val)
    : H; t/ _' L, L  w# y
  19.     valuesMR = CNY70Val;, X/ Z+ y& l8 X- e5 r# d, J, f
  20.   if (valuesMM > CNY70Val)" [( A1 E$ b7 l% f
  21.     valuesMM = CNY70Val;
    % |4 @$ H% b5 d5 r. E3 F
  22.   if (valuesML > CNY70Val)
    " F! @( z. d1 `6 S) b) s, e1 L! r
  23.     valuesML = CNY70Val;
    + O" Q$ _, F6 F4 k
  24.   if (valuesLL > CNY70Val)
    + f* ~8 l) B5 v# w* z0 t0 `
  25.     valuesLL = CNY70Val;
    - N5 ?/ P+ p6 @1 @# K
  26. ! _* O3 t3 ]6 m  T5 a# _5 e+ g3 k. W
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    ; W2 W) `4 u: ^
  28. }
    / _- o. u) v, u3 K  f$ W) M

  29. ' U) C" l" l) j
  30. void Car()
    8 Q0 b# E, z( i, p1 Z
  31. {% X- f- v) r1 @9 c# z
  32.   while (1) {  I! c& {6 m- `1 e: n7 C
  33.     CNY70();
    $ k! d% z( t. O. I
  34. 6 j- P( ^* u' {& F+ r
  35.     int error = ((int)values);9 m) q! L4 R  q+ j
  36.     interror += error;
    3 }* p: C# V% S. H- W$ p
  37.     int lasterror = error - olderror;
    ! ~6 D9 w; c7 ]4 s! b
  38.     olderror = error;6 R: i0 `  j/ Q: E- J% [* t
  39.     int power = error / 5 + interror / 10000 + lasterror;* W7 @0 j" h% [& }6 U' N- ]; Q
  40. 8 x- ^7 h4 ]7 q' }6 q4 L
  41.     if (power > MotoSpeed), C9 r3 F! P4 [& s2 }/ r2 T8 k
  42.       power = MotoSpeed;3 o' Z$ j3 h1 S) s3 T
  43.     if (power < -MotoSpeed)
    ; @9 S/ e2 M! N) B+ g- m& W' y
  44.       power = -MotoSpeed;
    1 o: d/ s; r0 W: N. C( x( g

  45. 0 W9 A1 [) U  v& m: B
  46.     if (power > 0)9 c# [  S; r3 @; h
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    2 |( `7 {3 k; D, b9 v
  48.     else
    3 I$ h* k7 z) r9 ^
  49.       Speed(MotoSpeed + power, MotoSpeed);
    . @$ l" B& H: y2 t
  50.   }' Q- U$ J9 X* f  o+ c
  51. }
複製代碼

6 g) J: g/ I  H' r3 k( v" s9 u5 k: L. h- q7 s1 P
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-25 20:43 , Processed in 0.025595 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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