Está en la página 1de 40

Control de posición de un balancín

de un grado de libertad.
17 de Mayo de 2014
Universidad Autónoma de Baja California
Ingeniería Aeroespacial

INSTRUMENTACIÓN/AVIÓNICA

Fernanda Sánchez Hernández

Martha Fernanda Martínez Kelez

Marianela Santana Lomelí


INDICE
 Resumen, introducción……………………………………………………………..…………………….………3
 Objetivos………………………………………………………………………………………………………….……..4
 Marco teórico……………………………………………………………….………………………………….………4

- Arduino………………………………………………………………………………………………………….……..4.
- Comunicación Arduino-PC……………………………………………………………………...……………..6
- Puerto serie…………………………………………………………………………………..……………………...6
- Control de comunicación UART……………………..……………………………………………………...7
- Simulink………………………………………………………………………………………………………………...7
- PID……………………………………………………………………………………………………….…………….....8
- PWM…………………………………………………………….………………………………………………………12

 Modelado matemático………………………………………………………..…………………….……….……..13

- Movimiento de rotación de un sólido rígido………………….………………………………..……..13


- Movimiento de inercia para una masa puntual…………………….…………………………………13
- Obtención de la función de transferencia……………………………………………………………….15

 Proceso……………………………………………………………………………………….………………………….…17

- La planta……………………………………………………………………………………………………….…………………17
- Sensor potenciométrico……………………………………………………………………………………….….………17
- Interfaz física…………………………………………………………………………………………………………….…….18
- Conexión de Arduino hacia potenciómetro y tarjeta(circuito)………………………………..………..18
- ¿Cómo se armó el circuito en la tarjeta?..............................................................................19
- Comunicación serial………………………………………………………………………………………………………….20.
- Lectura Arduino…………………………………………………………………………………………………………………20
- Configuración Arduino-Matlab…………………………………………………………………………………………..21
- Configuración de los pines de la tarjeta desde Matlab……………………………………………..………..27
- Conexión Arduino – Simulink………………………………………………………………………………………….….27
- Diagrama de bloque Simulink………………………………………………………………………………….…………29

 Pruebas y resultados……………………………………………………………………………………………………..31
 Conclusión……………………………………………………………………………………………………………..…..….34
 Anexos………………………………………………………………………………………………………………….….……35
 Bibliografía………………………………………………………………………………………..…………………………...40

2
RESUMEN
En el presente reporte, se tiene como fin el dar a conocer cómo es que en una barra que presenta
un grado de libertad, se implementa un control de posición. Consiste en que hay un giro en el eje
pasando por su centro de gravedad, dicho giro es provocado por una fuerza que es producida por
una hélice la cual es movida por un motor de corriente DC. Todos estos movimientos en conjunto
logran que la barra se mueva y se lleve a cabo el objetivo deseado.

INTRODUCCIÓN
A continuación se presenta reporte de proyecto, sobre el funcionamiento del primer
funcionamiento básico de un helicóptero, también llamado el primer sistema de un grado libertad,
donde el helicóptero completo maneja hasta dos grados, dentro del mismo trabajo se ve
especificado los medios de comunicación utilizados que en este caso fueron arduino uno, junto
con matlab en simulink. Asi como sus especificaciones.

El trabajo consta de 5 etapas:

- Elaboración de maqueta
- Establecer conexión entre arduino-simulink
- Programación tanto de arduino como de simulink
- Conexiones de maqueta con arduino con PC
- Resultados y conclusiones

Otro de los factores a tratar seria el manejo del dispositivo PID donde se modifican ganancias
en sus etapas, para darnos la respuesta deseada en el sistema, así como diversos problemas que
se fueron presentando durante el proceso.

3
OBJETIVOS

1. Implementación de un algoritmo de control por medio del uso de Arduino y Simulink.


2. Diseño y elaboración de una planta la cual contenga la hélice y un módulo de potencia
para el control de esta.
3. Obtener el modelo matemático del sistema, utilizando leyes de física como la de la inercia,
movimientos de rotación, entre otras, y la última pero más importante la Transformada de
Laplace.
4. Lograr la regulación de la barra.
5. Lograr que el sistema alcance la referencia con el menor sobrepico posible, que en todo
momento su evolución temporal sea estable.

MARCO TEÓRICO

ARDUINO

En donde setup() es la parte encargada de recoger la configuración , se invoca una sola vez cuando
el programa empieza. Se utiliza para inicializar los modos de trabajo de los pines, o el puerto serie.
Debe ser incluida en un programa aunque no haya declaración que ejecutar.

La función loop() contiene el código que se ejecutara cíclicamente lo que posibilita que el
programa este respondiendo continuamente ante los eventos que se produzcan en la tarjeta
(lectura de entradas, activación de salidas, etc.). Esta función es el núcleo de todos los programas
de Arduino y la que realiza la mayor parte del trabajo.

Ambas funciones son necesarias para que el programa trabaje.

Arduino puede tomar información del entorno a través de sus pines de entrada de toda una gama
de sensores y puede incidir sobre aquello que le rodea controlando luces, motores y otros
actuadores. Para el desarrollo de esta aplicación en especial se emplearan nueve de las tantas
funciones que componen la biblioteca de Arduino, la cuales serán explicadas a continuación:

 pinMode(pin, mode)

Esta instrucción es utilizada en la parte de configuración setup () y sirve para configurar el modo
de trabajo de un PIN pudiendo ser INPUT (entrada) u OUTPUT (salida).

4
Los terminales de Arduino, por defecto, están configurados como entradas, por lo tanto no es
necesario definirlos en el caso de que vayan a trabajar como entradas.

 Serial.begin(rate)

Abre el puerto serie y fija la velocidad en baudios para la transmisión de datos en serie. El valor
típico de velocidad para comunicarse con el ordenador es 9600, aunque otras velocidades pueden
ser soportadas.

 analogRead(pin)

Lee el valor de un determinado pin definido como entrada analógica con una resolución de 10 bits.
Esta instrucción sólo funciona en los pines (0-5). El rango de valor que podemos leer oscila de 0 a
1023, ejemplo:

valor = analogRead(pin); // asigna a valor lo que lee en la entrada ´pin'

 analogWrite(pin, value )

Esta instrucción sirve para escribir un pseudo-valor analógico utilizando el procedimiento de


