圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21821|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    ' e2 m- ^* p3 Q1 ?
  2. #include <Wire.h>
    1 q6 |  x! S- i1 p6 M# t' N+ I9 p; {
  3. #include <Servo.h>
    9 f4 _8 r1 H# V4 Y! b- G5 p

  4. ! Z  w3 A! V# y2 i+ [
  5. #include "MePort.h"
    % A% W& l/ h6 L5 ]0 w
  6. #include "MeUltrasonic.h"
    5 ]1 o8 e, k, A5 H$ C" P% }
  7. #include "MeDCMotor.h"
    " J6 i5 a" i& g
  8. , C# I; [0 D3 i3 }& ~: x. i2 e
  9. //double Input, Output ;
    ( ?  D% H1 m" c: V, Y; M+ ^
  10. float MaxSpeed = 255;  t- c7 t6 F" g
  11. float MaxPower = 180;
    7 \" }9 C. f9 S, g! B
  12. float MinPower = 120;/ {* j8 @* U& m
  13. float Error,ErrorAcc,ErrorDec;
    2 t# K+ Z& ?* f% s3 ~
  14. 2 p$ V4 W( u2 T& ]' R
  15. float Kp=0.14;% Q0 ~9 [3 E( U) T3 k7 o# H
  16. float Kd=0.00020;//23;; m1 y/ m7 T7 \/ f+ t. J
  17. float Ki=0.000201;# O8 D( \5 U3 {% k$ `, A+ N
  18. ; @  O) L& M  Z) o8 ^
  19. float nPower;
    1 @5 X8 J+ X* Y& N
  20. MePort lightsensor_6(6);( t9 Z* ]* t" x  v9 j
  21. MePort lightsensor_8(8);- j! z* Y* J3 C
  22. MeDCMotor motor_9(9);
    ' _2 ^, @- M! V
  23. MeDCMotor motor_10(10);/ v# G3 j' R6 M8 H( q# G  z1 N5 c( e
  24. unsigned long previousMillis = 0;* j$ ]- D8 m2 l( c9 j2 `
  25. const long interval = 1;
    # Q! k1 J. k! B
  26. 5 u2 B' a: h/ I3 n8 Z  a8 ^; F6 u
  27. void setup(){+ @& k# i, [# c- c; c
  28.     lightsensor_6.dWrite1(1);
    & x5 b8 H9 z4 ~8 ~' `
  29.     nPower = 160;* K( }+ {$ [" `/ }% H2 `
  30.     Error=0;
    ! B; M' p% n  a6 i( H
  31.     ErrorAcc=0;$ M( R, q+ Z4 u% D) z% D$ w
  32. }
    " c- s% l. Q0 k
  33. . i$ R; M' s. `; h' A0 y2 _1 t% a
  34. void loop(){5 \% K2 C# m7 A- L$ P# h; t* ^
  35.   unsigned long StartTime = millis();
    ' f$ T$ Z. T) V# h. s1 @5 g
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){5 ]" ~8 L2 y6 g/ J1 a
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    ) [% C3 Z0 D, q2 o4 ?. L
  38.     ErrorAcc +=  nError*Kd ;- o- k# [; D& a# M
  39.     ErrorDec -=  nError*Ki ;
    # q) F7 J0 {: |$ M
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);
    - b# ^9 W! a+ s4 B
  41.     if(nError < 80 && nError > -80){0 n0 W3 a/ ~" G( O- E! J
  42.       if(nPower < MaxPower){2 w9 ]" _  f7 F1 S
  43.         nPower += 3;, l! m4 m6 O4 a7 n( j# n  t
  44.       }& f1 t7 L* J6 v0 Z. L
  45.     } else{
    * X& N2 F' h4 N6 a6 O
  46.       if(nPower > MinPower){& q7 R. y1 m$ `& D
  47.         nPower -= 2;
    # O2 G# I7 v  T; [
  48.       }2 T; K7 z& Z$ @. A! |" R
  49.     } * F: P+ E, ^; |2 Y; R8 Z- P; A6 [
  50.     MotoL(nPower-Error);  {+ a+ t) X  H) d" ]+ L, Y
  51.     MotoR(nPower+Error);    5 C, Z& a- {2 Q( A
  52.   }else{1 Q$ l4 H& t. E, D- a$ E+ ?
  53.     motor_9.run(0);  n: H  R7 p0 ?
  54.     motor_10.run(0);/ C- ^5 H& Y! g5 f* G# Q& _
  55.   }) H! K- [3 r) H. M, t
  56.   do{}while(millis() - StartTime < interval);  i7 Y/ _0 g1 X2 s6 a8 Z& l
  57. }
    5 M3 b/ L( q2 h  Q, h
  58. - c. g9 m! `6 s7 z/ o( @7 c
  59. void MotoL(int Power){% I. F+ P/ M4 U$ `2 N$ M8 V
  60.   if (Power > MaxSpeed){
    % X* }) e/ x( v5 `$ n- t
  61.      Power = MaxSpeed;7 @8 x! n# b+ N( [9 a0 I
  62.   } 7 c' S. K2 m3 Z
  63.   if (Power < -MaxSpeed){9 A  `# X. s, @: Z( a
  64.      Power = -MaxSpeed;1 _, H: R: K+ Y0 a
  65.   }
    9 n: L' w$ w8 M4 r) \
  66.   motor_9.run(Power);
    9 K& L4 `% K2 u7 \, A4 F
  67. }  1 @. {- y- |& m- {/ B+ W9 q

  68. . [' A" E# [1 c0 o. h5 s1 {( u
  69. void MotoR(int Power){" T6 m* _  Y* v5 p
  70.   if (Power > MaxSpeed){4 ]9 M+ X. s0 ]
  71.      Power = MaxSpeed;
    0 ?5 A; t5 W' e
  72.   } 8 Y# a, N4 D# _& L0 P) T. d; y2 w2 m
  73.   if (Power < -MaxSpeed){& f5 j) g; _( F1 q- p  O
  74.      Power = -MaxSpeed;
    - ~6 R0 }$ d$ P$ R! c1 L
  75.   } " s: Q2 ]& m- R
  76.   motor_10.run(Power);  p: b+ ?/ Q2 c7 e
  77. }  
複製代碼
- B  Q: X1 m5 B  ~, j% B: M
- W- F7 Z; [+ Y! i
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯 8 a  J5 C% h6 k: c% i' H
# A% T4 d* D; v
您好,不知是否能向您請教。
% ~. P. Q& N+ y% U" P8 o/ p目前和宋修賢老師在處理Ardui Car  ~8 ]) I! x+ O1 t! a/ S
雖然已使用較繁雜的方式處理了跑出黑線外的狀況  Q2 t- Y. e# \5 B8 q) F6 f) Q# b, v

: r, |% s! O/ z; J- D. X但基於想追求更精簡的程式所以還是想請問一下
+ w7 _3 H& T/ ]: o, m' G就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
# i4 g' }9 P2 z: W不知道您是否願意教我可以如何處理* [) e+ Y) |  z' p: p4 c1 K

$ O, O0 A; v1 `9 R* F7 x6 b4 h* [  ~( ]* q/ l; a) S2 ]' {2 I
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;& T" E3 w9 Y2 E2 s
  2. double CNY70Val = 1000;1 x. K8 [+ r9 R  P8 i9 a0 a
  3. int interror = 0;
    0 D  Z5 {1 q1 n3 L
  4. int olderror = 0;
    ; c0 b' Q4 w+ f- T1 R5 T9 A. u
  5. double values;- k1 T- T4 }5 y

  6. 0 {" A% i/ |& f1 B1 Y

  7. ) Z$ `0 I$ l' y' ~6 \6 _
  8. void CNY70()
    ' y% e( q, _1 @
  9. {
    5 N9 P! c5 s* H9 `- B1 n
  10.   valuesRR = analogRead(RR)
    * N, ?# g6 h: D! M/ `. h
  11.   valuesMR = analogRead(MR);
    ; L4 w9 p# t7 L- C5 j, `
  12.   valuesMM = analogRead(MM);
    " y  u# h" ?5 K7 z) N
  13.   valuesML = analogRead(ML);
    % j  G. Y, T  [' ^. ]$ f$ @: j
  14.   valuesLL = analogRead(LL);
    0 C) p7 N* D4 a3 o; Y. E

  15. 2 C. X; j- K5 u3 ]3 x. G
  16.   if (valuesRR > CNY70Val)
    ( Z, \. W$ M7 o8 C$ q
  17.     valuesRR = CNY70Val;
    7 N+ E0 A: |0 S2 s, p
  18.   if (valuesMR > CNY70Val)0 Q$ a5 A0 L# f) O( K( b/ T- a$ N
  19.     valuesMR = CNY70Val;
    5 y1 B& O$ e8 N+ Y
  20.   if (valuesMM > CNY70Val)
    0 x( P5 e% N( h9 k7 E* M2 R
  21.     valuesMM = CNY70Val;
    - E- o' |( u4 l
  22.   if (valuesML > CNY70Val)
    1 I5 U- T, l) L" [7 D' @. f) p! W- o
  23.     valuesML = CNY70Val;
    7 W) i: `1 ~; x# ?
  24.   if (valuesLL > CNY70Val)5 k# f2 y1 I( v
  25.     valuesLL = CNY70Val;
    3 ^) A5 }2 m/ l$ o$ d  H

  26. / c5 X% \2 H6 \# n6 o* R6 W
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    0 g8 Q  r- Z7 n& A" v" \' A
  28. }6 }7 ]/ A! _  r' V" h; _- B
  29. ) I+ K7 @: [8 Z6 H7 ?
  30. void Car()
    % q1 V, }, n. k1 |2 g+ C) {9 r
  31. {
    4 x0 I# T' ~- W" S9 p5 d
  32.   while (1) {2 ?3 e( _, o( H, |) a
  33.     CNY70();
    0 q4 W9 Z! U+ H( a+ F" U8 ]

  34. " g9 k. R5 }9 e
  35.     int error = ((int)values);
    3 F. F9 b9 ^% q' l" o" w1 E
  36.     interror += error;4 U5 u. K* j8 L) _2 @
  37.     int lasterror = error - olderror;  W/ s+ U: N# m. Z, _
  38.     olderror = error;
    / q/ A2 l! Z% e8 h# {
  39.     int power = error / 5 + interror / 10000 + lasterror;8 i4 U1 o3 b+ |- O( R6 K3 v

  40. 1 I( w$ N3 b) e  ^" p
  41.     if (power > MotoSpeed)
    + }- m( B% R+ [7 w, |/ l; b
  42.       power = MotoSpeed;
    * O5 A: N4 n9 P8 @  l
  43.     if (power < -MotoSpeed)
    ( D& e* v7 ?- _1 H4 p
  44.       power = -MotoSpeed;0 M# c# b# c3 d& Z6 H9 [& A) H
  45. + b$ D' W. [3 }+ A6 Z( I" R
  46.     if (power > 0)
    / x6 I2 j* E/ y7 `1 m6 E; b
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。. ~1 A$ g$ m; O1 u
  48.     else* m) O5 {1 S, `5 f' e5 u  T: t( B
  49.       Speed(MotoSpeed + power, MotoSpeed);8 c( t$ d# E) U4 D" _2 t  v
  50.   }
    & w; K; R& M& l; m2 j; j
  51. }
複製代碼

- T# v& \  n( \$ w- r2 q/ g9 Q4 d; I: u
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-12-3 16:26 , Processed in 0.025987 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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