Control de posición y velocidad de un Motor DC

25  239 

Loading.... (view fulltext now)

Loading....

Loading....

Loading....

Loading....

Texto

(1)

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERÍA MEXICALI

Manual del Laboratorio 1

Control de posición y velocidad de un

Motor DC

Elaborado Dr. Lars Lindner

(2)

Contenido

1

Plan de trabajo

4

2

Introducción

6

3

Interfaz gráfico de usuario (GUI)

8

4

Algoritmo de control de posición

10

4.1

Determinación de la posición actual ... 10

4.2

Control de posición en bucle cerrado... 11

4.3

Control de posición en bucle abierto ... 14

5

Algoritmo de control de velocidad

15

5.1

Determinación de la velocidad actual ... 15

5.2

Control de velocidad en bucle cerrado... 17

5.3

Control de velocidad en bucle abierto ... 19

6

Reporte de práctica

20

7

Materiales necesarios

21

7.1

Servomotor ... 21

7.2

Plataforma Arduino ... 22

7.3

Motor Driver (opcional) ... 22

8

Fuentes de información

23

8.1

Arduino Uno ... 23

8.2

Microcontrolador ATmega ... 23

8.3

Encoder ... 23

8.4

PWM ... 24

8.5

Timers ... 24

(3)

8.7

Matlab y Simulink ... 25

8.8

LabView ... 25

(4)

1

Plan de trabajo

La carga del proyecto estará distribuida en 8 semanas mediante una serie de objetivos que se deberán cumplir antes del tiempo límite. Lo anterior es para evitar que se acumule demasiada carga de trabajo en fechas cercanas a la entrega final, y se pueda realizar una mejor retroalimentación del proyecto. Se recomienda tener muy presente los tiempos de cada objetivo, para evitar retrasos u otras complicaciones. A continuación se muestran los objetivos a cumplir con el tiempo de realización recomendado y una breve descripción.

1. GUI (1 semana)

1.1. Comprender cómo funciona el puerto serial en conjunto con un controlador Arduino. 1.2. Programar una interface para controlar el Arduino utilizando el puerto serial de una

computadora. 2. Encoder (1 semana)

2.1. Identificar los parámetros y comprender el funcionamiento de un codificador rotatorio incremental.

2.2. Comprobar el funcionamiento del codificador rotatorio incremental, midiendo los pulsos producidos por el mismo.

2.3. Investigar acerca de rutinas de interrupción y cómo se pueden llamar mediante temporizadores internos del Arduino o interrupciones de Hardware externas.

3. Medición y control básico de velocidad y posición. (3 semanas)

3.1. Implementar rutinas de interrupción para contar pulsos del codificador (cálculos de posición) y enviar de manera constante los datos del Arduino a un GUI.

3.2. Investigar acerca de señales PWM y cómo implementarlas en el Arduino para controlar la velocidad del motor.

3.3. Realizar un algoritmo que permita controlar la posición de un motor, implementando una constante linear (𝐾𝑃) para contrarrestar los retardos del sistema (Fricción en el motor, procesamiento del microcontrolador, etc).

3.4. Implementar interrupciones de hardware y temporizadores internos para calcular la velocidad del motor, modificar la misma utilizando señales PWM.

4. PID (2 semanas)

(5)

4.2. Implementar un algoritmo de control del tipo PI para el control de velocidad, encontrando las constantes 𝐾𝑃 y 𝐾𝐼 (linear e integrativa, respectivamente.) que produzcan la mejor respuesta del sistema.

5. Reporte final. (1 semana)

5.1. Realizar el borrador de un reporte a más tardar una semana antes de la fecha de entrega final. Lo anterior es para poder recibir retroalimentación de parte del docente.

(6)

2

Introducción

En ese laboratorio el alumno aprenderá como controlar la posición y velocidad angular de un motor directo con escobillas (brushed DC motor) y codificador rotatorio incremental.

Para el control de velocidad y posición se usa un motor DC con relación de transmisión 1:45,

como el JGA25-371 (95 RPM at 12V). Ese motor es de bajo costo y se puede conseguir a través del

