|
|
# h# m" ]/ s0 t
- #include <Arduino.h>
- g- S7 D5 Q: c+ z" b, m - #include <MeAuriga.h>7 U+ w9 F( G) x! G! H$ u2 y- h0 q. L
- #include "MeLineFollowerArray.h"
+ l2 N) g8 d5 K% X# B- l
- t u3 O. N0 N" w }% J @) H2 ?6 k- MeEncoderOnBoard Encoder_1(SLOT1);5 g5 X8 ~0 M& A
- MeEncoderOnBoard Encoder_2(SLOT2);' y' j. P; Z4 r
- MeLightSensor lightsensor_1(12);
' e2 D. `! Y6 @' l- V* r% X D0 B - MeLightSensor lightsensor_2(11);
1 F `7 K9 @9 k: S8 a - MeBuzzer buzzer;. k. j# J! A+ E4 K' t
- MeLineFollowerArray linefollower(PORT_6);: K$ V: @9 s- `! b z
3 z& W5 h& |9 U: o: i) F- #define Error1 1
3 r/ g, {1 b3 u8 k( r3 q$ o) C - #define Error2 2
, S Z% q3 h5 u; m6 r - #define Error3 35 K& P5 j4 f+ V5 G4 l ^
1 A4 |7 X- D' T. i1 I- #define Kp 15
: v) S9 r4 M. z& {4 u3 K - #define Ki 0.15
* u" q+ S" g; W; _: H - #define Kd 0.03& P8 p8 {; p9 |9 n# N8 L% m
: h3 Z! a- e% D- uint8_t sData;% [- b6 \$ J6 c3 I/ g! [, Y. v$ V
- uint8_t D1;
" x# ?. a6 y; D- f - uint8_t D2;: p! w% g# z' v' l4 \6 V
- uint8_t D3;
! Z: i( D( g2 h, R' G7 i# e - uint8_t D4;3 @' V1 w7 a. w3 _' b! p, Y
- uint8_t D5;
4 P* A; j2 s) s" _% O - uint8_t D6;7 e' R" p2 c7 Q8 I( g- C
- G0 |% `: L9 D' C5 B- float previous_error = 0;" J! k3 P7 X0 K
- float integral = 0;
" ]. [# V6 o9 ?: A, b' e - float derivative = 0;/ j. T7 i( o; \% c, L
- int Speed = 160;* W: ~" c& R0 c2 Y8 z$ v5 Y
- float output;. N, U, r' ?* Y) G2 c4 R S
- 8 z& r8 `8 g9 b. ^& G5 l
- byte Left;8 p4 g1 O$ a$ b, W
- " L4 C8 i! M3 w; M
- void setup() 5 K8 I: z7 W t3 i" _
- {2 X' X: }0 ?% }5 n* Z9 ]9 _) L
- //Set PWM 8KHz
5 Q- o6 s) J W2 A: x - TCCR1A = _BV(WGM10);
5 {9 h3 t* `6 C- a. ~ - TCCR1B = _BV(CS11) | _BV(WGM12);; k: s( |- F% i
- TCCR2A = _BV(WGM21) | _BV(WGM20);: v8 t. C+ n. o }, u2 W, K
- TCCR2B = _BV(CS21);
' s( w/ Y% p+ y4 R4 G - Serial.begin(9600);
; w/ y. w8 Q. i( g7 G5 E; H* [! S - buzzer.setpin(45);) ~( @2 L% u8 g& d7 W
- }- F5 m3 h* v% ^. P: @) k- j1 t
- $ M( K; Y* T: K- c' ?& B/ U: U* N2 b
- void loop()
( E! j, I( h5 ]" W0 ]: b - {
7 L# a6 N- I; q1 S# | - while(!((lightsensor_1.read()) < (10)));4 i& t4 p: n6 \# K* A) U
- buzzer.tone(1047, 500);
0 q! Z& U. A$ ~( M1 T, e5 i4 D7 [ - delay(500);
, Q; ?- o) h$ }9 j3 q2 N5 } - do% s2 _) D5 {+ C
- {
: X3 `+ p0 T1 |! F! ?5 M* e - int Err = getErr();
& X" S* c( R0 M' X' S* g) I - if(D1 == 1)6 B! @, h& N/ T2 D# {: \, z) y
- {7 K2 N5 a0 E) @* D
- Left = 1;
6 s$ t! f. V1 j' c" }( ]6 V - }1 p. c% }, Z N. L* k; A
- if(D6 == 1)9 o9 C& X. D0 D# j& B f
- {6 ?: V3 B! E# Q9 R' C
- Left = 0;$ f& d3 k' K+ o% C+ T U
- }
- J) s j& f% X( n - if(Err == 99)
# v4 _% {$ p! C7 v. _ - {
4 w1 w+ X7 v1 t - if(Left == 1): O( I5 n6 x4 E! a J$ r
- {
4 _5 k* s z2 A$ f2 P - Speed -= 5;
; {0 \# z$ G5 \7 {' ]% H, ` - moto(0,Speed);0 ^% h {+ r1 b) C
- do: Q2 z3 x9 ?) D% t1 w' x
- {( K; E. k0 e1 q5 ], |" M, ~3 e* |
- Err = getErr();
4 F( H' x9 v$ {0 c9 D - }while((D1+D6) == 0);" ]3 ]9 r* r6 `5 A( O: ]
- }; }1 S( `0 g0 w
- else
; t- }. r$ [0 g: G - {
2 e) D1 x& B: b9 a V0 w8 I) d - Speed -= 5;
6 \ g' K* F/ R2 q9 ? - moto(Speed,0); ) L9 ]" g6 X- ?6 ~; [
- do
: K, p, L7 [9 ^* w - {! v7 F/ n7 o! o7 K2 F& Z1 Q
- Err = getErr();2 |5 @5 Z2 Q9 U, p" M" Q3 F) c
- }while((D1+D6) == 0);4 d) K3 Z3 h. N& c, E! f f
- }
r* L) {5 e/ z" H - }
% _9 u' b5 X& w$ E# a* t - else" H0 p& I. t) ?' H4 g
- {
8 M, \) f; \2 w - if((Speed < 160) & (Err < 2)) Speed+=1;
" D$ k6 v* o9 F7 e8 ?) z - if((Speed > 100) & (Err > 2)) Speed-=2; % @8 o4 W& Y+ K* h( T( m! |( e
- integral = integral + Err;" U" _* {- ]8 G! T* o
- derivative = Err - previous_error;" f5 ~- X& Q- H( w
- output = Kp*Err + Ki*integral + Kd*derivative;
7 r% |2 M5 b, d - moto(int(Speed-output),int(Speed+output));) d# H5 ~% u, X$ n$ o9 J g2 u
- previous_error = Err;" m5 W9 D6 N: u7 Q
- }
: ?" w" w/ O: W$ W' J - }while(!((lightsensor_2.read()) < (10)));1 L D# q/ s8 v r0 |
- moto(0,0);8 n8 F3 H9 k4 a* q8 L9 l, i
- delay(500);3 ?1 C6 K- q' \- I, G& ^) S
- buzzer.tone(262, 500);4 _; f1 D0 i3 Z, Q V- p* G# w2 J
- }
, q1 q6 j+ w1 a. v( S/ d2 ^8 D
3 a8 |8 s; M- N, S4 d4 w9 e" E. K- int getErr()# X, ?. D1 G9 {! z! r# I' C
- { $ i U0 A+ `) M
- sData = linefollower.getValue();
* m g+ F0 s9 ~* @6 F- o: d - D1 = ~(sData>>0)&1;
7 ^4 [3 ]7 d2 ~" g- z' }: G2 k/ a8 { - D2 = ~(sData>>1)&1;
( z- P" S% N6 M- Z; t- E - D3 = ~(sData>>2)&1;
3 ?; O4 O3 n" ]: @' u c - D4 = ~(sData>>3)&1;
W) T9 B- R* S- l; \ - D5 = ~(sData>>4)&1;
* D; ]* Q( H! i - D6 = ~(sData>>5)&1;
4 n. m: ~2 {6 }4 V; n8 v! Q3 _ - int downD = D1+D2+D3+D4+D5+D6;
+ {. Q5 r z- n& R - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
) K' t2 [3 ?" ^0 y' k& ` - if(downD == 0)% w& Z% B5 N' L8 N
- {
X+ w4 l1 E: H1 {* _9 N( E - return 99;( ~# s$ m& N7 L! E3 s. Y
- }9 U7 ?9 U* V. _, s1 g0 b2 ~! }. ]
- else9 ?0 l9 ^) i3 w$ |: X
- {- L& v' q) h: P( i9 g: p
- return upD/downD;3 N/ o" n( y" D- I# }' ~
- }
$ {! N( M$ d( O - }/ F) V$ J: ^1 {; X9 Z: I
- ' V$ D; e/ F& @: ^/ Y
- void moto(int Speed_L,int Speed_R)# u& N- Y8 ?; Q6 d" D6 [) W' w
- {' k; W3 N! o( `
- Encoder_2.setMotorPwm(Speed_L);- Y. G5 |' T- g/ z
- Encoder_1.setMotorPwm(-Speed_R);
9 F) \, K; N3 S/ a+ ` { - }
複製代碼
* q- ?/ Y$ \1 I. _, B1 ?% R" HMeLineFollowerArray.cpp7 T6 m+ S4 v, r2 Y
- #include "MeLineFollowerArray.h"/ |, |7 p, t" A; g8 o8 Z1 V" Z
0 c2 t. _& `0 p9 p _- #ifdef ME_PORT_DEFINED
; E* b U; M8 ^) Y! H - MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)5 B; k6 t3 c# |$ ]; s1 P5 V- ]
- {
7 Y$ |% L5 `9 F% T# q. S
- t' a9 n) b; c' A: S6 n- }0 V/ ~: S! T# A% @0 H; u
- MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)( \% ?: Y2 O- z r ~ Y
- {
( G8 j8 V+ g8 R- U I - _DataPin = mePort[port].s2;* \' d# d; i! k7 u* |2 L
- pinMode(_DataPin, OUTPUT);
0 v- b0 }! Q/ g; |" a& Y - digitalWrite(_DataPin, HIGH);) ^2 X6 l( K9 @8 G
- }* W6 p' B3 d" S* H6 ]( W" c( N1 i
- #else // ME_PORT_DEFINED
5 D h& Y9 q; f+ P3 S/ j* r - MeLineFollowerArray::MeLineFollowerArray(uint8_t pin)+ l+ G# {! B2 F
- {2 V$ o6 a/ C; p* {: V$ d
- _DataPin = pin;
l5 ]$ |+ N5 ?7 _! p% b - pinMode(_DataPin, OUTPUT);
. u* @9 x% P" ^+ I - digitalWrite(_DataPin, HIGH);
% i' B8 g3 u6 Z c9 e - }4 h. P+ |' g {8 ?$ ~
- #endif // ME_PORT_DEFINED) A9 {$ ?& Z8 ^( c. p
- 9 m6 E! s' B7 i- U* u9 M
% S7 G8 p r3 p, d4 k- void MeLineFollowerArray::setpin(uint8_t pin)
; d0 {) m) v8 L% A1 e - {! S$ U% v" U& y* i6 z
- _DataPin = pin;% V7 `5 f) n& [
- pinMode(_DataPin, OUTPUT); 1 {2 L) h R, u. N F7 E6 T W: f
- digitalWrite(_DataPin, HIGH);( V0 O' N8 x; S f
- # \6 h) E. E5 v) K; _! k8 [
- #ifdef ME_PORT_DEFINED: W5 }' k% n4 H* h: n! x+ @
- s2 = pin;
: {% w# X4 [: p4 C: V - #endif
9 n: S! U- R5 K4 I - }# Z6 b% Z- F3 J1 ^( w* L
- # N- k! _/ `8 }4 C/ B9 d
- uint8_t MeLineFollowerArray::getValue()
4 Q3 t6 @6 G5 J7 |3 ~- T - {$ b, `" L+ ?5 B M
- uint32_t LOW_level_read_time;$ J: ~( u0 }% ?5 b! L S, f% i
- uint32_t HIGH_level_read_time;& i- h3 p: W2 V8 @; m P6 X
- uint32_t time_out_flag;8 q0 j/ C& m# z" T- y
- uint8_t Sensor_Data[3];
3 H% X; k$ V0 I1 M( P6 g - static uint8_t old_data = 0xff;
9 J7 N% D% D0 T9 ~1 o9 c
' @/ @+ Y6 c( `0 W/ x! V5 Y- pinMode(_DataPin, OUTPUT);; K' |# O- @+ v! f5 I% H3 S
- digitalWrite(_DataPin, LOW);
/ B% A, J* c2 @. C! s; u - delayMicroseconds(980);9 d0 l: \! }3 o X2 |
- digitalWrite(_DataPin, HIGH);8 A: M5 S0 A& }6 U, a0 X
- & `0 K& I+ C: T) a' o: Z: ?
- pinMode(_DataPin, INPUT_PULLUP);6 M9 H" o- R. q$ I7 l& Q
- delayMicroseconds(10);
+ U) N* A! J2 P9 Z
" x# c# o6 {8 u- time_out_flag = millis();
1 Z9 g2 N& n. U' h# P9 z" z - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );& _8 _; l- ?& Z& z7 G0 V T! m
7 W. w/ l( k3 L2 K- LOW_level_read_time = micros();
# |3 \8 D" D# X1 k. \* i - if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out. n- F6 M" F0 u& k. v
- {1 X- w1 k, e/ f4 c2 u+ C9 j
- return 0xff;" X6 D% b; k7 w0 B
- }9 H {2 l$ I3 w* j, u8 I
1 i8 s" W$ y; {4 D- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
( Z, p8 ` z" ~9 k$ ?0 N3 ]. Z - . q& N9 F5 J4 D! \$ ^8 U1 k7 N3 F
- HIGH_level_read_time = micros();
- D" Z; _" W( P9 p - LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level
1 i4 A' ]# L* g; z* s3 { - ( I! y/ D" `9 x& P& \
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out' `& j+ t/ T8 f& R% c" Y7 J
- {
) l" o* p/ r7 e- a0 F/ w. M - return 0xff;
6 c# N5 P; V( ~4 L - }* f, c v$ Z1 N F, o
- 5 P# \2 s: x1 m' o5 o. U4 r' H
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
. G5 P; z6 t. ?6 D - {% S y3 @ \/ I
- return 0xff;
* d1 ?! K+ }) z0 \8 X - }$ E2 `3 H- Q, c1 P/ p* `) R
- ' h6 Y3 r* o7 F4 L/ ~6 q2 y) Y* R
- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );9 ], Y# s& {/ M+ e
- LOW_level_read_time = micros();! b0 j! L- }4 f6 T* }6 x# X
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level
: F8 B7 Z& _9 y' R7 X$ w! \- _. r - % n4 R% S% s$ F- ?' F
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
9 _$ g) Z- s* C - {( H' V m+ `4 t
- return 0xff;
3 n9 k. X; m6 o N+ T, K - }
7 ?1 w8 Z$ U9 }5 g" j! u: ]
5 C9 u1 F6 S+ F% {- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))0 j) r9 v) E2 C7 h$ ?
- {
; I( K* F, z9 d5 Y- T - return 0xff;
: z4 h6 h- A% ^" Z0 y - }$ J4 X( x; @7 p" t
- 8 g: c6 U( ^& U& A n
- for(uint8_t k=0; k<3; k++)/ }! e! ?, @0 s v* {; q
- {
: Y' ?3 o- Y: z- R3 A; ^; _ - Sensor_Data[k] = 0x00;
0 E, v/ u8 n' K4 J" M" v2 O& |7 j
. ^$ a. k. g7 S/ y1 w% c- for(uint8_t i=0;i<8;i++)
. l6 ]1 _4 o8 Z. ~+ ]/ T1 J( V - {
2 ?, K# D2 O4 k7 R+ I" i - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level2 f9 P: F# N, O+ k* J' z
- HIGH_level_read_time = micros();
, d* w7 r& S5 @' F8 W+ h - LOW_level_read_time = micros() - LOW_level_read_time;
, T6 X! P! t6 K/ k" [" B7 a
+ ]$ c7 L' z) t, Y8 g) Y- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
9 U3 z8 P% x2 w: I) h9 ~/ R - {+ ]9 c' s. s7 y4 {4 A8 F+ X
- return 0xff;
4 K `0 u- X ~2 M' P- k6 H - }$ C! B1 v9 o8 |8 u1 I' Q
* j) f4 v8 J4 A2 v. [0 {/ d- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );! a+ ^: b3 L2 \/ }
- LOW_level_read_time = micros();7 I+ [2 w/ p4 }( z' |$ I; P
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level0 O" ^3 `* x+ ~7 a5 o$ c
4 v! K4 P+ R6 [# e- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 1
/ [. @9 t: V$ I, L( b - {
1 p# u: Q* D2 N8 t1 L - Sensor_Data[k] |= (0x80 >> i);
4 R% E2 o4 a' s$ k' j+ J - }
, {1 ^2 E0 W5 d' X1 N - else if(HIGH_level_read_time >= 100)
5 R% Z9 ~) X9 t; K, K$ H - {
( ~5 F: F K' N+ w% F$ m" d - return 0xff;/ f k) N% s. F
- }
7 {. T& D7 ]* P* Y6 @2 q2 b
, V; E7 U! I$ g, ]8 U" L. W- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)1 U* Z6 D6 U3 f
- {3 ~ d3 Y/ s6 w5 _, T4 J- {
- return 0xff;
- ^& {. e$ B+ T1 W3 [1 h$ p - }: @* @) a/ V5 N2 v
- }1 B- x7 h, f x' G
- }. N0 c8 ?3 n! n w2 M# c, C [
" f2 e8 ^. N ]- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
8 `: g% B) R- x8 B* ^ - HIGH_level_read_time = micros();
3 g* [- |: D( _, m& q' T5 U - LOW_level_read_time = micros() - LOW_level_read_time;
( A3 U _' p8 q. ~" ~
% [) |: Z+ |5 i2 o3 B( B- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) ): {+ M" j$ N \6 Z' Y# m
- {
- o7 J( F, p- `. m1 [ - return 0xff;
) x* Z) `* P2 W1 n/ \" e - }: g9 I" y, o0 A7 P! u" U
9 Q6 [5 v) p& s$ x+ k: I- pinMode(_DataPin, OUTPUT);+ S) Q6 u! a" E; O& T+ O
- digitalWrite(_DataPin, HIGH);0 L) J2 o& J0 _/ F9 W3 m# `
2 O' U" R: a; t- A3 Y+ g) r- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))( L+ u5 _; F0 T" w9 I
- {+ c& t7 R" H- V Y) M
- old_data = Sensor_Data[0];; r1 c1 s$ _" Y! f
- return Sensor_Data[0];
& B% b; E# s3 k9 T) z1 p# u k - }
1 g% T, \$ Q* E' t0 u* T0 V - else
`# r( C$ _+ ~3 A @( k) e8 I( M2 K - {
' `/ f& z/ j0 f0 ?% O, _ - return old_data;
, W7 W- i t, [- i$ m' H" [ - }
! u- `, m1 G9 j3 H3 E* X - }
, {2 d# @$ r) l0 _" r) o1 ^( G: A v
複製代碼 - f/ y9 {, _* i9 U* y) Q( i U' \, l
MeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
* i7 b# }/ _/ N% Q1 q# R
) q) R/ O7 k1 Y: ^' ^
|
|