|
|
8 N0 s& v! P0 w7 g: ~( N
- #include <Arduino.h>
C% M6 k9 x$ k - #include <MeAuriga.h>
$ s& d. K1 Y* l9 M9 {, H. {% R/ d - #include "MeLineFollowerArray.h"8 q- I$ {9 `2 Y9 E+ P7 u% F
# V% n) V& J" G& O1 _! ?5 H8 n* Z- MeEncoderOnBoard Encoder_1(SLOT1);4 o( \8 n) h z% k
- MeEncoderOnBoard Encoder_2(SLOT2);: @7 j, K8 t* Y3 W: {8 k8 K! g* T
- MeLightSensor lightsensor_1(12);9 b/ r2 W6 ?+ `4 I( X6 o6 e
- MeLightSensor lightsensor_2(11);1 j. H, d# j& g5 R) p* P
- MeBuzzer buzzer;
2 D4 b1 Q3 E# i4 h - MeLineFollowerArray linefollower(PORT_6);
8 s. y2 W+ r6 g: T9 A - 5 b7 d% j Q7 c
- #define Error1 1
z; Z n% Z3 t* n) ^5 O9 G - #define Error2 2 _' {" c# ]6 t
- #define Error3 3
* y+ ^8 k$ G- v& O
7 S# V9 F* ^, X- #define Kp 15! [ L$ {( a- p8 O( j
- #define Ki 0.15+ X2 V/ L7 L8 F4 K7 c* `
- #define Kd 0.03
% ?+ c8 v# i1 |( T* Z; r2 k
: Q- u& y/ ?! G! a$ x+ @, M# y p- uint8_t sData;
5 W! U5 y3 E. l7 p* x - uint8_t D1;+ i% ^. |& j$ ~: L6 A$ \
- uint8_t D2;3 |; u1 R: m2 w2 v3 t2 E( v+ k
- uint8_t D3;
$ B7 q7 C! J: v: `! g: j& w1 M. \3 d - uint8_t D4;
+ e* l" |# d+ L+ n- J - uint8_t D5;& ~7 t) {! o9 x
- uint8_t D6;' u3 N# _2 _8 x( z
- 2 S& g5 ~: v8 h u2 i
- float previous_error = 0;
# ~) `- }( j) u' w: N5 ^7 V" g - float integral = 0;
* A% c* I" t$ L( y& F0 m - float derivative = 0;
! E- c0 E4 J g' s! z! F4 j - int Speed = 160;# g# \6 \3 J. U/ r1 M; B! _% e
- float output;$ J4 g4 b6 ?* h4 T, y6 F0 y
. q% Q, S/ t% Y* n9 o$ @" ]1 j- byte Left;: \, w% s; s' R" J* S, B
- ' \8 [) k8 _% f
- void setup()
9 Q! h& \! h, Y. N - {
+ a; z! E1 b9 S* O& d9 `, M9 m - //Set PWM 8KHz; i( B- ^% T& ~3 N/ q$ U
- TCCR1A = _BV(WGM10);. Q: b5 g3 B$ @" U
- TCCR1B = _BV(CS11) | _BV(WGM12);; f- d+ S; r6 a9 J; f% ?
- TCCR2A = _BV(WGM21) | _BV(WGM20);7 `6 e G# H" x6 J- \4 F C6 r
- TCCR2B = _BV(CS21);! M+ h+ K9 s" U% {9 `2 a) m8 [9 M
- Serial.begin(9600);
8 w' K* E- L3 Y$ }0 }) ? - buzzer.setpin(45);
0 Q4 M. I7 e! V0 L6 ] - }$ [- n9 B3 B6 e+ b
- D# R5 }( F" @) u; L- void loop(), D& l- T5 a9 O* @
- {
. @6 `6 ]% i: Z5 U - while(!((lightsensor_1.read()) < (10)));* |! R5 A) G: M6 O
- buzzer.tone(1047, 500);
' N' H" e; [* w* J - delay(500);/ H( v: p+ W% J) I1 b
- do' v, U5 N; t5 p4 z* m
- {. U! u) t) N: l& x6 l6 N2 l
- int Err = getErr();4 v& z9 r" e% ^2 S, [$ v
- if(D1 == 1)' p) n# h+ o X
- {; t; a0 J9 z" P+ M3 t& X5 s9 T
- Left = 1;; x1 l+ p' @: x: k. v" q
- }, V# L% r. H9 [/ H0 @8 E5 b7 }
- if(D6 == 1): Q9 v5 `2 j. z# h0 Y$ r
- {
0 K4 I) R7 Y; S$ r; L: v h% ^ - Left = 0;4 Z- x% D: d- Z" f
- }" m8 | Z: Q& R( B
- if(Err == 99)8 ]9 B% V+ I- ~. S
- {
}2 R: b6 |" [, e& V% Z2 N9 ~ - if(Left == 1)3 ] Q1 ]% [$ q1 F8 R, o5 H: @& v
- {5 W# _* y2 {. P4 l7 v* L
- Speed -= 5;
% G1 ~2 m& T5 X" x - moto(0,Speed);
* a2 |* d l. \) D% _ - do
' F7 o0 [1 c1 S3 |( b - {9 E- N1 w/ B" s9 U' N
- Err = getErr();2 b* i5 V0 p& H& C1 j2 ]2 R
- }while((D1+D6) == 0); n8 o5 i' h7 Q6 X! [
- }
b' T5 E$ n) C. c4 E - else% t; e& k& d; T3 a& v8 x
- {$ u( L; z2 T, c8 [1 W$ J
- Speed -= 5;
) W) i; q P# e% u$ ` - moto(Speed,0);
9 n* o$ I: c" \ - do
) E0 o5 T. o3 @# E4 [! m" C: m - {/ n/ B+ n, h; y, |% r
- Err = getErr();( l, e. y) N* q ?& x( z, p9 J7 {
- }while((D1+D6) == 0);
) m; ?, f- \) _ - }+ V* ]: y4 q( N
- }3 _- x+ n2 I7 E7 r4 R, {9 S# ~/ d! ]
- else/ Q- a% Z3 i6 }+ s& L
- {
8 \* N3 w9 I7 k0 M ^ - if((Speed < 160) & (Err < 2)) Speed+=1;
9 I* y& _/ J4 G+ M; b) `7 ~ - if((Speed > 100) & (Err > 2)) Speed-=2;
# @+ d% D0 K5 [ L2 ~8 G - integral = integral + Err;
% i, x4 y6 j( H - derivative = Err - previous_error;
5 n. V. T. Q- i& g - output = Kp*Err + Ki*integral + Kd*derivative;
?: P8 n3 s8 F4 `7 I - moto(int(Speed-output),int(Speed+output));3 R* { F& ~ g$ i
- previous_error = Err;
& K3 P# P" N. d8 k6 w3 |' h - }: \5 `5 n2 u& s0 b1 Y
- }while(!((lightsensor_2.read()) < (10)));* C- y5 q+ W9 z! M" |$ T
- moto(0,0);
' j, I% i: r! c0 b! g* O$ W - delay(500);
8 w z. Y2 N# J' @) S& ?: H - buzzer.tone(262, 500);
- d: L8 |- d' O: t- M - }
7 Z* a0 D# P$ I4 t - ; u! d6 H4 `4 N/ p# ?9 p. O/ r
- int getErr()
+ B, |/ D, M' p: c% [$ y9 X1 K0 \2 R - {
* h5 C& \, O+ X4 l2 T: v6 t% C - sData = linefollower.getValue();/ ?! U. k/ @% Y" b+ I ^0 c
- D1 = ~(sData>>0)&1;- Q0 Q& c8 c( W- r3 v
- D2 = ~(sData>>1)&1;
, g1 m% j0 B* D+ w+ m8 P( S - D3 = ~(sData>>2)&1;$ z# z( a4 O& G4 F# O- V
- D4 = ~(sData>>3)&1;
7 l. d5 ~% m0 v4 L/ F8 ?( r( W* B - D5 = ~(sData>>4)&1;
. X: K& R( w$ f - D6 = ~(sData>>5)&1;
$ _- {! H; ^: ` L+ V0 F! s) O - int downD = D1+D2+D3+D4+D5+D6;
p. L0 Z. u. i# r# T0 K - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
& b4 E. L+ ?4 x! ~" i: s0 q( i - if(downD == 0)
9 V' @" {" s1 k J$ x: V0 I; A, f - {
* R7 [8 {# E, V; w# Z - return 99;0 a- [, C9 G$ L V0 p5 ~8 [* B
- }
& A+ j% z0 T2 }; W - else
. z- _8 {7 Z) v1 ]9 X* O4 r; \ - {
: H2 S, j9 Q4 s4 d- Q x7 h, L - return upD/downD;+ l; O# ?+ Z- z$ c
- }
/ I! ]! _( a4 I9 `2 U) S - }! ~9 s6 w2 X8 ~9 c, K M
% B& b. P5 |: J+ J) T& H- void moto(int Speed_L,int Speed_R)/ T7 T& c/ z7 [$ J" n, d
- {9 x- x: c* Q2 ?
- Encoder_2.setMotorPwm(Speed_L);
+ E) j; H( T& W! h1 @6 H - Encoder_1.setMotorPwm(-Speed_R);
4 o( Y! D' n# W' [ - }
複製代碼 8 Z5 T% o" J5 W7 ]
MeLineFollowerArray.cpp
5 ?& P v4 e5 b. J) V$ [ l- #include "MeLineFollowerArray.h"
- y1 S! t6 ~. o) F1 m% Z - + i( a5 O; }# m# S
- #ifdef ME_PORT_DEFINED
2 G/ }/ ^# C2 M4 l) Z9 H; j: A1 | - MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)) n4 c9 ^! N$ G+ z+ x* s
- {5 u* L8 A. R# x9 W: D q& |; S
; M Q8 K7 c0 i# y% R- }
( Y6 @! H! A7 Y - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
: ?$ U, B8 W! |; P# U/ @2 h: T - {
8 @+ P$ Q# E5 M6 A - _DataPin = mePort[port].s2;! x S% W7 B; q- Y( N
- pinMode(_DataPin, OUTPUT);
1 f, s7 G$ |0 n2 U$ M% k0 X* U - digitalWrite(_DataPin, HIGH);, Z& H/ o; J w) i P6 z7 a
- }% X4 ]4 Y" k& X1 q$ \& b/ u' S
- #else // ME_PORT_DEFINED
' I4 K5 W7 f. v - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)
# j4 N9 M& v( U; T- z9 C; F - {
& }' ^' ^9 L0 S% s - _DataPin = pin;
% N, Y4 u2 Z# [# T$ t% N; @ - pinMode(_DataPin, OUTPUT);
- Y' ~$ ]/ ?3 s5 O7 e - digitalWrite(_DataPin, HIGH);! F$ u4 l6 K# |
- }
/ A" j# i. O, L7 N, r - #endif // ME_PORT_DEFINED
# e, h# ^% ^& O% h/ L" o
0 \! W" Y9 Z2 a& U' y
; @7 B1 M" \; Q/ f, H- void MeLineFollowerArray::setpin(uint8_t pin)/ @9 e- J$ M+ _9 K, ?0 V' M
- {
/ H8 q7 E8 D: _% G& [5 A9 R3 H - _DataPin = pin;
" `( Y! a4 b8 u4 X - pinMode(_DataPin, OUTPUT); 6 w3 F7 F6 n4 D p& \
- digitalWrite(_DataPin, HIGH);
4 o, [/ }* y% F/ f6 G - : [4 Q, Z! U, c0 x; Y* \
- #ifdef ME_PORT_DEFINED r+ j" f8 w1 X$ j( r" {5 {6 G& X$ {
- s2 = pin;
. n" o$ ^4 g. e+ S, y; l( b+ c% Z4 v/ E - #endif
3 f, C- C+ g% a* I& }4 i) ?/ j - }
$ Q( f9 Y* t! R5 f& {# S# C2 f - . o P# i6 l; |% F7 X2 K, R
- uint8_t MeLineFollowerArray::getValue()6 @, c: H5 `( f6 t5 m
- {" q' b* I& j- U5 d4 u8 R! e( g
- uint32_t LOW_level_read_time;
6 B% k- H& }$ _* N2 k - uint32_t HIGH_level_read_time;
j" Z' z/ X% S' P - uint32_t time_out_flag;/ w" v: @' G: O8 i6 Z
- uint8_t Sensor_Data[3];
4 M1 ~/ q9 f$ }0 {$ y - static uint8_t old_data = 0xff;. y8 t/ d( p7 k: R/ Q
! ^4 q4 b) L q9 l0 L" e- pinMode(_DataPin, OUTPUT);& {7 \; k4 Q, w. G' W u/ E( V4 v
- digitalWrite(_DataPin, LOW);( X. [8 }9 ?5 V8 R4 ~: v6 \' G
- delayMicroseconds(980);, ?6 R& n- U" t! Y( [+ }) {
- digitalWrite(_DataPin, HIGH);! M+ k) A4 T% J& C
( X3 g+ B/ Z* O- pinMode(_DataPin, INPUT_PULLUP);
7 G/ y0 a4 n1 u3 Y - delayMicroseconds(10);
( H; y9 X5 s; ^ - / V) z, J a, A2 d4 {0 Z2 A
- time_out_flag = millis();6 v0 `2 l# }& n
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
* Q# l! ~0 R1 R5 z9 }
' F, w5 V3 n& R) U( |( k7 _- LOW_level_read_time = micros();
, P X- b& z( d - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
Y5 P, x1 y# @4 ]8 Q, f& | - {
}8 K1 O% b" C - return 0xff;+ j& {# N& M/ r9 n& |
- }
$ s. v& e b: o) p4 Z& f9 _, H
5 [+ m9 C3 _' p6 m3 `' g- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );" P0 r) {* b" S# S
- % m, Z+ f" G p- K
- HIGH_level_read_time = micros();
3 Y5 t" y% e' B6 K' }7 J - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level
3 ~' ], c: r3 @$ q* p2 O5 w - : y1 k/ z% G+ N5 W2 }( e
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out: H8 {" o& X- c3 R* Y; \5 n" F
- {, L- `# f C5 `2 U1 ~* x/ A
- return 0xff;
; C/ C! m+ T) q: ^" g - }
2 E. l5 B( [/ r$ I0 h4 u
+ i' s+ F2 ^; y) z3 h5 x; u- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))7 v/ k, r6 |7 _9 h9 U
- {" L+ n2 E* F- M
- return 0xff;" X: R4 d3 ?5 |) T; i
- }
# L5 X0 O) b4 e: z% t( O' g2 A
1 i( v% F$ J- n* X0 d; T, A- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
- F1 E7 s( F$ o* [0 U4 W* j - LOW_level_read_time = micros();8 H/ |0 L: y5 P# B
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level$ q2 d8 c) f& ]1 s) [9 l) N
0 c# o |; E9 b7 x$ E* d3 `# [- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out3 G4 \) p7 o( F. v2 B
- {
9 v4 W' t) [2 v6 ~& m0 E% l' i - return 0xff;
" N2 `. Q$ z( P: \0 F* V- V) R0 T - }
8 Z& |+ _# C, z8 ]+ p7 T, z
/ A* V0 t. E) Q- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))/ W% K8 r9 B- N) S+ X8 @2 S
- { P' L+ N6 O$ H5 B0 L1 k
- return 0xff;
* o8 S7 E) M; w1 K2 ~- \ - }
+ V% q. ^7 z5 k' O7 H' k3 L8 v4 |3 }
" T" o, h0 U$ Y* v2 A2 \- for(uint8_t k=0; k<3; k++)
- H) l, z! i5 D( r$ X0 g9 o2 o - {
1 M' B, I/ C- b% e+ B - Sensor_Data[k] = 0x00;$ o6 c$ c, ]7 g7 m; k% u& Z' `2 K
" [/ c& v* O0 p& _' N8 A- for(uint8_t i=0;i<8;i++)
X( Y: A% e2 ~ q, V9 X& ~2 X - {
2 P1 Y; g% ~6 n, B - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level$ L p& ^+ m: Y! _! k0 d
- HIGH_level_read_time = micros();+ X$ p4 q! ~! Q$ ?
- LOW_level_read_time = micros() - LOW_level_read_time;3 C h+ X. x2 N5 b0 ?2 {
- " A3 Z% Q% V; k' N3 a8 v
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )5 x: y7 e$ l. V s3 ?6 d4 I, @
- {
: Y& l) v1 E. c* L& f7 z! i - return 0xff;; A2 J9 S4 f! v! x% Y& \' u4 V
- }
$ M2 y; {4 Z8 T/ C; c1 ]
c I6 N! S- d- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
0 c) ?7 e" W. @( C X& h0 j8 Z# l - LOW_level_read_time = micros();
5 U& M. W! u' a - HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level7 ~2 z) \; u* W0 E* V8 F6 B" l
2 k) S2 B& g$ [) h' h6 ~& A- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
5 N* i* s. {4 [$ \. E - {
; M$ k2 b# Y0 k2 u" I5 P - Sensor_Data[k] |= (0x80 >> i);
5 g2 E2 d8 X/ d6 Q9 { - }) C% ]" H, L/ e' y! q
- else if(HIGH_level_read_time >= 100)
s, H+ h; t. ?5 H3 F - {
7 {) @8 ]0 K: u% ^ - return 0xff;) O# q! G; W2 `3 l( ?
- }) v$ V9 b& h" [' a( y. v
3 \3 J9 d- k+ j5 V% {+ p- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)0 {' k( N& z( e" T; \5 E
- {! e( h ^1 G/ r" g3 O
- return 0xff;9 \! \( L( U0 m5 u$ q
- }
1 L0 M( f- a# c& \: M8 H - }- _$ M) F% ^$ M; f# p
- }# }. ]3 e, B0 T+ X; F
- . S1 l; \$ c2 Z
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level7 g, p$ s+ R% A( h- _6 O
- HIGH_level_read_time = micros();; e4 D' G& e/ K z7 i
- LOW_level_read_time = micros() - LOW_level_read_time;
3 f2 g# f5 y E8 X, c3 \
3 X- R0 ~7 Y! M" s- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )5 ^. u: @' G0 [
- {
- i; c# X! R; d8 G. t. f - return 0xff;
9 P* ^# Y+ }& B - }' b9 {$ Z/ b% a1 l4 s$ r. N0 o) a9 y
- 9 E% @- o @8 ^5 ^3 n
- pinMode(_DataPin, OUTPUT);
/ X0 M) n0 J* l3 U* \ - digitalWrite(_DataPin, HIGH);- Y7 D' q( D, c4 H
- F" {! \" o& [/ t
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))9 F9 i! D3 _* S
- {
' H) J) R' h x" g# q5 J, E% J - old_data = Sensor_Data[0];, p3 E# F" a) U5 I! \5 k
- return Sensor_Data[0];- L# W) ^+ f2 L
- }* Y* l1 {& C+ Q9 W% ], v8 q
- else- x2 J% x! Z6 p9 {7 U r- U( ?
- {/ y3 X3 u' `6 x, L/ R- j; c
- return old_data;
# P# c4 s z& l1 q) h$ o - }! W) E- s% Q# C9 k
- }
6 k$ h5 `! U# `! j
複製代碼 5 \, A$ H% A$ ` p6 S2 Q% l
MeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
) ^# ^5 d' @& `$ g3 ?
9 l$ K! h4 S/ O4 o0 P- f
|
|