圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 20984|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>" g! n- o  g2 U5 U
  2. #include <Wire.h>, J1 j% O9 L/ R- ~2 m4 K
  3. #include <Servo.h>
    + e. ~# t/ u& z2 \
  4. , {5 R( Q+ L3 M0 P- f* p( j. }/ W& \- A7 B
  5. #include "MePort.h". o, u& n. i3 T7 R# x" I2 `
  6. #include "MeUltrasonic.h"
    + T: u: K- u4 S  e& H& m# B: [
  7. #include "MeDCMotor.h"
    ; D- q) z( j" e# C! w6 I

  8. 8 S2 T1 o# \4 \# T$ o" ?
  9. //double Input, Output ;  s  W' V' ]; w/ C9 p( g
  10. float MaxSpeed = 255;
    ) R/ y) v+ g' g% B- u# t& J
  11. float MaxPower = 180;1 k$ Z- M  U- \) o; {% q
  12. float MinPower = 120;2 n' R. _, b. j5 a4 Z# v
  13. float Error,ErrorAcc,ErrorDec;
    , ^+ L. O7 ]; L, c* m9 c" y- O" ^

  14. 4 [$ D& `3 C& c7 t
  15. float Kp=0.14;, y6 T. e6 U* c
  16. float Kd=0.00020;//23;
    2 p  ?5 n$ w  w$ o% N! p+ k! }) I
  17. float Ki=0.000201;
    % X/ q) B1 T& W9 @4 k  k0 b
  18. 6 ^$ ~6 [% h' _3 i
  19. float nPower;
    , |& \0 p" N2 g8 R: l
  20. MePort lightsensor_6(6);
    4 ?% h( B7 t4 r
  21. MePort lightsensor_8(8);) t2 f$ ]& B* f+ E
  22. MeDCMotor motor_9(9);
    ; @5 i: G$ m% E
  23. MeDCMotor motor_10(10);$ [/ z6 M& o3 e& F! j
  24. unsigned long previousMillis = 0;9 n4 F1 o- g& w) e& g5 C
  25. const long interval = 1;
    $ X1 \4 t9 L, ?) r  P0 G9 m9 t

  26. ) T7 v  Z7 c6 F& S0 _8 J
  27. void setup(){& n# M7 Z( b: v% P3 a
  28.     lightsensor_6.dWrite1(1);
    * G0 H/ f9 y1 R
  29.     nPower = 160;
    . V, g" e1 E* S% O5 z+ C
  30.     Error=0;2 O2 a4 C# G. K: }! R6 V
  31.     ErrorAcc=0;: N+ h8 W3 h+ F  R: ^0 W% o
  32. }9 w" `& @$ W, g
  33. + n% o; j, j0 V; t9 M
  34. void loop(){: p" T# ]; @7 s( @* q
  35.   unsigned long StartTime = millis();' r3 K( \9 P' s; e  }1 r
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){( R2 e# l: @2 D. p
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();+ x% x6 V, I& X; ~  j
  38.     ErrorAcc +=  nError*Kd ;# }1 P& M  O! b! m
  39.     ErrorDec -=  nError*Ki ;
    - S- ]* D4 N7 v2 f
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    / J8 q4 X4 t* @$ I; `+ ^+ m
  41.     if(nError < 80 && nError > -80){
    4 g' E, j. h4 U) l% H8 k% f) i
  42.       if(nPower < MaxPower){
    2 _; e+ A+ b% O& _2 I2 N
  43.         nPower += 3;
      G# n6 k8 I7 e& ^. h* q7 [; d  a
  44.       }+ X) G! \/ u/ P2 U
  45.     } else{
    : k& ], x: u4 q1 E5 M  D
  46.       if(nPower > MinPower){$ p5 M. @+ C/ B: @: G6 t
  47.         nPower -= 2;- F5 O  W7 T6 |
  48.       }$ f% J2 [# R; [6 r$ E2 |6 n
  49.     } 7 @4 i& {/ V* W, @8 [
  50.     MotoL(nPower-Error);8 _) ]2 U# q! _0 P" d# \
  51.     MotoR(nPower+Error);    8 V- K: n5 `& E  Y/ n2 b
  52.   }else{5 ~. g2 N4 H- D5 }8 k
  53.     motor_9.run(0);
    ! ^( N* \) w5 C
  54.     motor_10.run(0);
    : m8 s5 g# ?* O" h3 l
  55.   }
    6 ], q) `; @7 P& g7 f7 R. @
  56.   do{}while(millis() - StartTime < interval);
    9 b- j9 ?* s+ J
  57. }
    1 b! |2 M( I# G

  58.   [( Y0 e2 Z! O( t! \/ c4 j
  59. void MotoL(int Power){4 u1 E! x; S. L& ~: U
  60.   if (Power > MaxSpeed){+ i* W. }, Z- i$ [& c2 y1 D. s
  61.      Power = MaxSpeed;2 z4 T) o( c7 w% O' S
  62.   }
    + P/ D8 ~' z0 s/ C
  63.   if (Power < -MaxSpeed){) L, E4 X* c% B2 ?0 d8 Q4 r
  64.      Power = -MaxSpeed;
    ! w# d0 J/ w( {0 v
  65.   } ' u9 Q- t  a, a
  66.   motor_9.run(Power);
    - J" f% M0 K  s
  67. }  
    7 o8 K9 X* A5 |% O. }% _

  68. 4 q" l3 H9 L% f! ^' d
  69. void MotoR(int Power){
    ! l0 w) v) d; h$ L3 ~/ ?! L8 R
  70.   if (Power > MaxSpeed){
    8 I& i* A5 H$ t& M7 |4 j5 z# N
  71.      Power = MaxSpeed;
    3 k" U& A  b8 L2 c
  72.   } 0 S% y3 {' h/ G- ^0 U
  73.   if (Power < -MaxSpeed){
    0 o/ M- _# w- G2 T+ v* U
  74.      Power = -MaxSpeed;
    * }! a8 G, E; X, M3 Q. A! U
  75.   }   C- @* U9 d* N7 q9 U
  76.   motor_10.run(Power);
    - q" {- d. v0 D' J' J6 ^) F
  77. }  
複製代碼

* j& e% E% o. W6 N. Q' j: H/ h4 W3 p" m6 \- K  ~* h
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ' W$ r6 T" A$ Z. N5 `
5 U0 m0 C0 z4 w+ o( {5 \! K$ j
您好,不知是否能向您請教。
8 U) e+ V2 a0 c) ]  l$ Z目前和宋修賢老師在處理Ardui Car
9 O1 X6 b3 Z% h" k5 `+ e; U3 C雖然已使用較繁雜的方式處理了跑出黑線外的狀況' g! K: I0 k( q2 X' Q# A- B5 P

