|
|
: |+ y8 W4 O' F) T4 W& I+ @
- #include <Arduino.h>3 j7 R* |2 s& I5 `2 Y- Q
- #include <MeAuriga.h>0 m/ p3 {; _# v% M+ ~/ G/ J
- #include "MeLineFollowerArray.h"
, ?, l8 m. G8 Q
+ E e" z- n8 _7 g- MeEncoderOnBoard Encoder_1(SLOT1);
% B" h! f. ~ H, T% d! E9 T - MeEncoderOnBoard Encoder_2(SLOT2);
3 J) z: ?' h: z/ M - MeLightSensor lightsensor_1(12);
. s# Q1 m7 y, r' t) C: ` - MeLightSensor lightsensor_2(11);3 o1 {1 O2 e! N6 ^% i
- MeBuzzer buzzer;( T: v: y2 S4 |8 z/ W( x, L( w1 i
- MeLineFollowerArray linefollower(PORT_6);
1 t+ l. S0 ~! R' w
3 o% g- N e* B: ], r- #define Error1 1
4 C% I ^# J4 _2 w2 i# v8 ^- ^ - #define Error2 2
6 R! Y' _; t" u6 L5 ?! o9 H" ~! y - #define Error3 3
6 d+ C+ e+ J3 A+ V) e Q; o - ! h3 Z9 B6 ]+ j2 H
- #define Kp 15 k- W1 F: c( k1 a0 r+ k% B+ @
- #define Ki 0.15
- p* T6 N+ K' n: n# p* ? - #define Kd 0.03( e& G# G: I" c( L$ w
- & S& B# @+ E4 d6 [# z [1 D, |- x( L# f$ Z
- uint8_t sData;
# U# d8 {7 Y j z- J7 l - uint8_t D1;
! \7 S) ] m$ m5 Y3 n - uint8_t D2;
! q/ C7 y4 C& m% G9 ] b - uint8_t D3;
$ p# Z8 w- X( I4 u$ B @, E - uint8_t D4;
, ^5 [7 L- c" \5 }, { - uint8_t D5;; E# C/ i# c! ?4 Y$ S
- uint8_t D6;
, k* H) P* {5 w( A- M$ }9 e& g; l - - U& H/ [6 A9 C8 w% j( S
- float previous_error = 0;
; K( r. T! L/ B. P; ^ - float integral = 0;# ^/ {# @9 m6 m( }/ |
- float derivative = 0;
4 x8 D* x% v2 d! ~! G4 v) D - int Speed = 160;- z2 E; d3 y7 \: t9 M7 @
- float output;
& ?+ A6 v% V% j" p! U# Q/ J& l3 [: k - 7 I9 S/ u8 t' c6 \" b
- byte Left;
9 c- b3 U' D6 N z: M; x ]' Z- e - , g0 ]" |" q+ l( N" }
- void setup() 7 S- K; }' O: O3 b/ L) K1 N6 r
- { N j u% Q( H1 w, Y1 M
- //Set PWM 8KHz
6 G* @5 ~7 W k - TCCR1A = _BV(WGM10);7 m2 E2 f- Q5 }
- TCCR1B = _BV(CS11) | _BV(WGM12);
% [: {7 R, J4 W8 ~ - TCCR2A = _BV(WGM21) | _BV(WGM20);4 R. B0 B* |# g
- TCCR2B = _BV(CS21);
: Q- i0 y* g: S - Serial.begin(9600);6 K( F' d: h0 U0 N
- buzzer.setpin(45);) ?$ s) G( w. R' x/ I
- }
% C4 f, D3 B) R# b8 s' ~. x! N
0 Y$ ], @: P4 u& Y& W- H- void loop(); \& m/ o1 U- `1 ]+ S# I2 U
- {
/ R, W' Y0 B+ m+ L* \ - while(!((lightsensor_1.read()) < (10)));5 F) P& V; x0 F( `) C1 h
- buzzer.tone(1047, 500);
" V0 Q3 g0 N4 ? I - delay(500);" n/ E L+ z. w) y V9 A
- do
$ m W6 x2 n, I - {
6 _: `& |: \ B - int Err = getErr();4 l V$ V |: H/ U+ k/ X9 S2 {: q
- if(D1 == 1)
$ Q5 s ?1 X% q1 A9 q - {
- d8 i( Q7 e2 h$ i: E( q, O - Left = 1;7 S4 ^6 D, I \ y2 l9 F5 @
- }
, b, t4 `0 o& \1 E6 @9 V# ^ - if(D6 == 1)+ R% Y! h4 p! U+ w$ {6 c: d
- {
, b; j8 _5 Q2 {* X4 J% G - Left = 0;
/ y% Q; x, Y' I, Y- N3 {3 {; [ - }
7 P" S4 p8 K' B' K0 y - if(Err == 99)
5 H+ w$ K. ^1 S8 z - {
* Y# `3 q) c1 S7 x% R. ]3 q - if(Left == 1)
/ _4 A; K: t3 b1 {/ ]+ v5 s - {
r8 o7 u p% |' G: r0 r& W - Speed -= 5;0 U2 ]5 w# V. I& B; r8 }
- moto(0,Speed);5 y" c$ `* x. E5 R2 b9 Z& H
- do
) b9 B) B. k1 n: R4 R# t1 ] - {
" p1 h. `/ ?8 u, j - Err = getErr();$ y+ ^1 G" e% j: _7 }0 Z( I2 O
- }while((D1+D6) == 0);
6 [+ C5 J5 l7 M6 A/ N - }
9 t+ F! w! m7 H6 M! |8 @) n+ E - else
6 Q+ x- y6 Z( Y: M/ D9 u+ g - {- v: ?( M; O8 C) b. D
- Speed -= 5;' k' Q3 z2 r; @% W
- moto(Speed,0); 1 T; ^1 E1 ^( I+ R/ O
- do
; ] u# Y( \7 ^& C1 r - {
* u7 K" E7 R; K1 Z5 v& t - Err = getErr();
$ H$ e3 e0 h( B) y) W - }while((D1+D6) == 0);, I+ r y S3 c& E/ e: H4 R
- }4 Q0 R* C5 ^1 H' U! F
- }) c% g. w4 i' r' n
- else
6 F1 ^: d+ n, T4 L) O1 E - {
. \! |4 Z/ h7 V+ \# {) p. K( N - if((Speed < 160) & (Err < 2)) Speed+=1; $ w4 J' W. N% z3 Y9 ?" n+ N1 B
- if((Speed > 100) & (Err > 2)) Speed-=2; 3 d" M2 K) Z: |0 m: k$ W
- integral = integral + Err;4 Q5 A+ S: z" E. k3 @. c& R: E8 q! v
- derivative = Err - previous_error;* [) ?4 v0 `" Q! T4 d! A3 @& `4 k
- output = Kp*Err + Ki*integral + Kd*derivative;
& j3 p+ k+ r5 _. ~- d d# K1 m1 b - moto(int(Speed-output),int(Speed+output));
# T8 [) W# Q% U - previous_error = Err;
' F" F0 W8 ~+ F1 F - }
) e0 p/ g: T' p+ Z: c0 W - }while(!((lightsensor_2.read()) < (10)));/ s% F7 C- `, K! q
- moto(0,0);
! p- ]/ [7 J/ V - delay(500);0 x4 E8 u* g) l4 E/ |
- buzzer.tone(262, 500);3 m. U2 |3 k1 n! H! d$ j2 O
- }6 Q8 }: T5 m$ d- R- F" X! \7 [
% P4 U8 ?2 |9 z9 U/ a- int getErr()
3 H# q2 @+ ^2 R+ f' a - { ) U2 b! }% x/ h
- sData = linefollower.getValue();$ s4 w6 b) f" `6 {9 ^4 E0 w
- D1 = ~(sData>>0)&1;5 v' [* A7 t3 _
- D2 = ~(sData>>1)&1;% b6 y4 y( ~" b+ n- x! F
- D3 = ~(sData>>2)&1;3 A1 L/ k4 V$ @% ?/ e
- D4 = ~(sData>>3)&1;) b" _2 {: }- `+ O1 }4 ]7 I$ q" _
- D5 = ~(sData>>4)&1;
0 r3 i- r6 c$ }3 K7 _ - D6 = ~(sData>>5)&1;% p) c H( }; D- D4 x5 a
- int downD = D1+D2+D3+D4+D5+D6;
* }% d3 o" ?: ?. \ - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);2 p5 F2 `) w n3 y/ _; G
- if(downD == 0)
& y P7 u5 |$ u2 f - {
3 {9 ?' M4 a+ C& v* K& D+ d2 v - return 99;3 H* C; i N+ A8 D9 U; {
- }0 Z( M- f$ c5 Y
- else
2 g7 ?' F6 V3 v/ C4 F" J& G" q7 m - {/ x: L9 w5 a0 ~
- return upD/downD;8 v& c2 G' u. z7 }
- }
! \+ U p7 ?" E/ A - }
+ Y; r% W. V! [$ g" S4 K - Q( ^3 T4 B! T
- void moto(int Speed_L,int Speed_R)+ e, N5 B. |: t; U& z1 E
- {* _# s% ~7 ~& D, c W
- Encoder_2.setMotorPwm(Speed_L);. h- C/ r5 F5 ^* {; n
- Encoder_1.setMotorPwm(-Speed_R);+ v f8 l! W! l7 t: M |' D. t
- }
複製代碼
N# K( n7 M$ i+ C+ h' rMeLineFollowerArray.cpp7 C _9 C6 K, a8 L! y% W2 q) V4 w; M# w
- #include "MeLineFollowerArray.h"; a% i% q0 k4 m+ `2 T9 a+ k6 _' N; o. {
- 9 E) R# ?7 Q3 t* q a
- #ifdef ME_PORT_DEFINED0 n- f4 f* Z: E% p( N
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
5 f2 N/ m; @" U3 G - {
: L0 U4 p n5 Y4 U: c; P; w; A+ K3 Q& X
, d% H* B3 k. Y* v# D1 i- }8 Y' c! }' T, S' i
- MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
& B, j9 U9 j3 p2 {" G) p - {& W0 y; D1 d6 s5 B
- _DataPin = mePort[port].s2;
0 ]1 l: w. o# k$ t - pinMode(_DataPin, OUTPUT);
/ a$ Z& R% k% Q; I# J( _+ ^' u5 L! m - digitalWrite(_DataPin, HIGH);
. x1 A$ s9 p. a - }
2 F/ I9 i( I ^; t: X' l' Z - #else // ME_PORT_DEFINED8 V1 @# G7 \8 U7 n3 R
- MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)' O# @; B- u' y* c) g& K* Z9 A
- {% `" K9 s4 O; b5 q
- _DataPin = pin;% t e6 ^% X% f- C
- pinMode(_DataPin, OUTPUT);
2 F4 z" N/ [4 Q6 ] - digitalWrite(_DataPin, HIGH);
) G) t- I9 U D2 X& u - }- Z3 {# t' \9 G. ^
- #endif // ME_PORT_DEFINED3 i' P/ A7 I, i" t3 W8 ~
# p. @ ]4 I; [
) ]( H% X, L4 Q9 E4 b0 b- void MeLineFollowerArray::setpin(uint8_t pin)
' X- l$ B- w, v) U& [ H f" H - {
, J( T# I5 D- ? - _DataPin = pin;
! X# j+ b% y# h - pinMode(_DataPin, OUTPUT);
, y) Q$ V7 F+ T- }5 j) y0 W. H5 W - digitalWrite(_DataPin, HIGH); }& b8 I U3 V* D: U
. I$ n% \0 z' w; J& t4 w0 t- #ifdef ME_PORT_DEFINED0 Y2 h* p5 T# A5 U, u
- s2 = pin;
) D% e/ Z2 m K4 @. M - #endif
" r8 T/ N4 i' s) E8 ?8 X/ W/ Y - }
3 ^# _, }+ o: _# ]9 s# q: k - + \3 `7 _3 r; `5 M
- uint8_t MeLineFollowerArray::getValue()
6 d M7 w. e6 e8 f - {
' a) C K2 B3 b6 z' n# ]" G( [ - uint32_t LOW_level_read_time;
+ }( t2 w/ [5 M: d8 x - uint32_t HIGH_level_read_time;
# g/ ]& A$ N/ U6 R* ~; w, Z+ r - uint32_t time_out_flag;
( P! k6 i, p7 f# A - uint8_t Sensor_Data[3];
1 f9 |8 i. e% Y8 @2 r - static uint8_t old_data = 0xff;
5 c6 ^' b" ^* _; y+ `0 [# N - : j3 Y* ^' {$ |8 H, y
- pinMode(_DataPin, OUTPUT);3 P+ Q+ z: ~$ U/ I
- digitalWrite(_DataPin, LOW);
+ z' ]1 [/ M# j3 I6 |- o - delayMicroseconds(980);9 z2 I/ B* `) C9 N8 V' k
- digitalWrite(_DataPin, HIGH);1 e) p& q, i8 e6 ~4 n* R* x
- ' P4 ^- M6 [; w) a2 P- c) W
- pinMode(_DataPin, INPUT_PULLUP);
3 M! t& U- O4 f" @! e' G& U6 n - delayMicroseconds(10);
: X. H) Y. `/ P4 w8 y% s2 G - : x2 V; n3 W! @! e- m$ g
- time_out_flag = millis();
! A8 T- n I. E# z0 c - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
6 T$ C: x$ K/ p- \8 z2 B - % ^7 S% P' z |2 M/ R; V4 ]
- LOW_level_read_time = micros();( @. @. X/ m9 E
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
* e9 J D) {# U+ Z$ X4 s8 _ - {- E* A* S2 Y( ?% `% t7 B
- return 0xff;0 p# |% K$ ]% M& I
- }+ O0 ~3 W% H4 s; w: T. J' E5 A
' P1 h1 d0 U3 ]+ [- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );. Y/ s3 q8 p% x M5 {8 J. J& ]
" @" N2 q" U5 B9 V' S- HIGH_level_read_time = micros();
" o6 B7 F( d" l4 U) Y& q3 P - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level
V+ O; C N6 I. L% T; \2 C
- e" ?. Z+ c: z% x4 x0 N& b- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
& Q6 ^# B5 i" u2 w& s/ c4 o - {6 C' M: i$ T& G7 a# u; {& Z- A8 \
- return 0xff;% t# e, H, ^: R+ d
- }
2 X: a, o5 D# v" m# F- Z8 s. T
4 \( k) y t2 v1 ?7 _+ m- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))3 |$ r* [( g) O6 q, d
- {
/ \& C# \3 o7 {, m" G/ [6 q j - return 0xff;
" n/ }1 s# D( n# _ - }3 ~9 [! i `- v3 J, A& Z
- ( e. [7 K9 l. M' {% W
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
4 }! c) e. x+ x, ?, z - LOW_level_read_time = micros();! B, k/ e& A% W j- L$ a, z1 `
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level7 _/ T& {) V; ]/ F9 k% m$ u
- * T' y0 [1 Z4 A
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
- S1 w {3 R- R+ h4 J% ~) u% M - {6 ^* H C E, Q' K* ~
- return 0xff;
# X% y" O; h, _2 Y - }
8 k8 i+ x" |8 W/ H! j, I h# O - 6 j$ V' ~% u: ^0 {( v
- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))2 J9 E9 ~- v7 ^
- {
3 G9 A+ W9 x% y" w$ R U% K: H - return 0xff;
, n, g6 M8 Y( l Y - }- _- S( |. m0 p# _; J2 X7 D! P5 u
% l) l& H+ A! i% |# }6 N- for(uint8_t k=0; k<3; k++)
. I, v) Q. O8 Y1 u: _ - {
/ P' Y; {: f/ ~% E. c+ Q6 Y - Sensor_Data[k] = 0x00;; F3 i! t8 o9 L3 @
! z' g# l" A6 K3 O- for(uint8_t i=0;i<8;i++)
1 F% q7 o0 ]( `- c7 j - {
( y/ O' o, T! Z( M9 m7 z2 v7 T - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
) g: K6 F( A6 \4 i1 q% J7 |" G - HIGH_level_read_time = micros();
7 Y$ c$ k8 `2 ?& E - LOW_level_read_time = micros() - LOW_level_read_time;
* L7 p! @! ^- v6 b1 I2 f - . K& @/ f9 X' T6 W4 V9 z
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )- ^! {3 y8 q4 b4 A3 d. i
- {4 @& ]4 V5 z1 {. x5 o& S
- return 0xff;
4 Z2 V& d" }4 H" F7 Z9 x$ ~ - }
" q @8 G/ Q- W" o! ?/ A - 1 ^! C4 |1 T t% v6 ]
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
' i4 y `/ c. B8 N% [+ y - LOW_level_read_time = micros();) Q# g, ~* a: `: z. F/ k! G E- Z
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level) W5 y. F4 z1 s- ?
- " w% v! Y- _" E% t
- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
5 T2 E( y5 ^! |6 Y# I4 I* c - {
5 `9 D1 W0 \0 ]6 N E - Sensor_Data[k] |= (0x80 >> i);
' z7 p3 R4 i, g' n \" Z; W - }
( R J8 A- s- j8 b; Z$ z - else if(HIGH_level_read_time >= 100)3 w0 [" I* T( O5 W% X
- {/ P2 p i( X* B$ ?
- return 0xff;: ?0 t& _0 q( h- N) d! ~1 e# P' o
- }
) \" }. |8 e/ W m' O& B
% [. Y$ s& \ C- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)* l) {$ i, t( h9 {! ]* s5 ~# a
- {
6 T# q4 p* A" O( E - return 0xff;5 |1 i( [# M' u: [
- }4 M/ p. l1 G( N2 q, ~1 O
- }
/ r; \2 @' C8 P2 J+ ] - }( q+ o- W8 B! G9 G9 t2 r7 B
8 F; h! r1 ~, p' P- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level2 h0 I3 W9 L7 c# C0 V) n8 \
- HIGH_level_read_time = micros();4 N" u4 w# ]8 b) B& y! L
- LOW_level_read_time = micros() - LOW_level_read_time;# J% X# I& t1 \9 W/ h$ O
- ( e1 Z5 f2 }4 h4 P: [
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )1 ?4 |/ n) v9 q
- {/ m9 c2 F7 S' R# u P3 z% q8 |4 o
- return 0xff;% m1 }7 d0 r5 E. i
- }* n. U. o3 y E( P. O8 e
- % i. b( a5 Q1 ^6 C! ^$ C1 w2 u
- pinMode(_DataPin, OUTPUT);* o8 ^0 x4 i4 u
- digitalWrite(_DataPin, HIGH);( c1 U, {8 J' ^7 e
! ^1 _7 n) e: `$ K; x' w# U- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))
1 f! n, u; _9 M! |% c; `- ] A - {6 Q' n% e! P* b- n1 ~: }* O
- old_data = Sensor_Data[0];
. o. E8 x& b7 m- B2 R+ B. K - return Sensor_Data[0];
, A9 C- F/ h% O( h+ G - }: h2 U2 E+ N( O! L" \; c
- else
0 U b7 b% D0 g) n$ W( d - {
2 K0 e- k7 f6 f - return old_data;
2 b: L5 ^1 V/ { - }2 j$ \& f* K$ E
- }0 @$ N! S4 H1 _5 R. g2 z
複製代碼
6 Y1 k+ x2 Z5 A" v: I2 [$ YMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
& {% R0 P9 y! _9 n5 R2 D2 a4 _
0 s) P% y# K+ [9 `/ b0 H' b0 e |
|