Skil - Club de Robótica FIUBA

Transcripción

Skil - Club de Robótica FIUBA
Competencia de robótica
JOHNNY 5
~2015~
Categoría: Minisumo
Nombre robot: Skil
Institución: Club de Robótica - FIUBA
Participantes:
• Ariel Burman
• Sebastián García Marra
• Joaquín de Andrés
[email protected]
Introducción
Skil es un robot minisumo desarrollado en el Club de Robótica de FIUBA. Su nombre
surgió en base a que todas las partes antes de ser construido se guardaban en una caja de un
taladro Skil.
Toda la información del proyecto puede accederse en
http://labi.fi.uba.ar/chiliproject/projects/skil
Diseño y desarrollo
El robot posee un led emisor y un receptor de luz infrarroja que se utiliza para detectar al
oponente. Cuando la luz emitida rebota en una superficie y vuelve hasta el robot, es detectada
con el receptor. El receptor detecta señales moduladas en 38 kHz, por lo cual para excitar el
led se genera un tren de pulsos de frecuencia 38 kHz.
El robot posee 4 sensores infrarrojos cercanos al piso. Cada sensor detecta si la superficie es
negra o blanca. Cuando alguno de los 4 sensores se activa, el robot ignora cualquier otro sensor
y se mueve en la dirección opuesta a la lı́nea blanca detectada.
Cuando el robot detecta un oponente avanza a máxima potencia con la intención de sacarlo
del tatami. Si el robot no detecta un oponente, ni está cerca del borde del tatami, realiza una de
3 acciones: avanza, gira a la derecha o gira a la izquierda. La selección de cuál de las 3 acciones
realiza, es aleatoria.
Mecánica
Figura 1: Motores SolarBotics
Figura 2: Baterı́as de Litio - Ion
El tamaño del robot se ajusta a las dimensiones establecidas en los reglamentos de 10 cm
x 10 cm. La estructura mecánica se compone de 2 PCB unidos por 4 tornillos pasantes que los
unen entre sı́. Entre los dos PCB se encuentran los motores (figura 1) Solarbotics1 con reducción
120:1 y dos baterı́as2 de Litio-Ion de 3,7 V cada una, dando lugar utilizando una alimentación
1
2
https://www.pololu.com/product/1121
https://www.pololu.com/product/1003
2
Figura 3: Ruedas Solarbotic 70 mm
Figura 4: Goma de silicona de mayor adherencia
de 7,4 V (figura 2). Utiliza ruedas de 70 mm de Solarbotics3 (figura 3), con llantas de silicona
de mayor adherencia 4 (figura 4).
Se agregaron pilas en desuso para aumentar el peso del robot hasta alcanzar 500 g, que es
el lı́mite de la categorı́a.
Electrónica
En la figura 5 se encuentra el circuito esquemático del PCB inferior, que contiene los 4
sensores infrarrojos CNY70 que permiten detectar el borde del tatami.
En la figura 6 se encuentra el circuito esquemático del PCB de la placa principal. El circuito
incluye el microcontrolador ATmega88PA5 , el controlador de los motores, puente-H DRV88336 y
el emisor y receptor infrarrojo que permite la detección del oponente. Este circuito contemplaba
la posibilidad de incluir un kit de desarrollo mBed7 , aunque nunca se llevó a cabo.
3
https://www.pololu.com/product/184
https://www.pololu.com/product/694
5
http://www.atmel.com/devices/atmega88pa.aspx
6
http://www.ti.com/product/drv8833
7
www.mbed.org
4
3
1
2
3
4
VDD
CNY70
3
1
CNY70
3
1
CNY70
3
1
CNY70
3
A
1
A
EmisorB
EmisorC
ReceptorA
ReceptorB
ReceptorC
50k
R5
VDD
50k
R6
P2
CONN_3X2
1
3
5
100
R4
100
R3
100
R2
100
R1
EmisorA
P1
2
4
6
ReceptorA
EmisorA
2
4
6
ReceptorD
EmisorD
VDD
EmisorC
ReceptorC
B
1
3
5
CONN_3X2
Marked area
U4
EmisorB
ReceptorB
4
2
Marked area
2
U3
4
Marked area
4
U2
2
2
U1
4
Marked area
VDD
EmisorD
ReceptorD
50k
R7
B
50k
R8
Club de Robotica - FIUBA
Sheet: /
File: sensores.sch
Title: Skil - Sensores
C
Size: User
Date: 25 aug 2011
KiCad E.D.A. kicad 0.201508100901+608028ubuntu14.04.1-product
1
2
3
Figura 5: Circuito esqumático del PCB inferior
4
Rev: 1.0
Id: 1/1
4
C
D
C
B
P_B1
1u
100n
2
1
100n
C_PH1
EmisPiso
100n
1
+5V
nSleep
nFault
5
10
9
15
16
8
1
14
11
Q_E1
B
2
NPN
1
3
5
1
3
5
100n
P_E1
P_E2
IC_PH1
BIN2
BIN1
AIN2
AIN1
nFAULT
nSLEEP
VINT
GND
BISEN
BOUT2
BOUT1
AISEN
AOUT2
AOUT1
VM
DRV8833
2
4
6
2
4
6
100n
C_B4
EmisorA
EmisorB
EmisorC
EmisorD
+BATT
C_B3
VCP
2
4
+5V
EmisorC
RecepC
PwmI_1
2.2u PwmI_2
PwmD_1
PwmD_2
C_PH2
ENABLE
NR
EmisorB
RecepB
2.2k
R_E1
Vout
Vin
SW_Pl1
C_Pl1
SW_PUSH_SMALL
C_B2
+5V
JUMPER
U_B1 REG_104-5
+BATT
GND
3
2
C_B1
Puls
Bateria
JP_B1
C
3
E
1
CONN_3X2
CONN_3X2
1
C_PH3
13
6
5
7
3
4
2
12
2
MD_1
MD_2
MI_1
MI_2
RecepD
EmisorD
RecepA
EmisorA
+BATT
no se usa
10u
C_PH4
100n
C_PH5
OjitoRecepAtr
EmisPiso
RecepB
RecepA
RecepC
RecepD
OjitoRecepAd
OjitosEmitAd
+5V
+5V
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
8
22
GND
GND
AREF
AVCC
VCC
IC_UC1
100u
C_PH6
2
MD_2
3
1
2
1
MD_1
MI_2
MI_1
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
+BATT
+5V
ATMEGA88PA-P
(PCINT23/AIN1)PD7
(PCINT22/OC0A/AIN0)PD6
(PCINT21/OC0B/T1)PD5
(PCINT20/XCK/T0)PD4
(PCINT19/OC2B/INT1)PD3
(PCINT18/INT0)PD2
(PCINT17/TXD)PD1
(PCINT16/RXD)PD0
(PCINT14/RESET)PC6
(PCINT13/SCL/ADC5)PC5
(PCINT12/SDA/ADC4)PC4
(PCINT11/ADC3)PC3
(PCINT10/ADC2)PC2
(PCINT9/ADC1)PC1
(PCINT8/ADC0)PC0
(PCINT7/XTAL2/TOSC2)PB7
(PCINT6/XTAL1/TOSC1)PB6
(PCINT5/SCK)PB5
(PCINT4/MISO)PB4
(PCINT3/OC2A/MOSI)PB3
(PCINT2/OC1B/SS)PB2
(PCINT1/OC1A)PB1
P4
P3
P2
P1
13
12
11
6
5
4
3
2
1
28
27
26
25
24
23
10
9
19
18
17
16
15
14
1
2
3
+5V
SW_UC1
R_UC1
10k
Led Rojo agregado
ATRX
ATTX
+5V
ATMOSI
ATMISO Ojito Emit Atr Anterior
ATSCK
4.7u
C_OJ1
OjitoRecepAd
R_OJ7
100
R_OJ3
4.7k
1
2
3
4
ATMOSI
+5V
+5V
OjitosEmitAd
Sole
4
5
1
2
3
R_OJ8
100
R_OJ4
4.7k
+5V
2.2k
R_SL1
Q_SL1
B
2
NPN
Q_OJ1
B
2
NPN
+5V
Q_OJ2
D_SL1
DIODE
B
2
NPN
Rev:
Id: 1/1
Solenoide
P_SL1
+5V
OjitosEmitAtr
OjitosEmitAtr
En una modificacion se decicio
quitar el receptor infrarrojo trasero
4.7u
C_OJ2
OjitoRecepAtr
5
Size: A4
Date: 10 dec 2011
KiCad E.D.A. kicad 0.201508100901+608028ubuntu14.04.1-product
Title: Skil - Placa Principal
Club de Robótica - FIUBA
Sheet: /
File: mainboard.sch
ATRX
SW_PUSH_SMALL
ATTX
OjitoRecepAd
OjitoRecepAtr
no se usa/ahora arrancador
OjitosEmitAd
PwmI_2
PwmI_1
RecepC anterior
P_UC1
ATMISO
1
2
ATSCK
3
4
ATRESET 5
6
ATRESET
nFault
Puls
Sole
EmisPiso
RecepC
nSleep
RecepB
RecepA
RecepD
PwmD_2
PwmD_1
PwmD_1
PwmD_2
PwmI_2
PwmI_1
nSleep
RecepC
Ojito Emit Atr Anterior
Sole
Puls
nFault
3v3
(PCINT0/CLKO/ICP1)PB0
3.3V_Vout
5.0V_USB_Out
IFIF+
MBED
RDRD+
TDIC_UC2
TD+
DD+
rd/p30
td/p29
tx/sda/p28
rx/scl/p27
PwnOut/p26
PwnOut/p25
PwnOut/p24
PwnOut/p23
PwnOut/p22
PwnOut/p21
Capacitor agregado
100n
C_UC1
21
20
7
GND
Vin
Vb
nR
p5/mosi
p6/miso
p7/sck
p8
p9/tx/sda
p10/rx/scl
p11/mosi
p12/miso
p13/tx/sck
p14/rx
p15/AnalogIn
p16/AnalogIn
p17/AnalogIn
p18/AnalogIn
p19/AnalogIn
p20/AnalogIn
4
OjitoAD
1
10n
K_OJ1
3
P_PH1
1LED
D_LED1
2
1LED
2
CONN_3X2
K_OJ2
D_OJ1
2
E
1
C
3
E
1
R_OJ1
10k
2k2
R_OJ2
C
3
1LED
D_OJ2
2
C
3
1
MI
MD
Figura 6: Circuito esqumático del PCB superior
P_PH2
P_UC2
CONN_4
OjitoATR
2k2
R_OJ5
2
E
1
10k
R_OJ6
1
A
5
6
D
C
B
A
6
Código Fuente
Se incluye el código fuente del programa principal. Todo el código fuente se puede encontrar
en la página del proyecto
http://labi.fi.uba.ar/chiliproject/projects/skil
#i n c l u d e <avr / i o . h>
#i n c l u d e <avr / i n t e r r u p t . h>
#i n c l u d e < u t i l / d e l a y . h>
#i n c l u d e ” motores . h”
#i n c l u d e ” s e n s o r e s . h”
#i n c l u d e ” s k i l . h”
#d e f i n e
#d e f i n e
#d e f i n e
#d e f i n e
2 // en m i l i s e g u n d o s
DELAY ESTADO
500 // en m i l i s e g u n d o s
DELAY ESCAPE
DELAY INICIO
200 // en m i l i s e g u n d o s 5100
ALEATOREO DELAY
500
// l a macro
#d e f i n e p r o x i m o E s t a d o A l e a t o r i o ( ) (TCNT2 & 0 x03 ) // Devuelve un numero a l e a t o r i o e n t r e 0 y 3
#d e f i n e ALEATOREO MAX CUENTA
5000
v o l a t i l e estados t estado ;
// u t i l i z a d o para d e f i n i r l a c a n t i d a d de r e p e t i c i o n de l a misma a c c i o n a l e a t o r i o
// ( v e r a c c i o n T r a c k i n g )
v o l a t i l e u i n t 8 t cantVeces ;
i n t main ( v o i d ) {
setup ( ) ;
//
//
//
//
//
//
//
i f ( I s P u l s a d o r S e t ( ) == f a l s e ) {
desenergizarSolenoide ( ) ;
EncenderMotores ( ) ;
cli ();
w h i l e ( 1 ) movimientoPrueba ( ) ;
}
delay ms (1000);
w h i l e ( e s t a d o==DETENIDO ) ;
Led1On ( ) ;
w h i l e ( (PIN REMOTO & (1<<REMOTO NUMBER) ) == 0 ) ;
Led1Off ( ) ;
// tiempo de e s p e r a para b a j a r p o l l e r a
// d e l a y m s ( DELAY INICIO ) ; // sacamos
// l a p o l l e r a no l a estamos usando , p e r o mejor d e s c o n e c t a r l a
// e l s o l e n o i d e no puede que
desenergizarSolenoide ( ) ;
encenderEmisorSuperior ( ) ;
encenderEmisorInferior ( ) ;
delay ms ( 5 ) ;
6
while (1){
// V e r i f i c a e l puente H
i f ( I s n F a u l t S e t ()==0) {
titilarLed (20);
ConfigurarMotores ( ) ;
EncenderMotores ( ) ;
MoverAdelante ( ) ;
}
i f ( (PIN REMOTO & (1<<REMOTO NUMBER) ) == 0 ) ApagarMotores ( ) ;
s e n s o r e s I n f = PINB & MASK INT PIN ALL ;
switch ( s e n s o r e s I n f ){
c a s e OK:
switch ( estado ){
c a s e FIGHT ADELANTE:
Led1On ( ) ;
MoverAdelante ( ) ;
break ;
c a s e TRACKING:
Led1Off ( ) ;
accionTracking ( ) ;
break ;
c a s e ESCAPE:
Led1Off ( ) ;
break ;
c a s e DETENIDO:
default :
ApagarMotores ( ) ;
titilarLed (12);
break ;
}
break ;
c a s e ATRAS:
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x6000 ) ;
MoverAdelante ( ) ;
break ;
c a s e ADELANTE:
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x9000 ) ;
MoverAtras ( ) ;
break ;
c a s e ADELANTE DER:
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x6000 ) ;
GirarIzquierdaAtras ( ) ;
break ;
c a s e ADELANTE IZQ :
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x6000 ) ;
GirarDerechaAtras ( ) ;
break ;
7
c a s e ATRAS DER:
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x1000 ) ;
GirarIzquierdaAdelante ( ) ;
break ;
c a s e ATRAS IZQ :
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x1000 ) ;
GirarDerechaAdelante ( ) ;
break ;
c a s e DERECHA:
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x1000 ) ;
GirarIzquierdaAdelante ( ) ;
// R o t a r I z q u i e r d a ( ) ;
break ;
c a s e IZQUIERDA :
e s t a d o = ESCAPE;
a r r a n c a r T i m e r E s t a d o s ( 0 x1000 ) ;
// RotarDerecha ( ) ;
GirarDerechaAdelante ( ) ;
break ;
default :
// ApagarMotores ( ) ;
// t i t i l a r L e d ( 1 0 ) ;
break ;
}
}
}
void setup ( void ) {
ConfigurarMotores ( ) ;
configurarPinSensoresSup ( ) ;
configurarPinSensoresInf ( ) ;
configurarTimerSensoresSup ( ) ;
configurarTimerEstados ( ) ;
configurarPulsador ( ) ;
configurarRemoto ( ) ;
configurarSolenoide ( ) ;
// e n e r g i z a r S o l e n o i d e ( ) ;
Led1Init ( ) ;
Led1Off ( ) ;
e s t a d o = DETENIDO;
cantVeces = 0 ;
sei ();
}
void configurarPulsador ( void ){
PulsadorInit ( ) ;
// C o n f i g u r o e l p i n change
PCICR |= (1<<PCIE1 ) ;
PCMSK1 = (1<<PCINT9 ) ;
}
8
void configurarRemoto ( void ){
C l e a r B i t (DDR REMOTO, REMOTO NUMBER) ;
S e t B i t (PORT REMOTO, REMOTO NUMBER) ;
}
void accionTracking ( void ){
u i n t 8 t temp ;
i f ( c a n t V e c e s < ALEATOREO MAX CUENTA) {
c a n t V e c e s++;
}
else {
c a n t V e c e s =0;
temp = p r o x i m o E s t a d o A l e a t o r i o ( ) ;
s w i t c h ( temp ) {
case 0:
RotarIzquierda ( ) ;
break ;
case 1:
GirarDerechaAdelante ( ) ;
break ;
case 2:
GirarDerechaAtras ( ) ;
break ;
case 3:
RotarDerecha ( ) ;
break ;
}
}
}
// I n t e r r u p c i o n de p u l s a d o r ( v e t o r 4 )
ISR ( PCINT1 vect ) {
// Delay para debounce
// Dado que no tenemos n e c e s i d a d de h a c e r nada m i e n t r a s esperamos por e l
// debounce l o dejamos a s i . Sino , d e b e r i a m o s u t i l i z a r a l g u n t i m e r
delay ms ( 2 5 0 ) ;
i f ( I s P u l s a d o r S e t ( ) == t r u e ) {
// s i g n i f i c a que e s t a en 1 y hubo f l a n c o a s c e n d e n t e g e n u i n o
// s e p o d r i a r e e m p l a z a r l a v a r i a b l e por poner apagar todo , poner
// e l micro a dormir e s p e r a n d o s o l o e s t a i n t e r r u p c i o n y l u e g o
// d e s p e r t a l o . Aca s e l o d e s p e r t a r i a
EncenderMotores ( ) ;
// e s t a d o = TRACKING;
e s t a d o = FIGHT ADELANTE;
}
// Este f l a g s e c l e r e a a mano porque e l c l e a r por hardware s e r e a l i z a en e l
// momento que s e a t i e n d e l a i n t e r r u p c i o n y no cuando s e s a l e de e l l a .
// Esto hace que m i e n t r a s s e e s t a d e n t r o de l a i n t e r r u p c i o n , puedan g e n e r a r s e
// nueos f l a n c o s ( r u i d o ) que no queremos a t e n d e r
S e t B i t ( EIFR , INTF0 ) ;
}
9
/∗ f u n c i o n e s de prueba ∗/
v o i d movimientoPrueba ( v o i d ) {
MoverAdelante ( ) ;
delay ms ( 4 0 0 ) ;
GirarIzquierdaAtras ( ) ;
delay ms ( 4 0 0 ) ;
GirarDerechaAtras ( ) ;
delay ms ( 4 0 0 ) ;
MoverAtras ( ) ;
delay ms ( 1 0 0 ) ;
}
v o i d t i t i l a r L e d ( u i n t 8 t numero ) {
uint8 t i ;
Led1Off ( ) ;
f o r ( i =0; i <(2∗numero ) ; i ++){
Led1Toggle ( ) ;
delay ms ( 2 0 0 ) ;
}
delay ms ( 3 0 0 ) ;
}
10

Documentos relacionados