圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 21788|回復: 3

PID 循跡自走車範例

  [複製鏈接]
magiccar 發表於 2015-3-31 12:45 | 顯示全部樓層 |閱讀模式
  1. #include <Arduino.h>: P3 R' ?3 M3 N# o* Y
  2. #include <Wire.h>
    + ~4 Y! x9 r! c. }
  3. #include <Servo.h>
    8 F* l" Y7 _* p8 l/ I
  4. % v" n+ K& i# O" Q
  5. #include "MePort.h"3 _9 Y& E7 z" G+ E* }+ U
  6. #include "MeUltrasonic.h", J( z; @/ _3 m& m
  7. #include "MeDCMotor.h"1 q8 K4 s) T. z* \; V# O- _

  8. $ I, O8 g6 r# I$ r% h* j. E6 d4 v) G' ]* L
  9. //double Input, Output ;
    % L, L9 w9 B7 g+ p& S% z: ]
  10. float MaxSpeed = 255;
    6 V9 R, U3 G7 u3 E) l
  11. float MaxPower = 180;
    4 T0 }7 I2 b# \- a" ]
  12. float MinPower = 120;
    ) @' L" f+ ~8 q% X- Y' g
  13. float Error,ErrorAcc,ErrorDec;
    - c; D4 q. A0 `* ^3 c* S
  14. 9 _2 B: B9 N# C9 i
  15. float Kp=0.14;" z% A% Q! S1 z8 p
  16. float Kd=0.00020;//23;! l# X* O3 j' ]6 @5 w% G
  17. float Ki=0.000201;
    & a1 u' m3 v- z, x) h) x3 e

  18. ; Z1 m) ?8 j5 i' `* I% U1 n- ?7 b
  19. float nPower;
    ) o. ]! Z4 p9 |% j, \: _
  20. MePort lightsensor_6(6);0 d8 H/ y3 R/ J  P  k$ q
  21. MePort lightsensor_8(8);4 D* V0 o; Y& z' Q/ _- w- n
  22. MeDCMotor motor_9(9);
    4 \" E+ B( c1 J  y5 L9 R$ B
  23. MeDCMotor motor_10(10);4 B) ^4 X$ K" P1 g1 @
  24. unsigned long previousMillis = 0;5 T/ i6 ^" ~' [. l$ ^" s
  25. const long interval = 1;$ O& m1 k: F8 l7 F+ B6 C
  26. * K  O& y9 g/ m  X2 |/ v) b2 x
  27. void setup(){
    " F& i! i: ~/ _3 P
  28.     lightsensor_6.dWrite1(1);
    & s0 G8 M8 ~5 `) B- y
  29.     nPower = 160;
    3 a0 |. w$ A. I3 B, T1 u, Y5 Q
  30.     Error=0;
    / S+ j# D' p( k- s( b/ O( u6 S
  31.     ErrorAcc=0;
    & {0 [3 L$ Q, y" ~( p' ?
  32. }
    , X7 ?- f) U# ]. m# F9 D! x/ w9 G- z
  33. : Y+ @. h! M' A* y
  34. void loop(){
    ( J- v  t) M4 U1 T) y
  35.   unsigned long StartTime = millis();
    8 X3 g$ H  |& g7 c, C
  36.   if(ErrorAcc < 18000 && ErrorAcc > -18000){& F2 y# S, {! @4 K2 v; x$ x4 D
  37.     float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
      g5 \; v7 C- S0 r# m, S
  38.     ErrorAcc +=  nError*Kd ;
    * m+ m. T8 K: m4 [
  39.     ErrorDec -=  nError*Ki ;+ ]5 h' I$ p( o
  40.     Error = int(nError*Kp+ErrorAcc+ErrorDec);& l- i5 t2 S0 e: V$ l; \+ j
  41.     if(nError < 80 && nError > -80){# u) M$ H) {) E( Q' ^" \; S% r
  42.       if(nPower < MaxPower){' B9 t1 D  X# l2 l5 [
  43.         nPower += 3;  d3 I% S# \) H: I' B( q5 V8 f% Y4 J' K
  44.       }
    0 j+ W8 E2 ~; }: T! x
  45.     } else{, P8 A0 ?6 I8 V6 {2 t  K  I. _' j
  46.       if(nPower > MinPower){5 I; E1 t! @" i4 o
  47.         nPower -= 2;
    9 G5 _! {. O2 L3 e3 `  ]
  48.       }
    ' `$ y8 C1 S. [( n' @
  49.     }
    0 H$ u2 a1 e" N+ c7 m7 T* Z7 C. i- B
  50.     MotoL(nPower-Error);
    1 ~% I2 a8 ~0 u
  51.     MotoR(nPower+Error);      D9 F; i  `; c+ s& M! l
  52.   }else{* Q4 p8 \$ W  @5 F9 s& M  d: u& p
  53.     motor_9.run(0);
    / l, `2 e% ]: a9 J) j
  54.     motor_10.run(0);4 ?1 Z3 G4 W2 A8 G% X  C, l- ^* C0 O- D
  55.   }7 T/ A2 q5 M8 W3 ?0 u) u
  56.   do{}while(millis() - StartTime < interval);
    ) O. F$ u7 ?! Z9 F: s% {
  57. }
    6 e% M; t) M+ Z
  58. 6 c% X! w1 t, U% F) `( E: |: Z
  59. void MotoL(int Power){
    ) m& F+ m: u/ ~! c0 v" s  E
  60.   if (Power > MaxSpeed){
    # K( A8 w# e% q' I
  61.      Power = MaxSpeed;2 C5 k. X' C9 }; q
  62.   } 4 F  p/ s& O6 s
  63.   if (Power < -MaxSpeed){
    . J) x" G/ h0 s" h& |5 E9 w0 b5 o
  64.      Power = -MaxSpeed;
    5 E  n* E+ U/ I* P/ M
  65.   }   ]  b: e+ _! {6 `/ v5 {( U
  66.   motor_9.run(Power);- I$ z4 k9 ]4 S* Q6 b4 ^
  67. }  7 ?' y; R) i8 h
  68. 3 u0 }, R- a* F0 n3 }  t/ ^! M  c
  69. void MotoR(int Power){
    * G7 x* r, z$ N3 o. I# N; O
  70.   if (Power > MaxSpeed){
    * k' p. S- B8 o1 \  S
  71.      Power = MaxSpeed;8 A& t- h- }9 [- @) _: s! r
  72.   } % c  X" ~2 w3 C' Q. h+ L
  73.   if (Power < -MaxSpeed){3 M  S) g4 a9 g$ I6 P" ]
  74.      Power = -MaxSpeed;9 c- l5 K2 d/ o0 _
  75.   } 1 q+ c7 ?: _8 D+ r5 F
  76.   motor_10.run(Power);
    , u: \7 T# P) f2 c4 q
  77. }  
