Proyecto Final

21
Universidad Nacional de Colombia. Resumen En el presente informe se relaciona una primera aproximación a la plataforma LEGO Mindstorms- NXT mediante práctica de laboratorio, ésta se llevó a cabo en dos sesiones; una primera para el reconocimiento de la arquitectura del hardware, caracterización de sensores y un segunda en la cual se implementaron códigos para el control del servomotor y aplicación del sensor de tacto. Palabras Claves LEGO Mindstorms, Hardware, Software, Servomotor, Sensor. Abstract In this report a first approximation to the platform Mindstorms- LEGO NXT is related by lab, it was held in two sessions; a first to recognize the hardware architecture, characterization and second sensors in which certain codes implemented control functions and application servomotor touch sensor. Key Words LEGO Mindstorms, Hardware, Software, Servomotor, Sensor. I. OBJETIVOS. A. Objetivo General: Utilizar las herramientas básicas necesarias para la implementación de algoritmos de control en la plataforma de LEGO Mindstorms NXT utilizando el lenguaje de programación NXC mediante el entorno Bricx Command Center. B. Objetivos Específicos. Identificar los componentes básicos como sensores, actuadores y unidades de procesamiento del LEGO Mindstorm. Examinar y explorar algunas de las características de los sensores, actuadores y la estructura interna del Brick. Reconocer y estudiar la estructura básica del lenguaje de programación NXC, así como las herramientas de programación presentes en el software bricxCC. II. INTRODUCCIÓN. El control automático ha venido desarrollándose e implementándose cada vez con más detalle dentro de los diferentes campos industriales del país, existen diversos procesos que se efectúan Introducción a la Plataforma LEGO Mindstorms. Práctica 1- Grupo 5-2,

description

xvcvcbcvbvbvnbn nbnmbn bnmbnmbnm

Transcript of Proyecto Final

Page 1: Proyecto Final

Universidad Nacional de Colombia.

Resumen — En el presente informe se relaciona una primera aproximación a la plataforma LEGO Mindstorms- NXT mediante práctica de laboratorio, ésta se llevó a cabo en dos sesiones; una primera para el reconocimiento de la arquitectura del hardware, caracterización de sensores y un segunda en la cual se implementaron códigos para el control del servomotor y aplicación del sensor de tacto.

Palabras Claves — LEGO Mindstorms, Hardware, Software, Servomotor, Sensor.

Abstract — In this report a first approximation to the platform Mindstorms- LEGO NXT is related by lab, it was held in two sessions; a first to recognize the hardware architecture, characterization and second sensors in which certain codes implemented control functions and application servomotor touch sensor.

Key Words — LEGO Mindstorms, Hardware, Software, Servomotor, Sensor.

I. OBJETIVOS.

A. Objetivo General:

Utilizar las herramientas básicas necesarias para la implementación de algoritmos de control en la plataforma de LEGO Mindstorms NXT utilizando el lenguaje de programación NXC mediante el entorno Bricx Command Center.

B. Objetivos Específicos.

Identificar los componentes básicos como sensores, actuadores y unidades de procesamiento del LEGO Mindstorm.

Examinar y explorar algunas de las características de los sensores, actuadores y la estructura interna del Brick.

Reconocer y estudiar la estructura básica del lenguaje de programación NXC, así como las herramientas de programación presentes en el software bricxCC.

II. INTRODUCCIÓN.

El control automático ha venido desarrollándose e implementándose cada vez con más detalle dentro de los diferentes campos industriales del país, existen diversos procesos que se efectúan de manera eficaz y eficiente si se llevan a cabo con algún método de automatización y por ende se logra más avance y optimización en las cadenas productivas.

Así, es importante desarrollar capacidades acordes con los diferentes componentes y herramientas necesarias para desarrollar dichos procesos, en nuestro caso iniciaremos el manejo de una plataforma que involucra tanto desarrollo de algoritmos como manejos de sensores y teoría de control dado al funcionamiento del Brick.

Por estas razones, en esta práctica se realiza un primer acercamiento al entorno y arquitectura de LEGO Mindstorms- NXT, en primer instancia se conoció el Hardware y los diferentes accesorios como servomotores y sensores que se pueden acoplar al Brick, se llevó a cabo la ejecución de los diferentes códigos registrados en la guía, utilizando Brick Command Center para la descarga al dispositivo.

Como parte complementaria de la práctica se realizó una segunda sesión, donde se implementó con anterioridad tres códigos con funciones específicas, dos de ellos para controlar posición y velocidad en el servomotor de acuerdo a una señal de comportamiento diente de sierra, y el otro para manejo del sensor de contacto o presión.

Introducción a la Plataforma LEGO Mindstorms.Práctica 1- Grupo 5-2, Laboratorio de Control

Felipe Patiño Cód: 25441284 , Emir López Cód: 223513,, Jorge Luis Mora Mora Cod:25441442Departamento de Ingeniería Eléctrica y Electrónica

Page 2: Proyecto Final

Universidad Nacional de Colombia.

III. GENERALIDADES HARDWARE.

Es necesario profundizar en aspectos de funcionamiento acerca de la plataforma LEGO Mindstorms y revisar con detenimiento los accesorios que la conforman, para así poder llevar a cabo prácticas de laboratorio más productivas.

