|
|
$ t0 N- S; |7 O2 ~* Q. C
- #include <Arduino.h>7 ]9 ] b, w% [1 {7 C* Q; j8 R
- #include <MeAuriga.h>
$ a; D# [4 M- m5 t1 W - #include "MeLineFollowerArray.h"
8 z1 s' w2 u/ c' w
q; G6 C9 L: e& S" V/ c h9 g- MeEncoderOnBoard Encoder_1(SLOT1);
# t% x& t5 M( t+ m( `# X+ |+ q2 [' P - MeEncoderOnBoard Encoder_2(SLOT2);7 R0 j$ T; f( }- f$ b7 L. w4 V
- MeLightSensor lightsensor_1(12);, ?8 R K- d2 ?* o$ S% Y) D
- MeLightSensor lightsensor_2(11);; t n* |8 I2 [/ {" u- O
- MeBuzzer buzzer;
* Y5 k5 N/ I. O! t - MeLineFollowerArray linefollower(PORT_6);
6 a) Q- e2 u/ p2 L7 ~1 r) A
% E: ]' V' f7 Y/ l+ _- #define Error1 1
( u' Y; S0 n8 ]2 o6 |/ u6 w - #define Error2 2) }8 Z1 R, {( U. C- C5 g
- #define Error3 34 x& S! G. s1 f2 g" A
- 8 C$ d& |# f' d" z0 C8 k
- #define Kp 15
5 C3 y( O# ~, m" d; S - #define Ki 0.15
' x$ e$ L( P) C; @% Z S3 E - #define Kd 0.03) n; @9 k6 ^6 c, O
( x0 \4 h. F/ O$ Q( P2 |! M4 X! T- uint8_t sData;
% s/ E$ V4 d* D& l/ W - uint8_t D1;# Q$ W, Z0 ?$ [. F
- uint8_t D2;8 i5 c2 l7 O! i
- uint8_t D3;( ]" V7 e3 N# S0 Q3 U( D- |* a
- uint8_t D4;8 w" G/ V; q. Z% _+ ?4 g4 m
- uint8_t D5;) x( R, e9 U9 k& Q& P% S- C
- uint8_t D6;" x8 E% n5 @2 _3 M, |
- ' G# B# k) e3 W+ D- _8 V; O* s
- float previous_error = 0;) E$ t' u8 F2 G; U
- float integral = 0;5 K; {7 y" z$ ^( ~
- float derivative = 0;
|+ W7 E0 m9 \ - int Speed = 160;
% J4 t3 ~' ]+ E0 s3 t# z$ ] - float output;
* W% E- n7 Y- J1 t! z, z6 B/ v0 v# _% K - $ D, ^1 }8 z0 e; Y7 \' Q
- byte Left;
# d5 z* A+ I! I& ~! B - + p: e5 z# J: c9 R. B9 P
- void setup() ) Z: ~# d, v/ I
- {/ y4 e ^1 E8 d3 k9 L
- //Set PWM 8KHz
( j u9 c$ R1 \ - TCCR1A = _BV(WGM10);( I1 {4 z3 |' h; C0 B0 ]. H- R- W7 t
- TCCR1B = _BV(CS11) | _BV(WGM12);% S9 p K; _; W* F- ?
- TCCR2A = _BV(WGM21) | _BV(WGM20);
( p, J( U/ G1 R! ?: s - TCCR2B = _BV(CS21);0 P8 P; a3 l5 e* ?. z
- Serial.begin(9600);& o+ x8 q' G- a! p S1 e
- buzzer.setpin(45);$ A; { f7 [3 ?$ U+ L; v2 v
- }
! r- V4 L) h$ \9 x+ T8 n# F; l - " ?1 X( a# x8 Q' ~- K
- void loop()( _9 K9 H) N. N' F% ?! ^& S
- {
/ ~9 d; |$ z7 m0 i2 ]. _ - while(!((lightsensor_1.read()) < (10)));% Q' ~0 ]8 |+ P. t
- buzzer.tone(1047, 500);
: ^- o1 ]) {, F% { - delay(500);$ ?8 T4 | j% ?: m/ F" L
- do5 U( p) Z, Z) B) v, k" ~) `8 K
- {
9 C2 T& F4 E9 v7 @' L5 [ - int Err = getErr();
6 P- g( j0 R: L - if(D1 == 1)
4 u: Q p# Q) j$ _ - {4 I. G& I4 T9 Y% @4 W
- Left = 1;
\' q% w% \5 l' w( ^& ?1 u - }" p [+ f7 f" P3 v7 A+ y5 w
- if(D6 == 1)
6 d' E8 Y4 [2 v b: X- G - {
+ n2 Q4 I, z) m - Left = 0;
: z9 A3 x0 B5 _( q+ V+ S8 r - }
, z7 w" H5 e' r; p. \3 I/ r - if(Err == 99)) Y' i9 z; m& x# J, X" d- `/ A
- {
( |" ?9 n2 F8 U* j) Z9 O; V+ [ - if(Left == 1)
: p5 V. y: [$ i3 y$ @0 t - {
- K' j( Y3 `7 {$ S4 y2 F - Speed -= 5;
# V X) Y# ^4 v1 {! Z - moto(0,Speed);- V, s5 C0 O5 u0 X; w+ v; p+ H
- do
1 R( _7 ]$ w& G3 d5 p+ J- B - {' E$ l( n7 C8 P! z2 I
- Err = getErr();) o$ e' F- B, n! R+ ?! m
- }while((D1+D6) == 0);
3 I# K+ D% s4 v2 E- S, x' J+ _ - }
1 X9 K; y( J$ ~. m( Z2 F9 K e - else
' c6 I, I ]0 H1 K7 s7 C - {
- s6 r4 i: D/ p$ l& m' o6 e# N - Speed -= 5;
- t/ ^* j5 s! v8 N0 E- t2 \ - moto(Speed,0); ' {( ^1 ^" G6 \1 Y
- do
3 i+ X# j: }# _0 W# \8 i0 k6 F - {
3 _6 x5 x. v5 T- r' j3 @+ y0 h# ? - Err = getErr();5 F5 n( u( j: b9 S5 P) t
- }while((D1+D6) == 0);
, w" ]2 }/ R8 h( ^4 @+ C5 z0 R/ w - }$ z) E k. L$ a3 q& {5 i
- }) `& y! W4 B" e- i4 x
- else9 F% E' Z+ W2 k5 l
- {
+ |! |* z0 d' z5 T' V - if((Speed < 160) & (Err < 2)) Speed+=1;
7 T$ B- d* G% Y# ^ - if((Speed > 100) & (Err > 2)) Speed-=2;
+ C+ V) h3 B" o X7 ~4 X; ^ - integral = integral + Err;
( {2 _ v" R1 o8 g$ h - derivative = Err - previous_error;- Z* ]: W; ^3 y8 M% L4 t
- output = Kp*Err + Ki*integral + Kd*derivative;
; J S7 ~0 k' \1 [- R, q( C - moto(int(Speed-output),int(Speed+output));
9 O5 ~. u! E9 T% h, q- ]- T7 v - previous_error = Err;1 ~ x; x9 |' {- Z, I, @
- }
+ [8 r! k% a5 H0 ^! J; [ - }while(!((lightsensor_2.read()) < (10)));
* [% ]# z7 A/ ?& I( i9 I9 g9 J - moto(0,0);
( v) Q% o# @* n. q; ? - delay(500);
+ D" {( r# n) F+ l3 o; f - buzzer.tone(262, 500);
O* s* `( c5 w9 j$ G6 s - }
3 H' Z! l. V4 ], g- T3 W) ?
9 U: E/ x2 D1 h: r7 N1 H, s: q- int getErr()
' T- R5 Q9 \# Z ^, R - {
2 \1 K' L- o( e# T: T- O7 k - sData = linefollower.getValue();: z( ?) Q7 V: f' }* B$ A" e% G
- D1 = ~(sData>>0)&1;/ m* [, q2 k) s# ^
- D2 = ~(sData>>1)&1;2 c3 c' O( `# y+ v# b3 \
- D3 = ~(sData>>2)&1;
? f6 r n9 V4 _0 @4 k0 N - D4 = ~(sData>>3)&1;& p! r9 H$ P& Q9 p
- D5 = ~(sData>>4)&1;
! p: s4 Q8 a) o( x. B q3 M, K - D6 = ~(sData>>5)&1;- }: B2 d1 G0 t1 S7 m7 H
- int downD = D1+D2+D3+D4+D5+D6;
! \5 A) Z% q, ?+ B. \, [" Y - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);& G6 M% Z+ z" A# x I2 g
- if(downD == 0)
$ ~( }. \% h: ] j - {
7 a& t! s8 P, e8 S - return 99;
& A1 ^8 h/ J* b3 `/ Y - }/ B* Y9 u4 r- P% n7 O5 O
- else
& y/ B8 j! [' k - {! z+ e1 |$ w7 @2 Q( L5 N( z
- return upD/downD;* M0 R9 E7 o7 d7 H
- }
( O! J! f( V1 g - }6 t0 b& O3 K* q* B( j: { }0 V
- " P9 ]( Z4 M9 `
- void moto(int Speed_L,int Speed_R)
0 p, [3 ~, K* r6 Z8 d - { }$ p9 X% T: h/ b2 B8 R/ S
- Encoder_2.setMotorPwm(Speed_L);) s' `% d* H% t- w
- Encoder_1.setMotorPwm(-Speed_R);
9 A* i# Z* [; A8 o$ ?3 q - }
複製代碼 5 {2 G0 D8 f1 K7 ~ `( |
MeLineFollowerArray.cpp
( K+ A& q/ q7 D- #include "MeLineFollowerArray.h" T" |7 }3 e& b
- - f" p$ r% B# ?1 Z, n, J3 z
- #ifdef ME_PORT_DEFINED( w) v) H# e! p1 \; I
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)/ z; y, r" f' h; i
- {
! f9 {: W( O3 U X# x, s' P - % L9 r0 n1 x* C3 M. E" y/ N4 M
- }
6 e9 D7 M7 }1 }/ p - MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)/ Y, O2 U3 ?5 a' u% `4 j. }
- {
6 s, {, B+ \# n3 ?* t& `2 i - _DataPin = mePort[port].s2;! W2 y" s. l& ~
- pinMode(_DataPin, OUTPUT);
2 j+ p. {& |2 M ~ - digitalWrite(_DataPin, HIGH);: b0 a# j- e, G- a% V
- }7 ]) r. ]% L9 g# Z3 W
- #else // ME_PORT_DEFINED1 u9 U; ^, k* g4 I1 L i8 T K
- MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)
; o# I! ~, |% Z5 C - {
& V. J. H% J+ l3 r! {7 b. G8 I - _DataPin = pin;' n, s- n$ s0 O
- pinMode(_DataPin, OUTPUT); $ V# I3 a; R+ `! q
- digitalWrite(_DataPin, HIGH);
. s" @# y/ P# X) D - }
5 r" M( b* H* I; U3 U9 s - #endif // ME_PORT_DEFINED6 N" W) v/ ~ N1 r. V2 h" l4 ^ X5 {) T
- ! s" l" A6 j+ K) \6 K
- & l# B5 q% C$ @0 ?
- void MeLineFollowerArray::setpin(uint8_t pin)
4 a9 K. _2 w4 Y. I9 x - {, M0 n) a- D6 E
- _DataPin = pin;; K0 t4 K2 X/ _$ M( W! w- M
- pinMode(_DataPin, OUTPUT);
$ {* l/ s5 z5 D - digitalWrite(_DataPin, HIGH);; O3 o" N' N6 q
3 @ B+ }" A; I# P) M9 b4 i5 r- #ifdef ME_PORT_DEFINED6 n, g5 r' Y% z6 T4 g
- s2 = pin;
" `4 N3 F& Y/ ~# i1 ^; t - #endif8 Z: T) g7 N+ }, D
- }
8 ^, F" ]7 @5 u0 p5 t- T - ) f( j/ R; R1 m4 ]
- uint8_t MeLineFollowerArray::getValue()
0 F& C* Q7 W/ j" U$ o - {1 w9 S t# ^+ S) F5 |+ ?( l& b
- uint32_t LOW_level_read_time;; k: H+ U" X" u' [. m+ ]* h
- uint32_t HIGH_level_read_time;
. f. R7 T) o8 ]3 @5 ` - uint32_t time_out_flag;
8 ]$ i& L. z& ]: r - uint8_t Sensor_Data[3];- W1 Q" t9 e9 |9 S( Z7 t3 i1 f2 f
- static uint8_t old_data = 0xff;
. h6 r; ~1 G1 f1 Q# y% T. [; O4 H - * ~5 Y) W$ g9 X3 s. W
- pinMode(_DataPin, OUTPUT);6 J7 T# P2 E5 |2 |$ M
- digitalWrite(_DataPin, LOW);& E$ ] E7 ~8 }7 @3 d1 ?2 m
- delayMicroseconds(980);: ~7 G8 g; ?& k
- digitalWrite(_DataPin, HIGH);8 C+ K* t) F0 ~* t4 |
# c/ [7 _# b* L* b' g9 R- pinMode(_DataPin, INPUT_PULLUP);
: ^. R4 e* _8 Z' o2 u% Z: h: u - delayMicroseconds(10);8 k: ~" p9 l7 ?* _, E. k
$ }1 g9 a; k: l8 J j2 W- time_out_flag = millis();
" N7 p }$ n3 r s9 c# K - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); p6 J/ I4 u5 q
& H2 J5 ~+ S& v' i% S0 o! _& l- LOW_level_read_time = micros();* N" |# {4 A2 d2 \1 H7 w- j
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out P/ A3 |. h: D) s- F- g" w
- {
3 U- a" O$ V1 z: i4 L - return 0xff;0 x# X% ~/ p$ C2 t- e# D9 J
- }- w: {* @) W( p
- h0 d( ^5 n6 i, c
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );$ s5 v* R5 N8 A& Y; X1 Y; S6 }
/ b$ F% G4 {$ J9 G+ q- HIGH_level_read_time = micros();
# j% F5 J+ S f8 E) p - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level! }3 a" T% O6 t0 k( ^
" ~; {* x) j' k9 u. c9 ?- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
- Y. Y$ T9 ~! O1 x3 F - {* F/ i# a0 r' }; t+ Q
- return 0xff;1 Y% m' b# R/ O9 _
- }5 D) X. ~9 e9 ~0 R
4 ~8 u; ~+ u' X( T+ `7 \1 H3 l0 V- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
4 a K) C" C" z0 r - {
( e9 s! f5 `2 H5 u! k - return 0xff;5 E0 _! w3 X3 S# U' h8 y! C+ p- _
- }0 M ~2 |7 F a/ M! Y9 a
; }8 P" ]2 n" R- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
+ k. f7 \4 @0 f; h) M0 L0 d" V* ~ - LOW_level_read_time = micros();: d! X/ c" V& [# m9 F+ _
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
& C% k' L3 x" e
- M3 G$ v4 a5 j; G7 ] W- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
/ @5 n" U2 r, k$ a - {9 P9 @) Z9 S9 q3 [- o! w& m
- return 0xff;1 o; O2 i s1 P; ~0 c" x; X1 d
- }3 m" X9 N0 d% R! K
- 5 R4 E1 _- ~' r
- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))
" a5 V7 T1 j& Z2 w/ ?2 T; u! V - {
( L6 w" }: z* n( h( j - return 0xff;
/ t' L+ w( V7 F) l - }
O7 K3 K& h8 u! i6 a: s9 w; X
5 N* Q. |- z2 M2 L: s4 Y- for(uint8_t k=0; k<3; k++)
t0 D) @6 g) U - {
/ A( S1 O% n: c8 f4 m! M6 ` - Sensor_Data[k] = 0x00;
7 j: m* i0 n$ F$ | _/ C1 q
. A: Q8 v9 y% R/ l" m- for(uint8_t i=0;i<8;i++)
: `' t6 \6 V+ F8 n - {
4 k$ O: U5 |! v* Q) B4 O& `/ N - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
+ V% V6 b! v" T* V5 |( K - HIGH_level_read_time = micros();
* M" G- v2 `0 b8 B Q5 P( K" p - LOW_level_read_time = micros() - LOW_level_read_time;
& q" O: _0 e. o8 Z% a' J
: Z7 x0 m2 M# n4 z, {" C# o- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
; {9 R, r4 {, H( H: ?! K1 K+ O' V4 w - {8 t; P! f7 ^" w( U
- return 0xff;7 K4 ]6 Y9 K8 u$ A: a! t t
- }5 U. S( ~" e# k: J+ u8 V" m
- # k, t& n3 d( J! o
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
9 H0 {7 r% Q- L - LOW_level_read_time = micros();
" r1 m+ F7 l' p# w3 T - HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level; C; [; T; B: q6 X
1 _) u9 J. a% R- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1& T! A. ]7 t* _8 i u" s* ?
- {- F2 I8 d9 u J9 [' C: M7 _ d* ]
- Sensor_Data[k] |= (0x80 >> i);
* {7 L4 n- m, @3 G2 p - }
M$ i* {9 I4 V9 Q+ l# [8 J - else if(HIGH_level_read_time >= 100)
4 I) h- c; a) {' a - {
6 _: e+ I+ ?' @. P - return 0xff;' U0 X) z4 q) [3 Y7 A5 q* w
- }- r1 A& H6 p' {
" m1 e3 h" p2 Y, H* i- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)0 d* a$ L6 {2 n0 N2 u' y; K
- {
7 v) ?& o" U0 i$ a8 e1 s - return 0xff;
, H2 B+ C5 `/ Q* j3 Z- d - }/ F7 u4 W" u1 D! q, K7 w# c! o+ |
- }+ a- q; G& _- }) }0 I* U
- }/ f; N1 f" E! M. O6 V& w) s
6 u6 _5 X5 I: W1 P7 @- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level, I5 u) n* q9 W
- HIGH_level_read_time = micros();
3 |# _" @6 s `3 C3 K: f" @: B - LOW_level_read_time = micros() - LOW_level_read_time;/ {* [1 l: l, R+ G9 K, K
2 a2 S) g$ C5 M( w" Y- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
. Z% t) f/ E8 b4 F2 V! b! _* H - {' n- W" U1 K6 Q* R' s
- return 0xff; D& i7 h6 S- Y4 D9 ~
- }
; Y" O! P* M& o7 Z: D% Q2 t - 3 j; ~! l; a( V6 ^7 ]
- pinMode(_DataPin, OUTPUT);
3 m* _4 `+ d- H( n- m: j& X! \ - digitalWrite(_DataPin, HIGH);3 Q; N. X0 [, K
- # {# v1 {6 ~3 I& O
- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))
. V! m$ G, b; w% A8 [1 Q+ n5 d) i - {1 J% S" X) o. u, A8 Z6 F8 h( j
- old_data = Sensor_Data[0];6 p6 x+ @* t) E" w: l& T
- return Sensor_Data[0];) @- E( i1 C' {# ~+ L& Y
- }( @) L8 ]' G0 ^& W
- else$ ~8 x9 q( }2 P( [/ m
- {
6 G3 E& o' V$ M, ?- Y6 X0 R1 k& L - return old_data;' D( X( v7 a4 N
- }9 y( b( _ \) A% e) { l: }
- }
0 A$ V" X1 h3 y
複製代碼
( A; V/ [# i$ u1 n4 GMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
0 {% d- Z% e: \& k2 K; l
5 q1 i+ T% C2 N9 M9 N7 I
|
|