|
|
A# b; s, `' o" U; E
- #include <Arduino.h>
, c7 L; p- f7 j7 L$ b - #include <MeAuriga.h>
& N( t$ I1 E$ h8 o6 P - #include "MeLineFollowerArray.h"
' o8 i+ j6 @" Z) P8 G - g, w3 m3 B7 A- g: r7 M" q
- MeEncoderOnBoard Encoder_1(SLOT1);* |; H" g1 U; r. ~- A! r1 r; E5 {$ C
- MeEncoderOnBoard Encoder_2(SLOT2);
2 B6 |8 c \4 T2 \4 C% ~8 u - MeLightSensor lightsensor_1(12);
3 b3 T2 x! ~: p1 ^9 o - MeLightSensor lightsensor_2(11);
; R1 h2 Z9 n7 X& S$ V - MeBuzzer buzzer;
8 @ E3 v# w x - MeLineFollowerArray linefollower(PORT_6);
5 L4 \0 I/ {- @2 V - ]2 P; j5 R$ ]9 [. M
- #define Error1 1
& M/ C k( k7 D, r$ T: { - #define Error2 2
8 Y. ?$ G" @* }( Y5 Q - #define Error3 3: H3 B( N$ Q- A- j/ w6 ]0 y
- ) S' o n0 ]! a5 K/ V2 S
- #define Kp 15
, V V. s! s: f - #define Ki 0.15
) P' M0 ^1 V- X H" R& L - #define Kd 0.03% c' v7 X3 Z9 w" k5 T! e
4 n$ {+ Q3 B' t$ w- uint8_t sData;4 u1 q! u; j. @' J
- uint8_t D1;
. |: B. F) U$ [( P - uint8_t D2;
: e/ i! [7 n1 \# V( M9 i - uint8_t D3;
' {7 A% {: l* B3 { - uint8_t D4;
$ o( T- U' B4 E5 \0 u% a - uint8_t D5;
3 N" t1 j. E2 T, i- f' ?7 { - uint8_t D6;7 H, N' \& ?0 O6 q
- ! l# p0 F) v$ H4 t V' H
- float previous_error = 0;; r" t/ y3 F) P" F6 H0 E
- float integral = 0;6 G# J+ f: k3 z$ `% K: b' m
- float derivative = 0;
5 {! I8 r1 {/ {$ N2 n - int Speed = 160;* {& k0 s( M' `9 I
- float output;& l- v% S$ i* d1 K
- 0 B* v! L- T( z5 C" F5 M7 p
- byte Left;! p/ m! j% R# [4 \
# r1 b2 {; U- y: u- void setup()
: f* s" r u# k& | - {. N6 S7 m w) U8 S4 D4 a5 i
- //Set PWM 8KHz
, z1 g3 k+ F9 X8 e' O) A5 {8 k - TCCR1A = _BV(WGM10);
' K! ^- P$ @- ]1 P6 A: ^0 H - TCCR1B = _BV(CS11) | _BV(WGM12);8 V) m6 _8 J: o' Z# a4 \+ g
- TCCR2A = _BV(WGM21) | _BV(WGM20);9 b$ Q% k! C% u; V: @- Q+ Y) v
- TCCR2B = _BV(CS21);2 N! b V* {- {9 W" q- u* M
- Serial.begin(9600);& ?% ^7 d& x& P, @: B$ u& ?
- buzzer.setpin(45);
! A' r+ h9 S& \4 R - }
$ y# R- g2 Y. ]+ |, \* T - ' H) l. q5 o2 \( V" n
- void loop()
3 R1 `6 T2 O# [ - {& Z6 p" [# n" e9 B" B5 S( z% f
- while(!((lightsensor_1.read()) < (10)));
% P& `; d! Y, O# T2 L* i" U2 h, J - buzzer.tone(1047, 500);4 _6 [6 ^/ e t$ a/ k# c: U- l4 V r
- delay(500);' n" K( r3 `" O1 e H% i
- do
" Q$ T, J8 u* i" q - {& \# c, ?2 d) ]+ t+ {/ h
- int Err = getErr();
8 ?+ o6 b# O2 y+ m, {0 n0 x - if(D1 == 1), G+ F. s% [6 [) @* [- M
- {
; ?; C. d) G0 V$ B; k7 s* \ - Left = 1;& G8 d4 T2 W4 h& Y m, U
- }
6 ? l# z+ X" } - if(D6 == 1), O* Y( K/ Q a" d: z! ^ C. x+ }7 U
- {# H2 ^2 y2 ~5 c* i8 H4 r+ \5 e3 }
- Left = 0;% q4 `! L+ ?$ }, O+ w# x
- }4 q+ R, ~/ S) X: T5 v( F2 G
- if(Err == 99)
$ O0 ?! _/ K: N - {! @. x( c- `! U/ E! Y* X
- if(Left == 1)
- W2 ^; |, R9 R$ _' t - {' _" j7 ?3 ]2 a+ h: g9 Z
- Speed -= 5;
9 M3 _# u( g( x' n" M: f - moto(0,Speed);
' ]0 l3 S( A0 t% g N& ~9 a9 R+ ` - do- M' H1 t; e6 H5 [" M
- {$ b0 x9 O, L( j
- Err = getErr();
9 D& h0 M2 ~3 |4 x5 d6 B/ R - }while((D1+D6) == 0);: |1 i) V) Q. w4 @. g/ ^: X
- }* c" T- s3 `& {+ T( |
- else! u! N9 K# ?2 y" d4 ]" X- x' {! O* y
- {
. I0 H% U L3 O/ S - Speed -= 5;
3 n. T; t" y3 M - moto(Speed,0);
2 D) j6 j# ^3 i - do
, G0 r; |% U m9 v9 w - {& z4 ?- D' a7 H. t5 t, D
- Err = getErr();
9 H$ C+ O4 p1 J - }while((D1+D6) == 0);8 \, N. t" l1 k3 Z, D
- }: v$ O5 m* @# r$ L9 W$ D
- }
9 \; u/ `4 ^5 T; r; ^ - else
$ j9 t3 S# k5 a0 A" J/ ?- @. Z - {+ J2 R& x) r: w3 d! W
- if((Speed < 160) & (Err < 2)) Speed+=1; , |& ]% [: N/ I/ \ C1 E, C- p4 @
- if((Speed > 100) & (Err > 2)) Speed-=2; 2 o$ D6 I8 n d3 r
- integral = integral + Err;
% Q6 [) S. _ G+ A( X - derivative = Err - previous_error;. Z# x( p/ X3 z1 K1 u' M
- output = Kp*Err + Ki*integral + Kd*derivative;
- E' _ C8 D0 ?& F* m - moto(int(Speed-output),int(Speed+output));
6 L! _! S: c( V# G3 g/ s3 J! Z - previous_error = Err;% Q! B4 Q0 q) Z) K5 | d4 j8 y
- }, b3 d8 k% r5 g
- }while(!((lightsensor_2.read()) < (10)));
: W+ C9 [5 U4 b3 U# q - moto(0,0);
0 j o& G; T0 w ~' E" w4 Q - delay(500);
. e7 A, q4 g! O9 P - buzzer.tone(262, 500);
) M, ]4 `8 {9 R - }1 m7 m: o2 U# D" U: X. ~" n
! X4 B4 x% d u: {- int getErr()
1 [+ i+ y2 E' A9 F2 M/ ]& Q# ^& j - {
& X3 u) z# w/ z) P q2 {8 Z, e d& m - sData = linefollower.getValue();( ]" }( l T1 X. b/ S. s* o; ~/ \
- D1 = ~(sData>>0)&1;
& |: o* T6 p) P9 |/ P1 z+ ^ - D2 = ~(sData>>1)&1;
" E" }7 o3 V @* r2 @9 P9 T - D3 = ~(sData>>2)&1;
2 u- g& ~& M4 [$ \+ l - D4 = ~(sData>>3)&1;
- Y9 b8 G9 o+ ~1 K - D5 = ~(sData>>4)&1;* ]0 [8 c ]+ o v v! F8 a- H
- D6 = ~(sData>>5)&1;% e, }0 W9 ?0 T9 u O) y: f+ ?9 S
- int downD = D1+D2+D3+D4+D5+D6;) U3 w7 f& C4 f. v( L
- int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
7 z' Q- D, f+ s5 ~0 [- I4 B2 i - if(downD == 0)4 E( O0 w$ }- U4 M' h, Q. \) V) W# w% Z0 W
- {
% O& H, ]& U/ c3 o/ @, Z0 X - return 99;
8 D! e j4 U, g) y - }
4 m0 i. ^+ x5 ^! N+ I! O0 k - else, X9 @% r% `& J) r0 D
- {
+ K. t- B0 g3 T( w: }. c8 y# @. _ - return upD/downD;
5 [6 a3 e, `; M, b+ y5 Y - }
" u2 t5 z' G) p- K$ P# [ - }; p: `# c- W! m
- 9 \+ z9 f- D6 _) B
- void moto(int Speed_L,int Speed_R)
/ b9 C7 X9 y* J7 Y2 T4 Y" ] - {
8 ]" t/ r5 C/ H! {! H3 A - Encoder_2.setMotorPwm(Speed_L);( A! \& v7 ?, f: [- Z0 I# ^
- Encoder_1.setMotorPwm(-Speed_R);
( X, q9 i: z8 u - }
複製代碼 ( n: R! p+ ]1 g8 h2 @/ q6 W& ?# B
MeLineFollowerArray.cpp' h& {1 S! A9 x! \
- #include "MeLineFollowerArray.h"' u- _' M# Z/ G$ ~
- % m* ]1 }* b* Q" U, O
- #ifdef ME_PORT_DEFINED
9 W, r- q9 N3 R* W2 i& F - MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
; {/ t$ f! L, s2 e7 |0 e: J8 C - {
6 m3 b# L. u Q. V( K - / p3 m# W0 ?( {4 m A
- }
- J" o5 R- J5 c+ }0 J, I6 ^1 Q - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
P- A! G7 L" k - {) ]' E" S+ m6 A. O' Y/ l
- _DataPin = mePort[port].s2;1 L$ z4 u* m5 h! Y, |, K
- pinMode(_DataPin, OUTPUT); * r3 X0 L- t% D8 V
- digitalWrite(_DataPin, HIGH);, t2 U9 g3 C) b
- }+ N" |! f, n$ P# L! j' y
- #else // ME_PORT_DEFINED% g' E1 y# Z/ ]' z. Q
- MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)+ H: k: V" w; P1 n Q/ _3 ?( Q
- {4 y, o/ r( i3 {& x0 b: z& P: t
- _DataPin = pin;
; G( e E. a/ r5 W% S5 b, w - pinMode(_DataPin, OUTPUT);
4 t8 G3 b- s5 B) ]% Y! l! j, S - digitalWrite(_DataPin, HIGH);
) ?' W0 R% _ ^: p2 } - }
. n1 [$ B% h0 e9 E0 H8 L) N - #endif // ME_PORT_DEFINED
# c" l$ d4 N L) Z0 D4 ^: r9 J/ D
- s5 ^3 b! Z O' H0 {# ^% S- ' w" J# i" x {; I
- void MeLineFollowerArray::setpin(uint8_t pin)2 j2 T; t" m& m: b
- {
) ]- c0 w! c6 y) R h - _DataPin = pin;$ l$ d' Z$ t; u1 k
- pinMode(_DataPin, OUTPUT);
0 N2 M1 z- `+ N+ q9 ` - digitalWrite(_DataPin, HIGH);0 e9 c: a! ~, @* _. w- |& v
- $ L+ J$ E# r+ L
- #ifdef ME_PORT_DEFINED9 m. L$ C# F% M$ T) E% z
- s2 = pin;0 V& D' z6 {6 y V
- #endif
- O4 o) t$ ~* v2 E! n5 L - }% g- t, s0 _* Y
- 5 Z6 x9 e7 d6 Z, o
- uint8_t MeLineFollowerArray::getValue()
- m1 m4 d" F: o" w7 d - {
4 J+ G: D2 M& p: z m+ Z5 { - uint32_t LOW_level_read_time;6 G/ F. [9 S1 t& H
- uint32_t HIGH_level_read_time;
! `# \% Q6 T4 X+ e2 U) A - uint32_t time_out_flag;, j) e; O" _% x7 Q7 s, I
- uint8_t Sensor_Data[3];% v% e5 d: G- D
- static uint8_t old_data = 0xff;
# X$ x. X" p3 p! H - 7 c( L! D" u0 d. c8 w% [
- pinMode(_DataPin, OUTPUT);& [# F, _/ \1 h0 G4 f
- digitalWrite(_DataPin, LOW);
! k5 y5 W7 C1 d! u8 a6 i - delayMicroseconds(980);0 D$ Z4 e+ C( O/ p- \
- digitalWrite(_DataPin, HIGH);
, s0 Q1 \+ a- l+ j5 ]" @: H" d - , J1 S9 D P- O0 P
- pinMode(_DataPin, INPUT_PULLUP);
6 L' ~" @2 v" f7 j - delayMicroseconds(10);
7 P8 x% i. i$ m$ @- M i
& L0 j4 U& P9 v W# A$ p- i( z- time_out_flag = millis();
, Q& K" d0 b% |$ ]$ @ - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );7 U1 @4 o7 y1 B
- 4 V: p/ }: e/ K' p. S
- LOW_level_read_time = micros();
8 }7 y0 {% J e9 W+ ` W2 ?3 [8 m - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out5 L q {* _+ ^# B* v8 Z* {
- {1 P5 h T( h* U/ n0 b
- return 0xff;
4 i* O4 C) i+ D2 | - }
: x( V5 c/ h& P$ q4 } - / h% P% V8 }* i, |- S$ o. m
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );0 U9 j6 V: ` h/ y0 Q$ C
- / w4 |: _9 c, _, B
- HIGH_level_read_time = micros();9 M. Z) l# T9 x6 h; {
- LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level) D- t8 q0 l* S7 k |8 l0 |* A
( V5 z$ {: {" v- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out) o/ Y% h6 w1 N" S% E
- {' Y0 p) l+ Z4 r. f$ D- M
- return 0xff;
3 l$ E- x: g ~, p - }0 t# a+ D/ y$ o
- / F2 o" n$ e6 F, v4 g, M
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
/ h% R. V1 k. v- ?6 R& x4 ?+ b - {! N, j) C# k* h* @$ E
- return 0xff;" W4 U; n% v: |
- }$ r2 O9 n1 x, ~( g6 ^
" i* c! ]. B$ Y7 o4 L. }9 |- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );! [" P9 l' d- V
- LOW_level_read_time = micros();# ~) \' L& h0 c) W, f
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level# X( D. g* M0 N4 ?0 n1 a" w
- 4 t' Y) i, M$ i& y7 P+ @
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out- F) U% @3 t+ n2 U) @1 G; k
- {
0 Y" P4 O9 c9 R' q$ l* G' B3 x& f - return 0xff;
) _! M. i# s R5 g - }, [1 m# x$ ~" }$ n
- * j- [0 Y- V8 X, R
- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55)) S/ {5 ^: A$ t7 V6 Z
- {0 s6 _1 U' T& z
- return 0xff;
0 @. n$ L7 a! i: K3 g8 J - }
3 }3 o q" p, X0 n - - z$ k" u4 M q# l% t( q
- for(uint8_t k=0; k<3; k++)
2 g4 ]# |6 | a8 c/ b- r- B# e - {
* Y. b) A' {* _8 I4 z q) ~ - Sensor_Data[k] = 0x00;
" |& X4 P# q# L, k% M7 v( T3 {
; c0 H% z+ V5 \, t7 u+ t- for(uint8_t i=0;i<8;i++)1 M7 i6 w, V1 f, B6 l8 K3 M
- {0 e4 K2 \& P2 q& j* L; @6 f
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level) @2 l6 `. U9 L" B2 P; b: I- `
- HIGH_level_read_time = micros();
, N7 A: F6 X/ B0 j2 Y - LOW_level_read_time = micros() - LOW_level_read_time;+ v+ o: b; u: c& L4 G
- & T9 [0 m X6 e2 U2 x( S
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )4 J; v: d0 C( A6 B o
- {% J; O8 J& Y4 H! k2 ]! Q5 r7 |, _
- return 0xff;; p) w& h$ {* z- R5 N9 D
- }+ ?5 C, I9 A3 i% a1 s( [! F
- , `8 ?! q9 c3 y1 _/ M% V2 @. f
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
( _6 j: J8 _& G- A - LOW_level_read_time = micros();! }* X& [1 f/ C) l- E* a
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
) Q( h3 ]+ Z# r& H) d - 4 S; E j7 i4 m9 |. n! G
- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
/ w, \5 ^/ I1 o. o& B; V! k* A6 d - {" i D4 D5 `6 Z3 Z
- Sensor_Data[k] |= (0x80 >> i);* N6 u2 x4 m; U# S" }) i* m
- }4 _' ? S- ` W
- else if(HIGH_level_read_time >= 100)
3 b" o2 K- k8 k - {) u: F7 i9 x( B" y8 f a" a
- return 0xff;
" D7 Q5 ^8 \9 N# @5 W# A - }! W# F' j& O& K: [& s
5 j* e! E, c3 V& W! a( k- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out): a/ u) @; ]4 i$ V0 w
- {, [6 T& z: ]* y+ ?* ]+ A
- return 0xff;
$ s! d# A }8 ?: P) V - }! }9 A1 }) q4 L# O& Q$ f$ e
- }
, F3 l$ N. ~9 L) \0 B2 y6 s - }
0 z( Z" T# y- O9 w2 j6 @ - ' N8 k4 j- ^0 X% R& H
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
7 i! b# Y1 c- \( _ ~# T2 N( l% u - HIGH_level_read_time = micros();
& L: b$ J! G/ K2 m( `8 t - LOW_level_read_time = micros() - LOW_level_read_time;: ?8 `8 P4 E% b+ I& W
- 9 @% u2 ^6 J1 I) b
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )) _- `" q0 `$ I* H
- {; f% L r a3 ^8 f, u) u4 y
- return 0xff;) T: w& @$ A. J: F8 o
- }
% J' h9 ~3 i: [6 \, w' h& [: P+ F - ! `! Y3 `* [' |8 ]3 K, F$ P! \
- pinMode(_DataPin, OUTPUT);, S9 ?; g5 f$ U/ Q0 ]
- digitalWrite(_DataPin, HIGH);5 V: E- R, d; H2 f
- y) F" r4 |3 O* m4 g( a6 U- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))* {7 X9 B' U2 ?
- {7 s C8 U: ~) f% ^1 C
- old_data = Sensor_Data[0];1 e+ S5 C' d h7 n* Z3 k3 k" P
- return Sensor_Data[0];2 v- r9 _$ C/ d% Q* e
- }+ e6 k' L0 p7 ^. I$ X4 n. C) g+ [
- else
; h3 D3 w M2 n* _! Z0 ^. K - {
+ j4 g) `0 @: p+ x8 n" L - return old_data;, O D2 G6 f$ t7 z( H$ q: p
- }' b: s0 }' G' b& w: C* F* i
- }" Y S5 J$ I2 o# f1 r" m6 `9 d
複製代碼 ) c* q5 v1 I# ]2 D0 b4 _
MeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
4 b- R: V! ?& v7 I1 L" y8 ~2 W
1 v0 |! D9 A" `/ j |
|