a. Descripción del Hardware.

Según la guía de laboratorio se tiene que LEGO Mindstorms NXT es un kit de robótica programable que incluye, además de componentes de construcción básicos de Lego, un Brick inteligente y una serie de sensores que permiten al robot realizar diferentes movimientos y operaciones [1].

Otra descripción según (Pinto, Bermúdez) se tiene que Los sistemas de Robótica: LEGO y MINDTORMS- NXT Hardware Developer Kit conforman herramientas principalmente destinadas al diseño, construcción programación y modelado de diversos prototipos robóticos móviles y articulados. Ambos sistemas, están constituidos por una serie de piezas LEGO, un dispositivo programable, un conjunto de sensores (entradas) y actuadores (salidas) compatibles, que permiten armar estructuras robóticas, tomar señales de ambiente, procesar datos y ejecutar ciertas tareas [2].

Según lo anterior se puede apreciar que está compuesto de bloques que claramente representan una plataforma diseñada según teoría de control en lazo cerrado, por tanto se puede afirmar que la parte más importante es el Brick, éste se encuentra conformado por 3 puertos de salida A,B,C que se encuentran en la parte superior izquierda, en la parte superior derecha se ubica el puerto USB de comunicación con PC, también consta de 4 puertos de entrada ubicados en la parte inferior los cuales se pueden apreciar claramente en la figura 1, el botón naranja es el encendido de la plataforma, el botón gris para retroceder o apagar el sistema y las flechas para desplazarse dentro de su entorno gráfico [1].

Figura 1: Brick- NXT

Internamente el brick conforma el cerebro de los sistemas que se vayan a implementar, por tanto como se mencionó anteriormente es la parte más funcional, es aquí donde se determinan las respectivas señales de control para modificar la dinámica, estabilizar o cambiar el comportamiento de algún prototipo que se desee construir todo según la información de realimentación que proveen los sensores [3].

El brick se conforma por las siguientes partes:

Un microprocesador principal: ARM7TDMI, de 32 Bits a 48 MHz; Memoria Flash de 256KB y RAM de 64KB.

Un microcontrolador ATMEGA48 de 8 Bits a 4MHz; Memoria Flash de 4KB y RAM de 512Bytes.

Controlador USB 1.1, Controlador Bluetooth BlueCore 4.

4 puertos de entrada para sensores, 3 puertos de salida para actuadores.

Display LCD.

Los componentes anteriores tienen sus respectivos protocolos de comunicación internos y externos, El Brick tiene el protocolo de comunicación RS485, la comunicación puede ser alámbrica e inalámbrica, la comunicación inalámbrica por medio de Bluetooth por medio de un dispositivo CSR BlueCoreTM4 v2.0 + EDR System, el cual tiene las siguientes especificaciones:

Serial Port Profile (SPP), una memoria RAM interna de 47

Kbytes. una memoria FLASH de 8Mbit Externa,

a una frecuencia de 26 MHZ. [4]

La comunicación alámbrica usando tecnología USB con una velocidad del puerto máxima de 12 Mbit/s. [4]

Page 3: Proyecto Final

Universidad Nacional de Colombia.

Como se describió anteriormente, LEGO cuenta con 7 puertos en total, 4 puertos de entrada con conexión RJ12, 1 de estos puertos es un puerto de alta velocidad, IEC 61156 tipo 4/EN 50170 compilant, en esta entrada se podrán conectar los sensores digitales y análogos. [4] Los otros 3 puertos son de salida con conexión RJ12, en donde se conectaran los actuadores, los más comunes serán motores. [5]

El Brick cuenta con un Display para la visualización de las diferentes operaciones y control del entorno, el cual tiene una resolución de 100x64 pixeles, a blanco y negro, la arrea visual es 26 X 40.6 mm. También El Lego cuenta con sonido por medio de un canal de sonido con 8 Bit de resolución, tiene una impedancia de 16 Ω, y consume potencia según la frecuencia, la frecuencia de muestreo es de 2 a 16 KHz. [4]Tiene 4 botones de interfaz con el usuario. El Brick usa 6 baterías alcalinas AA, y las baterías recargables recomendadas son de 1400 mAH. [4]

La velocidad de los puertos de comunicación de entrada y salida digitales es de 9600 bit/s. El Brick internamente puede suministrar una corriente de 700 mA y llegar hasta un pico de corriente de 1 A, en una salida de poder la máxima corriente que se puede suministrar es de 180 mA. [4].

El diagrama de bloques de la operación de los anteriores componentes se muestra en la figura 2.

Figura 2. Estructura de bloques Brick.

Actuadores

Son aquellos elementos que permiten realizar la acción que se desea ejecutar, para nuestras prácticas son los dispositivos que deseamos controlar.

Los servomotores son los principales actuadores que se deberá controlar, son dispositivos electromecánicos de corriente continua e imán permanente, El motor de la línea NXT (servomotor), que se observa en la figura 2, es más pesado (80gr) y lento (170 RPM libre) con respecto a la otra serie que maneja LEGO (RCX), lo que se debe a la incorporación de un tren reductor (Figura. 3) La caja reductora le permite al motor generar torques más grandes (50 N· cm) con un consumo mayor (60 mA libre y 2000 mA frenado). Es el más indicado para labores que impliquen más fuerza como la construcción de robots y dispositivos mecánicos móviles [3].

