|
|
& j6 H+ _% @3 @" G+ C! H1 s
- #include <Arduino.h>+ G# V1 H/ P# E* X6 R7 x. C" C7 `
- #include <MeAuriga.h>. i* W9 l& e* K. ]
- #include "MeLineFollowerArray.h"
1 Z. K( o" u# ]' n G/ x - : |) U% n2 [& w! D+ @% O8 i
- MeEncoderOnBoard Encoder_1(SLOT1);
, _2 d; @+ }( u. X+ Z - MeEncoderOnBoard Encoder_2(SLOT2);! Z9 W- O3 `6 y
- MeLightSensor lightsensor_1(12);
7 }: o- O& N5 h" X' H - MeLightSensor lightsensor_2(11);( t9 }9 j% ?' R9 T8 i
- MeBuzzer buzzer;# z1 r" h ]8 l( {/ K/ U
- MeLineFollowerArray linefollower(PORT_6);7 X7 I, @( {( Y& @2 m! ~
- $ t' |% P$ N5 O
- #define Error1 1
f) q/ W4 r y - #define Error2 2
, N4 F- J* w& f2 D - #define Error3 3. `3 p1 a1 i2 ^/ s8 z8 l
; S2 n! K0 B r- #define Kp 155 u& S1 |8 D. R3 ?+ z: ?
- #define Ki 0.15
- x' _( `' J6 _# c - #define Kd 0.03
+ m: l$ O2 g" @$ N) P& }2 Z - : [ z I- ]+ i9 y0 F( D- C
- uint8_t sData;
r$ ]6 m* I. j% R - uint8_t D1;
- O" t/ ?6 h- W% M - uint8_t D2;
) S \$ t# L; ^7 B6 r2 v6 t1 G0 j6 E - uint8_t D3;
$ f6 |0 ~" m1 q) Y) C4 R) o - uint8_t D4;+ s; b% Z% u& j
- uint8_t D5;
# G! {% ^$ a3 \4 w. J - uint8_t D6;2 m6 I$ \/ k, K% {# h N4 F
- 4 I: [+ G: p9 q3 c- q
- float previous_error = 0;
; B* }8 i% |0 d4 |# a& G$ _ - float integral = 0;
% I1 X5 K* P1 P, J - float derivative = 0;1 [& W. y. X# f! K0 a3 l- D) ]
- int Speed = 160;, A/ G8 {* _1 H8 D
- float output;
( o! q v6 |: N8 t - . l# y( x9 T6 O" D
- byte Left;
, U Q. d& R7 ~# [! q& Z _3 n - j% e3 G' _( I8 P# \
- void setup()
2 C/ r- o A# m+ r: b! } - {# k" S+ }+ ^( b
- //Set PWM 8KHz7 J0 H/ _' e- A3 r! h# V! _
- TCCR1A = _BV(WGM10);
% o. i- D1 _/ ]7 E# [+ O7 g: c - TCCR1B = _BV(CS11) | _BV(WGM12);5 k! f- c# }2 r" e
- TCCR2A = _BV(WGM21) | _BV(WGM20);
% T& a* C+ @/ e c1 Y; Y5 r - TCCR2B = _BV(CS21);
5 n, C4 R' D' E0 ~& m0 o; t - Serial.begin(9600);6 y n( @' X6 h& H. @( ^7 Q
- buzzer.setpin(45);
3 o1 z G, W5 u! b - }
+ V, J: O. {! b4 O5 {
# E/ g' g" G; S4 O- void loop()% t6 T3 t# k5 R4 c/ X% } z
- {1 w# R' N6 T0 x K" L" T
- while(!((lightsensor_1.read()) < (10)));& ^1 s" t4 N7 g2 x4 G
- buzzer.tone(1047, 500);) E, B5 ~" o$ P$ q
- delay(500);
1 h- \$ H8 `& G8 u+ d - do
# h! ?! c6 g. v9 u$ u - {
7 ]/ c- I! ?* Z0 b# D. d G - int Err = getErr();7 x; y, |' x: j6 \) ^- n- u
- if(D1 == 1)
2 I& |# o3 e! c8 D5 K! v% Z - {2 a- x( @. E2 p$ k! F7 L3 N+ w6 b
- Left = 1;3 Y. Y" |: \( W1 y
- }
" M& `# Z. C! C! X# e E5 g6 j0 _; V - if(D6 == 1)
3 b: g3 S: i' v I! [ - {
4 ]) Z* `4 L# r8 y' x y3 n - Left = 0;7 E. R* }" d: C/ n; i
- }* U: u; s1 M: _+ n
- if(Err == 99)
' ?8 e5 P7 R& I: H5 t; Z - {
|$ B( R3 f5 G - if(Left == 1)4 }; @2 O- z* D2 B
- {( v4 u* [2 Z) o
- Speed -= 5;0 Q- }* L9 x% i
- moto(0,Speed);
. X' n, M( Q+ d" U% S' C - do W6 U, y1 h, C) d9 g) @- H1 p
- {
2 @: l! h( O2 t, V* W - Err = getErr();3 d& @& y2 ^0 F1 b! b
- }while((D1+D6) == 0);! k8 |8 ]+ L6 w5 J. u
- }
* O0 c! q' [; E# C q - else* J- E2 H' K" E0 j ^: I
- {/ Y9 Q" Q3 u+ k+ E# o
- Speed -= 5;
* I, O% J% W" b7 K0 @ - moto(Speed,0);
. J8 T) L, p1 R - do
- ^9 w4 L Z: f" \9 O/ F2 W u# u* a - {
' i3 [' h& q. S- ^9 U' @ - Err = getErr();' G% ?; y) p8 j6 d( D7 } g
- }while((D1+D6) == 0);
# T3 T6 R" @: ^! Z- w3 W - }# ]9 w3 ^$ f# Z( h
- }
4 l! L6 G4 M; n; a6 g' F2 q - else
, W3 o! \" k% {% a4 O" V - {; s9 B. t& ~3 Y) I+ R
- if((Speed < 160) & (Err < 2)) Speed+=1;
# ^/ ^; G2 d) L8 \* ^. C& D - if((Speed > 100) & (Err > 2)) Speed-=2; & k- v7 I( {( i
- integral = integral + Err;( C9 I3 ^3 j5 h, C/ H
- derivative = Err - previous_error;4 }1 T" L( U) Y* K. Q9 I: `
- output = Kp*Err + Ki*integral + Kd*derivative;
# V: ?$ j# u1 \1 \% [: I - moto(int(Speed-output),int(Speed+output));
: p* S$ {3 e; J3 w" C0 L$ h - previous_error = Err;) Q. \, w# z8 \( Z& E
- }
! e, C8 y' g Y! ]* e- b - }while(!((lightsensor_2.read()) < (10)));
4 h. H% l" j6 N+ ` - moto(0,0);& P1 s: Q1 a' W$ |5 d
- delay(500);7 r6 ]5 s3 c, w, N; V) s
- buzzer.tone(262, 500);# H+ L" o# V# G" D4 f- f
- }/ J5 ?) b, ^* R1 m* x# L4 ~
- + g0 i$ k f: `, c' P
- int getErr()0 s5 I! j! e+ _$ v2 ?3 b: C
- { , ~2 N9 @$ z5 r& M0 {
- sData = linefollower.getValue();3 l! ]. D9 S1 }0 A% N
- D1 = ~(sData>>0)&1;
0 h# O0 T. k4 o# c* p* z& A& o - D2 = ~(sData>>1)&1;" N1 s' @; E! p7 J, ~# G
- D3 = ~(sData>>2)&1;
" r2 w% e3 l o& t9 C - D4 = ~(sData>>3)&1;
( ^! c! v4 y) w( e3 _9 J - D5 = ~(sData>>4)&1;) x3 j* w1 L% E1 _
- D6 = ~(sData>>5)&1;
# k" Q ~6 x& [+ t7 _0 g I - int downD = D1+D2+D3+D4+D5+D6;3 U( Q y0 |$ Z
- int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);. g/ A7 r; ^4 a) k6 v5 ~9 U
- if(downD == 0)
7 x% X1 j5 M X* O0 j - {
8 b# d8 ~' m; b: W m e. C, P - return 99;
- p. [; a; ~, @& L3 f - }8 v/ o1 D, c9 b2 r, T& Z( [! j
- else
9 Z- v8 h4 F( \ D& p. a8 \& T - {
/ ?- }6 j0 u$ Q5 Q, h7 X - return upD/downD;
% x0 @/ S+ J R" B! G - }8 v+ X0 H5 C( d( N
- }6 _/ S. `" E: q, N( S) I* |. c
. c: p0 i: P) Y! t$ `- void moto(int Speed_L,int Speed_R)) S# v/ y6 I+ c+ `$ r: X- P
- {
% h, U# R- y0 ] - Encoder_2.setMotorPwm(Speed_L);
9 ]5 Z- @& t$ j* {) i$ y - Encoder_1.setMotorPwm(-Speed_R);
5 u, U5 x8 U8 s- v" U1 g9 P - }
複製代碼 9 O( j/ `3 l/ C- B6 N
MeLineFollowerArray.cpp) B. A8 Y9 e; r/ X# n: a
- #include "MeLineFollowerArray.h"
" h. ]% m7 f2 Z# x+ ~# r
$ k2 L' M( a9 Y9 ^( S7 ?" v3 B- #ifdef ME_PORT_DEFINED" B9 {/ W9 y! \8 Z
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)- a4 ^5 Z. s6 G$ h
- {
3 L. v8 p1 P- Y: F) q8 E8 r/ l* x5 M4 |
2 c. C @. {4 V0 V- }
% k2 B7 h J& |% ^9 s - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
6 N: T! m8 V$ Q/ [% X5 M - {
- O. j% w0 O$ s( l( i- ?; F R - _DataPin = mePort[port].s2;
% C5 U H* F+ w4 O/ [' n - pinMode(_DataPin, OUTPUT); 3 v' N! U9 \- e& g
- digitalWrite(_DataPin, HIGH);% w$ |1 b7 G5 Q- V
- }2 t6 S6 v4 x/ n# P; Q
- #else // ME_PORT_DEFINED
+ d; ~; @# o$ e' O7 y! w/ f - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)" o3 |0 U0 u+ N
- {* a, B5 C s9 ^) A
- _DataPin = pin;
; N# g/ V0 q2 @% F0 i' H - pinMode(_DataPin, OUTPUT);
; ?1 L, [) j" T - digitalWrite(_DataPin, HIGH);
: l' [5 V0 Z. k - }+ y E! _8 J2 s D8 f* _% B$ p
- #endif // ME_PORT_DEFINED
; i4 `- _% H) P @2 M* F - S5 j7 s0 y8 X
- 7 s2 n# @' ]! ~) f7 y, W1 m
- void MeLineFollowerArray::setpin(uint8_t pin)6 ] n" S p; A1 @) ^# A
- {
3 h! d# u5 G' T4 h! t# F. _ - _DataPin = pin;
. X# N" \( s0 A4 O% P0 e% q8 S - pinMode(_DataPin, OUTPUT);
: K" {; E$ c! h# ?$ V - digitalWrite(_DataPin, HIGH);9 z' M5 g5 \) B8 C
- 6 K0 F, f' I' g+ Q
- #ifdef ME_PORT_DEFINED. u; N, O' q7 S* E( j- z+ K% g
- s2 = pin;
1 T# {5 X8 l `6 S$ Z - #endif
2 |' h+ \) v4 @: V8 R5 m - }. Y/ l9 I) _0 m6 v6 w0 Z$ W2 J6 g
- - s8 G+ [/ P4 Q
- uint8_t MeLineFollowerArray::getValue()/ S4 Q5 u8 [, y! z1 t0 T
- {
% O {2 t. ?$ ?2 v0 c - uint32_t LOW_level_read_time;/ }$ y. T* e9 j7 r0 ]" g
- uint32_t HIGH_level_read_time;! C" H4 I6 W4 {4 Q" c! K
- uint32_t time_out_flag;! Q/ b% b0 w& c
- uint8_t Sensor_Data[3];
' t7 f. z9 J# g: c! B$ u - static uint8_t old_data = 0xff;; {! J7 E) s# D, c" n- f
- ! Z& E. Q0 y$ N
- pinMode(_DataPin, OUTPUT);6 T# X8 l! [: e
- digitalWrite(_DataPin, LOW);
& ~% k* _( ^3 [" K - delayMicroseconds(980);. h# y! r+ @1 }
- digitalWrite(_DataPin, HIGH);1 x8 k- q( u. i1 ?5 L8 e: ?. L% x
a$ R( I6 ` S, o1 h- pinMode(_DataPin, INPUT_PULLUP);
3 l" p( Q4 y/ R' q0 q8 S1 o - delayMicroseconds(10);
- V' R/ a6 }; b* ^6 n# i# z
( ~: R' L4 ^ q* W1 n& Y) v k* v- time_out_flag = millis();
; _2 {6 V) q% I# y R$ r) A - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
- w- V8 n3 X0 E# [8 ~
/ _% R. j9 i6 x# X, D2 z. K- LOW_level_read_time = micros();$ I4 V! z' e( m2 h: @ n2 c
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
( ]$ S8 @+ L k0 |+ l4 r - {: d# I% s3 b& Z8 H2 D
- return 0xff;
1 Z& B$ P- S# L; q5 \6 N& \ - }
3 ?' s- j( P6 D - " S- l# H+ N& G
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
* [9 U/ e, Z- f5 S
- ?- c/ U }. Z5 Q7 \% n- HIGH_level_read_time = micros();
7 G( r% i" [$ B. X7 t; T$ Z - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level
" [# ^7 _$ ~, R% o2 k/ b Z0 b - * V z! [. m, H2 T! t- c5 P
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
+ t1 Y/ U" @4 S5 G7 [ e" d9 r s - {# k; ^' @; o, T" C5 L
- return 0xff;
1 W, e: r0 I3 e( I3 E - }' q& |- u( N( `+ \; t7 e" s
- ( \$ o/ G7 }; f
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))( s) [1 f* ~7 K! U
- {9 L9 M6 C6 \' V! ?. [2 X
- return 0xff;4 f6 p& B4 W! v! U( B, X
- }* L) `7 w$ `( H ?% v# }6 \* f
2 r4 _, F$ ]/ b% \' P) a1 v1 R- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
5 n3 c2 y& K: y4 Q - LOW_level_read_time = micros();8 r& `1 i( R9 }# ?% o$ b5 r9 M. M
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
; X+ V$ \; {0 ] - * A* f3 a: T8 q1 w& ^
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
6 j7 t2 ^$ Q) F1 _, q3 {0 F - {
, j- u4 W- [/ ^/ s I' [ - return 0xff;0 e! e2 f, s- r
- }
. A) V6 l% _- }; b, z- k
+ w7 B) n' ^6 Z7 u5 p; }* R9 J- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))
' A; Z' m6 n' j. N5 X$ p2 ^ - {
5 {" K8 m" b4 [6 e1 c - return 0xff;+ h/ C' L# T, d9 ^- t
- }
! E1 l4 {7 F1 s, t8 U; _) p
/ @( K, u" E# d" B- for(uint8_t k=0; k<3; k++)
+ S1 _7 u' O! \2 }$ N, _ - {
8 g" J" v" x' ]! W2 m8 v" F - Sensor_Data[k] = 0x00;
4 h9 m3 W" @% o0 P5 z - ' I5 c" i: A! u
- for(uint8_t i=0;i<8;i++)
7 {9 D! X+ S1 ?# H1 g8 b. z - {& `: w. h. X5 m% v. T4 B* D
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level1 i& G% D- L1 y! f- z
- HIGH_level_read_time = micros();7 X6 [! A, D5 | \( Z, F& c
- LOW_level_read_time = micros() - LOW_level_read_time;
& j2 M9 p) ]: M& o* Z2 }
H0 U& s9 K1 u7 O) _" X. v- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
2 w, |$ @: p; N1 D - {) G8 J1 c' D, y( y" |0 ^
- return 0xff;1 h) B( U; v7 X; A' W
- }
7 {2 y& H) I! M+ J% i
" I/ \8 R; D; S8 e; ~2 E, d" R- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );/ Z) u* \ n k
- LOW_level_read_time = micros();
# V% ]; q" N$ ]# X: b- ? - HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
8 B7 g# X! J# L% W. t - 5 l4 q% {. S; n( V+ S+ ]6 O
- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1% ^9 o* y; ?0 R# R, @/ f
- { b! G" C8 k& E9 O2 V
- Sensor_Data[k] |= (0x80 >> i);
, r4 A5 F6 D% {% B - }. O, @$ m5 C Z+ x$ |
- else if(HIGH_level_read_time >= 100)
, n8 b* \" m2 G; O - {
1 P1 ]8 r n1 F4 H N - return 0xff;
8 b! c( j' ^& N2 z1 G/ @+ i - }, d+ v( Y" m$ _7 H7 t
# _4 G6 Z/ H* V6 }. }, x- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)
- j9 J4 P7 O o7 O4 v( H - { N, Z; c9 U- L1 S; L& \
- return 0xff;; r! d/ U1 j! B8 u
- }
, K$ A, q$ B) ^3 x- e - }
" W, n) Q2 ^! W1 S9 D4 M - }
( z1 ~) f0 f i8 ^% O
/ H3 O; [2 P. R- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level2 _5 m2 |. i7 m- u" V6 B2 }2 S
- HIGH_level_read_time = micros();& @! L$ i! r# I: n7 Q3 F
- LOW_level_read_time = micros() - LOW_level_read_time;! ]5 x1 l9 {0 }" A6 R' |& K$ @
- + O+ G, u2 j/ d. O, x
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) ). n0 g9 N: t: H5 o+ d$ s" P
- {7 N1 e- {2 J( i/ B
- return 0xff;: t. A+ w+ l5 O2 y7 v w' L
- }
+ z$ J/ q! W# w; n - ( M Z/ e( |7 w3 k* ?3 m7 _8 D
- pinMode(_DataPin, OUTPUT);
- E4 t# J0 \) M9 Y - digitalWrite(_DataPin, HIGH);
$ I$ z* l7 t/ N: y+ V* K9 x! |6 I - 4 @* Q5 K/ b% ?6 ~( c( {
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))
4 r2 }5 Q( G# ?( z6 j: }$ \1 C; Q5 U - {) G1 j- S( z+ d1 k3 k1 [/ I0 Z% ]& V
- old_data = Sensor_Data[0];
; H" p. r: h3 |3 G+ l: q e - return Sensor_Data[0];* | ]9 _/ |- ]& K" |/ C) C( o2 p
- }
. F0 u! U2 U8 X& F: r - else0 m7 S1 p! ?; U
- {
* R# h. A2 \- G# _! M: V - return old_data;
9 f# T. w9 s. t3 c+ G6 r - }
& r, r4 x8 S) N: X3 ? - }
" Q# m X* j- t+ c: K
複製代碼
# `8 p( J4 N# p1 |0 [7 N4 [3 ?# MMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
. }0 s; a* k" d) u( V
5 A. b. c# a! D( b c8 z- Y3 n# \" [
|
|