Documentos de Académico
Documentos de Profesional
Documentos de Cultura
de un grado de libertad.
17 de Mayo de 2014
Universidad Autónoma de Baja California
Ingeniería Aeroespacial
INSTRUMENTACIÓN/AVIÓNICA
- 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
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.
- 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
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.
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:
analogWrite(pin, value )
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.
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)
COMUNICACIÓN ARDUINO-PC
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
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.
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
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:
- 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
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
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.
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.
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.
É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.
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.
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 𝑘𝑔
1
𝐼𝑐 = (0.031)(0.44)2 = 0.0005001 𝑘𝑔𝑚2
12
14
OBTENCIÓN DE LA FUNCIÓN DE TRANSFERENCIA
B = coeficiente de rozamiento.
J= coeficiente de inercia
𝑑∅
𝑉𝑏 = 𝐾𝑝
𝑑𝑡
Kp = constante proporcional.
𝑇(𝑡) = (𝐾𝑡)(𝑖)
Kt = cosntante proporcional
∅(𝑠)
𝐹𝐷 𝑇 =
𝑉(𝑠)
Ø= viscosidad
V = voltaje
15
Del circuito inducido:
𝑉 = 𝑉𝐿 + 𝑉𝑅 + 𝑉𝑏
𝑑𝑖
𝑉 = 𝑅𝑖 + 𝐿 + 𝑉𝑏
𝑑𝑡
𝑑∅
𝑐𝑜𝑚𝑜 𝑉𝑏 = 𝐾𝑝
𝑑𝑡
𝑑𝑖 𝑑∅
𝑉 = 𝑅𝑖 + 𝐿 + 𝐾𝑝
𝑑𝑡 𝑑𝑡
𝑑2 ∅ 𝑑∅
𝑇=𝐽 2
+𝐵
𝑑𝑡 𝑑𝑡
𝑐𝑜𝑚𝑜 𝑇(𝑡) = 𝐾𝑡 . 𝑖
𝑑2 ∅ 𝑑∅
𝐾𝑡. 𝑖 = 𝐽 2
+𝐵
𝑑𝑡 𝑑𝑡
Aplicando Laplace:
𝐾𝑇 𝐼 = 𝐽𝑆 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á.
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.
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);
}
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() {
if (Serial.available() >0) {
22
is fully executed the state returns to its initial
value s=-1 */
switch (s) {
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 */
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 */
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 */
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 */
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:
/* 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 */
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’).
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.
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.
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.
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
Data bits
Parity
Stop bits
Flow control
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
Data size
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.
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
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/
- http://www.arduino.cc/es/
- http://www.mathworks.com/products/simulink/
- http://www.youtube.com/results?search_query=descargar+arduino+en+simulink
40