圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21789|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    " u9 F. {& z% y9 p* a
  2. #include <Wire.h>
    ' D1 L" i2 i3 L3 S
  3. #include <Servo.h>8 b2 v9 l( k6 N% v. A

  4. 1 t9 R% v( {) V- h+ l
  5. #include "MePort.h"* K, b* [& K# S1 ^$ E* N+ v
  6. #include "MeUltrasonic.h". z, e! t1 ^) A
  7. #include "MeDCMotor.h"8 l2 X' k; O3 o$ d- Z

  8. 6 m/ Y; m) T0 F1 n6 b
  9. //double Input, Output ;4 a3 i# V0 y- U9 w
  10. float MaxSpeed = 255;7 _9 h# f# `. K& ]7 }0 |2 b
  11. float MaxPower = 180;2 h. P* a( w& r" O+ V$ B
  12. float MinPower = 120;' v+ a0 }  l+ n/ i# Q$ G
  13. float Error,ErrorAcc,ErrorDec;
    * u' E# w0 I" A$ A" f+ H# _

  14. 2 i( U& ]1 D( H3 z3 a
  15. float Kp=0.14;
    7 ]* _9 T  k  ?) w0 m
  16. float Kd=0.00020;//23;
    , A3 a4 G: X6 ]# {1 w* W: H
  17. float Ki=0.000201;; Q4 Y! x% c0 C6 e$ c

  18. " T2 p: o1 |+ {8 K
  19. float nPower;
    0 {+ q( c; K% D
  20. MePort lightsensor_6(6);
    & o) H( p& R: o, \4 U, s0 m
  21. MePort lightsensor_8(8);. Y: ]# ]! ]" Q2 U
  22. MeDCMotor motor_9(9);0 n, z8 y% b8 {9 L7 X  w
  23. MeDCMotor motor_10(10);2 h" }7 j! n+ L% s# z( L8 j6 s
  24. unsigned long previousMillis = 0;
    - U" v4 [  e7 u2 K& F
  25. const long interval = 1;. u: w% A! V1 ]/ Q/ T( _
  26. * u  m, D9 f8 g2 T6 Z* j
  27. void setup(){5 V" |7 i1 D$ x$ u
  28.     lightsensor_6.dWrite1(1);
    - w4 P3 Z8 l) D3 R3 V& u
  29.     nPower = 160;) \" L# g" ~$ ]( ~; y$ k
  30.     Error=0;0 q7 x' Q8 v0 r8 _, ]! r* L8 l5 [
  31.     ErrorAcc=0;; J& e0 \8 n3 \
  32. }
    ) k8 s/ C0 j. I( k
  33. * d" H" M) M- T& n7 d1 F0 ^
  34. void loop(){' A( l5 g) l& H( O" I& F
  35.   unsigned long StartTime = millis();
    , C' a" ~2 u& q4 f* L8 _2 k- n% M
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    $ _( |& f5 N" L+ a" ]1 M9 x7 \
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();: y* K$ l- A  g; ~
  38.     ErrorAcc +=  nError*Kd ;* z9 |9 U, F, _' o3 P4 I5 c
  39.     ErrorDec -=  nError*Ki ;' ~" N2 q5 Y- q+ K
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    . K+ d' m1 X. y9 _7 [- I
  41.     if(nError < 80 && nError > -80){) o! a; q  Q, P4 h" z  e3 {1 p
  42.       if(nPower < MaxPower){% F8 c& O6 s8 p* V, |) _
  43.         nPower += 3;
    0 |! l- s: }6 U8 J
  44.       }
    4 K9 M# U. s1 s- @# r
  45.     } else{
    2 k8 }! o& D1 D1 ?4 r' M% s
  46.       if(nPower > MinPower){" E/ f1 N& [  T/ k2 w
  47.         nPower -= 2;
    ) A% Q' ]' P) ~% [
  48.       }6 B& D, d2 I$ s
  49.     } ; B! G% Q9 U# Z$ p" n& t. x
  50.     MotoL(nPower-Error);
    3 q* `3 [, L8 O' R* S8 v& Z  \9 ]5 v
  51.     MotoR(nPower+Error);    + s0 e) X4 G! V! }
  52.   }else{+ g6 L- D1 `% H" r' g1 R6 O; F8 f
  53.     motor_9.run(0);" i# e! r6 F3 L8 ]
  54.     motor_10.run(0);: P1 X' N; ?9 i$ Y( D7 T. E
  55.   }
    % {- E/ a, s: f
  56.   do{}while(millis() - StartTime < interval);- H/ c5 r4 [/ J: w/ w- q) N' J
  57. }% N  O: z; h, l  y. m/ y
  58. . W6 u- ^/ X  Z3 N& k3 w5 L
  59. void MotoL(int Power){) X# M0 G3 E" @8 a0 h/ d- Y4 t# ~
  60.   if (Power > MaxSpeed){
    " @- @+ w& H$ a8 K
  61.      Power = MaxSpeed;
    & u0 d5 b1 l# P  [+ [" e7 R
  62.   }
    9 y: n+ @4 Q$ p4 w
  63.   if (Power < -MaxSpeed){: g( q3 ?5 Y. z2 l' }# t) r$ y
  64.      Power = -MaxSpeed;2 ]( Z( J( z! w3 x' _# g, X8 z
  65.   } 8 m  j! d: Z' @% S3 }# f% S
  66.   motor_9.run(Power);
    6 }' J* S: w) _, h0 P. V
  67. }  
    4 R3 [9 a, w2 b6 i$ y7 U9 U5 A
  68. 1 Q. B8 I  o8 F, M' q
  69. void MotoR(int Power){
    + H1 G5 Y9 `. \( W
  70.   if (Power > MaxSpeed){. k& y1 U+ R* B5 O
  71.      Power = MaxSpeed;
    2 \; k5 J: Q! F' _3 k4 x9 n6 P
  72.   }
    ' y, T2 ]/ C% n8 \: b5 c; y2 s
  73.   if (Power < -MaxSpeed){
    7 i& |/ @2 S+ y) I2 \3 U! N
  74.      Power = -MaxSpeed;% M) O7 Q3 E# q$ `. g: h1 S1 H
  75.   } / [2 I( _: n8 M; A! O0 ]
  76.   motor_10.run(Power);$ r6 w3 f# S" k; t2 }
  77. }  
複製代碼
* `! x' b; L. h$ ~

5 K# O) ]& S( a8 e+ G# n
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ! h: ?7 j$ m7 p. c
5 `  w; s- s# B6 c& Q4 s1 |
您好,不知是否能向您請教。+ z  e* _2 D, d- q" \# G
目前和宋修賢老師在處理Ardui Car
, p4 \% |  ?# L; T5 m" h雖然已使用較繁雜的方式處理了跑出黑線外的狀況
* D# R7 r/ {/ i+ c- y: W) Z3 |* S0 E' ^) m* V
但基於想追求更精簡的程式所以還是想請問一下
' f+ }! o3 s9 B+ f: N  ~4 O就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
. W' c: H. Q# W7 Z1 f8 m不知道您是否願意教我可以如何處理' K! ?& }% S  u' K5 A/ F

. l; u' F: e" z+ a+ @# W8 H( Q, q" ]# n& Z$ J6 X8 r, X
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    $ d4 [6 F4 ^# u
  2. double CNY70Val = 1000;
    ' Z. r4 R6 {7 F0 [. `. n6 e& \' ~
  3. int interror = 0;
    5 S* F5 m$ u) Y+ s& M
  4. int olderror = 0;' ?7 L4 v7 D) A; O
  5. double values;: ~$ t6 p$ i; O; u' x7 r
  6. $ b8 t; ~3 U: y2 e2 k
  7. * @) @) S; G% @2 B1 _. y/ ~; B" r
  8. void CNY70()1 U' R+ K, {$ e  b( }. z4 k8 }
  9. {0 W. d6 ], h: B3 k' Z) R8 f4 }
  10.   valuesRR = analogRead(RR)9 y3 k( v1 L0 g% b* d0 M) m, n2 P
  11.   valuesMR = analogRead(MR);
    + I# |/ W5 V# @, R6 O
  12.   valuesMM = analogRead(MM);  A# A: ~7 n0 `, j- A
  13.   valuesML = analogRead(ML);5 U7 r$ P& h8 s9 c9 a% X
  14.   valuesLL = analogRead(LL);
    9 Z! P& _( t) l. o0 i: m5 h

  15.   b" K" s% D( W5 ^
  16.   if (valuesRR > CNY70Val)
    6 n- P5 @1 w+ [" a# h
  17.     valuesRR = CNY70Val;
    % |9 x2 X& ]4 T  y3 I: W1 ^
  18.   if (valuesMR > CNY70Val)
    9 _6 i( S2 j" |  W- _
  19.     valuesMR = CNY70Val;7 x- u2 I1 D( Z& u. E7 Z
  20.   if (valuesMM > CNY70Val), p" z1 t) ?3 d1 x
  21.     valuesMM = CNY70Val;! ~/ w% x% K) j: H
  22.   if (valuesML > CNY70Val)) y$ m/ O2 w$ e$ k3 X: D+ d) f% S: O
  23.     valuesML = CNY70Val;$ ]8 a) I8 m/ y+ U% t; C
  24.   if (valuesLL > CNY70Val)7 [" _' i- W, d) I. H. f( k! M
  25.     valuesLL = CNY70Val;
    + |  G5 _& O9 T3 X; I9 \( t5 |  R! e
  26. - E: N/ x! J& A4 Z% p
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;- F9 G+ [+ t  _9 X( m$ _
  28. }
    : a( j, d9 k, e$ y. z
  29. 2 O! j. A8 a* G1 Z: `/ ^/ N, R
  30. void Car()
    " M7 E0 ^" k# c
  31. {1 C7 Q7 j- l3 w/ C8 H
  32.   while (1) {
    5 Z: J# O5 i' p! v2 ^! Z
  33.     CNY70();
    9 N2 |. J: x' z# K- v: o
  34. . U- j- T( W- q4 M
  35.     int error = ((int)values);- e$ a% r* v. ?' A3 v7 e
  36.     interror += error;
    # T6 V) ?8 ]$ e# y0 B. e8 T
  37.     int lasterror = error - olderror;
    3 d, z5 E+ U, K$ w! w# l- T
  38.     olderror = error;
    ; i3 t$ y; ?) }0 e- S# p: W9 _/ \
  39.     int power = error / 5 + interror / 10000 + lasterror;8 e! j& s, m, X; p' {

  40. , a9 N% p' I( Z- x9 G0 I
  41.     if (power > MotoSpeed)
    $ Q2 V8 s  w2 S5 u% |
  42.       power = MotoSpeed;
    7 Q" k% r4 a: i% O: a% j! k9 ~- h/ q
  43.     if (power < -MotoSpeed)8 C* a: ], h, m7 ]. H4 S$ y, {
  44.       power = -MotoSpeed;- R* W' \* [, U, X5 K0 {+ Z0 j6 ]! a7 u4 |
  45. , W, N8 |. g  Y6 M: j
  46.     if (power > 0)- Q: K3 G/ @# h; c( p/ s$ Z
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。2 j+ w5 ]' s9 i8 P) N
  48.     else
    4 w9 n: X) k; j5 l
  49.       Speed(MotoSpeed + power, MotoSpeed);
    : o3 L, C! B  {
  50.   }
    7 Y: \; k9 m/ V. n8 A; S8 A
  51. }
複製代碼

# q* y, i& r; [$ j$ D( @) @3 J8 j5 S; j
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-1 03:00 , Processed in 0.024114 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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