Está en la página 1de 97

COMPETENCIA VEX ROBOTICS GATEWAY

Condiciones de la competencia
Introduccin
VEX GATEWAY se juega en una superficie de espuma de 12 pies x 12 pies (3.66 m x 3.66 m), rodeado de un permetro de hoja de metal y lexan. Hay trece metas de diferentes alturas, en las cuales los equipos pueden anotar pelotas y barriles. El campo est dividido por dos puertas grandes que los equipos pueden elevar a su discrecin para permitir el paso.

El juego
Las partidas se juegan en un campo organizado inicialmente como se ilustra en los dibujos de abajo. Dos Alianzas, una roja y otra azul, compuestas por dos equipos cada una, compiten en cada Partida. El objetivo del juego es obtener un puntaje mayor al de su Alianza oponente al Anotar Pelotas y Barriles en las Metas, Anotar Puntos de Bonificacin y al Anotar Barriles Duplicadores o Barriles de Negacin en las Metas Circulares.

Existe un total de veintisis (26) Barriles, dieciocho (18) Pelotas, dos (2) Barriles Duplicadores y dos (2) Barriles de Negacin disponibles como Objetos de Anotacin en el juego. Cada Alianza tendr cuatro (4) Barriles y cuatro (4)
1

Pelotas disponibles para cargarlos durante cada Partida. De estos Objetos de Anotacin, cada Alianza tiene la opcin de Pre-cargar dos (2) Barriles y dos (2) Pelotas. Los Objetos de Anotacin que no se Pre-carguen estarn disponibles para la Alianza para Cargar durante la Partida. Dieciocho (18) de los Barriles y diez (10) de las Pelotas iniciarn en lugares designados sobre el campo. Cada Alianza tendr un (1) Barril Duplicador y un (1) Barril de Negacin que se puede introducir en el campo de juego en algn momento durante los ltimos treinta (30) segundos de una partida. El campo est dividido en Zonas de Interaccin y Aislamiento por dos Puertas grandes de PVC que pueden elevar los equipos durante la Partida.

Definiciones del juego


Adulto: cualquiera que no cumpla con la definicin de Estudiante. Alianza: una agrupacin pre-asignada de dos equipos que trabajan juntos en una Partida dada.
2

Baldosa de inicio de Alianza: Una Baldosa de color (rojo o azul) que designa la posicin en la cual deben comenzar las partidas los Robots. Estacin de Alianza: La regin designada donde los Conductores y Entrenador se para durante cualquier Partida. Periodo Autnomo: Un periodo de tiempo de 20 segundos en el cual los Robots operan y reaccionan solo a la informacin de sensores y comandos preprogramados por el equipo en el sistema de control a bordo del Robot. Durante este tiempo se permite control humano o interaccin con el Robot, segn lo especfica las reglas del juego. Pelota: Un objeto de anotacin azul o roja de forma cilndrica con un dimetro de 6. Cada Pelota pesa aproximadamente 0.24 libras. Barril: un objeto de anotacin azul o rojo de forma cilndrica con un dimetro de 6 y una altura de 5. Cada Barril pera aproximadamente 0.53 libras. Punto de bonificacin: Un Punto de Bonificacin se gana por la Pelota o Barril ms baja (ms cercana al campo de baldosa de espuma) dentro de la Meta Circular. Meta Circular: Una de nueve estructuras de forma Circular, en los cuales los equipos colocan los Objetivos de Anotacin. Estas metas son de 11.5 , 20 y 30 de altura. La Meta Circular consiste de dos aros retenedores y cinco tubos de PVC. El borde exterior del aro se considera como el borde exterior de la Meta Circular. Entrenador: Un estudiante o mentor adulto designado como el consejero del equipo durante la partida. Solo se permite uno de estos por equipo en el campo en cualquier momento dado. Descalificacin: Una sancin aplicada a un equipo por la violacin de reglas. Un equipo que sea Descalificado en una Partida de Calificacin recibe (0) WP y SP. Cuando un equipo es Descalificado en una Partida de Eliminacin toda la Alianza es Descalificada y recibe una perdida para la Partida. A discrecin del rbitro en jefe, las violaciones y Descalificaciones repetidas de un equipo pueden llevar a su Descalificacin de todo el torneo. Barril Duplicador: Un barril blanco que duplica el valor de todos los puntos (incluyendo el Punto de Bonificacin) en una Meta Circular.

Conductor: Un estudiante miembro del equipo quien es responsable por operar y controlar el Robot. Solo se permiten dos por equipo en el campo en cualquier momento dado. Periodo Controlado por el Conductor: Periodo de tiempo de 2:00 (dos minutos) en el cual los Robots son operados por los Conductores. Enredo: Un robot se considera que ha Enredado a un robot oponente si ha agarrado o enganchado el robot oponente. Elemento del Campo: Las baldosas de espuma del campo, permetro del campo, Cerca, puertas y Metas Circulares. Cerca: El Elemento del Campo de PVC negro que separa las Zonas de Aislamiento roja y azul. La cerca tiene 7.5 de altura. Meta de Suelo: Una de cuatro reas marcadas en el campo de cinta blanca en la cual los equipos Anotan Barriles y Pelotas. Los bordes exteriores de las Metas del Suelo estn definidos por el borde interior del permetro de campo y el borde exterior de la lnea de cinta blanca. Puerta: El elemento del Campo de PVC rojo o azul que separa la Zona de Interaccin y las Zonas de Aislamiento la Puerta tiene bisagras y se puede elevar. La puerta tiene 7.5 de altura. Meta: Una Meta de Suelo o una Meta Circular. Zona de interaccin: rea de 6 x 12 del campo definida por el permetro de Campo y las Puertas. Zona de Aislamiento: Dos reas de 6 x6 del campo definida por la Puerta roja o azul al igual que la Cerca y el permetro del campo. Los Robots no pueden ingresar o salir de una Zona de Aislamiento mientras la Puerta para esa zona se encuentre abajo. Partida: Una Partida consiste en un Periodo Autnomo seguido por un Periodo Controlado por un Conductor para un tiempo total de 2:20 (dos minutos y veinte segundos). Cargas durante la Partida: los cuatro Barriles y cuatro Pelotas disponibles en cada Estacin de Alianza para cargarlos en cualquier momento durante la Partida. De estas Cargas durante la Partida, solo dos Barriles y dos Pelotas se pueden utilizar como Pre-cargas (Cargar antes de la Partida).

Barril de Negacin: un Barril negro que cancela el valor de todos los puntos (incluyendo el Punto de Bonificacin) con una Meta Circular. Inmovilizar: Se considera que un Robot esta inmovilizado por un Robot oponente si le est inhibiendo el movimiento a un Robot oponente mientras que el Robot oponente est en contacto con la superficie del juego de espuma y otro Elemento de Campo. Pre-cargas: Los dos Barriles y dos Pelotas que cada Alianza puede cargar en su Robot antes de cada Partida. Las Pre-cargas que no se convertirn en Cargas durante la Partida. Robot: Cualquier cosa (que haya pasado la inspeccin) que un equipo coloque en el campo antes de iniciar la Partida. Anotado: Un Objeto de anotacin es considerado como Anotado si no est tocando un Robot del mismo color del Objeto de Anotacin y cumple con uno de los siguientes criterios: 1. Un Objeto de Anotacin est completamente por debajo de la parte superior de los tubos de PVC de una Meta Circular y completamente dentro de un aro exterior de la Meta Circular.

2. Un Objetivo de Anotacin no est completamente por debajo de la parte superior de los tubos de PVC de una Meta Circular y parcialmente dentro del aro exterior de una Meta Circular.
5

3. Una pelota o barril est parcialmente dentro del borde exterior de una Meta de Suelo y tocando una baldose de la superficie del campo.

Objeto de Anotacin: Un Barril, Pelota, Barril Duplicador o Barril de Negacin. Estudiante: Cualquiera que este registrado en un colegio pre-universitario o educado en casa como parte de un currculo educativo pre-universitario.

Reglas del juego


Puntuacin Un Barril que se Anote en una Meta equivale a un punto para la Alianza del color del Barril. Una Pelota que se Anote en una Meta equivale a un punto para la Alianza del color de la Pelota. Un Punto de Bonificacin que se gane equivale a un punto para la Alianza del Objeto de Anotacin. Un Barril Duplicador que se Anote en la Meta Circular duplica el valor de todos los puntos en la Meta incluyendo el punto de Bonificacin. Un Barril de Negacin que se anote en la Meta Circular cancela el valor de todos los puntos en la Meta incluyendo el Punto de Bonificacin.

Reglas de seguridad <S1> Si en algn momento la operacin del Robot o acciones del equipo se estiman peligrosas o han daado los Elementos del Campo o los Objetos de Anotacin, por determinacin de los rbitros, el equipo ofensor puede ser Descalificado. Se requerir de una re-inscripcin del Robot antes de que pueda volver a tomar el campo.
7

<S2> Si un Robot sale completamente de los lmites (fuera del campo de juego), ser deshabilitado para el resto de la partida. NOTA: La intencin no es penalizar a los Robots por tener mecanismos que inadvertidamente crecen por el borde del campo durante el curso normal del juego.

Reglas generales del juego <G1> Cuando lea y aplique las diferentes reglas en este documento por favor recuerde que el sentido comn siempre aplica en la Competencia VEX Robotics. <G2> Al iniciar una Partida, cada Robot debe ser ms pequeo que un volumen de 18 (45.72 cm) de ancho por 18 (45.72 cm) de largo por 18 (45.72 cm) de alto. Un Robot defensor ser removido de la Partida a discrecin del rbitro en Jefe. <G3> Cada equipo debe incluir hasta dos Conductores y un Entrenador. <G4> Durante una Partida, los Conductores y el Entrenador deben permanecer en su estacin de Alianza. <G5> Durante las rondas de clasificacin, la Alianza roja tienen el derecho de ubicar a sus Robots en el Campo de ultimas. Durante las rondas de Eliminacin, la Alianza en una posicin ms alta tiene el derecho de ubicar a sus Robots en el campo de ltimas. Una vez que un equipo haya ubicado su Robot en el campo, su posicin no puede ser reajustada. Los Robots se deben ubicar en el campo rpidamente. <G6> A los conductores y los Entrenadores est prohibido hacer contacto intencional con cualquier Objeto de Anotacin, el Elemento de Campo o los Robots durante la partida, a excepcin del contacto especificado en SG5, SG6 y SG7. Cualquier contacto intencional resultara en una Descalificacin. El contacto accidental no ser penalizado, a menos que el contacto accidental resultara en una Descalificacin. <G7> Durante una Partida, los Robots pueden ser operados de manera remota solo por los Conductores y/o un software que opere en el sistema de control a bordo. Si un Entrenador toca los controles de su equipo en cualquier momento durante la Partida, el Robot ser deshabilitado y el equipo ser Descalificado. <G8> Los Objetos de Anotacin que salgan del campo de juego sern regresados al campo de juego rpidamente y al lugar ms prximo al punto donde salieron. Los equipos que remuevan Objetos de Anotacin del campo de anotacin de
8