5 k: v& N2 v# {' H1 n" }9 `% U但基於想追求更精簡的程式所以還是想請問一下4 E% J! e$ I1 ?3 Z7 P) r
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
2 x( z4 _# D: z% A% [. R" f不知道您是否願意教我可以如何處理" g7 T" `! J1 ~( k
0 L- i' e1 y' K# J( ?7 B
; G" J/ C- r, [) X7 M6 j
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    4 s! d  _% t( E4 F% x
  2. double CNY70Val = 1000;
    . j) V% X# Z1 R% Y% C
  3. int interror = 0;' W5 I. |5 X0 o( K, `9 c8 i
  4. int olderror = 0;
    : }) r* e) W& c
  5. double values;
    4 m3 z1 I3 S+ |6 R) {5 r

  6. . s  K& s) z5 i3 S+ G
  7.   D7 n0 @  G& H. D
  8. void CNY70()4 t7 n* s) H& F$ Q6 w
  9. {
    & h3 n% K1 X* m2 [! J) x
  10.   valuesRR = analogRead(RR)
    3 c& p2 S4 _7 t" S2 z+ ~
  11.   valuesMR = analogRead(MR);
    2 p2 R1 F" y( H
  12.   valuesMM = analogRead(MM);( N  u" B7 h& G5 {4 C( u% c, W
  13.   valuesML = analogRead(ML);
    9 B3 D8 l4 H+ U0 {8 O- w8 o
  14.   valuesLL = analogRead(LL);
    + y0 m: o& P# [$ n# \2 B2 b3 a

  15. * A9 K1 P8 ~. W
  16.   if (valuesRR > CNY70Val)
    , O2 \" [; u- c# s  k
  17.     valuesRR = CNY70Val;
    & ^" a. k9 X# h5 L
  18.   if (valuesMR > CNY70Val)
    ' t9 a$ u) f  J3 k, r9 M
  19.     valuesMR = CNY70Val;0 u4 [. v: b2 p# P4 @& j: ^
  20.   if (valuesMM > CNY70Val)
    8 e& F# ~! i1 B& `
  21.     valuesMM = CNY70Val;
    # A7 M, Q( n  V3 V5 J4 p
  22.   if (valuesML > CNY70Val)
    9 R! U) x9 x- G( ]( f. I
  23.     valuesML = CNY70Val;
    9 N7 C% Y# f4 T
  24.   if (valuesLL > CNY70Val)
      D, n2 f/ }* e: m) z6 L0 e+ g
  25.     valuesLL = CNY70Val;
    $ ]4 K  a' R  S4 S- T

  26. ' p) b- L+ l7 _& v$ k
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;: k, B# o2 h% a2 v; o9 v
  28. }
    " e0 A6 o( c+ `$ b4 t/ d  [
  29. 4 E# p& S) v8 j  ?$ ~: B& b/ s6 t. O
  30. void Car()2 U) `$ R+ g8 \2 Y1 q0 U% J4 V+ H. ~
  31. {. i# h3 @& Z' n3 Q! S; [
  32.   while (1) {' G  r( o) b5 ^# A* q4 q7 L
  33.     CNY70();$ Y& Z" `7 _! K- X' c+ u; |- A

  34. ; Q/ A) s1 U  q1 m
  35.     int error = ((int)values);
    0 u1 R# j9 b: }. u2 Z. c
  36.     interror += error;# S2 |( V* J& c- j2 D
  37.     int lasterror = error - olderror;
    / U4 S2 p# g7 O" M' u# {
  38.     olderror = error;
    $ f& m: i! w! p  a) g' K/ r
  39.     int power = error / 5 + interror / 10000 + lasterror;; Q2 ]) {, [) h/ F
  40. $ f* N1 k8 o2 D8 y" B2 |7 c
  41.     if (power > MotoSpeed)% c6 |& P9 ]* c) @
  42.       power = MotoSpeed;
      v; N6 l% F' G, M8 @
  43.     if (power < -MotoSpeed)
    5 g/ v/ S5 Y$ }  O3 d0 H
  44.       power = -MotoSpeed;
    * T. N3 b" R$ K4 ?' _

  45. . R' c; g9 M# t. w1 j
  46.     if (power > 0)
    # i) L; w# g! B$ x& y; W
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。1 g5 |% y% s9 e
  48.     else- v+ s7 P$ v3 Z& G$ h' |- k0 Z/ Y
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ) A# i: Z9 [* n8 X
  50.   }
      R) W  g0 I) r, Y, C- j
  51. }
複製代碼
- C' X( E# _% R' N, A
7 t% o/ l, S  l+ J% }: U+ q
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-7-13 14:48 , Processed in 0.025462 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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