En las siguientes figuras se pueden apreciar en detalle el principal actuador a controlar en las prácticas.

Figura 3. Servomotor NXT.

Figura 4. Caja Reductora Servomotor NXT.

Sensores.

Son los elementos responsables de emitir la señal correspondiente para que l controlador del Brick pueda realizar realimentación y de esta manera poder aplicar teoría de lazo cerrado para llevar a cabo las funciones de los sistemas que se implementen.

Estos permiten a cualquier sistema conocer información sobre su entorno. A partir de los datos recogidos se pueden tomar decisiones correctivas para cambiar la dinámica y el comportamiento de los sistemas. Esa es la base de disciplinas como el control en lazo cerrado, la robótica y la inteligencia artificial, entre otras. [3]

Page 4: Proyecto Final

Universidad Nacional de Colombia.

Sensor de Ultrasonido.

Este sensor utiliza el principio del eco, el cual consiste en emitir una señal ultrasónica y capta las señales de retorno para poder calcular las distancias a las cuales se encuentran los objetos, su principal función es detectar las distancias y el movimiento de un objeto que se interponga en el camino del robot, mediante el principio de detección ultrasónica. Este sensor es capaz de detectar desde 0 a 255 cms, con una precisión relativa del ±3 cms [3] se puede apreciar en la figura 5:

Figura 5. Sensor Ultrasónico para medir distancias.

Algunos comandos importantes para la programación de este sensor son:

int continuous(): //Pone el sensor de ultrasonidos en funcionamiento continuo.int off ():// Detiene el funcionamiento continuo. int getDistance():// Calcula y devuelve la distancia en centímetros hasta el objeto más cercano. El valor máximo es de 255 cm. int getDistances(int[] dist): //Devuelve un array con las últimas 8 distancias calculadas. [6]

Sensor de Rotación.

Figura 6.Sensor Giroscopio.

El sensor de Rotación mide la velocidad de giro. Este sensor devuelve el número de grados por segundo y la dirección de rotación. Mide +/- 360° por segundo, lo que en aplicaciones de sistemas se

puede orientar el robot o dispositivo móvil de tal manera que tome determinadas direcciones controladas, El sensor utiliza el pin de entrada analógica del puerto del Brick, por lo que la lectura es un valor entre 0 y 1023 [7] La velocidad de rotación puede ser leída hasta unas 300 veces por segundo. El eje de medida está en el plano vertical con la parte oscura del sensor mirando hacia arriba. [7]

Sensor de Luz.

El sensor de luz es capaz de detectar luz u oscuridad, así como la intensidad de la luz de una habitación. También es capaz de medir la intensidad de la luz en colores (clasificación en escala de grises) [8].

Figura 7. Sensor de Luz.

Sensor de sonido.

Es capaz de medir niveles de sonido en dBs (decibelios) y dBAs (frecuencias entre 3 y 6 kHz). También es capaz de reconocer patrones de sonido e identificar diferencias de tono. Se necesita un cable de conexión, que se incluye en la caja Base 9797.

dBA: la sensibilidad del sensor se adapta a la sensibilidad del oído humano. Dicho ddBe otra forma, estos son los sonidos que nuestros oídos son capaces de oír.

dB: cuando realizamos detección son ajustar los decibelios todos los sonidos se miden con la misma sensibilidad. Con ello, estos sonidos pueden incluir algunos que bien son demasiados fuerte o débiles como para que el oído humano los pueda percibir.

El sensor de sonido NXT se puede apreciar en la figura 8, este puede medir niveles de presión de sonido de hasta 90 dB. Para evitar la complejidad

Page 5: Proyecto Final

Universidad Nacional de Colombia.

de interpretación de estos niveles de presión, las lecturas de sonido que presenta Lego MINDSTORMS se muestran en porcentajes (%). Cuanto menor sea este valor, menos intensidad tiene [1] [9]. Por ejemplo:

4-5% es como una habitación en silencio. 5-10% sería alguien hablando a cierta

distancia. 10-30% es el valor de una conversación

próxima al sensor o música a niveles "normales".

30-100% es el valor que producirán gente gritando, o música a un volumen fuerte.

Figura 8. Sensor de Sonido.

Sensor de Contacto.

Es un sensor booleano que es estimulado al ser oprimido, y es capaz de contar presiones únicas o múltiples, Dispone de un interruptor que al ser presionado envía una señal al NXT. Este sensor es útil para detectar obstáculos. SENSOR_TOUCH es el comando que reconoces el lenguaje de programación [10].

Figura 9. Sensor de Contacto.

IV. INTRODUCCIÓN AL SOFTWARE.

Ahora que es familiar el hardware con el que se va a trabajar es necesario profundizar en el lenguaje de programación que se va a utilizar para poder

controlar los diferentes actuadores según la aplicación que se requiera.