manera intencional, mientras no estn en proceso de anotar o eliminacin de anotacin, sern Descalificados. <G9> Los puntajes se pueden calcular para todas la Partidas inmediatamente despus de la Partida una vez todos los objetos de campo se queden quietos. <G10> Los Robots no pueden soltar piezas intencionalmente durante cualquier Partida, o dejar mecanismos en el campo. Si un componente o mecanismo que se suelte intencionalmente afecta el juego, el equipo ser Descalificado a discrecin del rbitro. Varias infracciones intencionales pueden resultar en la Descalificacin de toda la competencia. <G11> Las estrategias enfocadas nicamente en la destruccin, dao, volcado o enredo de los Robots no son parte del espritu de la Competencia VEX y no se permiten. Sin embargo, VEX Gateway es un juego interactivo. Algn tipo de volcado, enredo y dao accidental puede ocurrir como parte del curso normal del juego. Si se dictamina que el volcado, enredo o dao es intencional o flagrante, el equipo ofensor puede ser descalificado de esa Partida. Ofensas repetidas pueden resultar en la descalificacin de un equipo para el resto de la competencia. <G12> Los Robots deben estar diseados para permitir la fcil remocin de los Objetos de Anotacin de cualquier mecanismo de agarre sin requerir que el Robot tenga energa luego de la Partida. <G13> Las tolerancias de campo pueden varias hasta +/- 1 (2.54 cm) as que los equipos deben disear sus Robots de acuerdo a esto. <G14> Las tolerancias de los Objetos de Anotacin pueden variar hasta +/- (0.32 cm). <G15> Las repeticiones de jugadas son a discrecin del organizador del evento y el rbitro en jefe, y solo se emitirn en las circunstancias ms extremas. <G16> Todos los equipos se adhieren a todas las Reglas de la Competencia VEX Robotics tal como estn escritas, y deben atenerse a la intencin anotada de las reglas. Todo equipo tiene la oportunidad de pedir interpretaciones oficiales de las reglas en el Foro de Preguntas y Respuestas de la Competencia VEX Robotics. Cualquier respuesta en este Foro se debe tratar como una decisin oficial del Comit de Diseo de Juego de la Competencia VEX Robotics y representa la interpretacin oficial y correcta de las reglas de Competencia VEX Robotics. <G17> Se espera que todos los equipos se comporten de una manera respetuosa y profesional mientras compitan en los eventos de la Competencia VEX Robotics. Si los miembros del equipo son irrespetuosos o inciviles con el personal de la
9

Partida actual o de la prxima. Es importante recordar que a todos se nos juzga de acuerdo a como manejamos la adversidad. Es importante que todos demostremos madurez y clase al tratar con cualquier situacin difcil que se pueda presentar tanto en la Competencia VEX Robotics como en la vida en general.

Reglas de juego Especificas VEX Gateway <SG1> Al iniciar cada Partida, cada Robot debe ser ubicado de tal manera que este tocando una de las Baldosas de Inicio de la Alianza y que no est tocando ningn Objeto de Anotacin o Meta diferente a los permitidos por <SG2>. No ms de un Robot puede iniciar la partida en una Baldosa de Inicio de Alianza cualquiera.

10

<SG2> Antes del inicio de cada Partida, Cada alianza tendr dos Barriles y dos Pelotas disponibles para Pre-cargarlas, una en cada Robot. Un Objeto de Anotacin se considera estar legalmente pre-cargado si est tocando el Robot o un pre-cargado legal, y no se considerara Anotado si no existiera contacto con un Robot. Los objetos pre-cargados tambin pueden estar sin tocar ninguna Meta.

<SG3> Un Barril o Pelota no se considera Anotado si lo est tocando un Robot de una Alianza del mismo color al finalizar la Partida. Si un Robot est tocando un Barril duplicador al finalizar la Partida, el Barril Duplicador solo duplica el valor de todos los puntos para la alianza oponente en la Meta Circular.

11

Si un Robot est tocando un Barril de Negociacin al finalizar la Partida, el Barril de Negociacin solo cancela el valor de todos los puntos de su propia Alianza en la Meta circular.

<SG4> Un Robot no puede inmovilizar a un Robot oponente por ms de cinco segundos durante cada Periodo Controlado por el Conductor mientras esta en la superficie de juego de espuma. Una Inmovilizacin se termina oficialmente una vez que el equipo inmovilizador se ha retirado dos pies (aproximadamente una Baldosa de espuma) del Robot Inmovilizado. Luego de terminarse la Inmovilizacin, un equipo no puede inmovilizar al mismo Robot de nuevo por una duracin de 5 segundos. Si un rbitro determina que esta regla se ha violado, el Robot ofensor ser Descalificado para la partida. No hay penalizacin para la inmovilizacin durante el Periodo Autnomo. <SG5> Durante el Periodo Autnomo, los Conductores y Entrenadores pueden manipular su propio Robot mientras se encuentra en contacto con su propia Baldosa de Inicio de Alianza. Durante el contacto con el Robot, los Conductores o Entrenadores no pueden manipular ni modificar intencionalmente la posicin de ningn Objeto de Anotacin (diferente a cualquiera que se est cargando en el Robot), sea por medio de contacto directo con la mano o contacto indirecto por medio del Robot. Los Entrenadores o Conductores tampoco pueden cambiar la configuracin del Robot aparte de para arreglar el Robot (es decir, est bien reposicionar el Robot con respecto al campo, pero no est bien levantar el brazo del Robot con las manos).
12

<SG6> Durante el Periodo Controlador por el Conductor, los Conductores y Entrenadores pueden manipular su propio Robot siempre que el Robot no se haya retirado de la Baldosa de Inicio de Alianza. La intencin de esta regla es permitirles a los equipos arreglar Robots que no se podan mover al inicio de la Partida. Nota: Durante la manipulacin especificada en <SG5> y <SG6> se pueden reposicionar a los Robots, pero se pueden regresar a su posicin inicial valida segn <SG1> dentro de la misma zona. <SG7> Cualquier Objeto de Anotacin introducido durante la Partida se debe colocar suavemente en el Robot de su propio color tocando una Baldosa de Inicio de Alianza o colocarse suavemente en una Baldosa de Inicio de Alianza de su propio color. La intencin de esta regla es permitirles a los equipos introducir objetos al juego, pero no transmitir energa sobre los Objetos de Anotacin que causara que resulte en una posicin anotada. Violaciones a esta regla resultaran en una advertencia por la primera ofensa. Ofensas posteriores o una primera ofensa mayscula resultara en una Descalificacin. Las Cargas durante la Partida las puede introducir un Conductor o Entrenador en cualquier momento durante la Partida. Las cargas durante la Parida solo se pueden introducir en la Zona de Interaccin. Las violaciones resultaran en una Descalificacin. Los Barriles Duplicadores y Barriles de Negacin solo los puede introducir un Conductor o Entrenador durante los ltimos 30 segundos de la Partida. Los Barriles Duplicadores solo se pueden introducir en la Zona de Interaccin. Los Barriles de Negacin solo se pueden introducir en la Zona de Aislamiento. Las violaciones resultaran en una Descalificacin.

<SG8> Si un Barril Duplicador y un Barril de Negacin se anotan en la misma Meta Circular, cada uno no tendr efecto en el puntaje. Si ms de un Barril Duplicador o Barril de Negacin se anotan en la misma Meta Circular solo el que se encuentre ms cercano a las Baldosas de espuma del campo contara. <SG9> No se le permite a los Robots remover (cancelar puntajes) cualquier Objeto de Anotacin que se considere Anotado segn la clusula 1, un objeto anotado no se puede remover de manera legal de una meta incluso si ya no cumple con los requerimientos de la clusula 1. Las violaciones de esta regla resultaran en una Descalificacin.

13

<SG10> No se le permite a los Robots traspasar la Baldosa de Inicio de Alianza oponente durante el Periodo Autnomo. Las violaciones a esta regla resultaran en la prdida del Barril Duplicador y Barril de Negacin por la Alianza infractora. <SG11> Los conductores o Entrenadores pueden elevar su propia Puerta en cualquier momento durante la Partida. Una vez que inicie le elevada de la Puerta debe finalizar rpidamente y no se puede dejar caer la Puerta. Se debe elevar y asegurar las dos Puertas antes de los ltimos treinta segundos restantes en la Partida. Las violaciones a esta regla resultaran en una Descalificacin de los dos equipos de Alianza infractora. <SG12> Los Robot no pueden interactuar con la Puerta por ms de cinco segundos o luego de que falten treinta y cinco segundos en una Partida. Los Robots no pueden interferir con el elevado de la Puerta, ni pueden elevar la Puerta. Las violaciones de esta regla resultaran una Descalificacin. <SG13> No se les permite a los equipos elevar su Puerta cuando un Robot oponente este tocando su Puerta legalmente. Las violaciones a esta regla resultaran en una Descalificacin de los dos equipos de la Alianza infractora. <SG14> Los Robots no pueden ingresar ni salir de una Zona de Aislamiento mientas que la puerta asociada con la Zona de Aislamiento se encuentre abajo.

14

<SG15> Los miembros del equipo no pueden ingresar al campo de juego hasta que el rbitro en jefe haya dado la seal de visto bueno y las dos puertas se encuentren abajo.

Modificaciones de las Reglas de Juego y Torneo para Universidades 1. En vez del formato de 2 equipos contra 2 equipos, el Reto para Universidad VRC se jugara 1 equipo contra 1 equipo, con un giro: cada equipo utilizara DOS Robots en cada partida. Esto significa que cada equipo tendr la oportunidad de construir su propio compaero! Se le permite a los equipos construir tantos Robots como quieran, pero solo se puede utilizar DOS en el campo durante la Partida. Todos los Robots deben pasar la inspeccin antes de permitir que compitan. 2. Las partidas de calificacin se llevaran a cabo como las normales, en el formato 1 contra 1 descrito arriba. 3. Se llevara a cabo un torneo de eliminacin similar al torneo de Secundaria. Al final de la competencia, UN equipo seguir como campen del evento. 4. El Periodo Autnomo al comienzo de cada partida se extender a 60 segundos. 5. El Periodo Controlado por el Conductor se reducir a 80 segundos y aun seguir inmediatamente despus del Periodo Autnomo. 6. Las Puertas estn cerradas para el resto de la Partida. La Zona de Aislamiento verdaderamente est aislada. 7. Existe un total de diez Metas, todas ubicadas dentro de las dos Zonas de Aislamiento. Seis de estas metas tienen 30 de altura, mientras que cuatro tienen 20 de altura. 8. Existen treinta y ocho Barriles y treinta Pelotas disponibles como Objetos de Anotacin estn distribuidos como se mostr en las imgenes anteriores. 9. Los Barriles de Negacin solo se pueden introducir en la Zona de Interaccin.

15

16

Modificaciones de las Reglas del Robot 1. Se le permite a los equipo fabricar sus propias piezas nicas VEX de los siguientes artculos adicionales, para cada uno de los Robots: a) Una pieza de bloqueo plstico de 6 x 6 x 1 i. Ejemplos de bloque de plstico son PVC, Derlin, ABS. b) Una hoja de Policarbonato (tambin conocido por sus nombres de marca tal como Lexan) de no ms de 12 x 24 de grande y 1/16 de ancho. Nota: no se miden por volumen. Los equipos se restringen como si los componentes que estn construyendo fueran hechos de la metera prima en la lista. 2. Se permite que cada Robot utilice un Micro-controlador VEX. a) No se permite ningn otro tipo de Micro-controlador VEX. 3. A cada Robot se le permite utilizar hasta doce motores VEX EDR o Servomotores VEX (cualquier combinacin hasta doce). a) De estos doce motores permitidos, los equipos pueden utilizar un mximo de cuatro Motores de 2 cables 393. 4. Cada Robot debe utilizar un mdulo VEX Net. 5. A cada Robot solo se le permite hasta dos Operadores y un Entrenador. a) Los Conductores deben ser estudiantes post-secundarios. i. Cualquier estudiante matriculado en un colegio postsecundario es elegible para ser conductor. ii. No existen restricciones sobre quien puede ser el Entrenador en el Reto de universidad VRC. iii. Los profesionales que no estn matriculados en la educacin post-secundaria tampoco con elegibles para ser Conductores 6. No hay restricciones sobre sensores y electrnicos adicionales utilizados para la percepcin y procesamiento, excepto o siguiente: a) Los sensores y electrnicos deben estar conectados al Microcontrolador VEX, y solo se pueden conectar por medio de cualquier puerto accesible de manera externa. b) Los sensores y electrnicos no pueden hacer una interface elctrica directa con los motores VEX. c) Los sensores y electrnicos adicionales solo pueden recibir energa de cualquiera de los siguientes: i. Directamente del Micro-controlador VEX por medio de un puerto accesible de manera externa.