modulación por ancho de pulso (PWM) a uno de los pines de Arduino marcados como “pin PWM”.
El Arduino Uno, que implementa el chip

ATmega328, permite habilitar como salidas analógicas tipo PWM los pines 3, 5, 6, 9, 10 y 11. El
valor que se puede enviar a estos pines de salida analógica puede darse en forma de variable o
constante, pero siempre con un margen de 0-255.

analogWrite(pin, valor); // escribe 'valor' en el 'pin' definido como analógico

Si enviamos el valor 0 genera una salida de 0 voltios en el pin especificado; un valor de

255 genera una salida de 5 voltios de salida en el pin especificado. Para valores de entre

0 y 255, el pin saca tensiones entre 0 y 5 voltios - el valor HIGH de salida equivale a 5v (5 voltios).
Teniendo en cuenta el concepto de señal PWM, por ejemplo, un valor de 64 equivaldrá a
mantener 0 voltios de tres cuartas partes del tiempo y 5 voltios a una cuarta parte del tiempo; un
valor de 128 equivaldrá a mantener la salida en 0 la mitad del tiempo y 5 voltios la otra mitad del
tiempo.

Debido a que esta es una función de hardware, en el pin de salida analógica (PWM) se generará
una onda constante después de ejecutada la instrucción analogWrite hasta que se llegue a
ejecutar otra instrucción analogWrite (o una llamada a digitalRead o digitalWrite en el mismo pin).

 Serial.write(value)

Escribe datos binarios en el puerto serie. Estos datos se envían como un byte o una serie de bytes.

5
- Serial.read()

Lee o captura un byte (un carácter) desde el puerto serie, devuelve -1 si hay ninguno.

-Delay(val)

Detiene la ejecución del programa la cantidad de tiempo en ms que se indica en la propia


instrucción. De tal manera que 1000 equivale a 1seg.

COMUNICACIÓN ARDUINO-PC

En la comunicación con el computador Arduino emplea la comunicación asincrónica. Esto es,


requiere de sólo dos líneas de conexión que corresponden con los pines 2 y 3: Pin 2 (Rx) pin de
recepción y pin 3 (Tx) pin de transmisión, y del establecimiento de un nivel de tierra común con el
computador, esto es, ambas tierras deben estar conectadas, estableciendo el mismo nivel de
voltaje de referencia.

Además de realizar las conexiones físicas entre el microcontrolador y el computador, para que
pueda establecerse la comunicación serial debe existir un acuerdo previo en la manera cómo van a
ser enviados los datos. Este acuerdo debe incluir los niveles de voltaje que serán usados, el
tamaño y formato de cada uno de los mensajes (número de bits que constituirán el tamaño de la
palabra, existirá o no un bit de inicio y/o de parada, se empleará o no un bit de paridad), el tipo de
lógica empleada (qué voltaje representará un cero o un uno), el orden en que serán enviados los
datos (será enviado primero el bit de mayor peso o el de menor peso) y la velocidad de envío de
datos. Arduino facilita este proceso para que sólo sea necesario especificar la velocidad de envío
de los datos. Esta velocidad es conocida como “baud rate” o rata de pulsos por segundo.
Velocidades frecuentes de uso son 9600, 19200, 57600 y 115200.

PUERTO SERIE

Un puerto serie o puerto serial es una interfaz de comunicaciones de datos digitales,


frecuentemente utilizado por ordenadores y periféricos, donde la información es transmitida bit a
bit enviando un solo bit a la vez, en contraste con el puerto paralelo que envía varios bits
simultáneamente. La comparación entre la transmisión en serie y en paralelo se puede explicar
usando una analogía con las carreteras. Una carretera tradicional de un sólo carril por sentido
sería como la transmisión en serie y una autovía con varios carriles por sentido sería la transmisión
en paralelo, siendo los vehículos los bits que circulan por el cable. En tecnologías básicas, un
puerto serie es una interfaz física de comunicación en serie a través de la cual se transfiere
información mandando o recibiendo un bit. A lo largo de la mayor parte de la historia de los
ordenadores, la transferencia de datos a través de los puertos de serie ha sido generalizada. Se ha
usado y sigue usándose para conectar las computadoras a dispositivos como terminales o
módems. Los ratones, teclados, y otros periféricos también se conectaban de esta forma.

6
Mientras que otras interfaces como Ethernet, FireWire, y USB mandaban datos como un flujo en
serie, el término "puerto serie" normalmente identifica el hardware más o menos conforme al
estándar RS-232, diseñado para interactuar con un módem o con un dispositivo de comunicación
similar. Actualmente en la mayoría de los periféricos serie, la interfaz USB ha reemplazado al
puerto serie por ser más rápida. La mayor parte de los ordenadores están conectados a
dispositivos externos a través de USB y, a menudo, ni siquiera llegan a tener un puerto serie.

CONTROL DE COMUNICACIÓN UART

UART es el Receptor-Transmisor Universal Asíncrono, las funciones principales del chip UART son
las de manejar las interrupciones de los dispositivos conectados al puerto serie y de convertir los
datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que
puedan ser transmitidos a través de los puertos y viceversa.

El controlador del UART es el componente clave del subsistema de comunicaciones series de una
computadora. El UART toma bytes de datos y transmite los bits individuales de forma secuencial.
En el destino, un segundo UART reensambla los bits en bytes completos. La transmisión serie de la
información digital (bits) a través de un cable único u otros medios es mucho más efectiva en
cuanto a costo que la transmisión en paralelo a través de múltiples cables. Se utiliza un UART para
convertir la información transmitida entre su forma secuencial y paralela en cada terminal de
enlace. Cada UART contiene un registro de desplazamiento que es el método fundamental de
conversión entre las forma serie y paralelo.

El UART normalmente no genera directamente o recibe las señales externas entre los diferentes
módulos del equipo. Usualmente se usan dispositivos de interfaz separados para convertir las
señales de nivel lógico del UART hacia y desde los niveles de señalización externos.

El chip UART de Arduino recibe o envía señales a nivel TTL por lo que otro chip integrado en la
tarjeta Arduino se encarga de convertir las señales a los niveles de tensión necesarios para hacer
posible la comunicación por el USB y que el ordenador reconozca al USB como un puerto COM.