La plataforma LEGO Mindstorm NXT incluye un software de aplicación tipo gráfico que se basa en NI – Labview bastante práctica y fácil de implementar, sin embargo para nuestra práctica es necesario profundizar en los algoritmos de programación, de tal manera que se entienda como funciona realmente el dispositivo, por lo tanto es necesario manejar un entorno de programación de texto para bajar al Brick y poder llevar a cabo las respectivas funciones que queremos.

Los lenguajes que existen en el momento para aplicación NXT de LEGO son: Next Byte, Codes NBC, Not eXactly C y NXC, en las prácticas a desarrollar se trabajará con NXC en el entorno de programación BCC- Brick Comman Center.

Los códigos que se implementen en NXC constan de una tarea principal task main () la cual es la tarea que ejecutará el sistema. Dentro de esta tarea principal se pueden programar las respectivas instrucciones acordes a la función que se quiera implementar, dichas instrucciones deben ir entre los corchetes principales y cada línea de código debe terminar con punto y coma para que el compilador no tenga ningún inconveniente en aprobar el código.

Las instrucciones en forma de sentencias son las encargadas de indicarle al sistema qué debe hacer. En términos de estructura básica, son muy similares al lenguaje C pero poseen sentencias, palabras reservadas y estructuras propias de NXC que son especiales para el manejo de los actuadores y sensores.

Dado a que el lenguaje es muy parecido a C, es necesario declarar las diferentes variables con las cuales se va a trabajar, estas variables pueden ser de diferentes tipos tal como se muestra a continuación:

Int: Para datos de tipo entero de 16 bits en un rango entre -32768 y 32767.

Char: para variables de tipo carácter para valores entre -127 y 128.

Bool: Tipo booleano de 8 bits. Lógica: FALSO/VERDADERO.

Page 6: Proyecto Final

Universidad Nacional de Colombia.

Short: Valor de 16 bits con signo, parecido a los tipo Int.

Long: Valor de 32 bits con signo y cuyos valores varían de -2147483648 hasta 2147483647.

Unsigned: Para definir variables de tipo char, int, long.

Float: Valor de 32 bits con precisión de punto flotante (decimales).

String: Cadena de caracteres. Array: Arreglos. Matrices. Structures: Arreglo de variables.

Ahora conozcamos algunas de las sentencias más importantes para empezar a implementar códigos en nuestra plataforma LEGO por medio de lenguaje NXC.

Sentencias Más comunes:

OnFwd(OUT_A, 50);

Esta sentencia le indica al sistema que debe activar el motor que se encuentra conectado en el puerto A que debe avanzar en sentido positivo o hacia adelante con una potencia del 50% nominal es decir se va a mover con la mitad de la máxima velocidad que pueda dar el servomotor.

Como se mencionó anteriormente El brick posee 3 salidas disponibles para actuadores, siendo A, B y C respectivamente. El primer argumento indica que se trata de una salida, seguido del puerto al cual se desea hacer funcionar “OUT_A” , el segundo argumento la potencia con la que funciona el motor siendo 0 apagado y 100 la máxima potencia.

OnRev(OUT_A , 20);

Esta sentencia permite realizar el sentido de giro contrario del motor, es decir realiza lo contrario a la primera sentencia y sus argumentos significan lo mismo.

Existen instrucciones especiales como:

Wait(5000);

Es la sentencia que permite llevar a cabo determinada función por el tiempo deseado ya que el procesador ejecutaría cada línea de una manera muy rápida, por tanto es necesario implementar

dicha sentencia para que se noten los cambios de las diferentes instrucciones del código.

Para el caso del ejemplo el Brick esperaría o ejecutaría la línea anterior durante 5 segundos antes de continuar.

Off( OUT_A):

Esta sentencia permite apagar los actuadores conectados en el puerto de salida A o dependiendo del argumento que se le asigne.

Los comandos anteriores son los básicos para los primeros pasos en cuanto al control de los actuadores de la plataforma, también es necesario revisar las sentencias que permiten el manejo de los sensores:

Los sensores deben ser ajustados o preparados para que puedan pasar su señal censada al programa en NXC. Por tanto se utilizan las siguientes sentencias para tal fin.

SetSensorTouch(IN_1);SetSensorLight(IN_1);SetSensorUltrasonic(IN_1);

En la cual, SetSensor prepara el sensor y la siguiente palabra indica el tipo de sensor que se vaya a utilizar.

La expresión entre paréntesis ya no indica un puerto de salida como en los casos anteriores para el control del motor, sino que son puertos de entrada encesarios para recibir las señales que los sensores capturen del entorno del sistema, El argumento de esta sentencia corresponde al puerto de entrada del sensor, IN_1 representa el sensor conectado al puerto 1, IN_2 el sensor al puerto 2 y así sucesivamente.

También necesitamos sentencias que nos permitan leer la operación del código en pantalla para esto es necesario utilizar:

NumOut(10,40, rotorRotationCount(OUT_A),0);

TextOut(5,50, "Felípe Patiño");

Dichas sentencias imprimen en pantalla en la coordenada indicada dentro de la resolución la variable numérica (en este caso los grados que ha girado el motor) o el texto que necesitemos ver.

Page 7: Proyecto Final