17

De un batera de Robot VEX 7.2V adicional o de una batera Transmisora VEX 9.6V (solo se puede utilizar una batera para la energa del sensor). d) No se permiten Motores, Servomotores y Actuadores adicionales.

ii.

18

Introduccin
Para el desarrollo de la construccin de los Robots VEX Robotics una etapa fundamental sin duda alguna es la elaboracin eficiente del diseo mecnico, pues es necesario disear varios conceptos hasta encontrar el apropiado, de aqu que el sistema seleccionado pueda llegar a ser muy diferente de la idea planteada en un inicio. El mismo principio se puede observar al redactar un cdigo de programa para gobernar algn elemento y en general para cualquier aplicacin. En cualquiera de estos casos la similitud para llegar tanto al mecanismo como al programa finales requiere de conocimiento acerca de estas reas e inventiva por parte de cualquiera que desee aventurase dentro de estas actividades. La robtica enlaza principalmente entre otras reas de la tecnologa la ejecucin de las tareas mencionadas anterior mente y este hecho puede generar un reto que motive a un grupo de estudiantes a hacer uso de sus conocimientos con el fin de construir un robot nico ya sea como proyecto acadmico o para competencia. Este texto pretende exponer el desarrollo que tuvo el diseo de un par de robots en manos de estudiantes de la Universidad Tecnolgica Fidel Velzquez asesorados por profesores de la misma institucin, adems se incluye el programa detallado que gobierna el funcionamiento del mismo.

Objetivos
Objetivo general
Disear y desarrollar Robots con sistemas VEX Robotics que nos permitan ser manipulados de manera manual y autnoma con la capacidad de identificar, sujetar, levantar, transportar y depositar objetos de forma esfrica y cilndrica con dimensiones definidas, utilizando un conjunto de elementos mecnicos, electrnicos y algoritmos de programacin*. De manera tal que se fomente el desarrollo de la creatividad en la solucin de problemas y l trabajo en equipo.

Objetivos particulares
Disear y desarrollar Robots con sistemas VEX Robotics que nos permitan ser manipulados de manera manual. Disear y desarrollar Robots con sistemas VEX Robotics que nos permitan ser manipulados de manera autnoma. Desarrollar los conocimientos y la creatividad, as como tambin el trabajo en equipo entre los integrantes involucrados.
19

*Delimitados por los parmetros de la Competencia Gateway 2011- 2012.

CAPITULO 1 DISEO MECANICO Y MANIPULACION MANUAL DE LOS ROBOTS CON SISTEMA VEX ROBOTICS
1.1 Elaboracin base de los Robots
Las caractersticas propias de la competencia exigen que los Robots se desplacen rpida y fcilmente, as que se opt por una estructura de aluminio montada sobre cuatro llantas de las cuales dos tienen la funcin de apoyo y dos de traccin, adems de trenes de engranajes propulsados por motores.

1.1.1 Base Komodo 1 y 2


Las llantas de apoyo omnidireccionales permiten una rotacin fcil y rpida, la estructura de aluminio es apropiada debido a su peso reducido y resistencia, cuenta con dos trenes de engranes constituidos por: motriz, loco y conducido, los cuales trasmiten el par para la traccin, sacrificando al mnimo la velocidad. Figura 1.1 y Figura 1.2.

Figura1.1 Base Komodo 1

20

Figura 1.2 Base Komodo 2

Lista de materiales Komodo 1 (Figura 1.3)


Riel bastidor (junta prismtica) 4x Separador roscado de aluminio 2 4x Llanta omnidireccional 2.75 2x Eje cuadrado 3.75 aprox. 8x Motor 2 cables 269 2x Engrane 36 dientes ancho 4x Engrane 60 dientes ancho 2x Opresor para eje 14x Cojinete 10x Llanta 2x

21

Figura 1.3 Vista explosionada Komodo 1

Lista de materiales Komodo 2 (Figura 1.4)


Riel bastidor /junta prismtica) 4x Separador roscado de aluminio 16x Llanta omnidireccional 2x Eje cuadrado 3.75 aprox. 8x Motor dos cables 269 2x Engrane 36 dientes ancho 2x Engrane 60 dientes ancho 2x Engrane 84 dientes ancho 2x Cojinete 20x Opresor para eje 16X Placa de 5x5 4x

22

Figura 1.4 Vista explosionada Komodo 2

1.2 Desarrollo del mecanismo de levantamiento


Los robots delimitados por las medidas 18x18x18; adems las metas con alturas de 20 y 30; exigen diseos verstiles que se puedan adaptar a las diferentes medidas, basndose en estas premisas se disearon los mecanismos para la elevacin de manera que puedan anotar en cualquiera de estas metas.

1.2.1 Mecanismo Komodo 1


Consiste en un arreglo de ruedas dentadas que propulsadas por motores, transmiten el movimiento mediante cadenas hasta los eslabones de salida, como se muestra en la figura 1.5

23

Figura 1.5 Mecanismo de levantamiento Komodo 1

Lista de materiales Komodo 1 (figura 1.6) Motor dos hilos 269 2x Opresor para eje 10x Cojinete 10x Separador de plstico 7x Eje cuadrado 3x Separador roscado de aluminio 2 4x Catarina 4 4x Catarina 1 2x Riel bastidor (junta prismtica) 6x Cadena

24

Figura 1.6 Vista explosionada mecanismo de levantamiento

1.2.2 Mecanismo Komodo 2


Cuenta con dos mecanismos para obtener la elevacin mxima; el primero vara la inclinacin de la estructura de las bandas de sujecin, y el segundo proporciona movimiento en forma ascendente o descendente para las bandas. Ambos compuestos por cremallera montada sobre rieles de deslizamiento. Se puede apreciar el mecanismo en las figuras siguientes.

25

Figura 1.7 Mecanismo de levantamiento Komodo 2, parte 1

Figura 1.8 Mecanismo de levantamiento Komodo 2, parte 2

26

Lista de materiales Komodo 2 (figura 1.9 y 1.10) Riel bastidor (junta prismtica) 8x Cremallera 5x Motor tres hilos 269 4x Cojinete 9x Engrane metal 4x Engrane 60 dientes ancho 4x Separador roscado de aluminio 8x Motor-reductor 1x Eje cuadrado 7x Bisagras 2x Opresor para eje 12x

Figura 1.9 Vista explosionada Komodo 2

27

Figura 1.10 Vista explosionada Komodo 2

1.3 Desarrollo del mecanismo de manipulacin


El mecanismo es similar en ambos robots, pues para poder llevar a cabo la manipulacin; es necesario tomar en cuenta algunas caractersticas fsicas de los objetos de anotacin, como son la textura y el dimetro; dentro del diseo tambin influye la duracin de las partidas y la puntuacin (a mayor nmero de objetos anotados, mayor puntaje).

1.3.1 Mecanismo Komodo 1 y Komodo 2


El diseo est basado en el concepto de banda transportadora; solo que en este fue implementada en posicin vertical sobre el mecanismo de levantamiento. Est compuesto por catarinas y bandas con paletas de material plstico que permite tomar fcilmente los objetos de anotacin. Figura 1.11 y figura 1.12.

28

Figura 1.11 Komodo 1

Figura 1.12 Komodo 2

29

Lista de materiales Komodo 1 (figura 1.13) Riel bastidor (junta prismtica) 13x Catarina 2 4x Banda Paletas 28x Eje cuadrado 4x Motor tres hilos 2x Cojinete 4x Separador roscado de aluminio 10x Separador de plstico 6x Opresor para eje 4x

Figura 1.13 Vista explosionada Komodo 1

Lista de materiales Komodo 2 (figura 1.14) Riel bastidor (junta prismtica) 11x Separador roscado de aluminio 18x Motor tres hilos 269 2x Banda
30

Paletas 32x Separador de plstico 4x Cojinete 12x Catarina 2 4x Llantas 2x

Figura 1.14 Vista explosionada Komodo 2

31

1.4 Ensamble final


Como se esperaba el diseo final de los Robots tuvo una gran evolucin; pues conforme avanzaron las pruebas, se encontraron reas de oportunidad en cuanto a la eficiencia de los mecanismos seleccionados, y estos se redisearon hasta obtener un modelo adecuado que realizara la tarea de manera eficiente.

1.4.1 Komodo 1

Figura 1.15 Ensamble final Komodo 1

32

1.4.2 Komodo 2

Figura 1.16 Ensamble final Komodo 2

1.5 Entorno de programacin y control manual


En la competencia VEX Robotics Gateway existen dos periodos; uno de ellos es el Periodo Controlado por el Conductor; en este se usan los Joysticks para manipular los movimientos de los Robots. Se programa el micro-controlador del Robot, indicando que canal o que botn del Joystick va a manipular cada motor; se programa la velocidad de estos y el sentido de giro.

33

1.5.1 Komodo1
Programa para control manual
#pragma config(Sensor, in1, poteleva, sensorPotentiometer) #pragma config(Sensor, in2, , sensorLineFollower) #pragma config(Motor, port1, elevacionder, tmotorNormal, openLoop) #pragma config(Motor, port2, motder, tmotorNormal, openLoop) #pragma config(Motor, port3, motizq, tmotorNormal, openLoop, reversed) #pragma config(Motor, port4, banda, tmotorNormal, openLoop, reversed) #pragma config(Motor, port5, banda2, tmotorNormal, openLoop) #pragma config(Motor, port10, elevacionizq, tmotorNormal, openLoop) //*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//

//* PROGRAMA PARA EL MANEJO MANUAL DEL ROBOT *// task main() { while(true) // MIENTRAS TODO SEA VERDAD SE EJECUTA EL SIGUIENTE CODIGO (SIEMPRE) { motor[motder]=vexRT[Ch2]; // DIRECCIONAMIENTO DE RUEDA DERECHA motor[motizq]=vexRT[Ch3]; // DIRECCIONAMIENTO DE RUEDA IZQUIERDA //* SI EL BOTON 6U ESTA EN "1" ELEVA EL BRAZO*// if (vexRT[Btn6U]==1 && SensorValue(poteleva) <= 3080) //SI EL VALOR DEL BOTON 6U ES "1" Y EL VALOR DEL POTENCIOMETRO ES MENOR O IGUAL QUE 3000 EJECUTA LO SIG. { motor[elevacionder]=-100; //EL MOTOR DERECHO DE LA ELEVACION GIRA A SU MAXIMA VELOCIDAD CONTRARIA motor[elevacionizq]=100; //EL MOTOR IZQUIERDO DE LA ELEVACION GIRA A SU MAXIMA VELOCIDAD } //* SI EL BOTON 6D ESTA EN "1" INCLINA EL BRAZO *// else if (vexRT[Btn6D]==1 && SensorValue(poteleva) >= 1300 ) //SI EL VALOR DEL BOTON 6D ES "1" Y EL VALOR DEL POTENCIOMETRO ES MENOR O IGUAL QUE 3000 EJECUTA LO SIG. { motor[elevacionder]=100; //EL MOTOR IZQUIERDO DE LA ELEVACION GIRA A SU MAXIMA VELOCIDAD motor[elevacionizq]=-100; //EL MOTOR DERECHO DE LA ELEVACION GIRA A SU MAXIMA VELOCIDAD CONTRARIA