proveedor https://www.openimpulse.com/. El codificador rotatorio incremental tiene dos salidas (canal A y B), donde llegan trenes de pulsos (Figura 1) con amplitud igual al voltaje de alimentación, cuando el motor está girando.

Figura 1: Pulsos del codificador incremental

Con la cantidad de pulsos se mide la posición actual y con esa cantidad en un tiempo determinado se mide la velocidad actual.

Esos pulsos se pueden medir, usando entradas digitales de un microcontrolador y una interrupción de hardware. Una de las plataformas de un solo microcontrolador más usadas en la electrónica de hobby actual es el Arduino. Esa plataforma existe con muchas configuraciones

usando diferentes tipos de microcontroladores, debido a su concepto de código abierto, donde el diseño de hardware como el lenguaje de programación son abiertas. Para ese laboratorio es suficiente el uso del Arduino Uno. El software básico para programar el Arduino es ideal para conocer las funciones básicas de dicha plataforma. Para programar de manera confortable y profesional se recomienda el uso del Arduino IDE for Atmel Studio juntos con Visual Micro.. Visual

(7)

el Arduino en tiempo real. Una de las ventajas del código abierto es, que existen innumerables tutoriales, páginas y apoyo en internet para el Arduino y su uso.

El usuario, que se quiere comunicar con el sistema de control, necesita un Interfaz gráfico de usuario (GUI), que se puede programar en diferentes lenguajes de programación. Principalmente

el Arduino se comunica con esa GUI a través del puerto serial (COM), donde manda y recibe

caracteres individuales y/o cadenas completas de esos caracteres.

En base de la variable de referencia y la variable actual el Arduino calcula mediante su algoritmo la variable de control, la cual representa el voltaje de entrada actual del motor DC. Como el Arduino Uno solo puede manejar máximo 40 𝑚𝐴 en cada salida digital, es necesario el uso de un driver, que convierte la variable de control a una con mayor potencia para el motor DC. El módulo de control L298N contiene un doble puente H L298N integrado. Este módulo se puede construir usando dos circuitos integrados L298N y un protoboard. La Figura 2 muestra el sistema en bucle cerrado completo con el motor Pololu #2821 y el motor driver L298N.

(8)

3

Interfaz gráfico de usuario (GUI)

