|
|
1 e- E# x" J- n/ X- a5 D- #include <Arduino.h>
7 i" d4 E( @5 c8 V4 f3 L$ D - #include <MeAuriga.h>9 s! W# w& Y$ P# F
- #include "MeLineFollowerArray.h"
# f1 h7 z! {+ w A6 p) _ - ) }: [# n1 O+ T# K3 i. h
- MeEncoderOnBoard Encoder_1(SLOT1);
6 m; t) K4 F* i5 N9 O - MeEncoderOnBoard Encoder_2(SLOT2);
, H1 Q5 ~- o1 w8 y4 L - MeLightSensor lightsensor_1(12);
) F4 p' z6 k& {5 q$ L - MeLightSensor lightsensor_2(11);
" Y0 e) W# K) r; l - MeBuzzer buzzer;
0 f9 G! ?2 V: x0 u0 i* ?4 X5 d - MeLineFollowerArray linefollower(PORT_6);* z) L3 y6 k. `: A, @8 |* r
- " T9 Y* h% F! Z% y$ N; S
- #define Error1 1 ?; I9 i: a* A7 H Z" u# h
- #define Error2 2) y: i8 V. k# M c
- #define Error3 3
* k3 c% h4 U- e, r5 p/ L
M% l f# G$ e9 }( r) l; h' w8 ?, x% X- #define Kp 153 c' g0 g" x; o6 @: l5 f
- #define Ki 0.15; L- |- e0 k% I' y9 G9 V1 b( X; g
- #define Kd 0.03' p/ u+ ^9 k- A: H
- " O2 w, Y3 b1 j1 W& a/ N4 O
- uint8_t sData;
: c- _3 O+ Z( W0 K( i& Q - uint8_t D1;( i& w( |3 ?: W+ ]8 \
- uint8_t D2;6 k* ^$ e6 K, _! F
- uint8_t D3;+ q( P. x* l2 v
- uint8_t D4;
, Y; \5 [8 p9 [$ m - uint8_t D5;* b4 Z8 _# C/ J
- uint8_t D6;# N4 j$ k5 y. s- e- L D
- 9 Z8 u. l) L: H: B* L% _" d
- float previous_error = 0;
+ c" c8 n8 h) E: h: D! g - float integral = 0;9 |1 E1 Z! |! J
- float derivative = 0;
c9 a. e' k- \ - int Speed = 160;
0 k; B2 b$ J: l, L2 J O: ] - float output;
& t7 ~$ j$ p: H! j, F u3 Y& k
2 W( z4 K5 x* V3 s. c) A9 a- byte Left;
% d! I1 b: L9 d. E* n
8 e0 C4 X5 K) a$ [4 m6 n8 s- void setup()
# U1 v6 D! O) \4 b( d# A& n; l - {
+ }4 C2 g. [, Y7 ^# R( A - //Set PWM 8KHz- [1 z, f; E% d! v3 p
- TCCR1A = _BV(WGM10);
0 @& i) R. u$ Z6 Q- y% x - TCCR1B = _BV(CS11) | _BV(WGM12);
9 u0 u$ `4 C8 ]( E+ l# g - TCCR2A = _BV(WGM21) | _BV(WGM20);8 z( N1 s3 G: N% l! u+ A+ j
- TCCR2B = _BV(CS21);
2 _; z# P O# a9 H+ _! ~ - Serial.begin(9600);
$ j; t& A4 B& r, j7 P& @% N - buzzer.setpin(45);
G: n1 C) L8 y6 j+ _- v; n$ D - }
; B5 [0 }" M2 E
: a/ P' Q3 D' V8 ~' ^. C3 e6 B- void loop()0 A( r# t/ Q) d1 v/ s9 n
- {
N8 h+ v4 N3 {( f - while(!((lightsensor_1.read()) < (10)));
- L# b& u& ] v( b% I q - buzzer.tone(1047, 500);
- R% x4 o+ P6 _+ Q' ` - delay(500);, k8 L/ n9 H4 v+ \, a- k
- do3 d. v* D* F& |* q
- {
7 V4 R: c: S1 d1 s - int Err = getErr();9 K9 n4 U T s
- if(D1 == 1)& U4 l- T. j8 s- Q C8 Q
- {& x2 [+ v6 X" [& { F! Q
- Left = 1;; R. j1 A, Y6 e$ Q$ H1 k% p- n4 A
- }
, {" b8 y8 a: M2 ? - if(D6 == 1)
4 @( g2 |( x% E8 E0 m - {
. v; n3 W, @/ e- ~$ N/ |9 I7 B - Left = 0;
: N/ b! Z j* @ - }
- [+ f, }3 Y C& j. h, y - if(Err == 99)
! Z! {8 B/ C! @& _! b7 X - {3 \0 E5 d) O3 W$ j. q6 ~4 W H' l* I2 d3 ]
- if(Left == 1)
' u5 A6 D% c) \9 _ - {7 b: T: ^8 ]# s% c; W6 V$ }9 l- v
- Speed -= 5;
( ^' c! s7 w$ A - moto(0,Speed);2 N: I% M+ v4 R4 S
- do# @5 }1 K5 @6 K& \# O3 N( \
- {
5 W4 P$ o: F% o' { - Err = getErr();
. f" i _4 p7 Q# Y- D - }while((D1+D6) == 0);' c* X% x; H# c# Z4 i$ I% T
- }
/ q# g \6 l1 e( I% ]2 w - else
# |5 r2 ]: H" m, j - {
8 C& p1 A# V1 k. H6 A- x: x& k - Speed -= 5;# B( p/ |+ e$ `) @/ |! P! @/ l( U( b b
- moto(Speed,0);
9 z) M. j, }6 Z" j2 G* |" r1 ~ - do( K8 C M: c( ^: U0 E
- {
; Q1 U( L4 M" x1 u9 t& Y5 ~3 x- E - Err = getErr();
) C* f3 X) B7 o/ I+ ^0 g5 J2 U4 @ - }while((D1+D6) == 0);
# O" C: I( h/ ]# X; S+ L - } x @3 S% Z( `3 |0 y6 u5 ^8 t* R
- }
1 n/ E1 M" Q9 N, P q - else
" m( i8 L9 E. ?1 o7 F( b; o' V- x- P - {
4 m- \- v- } f/ I0 L! C - if((Speed < 160) & (Err < 2)) Speed+=1;
: _( p# F9 g8 ]5 E& k- t" i: j. x! W - if((Speed > 100) & (Err > 2)) Speed-=2;
" Q+ n- b: l1 I! Y+ g t - integral = integral + Err;
6 t$ u- m+ B: q& ^5 z - derivative = Err - previous_error;
: ?( ^% b5 j3 J3 d3 L8 O - output = Kp*Err + Ki*integral + Kd*derivative;
' P5 y! Z1 P9 a9 q - moto(int(Speed-output),int(Speed+output));( J; z7 T- W( m6 H7 s; f& M
- previous_error = Err;
5 S& ]" a y# ?1 M- v% N - }" y1 i0 X; S0 t# C) _. p8 x* l
- }while(!((lightsensor_2.read()) < (10)));% U+ e' b; S# E% c
- moto(0,0);
2 @$ ~' w% b+ e6 }! ] - delay(500);
3 y% k8 O' Y$ ?9 y* l. f8 { - buzzer.tone(262, 500);
e. i4 {9 {/ a5 R - }
3 u+ T) ?# \9 A/ m" H8 ]# E
: @& j( D' \+ z/ b% k9 C4 P- int getErr()9 ]0 [3 x$ z6 ~; A9 h
- {
* {% s; _( @0 p - sData = linefollower.getValue();
& h' t2 D3 y' P+ \* Q - D1 = ~(sData>>0)&1;
! U' e l" I3 s. A% D/ r q: K - D2 = ~(sData>>1)&1;7 M. N8 I% G) ?" K/ X
- D3 = ~(sData>>2)&1;
7 X6 D& G2 a! T6 u5 ]$ r5 W5 o4 f - D4 = ~(sData>>3)&1;; D5 e: I* N+ E ?8 j
- D5 = ~(sData>>4)&1;
/ ~5 I/ l$ Y: X! X - D6 = ~(sData>>5)&1;. O$ _6 Q3 o7 b: Y( B/ K
- int downD = D1+D2+D3+D4+D5+D6;
: p9 ]/ X! Y `; Z+ _ - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);6 n: a) m1 M% D3 R7 r6 c! q
- if(downD == 0)
7 J2 N5 Y1 y! o( j6 C8 ~ - {
' t% d* ^! k" d( W1 ]5 [: { - return 99;2 v+ A+ g0 b0 k7 x3 U# V
- }
* d' V: \/ z4 N1 g, w; ] - else
4 E" k4 l7 b# f0 U2 B/ p. l* ~ - {
5 `: K o, n! M* ? - return upD/downD;
/ }: w* O' K ^) z6 o - }1 g: D1 c; @ S" O( G: s
- }+ M; ?2 X0 |) V/ z3 e" O0 b
( Q" U% ]; S7 Q2 ~3 \* j; a. G- void moto(int Speed_L,int Speed_R)
; i' c, g- o" |6 B9 @7 k( F - {
/ _- r. h4 B& | - Encoder_2.setMotorPwm(Speed_L); v8 L J( q! M$ a1 _% W) B# f- G
- Encoder_1.setMotorPwm(-Speed_R);5 r3 H" f: l, {7 c
- }
複製代碼 & V7 F+ @0 z2 \7 Y
MeLineFollowerArray.cpp
7 x8 t0 ?: T) H7 ~0 I. V5 r- #include "MeLineFollowerArray.h"
2 u% @' m/ R) U
' e3 a2 z. t$ U; }4 a- #ifdef ME_PORT_DEFINED5 q. P: v4 v1 g) I& `, u
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
. w; ^' y; }- c" z1 Z - {/ p3 w0 t& q: [5 }0 h# W/ b
- ' l9 p8 h5 V5 c: O, M7 k" O
- }: m' R9 ^' r, v, f# Y
- MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
! g! C0 g( [7 i+ X2 r1 P7 } - {9 G, p8 a$ U2 E$ c: y. {
- _DataPin = mePort[port].s2;
5 j1 L/ ?+ u$ L1 ~% A - pinMode(_DataPin, OUTPUT);
* M0 k4 P7 |1 c& ~ - digitalWrite(_DataPin, HIGH);- @3 A) l ]$ K' m v5 d- ^0 W
- }0 l, g/ q, r7 q1 W$ [0 q
- #else // ME_PORT_DEFINED
8 f9 l' P f4 ]/ |/ e- O - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)6 E }0 D2 p5 U$ W- M; {& Q
- {% h5 J& z& h5 K: Y9 T+ O) J
- _DataPin = pin;
; L+ ~) S3 j3 t$ T - pinMode(_DataPin, OUTPUT); 4 A/ L; m* j: P3 q6 P( r
- digitalWrite(_DataPin, HIGH);8 E: E* g, G( ~$ f1 x
- }
m) o V; h9 B5 g' Y7 J: \8 J6 I - #endif // ME_PORT_DEFINED
/ R6 r$ N) e* _9 I/ P
% w- o s) R# J* M
- b: i1 h" Y; |* A- void MeLineFollowerArray::setpin(uint8_t pin)6 Y6 v$ `! A; v* r& }5 H
- {
# T2 J* ]. U# r - _DataPin = pin;
0 Q& N; g3 V' k4 v. x" u5 d' U - pinMode(_DataPin, OUTPUT);
( _' }' r% X$ H! t% k3 u- N, f - digitalWrite(_DataPin, HIGH);
1 K8 P' A4 s/ t+ x9 {+ k& ]& q/ D - " }' g. b$ o% O t
- #ifdef ME_PORT_DEFINED0 \! H$ Q/ m3 M/ I/ e
- s2 = pin;
3 ]4 J3 X7 }; h# f; l - #endif3 ?+ @' G* f, v; x
- }; y% X- W; S/ C' t( N
- 7 z$ x) [! Q& g9 Y* V% }) H
- uint8_t MeLineFollowerArray::getValue()4 ]5 c3 o, p5 K b! z) X0 R
- {
7 ~: c1 f0 v+ ^+ k' F, e) D( U - uint32_t LOW_level_read_time;% }' a6 y5 b. a1 E6 W. r/ r' `
- uint32_t HIGH_level_read_time;1 D1 W+ [8 q' e) l+ a0 c! N% Y
- uint32_t time_out_flag;, h- U7 R9 w6 r% b
- uint8_t Sensor_Data[3];
. K9 b" p6 Q" t6 J* H - static uint8_t old_data = 0xff;
3 A1 b8 ^$ o. n3 `
( A# R3 b7 {7 a6 Q2 C3 ] F- pinMode(_DataPin, OUTPUT);; I, L/ h% l3 j/ f0 u( a; V* O8 U
- digitalWrite(_DataPin, LOW);
+ x" l0 W% m9 V7 f+ f* z$ o7 \ - delayMicroseconds(980);
/ x9 x: _+ h( w# @& C5 x$ Q, k& T1 S - digitalWrite(_DataPin, HIGH);
. W& Q0 i7 E% F$ ^! v9 ?# g6 _4 K. U - . L3 ~6 p+ F/ }% `) m2 P' y* J! ?
- pinMode(_DataPin, INPUT_PULLUP);
- q5 w" E0 b- W' Q: K* u$ E0 x - delayMicroseconds(10);
5 \ p# a8 U6 A8 A) N' N
8 j; r2 k* _# t; t! I4 w- time_out_flag = millis();
1 a% ]: v4 x. u/ t7 ^, B! U - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
3 b8 _1 Z5 x0 x- {& C+ q2 F - ! V4 w& R* P, B/ v: V) J# V
- LOW_level_read_time = micros();4 l+ P* p0 M) @- V( p$ \
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
/ X6 a% o& J, T6 k' `( F; X - {; [. ?2 n: g* g; p5 G" e9 f( o
- return 0xff;
6 `2 ^% O/ E2 p+ e0 H; v - }! I2 ?& x3 g+ x1 A$ l& |
- / [1 r) Z7 u- A6 N. V
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
/ G8 d! k7 M# t" n
4 f) E' v3 S; V; t& i& M: m- HIGH_level_read_time = micros();5 U1 X5 Z( |" \' F; J
- LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level# M7 u; M. P# C4 }9 @+ L
- & f: P3 g# v( Q1 I# z
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
4 Z. I0 r3 T. N - {4 L- C+ N0 D t; e6 m) f G1 e
- return 0xff;
w" y; R# r( S0 P Q - }
8 U% P; A+ | N" ~1 w9 x2 L- c - 9 G. }: _. e {( |# ], u, H
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))3 n6 `" [7 G& L; u3 U8 H: _. I
- {7 ^0 R1 _" Q3 a$ Z& d
- return 0xff;
( J5 T4 j% T$ \4 q - }+ z. c% E6 a; [) R! d1 h
- 7 w9 c- [& i \
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
; c% @9 r4 M O3 E$ }, M - LOW_level_read_time = micros();# F S$ {/ n+ k4 U% a
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
/ U- }1 I6 Z4 \7 [/ W4 e
9 K# P- y% C* }9 d% \1 C1 g- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
8 h. b0 C( V* J - {
) U, a1 z" t ^) d- j - return 0xff;7 _5 ?- r& m* n9 m- Q, P
- }
( U) o: i0 z) |! h$ M
( j! M: l" A9 b' @- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))
s1 M6 N& ~/ d' O0 Z" n& P2 ` - {% b( u4 m [. G" d* ]- v) O7 }
- return 0xff;, `* Y# k$ X$ N
- }: |6 ]! B: b& }
- ( ]7 U! B; @4 }/ g, c8 A8 @% {" Z
- for(uint8_t k=0; k<3; k++)
3 N1 G C, ^5 n, t - {
4 r1 }/ m' M! S c - Sensor_Data[k] = 0x00;
& }- Q! Y8 u* B, ?% Q4 w- w - ' N' ]+ k& S3 e1 C/ ]
- for(uint8_t i=0;i<8;i++)' ^. _; m; R8 U1 _& I9 v; j; \% b, t
- {
. y' v2 _- h2 Z- p8 p- ~% m$ h - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level% A2 Q( u( h; O* \7 l
- HIGH_level_read_time = micros();, }# M( }& Q" p$ r% m( ^
- LOW_level_read_time = micros() - LOW_level_read_time;
& ^5 ]( Z/ S9 Y9 ] E/ f0 A; }
1 F9 G0 q: s5 [7 Y/ _. D- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) ) J7 T' C, q' }4 Z2 N
- {
5 s- U* G! |2 R; h/ X) l ] - return 0xff;
+ a8 J5 e6 m* s( V9 k - }2 M/ u3 T: q2 p/ j( Y
- ! ~9 `7 t7 Y- i- W$ ^6 S
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );# ]( r% j& L4 Y& D0 Q9 p
- LOW_level_read_time = micros();
9 ?1 g: N, ]( y1 ]% m; _0 _ - HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
" N( v4 m4 ]. Q, N0 T
- Y) _% Y6 J W; ]5 i; U n% C& E- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
" T$ y1 R0 f& e' l1 q- T. t - {
- Y2 t: ]1 V. E - Sensor_Data[k] |= (0x80 >> i);
( X% b$ i3 F9 h4 v9 i - }# R |0 R! t- I# g
- else if(HIGH_level_read_time >= 100)) D6 Q2 h ?; N/ ?
- {
* Y3 y4 ?) J1 X% R/ Z6 S - return 0xff;. u+ Z5 m" k; Y2 Z4 e# f8 }
- }
+ Q5 \8 o; K* d4 a" o) ^2 ]
9 \% q6 m- R/ o$ {0 E4 ~8 z5 F- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)
( Y9 _# d- p! m6 Q& v. z% P5 H% D7 V/ c - {
) k/ u, A3 V. I7 x, u - return 0xff;( S$ d) p O% C2 a
- }8 o& s4 Q$ o- g0 {3 }1 z
- }
# G& X8 w' h2 x) T3 @& G4 u' F) q2 Y - }( A9 g5 b- O1 c
$ f/ J7 V! Y4 j% N8 \1 {( N0 w- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
" J1 K) H. k g7 \ - HIGH_level_read_time = micros();
. R g0 u1 b2 t( |! O" ? - LOW_level_read_time = micros() - LOW_level_read_time;' b7 z. L4 q* ~' {2 ^3 \& b, u
# n* v$ j! m; A/ r# {- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
/ G7 e' |2 S& w' V - {) Z8 I B5 \' z: N
- return 0xff;& k3 m e0 Z3 x& G+ x
- }( |; U+ t9 H$ h" Q, o/ p" m
- ; \; \/ W- u& |3 V) o
- pinMode(_DataPin, OUTPUT);# Y+ k& j. |) @% X4 i
- digitalWrite(_DataPin, HIGH);0 i1 m2 j7 s* d5 @) I; y
- : v! g' H, u8 O7 _/ J4 ^
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))% S! R3 d$ P" \. j+ n, p
- {
( O7 C" x: T# N9 _0 O! G( Q) P - old_data = Sensor_Data[0];# ~ S1 r4 g) U% I( \7 Q
- return Sensor_Data[0];/ B/ _+ i% ?7 X6 x1 W
- }
" S! a7 P, M7 ?. k - else, K- ?$ K) B. s2 k, `' e
- {
' y# z1 Y: J0 K+ Q* l' z8 g0 |# M - return old_data;7 C8 e1 a" U! F- [/ M& X
- }/ n Q# c. U% D9 f N- |" Y8 {1 ]
- }
8 H; Z9 Z8 B; ?8 j9 Z* Z
複製代碼
% w+ _: p. m$ J0 N) |; G! J. TMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
6 M( b) e" X; X6 L5 S! B8 q2 [& \& O: e$ f
|
|