34

} else // EN CASO DE QUE NO SEA NINGUNA CONDICION DE LAS 2 ANTERIORES EJECUTA LO SIGUIENTE { motor[elevacionder]=0; //EL MOTOR DERECHO DE LA ELEVACION DISMINUYE SU VELOCIDAD A CERO motor[elevacionizq]=0; //EL MOTOR IZQUIERDO DE LA ELEVACION DISMINUYE SU VELOCIDAD A CERO } //* SI EL BOTON 5U ESTA EN "1" MANDA LA BANDA HACIA ADENTRO**// if(vexRT[Btn5U]==1) //SI EL VALOR DEL BOTON 5U ES "1" EJECUTA LO SIG. { motor[banda]=127; //EL MOTOR DE LA BANDA1 GIRA A SU MAXIMA VELOCIDAD motor[banda2]=127; //EL MOTOR DE LA BANDA2 GIRA A SU MAXIMA VELOCIDAD } //* SI EL BOTON 5D ESTA EN "1" MANDA LA BANDA HACIA AFUERA**// else if(vexRT[Btn5D]==1) //SI EL VALOR DEL BOTON 5D ES "1" EJECUTA LO SIG. { motor[banda]=-127; //EL MOTOR DE LA BANDA1 GIRA A SU MAXIMA VELOCIDAD motor[banda2]=-127; //EL MOTOR DE LA BANDA2 GIRA A SU MAXIMA VELOCIDAD CONTRARIA } else // EN CASO DE QUE NO SEA NINGUNA CONDICION DE LAS 2 ANTERIORES EJECUTA LO SIGUIENTE { motor[banda]=0; //EL MOTOR DE LA BANDA1 DISMINUYE SU VELOCIDAD A0 motor[banda2]=0; //EL MOTOR DE LA BANDA2 DISMINUYE SU VELOCIDAD A0 } } }

35

Canales del Joystick

Base motor Izquierda

Base motor derecha

Figura 1.17 Canales del Joystick Komodo 1

Mecanismo de elevacin

Activacin de bandas

Figura 1.18 Canales del joystick Komodo 1 (continuacin)

36

1.5.2 Komodo 2
Programa para control manual #pragma config(Sensor, dgtl1, limit, sensorTouch) #pragma config(Sensor, dgtl2, bumper2, sensorTouch) #pragma config(Sensor, dgtl3, rightEncoder, sensorQuadEncoder) #pragma config(Sensor, dgtl5, leftEncoder, sensorQuadEncoder) #pragma config(Motor, port1, motizq, tmotorNormal, openLoop, reversed) #pragma config(Motor, port2, motder, tmotorNormal, openLoop) #pragma config(Motor, port3, angulo, tmotorNormal, openLoop) #pragma config(Motor, port4, angulo2, tmotorNormal, openLoop) #pragma config(Motor, port5, elevacion, tmotorNormal, openLoop) #pragma config(Motor, port6, elevacion2, tmotorNormal, openLoop) #pragma config(Motor, port7, pelotasizq, tmotorNormal, openLoop) #pragma config(Motor, port8, pelotasder, tmotorNormal, openLoop, reversed) //*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// task main()//se realiza la tarea principal del robot { SensorValue[rightEncoder] = 0; // Se resetea el valor del encoder derecho SensorValue[leftEncoder] = 0; // Se resetea el valor del encoder izquierdo

while(1==1)//mientras 1 sea igual a 1 (siempre) {


37

motor[motder]=-vexRT[Ch2]; motor[motizq]=-vexRT[Ch3];//los motores derecho e izquierdo //se moveran de acuerdo alos canales 2 y 3 del joystick if(vexRT[Btn6U]==1)//si el boton 6U es igual a 1... { motor[angulo]=90; //que se mueva a la velocidad indicada motor[angulo2]=-90;//que se mueva a la velocidad indicada } else if(vexRT[Btn6D]==1)//si el boton 6D es igual a 1... { motor[angulo]=-90;//que se mueva a la velocidad indicada motor[angulo2]=90;//que se mueva a la velocidad indicada } else//si es ninguna de las anteriores... { motor[angulo]=0;//que se detenga motor[angulo2]=0;//que se detenga } if(vexRT[Btn5U]==1)//si el boton 5U es igual a 1... { motor[elevacion]=-110;//que se mueva a la velocidad indicada motor[elevacion2]=-110;//que se mueva a la velocidad indicada } else if(vexRT[Btn5D]==1)//si el boton 5D es igual a 1... { motor[elevacion]=100;//que se mueva a la velocidad indicada motor[elevacion2]=100;//que se mueva a la velocidad indicada if(SensorValue(bumper2)==1)//si el "bumper2" es igual a 1... { motor[elevacion]=0;//que se detenga motor[elevacion2]=0;//que se detenga valor del sensor

38

} } else//si es ninguna de las anteriores... { motor[elevacion]=0;//que se detenga motor[elevacion2]=0;//que se detenga } if(vexRT[Btn8U]==1)//si el boton 8U es igual a 1... { motor[pelotasder]=110;//que se mueva a la velocidad indicada motor[pelotasizq]=110;//que se mueva a la velocidad indicada } else if(vexRT[Btn8D]==1)//si el boton 8D es igual a 1... { motor[pelotasder]=-110;//que se mueva a la velocidad indicada motor[pelotasizq]=-110;//que se mueva a la velocidad indicada } else//si es ninguna de las anteriores... { motor[pelotasder]=0;//que se detenga motor[pelotasizq]=0;//que se detenga } if(vexRT[Btn7U]==1)//si el boton 7U es igual a 1... { while (SensorValue(limit)==0)//mientras el valor del sensor "limit" sea igual a cero... { motor[motder]=-vexRT[Ch2]; motor[motizq]=-vexRT[Ch3];//los motores derecho e izquierdo //se moveran de acuerdo alos canales 2 y 3 del joystick motor[elevacion]=-90;//que se mueva a la velocidad indicada motor[elevacion2]=-90;//que se mueva a la velocidad indicada

if(SensorValue(limit)==1)//si el valor del sensor "limit" es igual a 1


39

{ motor[elevacion]=0;//que se detenga motor[elevacion2]=0;//que se detenga } } } } }

Canales del joystick

Activacin de bandas Base motor Izquierda

Base motor derecha

Figura 1.19 Canales del joystick Komodo 2

40

Mecanismo de elevacin en ngulo

Mecanismo de elevacin

Figura 1.20 Canales del joystick Komodo 2 (continuacin)

41

CAPITULO 2 MANIPULACION AUTONOMA PARA EL CONTROL DE LOS SISTEMAS VEX ROBOTICS


2.1 Programa control autnomo
El otro periodo del concurso VEX Robotics Gateway es el Autnomo; el cual requiere un programa que simule inteligencia. Para esto se trazaron trayectorias en base a la distancia entre objetos. Gracias a esto la programacin puede llevarse a cabo con mayor facilidad. A continuacin se muestra el cdigo de programa para ambos Robots: Komodo 1 Equipo Azul #pragma config(Sensor, in1, poteleva, sensorPotentiometer) sensorQuadEncoder) sensorQuadEncoder) sensorTouch) sensorTouch)

#pragma config(Sensor, dgtl1, leftEncoder, #pragma config(Sensor, dgtl3, rightEncoder, #pragma config(Sensor, dgtl7, limit, #pragma config(Sensor, dgtl8, arriba, #pragma config(Motor, port1, #pragma config(Motor, port2, #pragma config(Motor, port3, reversed) #pragma config(Motor, port4, reversed) #pragma config(Motor, port5, #pragma config(Motor, port10,

elevacionder, tmotorNormal, openLoop) motder, motizq, tmotorNormal, openLoop) tmotorNormal, openLoop,

banda,

tmotorNormal, openLoop,

banda2,

tmotorNormal, openLoop)

elevacionizq, tmotorNormal, openLoop) !!*//

//*!!Code automatically generated by 'ROBOTC' configuration wizard

42

//* PROGRAMA AUTONOMO PARA RECOGER DOS PELOTAS, BARRILES Y ENSESTARLOS A DOS CANASTAS EN EQUIPO AZUL**//

DOS

void avanza(int distancia) //Se crea una rutina`para avanzar una distancia especifica { int enc=0; int pulsos=0; // Resetea el valor de la variavle "enc" // Resetea el valor de la variable "pulsos"

SensorValue[rightEncoder]=0; // Manda el encoder derecho a 0 SensorValue[leftEncoder]=0; // Manda el encoder izquierdo a 0

while(pulsos < distancia) viajado la distancia deseada {

// Se crea un loop hasta que el robot haya

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = 90; motor[motder] = 90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // gira ligeramente a la izquierda motor[motizq] = 70; motor[motder] = 80; // Que se mueva a una velocidad media // Que se mueva a una velocidad mxima
43

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

} else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero// Si el valor del encoder derecho es menos al del izquierdo { // gira ligeramente a la derecha motor[motizq] = 80; motor[motder] = 70; } else { // stop motor[motizq] = 0; motor[motder] = 0; } enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2; // Se saca el promedio de los dos encoders pulsos=(30*enc)/260; establecer distancias } motor[motizq] = 0; motor[motder] = 0; } void retrocede(float distancia) //Se crea una rutina para retroceder una distancia especifica { int enc=0;
44

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

// Si el valor del encoder derecho es menos al del izquierdo

// Que mande la velocidad a 0 // Que mande la velocidad a 0

// se saca una raiz para

// Que mande la velocidad a 0 // Que mande la velocidad a 0

int pulsos=0; SensorValue[rightEncoder]=0; //MANDA EL ENCODER DERECHO A 0 SensorValue[leftEncoder]=0; //MANDA EL ENCODER DERECHO A 0

