圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 19933|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>
    , m- Y0 K6 \+ x7 L- d7 h
  2. #include <Wire.h>7 l5 G. R7 i: ^0 Y  a2 D
  3. #include <Servo.h>2 t6 u# V' G5 ~  j3 O9 W1 Q! b( d

  4. 5 F. r# Q& ?4 s3 L5 s* N: |# X
  5. #include "MePort.h"
    % ?* n4 R) d$ a0 F/ F& O2 T( J
  6. #include "MeUltrasonic.h"
    8 \  T" [, m! t4 \/ x) F8 D, M  x
  7. #include "MeDCMotor.h"
    " Q5 R; J9 ~! a: Z# }
  8. / K' o  L$ k, {
  9. //double Input, Output ;
    3 a% y: I7 A, p$ |) C
  10. float MaxSpeed = 255;
    3 c8 ~' I( V4 r8 ^0 w9 b2 z
  11. float MaxPower = 180;' w  g, Y/ Z4 r% [1 i8 ?3 w
  12. float MinPower = 120;9 f1 k/ B+ g8 o* C1 u
  13. float Error,ErrorAcc,ErrorDec;
    & n! N! c/ }+ N0 n7 K4 E9 ~
  14. % o% P) f8 c! G; X' Q% L
  15. float Kp=0.14;$ o$ ]/ ~& ^& v( ?  N5 s  X
  16. float Kd=0.00020;//23;
    ' c; Z, p; _3 R8 {. U
  17. float Ki=0.000201;
    ) ?7 V$ _8 g' ?9 z; x
  18. 3 \- U/ n. T$ ^' w
  19. float nPower;: j1 q- T) X  @
  20. MePort lightsensor_6(6);3 }# a" q. e# o  H
  21. MePort lightsensor_8(8);5 I# c  F2 |' E) |' p, I1 y
  22. MeDCMotor motor_9(9);, Q( a1 m0 w$ ]& n4 l; U
  23. MeDCMotor motor_10(10);9 n5 g2 _% z$ O6 a7 M
  24. unsigned long previousMillis = 0;% Y8 ?' b& a9 \' X8 D5 E- I- L
  25. const long interval = 1;
    ; C( e# ~4 Z0 y4 J
  26. ( ?2 k+ O! `) G& j4 X
  27. void setup(){
    ) z- _+ ?$ }, }7 K
  28.     lightsensor_6.dWrite1(1);
    ) h/ j. F) T9 K
  29.     nPower = 160;! r% A- S) I- m6 L1 C- N3 i6 f
  30.     Error=0;
    * X* w. J' O8 }! z3 j
  31.     ErrorAcc=0;
    * f  S4 I0 t- B) S' ~
  32. }
    % X. l' d$ w- |5 m* ^
  33. % ~2 E0 M& P2 Q! T1 z
  34. void loop(){
    # S: n* a0 ^$ `8 B7 p" w4 @
  35.   unsigned long StartTime = millis();
    / z5 L) s/ }$ W+ P# J
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){# ]% {; }& U+ z
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
    " F/ V" g) W( {  V
  38.     ErrorAcc +=  nError*Kd ;& p7 B4 D2 W$ x' l! @
  39.     ErrorDec -=  nError*Ki ;
    ! m% R7 p; [- F" C. r# I
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);9 J/ k/ K9 q" O* n# _7 p
  41.     if(nError < 80 && nError > -80){
    ' \, p- F9 t  p+ b- }% q' ]8 S) T
  42.       if(nPower < MaxPower){
    1 Y5 d# G6 _& D1 [* B/ L
  43.         nPower += 3;/ a* |6 B- J& q
  44.       }
    ' t" ^% }- m. c. [
  45.     } else{" ~* N0 k4 H' L% C! y7 R6 K  b$ g
  46.       if(nPower > MinPower){
    / _0 _  w8 }# V1 j
  47.         nPower -= 2;# p: c5 V9 t+ b/ t7 p
  48.       }
    9 J% a' q. f, f+ y: [8 T+ `1 p
  49.     }
    . Q- `; Q$ T% b: s; g9 ~
  50.     MotoL(nPower-Error);  ~. `# q- \$ N
  51.     MotoR(nPower+Error);    ! s. {& ]! R, `. J: A
  52.   }else{9 g9 ^2 G+ Q& y2 J- G3 {# W5 S4 {4 Y
  53.     motor_9.run(0);
    / W. b1 `& U/ y( D/ k! C& `& J
  54.     motor_10.run(0);0 h' w+ N, D( F  `7 w
  55.   }
    3 {( P) ~& W" R/ R
  56.   do{}while(millis() - StartTime < interval);
    ' W, `- S  m5 K) F
  57. }+ z6 y5 v) h- M# @
  58. " L, G8 C2 Z( D6 ]  P
  59. void MotoL(int Power){
    $ m8 i2 V) a* n: |3 i
  60.   if (Power > MaxSpeed){$ K  D) e4 @+ a$ b1 v% V7 M
  61.      Power = MaxSpeed;
    1 F5 e) o/ x4 H2 E1 X
  62.   } 2 `8 }7 Z3 L  o5 J. X0 q
  63.   if (Power < -MaxSpeed){
    3 A8 V) U- g8 H: [
  64.      Power = -MaxSpeed;4 H" t: r. R  g8 G$ U9 e$ c
  65.   }   L5 z" U5 I" j0 j4 ?  B# h
  66.   motor_9.run(Power);! P% h0 h, k$ i
  67. }  
    # [8 Y8 R9 g" z
  68. 1 p5 L8 n/ b9 Y' e! o
  69. void MotoR(int Power){6 E+ f$ I/ K9 Y) t6 u) V2 k- \3 h
  70.   if (Power > MaxSpeed){
    9 E" y+ t  h  D( J" ^
  71.      Power = MaxSpeed;8 k6 o& v# s; W
  72.   } & C# }1 y  [: j* j# {# O
  73.   if (Power < -MaxSpeed){3 Q& M5 n" Y& L. ]! A* Y
  74.      Power = -MaxSpeed;$ K5 ?4 o8 B6 t- p+ t/ d, {3 {
  75.   }
    4 \5 }/ \2 r; I4 C: n
  76.   motor_10.run(Power);
      [' `6 l1 m' B! @% G+ H7 \
  77. }  
