圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21853|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>3 e9 @0 c& Y$ p4 {5 P2 i9 R
  2. #include <Wire.h>
    + l* _3 N" _8 ?: d# H9 F
  3. #include <Servo.h>
    1 S4 ]* i9 P/ }

  4. 0 m; D0 u4 ?6 [5 v# D+ c
  5. #include "MePort.h"
    ( e% G9 P. K' Y- p7 U
  6. #include "MeUltrasonic.h"/ @- d3 T4 T6 I7 w) G7 i& C5 H
  7. #include "MeDCMotor.h"
    - N: ]% f9 ?' q- H+ G0 E

  8. 3 x! E1 F1 x" o! Y" G5 O- k
  9. //double Input, Output ;$ D9 i6 S: G, {; B0 s
  10. float MaxSpeed = 255;
    3 m! G- r3 f, C. p0 z
  11. float MaxPower = 180;
    " @  Y( a2 ?9 |7 o+ y
  12. float MinPower = 120;& w9 {4 x$ u$ Y9 g, [0 j7 k- H
  13. float Error,ErrorAcc,ErrorDec;
    2 A4 c- @9 f3 B4 l* c

  14. 0 F8 _8 d" {- Z
  15. float Kp=0.14;
    ; ~$ z, o$ J( ]* Y' a9 }
  16. float Kd=0.00020;//23;! B, g4 X) ]: l" v6 W  ^( S! B
  17. float Ki=0.000201;  O8 z; s# ~& \6 T1 B+ u

  18. ' [2 p( l6 Q; [- E* B
  19. float nPower;0 D( R+ X9 S- j8 ]; G; O
  20. MePort lightsensor_6(6);
    ( J5 x' b: ~, _: p/ `' K* z0 f
  21. MePort lightsensor_8(8);8 }1 c6 ~8 K( [. _6 S+ ]. V
  22. MeDCMotor motor_9(9);" x% @0 I5 b! x1 f, M3 E! o0 {' T
  23. MeDCMotor motor_10(10);+ k% s4 I0 W- U* E4 M4 a. t1 p
  24. unsigned long previousMillis = 0;- d1 ~$ I# V& D4 N( J  S
  25. const long interval = 1;$ n, t  `( ^4 u8 N
  26. ) O. f. w2 S% l0 ^
  27. void setup(){
    ' t4 S; v% Y1 w9 Y3 }
  28.     lightsensor_6.dWrite1(1);
    ) b# `, j( A. I5 _- C/ l
  29.     nPower = 160;$ B5 S3 q, k4 @
  30.     Error=0;
    ( F9 S7 ?0 u; [* }/ I
  31.     ErrorAcc=0;
    2 M$ d  c0 l0 H, P
  32. }
    7 I* v/ H3 O6 R; O8 K8 K8 T+ |$ r. S5 V
  33. 3 q' @; F; {# B3 R" m
  34. void loop(){" W% Z. r* J) E- j" k. O8 n, d
  35.   unsigned long StartTime = millis();
    8 l, r4 V  X8 u, \5 [
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){
    + X2 }# G9 m/ U  @
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    & r+ i, r; L2 I0 W) x
  38.     ErrorAcc +=  nError*Kd ;
      k! r4 X( @; i
  39.     ErrorDec -=  nError*Ki ;
    . O. _+ l7 p# h1 Q4 |/ S% f6 [
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);! M- m+ ^- l) x+ @! Y
  41.     if(nError < 80 && nError > -80){
    ! m3 J% l  G" S& F
  42.       if(nPower < MaxPower){
    2 A0 W3 j5 b& ^, X+ _* P
  43.         nPower += 3;4 D2 O! z% ]8 ?! ~2 j4 T2 O
  44.       }7 [1 [9 g5 F8 H) ~
  45.     } else{+ i: m' J% ~3 G0 I# ]/ A
  46.       if(nPower > MinPower){# l* k, [, g, B: A; }7 C1 X: @
  47.         nPower -= 2;
      j% d0 S/ w7 i* R+ j; S: I
  48.       }" C9 F) k5 j  h: T; _8 o
  49.     }
    ! X. f* Y$ ~7 T4 c6 g
  50.     MotoL(nPower-Error);0 W; _7 `9 X# J- H7 ]) `
  51.     MotoR(nPower+Error);    . v# [$ K/ I, d& D
  52.   }else{
    # q' s! M/ h! S
  53.     motor_9.run(0);
    $ B, r9 |; k& ~
  54.     motor_10.run(0);
    9 y0 Z, h  U+ f6 w) O
  55.   }+ T, K- `" }+ X6 J8 j8 l! R5 a/ b
  56.   do{}while(millis() - StartTime < interval);
    0 C) G0 i, x1 k
  57. }, j8 Y+ i6 s, u
  58. - O* G0 B& C& b% Q: Q) c
  59. void MotoL(int Power){# J7 Y, v7 \9 U& ^6 n6 o7 M
  60.   if (Power > MaxSpeed){# a4 ^* C& O5 [
  61.      Power = MaxSpeed;2 d+ z, R: d4 q! a
  62.   } ) N  J- g0 D5 J* j" w( N" J
  63.   if (Power < -MaxSpeed){
    , y4 a3 Y+ n' W
  64.      Power = -MaxSpeed;
    " ?1 k( B4 o; d2 k8 P' z/ O
  65.   } * w3 h% J( G" [: ]" e, c& ~
  66.   motor_9.run(Power);2 D3 W2 h( B2 V
  67. }  
    ( J. o: b/ k* j! g# h6 g% ]
  68. $ X5 K) o# i( S+ U. ]/ _8 W
  69. void MotoR(int Power){
    4 \! ~. F: ]: s' d8 |
  70.   if (Power > MaxSpeed){$ z7 p. N/ d, D# t1 |9 h- W
  71.      Power = MaxSpeed;2 R1 K/ W! w6 E! M/ x
  72.   } . t. E; ?$ Z1 W2 o: e. k) p4 m! h
  73.   if (Power < -MaxSpeed){
    3 f3 a  a# h$ B; D' T% k- T1 }! d7 h
  74.      Power = -MaxSpeed;+ U% f0 z; F9 i( P2 X
  75.   }
    # G' q& ?/ u( E( o
  76.   motor_10.run(Power);
    : a0 R- a% G* j9 l$ f9 k
  77. }  
複製代碼
* Z( J3 h6 c9 p2 }
% F0 Q7 p4 [$ Q  y: F: `3 }4 ^: T
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 ! l+ \" m7 F& }5 p+ X4 Y0 a9 G
3 O: ^+ V- U6 x; X$ O7 w6 S
您好,不知是否能向您請教。# N  S5 R! b$ d: }# G7 w
目前和宋修賢老師在處理Ardui Car
5 k5 |& _0 y. Y& Y/ ~0 J3 l雖然已使用較繁雜的方式處理了跑出黑線外的狀況
- J0 T# H% m/ Z0 p- Q
5 o  ^) R1 S" A) u但基於想追求更精簡的程式所以還是想請問一下- b; [/ n/ p8 X& t7 W' I6 c  b' H1 R
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
0 }( p" D; i4 V" X不知道您是否願意教我可以如何處理! \: c& ?0 c- }( V* ?

3 y- I. |( ]5 d1 n* q; V1 ?1 u, ?' c* p+ L
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    ) Q9 o6 ?2 h- J% V" c
  2. double CNY70Val = 1000;
      n# n) j6 i& I+ y- J1 d- ~8 j
  3. int interror = 0;
    ! @! \; [: F& p; a8 V4 V% I5 h
  4. int olderror = 0;+ N8 c( z, L' A. z" s9 ^- b% ^
  5. double values;
    + `6 S9 p6 e0 e6 }" \# z
  6. " Z; y$ q+ j4 k! w2 k1 r) ~$ J
  7. 1 c( Z  w' s0 Y- p: ]) j1 b
  8. void CNY70()# E/ E' L0 V* \, |
  9. {
    ' U* z2 E% M4 j" \) Z* `5 A( a
  10.   valuesRR = analogRead(RR)
    6 L0 F0 U3 D; _$ {
  11.   valuesMR = analogRead(MR);0 i/ I3 y! ~' z* \
  12.   valuesMM = analogRead(MM);, m$ E5 D5 N1 \6 [! I
  13.   valuesML = analogRead(ML);
    # Q5 ~0 n7 ]/ ~) ^$ w
  14.   valuesLL = analogRead(LL);
    : J  q7 U6 p) G+ C' c) W
  15. " V0 Y/ W7 q: T' c+ e" H
  16.   if (valuesRR > CNY70Val)
    , W. f/ V5 J) V4 R7 q+ |9 Z
  17.     valuesRR = CNY70Val;
    7 ~, X5 [% N" {6 w7 u8 t
  18.   if (valuesMR > CNY70Val)
    * V4 i1 S) [# l" N$ \* y: v
  19.     valuesMR = CNY70Val;! X/ s8 \  W% Z+ I2 Y1 q
  20.   if (valuesMM > CNY70Val)
    / ?0 A- }3 T+ B4 d3 d6 {
  21.     valuesMM = CNY70Val;
    2 Y( M6 p, y5 ?: A- F" |
  22.   if (valuesML > CNY70Val)
    " }3 C: V4 z2 t( |9 n
  23.     valuesML = CNY70Val;
    1 k  X/ ~' ~, J5 _9 R+ @3 [
  24.   if (valuesLL > CNY70Val)& }2 ^; `- K1 _
  25.     valuesLL = CNY70Val;1 N( G( W+ y  J! X

  26. 0 B. _$ O0 l( z8 q
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    5 x/ R/ W7 H2 B( _; x9 G
  28. }% N: x1 i- s: L6 \

  29. & E# w( e  G# Q% y% v
  30. void Car()
    ; t; b% f7 E0 K) w
  31. {
    3 k. P$ b- h0 p* U
  32.   while (1) {( F: E7 d% V# G4 P; X
  33.     CNY70();$ X. @* u( t( j1 S- ~
  34. 0 R4 v4 O- {; J
  35.     int error = ((int)values);
    : ~% t' {+ {% M* H, d" M! w
  36.     interror += error;
    : N- {5 x9 i) t9 a+ r7 Q
  37.     int lasterror = error - olderror;& M9 k9 ~- Y8 y5 n
  38.     olderror = error;
    - V" X0 j; m. j! C2 B+ q- S+ o
  39.     int power = error / 5 + interror / 10000 + lasterror;
    - k/ t! B6 D8 ~! U, P% W
  40. ) n& b2 C, k0 x
  41.     if (power > MotoSpeed)& m4 B2 L$ H( G# f. f3 e3 ?
  42.       power = MotoSpeed;3 I" Q) }' r9 Q8 y& v
  43.     if (power < -MotoSpeed), B8 ~6 P1 l. h% C
  44.       power = -MotoSpeed;6 p; F* V$ g2 a% P% o0 \7 M* K/ T0 X% m

  45. ) t5 V' Z' h* X# s# o
  46.     if (power > 0)1 _7 ^0 ~6 ^8 h
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    . v7 b; a) c4 s: s% e
  48.     else
    - x& T4 p$ y% a3 H8 W0 F) z
  49.       Speed(MotoSpeed + power, MotoSpeed);
    ; Y/ y- x- Z/ C1 @0 D5 }  d# b/ `9 c
  50.   }4 M7 |5 @6 F: H* n/ b# u
  51. }
複製代碼

0 P, s  _4 c5 y* d# u4 n
! }9 V& M- t% I- }; M$ }
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-5 19:36 , Processed in 0.023526 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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