複製代碼

/ m- U# ], ~% f; I# c
4 a% C! Y! T- d0 r+ f
Shiichi 發表於 2016-3-3 13:47 | 顯示全部樓層
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
/ u5 |! v' D' D; K; o4 r. [
" ?! |1 \7 A; ~6 t( a% h您好,不知是否能向您請教。& G! p+ K' _7 X
目前和宋修賢老師在處理Ardui Car
+ |9 d1 Q# u5 g1 x雖然已使用較繁雜的方式處理了跑出黑線外的狀況) i( p  I# P8 U% q, F, }, ~  }
( p) f2 \# f5 M7 @/ D. o) h
但基於想追求更精簡的程式所以還是想請問一下  u2 Y* W8 L5 Y( u3 s
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
2 [( {* w" Z4 s, a不知道您是否願意教我可以如何處理
$ b2 C4 Q8 T: a* G  _, V+ g
+ r& q3 u  \) L- v5 R# L! o; q2 T. f  j. g" {+ g4 M+ q
以下是我挑出我一般寫純PID控制的Code:
  1. int MotoSpeed = 250;
      [# p1 M- o) t" ^- w5 Q
  2. double CNY70Val = 1000;
    1 D- Z6 y$ O; C2 b8 j
  3. int interror = 0;( F9 @% D" v, I5 }7 z1 d1 p7 R+ }) K5 H! {
  4. int olderror = 0;+ H+ k1 I2 J) H) u
  5. double values;8 b( ^, M* o( u4 D7 z! m! |
  6. & V9 K' v6 G* x. F+ I

  7. ; p+ n9 t3 {  @$ y
  8. void CNY70()
    4 U3 F1 a( i) K
  9. {
    / c' v/ F1 I0 n$ ], |% S
  10.   valuesRR = analogRead(RR)! j5 L5 E7 S- F; E$ p
  11.   valuesMR = analogRead(MR);: E; G$ L" ?  b4 h$ L) W/ S& v
  12.   valuesMM = analogRead(MM);1 q5 t$ A: p2 ]1 r
  13.   valuesML = analogRead(ML);
    7 x& x  D, [4 B- X! a
  14.   valuesLL = analogRead(LL);: ?+ b1 u) x8 D" k' O8 ]

  15. , s) N6 Y: u  Z0 ~0 k
  16.   if (valuesRR > CNY70Val)
    3 v1 x8 J% `0 h$ F6 P# g  Y
  17.     valuesRR = CNY70Val;' ]  [! ~% Q* o" ~
  18.   if (valuesMR > CNY70Val)
    $ _, o5 p% v! y: V- |
  19.     valuesMR = CNY70Val;
    * w# A) T) G. A* x$ |3 \! @
  20.   if (valuesMM > CNY70Val)
    $ V- o* I# K% b1 {! B
  21.     valuesMM = CNY70Val;
    $ M0 d1 L* s, Y
  22.   if (valuesML > CNY70Val): @& ^+ O" ]8 C# @! w" h
  23.     valuesML = CNY70Val;
    9 U3 `: W5 [% p2 D
  24.   if (valuesLL > CNY70Val)/ x& d' n" e- m  S
  25.     valuesLL = CNY70Val;4 G$ v9 f% T, Q
  26. / Z- h) D  L8 a* R
  27.   values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;% o" T$ r' ?3 [' m% `& c4 s  }9 U0 g9 W
  28. }
    + S3 Z3 F) }; z2 z

  29. - P. Z3 U5 y1 `0 o
  30. void Car()+ N; h9 \+ g* T( f. K9 Q
  31. {# l+ o" b! ?; d  z) N
  32.   while (1) {
    4 W' B! d  c$ M# j
  33.     CNY70();/ ^- A2 Q! U" ^) ?! B0 }
  34. 2 C6 x: j% R$ w2 O
  35.     int error = ((int)values);3 ?: u2 M: l# z. A
  36.     interror += error;! \4 R" L, z% Y
  37.     int lasterror = error - olderror;
      k! ]% I/ _2 l; W8 g9 R3 h, _+ X& N
  38.     olderror = error;
    ) S. E0 r. }4 V
  39.     int power = error / 5 + interror / 10000 + lasterror;  R% ?: `. ]% y' n! V% H
  40. 2 C' p2 ]( N5 e4 a) c
  41.     if (power > MotoSpeed)6 I( i, d, f3 T+ @+ A" y  o3 G
  42.       power = MotoSpeed;
    / {9 _+ c7 X* l$ b- p
  43.     if (power < -MotoSpeed)9 ~8 Z' |0 j8 D3 O
  44.       power = -MotoSpeed;
    0 F& c) w$ A& a; \, d8 y" g
  45. & g1 M- z& s# @* \/ M3 _# T
  46.     if (power > 0)! V& q/ ~0 m$ j: f: `- P
  47.       Speed(MotoSpeed, MotoSpeed - power);   //馬達動作,正數正轉 負數反轉。
    ) c, y* w+ s2 \5 _  h( Q6 s& n
  48.     else3 J* K$ M6 U' ]$ a, c  n& \5 |4 G
  49.       Speed(MotoSpeed + power, MotoSpeed);  G2 j8 x7 q' V& C; A: L
  50.   }
    + n7 _- w' N/ m0 A
  51. }
複製代碼
# o8 D/ a. o) l; h

0 n. r$ l8 N4 i0 j' Z
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

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

GMT+8, 2025-11-30 23:32 , Processed in 0.025990 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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