while(pulsos < distancia) la distancia deseada {

// Se crea un loop hasta que el robot haya viajado

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // Avanza hacia adelante motor[motizq] = -105; motor[motder] = -90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // Gira ligeramente a la izquierda motor[motizq] = -80; motor[motder] = -80; } else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero// Si el valor del encoder derecho es menos al del izquierdo { // Gira ligeramente a la derecha motor[motizq] = -70; // Que se mueva a una velocidad mxima
45

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

// Que se mueva a una velocidad media // Que se mueva a una velocidad mxima

motor[motder] = -70; } else { // Stop motor[motizq] = 0; motor[motder] = 0; }

// Que se mueva a una velocidad media

// Si el valor del encoder derecho es menos al del izquierdo

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2; // Se saca el promedio de los dos encoders pulsos=(30*enc)/260; } motor[motder]=0; motor[motizq]=0; } void bandain (int time) { ClearTimer(T1); // Se limpia el valor del tiempo // Crea una rutina para mandar la banda hacia adentro // Manda la velocidad a 0 // Manda la velocidad a 0 // Se saca una raiz para establecer distancias

while(time1[T1] < time) // Se crea un loop hasta que la banda haya avansado hacia adentro durante un tiempo deseado { motor[banda] = 100; motor[banda2] = 100; } motor[banda] = 0; motor[banda2] = 0; // Manda la velocidad a 0 // Manda la velocidad a 0
46

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

} void bandaout (int time) { ClearTimer(T1); // Se limpia el valor del tiempo // Crea una rutina para mandar la banda hacia afuera

while(time1[T1] < time) // Se crea un loop hasta que la banda haya avansado hacia afuera durante un tiempo deseado { motor[banda] = -100; motor[banda2] = -100; } motor[banda] = 0; motor[banda2] = 0; } void subebrazo(int pot) { while(SensorValue[poteleva] <= pot) // Se crea un loop para elevar brazo a un angulo especifico { motor[elevacionder]= -127; // Que se mueva a una velocidad mxima motor[elevacionizq]= 127; // Que se mueva a una velocidad mxima } motor[elevacionder]= 0; motor[elevacionizq]= 0; } void bajabrazo(int pot) {
47

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

// Manda la velocidad a 0 // Manda la velocidad a 0

// Crea una rutina para subir brazo

// Manda la velocidad a 0 // Manda la velocidad a 0

// Crea una rutina para bajar brazo

ClearTimer(T1);

// Se limpia el valor del tiempo

while(SensorValue[poteleva] >= pot) // Se crea un loop para bajar brazo a un angulo especifico { motor[elevacionder]= 127; // Que se mueva a una velocidad mxima motor[elevacionizq]= -127; // Que se mueva a una velocidad mxima } motor[elevacionder]= 0; motor[elevacionizq]= 0; wait1Msec(200); } void vueltaizq(int deg) // Crea una rutina para girar hacia la izquierda { //Completely clear out any previous sensor readings by setting the port to "sensorNone" SensorType[in2] = sensorNone; wait1Msec(1000); //Reconfigure Analog Port 8 as a Gyro sensor and allow time for ROBOTC to calibrate it SensorType[in2] = sensorGyro; wait1Msec(2000); // Manda la velocidad a 0 // Manda la velocidad a 0

//Adjust SensorScale to correct the scaling for your gyro //SensorScale[in8] = 260; //Adjust SensorFullCount to set the "rollover" point. A value of 3600 sets the rollover point to +/-3600 //SensorFullCount[in8] = 3600;
48

//Specify the number of degrees for the robot to turn (1 degree = 10, or 900 = 90 degrees) int degrees10 = deg*10; //Specify the amount of acceptable error in the turn int error = 5;

//While the absolute value of the gyro is less than the desired rotation - 100... while(abs(SensorValue[in2]) < degrees10 - 100) { motor[motder] = 90; // Que se mueva a una velocidad mxima

motor[motizq] = -90; // Que se mueva a una velocidad mxima } //Brief brake to eliminate some drift motor[motder] = -20; motor[motizq] = 20; wait1Msec(100); // Que se mueva a una velocidad menor // Que se mueva a una velocidad menor

//Second while loop to move the robot more slowly to its goal, also setting up a range //for the amount of acceptable error in the system while(abs(SensorValue[in2]) > degrees10 + error || abs(SensorValue[in2]) < degrees10 - error) { if(abs(SensorValue[in2]) > degrees10) {

49

motor[motder] = -60; // Que se mueva a una velocidad media motor[motizq] = 60; } else { motor[motder] = 60; // Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

motor[motizq] = -60; // Que se mueva a una velocidad mxima } } //Stop motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); } void vueltader(int deg) { //Completely clear out any previous sensor readings by setting the port to "sensorNone" SensorType[in2] = sensorNone; wait1Msec(1000); //Reconfigure Analog Port 8 as a Gyro sensor and allow time for ROBOTC to calibrate it SensorType[in2] = sensorGyro; wait1Msec(2000); // Crea una rutina para girar hacia la izquierda // Mande la velocidad a 0 // Mande la velocidad a 0

//Adjust SensorScale to correct the scaling for your gyro


50

//SensorScale[in8] = 260; //Adjust SensorFullCount to set the "rollover" point. A value of 3600 sets the rollover point to +/-3600 //SensorFullCount[in8] = 3600;

//Specify the number of degrees for the robot to turn (1 degree = 10, or 900 = 90 degrees) int degrees10 = deg*10; //Specify the amount of acceptable error in the turn int error = 5; //While the absolute value of the gyro is less than the desired rotation - 100... while(abs(SensorValue[in2]) < degrees10 - 100) { motor[motder] = -90; // Que se mueva a una velocidad mxima motor[motizq] = 90; } //Brief brake to eliminate some drift motor[motder] = 20; motor[motizq] = -20; wait1Msec(100); // Que se mueva a una velocidad menor // Que se mueva a una velocidad menor // Que se mueva a una velocidad mxima

//Second while loop to move the robot more slowly to its goal, also setting up a range //for the amount of acceptable error in the system while(abs(SensorValue[in2]) > degrees10 + error || abs(SensorValue[in2]) < degrees10 - error) {
51

if(abs(SensorValue[in2]) > degrees10) { motor[motder] = 60; motor[motizq] = -60; } else { motor[motder] = -60; motor[motizq] = 60; } } //Stop motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); } task main() { subebrazo(1600); avanza(34); wait1Msec(500); bandain(900); wait1Msec(500); bajabrazo(1550); avanza(9); // Eleva brazo (altura pelota) // Avansa hacia adelante 34 cm // Espera 1/2 segundo // Activa banda hacia adentro // Espera 1/2 segundo // Inclina brazo (altura barril) // Avansa hacia adelante 9 cm
52

// Que se mueva a una velocidad media // Que se mueva a una velocidad media

// Que se mueva a una velocidad media // Que se mueva a una velocidad media

// Mande la velocodad a 0 // Mande la velocodad a 0

bandain(1200); subebrazo(2440); vueltaizq(70); avanza(12); bandaout(2000); vueltader(70); retrocede(60); avanza(15); vueltader(45); bajabrazo(1900); avanza(32); bandain(900); wait1Msec(500); bajabrazo(1550); avanza(9); bandain(1200); subebrazo(2440); avanza(18); vueltaizq(45); avanza(47); bandaout(2000); }

// Activa banda hacia adentro // Eleva brazo (altura canasta) // Gira 70 grados hacia la izquierda // Avansa hacia adelante 12 cm // Deposita pelota y barril en canasta // Gira 70 grados hacia la derecha // Retrocede 60 cm // Avansa hacia adelante 15 cm // Gira 45 grados hacia la derecha // Inclina brazo (altura seguda pelota) // Avansa hacia adelante 32 cm // Activa banda hacia adentro // Espera 1/2 segundo // Inclina brazo (altura segundo barril) // Avansa hacia adelante 9 cm // Activa banda hacia adentro // Eleva brazo (altura segunda canasta) // Avansa hacia adelante 18 cm // Gira 45 grados hacia la izquierda // Avansa hacia adelante 47 cm // Deposita pelota y barril en canasta

Equipo Rojo #pragma config(Sensor, in1, poteleva, sensorPotentiometer)


53

#pragma config(Sensor, dgtl1, leftEncoder, #pragma config(Sensor, dgtl3, rightEncoder, #pragma config(Sensor, dgtl7, limit, #pragma config(Sensor, dgtl8, arriba, #pragma config(Motor, port1, #pragma config(Motor, port2, #pragma config(Motor, port3, reversed) #pragma config(Motor, port4, reversed) #pragma config(Motor, port5, #pragma config(Motor, port10,

sensorQuadEncoder) sensorQuadEncoder) sensorTouch) sensorTouch)

elevacionder, tmotorNormal, openLoop) motder, motizq, tmotorNormal, openLoop) tmotorNormal, openLoop,

banda,

tmotorNormal, openLoop,

banda2,

tmotorNormal, openLoop)

elevacionizq, tmotorNormal, openLoop) !!*//

//*!!Code automatically generated by 'ROBOTC' configuration wizard

//* PROGRAMA AUTONOMO PARA RECOGER DOS PELOTAS, DOS BARRILES Y ENSESTARLOS A DOS CANASTAS EN EQUIPO COLOR ROJO **//

void avanza(int distancia) //Se crea una rutina`para avanzar una distancia especifica { int enc=0; int pulsos=0; // Resetea el valor de la variavle "enc" // Resetea el valor de la variable "pulsos"

SensorValue[rightEncoder]=0; // Manda el encoder derecho a 0 SensorValue[leftEncoder]=0; // Manda el encoder izquierdo a 0

54

while(pulsos < distancia) viajado la distancia deseada {

// Se crea un loop hasta que el robot haya

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = 90; motor[motder] = 90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // gira ligeramente a la izquierda motor[motizq] = 70; motor[motder] = 80; } else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero// Si el valor del encoder derecho es menos al del izquierdo { // gira ligeramente a la derecha motor[motizq] = 80; motor[motder] = 70; } else {
55

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

// Que se mueva a una velocidad media // Que se mueva a una velocidad mxima

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

// Si el valor del encoder derecho es menos al del izquierdo

// stop motor[motizq] = 0; motor[motder] = 0; } enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2; // Se saca el promedio de los dos encoders pulsos=(30*enc)/260; establecer distancias } motor[motizq] = 0; motor[motder] = 0; } // Que mande la velocidad a 0 // Que mande la velocidad a 0 // se saca una raiz para // Que mande la velocidad a 0 // Que mande la velocidad a 0

void retrocede(float distancia) //Se crea una rutina para retroceder una distancia especifica { int enc=0; int pulsos=0; SensorValue[rightEncoder]=0; //MANDA EL ENCODER DERECHO A 0 SensorValue[leftEncoder]=0; //MANDA EL ENCODER DERECHO A 0

while(pulsos < distancia) la distancia deseada {

// Se crea un loop hasta que el robot haya viajado

56

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // Avanza hacia adelante motor[motizq] = -105; motor[motder] = -90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // Gira ligeramente a la izquierda motor[motizq] = -80; motor[motder] = -80; } else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero// Si el valor del encoder derecho es menos al del izquierdo { // Gira ligeramente a la derecha motor[motizq] = -70; motor[motder] = -70; } else { // Stop motor[motizq] = 0; motor[motder] = 0; // Que se mueva a una velocidad mxima // Que se mueva a una velocidad media
57

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

// Que se mueva a una velocidad media // Que se mueva a una velocidad mxima

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

// Si el valor del encoder derecho es menos al del izquierdo

} enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2; // Se saca el promedio de los dos encoders pulsos=(30*enc)/260; } motor[motder]=0; motor[motizq]=0; } void bandain (int time) { ClearTimer(T1); // Se limpia el valor del tiempo // Crea una rutina para mandar la banda hacia adentro // Manda la velocidad a 0 // Manda la velocidad a 0 // Se saca una raiz para establecer distancias

while(time1[T1] < time) // Se crea un loop hasta que la banda haya avansado hacia adentro durante un tiempo deseado { motor[banda] = 100; motor[banda2] = 100; } motor[banda] = 0; motor[banda2] = 0; } void bandaout (int time) { ClearTimer(T1); // Se limpia el valor del tiempo // Crea una rutina para mandar la banda hacia afuera // Manda la velocidad a 0 // Manda la velocidad a 0 // Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

while(time1[T1] < time) // Se crea un loop hasta que la banda haya avansado hacia afuera durante un tiempo deseado {

58

motor[banda] = -100; motor[banda2] = -100; } motor[banda] = 0; motor[banda2] = 0; } void subebrazo(int pot) {

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

// Manda la velocidad a 0 // Manda la velocidad a 0

// Crea una rutina para subir brazo

while(SensorValue[poteleva] <= pot) // Se crea un loop para elevar brazo a un angulo especifico { motor[elevacionder]= -127; // Que se mueva a una velocidad mxima motor[elevacionizq]= 127; // Que se mueva a una velocidad mxima } motor[elevacionder]= 0; motor[elevacionizq]= 0; } void bajabrazo(int pot) { ClearTimer(T1); // Se limpia el valor del tiempo // Crea una rutina para bajar brazo // Manda la velocidad a 0 // Manda la velocidad a 0

while(SensorValue[poteleva] >= pot) // Se crea un loop para bajar brazo a un angulo especifico { motor[elevacionder]= 127; // Que se mueva a una velocidad mxima motor[elevacionizq]= -127; // Que se mueva a una velocidad mxima }
59

motor[elevacionder]= 0; motor[elevacionizq]= 0; wait1Msec(200); }

