|
|
) n0 x# }3 d# \2 z) T4 B
- #include <Arduino.h>
8 A9 |) S. r4 Y$ Z0 j - #include <MeAuriga.h>! b, s) G, T: C* n5 `
- #include "MeLineFollowerArray.h"
0 y2 u5 u* f2 k+ W3 V: W
, J- @4 X4 J; p( ?- MeEncoderOnBoard Encoder_1(SLOT1);
& o. m2 V: ^1 n6 P0 p- L" S - MeEncoderOnBoard Encoder_2(SLOT2);
/ o1 v0 c' w2 Z1 L- r - MeLightSensor lightsensor_1(12);
% v* r. i& H) P! y" n3 B0 R" I& X, U - MeLightSensor lightsensor_2(11);! `' o0 n2 s+ w$ g* T. _0 A
- MeBuzzer buzzer;' @: z; W4 y7 w
- MeLineFollowerArray linefollower(PORT_6);! m) @# j" d* l
3 ~& p2 W6 Z: v- ~- #define Error1 1" _4 \8 O, H B1 h }
- #define Error2 2
; V' e* p# t1 \. v3 C - #define Error3 3( H2 G. L- f) T1 ?
/ i! }6 {( O9 A/ E0 `/ s# E8 C- #define Kp 15
& t, P0 e c$ v# i# A) u- Q - #define Ki 0.15
: `6 A* z0 `8 N9 o% H$ G7 N - #define Kd 0.03 L4 E8 D. n! M% `
- 3 } u0 B3 q" [! x
- uint8_t sData;
: ?: |9 v% M8 Z8 t I# f - uint8_t D1;
$ a$ d. N5 J) e2 B, g - uint8_t D2;2 b' }( d' ~- R( C
- uint8_t D3;# @! y, @6 T k. N+ M, x
- uint8_t D4;/ H* O- J/ B) [- }$ d
- uint8_t D5;
9 ]" U% v2 f$ m1 G - uint8_t D6;
. _3 ]$ V+ x$ g1 S - 3 B' ~1 E: M- s: i8 U7 M2 K3 d
- float previous_error = 0;
& z# `: p% E/ ~! p2 y - float integral = 0;
& u! Z; s; m: V' |" Y, r3 J - float derivative = 0;
! ]# q' Z: R! N - int Speed = 160;
" e5 l, @9 h% L - float output;
3 w& R4 p8 _. ~* X
1 U A7 T: D! @5 k/ T$ d( V- byte Left;
) a: o/ z: }* U( ~; q- ~+ K
# s" E! S" B" H5 R4 v) x- |- void setup() 4 f2 Y$ B$ p4 Y' m
- {6 [* y) z) |+ t0 O0 [% Z1 M
- //Set PWM 8KHz+ O& t3 Z: J6 p. S7 L
- TCCR1A = _BV(WGM10);
: H ~ u3 `6 W* r l3 E: N - TCCR1B = _BV(CS11) | _BV(WGM12);" |- K* W' ^; n0 i
- TCCR2A = _BV(WGM21) | _BV(WGM20);- Q( s4 F" Z4 Q7 z2 R
- TCCR2B = _BV(CS21);! u! w7 q4 Q+ a+ j
- Serial.begin(9600);
/ \$ o9 h& n" O) a) P1 B) P9 N - buzzer.setpin(45);, y# ?9 D$ W* t
- }
) @+ x$ ~% W. \9 C
/ Q3 m% N1 Y) E- void loop()6 N- M6 D. o* H6 f
- {
# e$ P+ c, z7 ^" d - while(!((lightsensor_1.read()) < (10)));
. e3 E# f8 Z5 f' A. a. c# y - buzzer.tone(1047, 500);
9 z. b% S4 }6 o; r* j1 k0 h4 K3 ~. X - delay(500);% O7 m) U+ u9 P7 Y% E! {
- do
" W5 x1 P6 g" q- T4 i3 A - {
& x" b; h1 C$ t, @, H - int Err = getErr();
7 Z9 m. T1 {! {& R6 |7 k8 d/ I - if(D1 == 1)8 I& I f+ L7 `4 l' i4 a
- {; `( s' A7 t" _6 E% K" t! V: ]1 Z
- Left = 1;% E8 O2 {1 [" ?$ I3 R: I
- }
/ H" [% L* Q o0 h - if(D6 == 1)
3 J4 C6 |( y4 K4 |: K" ]7 ~! x4 q7 P - {1 W+ O2 f( g7 y) ^+ v+ ~; R
- Left = 0;# ^# n4 ^% O) ?: E4 J0 O$ ]- o
- }6 i; i0 m% m3 N' i
- if(Err == 99)
% e' Q5 N( h& y7 B - {
5 X! w( M& a0 h6 A9 G3 z" O3 }: r - if(Left == 1)% E6 l0 k" s7 Q3 X: q7 @! Z" z: g8 t
- {9 h. _; ?9 S0 J. o
- Speed -= 5;
& {* ?, D: [7 u$ J - moto(0,Speed);8 l9 G9 Y2 v, q9 |4 t
- do) W0 d. Y) n, J0 |7 S
- {
3 B2 s- c: b& i$ \& V) H" ~ - Err = getErr();
3 |$ B: ~2 o% b5 { - }while((D1+D6) == 0);
5 y5 V* _6 T" p - }
( e' F+ ]- i! M! e* E) J# N# e7 Q - else1 ]* v8 O8 |7 O+ A7 H9 N5 Q
- {. `* u! }% {- B0 G! B" `
- Speed -= 5;- A& t0 h! w( Q: m; O P" Y
- moto(Speed,0);
/ ^# U; K( J0 j, }1 x - do$ g! @; U" \; t" F! j; M
- {: V. q" b/ P8 s; V: g
- Err = getErr();
' P) q6 ?7 b* H) |; _ - }while((D1+D6) == 0);
: x) q* x$ I# n' j - }
/ |& e) n# M9 O* [5 E' e - }6 x/ M# Y! c/ t& z
- else- ^2 J3 p7 P6 q
- {! o% i4 A# O: c, M7 F& ^2 t% Q
- if((Speed < 160) & (Err < 2)) Speed+=1;
$ ]1 b5 p: V! w - if((Speed > 100) & (Err > 2)) Speed-=2; * ?5 Y- f2 ~8 j5 Y e
- integral = integral + Err;
* \7 k1 n J9 Y - derivative = Err - previous_error;
( ?8 V: }5 c/ F. `0 G: y - output = Kp*Err + Ki*integral + Kd*derivative;
$ ^2 e1 s* [+ i6 @$ u - moto(int(Speed-output),int(Speed+output));& L: \) a c6 x7 U
- previous_error = Err;
^4 V: d8 ~* R# j; @; b" }7 l - }
, m& K: F1 g$ a) [) g" M: }6 \4 b - }while(!((lightsensor_2.read()) < (10)));1 u% _; [- Q+ ^5 t3 g; y1 L
- moto(0,0);7 T! o R9 o }7 A1 N" B
- delay(500);: S r! \ h m3 I7 Y2 I
- buzzer.tone(262, 500);. i/ V0 I! g1 C
- }
7 {& }: F: w0 v2 l - 9 u! z1 ]* l( x" A5 c8 U, f$ W0 C
- int getErr()# }9 t: ^. E, ?3 H; ?
- {
; z0 H( M/ i; k9 o2 V7 |. J - sData = linefollower.getValue();
. n* S1 p/ \" f s' u/ k - D1 = ~(sData>>0)&1;
1 R, t H2 v, L4 P v; A - D2 = ~(sData>>1)&1;
; H; @1 @- K2 \$ p8 N4 Y. u1 s - D3 = ~(sData>>2)&1;
4 ?. m; C# _ t0 e - D4 = ~(sData>>3)&1;
6 P8 v# F3 V5 p - D5 = ~(sData>>4)&1;
* K: x1 O1 `" j u5 p9 A - D6 = ~(sData>>5)&1;% }6 {% t0 [. K/ g
- int downD = D1+D2+D3+D4+D5+D6;
Q/ N5 w: `. [" {4 \ - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
- U5 j. u4 C. h - if(downD == 0)- z C- |& L# A/ s& Q9 I& g
- {
0 p& h& ^. a: J# T0 c" @2 l - return 99;
* w+ |' V/ G H" V4 T; U% L/ X - }
@4 v* N! `: r/ D! | - else
7 ^; x7 H: K; H1 e( r$ `& s - {
2 Y' J2 H+ h2 }1 K - return upD/downD;
0 G3 I. |1 q/ x5 d/ { J6 ^& t - }- D( q0 O/ A! V8 Y2 w! t5 J3 @
- }
( Y6 `, Z2 }: Y# [2 K6 w9 R - ) _3 G: g7 C) q$ X0 T
- void moto(int Speed_L,int Speed_R)3 Y; }0 X4 z0 X) }
- {" {- H5 r6 `4 j
- Encoder_2.setMotorPwm(Speed_L);
/ o* O A1 j0 E$ O% h9 e9 m2 { - Encoder_1.setMotorPwm(-Speed_R);
4 R- J: _* G' v; @5 t - }
複製代碼 N+ A* K# [3 X Y. @
MeLineFollowerArray.cpp
, t# E+ O8 p, L! L2 ^- #include "MeLineFollowerArray.h"+ G1 A! o) v l7 {+ Z1 V8 I* }. t
) |# [, {# y+ b! G0 } ?, T- #ifdef ME_PORT_DEFINED( W7 ?: R% z, H
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
9 M$ V; F7 [" ^, {9 Z% n3 w - {* J) X2 T% h# x7 {( s6 M
- ! r3 g9 Q, M: r; e* O' Z
- }( x% m0 X- f- k3 ]
- MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
/ h& X: t/ Q, J/ f' x- Z - {3 p' E! S0 z, g) M, d
- _DataPin = mePort[port].s2;% u3 {$ e9 u. a! P( H7 E4 L( N* o9 O
- pinMode(_DataPin, OUTPUT);
# ]8 V2 S# {" G% y9 w - digitalWrite(_DataPin, HIGH);
% Z5 R8 V5 o7 z2 [+ i - }' p- ~0 o* V# ^$ v4 a6 v. b: e/ Q
- #else // ME_PORT_DEFINED
; b6 T8 b) F; o( d0 o1 ?6 ?2 e - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin): T% s! U" V8 F2 k8 q: S( k0 F) Q
- {
$ e B, F% L! u6 L - _DataPin = pin;
5 y% `$ G' Q, x - pinMode(_DataPin, OUTPUT);
0 `' ]! C7 h1 Z9 ? - digitalWrite(_DataPin, HIGH);
E% v; d9 e k2 t - }
" S4 V% B2 U {3 R2 t7 Y6 [+ L - #endif // ME_PORT_DEFINED
! I5 X0 g& ^4 K3 d& I8 y
$ r" d+ [9 p3 b9 @/ q4 t
) _' C2 U& q4 {6 }4 ~7 y- void MeLineFollowerArray::setpin(uint8_t pin)# U+ j$ p% ^2 ~7 I* U2 U) \
- { e; s5 R2 s& A6 C& T$ e
- _DataPin = pin;5 D+ ?3 m( I& m
- pinMode(_DataPin, OUTPUT); ' h) t5 z% S3 h! D
- digitalWrite(_DataPin, HIGH); j# n9 P0 R1 o& `& Y0 g
8 t5 C2 M, A6 Y1 [* o8 t, k) u; b- #ifdef ME_PORT_DEFINED
& O, Z" i- B* Q) V M$ m - s2 = pin;
! @- v8 ` j* A5 p H - #endif
9 J( \' f' P- O* `7 d% G3 u; \+ P {" h - }
1 i' [2 U4 L" s. E - 9 \' d+ [% H" {- h+ @3 w3 T
- uint8_t MeLineFollowerArray::getValue()5 S# g, J# y$ [) s% a* i
- {
- b, n: r* H7 j) c - uint32_t LOW_level_read_time;) m v/ p$ s" ?, \8 q
- uint32_t HIGH_level_read_time;
0 r4 z" y+ g, Z: r - uint32_t time_out_flag;
+ h$ O% `& S- ]' X. Y# }5 G - uint8_t Sensor_Data[3];" y: u5 E5 l( V' H% A0 k$ j
- static uint8_t old_data = 0xff;
5 y% |; u+ v5 q" s, x+ C - # e, Z2 m ~7 |/ e
- pinMode(_DataPin, OUTPUT);
& \% X) ^' D8 d! z1 g/ n - digitalWrite(_DataPin, LOW);* u2 c5 H/ E9 { R
- delayMicroseconds(980);( T5 x7 b- H: O" I1 L3 e* r: f
- digitalWrite(_DataPin, HIGH);; H0 E. Y$ [4 o; p X
- . p( O$ j: T# H
- pinMode(_DataPin, INPUT_PULLUP);
h' ]7 P- v' V2 a( q6 ?- f* E - delayMicroseconds(10);" E) s0 Q/ u- Q- R* V
- " V6 G4 Z+ i P" @: p
- time_out_flag = millis();! F; ^! _, N3 y% G4 G3 b' v
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
+ | R0 w6 N3 M( b5 F
; M6 s! H' q$ D& Y3 K- LOW_level_read_time = micros();
1 X/ E# B6 ]- D8 t: |& R - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
- I5 B% R+ u: O. g+ a - {
" @& l8 \" g* F% `$ h% K: N - return 0xff;
$ g7 Z3 b) A: X) P# k$ L4 k# b; u7 P& ^ - } m4 n! Z3 @& w A- j5 Q$ t4 L' \
- ( @3 L3 G5 T1 m) c k- @
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
n# i4 {$ l3 l# b z# x
" S v: A! Y8 W) r4 j- HIGH_level_read_time = micros();, D$ ?& E- ~9 d
- LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level* H' f( L! N o* ` q8 |
- & a$ T( G. e9 S7 ~9 Y5 G3 O
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out+ Z1 a+ w7 ]8 O4 }
- {
6 h% d% ~' L8 x& n - return 0xff;
( |! E3 r$ y! c1 ] - }
; q9 d8 |. ]. A' h1 i
& P9 X8 e% q& d- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
. ? G- _/ f, c2 G - {
8 a2 g$ g% K* l* v. R - return 0xff;
/ E* z* Z. A; f! p2 U; B( p - }# Z0 o, }0 B$ l0 a4 B9 G
; I& i) ]) B# [$ b+ r- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
7 n6 Y X- g6 n$ Z* k - LOW_level_read_time = micros();
y- y2 {' B' @* D& b7 p1 z( C9 ~ - HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level& o5 A- o2 |0 q- H, `
3 l, p! `' a5 Q- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out) d5 R( t$ l# H: O7 M
- {
( R! G% R. ~6 d4 [9 v/ L - return 0xff;, a2 p3 Z, ^& U; T& H1 q& {8 U! ~
- }
* x0 e% E: ] w4 l* B/ G8 }+ `2 w
d V- C; B" w- @8 k8 t- x9 T- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))/ {& V: F1 S& n; P* N" e" M: c- Q
- {$ `8 ]2 e( f8 F2 T7 z) \% o9 c
- return 0xff;+ V; a' I( Q) p( K/ }: A2 A3 ?' k. |, A
- }
9 R1 y3 F. { y; x - 4 W& I! S+ ^* @% T. P
- for(uint8_t k=0; k<3; k++)
1 W# Q4 r; R8 B3 B8 A - {
8 t- j/ O2 [+ v; I - Sensor_Data[k] = 0x00;5 o4 N7 ^6 B$ F
- , s+ e5 ?; m- T2 E, l: T
- for(uint8_t i=0;i<8;i++)2 T2 I0 b/ I( F/ r, W) e
- {% a) O$ O! @7 S5 `
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level3 w' v6 i `9 c9 S( y @0 D
- HIGH_level_read_time = micros();. z7 f3 o i/ d9 i
- LOW_level_read_time = micros() - LOW_level_read_time;
1 U/ b2 o1 M3 @ - ! j5 t8 h- @- ]1 E
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
* l9 d$ i1 }) ^1 ^5 P5 @5 \# W - {5 P# v% w) ]4 G2 n! D
- return 0xff;- n" Q2 E; i+ U d3 i
- }
9 L& G) O- f! O8 B1 Q4 q" N: w! g* y
" a& f. F& |% Y; k" r1 i0 u- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
8 Q( [. B1 `( z6 z) }! c+ j" C - LOW_level_read_time = micros();1 s4 c4 x8 Z- y
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
" r/ k1 x( m+ j
/ c: f% g, ^# X$ X6 v! @- k9 W6 @- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
( q4 [- k/ H( D, \) } - {; O% ?" Y! x' f5 x% h( _
- Sensor_Data[k] |= (0x80 >> i);
4 m* N: ^8 R# U - }- a1 M2 X' p- r
- else if(HIGH_level_read_time >= 100)1 a$ q! M' e/ x) W
- {- n+ B$ w1 E. I0 [
- return 0xff;7 M7 N! `; S8 x& Q* K% w+ w
- }
# ]6 Q/ D4 J) n0 t5 H
& ^6 y9 ]4 P) S# M- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)
z+ z4 n0 U' i: v2 Z a' A - {) n7 t! t* j0 Z* n! n
- return 0xff;
9 e# ]0 a% F- ], Z - }
/ S: m9 c. k: I7 b - }8 V9 q% B# H* p! G7 n% N0 H
- }" \9 w6 K% h7 q
- 7 u- m6 @5 R5 F, Z, D1 i
- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level6 v2 l8 D" M- L
- HIGH_level_read_time = micros();9 K. \0 k7 x! u; [
- LOW_level_read_time = micros() - LOW_level_read_time;
: k0 ?8 e+ T3 s7 n& _; k
6 [5 a# R5 }8 m2 ^3 j6 r+ v* q- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
], }7 P% Y' g, Q* C - {% l4 g, [) V5 Z2 W! U
- return 0xff;
( c/ v. z+ \! m# G$ l' L+ o - }
5 @$ f0 M; `6 _! H
n3 F. `4 A- ]- pinMode(_DataPin, OUTPUT);
( R6 y5 {5 U" \" H. [& x3 u - digitalWrite(_DataPin, HIGH);) R9 N" H# q* P f& W4 k) A
* D. F8 T8 T6 e# C a) x- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))3 \8 E) m! p! U: ~4 c- E
- {, d7 f a- q1 M( V
- old_data = Sensor_Data[0];9 k5 T8 L1 ~7 `, p: L
- return Sensor_Data[0];
2 L" `, ?% I) l - }! g" A2 f2 q( i7 x. U Y# f# P( H4 `
- else4 V+ C C- k+ X% d
- {
, ^7 r- k4 v+ y) D+ u0 K - return old_data;
( X. ~' W! q5 M& c1 A - } k, V" j/ X: j, Q* {2 ]2 U+ @% O
- }
P9 [) T& V6 D, Z) `% M
複製代碼 ' v3 ~ J: G% A+ f9 C/ e. r
MeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
. t3 r8 j$ X3 f/ b
% _9 W1 n) N: N |
|