|
|
- R5 m2 b0 U/ g- a' t- #include <Arduino.h>( R- ^/ ^0 r" N# w3 s' X
- #include <MeAuriga.h>& B& a% \+ \4 U9 N
- #include "MeLineFollowerArray.h": I: s% O1 ?' S" ?
- [" ` A) d8 M0 A Y% q6 J8 r
- MeEncoderOnBoard Encoder_1(SLOT1);0 g" ~+ t# M; o! e# J8 r( N
- MeEncoderOnBoard Encoder_2(SLOT2);
& j8 h) N& i( j* }% a" q - MeLightSensor lightsensor_1(12);
( F( w" Q! R3 t0 i& _! i - MeLightSensor lightsensor_2(11);
9 S4 C% Q) t* [: C3 s* l( k - MeBuzzer buzzer;
. T* G2 P" l; d: ?5 j, h7 P - MeLineFollowerArray linefollower(PORT_6);
; g; _" `- ^& C- T* `/ x
8 W% ?0 `+ C( A& _7 Q* B- #define Error1 1
# O; P* Q4 b- o - #define Error2 2
4 d! [9 g. d$ d+ u% ]4 q8 ^ - #define Error3 36 {1 u2 @3 V9 a/ Q3 j, \
- 4 [* ?9 g$ l; c
- #define Kp 15( A! T8 ~7 p5 z
- #define Ki 0.15
8 B: J1 G( m7 r7 J# G6 g - #define Kd 0.03
' X/ }8 L5 F. E3 r) E- E
' T- M4 o1 B: c- uint8_t sData;
" y8 a. a7 N7 @% F1 W& g# N - uint8_t D1;
1 C6 O! |, w* S3 }( M - uint8_t D2;' D8 n2 X, z; c1 V
- uint8_t D3;5 `0 D7 c/ | K' K r- M& H+ |. B/ y
- uint8_t D4;
0 c& x/ e( G$ m+ l3 Z - uint8_t D5;. c% E% i7 U6 Z3 |. \ Q! ]% A/ O
- uint8_t D6;% f( j. O6 G) k; m0 |
- 7 v( l: [' p0 M$ a5 A& C
- float previous_error = 0;
1 g$ q" `* P) o% J0 { - float integral = 0;
8 C8 p0 |. } v& t& p - float derivative = 0;
5 ]9 I0 }0 [4 `) b. S2 a - int Speed = 160;
6 h, o) s. F, `0 U0 l+ [2 ? - float output;
# p. C: t" [, e( P7 s - S2 i% ]5 r8 c" z+ ?: Q0 y k
- byte Left;8 Y" p+ x6 \; ~: H$ I- i
3 N0 I8 f& l" k- r- void setup() 1 M* H" v9 C& P7 ~
- {" Q4 P& ?% E8 y0 m u7 K2 b
- //Set PWM 8KHz
: K4 D5 }% D8 X( G9 q5 Y3 P - TCCR1A = _BV(WGM10);; {( B' \8 P! Y. z0 n+ J/ s# {0 a: Y5 Q
- TCCR1B = _BV(CS11) | _BV(WGM12);1 u4 N6 Q& V) C; z( n
- TCCR2A = _BV(WGM21) | _BV(WGM20);. Q4 x5 W# b" ~2 f! W7 g/ B; i
- TCCR2B = _BV(CS21);6 K! Q, R; d" o7 ^% W
- Serial.begin(9600);
' v# q( k9 K l6 K - buzzer.setpin(45);5 q8 j3 {, f$ o! h) x N
- }
* T; N) T% i4 G3 \8 n3 t) ]! I
- q# e7 j3 \& E) x# C- void loop()
0 q+ K4 |7 Z9 X+ G& U - {
! A* v6 q O' P7 T! n6 W5 s - while(!((lightsensor_1.read()) < (10)));1 A) h+ k+ S1 k* f: w3 Z
- buzzer.tone(1047, 500);
0 a+ Z0 A6 H) }$ O - delay(500);
- G/ M. o: Q$ r9 F% L - do6 F! l9 \" X8 r
- {
6 e ^) l* u" J. f) Z u; T - int Err = getErr();* }: n' K0 d2 U+ D
- if(D1 == 1)9 W3 ?- g# V% A' Z$ Z+ U; U4 R
- {. u2 G: Y3 j/ ?" a
- Left = 1;
8 v: c4 C3 y* i& Y2 g4 n( C$ D$ X - }
4 h/ H* W& O2 G+ q& H7 s* \- z5 p! B) N - if(D6 == 1)
# _0 F$ H& w$ K+ H! b0 F - {& E& u& {8 F/ ^
- Left = 0;* |: s! B9 ]# ?: `) y( ~, L
- }- x( J& C# p* `4 Z0 d, J0 [" ^
- if(Err == 99)
! J) ?& p! {9 K" q; g# z - {
- V, C; v4 t$ | - if(Left == 1)
% q% l V4 q3 Z( }5 Q8 b5 \ - {' Y0 h. _4 w5 b6 o5 W$ a2 m
- Speed -= 5;1 w G9 l; r# V& Q" w
- moto(0,Speed);
X+ q) o) y' k - do T, z' k5 O$ {6 f* C
- {
2 U' Y. P+ [0 _( I; [9 X - Err = getErr();
! ]8 M5 N# r7 t Q - }while((D1+D6) == 0);! y( H p" k& w- U* r7 H" n
- }
) L. [$ M) y; y% p2 z) l - else
8 E$ N( X! ?. }, u1 m - {* K; D( d$ p/ Z# Z7 |8 X0 {
- Speed -= 5;. J1 B* F' s* ~8 C, x0 b
- moto(Speed,0);
8 q3 J* e0 I7 i/ _$ S - do% M \8 r; Z+ z6 l" {
- {' M, {3 Q8 s+ V4 N* p0 V, S9 P
- Err = getErr();, ?( y' h) D r( [
- }while((D1+D6) == 0);! j& {3 d) N) j1 _9 w
- }( v/ Z$ l) f" h$ c3 N. n7 o* C
- }/ V8 W% R8 c, f8 E- M' x
- else
) I) d3 G' H. x4 i; f) A1 d) k - {
+ X8 M0 e' ^5 a" L. v! C3 S - if((Speed < 160) & (Err < 2)) Speed+=1;
5 c6 ]* r. `3 J! \% u - if((Speed > 100) & (Err > 2)) Speed-=2; , A4 ^" {1 c5 _4 [5 \7 f8 a
- integral = integral + Err;
8 E& o' z- o/ J2 S7 Q9 @4 \ - derivative = Err - previous_error;
# u4 c1 p7 K% @+ m( a J: L - output = Kp*Err + Ki*integral + Kd*derivative;5 J8 s! P- N, A: P ]$ a+ T) q
- moto(int(Speed-output),int(Speed+output));
$ N! b4 x$ d9 G - previous_error = Err;! h6 e6 @+ D2 `5 S9 ^
- }+ v8 N# ?6 m# i+ Z7 b) ?0 P1 N2 [
- }while(!((lightsensor_2.read()) < (10)));- S o' c) c+ N# S
- moto(0,0); q8 ]; _$ n+ M, z
- delay(500);
5 {# ?& P. q$ R9 h* d* t, H - buzzer.tone(262, 500);# s8 c6 J6 s9 y0 j) v4 _2 S
- }- @6 I7 M% m1 x* ?$ J# `$ ^/ i% T
( v8 `( K; Y$ y2 o6 z- int getErr(); u( a) @( L& d1 @
- {
/ O0 I* a H4 p* I' l - sData = linefollower.getValue();
4 S4 N, ?2 _) a$ v. r2 D - D1 = ~(sData>>0)&1;
1 A9 a: g1 N- N* K - D2 = ~(sData>>1)&1;
, t$ Q6 Y6 J. x+ }- w; B/ L - D3 = ~(sData>>2)&1;- L# k4 _# B" h6 V0 L N
- D4 = ~(sData>>3)&1;
5 `4 k/ w' s. I( `% d# ] v) z - D5 = ~(sData>>4)&1;6 }- s. k' E7 {& j8 X! L
- D6 = ~(sData>>5)&1;
6 k, J4 \2 {( y - int downD = D1+D2+D3+D4+D5+D6;7 A2 C& s8 Q0 @; Y9 m* o5 e1 Z8 D
- int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
/ Y( Q3 b( ^- ]6 g - if(downD == 0)
" S+ L- i- m8 C4 g- w2 K - {
/ S) P/ A; n7 o6 W1 W - return 99;
0 C9 J, ~' p3 r - }3 ~) q0 J/ d3 ?5 o# R
- else+ I3 V @7 ]9 G" @, _3 }+ f) |
- {8 g3 ` E) t j" D2 u6 C
- return upD/downD;2 Q+ m1 h1 q" Y$ k( z/ [
- }
# f# u1 b7 u' i2 F- c - }
: K4 ]; O1 c( v8 y' V- L! S6 X
$ r: X$ q: D8 A! I- l% n- void moto(int Speed_L,int Speed_R)1 u; e6 r. Q* J+ N
- {
9 Q" \6 Q7 ^; y$ D - Encoder_2.setMotorPwm(Speed_L);/ ?9 ]! [* ~2 V. H3 W" `
- Encoder_1.setMotorPwm(-Speed_R);
4 y j) y9 u! [4 U p - }
複製代碼 * V: h: Z: u- b( o4 ~
MeLineFollowerArray.cpp
; h% T# t( E* B, B, c, _2 X9 S- #include "MeLineFollowerArray.h"! [& c% u* `# {; N" u
- / S8 ?8 v! c( w0 |1 c9 k
- #ifdef ME_PORT_DEFINED) e5 y" P. @% c) t* y4 \/ ~
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)/ v1 X6 @( \% `0 `
- {& R" S; D6 ~ V
, c/ g3 i" O# b2 \0 L- }
/ e6 W' C ?: n; I) d" ~# c - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
# @2 x3 ]% t! L" O+ [0 ? - {0 ] f! t% F- X% d
- _DataPin = mePort[port].s2;0 j$ _$ g1 r) p4 a, F
- pinMode(_DataPin, OUTPUT);
* d8 m$ J- | |9 r( r3 P' e - digitalWrite(_DataPin, HIGH);7 ~" a9 A! j; Q; s4 ^% ~: m0 J. F
- }6 |# Z- f9 g2 l v/ j) N# r7 Y
- #else // ME_PORT_DEFINED
) Y# N/ {; p- l3 M" H - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)8 M( z; i1 l7 q
- {
8 v' p) [$ c. k+ a - _DataPin = pin;" Q d/ w( H& Z, N' x) w" S9 b
- pinMode(_DataPin, OUTPUT);
) x1 Q8 V5 \0 R3 H - digitalWrite(_DataPin, HIGH);- v5 I. r' h) h7 @ t
- }
' d. ?3 h! B! l# D' X - #endif // ME_PORT_DEFINED
4 K7 Y; T3 c5 W5 L: ^
. x3 G# ? [% e/ e* A& M! f+ Z- 2 Y# m4 k! ]: p! b. p" U: y7 L+ ~! ~
- void MeLineFollowerArray::setpin(uint8_t pin), j$ Q5 s7 Q9 }$ ?9 v; X' Y
- {
+ {7 j" k; O S1 _1 s, B: ~ - _DataPin = pin;
4 w) x/ p0 G6 ~, | - pinMode(_DataPin, OUTPUT);
. m {6 z8 C+ L( D0 `; Q" y' U - digitalWrite(_DataPin, HIGH);& _& ]' T1 J: \; H0 [! x
- $ ~* }0 V: R" D2 n' v! ~
- #ifdef ME_PORT_DEFINED
( I0 q/ [% w0 Z+ Q/ W - s2 = pin;/ \* E7 F* ^" s z5 V' X: B
- #endif
: E" O+ N W! y/ m - }! c v* R& A% m( O! k
- 3 o# G0 R# X7 x) _' Z& D% v) U
- uint8_t MeLineFollowerArray::getValue()
: n' A) o( t' l, H, g4 c9 O - {, w4 z1 R$ U# Z, Z; b
- uint32_t LOW_level_read_time;+ N& H1 [% ?% L7 T/ T' ]
- uint32_t HIGH_level_read_time;
5 q4 q* o/ J6 @" }! D - uint32_t time_out_flag;
( E5 I- f( `/ N) A8 Y! n; r - uint8_t Sensor_Data[3];9 e$ l2 X! K3 b+ ~$ x
- static uint8_t old_data = 0xff;
+ u$ R* m9 O- X
: s# F: r+ L: H" T" X- pinMode(_DataPin, OUTPUT);' E# o- X0 Q' f3 c3 V
- digitalWrite(_DataPin, LOW); q5 ^/ f5 N& u, u/ ~" }
- delayMicroseconds(980);
: X! b$ H9 l9 L - digitalWrite(_DataPin, HIGH);9 M8 S& i# F$ a- ^. V+ h
- 4 v9 ~2 F$ d- J; m
- pinMode(_DataPin, INPUT_PULLUP);
8 z; U \- b( n8 u - delayMicroseconds(10);2 C4 k) _: I/ D6 z4 r" \$ a' {% a7 o
$ F& q8 w2 [4 \2 b! h8 C; y- time_out_flag = millis();
F9 g: w, `4 X9 B, C - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );. J7 F, x, ^5 v1 G" r5 M
- * Q8 E' [, l$ {1 q6 O" M
- LOW_level_read_time = micros();
. l) R+ N' s1 S3 N - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
0 {* W7 M, T" y {/ s0 L; [ - {
% Z6 n( e6 q% V" f6 m - return 0xff;# x$ P/ m# _' M( B; z& ^
- }
2 K: z, ^& a: }: f0 e
+ J8 V3 u Y7 j- E8 {- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );4 S, l' x; [+ ^ U
5 f. e) R7 ?) i" E% M- [/ N- HIGH_level_read_time = micros();
' ^" C( J$ p$ a1 P3 W7 t - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level. W9 E) ?# O* N0 F. H
" S- v: e, t6 C+ J# R4 m- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out5 M3 ~) e, u" s8 E) g
- {' Y/ S, l# Q3 C3 W: H
- return 0xff;. }2 y6 ]; L' W9 C3 u0 b
- }! E1 N# z" ]( [3 J6 C$ \. l0 {
( ]( ~* j7 U$ p I7 M3 ]- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
# l0 _, k7 ^! F0 g- G - {
% R6 b3 A, T/ k; x' K% G+ P - return 0xff;
( ?8 e* E# W+ m4 Q, Q - }
4 v, c) P0 H0 b0 w; i
& X" u& U- _8 h j- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );0 w9 l- R: C6 g: x
- LOW_level_read_time = micros();
" ]+ l4 J& g4 J' {: e5 d - HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
, y0 H% Z6 l9 P! y! u, P9 @0 Q - 0 z7 {4 K3 b; v! x% |7 ^
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out# l6 [. R+ ^+ V. d4 n( ~
- {9 D/ }# N, i3 ]6 `
- return 0xff;
; a& _, f. x. r) Q8 D - }
1 r: ? ^2 W6 E
% H' U. o; g, x) n- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))" A7 U. q9 F' R2 a# n& [- U
- {
, h I6 R, @+ a+ [+ V" k - return 0xff;0 W. z# ^0 Y& }; a
- }
6 h) N. j+ |9 T4 M% }+ h/ r' M - 4 h" S" d7 V# s0 G. K7 R
- for(uint8_t k=0; k<3; k++)
6 _0 R- D3 ~$ O2 q4 D w" W( J - {/ D, U) b7 E3 i
- Sensor_Data[k] = 0x00;% ?/ U" I" h7 Y# C8 h' g
( {+ W3 H! }* w- for(uint8_t i=0;i<8;i++)5 ^7 k6 F y( i) A. m
- {
4 l- `: D0 s& B% b2 E - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
+ m: |! d% S) j X* h - HIGH_level_read_time = micros();
, z. f% i0 a" J1 q) n/ k) C$ L - LOW_level_read_time = micros() - LOW_level_read_time;9 D4 d, H' O; x! _* H& n$ w1 Z
. P5 h( P7 R2 W5 Q6 ?+ f- i, q- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
9 z7 f1 z9 E' l% d4 n) D - {. v' c5 a- K4 O7 ^) y7 a- a
- return 0xff;4 f$ y6 g1 z3 u" y- ?& a0 Z
- }
n& Y! X% F& O% e; c
* Z8 }/ d; d9 ~! T4 @* N. I# z- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
5 g7 `6 d1 h* `; G( q8 @% z/ L - LOW_level_read_time = micros();6 n0 J% p, K8 _; _
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
% s$ q' q( C; \, i5 N( z
/ n2 q) h% }3 x7 Z6 _) \/ m* _- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 10 i1 X. }: L5 f; B9 V `
- {
7 |/ ~. l/ Q0 m' p$ O* v$ N# G- a9 M - Sensor_Data[k] |= (0x80 >> i);
2 Y, {+ v" R; W3 i7 q! m, _$ z - }
% T9 g; E1 ~1 C- P5 ~$ B/ U5 X - else if(HIGH_level_read_time >= 100)
- o/ [2 } _" l f; {9 `% q( A - {& \1 u: C3 D5 K( K
- return 0xff;) r, p. g, G# A# o
- }4 z4 L ]3 I/ r1 [9 I: D7 d
- 4 z/ s: T, k! g1 E1 `) p0 t8 e# i
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)% K( E: v& { W% @4 Q
- {/ I0 E" p8 N! k9 T* j5 e$ O& M4 o6 S
- return 0xff;% E* ^& u, ~' ] O, t
- }
( G8 k% L6 z1 C2 G7 w7 x - }# h# B1 g8 X; y3 o4 f7 l
- }
7 a" h9 k& t5 z% S. u - " U, w& Y$ B, K. m2 r
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
2 D0 B6 F0 p! T4 m$ ]5 |/ I - HIGH_level_read_time = micros();
# R5 l, k/ k; w, K. K - LOW_level_read_time = micros() - LOW_level_read_time;
% I7 l) F; a) m% \0 R - ( x9 X v% m0 K+ M# s. J/ a* U* Q
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
8 @3 k' K1 d$ I8 n% b% K - {
7 d4 |7 c! @. i- I - return 0xff;: l8 u! l, G6 ^" s2 t4 ^
- }
$ ~3 U& F* |4 n; T5 F. r - v3 t2 n! a# i- O+ I
- pinMode(_DataPin, OUTPUT);
7 Q& o, L+ l9 K( d - digitalWrite(_DataPin, HIGH);9 @( {* S' Q, t1 J+ I& z' M! @
- 3 G6 o3 w' t7 @) m9 Z" K
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0]))). x& V1 H% Z C7 q7 |4 Y0 n, Y
- {
: p2 Y8 p8 }4 ?8 ^ - old_data = Sensor_Data[0];0 `9 c y& `- f& K
- return Sensor_Data[0];( I- t& S6 O/ ]! ]
- }
9 n' |$ O/ K" i n: |8 X) `2 Z7 Z - else: e9 O( v6 v c, O6 R
- {
. D8 i1 [7 E [" n9 v- L6 o+ G: ^7 _ - return old_data;
5 \* a. v+ w/ @' M: n% F/ R" v - }; {0 f/ G$ S+ _/ B, }5 n! u
- }( T) ~- a3 \) u( B# p
複製代碼
2 ~: N6 o" u' W& [8 l' ^! T- Z* eMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
3 a7 u6 H9 q$ t- Y* \' `* V, w6 _$ C( i0 w
|
|