Universidad Nacional de Colombia.

Dado a que el lenguaje de programación está muy relacionado con C++, también existen las expresiones de sentencias cíclicas para realizar determinada acción como es el caso de if, for, while, y demás estructuras que permiten realizar operaciones de manera más eficiente.

La interfaz de usuario del software BCC- Brick Command Center es muy párctica y manejable se puede apreciar en la figura 10:

Figura 10. Interfaz BCC.

Una vez escrito el código o programa que se requiera implementar es necesario compilarlo y posteriormente bajarlo al brick.

Para esto se debe configurar el tipo de plataforma que se está utilizando, en nuestro caso NXT, como sigue:

Figura 11. Configuración Brick Nxt

Figura 12: Configuración BCC

Dados los soportes suficientes respecto al hardware y software necesarios para el adecuado manejo y operación de la plataforma se presenta el procedimiento que se llevó a cabo en las prácticas de laboratorio.

V. PROCEDIMIENTO.

HARDWARE

1) Investigue y explique cómo es posible cambiar la velocidad angular de los motores LEGO usando una señal de PWM. Cuando usamos los comandos OnFwd y OnRev, que hacen estos comandos para que se cambie la dirección del motor?

Page 8: Proyecto Final

Universidad Nacional de Colombia.

Los servomotores son motores de corriente continua que incorporan un circuito electrónico, el cual permite control de forma sencilla la velocidad de giro de su eje mediante impulsos PWM señal de pulsos modulada en ancho de pulso (Pulse Width Modulation).

Por lo general dichas señales se generan con un periodo de 20 ms y permiten controlar la potencia que se está entregando al motor si los circuitos del motor reciben una señal de entre 0.5 a 1.4 ms (depende del fabricante el rango) el eje del motor se moverá en sentido horario y si recibe una señal con ancho de pulso de 1.6 a 2 ms el eje del motor gira en sentido opuesto a las manecillas del reloj, 1.5 representa un estado neutro para el motor.

Si se quiere regular la velocidad del motor hay que jugar con el ancho de pulso que reciba el servomotor, dependiendo si está girando en sentido horario o no, por ejemplo si va en adelanto se modificara el ancho de pulso entre 0.5 y 1.4 ms para regular la cantidad de potencia que se entregue.

Figura 13. Señal PWM Avance ancho de pulso 0.7ms

Figura 14: Señal PWM en Rev ancho de pulso 1.8 ms

Cuando en el programa se utilizan sentencias como OnFwd y OnRev el Brick se encarga de modular la señal generada para el control del motor y cambia el ancho de pulso en los dos rangos establecidos anteriormente, para que el motor identifique si debe ir en avance o retroceso. :

2) Cómo utiliza el Brick las señales que entrega el Encoder incremental de cada motor LEGO para leer la posición actual del mismo?, y demás explique detalladamente cómo a partir de los pulsos que entrega el Encoder es posible conocer la dirección de giro del motor?.

El enconder es un dispositivo que consta de ranuras y está ubicado en el eje del motor de tal manera que continuamente está censando posición y velocidad del mismo, en la siguiente figura se aprecia el encoder de un servomotor LEGO NXT [2].

Figura 15. Encoder Servomotor NXT.

El anterior dispositivo es capaz de generar dos señales de pulsos como referencias las cuales llegan al procesador del brick, dependiendo del desfase y el ancho de pulso de las mismas el brick interpreta un patrón de bits que le indican si va en sentido horario o anti horario. Este proceso se muestra a continuación con más detenimiento.

Figura 16. Ciclo de pulsos.

En la anterior figura se puede apreciar que se producen un ciclo periódico de bits dependiendo del desfase de las dos señales, se ve que después de la primer secuencia se repite igualmente, el brick identifica la señal dependiendo de si empieza con 10 o 01 según se regule, el identifica si el eje del motor va en sentido horario o al contrario y la velocidad dependerá netamente del periodo de las funciones detectadas [11].

De esta manera se explica como el brick utiliza las señales del encoder para saber sentido de giro, posición y velocidad del servomotor [2].

Primera Sesión:

Page 9: Proyecto Final

Universidad Nacional de Colombia.

Básicamente se desarrollaron prácticas de reconocimiento se hardware, identificar los diferentes componentes como Brick, actuadores, sensores y una primera aproximación al entorno de programación con BCC.

Una vez identificados los diferentes dispositivos se procedió a compilar los diferentes códigos que se proporcionan en la guía para el control y reconocimiento de los diferentes sensores en el brick.

Para lo anterior fue necesario conectar el Brick por medio de puerto USB al PC, conectar un servomotor a la salida A y disponer los diferentes sensores para conectar uno a la vez a la respectiva entrada que se especifique en los códigos.

A continuación se presentan los códigos comentados que se instalaron para cada sensor:

Sensor de Ultrasonido

Para probar el sensor de ultrasonido se copió el código de la guía en un nuevo proyecto y se compiló, posteriormente se empezó a modificar el código para observar la respuesta del sensor.

Sensor de Sonido.

Con este código se pretende generar una velocidad del motor a una cierta intensidad de ondas sonoras en un micrófono. Para ello se utiliza el sensor de sonido como entrada al bloque y el servomotor como salida del bloque. El umbral determina cuándo comienza a moverse el motor.