// Manda la velocidad a 0 // Manda la velocidad a 0

void vueltaizq(int deg) // Crea una rutina para girar hacia la izquierda { //Completely clear out any previous sensor readings by setting the port to "sensorNone" SensorType[in2] = sensorNone; wait1Msec(1000); //Reconfigure Analog Port 8 as a Gyro sensor and allow time for ROBOTC to calibrate it SensorType[in2] = sensorGyro; wait1Msec(2000);

//Adjust SensorScale to correct the scaling for your gyro //SensorScale[in8] = 260; //Adjust SensorFullCount to set the "rollover" point. A value of 3600 sets the rollover point to +/-3600 //SensorFullCount[in8] = 3600;

//Specify the number of degrees for the robot to turn (1 degree = 10, or 900 = 90 degrees) int degrees10 = deg*10; //Specify the amount of acceptable error in the turn int error = 5;

60

//While the absolute value of the gyro is less than the desired rotation - 100... while(abs(SensorValue[in2]) < degrees10 - 100) { motor[motder] = 90; // Que se mueva a una velocidad mxima

motor[motizq] = -90; // Que se mueva a una velocidad mxima } //Brief brake to eliminate some drift motor[motder] = -20; motor[motizq] = 20; wait1Msec(100); // Que se mueva a una velocidad menor // Que se mueva a una velocidad menor

//Second while loop to move the robot more slowly to its goal, also setting up a range //for the amount of acceptable error in the system while(abs(SensorValue[in2]) > degrees10 + error || abs(SensorValue[in2]) < degrees10 - error) { if(abs(SensorValue[in2]) > degrees10) { motor[motder] = -60; // Que se mueva a una velocidad media motor[motizq] = 60; } else { motor[motder] = 60; // Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

motor[motizq] = -60; // Que se mueva a una velocidad mxima


61

} } //Stop motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); } void vueltader(int deg) { //Completely clear out any previous sensor readings by setting the port to "sensorNone" SensorType[in2] = sensorNone; wait1Msec(1000); //Reconfigure Analog Port 8 as a Gyro sensor and allow time for ROBOTC to calibrate it SensorType[in2] = sensorGyro; wait1Msec(2000); // Crea una rutina para girar hacia la izquierda // Mande la velocidad a 0 // Mande la velocidad a 0

//Adjust SensorScale to correct the scaling for your gyro //SensorScale[in8] = 260; //Adjust SensorFullCount to set the "rollover" point. A value of 3600 sets the rollover point to +/-3600 //SensorFullCount[in8] = 3600;

//Specify the number of degrees for the robot to turn (1 degree = 10, or 900 = 90 degrees) int degrees10 = deg*10;
62

//Specify the amount of acceptable error in the turn int error = 5;

//While the absolute value of the gyro is less than the desired rotation - 100... while(abs(SensorValue[in2]) < degrees10 - 100) { motor[motder] = -90; // Que se mueva a una velocidad mxima motor[motizq] = 90; } //Brief brake to eliminate some drift motor[motder] = 20; motor[motizq] = -20; wait1Msec(100); // Que se mueva a una velocidad menor // Que se mueva a una velocidad menor // Que se mueva a una velocidad mxima

//Second while loop to move the robot more slowly to its goal, also setting up a range //for the amount of acceptable error in the system while(abs(SensorValue[in2]) > degrees10 + error || abs(SensorValue[in2]) < degrees10 - error) { if(abs(SensorValue[in2]) > degrees10) { motor[motder] = 60; motor[motizq] = -60; } else
63

// Que se mueva a una velocidad media // Que se mueva a una velocidad media

{ motor[motder] = -60; motor[motizq] = 60; } } //Stop motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); } task main() { subebrazo(1600); avanza(34); wait1Msec(500); bandain(900); wait1Msec(500); bajabrazo(1550); avanza(9); bandain(1200); subebrazo(2440); vueltader(70); avanza(12); bandaout(2000); vueltaizq(70); // Eleva brazo (altura pelota) // Mande la velocodad a 0 // Mande la velocodad a 0 // Que se mueva a una velocidad media // Que se mueva a una velocidad media

// Avansa hacia adelante 34 cm // Espera 1/2 segundo // Activa banda hacia adentro // Espera 1/2 segundo // Inclina brazo (altura barril)

// Avansa hacia adelante 9 cm // Activa banda hacia adentro // Eleva brazo (altura canasta)

// Gira 70 grados hacia la derecha // Avansa hacia adelante 12 cm // Deposita pelota y barril en canasta // Gira 70 grados hacia la izquierda
64

retrocede(60); avanza(15); vueltaizq(45); bajabrazo(1900); avanza(32); bandain(900); wait1Msec(500); bajabrazo(1550); avanza(9); bandain(1200); subebrazo(2440); avanza(18); vueltader(45); avanza(47); bandaout(2000); }

// Retrocede 60 cm // Avansa hacia adelante 15 cm // Gira 45 grados hacia la izquierda // Inclina brazo (altura seguda pelota) // Avansa hacia adelante 32 cm // Activa banda hacia adentro // Espera 1/2 segundo // Inclina brazo (altura segundo barril)

// Avansa hacia adelante 9 cm // Activa banda hacia adentro // Eleva brazo (altura segunda canasta)

// Avansa hacia adelante 18 cm // Gira 45 grados hacia la derecha // Avansa hacia adelante 47 cm // Deposita pelota y barril en canasta

Komodo 2 Programa autnomo equipo azul #pragma config(Sensor, in1, giro, sensorGyro) sensorTouch) sensorTouch) sensorQuadEncoder) sensorQuadEncoder) sensorQuadEncoder)
65

#pragma config(Sensor, dgtl1, limit, #pragma config(Sensor, dgtl2, bumper2, #pragma config(Sensor, dgtl3, rightEncoder, #pragma config(Sensor, dgtl5, leftEncoder,

#pragma config(Sensor, dgtl7, posicionEncoder,

#pragma config(Motor, port1, #pragma config(Motor, port2, reversed) #pragma config(Motor, port3, #pragma config(Motor, port4, reversed) #pragma config(Motor, port5, reversed) #pragma config(Motor, port6, reversed) #pragma config(Motor, port7, #pragma config(Motor, port8, reversed)

motizq,

tmotorNormal, openLoop) tmotorNormal, openLoop,

motder,

angulo,

tmotorNormal, openLoop) tmotorNormal, openLoop,

angulo2,

elevacion,

tmotorNormal, openLoop,

elevacion2,

tmotorNormal, openLoop,

pelotasizq,

tmotorNormal, openLoop) tmotorNormal, openLoop,

pelotasder,

//*!!Code automatically generated by 'ROBOTC' configuration wizard

!!*//

void avanza(int distancia, int velocidad)//Funcion Denominada "Avanza" en la cual solo //se inserta la distancia a recorrer en centimetros y en que velocidad lo hara { int enc=0;//se declara la variable "enc" y se resetea int pulsos=0;//se declara la variable "pulsos" y se resetea SensorValue[rightEncoder]=0; //se limpia el encoder derecho SensorValue[leftEncoder]=0;//se limpia el encoder izquierdo