SIMULINK

Simulink es una herramienta de Matlab que funciona mediante un entorno de


programación visual, las funciones están representadas por bloques, lo que hace muy sencillo su
utilización sin necesidad de emplear lenguajes complejos de programación.

Es un entorno de programación de más alto nivel de abstracción que el lenguaje


interpretado Matlab (archivos con extensión .m). Simulink genera archivos con extensión .mdl (de
"model"). Al ejecutar un modelo implementado en simulink se genera un código en C que el
ordenador reconoce y ejecuta. Para implementar el control de la planta será necesario utilizar

7
varios bloques de Simulink que permitirán la comunicación serie y la ejecución de algoritmos de
control, veamos cuales son eso bloques a continuación:

El proceso de comunicación serie es posible gracias al uso de tres bloques, Serial


Configuration, Serial Receive y Serial Send, estos bloques emplean el Universal Serial Port(USB),
para el envio y recepción de datos, este puerto es del tipo Half-Duplex, lo cual significa que solo se
puede recibir o enviar datos, en un mismo instante de tiempo, o sea, que para enviar o recibir
datos el puerto debe estar libre de trafico.

- Serial Configuration: Este bloque configura los parámetros de un puerto serie que se
puede utilizar para enviar y recibir datos.
- Serial Receive: Este bloque configura y abre una interfaz a una dirección remota
especificada usando el Protocolo Serie. La configuración e inicialización ocurre una vez al
comienzo de la simulación.
- Serial send: Mediante este bloque se enviarán los datos generados por el controlador
hacia el Arduino.
- Convert_to: Este es un bloque del tipo Data Type Conversion, su única función es convertir
un tipo de dato en otro, en el caso de la aplicación se emplea la conversión a formato
double y uint8
- Gain: Mediante este bloque se hace posible la visualización de los datos recibidos y
enviados, asi como el valor de la referencia, todo ello en unidades de Volts, por ello el
valor de ganancia aplicado es 5/255 que representa la resolución de un conversor D/A de
8 bits.

PID

Un PID es un mecanismo de control por realimentación que calcula la desviación o error


entre un valor medido y el valor que se quiere obtener, para aplicar una acción correctora que
ajuste el proceso. El algoritmo de cálculo del control PID se da en tres parámetros distintos: el
proporcional, el integral, y el derivativo. El valor Proporcional determina la reacción del error
actual. El Integral genera una corrección proporcional a la integral del error, esto nos asegura que
aplicando un esfuerzo de control suficiente, el error de seguimiento se reduce a cero. El Derivativo
determina la reacción del tiempo en el que el error se produce. La suma de estas tres acciones es
usada para ajustar al proceso vía un elemento de control como la posición de una válvula de
control o la energía suministrada a un calentador, por ejemplo. Ajustando estas tres variables en el
algoritmo de control del PID, el controlador puede proveer un control diseñado para lo que
requiera el proceso a realizar. La respuesta del controlador puede ser descrita en términos de
respuesta del control ante un error, el grado el cual el controlador llega al "set point", y el grado
de oscilación del sistema.

Para el correcto funcionamiento de un controlador PID que regule un proceso o sistema se


necesita, al menos:

8
- Un sensor, que determine el estado del sistema (termómetro, caudalímetro, manómetro,
etc).
- Un controlador, que genere la señal que gobierna al actuador.
- Un actuador, que modifique al sistema de manera controlada (resistencia eléctrica, motor,
válvula, bomba, etc).

El sensor proporciona una señal analógica o digital al controlador, la cual representa el punto
actual en el que se encuentra el proceso o sistema. La señal puede representar ese valor en
tensión eléctrica, intensidad de corriente eléctrica o frecuencia. En este último caso la señal es de
corriente alterna, a diferencia de los dos anteriores, que también pueden ser con corriente
continua.

El controlador lee una señal externa que representa el valor que se desea alcanzar. Esta señal
recibe el nombre de punto de consigna (o punto de referencia), la cual es de la misma naturaleza y
tiene el mismo rango de valores que la señal que proporciona el sensor. Para hacer posible esta
compatibilidad y que, a su vez, la señal pueda ser entendida por un humano, habrá que establecer
algún tipo de interfaz (HMI-Human Machine Interface), son pantallas de gran valor visual y fácil
manejo que se usan para hacer más intuitivo el control de un proceso.

El controlador resta la señal de punto actual a la señal de punto de consigna, obteniendo así la
señal de error, que determina en cada instante la diferencia que hay entre el valor deseado
(consigna) y el valor medido. La señal de error es utilizada por cada uno de los 3 componentes del
controlador PID. Las 3 señales sumadas, componen la señal de salida que el controlador va a
utilizar para gobernar al actuador. La señal resultante de la suma de estas tres se llama variable
manipulada y no se aplica directamente sobre el actuador, sino que debe ser transformada para
ser compatible con el actuador utilizado.

Las tres componentes de un controlador PID son: parte Proporcional, acción Integral y acción
Derivativa. El peso de la influencia que cada una de estas partes tiene en la suma final, viene dado
por la constante proporcional, el tiempo integral y el tiempo derivativo, respectivamente. Se
pretenderá lograr que el bucle de control corrija eficazmente y en el mínimo tiempo posible los
efectos de las perturbaciones.

9
Acción proporcional

En la rama superior de la figura 2.3, tendremos como resultado la multiplicación de la señal de


error por la ganancia proporcional, esto implica que el controlador proporcional produce una
variable de salida u proporcional al error del sistema e. u(t) = Kp e(t)

La ganancia proporcional Kp ó P es la cantidad por la cual la variable de control u cambia cuando


el error cambia ∆e.

Un controlador proporcional responde rápidamente ante el error del sistema pero no es capaz de
eliminar completamente las perturbaciones, o eliminar completamente el error. Puede producir
inestabilidad.

En la práctica cuando queramos conocer datos sobre la ganancia proporcional de un PID


comercial, probablemente no la encontremos como Kp ó P, sino que se utiliza el término Banda
Proporcional, PB. La relación entre una y otra se expresa mediante:

Se escribe de esta forma porque normalmente PB se expresa en porcentaje.

Una banda proporcional ancha es lo mismo que una ganancia baja, y una banda proporcional
estrecha equivale a una ganancia alta.