Sensor de Contacto.

El siguiente código permite cambiar el estado del motor en función de activar el sensor de contacto. Cuando se mantiene pulsado el sensor de contacto, el motor se detiene. Cuando el sensor no se mantiene presionado el motor gira con la intensidad especificada en el código, que en este caso es de 75%.

Cabe mencionar que existe una función diferente para el sensor de contacto que permite acumular pulsos del sensor, es decir, contar cuantas veces se ha pulsado el sensor, esta función se aplicará en uno de los ejercicios propuestos en este laboratorio.

Segunda Sesión.

Para la segunda sesión se diseñaron posterioridad tres códigos correspondientes al control de velocidad y posición del motor según una señal diente de sierra y el control de un sensor de contacto.

Page 10: Proyecto Final

Universidad Nacional de Colombia.

Los códigos se diseñaron y se compilaron en laboratorio para poder realizar los ajustes de funcionamiento pertinentes.

a) Diseñar e implementar dos algoritmos: uno que conduzca el movimiento en posición de un servomotor siguiendo el patrón de una señal diente de sierra; y otro que conduzca el movimiento en velocidad de un servomotor siguiendo el patrón de una señal diente de sierra.

Diseño Código de Posición:

Para simular la posición del servomotor según un patrón diente de sierra es necesario que el brick establezca la orden de que el motor avance hacia adelante a una velocidad constante y luego regresar el eje del motor a la posición inicial lo más rápido posible, para lograr esto se pondrá a avanzar el motor a una potencia baja con el comando RotateMotor() y luego se devuelve el eje con al 100% de la potencia.

Para realizar esta tarea se programa primero un bucle sin fin para que el programa corra indefinidamente, luego dentro de este se programa un bucle que por un tiempo mueva el motor con velocidad constante, esto con la opción OnRevReg, y luego de esto, regresará el motor a su posición inicial con la mayor velocidad del mismo, utilizando la opción rotatemotor pero con el argumento de velocidad negativo.

El código que se desarrolló para cumplir la especificación para control de posición con un comportamiento diente de sierra es:

El anterior código se explica a continuación:

Primero se declaran los diferentes tipos de variables que se van a utilizar para almacenamiento en memoria, estas se utilizaron de tipo long, string, int y demás.

Seguidamente se programa la tarea principal- task main()

Co los comandos TextOut y Wait se imprimen los nombres de los integrantes en pantalla durante 10 segundos luego se limpia la pantalla con ClearScreen.

Los comandos DeleteFile() y CreateFile() crean el archivo al cual se van a exportar los datos que se censen.

Después se establece un ciclo infinito while (true) donde se encuentra la totalidad del código funcional como tal.

Dentro del while se establece un for el cual se encarga de repetir el proceso 10 veces.

Page 11: Proyecto Final

Universidad Nacional de Colombia.

RotateMotor(OUT_A,10,a) se encarga de hacer girar el motor a una potencia del 10% los 360 grados que fue el valor que se le dio anteriormente a la variable a.

La línea NumOut (3+(i*20),40, MotorRotationCount(OUT_A),0); se encarga de imprimir la posición del motor, para el siguiente ciclo imprime al lado de los valores anteriores.

Las siguientes 5 líneas se encargan de escribir los datos de posición que se están censando en el archivo.txt que se creó anteriormente.

Después se utiliza RotateMotor (OUT_A,100,-a); para devolver la posición del motor al estado inicial y esto se hace al 100% de la potencia para que se produzca el cambio drástico en la diente de sierra.

Se vuelve a imprimir los datos y se los carga en el archivo.txt.

Finalmente se cierra el archivo creado con CloseFile(archivo).

Una vez cargado el código en el Brick fue necesario realizar algunas modificaciones para que todo funcione bien, ya que por no contar con el prototipo en la casa es complicado que el código funcione perfectamente en los primeros instantes de la sesión de laboratorio.

Los datos exportados al .txt se registraron en dos columnas las cuales las identificamos como el tiempo en la columna de la izquierda y la posición en ángulos en la columna derecha. Realizando la gráfica de los datos obtenidos para los diez ciclos se obtiene:

Figura 17: Posición Servomotor.

Se puede apreciar en la gráfica que la caída de pendiente en la señal diente de sierra no se puede lograr que sea completamente vertical ya que se estaba regresando a la posición inicial al 100% de la potencial lo cual tomaba un tiempo en desarrollarse.

Diseño Código de Velocidad:

Para simular la velocidad del motor con un patrón diente de sierra es necesario crear una variable incremental de tal manera que se la utilice en el comando OnFwd y la velocidad vaya aumentando desde 0 hasta su máxima potencia, y después se apaga el motor para que produzca la caída a muy alta pendiente en la señal, el código vuelve hacer el mismo proceso por un número determinado de ciclos.

El código que se implementó es el siguiente:

Page 12: Proyecto Final

Universidad Nacional de Colombia.

Lo que se realizó anteriormente fue:

Primero se declaran los diferentes tipos de variables que se van a utilizar para almacenamiento en memoria, estas se utilizaron de tipo long, string, int y demás.

