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