|
|
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
4 o: D- O8 a2 F+ [
5 v- X' d( I/ e) g, ^您好,不知是否能向您請教。0 ]+ n' O# K+ a: r* K: w3 I+ T, P
目前和宋修賢老師在處理Ardui Car
0 P Z# x; T. j. b8 y- [雖然已使用較繁雜的方式處理了跑出黑線外的狀況" K) n6 l7 ^. ^6 E# L# O2 @
3 ~6 p' ^& [7 \8 T/ M
但基於想追求更精簡的程式所以還是想請問一下
) b& E$ ]7 o9 @' ]) w# B( G就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝 R) t T. _3 _; ~9 C# D
不知道您是否願意教我可以如何處理' k. d( J) K3 u
/ s0 D0 _8 ]/ {# [% n$ ^
; c( ], v2 \+ r; L& p9 J# \0 l4 b9 i以下是我挑出我一般寫純PID控制的Code:- int MotoSpeed = 250;4 Z, B4 b/ O" A& Z7 d) a
- double CNY70Val = 1000;, u% b! y6 [! j% t& l
- int interror = 0;- u1 ~5 i% ?& D
- int olderror = 0;1 G9 n0 \& n) g; N
- double values;
3 D, m! ~: F* T& j - 3 Z& Q5 L! A ~" {
- + E+ a, m3 {' u
- void CNY70()2 x: y! W% G. E2 e( ^
- { o/ W, k9 w, b1 ^. m: s
- valuesRR = analogRead(RR)
4 n. D& z* N3 l* I - valuesMR = analogRead(MR);
, V1 y5 ~ o) g - valuesMM = analogRead(MM);
+ G6 {! E' L, i) p; L" N: S! ^ - valuesML = analogRead(ML);
# A4 a% J, ^. }7 M" M9 C i - valuesLL = analogRead(LL);
$ Y2 ^1 {" P: z
: K. \1 i7 i) B: m. j2 `. x: K# L8 o" H. U- if (valuesRR > CNY70Val); _% n, z+ C+ e3 M8 d) T0 r; A
- valuesRR = CNY70Val;
( L; q: f/ y8 n; j1 F1 P - if (valuesMR > CNY70Val)* R, |3 l: I' U, a
- valuesMR = CNY70Val;
, @; x! I$ L: @5 d5 b - if (valuesMM > CNY70Val)
9 W. Q, g2 M2 f) p5 N V' N5 b - valuesMM = CNY70Val;8 o$ c# s- b" w0 i$ P
- if (valuesML > CNY70Val)
. J) r! s1 ^# Q - valuesML = CNY70Val;7 h) U0 w- o. k. H3 i O
- if (valuesLL > CNY70Val): M( c8 j; Y6 v8 H' V
- valuesLL = CNY70Val;0 @$ n4 t. O6 I
- ; D" a+ J3 c: V" A
- values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
) A- q- b/ J: S: r! ]. _9 h - } o' |' e g1 X
( _8 h7 u! r! s- d4 X) H" R: U- void Car()
, m& ~4 G1 C! _$ }7 ? - {! Z& j I9 U* o) p1 |2 R
- while (1) {
4 g) \0 |: L3 Q' S* H - CNY70();
7 h5 [- ^; l8 P0 ^7 \, s
2 T' M1 H+ S6 Z. S( t4 X- int error = ((int)values);1 l1 Y% q& E. p9 |! Q+ _- p, A
- interror += error;
- f$ _) K! y$ W. l$ T. v# K - int lasterror = error - olderror;
2 t/ e$ w$ H; a; A - olderror = error;
5 B, M. o6 m2 A+ Y, r; V - int power = error / 5 + interror / 10000 + lasterror;
; E$ _2 T, r! v& [
% }, O/ U2 f }* \- if (power > MotoSpeed)0 Q! N' X! d) m
- power = MotoSpeed;: ?) I2 B q1 {! ]$ C$ r- I
- if (power < -MotoSpeed)
" D! h) B _. p& X - power = -MotoSpeed;
* u/ q8 m7 |! t/ A% O - 9 S4 p; s5 g, X4 G" K
- if (power > 0)3 V4 n! F" }9 \; h& ] s0 j( I$ Q
- Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。8 U6 `! O2 ]* I) l
- else
4 X( i: R* v. _$ H( Z! } - Speed(MotoSpeed + power, MotoSpeed);8 X# u/ i) n, h" b9 D
- }+ \) B+ f8 I3 v3 P8 ?
- }
複製代碼 2 t2 c2 I) C: T+ f8 i) Y' b- t
) b. S9 ?7 A, V1 @) k
|
|