Un GUI permite, que el usuario se puede comunicar con la plataforma Arduino, mientras que esa está corriendo su programa. A través de esta interfaz el usuario manda variables de referencia y comandos al Arduino y recibir variables actuales del mismo en modo asíncrono. El GUI se puede realizar por ejemplo programando en Visual Basic, C Sharp (C#) o con LabVIEW. El lenguaje de programación del GUI depende de las preferencias de cada quien y que queda en decisión del equipo de estudiantes. Figura 3y Figura 4 muestran ejemplos de interfaces gráficos programados en C# y LabView:

Figura 3: GUI con C#

Figura 4: GUI con LabView

Para una mejor comprensión del tema, se debe buscar informaciones sobre el puerto serial y

como realizar la comunicación serial entre el Arduino y la computadora. Se recomiendan las

(9)

 https://en.wikipedia.org/wiki/Serial_port

 http://playground.arduino.cc/Main/InterfacingWithHardware#Serial

 https://www.arduino.cc/en/Reference/Serial

 https://www.arduino.cc/en/Tutorial/SerialEvent

 https://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners

(10)

4

Algoritmo de control de posición

El Arduino mide la posición y velocidad actual del servomotor a través del codificador rotatorio y calcula la variable de control en una interrupción de software, utilizando un algoritmo de bucle

cerrado y abierto. En las siguientes secciones se describe los conceptos de programación necesarios para desarrollar el algoritmo de control

4.1

Determinación de la posición actual

Como el servomotor contiene un engranaje, el codificador rotatorio manda 𝑝𝑝𝑟 ⋅ 𝑛 pulsos por revolución del eje del motor (Figura 1). Estos pulsos se miden mediante la captura del flanco creciente (rising edge) del canal A o canal B con una interrupción de hardware (Hardware

Interrupt) en el Arduino, que llama a una sub-rutina. Esa rutina de servicio de interrupción (Interrupt Service Routine) se ejecuta instantáneamente después de la interrupción de hardware y al terminar la misma, el programa regresa al punto de interrupción en el código (Figura 5).

Figura 5: Interrupción de hardware

(11)

variable de posición positiva o negativa, respectiva CW o CCW. Se recomienda el estudio de las siguientes páginas para un mejor entendimiento del tema:

 https://en.wikipedia.org/wiki/Interrupt_handler

 https://www.arduino.cc/en/Reference/attachInterrupt

 http://playground.arduino.cc/Main/RotaryEncoders

4.2

Control de posición en bucle cerrado

El esquema principal del control de posición en bucle cerrado muestra Figura 6.

Figura 6: Control de posición en bucle cerrado

El error absoluto de la posición 𝜑𝑒 se calcula por la diferencia entre la posición de referencia 𝜑𝑟 y la posición real 𝜑𝑜:

𝜑𝑒= 𝜑𝑟− 𝜑𝑜 ( 1 )

Para normalizar el valor absoluto a 0.0 ± 1.0, se convierte esa variable al error relativa de la posición 𝜑𝑟′ con:

𝜑𝑒′ = 𝜑𝑒

(12)

controlar la posición del ángulo 𝜑𝑜 del servomotor. Se multiplica 𝜑𝑒′ entonces con un factor de proporcionalidad 𝐾𝑃 para recibir la variable de control (velocidad):

𝜔𝑖 = 𝐾𝑃⋅ 𝜑𝑒′ ( 3 )

La variable de control 𝜔𝑖, que corresponde al voltaje de entrada del motor, se limita al siguiente rango:

30.0 < 𝜔𝑖 ≤ 255.0 ( 4 )

Esto se debe a limitaciones físicas del motor. El rango inferior de 𝜔𝑖 representa el voltaje mínimo necesario para que el eje del motor comience a girar, y le corresponde una velocidad mínima . Abajo de este valor, el eje del motor no gira, debido al par de despegue, producido por la

fricción en la transmisión, el rodamiento, los anillos del colector, etc. y debido al par de saliencia,

que es típico en motores DC con imanes permanentes. La velocidad máxima representa el voltaje de entrada máximo del motor. Debido a que los controladores Arduino Uno y Arduino Mega no tienen salidas analógicas reales, la variable de control continua 𝜔𝑖 se genera usando modulación por ancho de pulso (Pulse-width modulation, PWM). Esta modulación varía la relación entre el tiempo

encendido (𝜏) y el periodo fijo (𝑇) de una serie de pulsos, que se llama factor de duración (duty

cycle):

𝑑 =𝑇𝜏 ( 5 )

(13)

Figura 7: Modulación por ancho de pulso

El motor driver L298N convierte la variable de control al voltaje de entrada del servomotor. Si el 𝜑𝑒< 𝜑̅𝑒, entonces se frena el motor activo, para detenerlo lo más rápido posible. A través de

(14)

El esquema principal del control de posición en bucle cerrado muestra Figura 8.

Figura 8: Control de posición en bucle abierto

Este control en bucle abierto tiene la característica principal, que no calcula el error absoluto de la posición 𝜑𝑒 y por eso no requiere la implementación de un controlador. La variable de control 𝜔𝑖 se genera simplemente por un perfil trapezoidal estático:

Figura 9: Perfil trapezoidal para la variable de control

(15)

5

Algoritmo de control de velocidad

5.1

Determinación de la velocidad actual

Por definición se necesita de una referencia de tiempo para poder controlar cualquier parámetro relacionado con la velocidad. El temporizador interno (Timer1) de un microcontrolador se puede utilizar para llamar una sub-rutina. Dicha sub-rutina es del tipo ISR (Service interrupt routine) y es llamada por el temporizador interno a un intervalo especificado por el usuario. En este caso será cada 10 ms. La ISR será llamada sin importar lo que esté realizando el algoritmo, siempre y cuando no esté realizando otra rutina de interrupción de prioridad más alta. La interrupción que provoca la llamada de la ISR es de tipo hardware al ser producida por el temporizador interno. La manera en que se causa esta interrupción se puede apreciar de manera gráfica en la siguiente Figura 10.

(16)

Figura 10: Interrupción de hardware

Una vez llamada la ISR se puede aprovechar la diferencia de tiempo constante entre interrupciones de 10ms para calcular la velocidad. Para ello se debe medir la diferencia en la posición del motor que ocurrió en el intervalo entre interrupciones.

Δ𝑃𝑜𝑠 = 𝑃𝑜𝑠. 𝐴𝑐𝑡𝑢𝑎𝑙 − 𝑃𝑜𝑠. 𝐴𝑛𝑡𝑒𝑟𝑖𝑜𝑟 ( 6 )

Ahora que se tiene el diferencial de posición y de tiempo se puede calcular la velocidad actual en revoluciones por minuto:

𝑉𝑒𝑙𝑜𝑐𝑖𝑑𝑎𝑑 = Δ𝑃𝑜𝑠 ∙ 1000.0 ∙ 60.0Δ𝑇 ∙ 𝑝𝑝𝑟 ⋅ 𝑛 [𝑟𝑝𝑚] ( 7 )

Para mayor información acerca del funcionamiento del temporizador interno y como utilizarlo para generar interrupciones se recomienda consultar:

(17)

5.2

Control de velocidad en bucle cerrado

Para un control en bucle cerrado se utilizará un mecanismo de control conocido como PID (Proporcional-Integral-Derivativo). Dicho mecanismo de control funciona calculando una variable de error (la diferencia entre lo deseado y lo que se tiene) y aplicando correcciones proporcionales, derivativas o integrales para lograr la respuesta deseada.

Figura 11: Diagrama de bloques de un sistema PID

Al ya saber cómo medir la diferencia de pulsos en intervalos definidos, ahora sólo falta definir una variable de referencia (o pulsos por intervalo deseados) y las constantes 𝐾𝑃 y 𝐾𝐼 para poder aplicar el sistema PID. Se debe notar que se evitará utilizar el factor derivativo de compensación debido a que provoca una respuesta inestable. Aunque tiene su lugar en otras aplicaciones el factor derivativo no es muy útil en sistemas donde no se desea una respuesta rápida, para mayor información acerca del por qué no se utiliza el factor derivativo en este caso se puede consultar:

 http://www.controleng.com/search/search-single-display/understanding-derivative-in-pid-control/4ea87c406e.html

Las constantes 𝐾𝑃 y 𝐾𝐼 se pueden definir de manera arbitrariamente y posteriormente calibrarlas a manera experimental hasta tener la respuesta deseada en el sistema. Una vez definidas se sigue la siguiente ecuación para calcular la respuesta de salida:

𝑦(𝑡) = 𝐾𝑝 𝑒(𝑡) + 𝐾𝑖 ∫ 𝑒(𝑡)𝑑𝑡𝑡

𝑜

(18)

Figura 12: Diagrama de bloques de un sistema PI

Para implementar la parte integral del PI simplemente se puede ir sumando cada interrupción (10 ms) la variable de error multiplicada por Ki a una variable que vaya acumulando el valor. Obtenida la respuesta integrativa, se puede sumar con la respuesta proporcional para obtener los pulsos por minuto deseados. Este valor se debe convertir a un compatible para una salida PWM (analog write) que va de 0 a 255, donde 255 representaría el voltaje máximo y por ende la velocidad máxima del motor. Por ejemplo si se define 10,000 rpm como velocidad máxima, 255 en la salida PWM idealmente resultaría en esa velocidad. Por lo que si se obtiene 8,800 como la salida de la ecuación (8) se debe convertir a un valor entre 0 y 255 para poder ser utilizada en la función PWM.

Para mayor información acerca de mecanismos PI se puede consultar la siguiente página:

(19)

5.3

Control de velocidad en bucle abierto

Para el control de velocidad en bucle abierto de un motor DC se deben considerar pocas cosas. Debido a que dichas consideraciones ya fueron cubiertas en el control en bucle cerrado, será muy simple realizar un algoritmo para un sistema de control en bucle abierto. Utilizando la función analog write del Arduino y los datos tomados de la hoja de datos del motor utilizado, se puede elaborar un simple algoritmo que gire el motor hacia un lado o hacia el otro. A continuación se presenta el esquema de la estructura del sistema de control en bucle abierto (Figura 12) donde 𝜔𝑜 representa la velocidad de salida.

(20)

6

Reporte de práctica

Al final de la práctica cada equipo tiene que elaborar y entregar un reporte. El reporte contiene una parte escrita y un video tomado de la experimentación. El video muestra el funcionamiento del control de posición / velocidad del motor DC juntos con explicaciones técnicas sobre el hardware usado y dura mínimo unos 5 min. Este video se deberá subir a la página de YouTube (o una página equivalente) incluir el link en el reporte. Dicho reporte deberá contener lo siguiente:

1. Introducción y Objetivo

2. Hardware usado (Arduino, motor driver y motor)

3. Software usado (para programar el Arduino, para programar el Interfaz)

4. Explicación de su algoritmo implementado (medición de los pulsos, cálculo de la variable de control, comunicación con Interfaz, Hardware + Software interrupt, etc.)

5. Corta descripción del uso de su Hard- y Software (como manual)

6. Experimentación del posicionamiento / control de velocidad juntos con datos experimentales en forma tabular y grafica (grafica de la posición / velocidad con respecto al tiempo)

7. Resultados de la práctica (cuales fueron retos más importantes, donde se puede aplicar este conocimiento después, que aprendieron nuevo en esta práctica, etc…)

8. Conclusiones (trabajos futuros que se tienen que hacer, recomendación para realizar mejor la práctica, etc.)

9. Video de la explicación

(21)

7

Materiales necesarios

Para la realización de esta actividad los alumnos pueden integrarse en equipos con un máximo de tres personas y deben conseguir los siguientes materiales. Cada equipo puede decidir, con cual proveedor van a comprar los materiales, solamente tienen que asegurar que compren el servomotor descrito a continuación. El Arduino será preferentemente el Arduino Uno o Arduino Mega y el motor driver es opcional.

7.1

Servomotor

El servomotor consiste en un motor Pololu #2821 (11,000 rpm a 12 V), un engranaje y un

codificador rotatorio (encoder incremental) integrado. El codificador brinda una resolución de 64 pulsos por revolución, asegurando un control de posición o velocidad preciso. El motor está disponible en el laboratorio de mecatrónica.

https://www.pololu.com/product/2821

(22)

Se puede usar cualquier plataforma Arduino, por ejemplo Arduino Uno o Arduino Mega 2560:

Figura 11: Arduino Mega 2560 Figura 12: Arduino Uno

7.3

Motor Driver (opcional)

La compra de la siguiente tarjeta no es obligatoria, se puede armar el circuito usando dos circuitos integrados L298N. Ese circuito amplifica la variable de control del Arduino a una potencia ideal para el servomotor. Se recomienda la compra de la siguiente tarjeta:

http://www.ebay.com/itm/L298N-Dual-H-Bridge-DC-Motor-Driver-Board-For-Arduino-Robot-Smart-Car-Green-/401058330162

(23)

8

Fuentes de información

8.1

Arduino Uno

 https://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduino-uno-faq

Información interesante acerca del Arduino UNO y las diferencias entre sus versiones, así como una sección de Preguntas Frecuentes Contestadas.

 https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

Diagrama esquemático de las conexiones del Arduino UNO al AtMega329.

 http://www.prometec.net/arduino-en-protoboard/

 http://www.gammon.com.au/forum/?id=11637

Arduino Uno en protoboard.

8.2

Microcontrolador ATmega

 https://hekilledmywire.wordpress.com/2011/01/05/using-the-usartserial-tutorial-part-2/

Comunicación serial USART en atmega328P

 https://sites.google.com/site/qeewiki/books/avr-guide/usart

Comunicación Serial USART: teoría y ejemplos Atmega 8

8.3

Encoder

 http://playground.arduino.cc/Main/RotaryEncoders

Lectura de un encoder con Arduino

 http://www.pjrc.com/teensy/td_libs_Encoder.html

(24)

 http://electronilab.co/tutoriales/tutorial-de-uso-driver-dual-l298n-para-motores-dc-y-paso-a-paso-con-arduino/

Tutorial del uso del módulo Driver L298N para motores de DC y paso a paso, incluye ejemplos de código y diagramas de conexión.

 https://www.arduino.cc/en/pmwiki.php?n=Tutorial/SecretsOfArduinoPWM

Explicación teórica de PWM, ejemplos de aplicaciones en Arduino y ejemplos en código de programación directo en los registros.

 http://withinspecifications.30ohm.com/2014/02/20/Fast-PWM-on-AtMega328/

Fast PWM en atmega328 con código en registros.

 https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328

PWM con registros, teoría y ejemplos para AtMega328, pwm con timers 0, 1 y 2.

8.5

Timers

 https://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/

Timers: introducción, teoría, descripción de registros, ejemplos.

 http://blog.oscarliang.net/arduino-timer-and-interrupt-tutorial/

Timers e Interrutps tutorial con registros: introducción, teoría, ejemplos.

 http://maxembedded.com/2011/07/avr-timers-ctc-mode/

(25)

8.6

Programación y GUI

 http://www.visualmicro.com/page/Arduino-for-Atmel-Studio.aspx

Programar el Arduino con Atmel Studio con la extensión Visual Micro para una programación amigable y profesional

 http://csharp.simpleserial.com

Programar la interface con el usuario en C# y Windows Forms, donde les mando esta página para poder iniciar aprender C#.

8.7

Matlab y Simulink

 http://www.multion.com.mx/micrositios/matlab/inicio.html

Introducción a Matlab y Simulink

8.8

LabView

 http://www.ni.com/tutorial/12944/es/

Control de Ciclo Cerrado con LabVIEW y un Motor DC

8.9

Control PID

 http://www.controleng.com/search/search-single-display/understanding-derivative-in-pid-control/4ea87c406e.html

 http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

Imagem

Referências

  1. https://www.openimpulse.com/.
  2. https://en.wikipedia.org/wiki/Serial_port
  3. http://playground.arduino.cc/Main/InterfacingWithHardware#Serial
  4. https://www.arduino.cc/en/Reference/Serial
  5. https://www.arduino.cc/en/Tutorial/SerialEvent
  6. https://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners
  7. http://www.ni.com/tutorial/3511/en/
  8. https://en.wikipedia.org/wiki/Interrupt_handler
  9. https://www.arduino.cc/en/Reference/attachInterrupt
  10. http://playground.arduino.cc/Main/RotaryEncoders
  11. http://playground.arduino.cc/Code/Timer1
  12.  http://www.controleng.com/search/search-single-display/understanding-derivative-in-pid-control/4ea87c406e.html
  13. http://www.controleng.com/search/search-single-display/understanding-derivative-in-pid-control/4ea87c406e.html
  14. http://www.brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
  15. https://learn.adafruit.com/arduino-tips-tricks-and-techniques/arduino-uno-faq
  16. https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf
  17. http://www.prometec.net/arduino-en-protoboard/
  18. http://www.gammon.com.au/forum/?id=11637
  19. https://hekilledmywire.wordpress.com/2011/01/05/using-the-usartserial-tutorial-part-2/
  20. https://sites.google.com/site/qeewiki/books/avr-guide/usart
  21. http://www.pjrc.com/teensy/td_libs_Encoder.html
  22.  http://electronilab.co/tutoriales/tutorial-de-uso-driver-dual-l298n-para-motores-dc-y-paso-a-paso-con-arduino/
  23. http://electronilab.co/tutoriales/tutorial-de-uso-driver-dual-l298n-para-motores-dc-y-paso-a-paso-con-arduino/
  24. https://www.arduino.cc/en/pmwiki.php?n=Tutorial/SecretsOfArduinoPWM
  25. http://withinspecifications.30ohm.com/2014/02/20/Fast-PWM-on-AtMega328/
  26. https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
  27. https://arduinodiy.wordpress.com/2012/02/28/timer-interrupts/
  28. http://blog.oscarliang.net/arduino-timer-and-interrupt-tutorial/
  29. http://maxembedded.com/2011/07/avr-timers-ctc-mode/
  30. http://www.visualmicro.com/page/Arduino-for-Atmel-Studio.aspx