while(pulsos < distancia) la distancia deseada {

// se crea un loop hasta que el robot haya viajado

66

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder //derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = velocidad; en la variable antes mencionada motor[motder] = velocidad; en la variable antes mencionada } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder //derecho es mayor al izquierdo { // gira ligeramente a la izquierda motor[motizq] = velocidad-20; indicada en la //variable antes mencionada y se le resta 20 motor[motder] = velocidad-10; indicada en la //variable antes mencionada y se le resta 10 } else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) valor del encoder //derecho es menor al izquiero { // gira ligeramente a la derecha // Si el // Que se mueva a la velocidad // Que se mueva a la velocidad // Que se mueva a la velocidad indicada

// Que se mueva a la velocidad indicada

67

motor[motizq] = velocidad-10; indicada en la variable //antes mencionada y se le resta 10 motor[motder] = velocidad-20; indicada en la variable //antes mencionada y se le resta 20 }

// Que se mueva a la velocidad

// Que se mueva a la velocidad

else {

// Si es ninguna de las anteriores

// se detiene motor[motizq] = 0; motor[motder] = 0; } enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2;// se le asigna a la variable "enc" //la suma de los valores de los encoders dividida entre 2 pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido a que 300 pulsos //recorren una distancia de 25 cm } motor[motizq] = 0; del loop motor[motder] = 0; loop } void retrocede(int distancia)//Funcion Denominada "retrocede" en la cual solo se inserta la distancia a retroceder
68

// se detiene // se detiene

// se detiene si se encuentra fuera de las condiciones

// se detiene si se encuentra fuera de las condiciones del

{ int enc=0;//se declara la variable "enc" y se resetea int pulsos=0;//se declara la variable "pulsos" y se resetea SensorValue[rightEncoder]=0;//se limpia el encoder derecho SensorValue[leftEncoder]=0;//se limpia el encoder izquierdo

while(pulsos < distancia) la distancia deseada {

// se crea un loop hasta que el robot haya viajado

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = -115; motor[motder] = -90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // gira ligeramente a la izquierda motor[motizq] = -70; motor[motder] = -80; } else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) valor del encoder derecho es menor al izquiero { // gira ligeramente a la derecha
69

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

// Que se mueva a una velocidad media // Que se mueva a una velocidad mxima

//

Si

el

motor[motizq] = -80; motor[motder] = -70; }

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

else {

// Si es ninguna de las anteriores

// se detiene motor[motizq] = 0; motor[motder] = 0; } enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2;// se le asigna a la variable "enc" //la suma de los valores de los encoders dividida entre 2 pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido //a que 300 pulsos recorren una distancia de 25 cm } motor[motizq] = 0; del loop motor[motder] = 0; loop // se detiene si se encuentra fuera de las condiciones // se detiene // se detiene

// se detiene si se encuentra fuera de las condiciones del

} void vueltaizq(int degree)//Funcion Denominada "vueltaizq" en la cual solo se inserta //los grados a girar {
70

SensorType[in1] = sensorNone;//limpia completamente la entrada analogica 1 antes //de que lea algun sensor indicando que no hay sensor wait1Msec(200);//mantiene una espera de 200 milisegundos

SensorType[in1] = sensorGyro;//reconfigura la entrada analogica 1 declarando que //hay un sensor de giro "giroscopio" wait1Msec(500);//mantiene una espera de 500 milisegundos

int degrees10 = degree*10;//Especifica el numero de grados para que el robot gire int error = 5;//especifica la cantidad de error aceptable en el giro //Mientras el valor absoluto del giro es menor que la rotacion deseada le restara 100... while(abs(SensorValue[in1]) < degrees10 - 100) { motor[motder] = 80; motor[motizq] = -80; } //breve ruptura para eliminar algun desvio motor[motder] = -15; motor[motizq] = 15; wait1Msec(100);

//un segundo ciclo, que sirve para mover el robot ms lentamente a su fin,

71

while(abs(SensorValue[in1]) > degrees10 + error || abs(SensorValue[in1]) < degrees10 - error) { if(abs(SensorValue[in1]) > degrees10) { motor[motder] = -60; motor[motizq] = 60; } else { motor[motder] = 60; motor[motizq] = -60; } } //se detiene motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); }

void vueltader(int degree)//Funcion Denominada "vueltaizq" en la cual solo se inserta //los grados a girar { SensorType[in1] = sensorNone;//limpia completamente la entrada analogica 1 antes

72

//de que lea algun sensor indicando que no hay sensor wait1Msec(200);//mantiene una espera de 200 milisegundos

SensorType[in1] = sensorGyro;//reconfigura la entrada analogica 1 declarando que hay //un sensor de giro "giroscopio" wait1Msec(500);//mantiene una espera de 500 milisegundos int degrees10 = degree*10;//Especifica el numero de grados para que el robot gire

int error = 5;//especifica la cantidad de error aceptable en el giro

//Mientras el valor absoluto del giro es menor que la rotacion deseada le restara 100... while(abs(SensorValue[in1]) < degrees10 - 100) { motor[motder] = -90; motor[motizq] = 90; } //breve ruptura para eliminar algun desvio motor[motder] = 15; motor[motizq] = -15; wait1Msec(100);

//un segundo ciclo, que sirve para mover el robot ms lentamente a su fin, while(abs(SensorValue[in1]) > degrees10 + error || abs(SensorValue[in1]) < degrees10 - error)
73

{ if(abs(SensorValue[in1]) > degrees10) { motor[motder] = 60; motor[motizq] = -60; } else { motor[motder] = -60; motor[motizq] = 60; } } //se detiene motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); } void avanza1(int tiempo)//declara una funcion denominada "avanza1" en la cual solo se introduce //el tiempo que avanzara { ClearTimer(T1);//limpia el contador "T1" while(time1[T1] < tiempo)//mientras el valor del contador sea menor al tiempo especificado { motor[motizq] = 127; // Que se mueva a una velocidad mxima
74

motor[motder] = 127; } motor[motizq] = 0; motor[motder] = 0; }

// Que se mueva a una velocidad mxima

// Que se detenga // Que se detenga

void para(int tiempo)//declara una funcion denominada "para" en la cual solo se introduce el tiempo //que se detendra { ClearTimer(T1); //limpia el contador "T1"

while(time1[T1] < tiempo) //mientras el valor del contador sea menor al tiempo especificado { motor[motizq] = 0; motor[motder] = 0; } motor[motizq] = 0; motor[motder] = 0; motor[angulo] = 0; motor[angulo2] = 0; } void posiciona(int distancia)//declara una funcion denominada "posiciona" en la cual solo se introduce la //distancia que recorrera el brazo // Que se detenga // Que se detenga // Que se detenga // Que se detenga // Que se detenga // Que se detenga

75

{ int enc=0; int pulsos=0; //declara la variable "enc" y la limpia //declara la variable "pulsos" y la limpia

SensorValue[posicionEncoder]=0;//limpia el encoder

while(pulsos < distancia) la distancia deseada { motor[angulo] = 127; motor[angulo2] = 127;

// se crea un loop hasta que el brazo haya viajado

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

enc=(abs(SensorValue[posicionEncoder]));// a la variable "enc" le asigna el valor absoluto //del encoder mencionado pulsos=(25*enc)/300; //"enc" se multiplica por 25 y se divide entre 300 esto debido a que //300 pulsos recorren una distancia de 25 cm } motor[angulo] = 0; motor[angulo2] = 0; } void eleva()//declara una funcion denominada "posiciona" { while(SensorValue(limit)==0)//mientras el valor del sensor "limit" sea cero... { motor[elevacion] = 127; // Que se mueva a una velocidad mxima // Que se detenga // Que se detenga

76

motor[elevacion2] = 127; } motor[elevacion] = 0; motor[elevacion2] = 0; }

// Que se mueva a una velocidad mxima

// Que se detenga // Que se detenga

void baja(int tiempo2)//declara una funcion denominada "baja" en la cual se introduce el tiempo que bajara { ClearTimer(T1);//limpia el contador "T1" while(time1[T1] < tiempo2)//mientras el valor del contador sea menor al tiempo especificado { motor[elevacion] = -127; mxima contraria // Que se mueva a una velocidad

motor[elevacion2] = -127; // Que se mueva a una velocidad mxima contraria } motor[elevacion] = 0; motor[elevacion2] = 0; } void encesta(int veces)//declara una funcion denominada "encesta" en la cual se introduce el numero //de veces que se moveran las bandas { int i=1;//declara la variable "i" asignandole un valor de 1 while(i<=veces)//mientras la variable "i" sea menor al numero de veces indicadas {
77

// Que se detenga // Que se detenga

ClearTimer(T1);//limpia el contador "T1" while(time1[T1] < 900)//mientras el valor del contador sea menor al tiempo especificado {

motor[pelotasizq] = 100; mxima motor[pelotasder] = 100; mxima } motor[pelotasizq] = 0; motor[pelotasder] = 0; i=i+1; wait1Msec(300); } motor[pelotasizq] = 0; motor[pelotasder] = 0; }

// Que se mueva a una velocidad

// Que se mueva a una velocidad

// Que se detenga // Que se detenga

// incrementa la variable "i" en uno // permanece en espera 300milisegundos

// Que se detenga // Que se detenga

void posicionatras(int distancia)//declara una funcion denominada "posicionatras" en la cual //se introduce la distancia que recorrera el brazo { int enc=0; //declara la variable "enc" y la limpia

int pulsos=0; //declara la variable "pulsos" y la limpia SensorValue[posicionEncoder]=0;//limpia el encoder

78

while(pulsos < distancia) la distancia deseada { motor[angulo] = -50; contraria motor[angulo2] = -50;

// se crea un loop hasta que el brazo haya viajado

// Que se mueva a la velocidad indicada

// Que se mueva a la velocidad indicada contraria

enc=(abs(SensorValue[posicionEncoder]));// a la variable "enc" le asigna el valor absoluto //del encoder mencionado pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido a que //300 pulsos recorren una distancia de 25 cm } motor[angulo] = 0; motor[angulo2] = 0; } task main()//se realiza la tarea principal del robot { posiciona (9);//se posiciona el brazo a una distancia de 9 cm avanza(80, 110);//avanza 80cm a una velocidad de 110 vueltader(90); //gira a la derecha 90 grados avanza(85, 120);//avanza 85cm a una velocidad de 120 para(300);//para durante 300 milisegundos retrocede(28);//retrocede 28 cm vueltaizq(90);//gira a la izquierda 90 grados para(200);//para durante 200 milisegundos eleva();// se eleva el brazo al maximo
79

// Que se detenga // Que se detenga

avanza1(2500);//avanza durante 2500 milisegundos (2.5 segundos) posiciona(17); //se posiciona el brazo a una distancia de 17 cm encesta(7); //realiza el movimiento de enceste durante 7 veces posicionatras(9); //el brazo se posiciona hacia atras 9 cm retrocede(25);// retrocede 25 cm vueltader(90);//gira a la derecha 90 grados retrocede(90);//retrocede 90 cm vueltaizq(85);//gira a la izquierda 85 cm retrocede(75);// retrocede 75 cm wait1Msec(10000);//se espera 10 segundos baja(2300);// baja el brazo durante 2.3 segundos posicionatras(6);// se posiciona atras 6 cm avanza(80, 90);//avanza 80 cm a una velocidad de 90 vueltader(90);// gira a la derecha 90 grados avanza(70, 90);// avanza 70 cm a una velocidad de 90 para(300);// se detiene 300 milisegundos vueltaizq(90);//gira a la izquierda 90 grados para(200);//se detiene durante 200 milisegundos avanza1(2000);//avanza durante 2 segundos posiciona(6); //el brazo se posiciona a una distancia de 6 cm eleva();//el brazo se eleva al maximo posiciona(9); //el brazo se posiciona a una distancia de 9 cm encesta(7);//realiza el movimiento de enceste 7 veces posicionatras(8);//se posiciona atras 8cm }
80

Programa autnomo equipo rojo #pragma config(Sensor, in1, giro, sensorGyro) sensorTouch) sensorTouch) sensorQuadEncoder) sensorQuadEncoder) sensorQuadEncoder) tmotorNormal, openLoop) tmotorNormal, openLoop,

#pragma config(Sensor, dgtl1, limit, #pragma config(Sensor, dgtl2, bumper2, #pragma config(Sensor, dgtl3, rightEncoder, #pragma config(Sensor, dgtl5, leftEncoder,

#pragma config(Sensor, dgtl7, posicionEncoder, #pragma config(Motor, port1, #pragma config(Motor, port2, reversed) #pragma config(Motor, port3, #pragma config(Motor, port4, reversed) #pragma config(Motor, port5, reversed) #pragma config(Motor, port6, reversed) #pragma config(Motor, port7, #pragma config(Motor, port8, reversed) motizq,

motder,

angulo,

tmotorNormal, openLoop) tmotorNormal, openLoop,

angulo2,

elevacion,

tmotorNormal, openLoop,

elevacion2,

tmotorNormal, openLoop,

pelotasizq,

tmotorNormal, openLoop) tmotorNormal, openLoop,

pelotasder,

//*!!Code automatically generated by 'ROBOTC' configuration wizard

!!*//

void avanza(int distancia, int velocidad)//Funcion Denominada "Avanza" en la cual solo //se inserta la distancia a recorrer en centimetros y en que velocidad lo hara { int enc=0;//se declara la variable "enc" y se resetea

81

int pulsos=0;//se declara la variable "pulsos" y se resetea SensorValue[rightEncoder]=0; //se limpia el encoder derecho SensorValue[leftEncoder]=0;//se limpia el encoder izquierdo

while(pulsos < distancia) la distancia deseada {

// se crea un loop hasta que el robot haya viajado

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder //derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = velocidad; en la variable antes mencionada motor[motder] = velocidad; en la variable antes mencionada } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder //derecho es mayor al izquiero { // gira ligeramente a la izquierda motor[motizq] = velocidad-20; indicada en la //variable antes mencionada y se le resta 20 motor[motder] = velocidad-10; indicada en la //variable antes mencionada y se le resta 10
82

// Que se mueva a la velocidad indicada

// Que se mueva a la velocidad indicada

// Que se mueva a la velocidad

// Que se mueva a la velocidad

} else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) valor del encoder //derecho es menor al izquiero { // gira ligeramente a la derecha motor[motizq] = velocidad-10; indicada en la variable //antes mencionada y se le resta 10 motor[motder] = velocidad-20; indicada en la variable //antes mencionada y se le resta 20 } else { // se detiene motor[motizq] = 0; motor[motder] = 0; } enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2;// se le asigna a la variable "enc" //la suma de los valores de los encoders dividida entre 2 pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido a que 300 pulsos //recorren una distancia de 25 cm } // se detiene // se detiene // Si es ninguna de las anteriores // Que se mueva a la velocidad // Que se mueva a la velocidad // Si el

83

