|
|
2 w; |0 N3 ~1 T* F/ K" m
- #include <Arduino.h>" l/ n% f- V; C( c; K
- #include <MeAuriga.h>1 G7 r4 Q2 D) ?" K9 q! j
- #include "MeLineFollowerArray.h"8 m/ Z: q4 d: P3 H% Y
: I; S$ K9 N3 ?( u$ R; v* J' H- MeEncoderOnBoard Encoder_1(SLOT1);0 l T+ _- M! G5 _; X
- MeEncoderOnBoard Encoder_2(SLOT2);9 T x3 r* h9 `
- MeLightSensor lightsensor_1(12);2 g( r' N+ L; j7 `: s7 G
- MeLightSensor lightsensor_2(11);" Q$ K; W# a& V
- MeBuzzer buzzer;
# X; Z, @+ s! L+ u - MeLineFollowerArray linefollower(PORT_6);
, r+ ]2 v/ Q+ h8 E8 A7 n7 Z
8 _3 b& ?+ K" B1 ^- #define Error1 13 U) Q$ ~! V) U7 u2 g3 k
- #define Error2 29 ?; b8 _: Y; K' x: g& x
- #define Error3 3" x6 u9 T# A& }1 |# z
4 q% q+ } w6 Y5 {1 X! n# S- #define Kp 15
% M7 u9 q$ | ?; Y6 h - #define Ki 0.15
/ p, C. j: Q( u2 h# ~) b) X7 W - #define Kd 0.03" l. @& K+ s8 S0 R {- ^) i
/ B9 X! ?( J& l/ Q2 E- uint8_t sData;9 [+ T# l7 e( o J3 o; s
- uint8_t D1;
6 w4 M: }# E y" E! j; H - uint8_t D2;
& \0 h$ b, v- R o - uint8_t D3;& c) {) q$ G" N: [
- uint8_t D4;
( w; u4 g% p" W: h. ?8 P - uint8_t D5; j. v$ F6 A* l! q( u) [
- uint8_t D6;
' W* W+ V: ?) a0 j" u' P6 O
5 q9 B& ^' ~( B ^- float previous_error = 0;
2 `# ^" v, h7 T% o6 f9 _ y - float integral = 0;8 s& |+ P+ @6 Y& j! q# @
- float derivative = 0;
2 L6 D7 Z( w8 h9 J& e - int Speed = 160;3 c( W9 e2 h+ g, ^" q* O
- float output;. ^7 K% z8 `; ^: P8 j2 h) |# M
- 1 e/ ~ c1 m2 f/ g
- byte Left;
, W! r7 V' s; A' `# i+ S - ! U! ?0 q& {! n' V2 T, _% ^
- void setup()
3 g6 `+ r0 g6 ` Z6 {) E - {; w; h5 P5 H, O
- //Set PWM 8KHz
! t2 U: a) Z4 n7 Z/ Z - TCCR1A = _BV(WGM10);
0 m* L% ]' X; v - TCCR1B = _BV(CS11) | _BV(WGM12);8 O! t6 g9 M! i# E. X4 k N r
- TCCR2A = _BV(WGM21) | _BV(WGM20);" Y+ S- E+ i( c; r; @4 J3 k- X) B
- TCCR2B = _BV(CS21);; E) c T1 \ s
- Serial.begin(9600);
4 X& D# D5 P$ ~4 _# v - buzzer.setpin(45);$ }* E7 u1 g) M2 b& |
- }
1 j* H# x+ y0 o& U( N
' u( @) K; Z8 a5 i, @6 Z- void loop()
- W6 Q" O( T3 Z% f( O - {; h) l2 u: m. A
- while(!((lightsensor_1.read()) < (10)));- A. }; `2 O/ o u" u# F, d
- buzzer.tone(1047, 500);
! X* h# H: v2 n+ K7 A% v - delay(500);
M% U; e$ H! i/ F6 Q+ b! I7 c - do. L7 T) H( ]: R8 d: m
- {9 w$ \1 }& R) b' ^
- int Err = getErr();# M! z' H9 G8 P# ~4 G- ?
- if(D1 == 1)2 S k9 G S! F2 p& d+ d- m& H
- {
6 B5 ?& F' |- S. y% ? - Left = 1;" Z0 r9 v7 K3 Y. S. e( `" E
- }
) Z+ Z; @/ ~/ U0 N$ q - if(D6 == 1)( Y+ N. o' H% `9 i7 k- a* G. x
- {' \' {' P2 D# `7 R0 v. x3 K
- Left = 0;1 |* D4 W8 l3 X* m3 @! f
- }; ?; K7 ?. L5 d' f- e
- if(Err == 99)/ {* K" U: K% w! z6 j% Z
- {2 D4 j) L8 D; o- E3 ]
- if(Left == 1)
2 q, m' B: O- |( n - {
1 f% z* H- C3 F+ X4 F - Speed -= 5;
9 F( b+ t( i7 l% L - moto(0,Speed);2 n! Z0 i( t( C3 Y* W4 g4 v
- do
( `0 i& G. c H - {
) I% Z; T- `: W/ E N - Err = getErr();, d4 l$ W, l4 G) ~: d
- }while((D1+D6) == 0);
' h4 A' x; l/ w( x2 i5 W - }
0 M% u* p" v: _4 }% M l - else
" q, v0 S4 h$ u( ^8 P2 Q - {
( @7 M3 m& ~' _ - Speed -= 5;
1 D/ M+ ?6 P y - moto(Speed,0);
* l/ b5 y+ N1 p& h, h+ B1 [3 |9 r - do
# F* }9 K3 q; ?' k. Q5 B - {6 H8 b& Y; A! _
- Err = getErr();
p# K5 a4 w; R4 g N s( w2 C - }while((D1+D6) == 0);
. P: Q1 _! y4 e - }
/ \) w3 z$ b: i - }
/ \ C _% l$ r1 W - else, j8 ?) L( q8 \' M" r- H
- {$ k6 R6 T2 @; H% W2 u3 Q- T& b! j
- if((Speed < 160) & (Err < 2)) Speed+=1;
. D0 g* @8 d) U7 S! q, h5 C) b - if((Speed > 100) & (Err > 2)) Speed-=2;
! q3 ]* ^$ _ O" F2 x2 i# | - integral = integral + Err;3 ]# U6 t. l( F% ]/ j9 q
- derivative = Err - previous_error;
; u. M/ L& U& K" N+ b; C0 Y - output = Kp*Err + Ki*integral + Kd*derivative;
) K& z) ^2 k M3 x, @5 f$ S' N' N - moto(int(Speed-output),int(Speed+output));
; g0 S7 H) G: }1 ] - previous_error = Err; K+ _: R, H+ e# L, r% W
- }
# |! [" O% N! @( U* k# s$ P! |2 I, n - }while(!((lightsensor_2.read()) < (10)));
; i1 m1 ` D8 N* Y6 T - moto(0,0);
) @4 B* |4 h# b - delay(500);! `; L" X, w$ p4 {7 u
- buzzer.tone(262, 500);
6 v; [4 M* |: _& e; z3 s - }
% O. z: V3 l; A
. ], U c- K8 C7 l, y) T8 t9 n- int getErr()
; i4 Q% k! D; M |: i - { ; b) @2 n# U6 y! P ?
- sData = linefollower.getValue();
( f& c* M9 J! }! a - D1 = ~(sData>>0)&1;
3 e0 |3 S- R) }) ~0 U D2 H3 D - D2 = ~(sData>>1)&1;* U8 p: @7 j' C( ]. v0 O
- D3 = ~(sData>>2)&1;
% \4 N/ _# g1 }) X - D4 = ~(sData>>3)&1;
' c/ K" s9 o& A: B0 n6 O - D5 = ~(sData>>4)&1;
4 \% r3 H8 K+ u$ l- u1 v - D6 = ~(sData>>5)&1;
3 Y; a( S& h' g, m" B3 F - int downD = D1+D2+D3+D4+D5+D6;
& ]2 B _/ p1 b: ]3 m! m+ O - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
3 q! Z C' `) {# ^' \5 `" T" t - if(downD == 0)0 W! ~. \( Y4 Z! a2 O
- {
* w, {/ Q8 |( h8 H% H - return 99;2 M9 n5 M% K$ o: \ N/ Z7 G1 B5 n2 T
- }
: b0 [6 a" V3 h) l5 k - else8 j" [ h+ i9 I5 H, c$ K
- { N) u5 X7 G" Z
- return upD/downD;; T [, r& K7 `# j4 A C2 V
- }( O* _+ O- ?. J' K* W. \
- }# }" @6 ` E. i) C
- ! `$ c$ F o4 m' }
- void moto(int Speed_L,int Speed_R)
3 a' i/ \+ j; {; D" T3 C; b - {+ B) z7 r# C! b4 E/ y
- Encoder_2.setMotorPwm(Speed_L);
+ m& A* Z' V3 x - Encoder_1.setMotorPwm(-Speed_R);
! T+ U. @0 b; ]1 C! R ^: V5 L8 p( d - }
複製代碼
9 {: Z! F$ Y. o% z2 eMeLineFollowerArray.cpp
0 l; e2 l5 N* ^- #include "MeLineFollowerArray.h"
, C$ X% K H1 @' o$ ^3 }5 R) o
. I2 g Q( ]0 ^- #ifdef ME_PORT_DEFINED
3 _0 J: \3 h3 T- u- w2 v# W+ z - MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0), A. n) y& `' h0 l! F
- {
' @* b. d8 t9 ~! |
8 [: ~5 j# \: [- }
J& r" @% Z, H - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)+ Z( x. [* g4 L; \
- {+ e5 `5 x |% Y \% m& s. d
- _DataPin = mePort[port].s2;
7 n; X7 A; e6 y- O - pinMode(_DataPin, OUTPUT); Y4 m# i$ k4 g4 ?! s8 b
- digitalWrite(_DataPin, HIGH);% O& E; [! n, G. u, g7 z
- }1 w& ?9 b& Z, G! t" a' D
- #else // ME_PORT_DEFINED" }$ Y: Z; K$ B- s* `2 i
- MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)
0 ^3 H2 K6 R9 J% [/ Z, V - {
0 E! I- j& W+ s& V5 i4 a% m - _DataPin = pin;
/ \% m* `3 S2 P6 q - pinMode(_DataPin, OUTPUT); ! e7 X2 v8 Q: s2 A2 _
- digitalWrite(_DataPin, HIGH);
6 F" @. m4 V, P1 r1 U - }7 W# @$ S9 i: s* I+ r5 p
- #endif // ME_PORT_DEFINED
: `' w$ x$ c5 z( l - . c5 y# q' x5 R" D
# ^! Y- Y/ k& s- ] p+ [( X- void MeLineFollowerArray::setpin(uint8_t pin)
# D3 Z3 f8 G; v, r' B# h - {
+ {9 d$ g& p* [; b - _DataPin = pin;
2 O; z1 D9 l- ^8 d8 z - pinMode(_DataPin, OUTPUT);
2 Q' R. M1 t: L, c3 Q* ^0 [0 B4 G - digitalWrite(_DataPin, HIGH);) H8 v, w3 @+ {! N. O! q; C
- & m' A Q& ]. U, J1 }
- #ifdef ME_PORT_DEFINED
: F/ E$ E( A% X! i! b# B; j, X - s2 = pin;+ |7 s5 Z$ b/ l6 O4 Z. k
- #endif
# e$ c0 x& ^! E9 V - }
% S |* |5 T) D- L7 R1 i - # l3 ]' [; _: Y; @; J4 A$ ^, Z
- uint8_t MeLineFollowerArray::getValue()
' {3 I: E2 t% x, p S4 a9 x. r# F - {6 M, k2 N: S. e2 v
- uint32_t LOW_level_read_time;+ `; k, ]0 R! o4 I% {# |
- uint32_t HIGH_level_read_time;
. ?) v$ c0 Y7 c( ^# U - uint32_t time_out_flag;
4 k! H4 l% S% X/ V# L# k- q - uint8_t Sensor_Data[3];
! Q p" v7 B/ X8 `" [) z% N! { - static uint8_t old_data = 0xff;
9 _( B b2 p7 w8 g! x - # B7 J; g& C5 s0 f! X
- pinMode(_DataPin, OUTPUT);
$ i6 \( S4 Y& y( ^5 s- y - digitalWrite(_DataPin, LOW);
" \$ v2 U3 V; T: M6 ^ - delayMicroseconds(980);
" i" A& T5 t6 e( |8 ~ - digitalWrite(_DataPin, HIGH);
`+ U" _' P/ n7 I
4 \( z" Z/ q4 | x- pinMode(_DataPin, INPUT_PULLUP);
0 A/ v/ O' ]8 y - delayMicroseconds(10);
! O6 G7 g+ R; b+ @
0 f1 N2 d2 @& x, m9 f. d: h8 ?- time_out_flag = millis();
$ I y. A$ y( y5 U& j, K2 N" \ - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );$ S" V' ?1 a0 ? P! N4 ~8 v
- ( X+ e: {8 `7 m9 D W% U* v( E
- LOW_level_read_time = micros();
) G+ u! |% J1 ]; C3 v - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out" m% u" R* l {! t9 Z' G
- {/ c G" A4 M) V7 l# c: k5 C
- return 0xff;, E. |& ?1 i. G) ]: e: a
- }; x4 J/ G, k7 Q+ ]; V9 j4 K
- 9 ~: J* |' d' I/ e. `) f3 U% u
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );7 ]* R$ T' a" s0 k- p
- 0 g6 X7 K$ j4 X% r/ I
- HIGH_level_read_time = micros();
7 M6 S3 t$ h5 f. I; C( J - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level" \ z H( z0 o6 S$ }
- # @7 y6 N8 Z5 O8 c# j
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out9 u; _- }5 K2 y4 [& l
- {
; Q" W) h$ a, ^5 o0 D - return 0xff;/ q7 u! M5 ]* h1 O
- }
) P6 |# M" G: z3 ?% |& R - 5 w8 b; M- Q. `- B/ n) J8 G; R8 W8 r
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))' S, i2 }4 i" u" A, x, a
- {
: w* ^+ z) U% R4 C* ~) ^, @' A - return 0xff;$ N: m" j+ m2 N6 f/ L
- }
+ Z+ j+ T( {# P& Q - 2 `/ n* H5 f3 ^7 o
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
3 W% P) J) x: {& z - LOW_level_read_time = micros();! L6 P" l% C0 x
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
$ A: y' [' b4 E$ G - 9 w3 L% |& A- S) w- Y2 i# c, c
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
# F* J" Y" _7 F9 K: U8 Q - {, j! I3 ?$ i" _
- return 0xff;
7 ^$ Z% H9 J/ r8 f! f% ^* s- P- \ - }
9 d+ L) s+ t/ }
# |- Y( d X' p- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55)); Q& ? {' m1 j0 d4 Q
- {: M, p* t' H+ {, C( E- W, `
- return 0xff;2 H# F7 v+ V4 O) Z* y5 P
- }: c/ \3 \4 H( E9 c/ U
' s( x4 _1 T6 N' a1 M) o- for(uint8_t k=0; k<3; k++)& r: [7 Y5 K& }. ^4 o- K
- {9 x1 ]4 u* J$ s- }2 x. Q# g
- Sensor_Data[k] = 0x00;) i7 A3 ^1 d. q0 e! x
1 b; f( L. ]6 r4 @. R) Y, r$ J- for(uint8_t i=0;i<8;i++), v/ U" e, c/ D% @" V
- {5 {6 `" D; a: D0 M0 h" W. r6 e
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level4 G6 }2 C: s* ?, ^$ o/ [
- HIGH_level_read_time = micros();) |& J1 _1 [! u" [3 U }& `
- LOW_level_read_time = micros() - LOW_level_read_time;
( J: I3 u, U9 p( V3 \
/ ~1 U9 N4 s3 n0 l, `- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )$ i5 Q5 T" Z/ F+ z9 Q
- {; h$ n4 [; v3 G: O0 U$ v9 I0 D! S. Q
- return 0xff;, R. S" s+ ^" q' v6 t* ?
- }
2 u/ j# ^$ R9 m9 E3 h& o0 W
6 @* X7 T: ?8 L' g0 s1 Y- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
, C& m4 b. r1 f& u9 X. d: v# ? - LOW_level_read_time = micros();1 T: {- u& Z8 H. m5 ?
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level; C( K5 K* ^- M% f
6 |4 J) u/ t- @0 u) b8 F- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 15 E; }6 P* N5 d, |& V! y8 J
- {; A+ H) n7 y+ ?4 M6 W9 [8 \; p
- Sensor_Data[k] |= (0x80 >> i);% H5 D- q5 f; k/ r: a, z) S
- }3 L' v; l h: \
- else if(HIGH_level_read_time >= 100)) D3 A5 m; ]( i2 s6 v& M+ z3 G3 \) \
- {1 A9 p- @/ ?- V7 h* Q: U! z9 i' f
- return 0xff;
" Z% N; c8 P! T3 i3 d% v% | - }0 V- `' G) V2 h* V+ k
$ F7 B$ h! L' Q3 d1 V- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)
3 f* O3 }+ c. F* y3 | - {
. U4 a. ^. v v# A - return 0xff;
# V7 B" y0 d; z- A; h - }# K# a8 j' f, _; D" ~
- }
2 a. F0 ]$ q2 ?4 d! V/ T - }% |9 v& E5 j. m- L5 B5 w
8 v5 W: O! |1 W- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level* B( @1 y: C4 S' V
- HIGH_level_read_time = micros();2 O, |1 M8 F. ]2 C: A5 S
- LOW_level_read_time = micros() - LOW_level_read_time;
) _; {: u! ^9 S! F- ] - 3 h* S3 i9 _9 d5 J' Z
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
& y v1 q- r" i/ X' L - {( G. f% u( C4 ?, ~ y
- return 0xff;
! C4 C [8 k! R9 ~3 E, v0 u - }3 C# s0 y0 {- T9 x' o) _
6 N+ ^* n/ b, m" y0 t3 t0 a3 r- pinMode(_DataPin, OUTPUT);
' L/ p9 I+ c7 x" M; L - digitalWrite(_DataPin, HIGH); v8 H7 X4 m. ` ^" M
- ! p1 n* ^; H- }6 n4 ~* B
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))% Z* H: S! a" [! U
- {
, K1 U [9 T0 q% i. Y - old_data = Sensor_Data[0];! e" U* Q' J$ w9 q+ c
- return Sensor_Data[0];3 m' C6 C: F3 j1 [" H" F
- }
7 k# w% y! f6 J. d3 b, Z$ w - else' V1 P3 o" n, W0 L/ ^4 I( m+ D
- {
; W9 J* A+ o5 Y) k! U - return old_data;# w9 b" E- L+ t9 y S
- }
; d% d/ d1 w. H3 a$ [2 o3 I - }
+ w6 r* L# m- c% o: m$ P9 g. w
複製代碼
+ _) h. f: T. W' F" @' eMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
7 f1 n1 S6 i' J3 t( I* O) o- h( m- Y( ]0 F; a* t; U
|
|