Seguidamente se programa la tarea principal- task main()

Co los comandos TextOut y Wait se imprimen los nombres de los integrantes en pantalla durante 10 segundos luego se limpia la pantalla con ClearScreen.

Los comandos DeleteFile() y CreateFile() crean el archivo al cual se van a exportar los datos que se censen.

Se establece un for el cual se encarga de repetir el proceso un número determinado de veces.

Se crea otro for anidado for (vel=0; vel<=100; vel++); el cual se encarga de variar la velocidad hasta la potencia máxima.

Se pone avanzar el motor a una velocidad variable utilizando la variable incrementeal vel : OnFwd (OUT_A,0+vel);

NumOut (3+(i*20),30, MotorActualSpeed(OUT_A),0); imprime los datos de la velocidad del motor en

pantalla variando la posición para cada ciclo.

Las siguientes 5 líneas se encargan de escribir los datos en el archivo que se generó anteriormente.

Después fuera del ciclo anterior se apaga el motor para crear la pendiente de la señal diente de sierra mediante: Off (OUT_A);

Finalmente se cierra el archivo creado con CloseFile(archivo).

Como se mencionó anteriormente los datos se guardaron en un archivo.txt y a continuación se dispone la gráfica de comportamiento para la velocidad.

Figura 18: Control Velocidad Servomotor

A diferencia de la señal para el control de posición en la anterior si se puede lograr una pendiente completamente súbita ya que se puede apagar el motor para lograr las especificaciones del programa.

b. Diseño Código Sensor de Contacto.

Use un sensor de contacto y un motor LEGO. A continuación diseñe e implemente un algoritmo que ejecute las siguientes acciones en cualquier orden:

Al pulsar una vez el sensor de contacto, el motor LEGO gire a una velocidad en sentido horario.

Al pulsar dos veces, el motor LEGO gire a una velocidad pero en sentido anti-horario.

Al pulsar tres veces, el motor LEGO se detenga y siga detenido aunque se suelte el pulsador.

Page 13: Proyecto Final

Universidad Nacional de Colombia.

Al dejar presionado el sensor de contacto por algún tiempo (por ejemplo: más de tres segundos), el programa termine.

OJO: Entiéndase como pulsar a la acción de presionar y soltar el sensor de contacto.

Agregue al anterior algoritmo lo siguiente: Imprima en la pantalla del Brick el

estado actual de funcionamiento del motor LEGO, ya sea: Detenido, girando en sentido horario, o Girando en sentido anti-horario.

Imprima en la pantalla del Brick la posición actual del motor LEGO (en grados y radianes), y además imprima la cantidad de vueltas que ha dado el motor LEGO.

El código que se implementó para el manejo del sensor de contacto es el siguiente:

Primero se declaran los diferentes tipos de variables que se van a utilizar para almacenamiento en memoria, estas se utilizaron de tipo long, string, int y demás.

Seguidamente se programa la tarea principal- task main()

Con los comandos TextOut y Wait se imprimen los nombres de los integrantes en pantalla durante 10 segundos luego se limpia la pantalla con ClearScreen

Para este ejercicio se utiliza la función SENSOR_MODE_PULSE la cual permite contar la cantidad de pulsos que se hacen al sensor en un tiempo determinado.

La siguiente parte da el lapso en el cual se van a dar los pulsos, es decir, el usuario tiene un tiempo de 1000 milisegundos para dar la cantidad de pulsos que desea.

Lo siguiente da la instrucción de mostrar en pantalla la velocidad angular del motor, la cantidad de vueltas del motor en grados y radianes y por último los if dan la instrucción adecuada al servomotor dependiendo de los pulsos entregados por el usuario. Cada if va a mostrar en pantalla el estado del servomotor; sentido horario, sentido anti horario y detenido.

VI. COMENTARIOS Y OBSERVACIONES.

El uso de la modulación por ancho de pulsos nos permitió regular la velocidad de giro de los motores, mediante la modificación del ciclo útil de trabajo del pulso de entrada PWM y mediante los comandos OnFwd(OUT_A, 50) u OnRev(OUT_A , 20) que son equivalentes; nos permitieron manipular desde la programación el cambio del sentido de giro del servomotor con el ciclo útil de la señal.

Gracias a los codificadores rotatorios o encoders transforma la posición angular de un eje, directamente a un código digital mediante un encoder de cuadratura, y gracias a este mecanismo se puede obtener dos señales de pulsos digitales desfasadas, es decir la duración o frecuencia del pulso determina la posición en la que se debe situar el motor y mediante ellas es posible suministrar los datos de posición, velocidad y

Page 14: Proyecto Final

Universidad Nacional de Colombia.

dirección de rotación del eje. Hay que tener en cuenta las transiciones que pudiesen ocurrir, es conveniente abarcar las siguientes situaciones: giro horario, giro anti horario, error momentáneo es decir sin cambio, y error en cambios de fase producidos por sobre velocidad u otro factor. Un elemento imprescindible a la hora de controlar un servosistema es la realimentación de posición y velocidad. La duración o frecuencia del pulso determina la posición en la que se debe situar el motor.