La banda proporcional también se define como el error que se requiere para llevar la salida del
controlador del valor más bajo hasta el más alto.

Acción integral:

Esta acción básica de control, se observa en la rama intermedia de la figura 2.3, donde
obtendremos una señal que será la multiplicación de la ganancia integral I ó tiempo de acción
integral por la variación del error en el tiempo, de forma matemática:

10
Ti es el tiempo que tarda la acción integral en igualar a la acción proporcional.

Si lo vemos de forma grafica será así:

El controlador integral se utiliza sobre todo cuando tenemos problemas de error en régimen
estacionario, ya que su finalidad es corregir las desviaciones sobre la referencia y lograr finalmente
que error de estado estacionario se haga cero.

Acción derivativa:

Un regulador P con ganancia alta para dar respuesta rápida puede provocar oscilaciones por señal
de control u excesiva. La acción derivativa acelera la u si e crece y la modera si e decrece, evitando
oscilaciones. En la rama inferior de figura 2.3 se obtiene una señal que viene a ser la
implementación real de la acción derivativa, teóricamente la acción derivativa se representa:

11
PWM

La modulación por ancho de pulsos (también conocida como PWM [pronunciado pe dobleuve
eme], siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica
en la que se modifica el ciclo de trabajo de una señal periódica (unasenoidal o una cuadrada, por
ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para
controlar la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con
el período.

Expresado matemáticamente:

D es el ciclo de trabajo
es el tiempo en que la función es positiva (ancho del pulso)
T es el período de la función

La construcción típica de un circuito PWM se lleva a cabo mediante un comparador con dos
entradas y una salida. Una de las entradas se conecta a un oscilador de onda dientes de sierra,
mientras que la otra queda disponible para la señal moduladora. En la salida la frecuencia es
generalmente igual a la de la señal dientes de sierra y el ciclo de trabajo está en función de la
portadora.

La principal desventaja que presentan los circuitos PWM es la posibilidad de que haya
interferencias generadas por radiofrecuencia. Éstas pueden minimizarse ubicando el controlador
cerca de la carga y realizando un filtrado de la fuente de alimentación.

12
MODELADO MATEMÁTICO

El funcionamiento general del llamado “balancín” está formado mediante un sistema mecánico
pero a la vez también un sistema eléctrico, por eso es necesario encontrar una relación entre ellos
ya que su trabajo va de la mano. Y por último representarlo en una función que describa su
funcionamiento en conjunto.

MOVIMIENTO DE ROTACIÓN DE UN SÓLIDO RÍGIDO

El movimiento a controlar en esta planta es el de rotación de un sólido alrededor de su eje central


de inercia. La variación del estado de rotación de un sólido viene determinada por la variación de
su velocidad angular por lo que, si queremos describir el movimiento de rotación debemos
encontrar una ecuación que nos permita calcular la aceleración angular del mismo, para ello la
siguiente ecuación:

Ésta es la ecuación del movimiento de rotación de un sólido rígido que, como puede observarse,
es análoga a la segunda ley de Newton y será esta la empleada para plantear la ecuación que rige
el movimiento de nuestro sistema.

MOMENTO DE INERCIA PARA UNA MASA PUNTUAL

En este caso el sistema contiene dos elementos que aportan momento de inercia, uno es la masa
de la barra y el otro la masa del motor. Cada uno de estos aporta un momento de inercia que se
calcula de manera independiente y distinta y que finalmente añadiremos para caracterizar el
momento de inercia del sistema en general. Veamos a continuación como calcular el momento de
inercia para una masa puntual, en este caso la masa del motor.

Para el cálculo del momento de inercia de masas puntuales se empleará la siguiente ecuación:

Momento de inercia de una varilla cuyo eje de giro pasa por su centro de gravedad

13
Apoyándonos en el siguiente esquema vamos a calcular el momento de inercia de una varilla de
masa M y longitud L respecto de un eje perpendicular a la varilla que pasa por el centro de masas.

La masa dm del elemento de longitud de la varilla comprendido entre x y x+dx es

El momento de inercia de la varilla es:

Pues ahora necesitamos conocer la masa de la barra y la calcularemos de la siguiente manera:

Conociendo la densidad del cobre, material del cual está compuesta la barra, podemos utilizar la
ecuación:

Debido a que el material utilizado fue madera, la densidad = 900 kg/cm3, y el volumen calculado
del vástago fue de V=0.000034557 m3, por lo que al aplicar la fórmula:

𝑀 = 𝜌𝑉

𝑀 = (900)(0.000034557) = 0.031 𝑘𝑔

Se obtiene su masa. Y ahora aplicando la fórmula de momento de inercia se obtiene:

1
𝐼𝑐 = (0.031)(0.44)2 = 0.0005001 𝑘𝑔𝑚2
12

14
OBTENCIÓN DE LA FUNCIÓN DE TRANSFERENCIA

L , R = Inductancia y Resistencia del inducido y (Vb) Resistencia AC

FEM que es proporcional a la velocidad del eje.

B = coeficiente de rozamiento.

J= coeficiente de inercia

𝑑∅
𝑉𝑏 = 𝐾𝑝
𝑑𝑡

Kp = constante proporcional.

Ø = Velocidad del eje.

𝑇(𝑡) = (𝐾𝑡)(𝑖)

Kt = cosntante proporcional

i = corriente del inducido

∅(𝑠)
𝐹𝐷 𝑇 =
𝑉(𝑠)

Ø= viscosidad

V = voltaje

15
Del circuito inducido:

𝑉 = 𝑉𝐿 + 𝑉𝑅 + 𝑉𝑏

𝑑𝑖
𝑉 = 𝑅𝑖 + 𝐿 + 𝑉𝑏
𝑑𝑡
𝑑∅
𝑐𝑜𝑚𝑜 𝑉𝑏 = 𝐾𝑝
𝑑𝑡
𝑑𝑖 𝑑∅
𝑉 = 𝑅𝑖 + 𝐿 + 𝐾𝑝
𝑑𝑡 𝑑𝑡

Del sistema mecánico:

𝑑2 ∅ 𝑑∅
𝑇=𝐽 2
+𝐵
𝑑𝑡 𝑑𝑡

𝑐𝑜𝑚𝑜 𝑇(𝑡) = 𝐾𝑡 . 𝑖

𝑑2 ∅ 𝑑∅
𝐾𝑡. 𝑖 = 𝐽 2
+𝐵
𝑑𝑡 𝑑𝑡

Aplicando Laplace:

𝑉(𝑠) = 𝑅𝐼 + 𝐿𝑆𝐼 + 𝐾𝑝𝑆∅

𝐾𝑇 𝐼 = 𝐽𝑆 2 ∅ + 𝐵𝑆∅

𝑉 − 𝐾𝑝 𝑆∅
𝐼=
𝑅 + 𝐿𝑆
𝑉 − 𝐾𝑝𝑆∅
𝐾 = 𝐽𝑆 2 ∅ + 𝐵𝑆∅
𝑅 + 𝐿𝑆 𝑇

𝑉 − 𝐾𝑝𝑆∅𝐾𝑇 = [𝐽𝑆 2 ∅ + 𝐵𝑆∅]𝑅 + 𝐿𝑆

𝑉𝐾𝑇 = ∅[(𝑅 + 𝐿𝑆)(𝐽𝑆 2 + 𝐵𝑆) + 𝐾𝑝 𝐾𝑇 𝑆]

𝑄 𝐾𝑇
𝐹(𝑇) = = 2
𝑉 (𝑅 + 𝐼𝑠)(𝐽𝑆 + 𝐵𝑆) + 𝐾𝑝𝐾𝑇 𝑆

16
PROCESO

LA PLANTA

Está formada por medio de 2 bases metálicas, las cuales fueron perforadas para que a través de
ellas pase un vástago de madera ligera, el cual sostiene otro que está perpendicularmente sobre
él. En uno de los extremos del vástago perpendicular se encuentra un motor DC que contiene
una hélice de 3 pulgadas aproximadamente de diámetro. El vástago que pasa a través de las bases
metálicas tiene en uno de sus extremos un potenciómetro de 10K el cual está fijado a una base
para lograr que el único movimiento que tenga es el de su perilla al momento de accionarse la
hélice, dicho potenciómetro el alimentado con 5V que es proporcionado por el microcontrolador,
de manera que a cada valor de tensión entre cursor y común le corresponderá una posición
determinada del balancín. Este valor de tensión será registrado por el micro mediante una de sus
entradas analógicas.

SENSOR POTENCIOMÉTRICO

Como se había mencionado anteriormente se decidió utilizar un potenciómetro para que nos
ayudara a conocer la posición de la hélice al elevarse. Por cada posición de la hélice, el
potenciómetro tiene una resistencia diferente y con ello de tensión V(R).

Nuestro potenciómetro utilizado es de 10K, y utilizamos una alimentación de 5V, si hacemos una
relación entre ellos tenemos que:

5𝑉
𝑅𝑒𝑙𝑎𝑐𝑖ó𝑛 𝑉 − 𝑃 = = 0.5 𝑉/𝐾Ω
10𝐾Ω
17
Gráfica voltaje-resistencia

voltaje-resistencia
6

3
voltaje-resistencia
2

0
0.5 1 1.5 2 2.5

Con esto se concluye que por cada 0.5 de voltaje, va haber un 1KΩ de resistencia en el circuito.

INTERFAZ FÍSICA

En esta sección el punto principal es dar una descripción de cómo es que se llevaron a cabo las
conexiones físicas del Arduino hacia la planta y también hacia el circuito armado en la tarjeta.

El Arduino se utilizó con el fin de suministrar niveles de voltaje y corriente para que el motor que
mueve la hélice funcionara de manera correcta, además se usó una fuente de voltaje externa.
Además se necesita de un elemento que conmute a una frecuencia determinada, el objetivo es el
aumentar o disminuir los niveles de voltaje que se suministran al motor, de tal manera que la
fuerza de empuje de la hélice se mantenga dentro de un rango y nunca se extienda más allá.

CONEXIÓN DEL ARDUINO HACIA POTENCIÓMETRO Y TARJETA (CIRCUITO)

El Arduino tiene diferentes entradas y salidas dependiendo de su función, en nuestro caso


decidimos utilizar la salida 10 para enviar una señal PWM hacia el transistor, y por tanto esta
misma señal PWM pero de potencia será la que reciba el motor, de manera que se podrá
controlar la tensión del motor aumentando o disminuyendo el ancho del pulso y con ello el valor
medio del voltaje que llega al motor.

En la sección de power del Arduino se utilizaron los 5V para alimentar al potenciómetro, el pin de
ground se conectó hacia la tercera punta del potenciómetro y por último se conectó la entrada
analógica A0 del microcontrolador hacia la punta 2 de potenciómetro.

18
¿CÓMO SE ARMÓ EL CIRCUITO EN LA TARJETA?

E circuito elaborado se puede describir como básico, ya que se utilizan dispositivos comunes entre
el alumnado de ingeniería y su elaboración no es nada complicada, consiste en:

- 1 mosfet irf3205.
- 1 diodo
- 1 resistencia de 330Ω.

Se puede notar que contiene pocos elementos, los cuales cada uno tiene una función.

El mosfet tiene 3 pines, cada una de ellas tiene un uso específico, que son:

- El pin1 llamado Gate es donde se conectó el cable que proviene de la salida 10 del Arduino
que envía la señal PWM, y también de este pin va conectada la resistencia de 330Ω.
- El pin2 llamado Drain es donde se conectó el diodo, el cual también se encuentra
conectado al motor en forma paralela.
- El pin3 llamado Source va conectado directamente a la tierra.

A continuación se mostrará de una manera más apreciativa lo anteriormente explicado.

19
COMUNICACIÓN SERIAL

Se utiliza para la comunicación entre la placa Arduino y un ordenador u otros dispositivos. Todas
las placas Arduino tienen al menos un puerto serie (también conocido como UART o
USART): Serial. Se comunica a través de los pines digitales 0 (RX) y 1 (TX), así como con el
ordenador mediante USB.

UART es el Receptor-Transmisor Universal Asíncrono, las funciones principales del chip UART son
las de manejar las interrupciones de los dispositivos conectados al puerto serie y de convertir los
datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que
puedan ser transmitidos a través de los puertos y viceversa.

El chip UART de Arduino recibe o envía señales a nivel TTL por lo que otro chip integrado en la
tarjeta Arduino se encarga de convertir las señales a los niveles de tensión necesarios para hacer
posible la comunicación por el USB y que el ordenador reconozca al USB como un puerto COM.

El USB, en este caso servirá para enviar y recibir datos desde y hacia la placa Arduino, además de
proveer al mismo de alimentación. En este caso en el puerto (‘COM3’).

Además de realizar las conexiones físicas entre Arduino y el ordenador, para que pueda
establecerse la comunicación serial debe existir un acuerdo previo en la manera cómo van a ser
enviados los datos. Arduino facilita este proceso para que sólo sea necesario especificar la
velocidad de envío de los datos. Esta velocidad es conocida como “baud rate”. Frecuentemente
utilizando la velocidad de 9600.

LECTURA ARDUINO

El código del Arduino debe ser capaz de leer del potenciómetro, enviarlo como dato a través
del puerto serie, recibir el dato de potencia necesaria al motor y escribir dicho dato en la salida
analógica como señal PWM.

1 int out = 0;
2 byte in = 0;
3 byte pinOut = 10;
4
5 void setup() {
6 // inicializar puerto serie
7 Serial.begin(9600);
8 // preparar output
9 pinMode(pinOut, OUTPUT);
10 }
11
12 void loop() {
13 // leer del pin A0 como
14 out = analogRead(A0);
15 // escalar para obtener formato uint8

20
16 out = map(out, 0, 1023, 0, 255);
17 // enviar en base 10 en ASCII
18 Serial.write(out);
19 // leer del serie si hay datos
20 if(Serial.available()){
21 in = Serial.read();
22 // escribir en el pin 10
23 analogWrite(pinOut, in);
24 }
25 // esperar para estabilizar el conversor
26 delay(20);
}

CONFIGURACION ARDUINO - MATLAB

Se carga el siguiente programa en la tarjeta Arduino:

/* Analog and Digital Input and Output Server for MATLAB */


/* Giampiero Campa, Copyright 2009 The MathWorks, Inc */

/* This file is meant to be used with the MATLAB arduino IO


package, however, it can be used from the IDE environment
(or any other serial terminal) by typing commands like:

0e0 : assigns digital pin #4 (e) as input


0f1 : assigns digital pin #5 (f) as output
0n1 : assigns digital pin #13 (n) as output

1c : reads digital pin #2 (c)


1e : reads digital pin #4 (e)
2n0 : sets digital pin #13 (n) low
2n1 : sets digital pin #13 (n) high
2f1 : sets digital pin #5 (f) high
2f0 : sets digital pin #5 (f) low
4j2 : sets digital pin #9 (j) to 50=ascii(2) over 255
4jz : sets digital pin #9 (j) to 122=ascii(z) over 255
3a : reads analog pin #0 (a)
3f : reads analog pin #5 (f)

R0 : sets analog reference to DEFAULT


R1 : sets analog reference to INTERNAL
R2 : sets analog reference to EXTERNAL

99 : returns script type (1 basic, 2 motor, 3 general) */

21
/* define internal for the MEGA as 1.1V (as as for the 328) */
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define INTERNAL INTERNAL1V1
#endif

void setup() {
/* Make sure all pins are put in high impedence state and
that their registers are set as low before doing anything.
This puts the board in a known (and harmless) state */
int i;
for (i=0;i<20;i++) {
pinMode(i,INPUT);
digitalWrite(i,0);
}
/* initialize serial */
Serial.begin(115200);
}

void loop() {

/* variables declaration and initialization */

static int s = -1; /* state */


static int pin = 13; /* generic pin number */

int val = 0; /* generic value read from serial */


int agv = 0; /* generic analog value */
int dgv = 0; /* generic digital value */

/* The following instruction constantly checks if anything


is available on the serial port. Nothing gets executed in
the loop if nothing is available to be read, but as soon
as anything becomes available, then the part coded after
the if statement (that is the real stuff) gets executed */

if (Serial.available() >0) {

/* whatever is available from the serial is read here */


val = Serial.read();

/* This part basically implements a state machine that


reads the serial port and makes just one transition
to a new state, depending on both the previous state
and the command that is read from the serial port.
Some commands need additional inputs from the serial
port, so they need 2 or 3 state transitions (each one
happening as soon as anything new is available from
the serial port) to be fully executed. After a command

22
is fully executed the state returns to its initial
value s=-1 */

switch (s) {

/* s=-1 means NOTHING RECEIVED YET ******************* */


case -1:

/* calculate next state */


if (val>47 && val<90) {
/* the first received value indicates the mode
49 is ascii for 1, ... 90 is ascii for Z
s=0 is change-pin mode
s=10 is DI; s=20 is DO; s=30 is AI; s=40 is AO;
s=90 is query script type (1 basic, 2 motor)
s=340 is change analog reference
*/
s=10*(val-48);
}

/* the following statements are needed to handle


unexpected first values coming from the serial (if
the value is unrecognized then it defaults to s=-1) */
if ((s>40 && s<90) || (s>90 && s!=340)) {
s=-1;
}

/* the break statements gets out of the switch-case, so


/* we go back to line 97 and wait for new serial data */
break; /* s=-1 (initial state) taken care of */

/* s=0 or 1 means CHANGE PIN MODE */

case 0:
/* the second received value indicates the pin
from abs('c')=99, pin 2, to abs('t')=116, pin 19 */
if (val>98 && val<117) {
pin=val-97; /* calculate pin */
s=1; /* next we will need to get 0 or 1 from serial */
}
else {
s=-1; /* if value is not a pin then return to -1 */
}
break; /* s=0 taken care of */

case 1:
/* the third received value indicates the value 0 or 1 */

23
if (val>47 && val<50) {
/* set pin mode */
if (val==48) {
pinMode(pin,INPUT);
}
else {
pinMode(pin,OUTPUT);
}
}
s=-1; /* we are done with CHANGE PIN so go to -1 */
break; /* s=1 taken care of */

/* s=10 means DIGITAL INPUT ************************** */

case 10:
/* the second received value indicates the pin
from abs('c')=99, pin 2, to abs('t')=116, pin 19 */
if (val>98 && val<117) {
pin=val-97; /* calculate pin */
dgv=digitalRead(pin); /* perform Digital Input */
Serial.println(dgv); /* send value via serial */
}
s=-1; /* we are done with DI so next state is -1 */
break; /* s=10 taken care of */

/* s=20 or 21 means DIGITAL OUTPUT ******************* */

case 20:
/* the second received value indicates the pin
from abs('c')=99, pin 2, to abs('t')=116, pin 19 */
if (val>98 && val<117) {
pin=val-97; /* calculate pin */
s=21; /* next we will need to get 0 or 1 from serial */
}
else {
s=-1; /* if value is not a pin then return to -1 */
}
break; /* s=20 taken care of */

case 21:
/* the third received value indicates the value 0 or 1 */
if (val>47 && val<50) {
dgv=val-48; /* calculate value */
digitalWrite(pin,dgv); /* perform Digital Output */
}
s=-1; /* we are done with DO so next state is -1 */
break; /* s=21 taken care of */

24
/* s=30 means ANALOG INPUT *************************** */

case 30:
/* the second received value indicates the pin
from abs('a')=97, pin 0, to abs('f')=102, pin 6,
note that these are the digital pins from 14 to 19
located in the lower right part of the board */
if (val>96 && val<103) {
pin=val-97; /* calculate pin */
agv=analogRead(pin); /* perform Analog Input */
Serial.println(agv); /* send value via serial */
}
s=-1; /* we are done with AI so next state is -1 */
break; /* s=30 taken care of */

/* s=40 or 41 means ANALOG OUTPUT ******************** */

case 40:
/* the second received value indicates the pin
from abs('c')=99, pin 2, to abs('t')=116, pin 19 */
if (val>98 && val<117) {
pin=val-97; /* calculate pin */
s=41; /* next we will need to get value from serial */
}
else {
s=-1; /* if value is not a pin then return to -1 */
}
break; /* s=40 taken care of */

case 41:
/* the third received value indicates the analog value */
analogWrite(pin,val); /* perform Analog Output */
s=-1; /* we are done with AO so next state is -1 */
break; /* s=41 taken care of */

/* s=90 means Query Script Type (1 basic, 2 motor) */


case 90:
if (val==57) {
/* if string sent is 99 send script type via serial */
Serial.println(1);
}
s=-1; /* we are done with this so next state is -1 */
break; /* s=90 taken care of */

/* s=340 or 341 means ANALOG REFERENCE *************** */

25
case 340:
/* the second received value indicates the reference,
which is encoded as is 0,1,2 for DEFAULT, INTERNAL
and EXTERNAL, respectively */

switch (val) {

case 48:
analogReference(DEFAULT);
break;

case 49:
analogReference(INTERNAL);
break;

case 50:
analogReference(EXTERNAL);
break;

default: /* unrecognized, no action */


break;
}

s=-1; /* we are done with this so next state is -1 */


break; /* s=341 taken care of */

/* ******* UNRECOGNIZED STATE, go back to s=-1 ******* */

default:
/* we should never get here but if we do it means we
are in an unexpected state so whatever is the second
received value we get out of here and back to s=-1 */

s=-1; /* go back to the initial state, break unneeded */

} /* end switch on state s */

} /* end if serial available */

} /* end loop statement */

Este sketch, contiene el código necesario para que la tarjeta Arduino “escuche” los comandos
ejecutados desde Matlab, ejecute instrucciones, interactúe con dispositivos conectados a la tarjeta
y transfiera datos desde sensores y dispositivos, hacia Matlab.

26
Verifique el puerto COM utilizado por la tarjeta para la configuración de la misma. En este caso en
el puerto (‘COM3’).

El número de puerto se puede consultar accediendo a:

Mi PC/Propiedades/Hardware/Administrador de Dispositivos.

En esta ventana, ubique los puertos COM disponibles (COM & LPT), expanda el menú para ver en
qué puerto COM está conectado Arduino.

CONFIGURACIÓN DE LOS PINES DE LA TARJETA DESDE MATLAB

Para interactuar con la tarjeta, desde el entorno de Matlab; primero se debe crear un objeto para
acceder a la información de puerto de comunicación a la que está conectada la tarjeta. Se hace
con la línea de comando, de la siguiente forma:

cIO = arduino(‘COM3’)

Entre paréntesis, figura el puerto serial al que se conectó la Arduino, como se indica
anteriormente. En este ejemplo “COM3”, pero puede ser cualquier otro valor.

Al ejecutar la línea anterior en la ventana de comandos, se inicia una conexión y aparecerá en


pantalla, texto informativo sobre la configuración de entradas, salidas y estado actual de los pines.

Los pines de la tarjeta, que permiten conectar el sistema a dispositivos externos, pueden
configurarse como entradas o como salidas y a su vez, en forma digital o análoga.

CONEXIÓN ARDUINO - SIMULINK

Para implementar el control de la planta será necesario utilizar varios bloques de Simulink que
permitirán la comunicación serie y la ejecución de algoritmos de control.

El proceso de comunicación serie es posible gracias al uso de tres bloques, Serial Configuration,
Serial Receive y Serial Send, estos bloques emplean el Universal Serial Port (USB), para el envío y
recepción de datos, este puerto es del tipo Half-Duplex, lo cual significa que solo se puede recibir o
enviar datos, en un mismo instante de tiempo, o sea, que para enviar o recibir datos el puerto
debe estar libre de tráfico.

Serial Configuration
Este bloque configura los parámetros de un puerto serie que se puede utilizar para enviar y recibir
datos. Se debe dar valores a todos sus parámetros antes de colocar un Serial Send o un Serial
Receive.

Communication port

Especifica el puerto serie a configurar. Se debe seleccionar un puerto disponible de la lista. Por
defecto no hay puerto serie seleccionado, el mismo puerto debe ser utilizado para el Serial Send y

27
el Serial Receive. Cada Serial Send y Receive debe tener un Serial Configuration, lo que implica que
si se utilizan varios puertos en una misma simulación, se debe agregar tantos bloques de Serial
Configuration como puertos series diferentes haya en la aplicación.

Baud rate

Especifica la velocidad de transmisión en baudios, por defecto es 9600.

Data bits

Especifica el número de bits que se van a enviar por la interfaz serie.

Parity

Especifica como chequear los bits de paridad en los datos transmitidos.

Stop bits

Especifica la cantidad de bits que determinaran el final de un byte.

Flow control

Especifica el proceso de gestión de la tasa de transmisión de datos en el puerto serie.

Timeout

Especifica el tiempo que el modelo va a esperar a los datos durante cada paso de tiempo de
simulación. El valor predeterminado es 10 (segundos).

Serial Receive
Este bloque configura y abre una interfaz a una dirección remota especificada usando el Protocolo
Serie. La configuración e inicialización ocurre una vez al comienzo de la simulación. El bloque
adquiere datos durante el tiempo de ejecución del modelo. Los parámetros principales usados en
la aplicación son:

Communication port

Especifica el puerto a través del cual se van a recibir los datos.

Data size

En esta pestaña es importante indicar el número de bits a recibir.

Data type
Como se puede deducir, se debe indicar en esta pestaña el tipo de dato a recibir.

28
Block sample time

Por último se debe indicar el tiempo de muestreo del bloque, o sea la frecuencia con la que se
leerá el dato.

Serial send
Mediante este bloque se enviarán los datos generados por el controlador hacia el Arduino. Sus
parámetros son muy similares a los del Serial Recieve.

DIAGRAMA BLOQUE SIMULINK


Simulink debe recibir este dato de a través del puerto serie, compararlo con una
referencia que controlaremos nosotros con un slider en la propia interfaz gráfica de Simulink,
y, mediante un controlador PID, determinar la señal de control (potencia al motor) necesaria.
Después debe enviarla a través del puerto serie en formato uint8, unsigned integer de 8 bits, que
toma valores entre 0 y 255, ideales para la función analogWrite() de Arduino. Dentro del bloque
PID, se pueden editar los parámetros P, I y D, siendo los últimos que hemos empleado P = 0.26 , I =
0.9, D = 0.04 y una discretización de 10 ms. Otro dato a tener en cuenta es que la transmisión serie
se hace en formato uint8, pero las operaciones se hacen en format double, de ahí los
conversores. Las ganancias son de valor 5/255 para pasar la señal a voltios reales.

29
Convert_to

Este es un bloque del tipo Data Type Conversion, su única función es convertir un tipo de dato en
otro, en el caso de la aplicación se emplea la conversión a formato double y uint8, el format
double se emplea en los elementos gráficos de Simulink y el uint8, es el necesario para trasmitir y
recibir por el puerto serie, por lo que este tipo de conversiones se debe garantizar tanto en la
comunicación Arduino al ordenador como viceversa.

Gain

Mediante este bloque se hace posible la visualización de los datos recibidos y enviados, así como
el valor de la referencia, todo ello en unidades de Volts, por ello el valor de ganancia aplicado es
5/255 que representa la resolución de un conversor D/A de 8 bits.

Es importante destacar que la lectura de tensión que realiza el Arduino tiene una resolución de 10
bits y por el puerto serie solo se pueden enviar datos de 8 bits, por lo que es necesario llevar el
valor inicial leído por el micro controlador, a un rango de 0-255, o lo que es lo mismo, a una
resolución de 8 bits. Este hecho explica el por qué del valor del bloque Gain.

PID

Aquí es donde se implementa el algoritmo de control PID, gracias a este bloque tendremos un
sistema capaz de responder automáticamente a las variaciones en el punto de referencia. Donde P
es la ganancia proporcional, I es el tiempo de acción integral, D el tiempo derivativo.

30
PRUEBAS Y RESULTADOS
Se hicieron 2 pruebas, donde se muestra cómo es que la barra se encontraba estable y al
momento de una perturbación, se empieza a suministrar voltaje o reducirlo dependiendo si se
perturbó hacia arriba o hacia abajo para que vuelva a su estabilidad.

PRUEBA 1:

Estabilizándose al encender

Perturbación

31
Volviendo a su estabilidad

Estable

PRUEBA 2:

Estabilizándose al encender

32
Perturbación

Regresando a la estabilidad

Estabilizado:

33
CONCLUSION

La realización de este proyecto fue muy gratificante, a lo largo de la carrera de ingeniería


aeroespacial se van adquiriendo nuevos conocimientos y reforzando nuestras habilidades, pero no
sabemos si todo esto se ha aprendido correctamente hasta el momento en que nos ponemos a
prueba de manera práctica, y con esto nos referimos a la elaboración de un proyecto.

El llamado “balancín” fue una nueva experiencia para nosotras, anteriormente en la asignatura de
Teoría de control habíamos estudiado acerca de sistemas de control, mas nunca fuimos mas allá,
al elaborar este proyecto se utilizaron los conocimientos adquiridos en dicha asignatura y se
aplicaron para elaborar el programa que es el encargado de la manipulación de la hélice a la que
se le aplica una fuerza con el fin de producir su movimiento.

Otra parte importante fue la utilización de un Arduino , fue algo novedoso para nosotras, antes de
agregarlo a nuestro proyecto tuvimos que realizar una investigación completa acerca de ella para
conocer su funcionamiento, y exitosamente lo logramos, descargamos su programa y lo
agregamos a nuestro proyecto. Pero ¿Para qué la utilizamos?, la respuesta es fácil, la usamos para
regular el voltaje que alimenta al motor que mueve la hélice, creando así un rango donde la hélice
no va más allá de lo requerido.

Y por último, pero no menos importante, fue la utilización de un mosfet, anteriormente habíamos
utilizado transistores en otras asignaturas, pero ahora debido a la demanda de nuestro proyecto
fue más que necesario el uso de este dispositivo. Para esto tuvimos que estudiar las datasheet
correspondientes a este y llegar a la conclusión de que era la pieza indicada.

En general la elaboración del balancín nos ayudó a complementar lo aprendido en clase y así
desarrollar de manera práctica todo lo que hemos aprendido y demostrar que no ha sido en vano,
que todas esas veces que se complican las cosas o no sabemos cómo continuar, siempre hay una
salida, solo hay que esforzarse un poquito más y al final dicho esfuerzo es una recompensa.

34
ANEXOS

35
36
37
38
39
BIBLIOGRAFÍA
- http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

- Universidad de Valladolid, documento “control de posición de un balancín con motor y


hélice”

- http://www.arduino.cc/es/

- http://www.mathworks.com/products/simulink/

- http://www.youtube.com/results?search_query=descargar+arduino+en+simulink

40

También podría gustarte