|
|
1 ]8 n0 Q, g/ p, K- #include <Arduino.h>$ M4 V% a) q; o# w+ n! F7 u
- #include <MeAuriga.h>
9 \: m% X% F2 Q, U - #include "MeLineFollowerArray.h"
1 O" \8 K3 p9 ~! Y& [" Y" {
$ e. y- O% j- W- MeEncoderOnBoard Encoder_1(SLOT1);) O0 w; ~6 G3 W2 G9 T# N
- MeEncoderOnBoard Encoder_2(SLOT2);
3 q; l; T1 K# e& ?/ y O - MeLightSensor lightsensor_1(12);
" v: T1 C4 D; q5 h" G- K - MeLightSensor lightsensor_2(11);
/ E: h" v3 ^; O$ m9 p$ N - MeBuzzer buzzer;5 o/ l8 C- l$ K, y4 s6 E8 f
- MeLineFollowerArray linefollower(PORT_6);8 l3 c- A( Z- r" [8 i3 v0 D
- , W4 K" k& q( y" d f' I
- #define Error1 1
$ S1 z7 M1 U) K - #define Error2 2
: o3 Q* A8 \ U& L - #define Error3 3
7 _ F0 x% {* }1 @
) L& n0 M( J8 R# U- #define Kp 15: F. W9 }+ | D8 R' A; }
- #define Ki 0.158 i0 a& |7 E9 G
- #define Kd 0.03$ c7 ~. C8 B p F" }- e% L
- - X3 j2 V1 G3 X) P+ M" e
- uint8_t sData;
, y+ y' x/ m) W/ K6 Z2 ? - uint8_t D1;; Q3 y6 Y* R- b; ]3 W: G
- uint8_t D2;
* e" C) T; H# x) ] _ - uint8_t D3;5 U/ X# t0 e7 L
- uint8_t D4;9 h3 A/ l2 L) x0 S# E
- uint8_t D5;$ q: c$ x# c; I' n% u- c$ n
- uint8_t D6;; |8 e" j, ` Z) ], k6 ]
- / [: m' Z8 ~! g- l
- float previous_error = 0;4 K- T- f, X/ A$ I
- float integral = 0;# p; }/ m$ A0 S4 U" Y
- float derivative = 0;
7 d) S: O3 d7 I. J3 u3 d& x - int Speed = 160;
6 H% s% }5 x/ y5 v& ], Z6 } - float output;
; Q% G5 e" x( Z( g: b - a6 ]8 }7 t, F3 p6 x9 E2 U4 s
- byte Left;
- Q$ l7 {+ t ^) B: h0 {
* K9 ?3 m3 X# z- void setup() ; Q% {6 t7 [' `7 |
- {# z8 y0 N, U L% H: |
- //Set PWM 8KHz3 ], Z: z9 t, g8 R) V! E; S
- TCCR1A = _BV(WGM10);. A% m9 H) B+ J5 j* o
- TCCR1B = _BV(CS11) | _BV(WGM12);
2 r; n. F, t# i6 x( g: l; E5 B - TCCR2A = _BV(WGM21) | _BV(WGM20);3 F0 c5 Z/ j2 L/ c4 l- P5 m! y
- TCCR2B = _BV(CS21);
B6 f8 ~$ I3 n: y! R5 H2 j - Serial.begin(9600);) j. R. s% P+ k0 q1 t! X
- buzzer.setpin(45);! ~1 l- O. g d Q7 V4 {4 x
- }
% t% |3 W3 _; p6 g8 G - + @. |" {5 e. q
- void loop()
7 x& g* t5 O$ N/ a4 p5 D - {: P% V+ ?- p$ N9 B
- while(!((lightsensor_1.read()) < (10)));
- {3 O0 }6 E' ~ - buzzer.tone(1047, 500);. [0 O( L' R4 _. }" x) u1 z
- delay(500);1 h) `: H' z+ k! z: k: w$ R& n, Z
- do6 B4 w& b1 C* ^
- {
. J& |7 T" j0 ] - int Err = getErr();% N* H) P; X$ i& V6 g
- if(D1 == 1)
2 `4 P% @6 ]1 f5 d. L - {# N# [+ d7 H! H* b% n
- Left = 1;5 {* r2 U5 \2 y0 o4 s/ }5 P
- }' ^4 w% L1 V* E4 g3 z/ }; @+ d
- if(D6 == 1): ]2 p5 m7 J! _; w
- {
7 X, @! |3 e( h% M - Left = 0;+ }" B" }! z2 C% m4 d" s2 ]( T
- }
* U0 d+ y# B) h4 c, B2 a* V& n' d - if(Err == 99)
/ U* }5 b( q' H+ p* m4 d - {
" g+ ?, f5 b, Q, z - if(Left == 1)
& p( n* u% J8 C - {5 N+ A; X4 r& I5 E% u% B3 r
- Speed -= 5;. m5 s2 y7 f; r; e7 N
- moto(0,Speed);% E5 R# i* }0 I0 R
- do
1 x. O6 B9 ^1 M( G9 X g - {; ~0 ]2 {0 y/ x3 _1 C+ U+ i) m. L( E9 p
- Err = getErr();
6 ~, z# O# k% t* v: [$ ^* Q5 j/ j - }while((D1+D6) == 0);
: x% K: B! k1 \- o, D# W' G - }
7 }% q$ L I( M! x* |2 o: A9 P2 B - else
, o7 F( _, Z5 ~9 `( t' O - {/ a2 j0 e% W6 d% G5 I( P
- Speed -= 5;
. ?& f% u7 k3 M$ p' s' g: t - moto(Speed,0); ' o7 R k7 u7 d, |; t. D. W! L v
- do
; w- x; H# I3 c2 N% C& E7 G - {
0 M9 e6 k! ~4 x% L; M h/ r - Err = getErr();& S1 j }9 S5 p: r- `' j
- }while((D1+D6) == 0);; i3 s3 w; X- G
- }
( ^; W, [# S3 v0 C, X: R( u! m - }
. l5 ^5 |8 K" r0 @$ o9 K - else$ a+ E. w3 S9 B; h/ @7 ]! A3 I
- {8 d0 U z5 [& P+ Z8 g9 Y2 E
- if((Speed < 160) & (Err < 2)) Speed+=1;
4 K! ^# i8 k5 v% @1 }4 x/ ]% Y+ g G - if((Speed > 100) & (Err > 2)) Speed-=2;
`5 M, h* ]' F9 N) | - integral = integral + Err;
, z: e) V4 g5 q5 q - derivative = Err - previous_error;6 Z& S* A% c( Q, [- C
- output = Kp*Err + Ki*integral + Kd*derivative;; l3 Q2 d1 w# u1 {
- moto(int(Speed-output),int(Speed+output));0 k9 [ |! O5 T
- previous_error = Err;7 X9 p% S% T) V( s& ~( O3 R# ^( o
- }/ L+ @% s: [/ ~$ D7 b8 e5 Y
- }while(!((lightsensor_2.read()) < (10)));7 N: v) Q. f% w2 P6 A) T
- moto(0,0);* Z9 E! X% C- W- \( ?3 i
- delay(500);
- _8 K& } r. Q - buzzer.tone(262, 500);
# ]5 p5 @5 c3 p# L4 G6 t - }5 |: T/ U! r5 D* A$ z7 `
% ]+ A" V+ J- F, y- int getErr()
2 l1 N. s3 @& _* S8 D - { 1 s8 d, @( S/ K% c7 R! u
- sData = linefollower.getValue();4 u* Q) S _4 i# i! b3 X, H) K; p
- D1 = ~(sData>>0)&1;7 W' o6 x0 r! L
- D2 = ~(sData>>1)&1;1 ~6 y9 L1 ^; w5 z2 X* W
- D3 = ~(sData>>2)&1;( B5 B9 U( x0 F' D5 K% y
- D4 = ~(sData>>3)&1;
- _, o( t8 Q. N) d2 q" L - D5 = ~(sData>>4)&1;3 q* `% s; X/ D
- D6 = ~(sData>>5)&1;
1 ]: G; X: L6 O. r( R - int downD = D1+D2+D3+D4+D5+D6;
6 u3 Y4 Y0 ?5 N8 u( N2 b - int upD = D1*(Error3)+D2*(Error2)+D3*(Error1)+D4*(-Error1)+D5*(-Error2)+D6*(-Error3);
. u& K; Z$ v" C8 F1 ? - if(downD == 0)
: q/ q, y! B" k0 a6 k! G% w - {+ l# B; J! _" T, l4 g
- return 99;! n+ q3 q j( q8 `6 c, {% S6 U
- }
8 h8 ?3 E6 }5 M. g - else
8 N$ ^: h8 _0 K" r - {* }4 ?' u' O. V) d0 ?
- return upD/downD;
- B6 C |: I, i# C( c$ p - }
6 @! v( z+ G) m1 M - }$ C. w0 ?1 T( I9 k8 ~- U2 ^3 u. X
* v6 I2 t! L6 [7 ]% G- void moto(int Speed_L,int Speed_R)4 j* A) X1 ^& F. o" M# R8 `
- {) C' r) R# t' z3 U! C/ S* y' n
- Encoder_2.setMotorPwm(Speed_L);5 n6 J2 V9 {0 A1 \$ t
- Encoder_1.setMotorPwm(-Speed_R);/ w4 C: S. |3 Y; Q7 Y
- }
複製代碼
1 B0 O) R% R" t3 @MeLineFollowerArray.cpp
8 o. Q1 [" l- c$ d8 A- #include "MeLineFollowerArray.h"2 j0 q- y+ V: k3 `, P
4 j8 V! m! J7 j$ W- #ifdef ME_PORT_DEFINED; ?) u1 g+ \/ |
- MeLineFollowerArray::MeLineFollowerArray(void) : MePort(0)
( ^, H" ?/ x2 R - {6 E7 F& T5 ?9 T+ y2 t4 Y- t# t
- ) `5 Q' [- {" k% B
- }6 h) ]1 o2 N1 g, h j1 p4 B3 ?. _
- MeLineFollowerArray::MeLineFollowerArray(uint8_t port) : MePort(port)
. X3 X9 {% W/ T- B; X9 I - {( L/ @: v# e- H
- _DataPin = mePort[port].s2;$ D5 E7 D" Y3 P8 P% V1 ]' |
- pinMode(_DataPin, OUTPUT); ; h' G) |. E& T; K0 N' {
- digitalWrite(_DataPin, HIGH);
2 K& n& p G+ S6 D - }; z# U( i; G$ c; a# X
- #else // ME_PORT_DEFINED: H( h8 N/ P! Q
- MeLineFollowerArray::MeLineFollowerArray(uint8_t pin). r3 U7 q# a) i5 a. `* m d* M5 R
- {
. E& X# v; ^+ y+ Z& [6 T; J - _DataPin = pin;
6 D N+ l" d; x" U( [$ K5 V0 y" D - pinMode(_DataPin, OUTPUT);
1 y# g; r' h# `8 c* _7 p - digitalWrite(_DataPin, HIGH);
3 }" u9 Q# ]2 Y4 w) t - }
8 E: x0 g; J6 ` - #endif // ME_PORT_DEFINED
/ k2 R2 k h5 Z; r
3 h" o" r4 N6 X* ^4 c3 ]) T; \, |2 D& k
! R2 X6 q6 Z \5 f, X- void MeLineFollowerArray::setpin(uint8_t pin)# n0 C- f+ f6 s6 n
- {
& X& F2 X2 m; @ - _DataPin = pin;+ o0 }" d7 z1 `- u& {
- pinMode(_DataPin, OUTPUT);
6 W' c# _/ q! [3 M( T1 Q0 l - digitalWrite(_DataPin, HIGH);
* S8 L! X9 e# h* r, V - - C: |7 z/ Q: g1 m
- #ifdef ME_PORT_DEFINED L- O- h4 `* C* M6 ^. a& u
- s2 = pin;
' Q M, R6 n: g0 S+ q% P/ Z0 b - #endif. J4 u/ n- X ^6 H, y* C6 Z
- }1 [% h3 l ]( I% b# M& `% r6 j6 g
- ?* J1 n d- z$ x; o; K# ~- uint8_t MeLineFollowerArray::getValue()
3 h, K6 ]+ N% R# o$ G - {( j4 T( ~1 d- i Z6 P' c. K+ @$ ?
- uint32_t LOW_level_read_time;/ `; X/ i* q4 y# s0 U. I+ u
- uint32_t HIGH_level_read_time;
+ c# F& D* \% H+ h& e - uint32_t time_out_flag;0 \1 A0 C5 K0 l9 i6 G6 r% m
- uint8_t Sensor_Data[3];: ]4 b* ]4 R, K3 o
- static uint8_t old_data = 0xff;
: ]3 `/ x- E2 m% M/ ] t3 q+ @
! A. t) h1 N& v, m1 ?4 v- pinMode(_DataPin, OUTPUT);
' l$ @$ E, J& W1 f2 b9 x - digitalWrite(_DataPin, LOW);% e o7 A) |- b3 E% h6 m
- delayMicroseconds(980);
2 M5 l6 l( e/ O - digitalWrite(_DataPin, HIGH);
" @" J$ J7 r. r* S' K- D* h, w - 7 T; I; C) h% P5 t4 D
- pinMode(_DataPin, INPUT_PULLUP);
0 W: j% B# |' N. S3 e3 ?2 }" E$ D - delayMicroseconds(10);
- ^* i/ g2 j# v7 S7 Q. b - : U- l/ ]+ a. ]$ d) W# f6 H
- time_out_flag = millis();
/ V' w& z) Q6 A4 Z, e - while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );8 f# J$ i) a7 T# E; }% g
- # r& S' G* _/ T7 f
- LOW_level_read_time = micros(); S6 a% I5 U% v8 }! Z# y
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out7 C" t/ P9 n2 r6 L% m2 s- _
- {
, o8 W( W4 p, B- f! D5 q - return 0xff;
/ P9 J) S t6 R4 w. q% O - }1 [, X5 W- n& e
+ n4 [8 A3 G$ K- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );3 D7 Q6 ?" K5 I: ~2 \
- & G7 T" G/ \$ ~
- HIGH_level_read_time = micros();6 ?4 Q: Z1 T4 ?% f; f
- LOW_level_read_time = micros() - LOW_level_read_time; //read 100us LOW level1 L* G( M, W' j' @
- 8 I4 G5 A2 O* i8 U* Q0 B
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out; n& S- g" _2 B; {+ @% e; I/ l
- {( N9 Q8 b! q. |
- return 0xff;
6 S: o9 l( P" \9 X$ R - }1 |% C) \4 a; q
- 2 ~3 n. h1 C/ y% b7 t
- if( (LOW_level_read_time < 90) && (LOW_level_read_time > 110))
! @4 n F0 w! x2 o$ d, p - {
8 J% k" Z' c* j1 X! @2 D) \/ Y - return 0xff;
. q. D8 P# k9 L0 o' j$ V, V4 J' X - }* y% X; A( {2 l0 ?
# A s( f% a* `$ I) z/ t& x) @- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );; p& r8 H( M/ X5 y
- LOW_level_read_time = micros();
0 L" D6 c% }. [4 R - HIGH_level_read_time = micros() - HIGH_level_read_time; //read 50us HIGH level7 z! P( T1 z! P- b
- # A9 a. |; n* s9 ^7 L
- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out) //time out
3 _' R! F/ \' [ - {6 s0 T" y# E7 ]7 w3 P' c* Z
- return 0xff;
H0 U9 n5 w% m3 V - }
* |- Z0 o. x2 r& M k8 w1 k0 T
+ D! T/ I+ b9 N# b& {- if( (HIGH_level_read_time < 5) && (HIGH_level_read_time > 55))
9 v$ I1 E8 D K z8 J! F - {3 z3 B2 S3 U# S/ o
- return 0xff;7 x( ]2 U5 a/ T& n
- }
n+ g; O% y3 I% G6 E+ q1 c7 @
; _# c K9 B& h- for(uint8_t k=0; k<3; k++). u0 `4 F0 |/ I; T) }- d
- {
- w$ J2 S: g7 o! v( q# Z - Sensor_Data[k] = 0x00;
% j! I# @; B1 g - ( R) k0 J; `' Q) {& |
- for(uint8_t i=0;i<8;i++); [ B) p( ^: e; a, y8 L
- {
, E2 h" y {4 c9 z S: s& [; S - while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level" ^6 r, e) j+ L( b+ e' }& A
- HIGH_level_read_time = micros();2 T, I+ x: M6 i, V, [$ x
- LOW_level_read_time = micros() - LOW_level_read_time;
, A* @$ d {0 \+ @3 T
6 g5 |+ j6 `" I: T) ?- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )4 b- X/ F/ ^$ V6 v: m% d. q6 u; Z
- {$ H E; b; q+ V0 q- }3 l0 ]! @
- return 0xff;# k( P7 y0 Z6 j& ?
- }
0 D. I* k0 z$ I; l a
, O& i' s9 T4 x. R- while(digitalRead(_DataPin) == 1 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) );
, y' v' m' S. k: Q - LOW_level_read_time = micros(); G4 A! S/ u B: l! V$ ]
- HIGH_level_read_time = micros() - HIGH_level_read_time; //read HIGH level
7 X+ M4 ?) W2 B. Q. M
9 c0 A @! }& Z; p1 i- if(HIGH_level_read_time > 50 && HIGH_level_read_time < 100) //bit 13 O' h7 q+ i, I7 y
- {' `( d' u0 Y3 b% K5 r& @" P
- Sensor_Data[k] |= (0x80 >> i);
) v9 o% {4 S/ x( f/ P7 h0 c - }
- ]+ @" W" {7 @ ^ ~# u - else if(HIGH_level_read_time >= 100)
) ?' _* d, r: O! a3 \. h - {6 E% v6 R! S0 K0 b$ W, G! a
- return 0xff;
3 r6 F9 `; r$ |! [ - }
, r/ e; ?" s( K1 k
. P) Q( R! t2 _; y2 W- if((millis() - time_out_flag) >= MeLineFollowerArray_Communication_Time_Out)2 `/ ]6 U: }) J
- {
8 s' v) N8 w+ C( y - return 0xff;
4 y6 a8 o/ O, x2 ^# U A- f9 F, y - }5 Y7 R' `, D7 x. b
- }8 v$ K- y/ F. {8 t7 e9 ~" x6 H- L) Z
- }1 |- V" B' E9 b) _. L& P. r
" ?& B- B T& M* _3 J8 U+ {" S- while(digitalRead(_DataPin) == 0 && ((millis() - time_out_flag) < MeLineFollowerArray_Communication_Time_Out) ); //read 50us LOW level
" G0 G7 {/ L7 W7 ` - HIGH_level_read_time = micros();
$ S% R" a. t6 g, ]$ h - LOW_level_read_time = micros() - LOW_level_read_time;
7 _$ E, W+ N: a, O \ l# ~1 ] - ; R: i2 x% S" G# [! `
- if( (LOW_level_read_time < 5) && (LOW_level_read_time > 55) )
. z9 r( p, s1 B/ t+ c- x - {
) @& |9 p' E+ u+ C$ D; ~ - return 0xff;
, U2 b. q4 V9 V6 l* B" G - }
& f4 z9 ~3 U' ?6 S
& _) D# `/ e. q* Q( o4 T- pinMode(_DataPin, OUTPUT);2 x, I3 ^) J! L) `' @
- digitalWrite(_DataPin, HIGH);/ d* M; V4 d+ _& d1 J( [3 _
/ O' S' H1 \. {. ]6 h- if( (Sensor_Data[2] == (uint8_t)(Sensor_Data[1] - Sensor_Data[0])) && (Sensor_Data[1] == (uint8_t)(~(uint8_t)Sensor_Data[0])))
- N j" K% u6 b, E7 u - {
% E0 H6 `0 B1 R, [' y - old_data = Sensor_Data[0];
: J7 |/ k( J8 I! i2 s1 X - return Sensor_Data[0]; v8 e& f1 g, B/ {( N( k
- }
7 K( A, h! f, d* R' c2 A* ~8 o9 } {9 h - else( p' O; F1 i# q, E/ T
- {
, Y, M9 k) m; u1 V - return old_data;
2 Q6 V: J, k$ W1 E! T2 y - }
0 X/ o" S" A$ Q) o* X) ^9 X5 v; s8 t - }
: l# ? u$ a8 w/ j
複製代碼
6 o I/ z; a% F" Y9 K8 qMeLineFollowerArray.h
MeLineFollowerArray.h
(731 Bytes, 下載次數: 10, 售價: 100 個銅錢)
. b+ q, l( v8 q2 y
/ |2 C' h7 n" r9 W. d |
|