複製代碼
6 E, d. }* @3 s. P1 `7 Z
& V" s9 y  P6 f0 Z5 h
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
. m. p" [0 b/ }0 C9 C
4 U9 @+ h1 j3 M) N" a: l您好,不知是否能向您請教。
+ k6 r' `, [& p6 z  l: K  l2 t目前和宋修賢老師在處理Ardui Car
& D+ }& ?! ~/ \, c" @0 ~6 ]雖然已使用較繁雜的方式處理了跑出黑線外的狀況
6 j" j! G& q5 k. n. G/ `
' ^9 c! A$ ]9 ]* c: l" |但基於想追求更精簡的程式所以還是想請問一下
' n% q. t3 m- D+ v就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
5 e$ f5 p/ w) C3 |. C: q+ ?: G不知道您是否願意教我可以如何處理# J5 B$ c! I4 k  ?
. C' Q2 g  n' n8 x
1 P0 M- t1 t5 H. }' _
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
    + x+ n% w  G' U- x/ f8 Z; F6 z
  2. double CNY70Val = 1000;: Q' O& M1 V. V2 c, K
  3. int interror = 0;5 n2 m) k# Z$ \) j9 f
  4. int olderror = 0;7 p# _. g$ `8 i
  5. double values;9 S& w9 T  V/ f% o$ k/ N( G+ |
  6. " R" @# M! q4 H. f* \

  7. 2 Q5 q% ?! C, B) C2 a- ?
  8. void CNY70()
    * S- y/ e3 a# _  k( H/ |# p
  9. {
    6 u5 f( W: Z; R5 K  \' G
  10.   valuesRR = analogRead(RR)
      Y) |5 \* H- S3 K+ f
  11.   valuesMR = analogRead(MR);
    1 |/ K! B7 U7 K( O+ t& I
  12.   valuesMM = analogRead(MM);6 C# ?* V8 U. Y7 Q1 d% q
  13.   valuesML = analogRead(ML);
    5 Z2 }+ b* Q( {5 V3 D" }: |4 ^% D
  14.   valuesLL = analogRead(LL);3 V, z2 O7 l% [! r, n. _" X
  15. 6 Y9 k4 R0 e( H( U2 Y  a" e+ t
  16.   if (valuesRR > CNY70Val)
    * @  a4 C3 z3 E* S1 M
  17.     valuesRR = CNY70Val;2 q( L& `  L, X9 m9 n: s" _
  18.   if (valuesMR > CNY70Val)
    - f8 w7 x, d5 C  s2 K
  19.     valuesMR = CNY70Val;
    7 q% `; M( T5 X
  20.   if (valuesMM > CNY70Val)
    3 b; z7 k# X: x1 K- q: u6 Y! N
  21.     valuesMM = CNY70Val;
    9 q+ s9 F" Q# g+ M$ x9 S; m
  22.   if (valuesML > CNY70Val)
    ; }/ t7 U7 b! C' m8 ^+ d
  23.     valuesML = CNY70Val;/ [8 q" `4 b; l. N4 r& H/ o0 |: M
  24.   if (valuesLL > CNY70Val)+ @' {1 z% j) I3 u- ^( I1 Z
  25.     valuesLL = CNY70Val;8 m; S. S% j' o' F/ p- t+ c# D& F) y

  26. % N5 m4 y- _3 E6 D# z- I
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
    % k- N" b$ Y, A
  28. }
    ) z% x  C1 a) _  r
  29. 6 m( s  r; x  f6 F+ J
  30. void Car()+ [. {( f. p$ y  X5 Z& D
  31. {
    ! f; c, l9 _) k* B: k
  32.   while (1) {3 S* _1 ]& d9 d5 x
  33.     CNY70();! a, X6 O* m. ~' w2 U9 ?" C
  34. 9 y1 s, q1 H7 B2 }- B! @
  35.     int error = ((int)values);
    2 r  ~1 I  d9 K
  36.     interror += error;1 g" A- i1 c2 @
  37.     int lasterror = error - olderror;
    ' H# Y- f' j# L- [- u: o
  38.     olderror = error;
    ; c) _1 @  G$ f% k
  39.     int power = error / 5 + interror / 10000 + lasterror;
    ! G5 a  p, x: W* d- S

  40. 5 R+ ~5 d3 E5 I% A" q7 E" D
  41.     if (power > MotoSpeed)$ w0 v& D) _  ^. v. r* j0 W8 ?9 k! _, y
  42.       power = MotoSpeed;# p1 E# W$ _* r2 h3 V: t* O! G! q: |
  43.     if (power < -MotoSpeed)5 j; A2 U1 Y+ o, h2 E
  44.       power = -MotoSpeed;/ X, _  P  n# a+ l1 q" Q

  45. 9 W$ \4 d4 m! d/ x: T
  46.     if (power > 0)
    : ]- G4 a" d. E( |# ~/ ^
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    + ?, l- l6 s, ?; V
  48.     else, g4 M, C- Q9 k$ c9 {$ L. S6 T! f
  49.       Speed(MotoSpeed + power, MotoSpeed);
    % e8 ?! M* }3 P) ?9 @- ~8 o, Z1 ^0 P
  50.   }1 G5 j7 Q' F. s+ I3 z# W
  51. }
複製代碼
6 }" O$ P  E# Q' U& X5 y
* ]8 R& d  ~# \( h: O0 [+ t
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2024-11-23 18:36 , Processed in 0.023142 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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