El uso de los sensores del lego mindstorm resulta bastante similar entre los diferentes tipos de sensores. Se debe tener especial cuidado al definir las variables que reciben la medición del sensor, ya que algunos entregan valores booleanos, otros valores enteros, etc. Es importante resaltar también que se debe tener precaución al visualizar los valores en la pantalla del brick para algunos sensores con un rango grande, un error común observado en el laboratorio consiste en visualizar la variable sin realizar un refresco de pantalla. Esto ocaciona errores al leer la cifra medida con uno o dos valores de más en la pantalla que no corresponden con el valor real entregado por el dispositivo.

Al momento de realizar la practica con el sensor Touch. Presentó la particularidad de que cuando se presionaba el sensor 2 veces y el motor debía andar en sentido contrario el brick se apaga inmediatamente, con las observaciones del ingeniero se logró deducir que el motor se estaba quedando sin potencia, es decir la corriente que el servomotor consumía en marcha atrás, era demasiado grande para poder operar. Revisando el código teníamos la velocidad en sentido anti-horario al 100%, una vez se la bajo al 50% el código funcionó normalmente.

VII. CONCLUSIONES.

Con respecto a la señal lograda con el control de posición del motor lego, se observó que no se puede describir exactamente una señal diente de sierra perfecta ya que es imposible regresar el eje del servomotor a la posición inicial

relativa en un tiempo igual a 0, lo que si se puede lograr con el control de velocidad ya que nos permite cortar el suministro de potencia al dispositivo.

A pesar de que las herramientas con las que trabajamos no implican dispositivos de potencia grandes o a escala industrial, los procedimientos que se llevan a cabo, conforman una fuerte base para experimentar y observar el comportamiento similar al que se podría implementar en la vida práctica.

Para la implementación de los códigos se debe actuar con algo de criterio teniendo en cuenta cómo responderá la plataforma, para así evitar inconvenientes como el presentado respecto a que el brick se apagaba por que la potencia no era suficiente para regresar el motor a la velocidad máxima.

El entorno de programación y el lenguaje manejado permiten muchas facilidades al momento de implementar los códigos ya que se cuenta con muchos comandos que realizan funciones completas es el caso de: avance hacia adelante, avance hacia atas, contar el número de grados, etc.

La operación con la plataforma LEGO permiten concentrarse en la acción de controlar netamente los dispositivos ya que por su estructura, en muchas de las ocasiones, evitará la caracterización y linealización de los sensores, logrando Otorgan simplicidad, practicidad y facilidad de uso.

VIII. BIBLIOGRAFÍA.

[1] H. Suárez, Guía de Laboratorio 1: Introducción a la plataforma Lego Mindstorms, Laboratorio de Control, Universidad Nacional De Colombia, Control, 2015 - I.

[2] M L. Pinto, G, Bermúdez. Determinación de los Parámetros Para el Servomotor NXT LEGO Minstoms Con Técnicas de Identificación de Sistemas.2010.

Page 15: Proyecto Final

Universidad Nacional de Colombia.

[3] D. Herrera, Implementación y puesta en Marcha de Una Plataforma de Prácticas de Control Con Arquitectura LEGO. Tesis para optar por el título de Magister en Automatización Industrial. Universidad Nacional de Colombia, Posgrado en Automatización Industrial. Bogotá, 2010.

[4]. LEGO MINDSTORMS NXT Hardware Developer Kit pdf- consultado el 15 de febrero de 2015 disponible en: http://ebookbrowse.com/lego-mindstorms-nxt-hardware-developer-kit-pdf-d1384528.

[5]. I. Calvo, Uso conjunto de la plataforma LEGO MINDSTORMS NXT y metodologías PBL en Informática Industrial, Perianez - Consultado el 15 de Febrero del 2015 - Disponible en: www.ehu.es/ikastorratza/6_alea/lego.pdf

[6]. Manejo básico del sensor de ultrasonido. – Consultado el 16 de febrero de 2015 – disponible en:http://blog.electricbricks.com/es/2010/03/tutorial-java-lejos-lego-mindstorms-nxt-7/

[7] MS1044 Sensor Giroscópico NXT - LEGO Education - consultado el 16 de febrero de 2015 – disponible: http://www.electricbricks.com/lego-mindstorms-sensor-ms1040-sensor-aceleracion-inclinacion-nxt-lego-education-p-1082.html

[8] MS1048 Sensor de Luz NXT - LEGO Education- consultado el 17 de febrero de 2015. http://www.electricbricks.com/lego-Mindstorms-sensor-9844-sensor-luz-nxt-lego-education-p-254.html.

[9] MS1048 Sensor de Sonido NXT - LEGO Education- consultado el 21 de febrero de 2015 http://www.electricbricks.com/lego-mindstorms-sensor-9845-sensor-sonido-nxt-lego-education-p-255.html.

[10] MS1048 Sensor de Tacto NXT - LEGO Education- consultado el 21 de febrero de 2015 http://www.electricbricks.com/lego-mindstorms-sensor-9843-sensor-contacto-nxt-lego-education-p-567.html

[11]https://www.youtube.com/watch?v=zbvVrqFM2io. Consultada el 21 de febrero de 2015.