motor[motizq] = 0; del loop motor[motder] = 0; loop }

// se detiene si se encuentra fuera de las condiciones

// se detiene si se encuentra fuera de las condiciones del

void retrocede(int distancia)//Funcion Denominada "retrocede" en la cual solo se inserta la distancia a retroceder { int enc=0;//se declara la variable "enc" y se resetea int pulsos=0;//se declara la variable "pulsos" y se resetea SensorValue[rightEncoder]=0;//se limpia el encoder derecho SensorValue[leftEncoder]=0;//se limpia el encoder izquierdo

while(pulsos < distancia) la distancia deseada {

// se crea un loop hasta que el robot haya viajado

if(SensorValue[rightEncoder] == SensorValue[leftEncoder]) // Si el valor del encoder derecho es igual al del izquiero { // avanza hacia adelante motor[motizq] = -115; motor[motder] = -90; } else if(SensorValue[rightEncoder] > SensorValue[leftEncoder]) // Si el valor del encoder derecho es mayor al izquiero { // gira ligeramente a la izquierda // Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

84

motor[motizq] = -70; motor[motder] = -80; }

// Que se mueva a una velocidad media // Que se mueva a una velocidad mxima

else if (SensorValue[rightEncoder] < SensorValue[leftEncoder]) valor del encoder derecho es menor al izquiero { // gira ligeramente a la derecha motor[motizq] = -80; motor[motder] = -70; } else { // se detiene motor[motizq] = 0; motor[motder] = 0; } // se detiene // se detiene // Si es ninguna de las anteriores

//

Si

el

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad media

enc=(abs(SensorValue[rightEncoder])+abs(SensorValue[leftEncoder]))/2;// se le asigna a la variable "enc" //la suma de los valores de los encoders dividida entre 2 pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido //a que 300 pulsos recorren una distancia de 25 cm } motor[motizq] = 0; del loop motor[motder] = 0; loop // se detiene si se encuentra fuera de las condiciones

// se detiene si se encuentra fuera de las condiciones del

85

} void vueltaizq(int degree)//Funcion Denominada "vueltaizq" en la cual solo se inserta //los grados a girar { SensorType[in1] = sensorNone;//limpia completamente la entrada analogica 1 antes //de que lea algun sensor indicando que no hay sensor wait1Msec(200);//mantiene una espera de 200 milisegundos

SensorType[in1] = sensorGyro;//reconfigura la entrada analogica 1 declarando que //hay un sensor de giro "giroscopio" wait1Msec(500);//mantiene una espera de 500 milisegundos

int degrees10 = degree*10;//Especifica el numero de grados para que el robot gire int error = 5;//especifica la cantidad de error aceptable en el giro //Mientras el valor absoluto del giro es menor que la rotacion deseada le restara 100... while(abs(SensorValue[in1]) < degrees10 - 100) { motor[motder] = 80; motor[motizq] = -80; } //breve ruptura para eliminar algun desvio motor[motder] = -15;
86

motor[motizq] = 15; wait1Msec(100);

//un segundo ciclo, que sirve para mover el robot ms lentamente a su fin,

while(abs(SensorValue[in1]) > degrees10 + error || abs(SensorValue[in1]) < degrees10 - error) { if(abs(SensorValue[in1]) > degrees10) { motor[motder] = -60; motor[motizq] = 60; } else { motor[motder] = 60; motor[motizq] = -60; } } //se detiene motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); }

87

void vueltader(int degree)//Funcion Denominada "vueltaizq" en la cual solo se inserta //los grados a girar { SensorType[in1] = sensorNone;//limpia completamente la entrada analogica 1 antes //de que lea algun sensor indicando que no hay sensor wait1Msec(200);//mantiene una espera de 200 milisegundos

SensorType[in1] = sensorGyro;//reconfigura la entrada analogica 1 declarando que hay //un sensor de giro "giroscopio" wait1Msec(500);//mantiene una espera de 500 milisegundos

int degrees10 = degree*10;//Especifica el numero de grados para que el robot gire

int error = 5;//especifica la cantidad de error aceptable en el giro

//Mientras el valor absoluto del giro es menor que la rotacion deseada le restara 100... while(abs(SensorValue[in1]) < degrees10 - 100) { motor[motder] = -90; motor[motizq] = 90; } //breve ruptura para eliminar algun desvio
88

motor[motder] = 15; motor[motizq] = -15; wait1Msec(100);

//un segundo ciclo, que sirve para mover el robot ms lentamente a su fin, while(abs(SensorValue[in1]) > degrees10 + error || abs(SensorValue[in1]) < degrees10 - error) { if(abs(SensorValue[in1]) > degrees10) { motor[motder] = 60; motor[motizq] = -60; } else { motor[motder] = -60; motor[motizq] = 60; } } //se detiene motor[motder] = 0; motor[motizq] = 0; wait1Msec(250); }

89

void avanza1(int tiempo)//declara una funcion denominada "avanza1" en la cual solo se introduce //el tiempo que avanzara { ClearTimer(T1);//limpia el contador "T1" while(time1[T1] < tiempo)//mientras el valor del contador sea menor al tiempo especificado { motor[motizq] = 127; motor[motder] = 127; } motor[motizq] = 0; motor[motder] = 0; } void para(int tiempo)//declara una funcion denominada "para" en la cual solo se introduce el tiempo //que se detendra { ClearTimer(T1); //limpia el contador "T1" // Que se detenga // Que se detenga // Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

while(time1[T1] < tiempo) //mientras el valor del contador sea menor al tiempo especificado { motor[motizq] = 0; motor[motder] = 0; } motor[motizq] = 0; // Que se detenga
90

// Que se detenga // Que se detenga

motor[motder] = 0; motor[angulo] = 0; motor[angulo2] = 0; }

// Que se detenga // Que se detenga // Que se detenga

void posiciona(int distancia)//declara una funcion denominada "posiciona" en la cual solo se introduce la //distancia que recorrera el brazo { int enc=0; int pulsos=0; //declara la variable "enc" y la limpia //declara la variable "pulsos" y la limpia

SensorValue[posicionEncoder]=0;//limpia el encoder

while(pulsos < distancia) la distancia deseada { motor[angulo] = 127; motor[angulo2] = 127;

// se crea un loop hasta que el brazo haya viajado

// Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

enc=(abs(SensorValue[posicionEncoder]));// a la variable "enc" le asigna el valor absoluto //del encoder mencionado pulsos=(25*enc)/300; //"enc" se multiplica por 25 y se divide entre 300 esto debido a que //300 pulsos recorren una distancia de 25 cm } motor[angulo] = 0; motor[angulo2] = 0; // Que se detenga // Que se detenga
91

} void eleva()//declara una funcion denominada "posiciona" { while(SensorValue(limit)==0)//mientras el valor del sensor "limit" sea cero... { motor[elevacion] = 127; motor[elevacion2] = 127; } motor[elevacion] = 0; motor[elevacion2] = 0; } void baja(int tiempo2)//declara una funcion denominada "baja" en la cual se introduce el tiempo que bajara { ClearTimer(T1);//limpia el contador "T1" while(time1[T1] < tiempo2)//mientras el valor del contador sea menor al tiempo especificado { motor[elevacion] = -127; mxima contraria // Que se mueva a una velocidad // Que se detenga // Que se detenga // Que se mueva a una velocidad mxima // Que se mueva a una velocidad mxima

motor[elevacion2] = -127; // Que se mueva a una velocidad mxima contraria } motor[elevacion] = 0; motor[elevacion2] = 0; } // Que se detenga // Que se detenga

92

void encesta(int veces)//declara una funcion denominada "encesta" en la cual se introduce el numero //de veces que se moveran las bandas { int i=1;//declara la variable "i" asignandole un valor de 1 while(i<=veces)//mientras la variable "i" sea menor al numero de veces indicadas { ClearTimer(T1);//limpia el contador "T1"

while(time1[T1] < 900)//mientras el valor del contador sea menor al tiempo especificado { motor[pelotasizq] = 100; mxima motor[pelotasder] = 100; mxima } motor[pelotasizq] = 0; motor[pelotasder] = 0; i=i+1; wait1Msec(300); } motor[pelotasizq] = 0; motor[pelotasder] = 0; } // Que se detenga // Que se detenga // Que se detenga // Que se detenga // Que se mueva a una velocidad

// Que se mueva a una velocidad

// incrementa la variable "i" en uno // permanece en espera 300milisegundos

93

void posicionatras(int distancia)//declara una funcion denominada "posicionatras" en la cual //se introduce la distancia que recorrera el brazo { int enc=0; //declara la variable "enc" y la limpia

int pulsos=0; //declara la variable "pulsos" y la limpia SensorValue[posicionEncoder]=0;//limpia el encoder

while(pulsos < distancia) la distancia deseada { motor[angulo] = -50; contraria motor[angulo2] = -50;

// se crea un loop hasta que el brazo haya viajado

// Que se mueva a la velocidad indicada

// Que se mueva a la velocidad indicada contraria

enc=(abs(SensorValue[posicionEncoder]));// a la variable "enc" le asigna el valor absoluto //del encoder mencionado pulsos=(25*enc)/300;//"enc" se multiplica por 25 y se divide entre 300 esto debido a que //300 pulsos recorren una distancia de 25 cm } motor[angulo] = 0; motor[angulo2] = 0; } // Que se detenga // Que se detenga

94

task main()//se realiza la tarea principal del robot { posiciona (9);//se posiciona el brazo a una distancia de 9 cm avanza(80, 110);//avanza 80cm a una velocidad de 110 vueltaizq(90); //gira a la izquierda 90 grados avanza(85, 120);//avanza 85cm a una velocidad de 120 para(300);//para durante 300 milisegundos retrocede(28);//retrocede 28 cm vueltader(90);//gira a la derecha 90 grados para(200);//para durante 200 milisegundos eleva();// se eleva el brazo al maximo avanza1(2500);//avanza durante 2500 milisegundos (2.5 segundos) posiciona(17); //se posiciona el brazo a una distancia de 17 cm encesta(7); //realiza el movimiento de enceste durante 7 veces posicionatras(9); //el brazo se posiciona hacia atras 9 cm retrocede(25);// retrocede 25 cm vueltaizq(90);//gira a la izquierda 90 grados retrocede(90);//retrocede 90 cm vueltader(85);//gira a la derecha 85 cm retrocede(75);// retrocede 75 cm wait1Msec(10000);//se espera 10 segundos baja(2300);// baja el brazo durante 2.3 segundos posicionatras(6);// se posiciona atras 6 cm avanza(80, 90);//avanza 80 cm a una velocidad de 90 vueltaizq(90);// gira a la izquierda 90 grados
95

avanza(70, 90);// avanza 70 cm a una velocidad de 90 para(300);// se detiene 300 milisegundos vueltader(90);//gira a la derecha 90 grados para(200);//se detiene durante 200 milisegundos avanza1(2000);//avanza durante 2 segundos posiciona(6); //el brazo se posiciona a una distancia de 6 cm eleva();//el brazo se eleva al maximo posiciona(9); //el brazo se posiciona a una distancia de 9 cm encesta(7);//realiza el movimiento de enceste 7 veces posicionatras(8);//se posiciona atras 8cm }

96

Conclusiones
Se desarroll un trabajo eficiente al delegar las tareas entre los integrantes, adems se dio lugar a una comunicacin constante como resultado del trabajo en equipo qu, permiti la participacin de todo el grupo en la solucin de problemas complejos. El autoaprendizaje fue una actividad clave para culminar con este proyecto.

97