0% encontró este documento útil (0 votos)
133 vistas6 páginas

Proyecto Final Control Industrial

Este documento presenta el proyecto final de un péndulo invertido controlado. Describe los componentes clave como el sensor de ángulo, la base y el brazo del péndulo, la placa Arduino Mega 2560 y Raspberry Pi 3 para el control, y el motor DC. Explica que se realizó un reporte de los materiales y su costo antes de comprarlos. También presenta el desarrollo inicial del proyecto como la elección de los materiales para la base y el brazo, así como el diseño en Solidworks.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
133 vistas6 páginas

Proyecto Final Control Industrial

Este documento presenta el proyecto final de un péndulo invertido controlado. Describe los componentes clave como el sensor de ángulo, la base y el brazo del péndulo, la placa Arduino Mega 2560 y Raspberry Pi 3 para el control, y el motor DC. Explica que se realizó un reporte de los materiales y su costo antes de comprarlos. También presenta el desarrollo inicial del proyecto como la elección de los materiales para la base y el brazo, así como el diseño en Solidworks.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

1

Control Industrial
Proyecto Final
Péndulo Invertido
Corona Martínez Rodrigo, [email protected], Duarte Jasso Jonathan, [email protected],
Gómez Montenegro Antoni de Jesús, [email protected], Nájera Linares Emmanuel
Iván, [email protected].

Universidad de Guanajuato
Profesor:
Dr. Felipe de Jesús Torres del Carmen
Fecha: domingo
07 de junio del 2020

Objetivo—

I. INTRODUCCIÓN
El trabajo presente consiste en el desarrollo de las actividades de
diseño asistido por el ordenador, simulación del modelo
propuesto, aplicación de un sistema de control y construcción del
modelo de un péndulo invertido con rueda de reacción, accionada
por un motor eléctrico de corriente continua. El control de
sistemas inestables para lograr estabilidad es de vital importancia
en la construcción de maquinaria de utilidad para la vida diaria
de las personas, como son los vehículos de transporte y satélites
de comunicación. Por estos motivos se ha elegido un sistema Fig. 1. Sensor de tipo resistivo o potenciómetro
inestable para la investigación y desarrollo de un sistema de
control sobre un prototipo. Se realiza una investigación previa y
modelo matemático para posterior comparación con el sistema
Material a utilizar para base y brazo: En el caso de la
físico simulado, para confirmar que el comportamiento de ambos base de nuestro péndulo se optó por una placa de solera de
es similar. Para simular el sistema físico se implementa además aproximadamente 30 cm x 40 cm (Fig. 2), ya que es un material
un sistema de control para realizar la estabilización de este en pesado y resistente para que el brazo del péndulo no tenga
una posición vertical, seguir señales referencias distintas y movimiento en la base. En el primer avance se había optado por
rechazar las perturbaciones que pueda sufrir este en el entorno una caja de metal (Fig. 3) pero el diseño de la base y el brazo no
real. Luego de realizar las simulaciones y cambios necesarios en nos parecieron buenos, ya que para empezar la caja no tendría el
el modelo 3D diseñado con Solidworks, se procede con la peso óptimo para resistir con el brazo del péndulo y su
implementación real del sistema y los ajustes pertinentes al movimiento, además se tendría que montar sobre la orilla de
sistema de control para lograr los resultados deseados. Se algún mueble con superficie plana.
comparan estos resultados entonces con los de la simulación para
que tan similares o no son estos y proponer algunas conjeturas
sobre el porqué de estas.

II. MARCO TEÓRICO

Primeramente, hablaremos de los componentes


más destacados del proyecto:

Sensor de ángulo y rotación: Existe una gran variedad


de sensores de ángulo y rotación, para la medida de ángulo,
rotación angular o posición angular. Las diferentes variantes
afectan tanto al tipo de tecnología para realizar la medida, como Fig. 2. placa de solera de aproximadamente 30 cm x 40 cm
al formato del sensor. En el caso de nuestro péndulo se utilizaría
un sensor de tipo resistivo o potenciómetro (Fig. 1), ya que se nos
hizo más facil de utilizar y además es más económico.
2

Fig. 3. caja de metal Fig. 5. Arduino Mega 2560

Ahora la parte del brazo se pensó desde un inicio reutilizar


láminas de plástico transparente de 5 cm x 20 cm Raspberry Pi 3 Model B+: El Raspberry Pi 3 Model B+
aproximadamente, ya que ya se contaban con ellas y además se
(Fig. 6) es el último producto de la gama Raspberry Pi 3, que
nos hicieron algo ligeras y resistentes para que el motor pudiera
cuenta con un procesador de cuatro núcleos de 64 bits que
moverlas sin mucho esfuerzo (Fig. 4).
funciona a 1,4 GHz, doble banda de 2.4GHz y 5GHz LAN
inalámbrica, Bluetooth 4.2 / BLE, Ethernet más rápida y PoE
capacidad a través de un PoE HAT separado. La LAN
inalámbrica de banda dual viene con una certificación de
cumplimiento modular, lo que permite que la placa se diseñe en
productos finales con pruebas de cumplimiento de LAN
inalámbrica significativamente reducidas, lo que mejora el costo
y el tiempo de comercialización. El Raspberry Pi 3 Model B +
mantiene la misma huella mecánica que el Raspberry Pi 2 Model
B y el Raspberry Pi 3 Model B.

Fig. 4. Brazo del péndulo

Arduino ATMEGA2560: El Arduino Mega 2560 (Fig. 5)


es una placa de microcontrolador basada en el ATmega2560.
Tiene 54 pines de entrada / salida digital (de los cuales 15 se
pueden usar como salidas PWM), 16 entradas analógicas, 4
UART (puertos serie de hardware), un oscilador de cristal de 16
MHz, una conexión USB, un conector de alimentación, un Fig. 6. Raspberry Pi 3 Model B+
encabezado ICSP, y un botón de reinicio. Contiene todo lo
necesario para soportar el microcontrolador; simplemente
conéctelo a una computadora con un cable USB o enciéndalo con Motor RS445PA14233R (Fig 7):
un adaptador de CA a CC o una batería para comenzar. La placa
Mega 2560 es compatible con la mayoría de los escudos Voltaje de alimentación: 12-42V
diseñados para la Uno y las placas anteriores Duemilanove o Corriente de suministro: 60mA - 1.5A
Diecimila. Potencia: 7.78W
torque: 81,8 mNm
Diámetro del eje: 3.17mm
Diámetro del motor: 30mm
Longitud del motor: 67mm
Rotación max: 6500/min
3
 la pila tipo de 12 volts es la
encargada de suministrar la
energía al puente h y también
se encarga de suministrar un
PILA LIPO amperaje adecuado mediante
12V(1300 las tablas del motor de DC para
mA) $540.00 su funcionamiento
 usaremos un switch
únicamente para el encendido
Fig. 7. MotorRS445PA14233R
y el apagado del motor ya que
en ocasiones podemos dejar
conectar la pila y se desgastará
III. DESARROLLLO SWITCH $3.00 o se bajará su voltaje
 el motor de C de 12 volts es el
Lo primero en proyecto fue realizar un reporte de todo el material encargado de mover
a utilizar (sin comprar los componentes aún) para el péndulo nuestropéndulo de acuerdo a
invertido, ya que necesitábamos saber el precio de cada MOTO lo que el código le indique
componente, así como saber cuál nos convendría más para RS445PA1 mediante los pulsos y mediante
montar el prototipo y con qué ya se contaba como lo fue el caso
4233R el ángulo que deseamos
de los brazos de láminas de platico que ya se tenían. A lo que se
llegó fue a lo siguiente **: 12 V – 24 V $250.00 obtener
 el conector de 9 volts lo
Materiales Costos Descripción usaremos para alimentar
Hélices $50.00 nuestro controlador ya que las
 El arduino ATMEGA2560 se terminales de la pila de nuevos
usará primero para suplir el CONECTOR son complicadas de conectar
convertidor de analógico a 9V $5.00 con un solo jumper
digital y a la vez se
TOTAL= $1048.00
Arduino $ 0.00 implementará el código para
ATMEGA- (ya se qué de ahí el motor controle las * En el caso del sensor de rotación se tenía planeado utilizar el
2560(GEN contaba medidas de los ángulos para MPU6050, pero posteriormente se optó por un sensor de tipo
ERICO ) con él) nuestro péndulo invertido potenciómetro (Fig. 8), ya que nos sería más fácil de utilizar,
 usaremos un giroscopio como conseguir en el mercado y adaptar a nuestro prototipo de
sensor para medir el SolidWorks y el precio es parecido al del giroscopio. En el caso
de la pila lipo de $540, se podría sustituir por una fuente del
movimiento angular que
laboratorio y ahorrarnos estos $540.
nuestro sistema debe tener por
medio del giroscopio recibirá ** Tabla de nuestro prototipo para el control del péndulo
ese desplazamiento angular y invertido con Arduino.
lo adaptará al que nosotros
MPU6050 $35.00 ingresemos
 usaremos un puente h para
controlar el motor y la
velocidad en la cual debe girar
y también esto nos beneficiará
con el código y el giroscopio
para ver cuanto voltaje se debe
L298N $50.00 ingresar
Jumpers los usaremos para
hacer la conexión entre los
dispositivos electrónicos y
JUMPERS $26.00 nuestro controlador el arduino
Fig. 8. Sensor de tipo potenciómetro
 Usaremos una pila de 9 volts
recargable para alimentar El código que implementaría es un código ya desarrollado y
nuestro controlador y aparte extraído de GitHub para el balanceo de un robot implementamos
necesitas recargable ya que este código ya que es muy parecido al funcionamiento de un
PILA DE 9V como se usará varias veces es péndulo invertido lo que se cambió en el código ya mencionado
(RECARCA necesario estar recargando sería nada más el desplazamiento angular en el cual debe
BLE) $94.00 para no comprar más pilas mantenerse nuestro péndulo invertido, También eliminaremos el
4
uso de 2 motores ya que para un robot balancín se ocupa dos volatile bool mpuInterrupt = false; // indicates whether MPU
motores que hagan girar las ruedas en este caso nosotros solo interrupt pin has gone high
usaremos un único motor el cual permitirá establecer una sola void dmpDataReady()
salida del puente h y se cambia en el código las variables {
constantes para los motores que en este caso sería motor derecha mpuInterrupt = true;
y todo lo que conlleve esta variable. }

CÓDIGO con el que se trabajaría:

#include <PID_v1.h> void setup()


#include <LMotorController.h> {
#include "I2Cdev.h" Serial_2.begin(9600); // inicia el puerto serial para
#include "MPU6050_6Axis_MotionApps20.h" comunicacion con el Bluetooth
#include <SoftwareSerial.h> //Serial.begin(9600);
#if I2CDEV_IMPLEMENTATION == // join I2C bus (I2Cdev library doesn't do this automatically)
I2CDEV_ARDUINO_WIRE #if I2CDEV_IMPLEMENTATION ==
#include "Wire.h" I2CDEV_ARDUINO_WIRE
#endif Wire.begin();
#define MIN_ABS_SPEED 30 TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
MPU6050 mpu; #elif I2CDEV_IMPLEMENTATION ==
double MotorVelocidadIzq = 0.5; //double MotorVelocidadIzq = I2CDEV_BUILTIN_FASTWIRE
0.3; Fastwire::setup(400, true);
double PuntoEquilibrio = 180.8; #endif
SoftwareSerial Serial_2 (4, 3);//SoftwareSerial Serial_2 (1, 0);
//-----------------Control de Motores mpu.initialize();
int IN1 = 6;
int IN2 = 7; devStatus = mpu.dmpInitialize();
double Kp = 60; //double Kp = 60;
double Kd = 3.5; //double Kd = 2.2; // supply your own gyro offsets here, scaled for min sensitivity
double Ki = 250; //double Ki = 270; mpu.setXGyroOffset(220);
int estado = 'g'; // inicia detenido mpu.setYGyroOffset(76);
// MPU control/status vars mpu.setZGyroOffset(-85);
bool dmpReady = false; mpu.setZAccelOffset(1788); // 1688 factory default for my test
uint8_t mpuIntStatus; chip
uint8_t devStatus;
uint16_t packetSize; // make sure it worked (returns 0 if so)
uint16_t fifoCount; if (devStatus == 0)
uint8_t fifoBuffer[64]; {
Quaternion q; // turn on the DMP, now that it's ready
VectorFloat gravity; mpu.setDMPEnabled(true);
float ypr[3];
double originalSetpoint = PuntoEquilibrio; //double // enable Arduino interrupt detection
originalSetpoint = 172.50; attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
double setpoint = originalSetpoint;
double movingAngleOffset = 0.1; // set our DMP Ready flag so the main loop() function knows it's
double input, output; okay to use it
dmpReady = true;

PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT); // get expected DMP packet size for later comparison
packetSize = mpu.dmpGetFIFOPacketSize();
double motorSpeedFactorLeft = MotorVelocidadIzq; //double
motorSpeedFactorLeft = 0.6; //setup PID
double motorSpeedFactorRight = MotorVelocidadDer; //double pid.SetMode(AUTOMATIC);
motorSpeedFactorRight = 0.5; pid.SetSampleTime(10);
pid.SetOutputLimits(-255, 255);
}
LMotorController motorController(ENA, IN1, IN2, ENB, IN3, else
IN4, motorSpeedFactorLeft, motorSpeedFactorRight); {
// ERROR!
// 1 = initial memory load failed
5
// 2 = DMP configuration updates failed // get current FIFO count
// (if it's going to break, usually the code will be 1) fifoCount = mpu.getFIFOCount();
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus); // check for overflow (this should never happen unless our code
Serial.println(F(")")); is too inefficient)
} if ((mpuIntStatus & 0x10) || fifoCount == 1024)
} {
// reset so we can continue cleanly
void loop() mpu.resetFIFO();
{ Serial.println(F("FIFO overflow!"));

//********************************************** // otherwise, check for DMP data ready interrupt (this should
Control Blu ************************ happen frequently)
if(Serial_2.available()>0){ // lee el bluetooth y almacena en }
estado else if (mpuIntStatus & 0x02)
estado = Serial_2.read(); {
} // wait for correct available data length, should be a VERY short
if(estado=='a'){ // Boton desplazar al Frente wait
setpoint = (setpoint + 0.5); while (fifoCount < packetSize) fifoCount =
//Serial.println(originalSetpoint); mpu.getFIFOCount();
estado = 'g';
} // read a packet from FIFO
if(estado=='b'){ // Boton IZQ mpu.getFIFOBytes(fifoBuffer, packetSize);

estado = 'g'; // track FIFO count here in case there is > 1 packet available
} // (this lets us immediately read more without waiting for an
if(estado=='c'){ // Boton Parar interrupt)
setpoint = PuntoEquilibrio; fifoCount -= packetSize;

estado = 'g'; mpu.dmpGetQuaternion(&q, fifoBuffer);


} mpu.dmpGetGravity(&gravity, &q);
if(estado=='d'){ // Boton DER mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
input = ypr[1] * 180/M_PI + 180;
estado = 'g'; }
} }

if(estado=='e'){ // Boton Reversa Todo lo anterior es sólo como un prototipo de prueba antes de
setpoint = (setpoint - 0.5); entrar al prototipo final con la tarjeta Raspberry, ya que
primeramente lo queríamos montar y probar en un Arduino, ya
estado = 'g';
que tenemos mayor conocimiento sobre la programación y sus
} conexiones.

//********************************************** Fin Como todo lo anterior se realizó con un giroscopio MPU6050, lo


Control Blu ************************ siguiente era trabajar con el sensor de tipo resistivo
// if programming failed, don't try to do anything (potenciómetro), se tenía planeado caracterizar el sensor angular,
if (!dmpReady) return; esto para realizar una tabla de datos con diferentes posiciones de
nuestro brazo y así con forme el brazo estuviera en un ángulo
// wait for MPU interrupt or extra packet(s) available menor a 90° se le exigiría mayor número de RPM´s al motor para
while (!mpuInterrupt && fifoCount < packetSize) que este subiera hasta llegar a los 90°. Esto se realizaría primero
con la ayuda de Arduino que es el sistema en el que tenemos
{
mayor conocimiento sobre como programar y como usarlo. Una
//no mpu data - performing PID calculations and output to vez que tuviéramos el programa en Arduino con nuestro
motors prototipo armado se pretendía pasar todos los datos a la tarjeta de
pid.Compute(); Raspberry para realizar nuestro control desde esta. Además, se
motorController.move(output, MIN_ABS_SPEED); tendría que conectar un convertidor Analógico - Digital ADC
porque la Raspberry no cuenta con este convertidor.
}
*Se anexaran los archivos de SolidWorks en la carpeta que se
enviará.
// reset interrupt flag and get INT_STATUS byte
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
6

CONCLUSIONES

Primeramente, se planeó el diseño, construcción e


implementación de un péndulo invertido simple controlado por
una minicomputadora, pero debido a las condiciones
desarrolladas por la pandemia de decidió solo el diseño y
simulación de un dispositivo de péndulo invertido controlado por
Arduino.

Al final de este proyecto se puede destacar, la modalidad de


trabajo, y el uso de conocimientos:
• Selección de componentes electrónicos y mecánicos
• Diseño en Solid Works
• Programación de Arduino

Se debe aclarar que la mayor parte de este proyecto fue


planeado, ya que despues de la contingencia se nos hizo muy
dificil coincidir en un horario para planear el proyecto, puesto
que la mayoria del equipo trabajamos en estos meses en cosas
extraclase, y además algunos tenían clases de otras materias que
complicaban aún más los horarios para coincidir y platicar sobre
el proyecto.

REFERENCIAS:

Tesis:
[1] Osorio, A. Control de postura y rumbo en tiempo real de un
vehículo de auto-balanceo y estrategia de control de posición en
el plano [Mgtr Thesis]. Puebla, Pue: Benemérita Universidad
autónoma de pueba , 2017.
[2] Álvarez Erazo, F. X. (2019). Diseño y simulación de un
controlador para un péndulo invertido virtual ejecutando el
Middleware OROCOS e implementación del controlador en una
Raspberry Pi con comunicación al simulador (Master's thesis,
Quito, 2019.).
[3] Castro, Ó. M. (2017). CONTROL DE UN PÉNDULO
INVERTIDO MEDIANTE FPGA (Doctoral dissertation,
UNIVERSIDAD POLITÉCNICA DE MADRID).
[4]Pincin, S. J. (2016). Diseño, construcción y control de un
robot balancín (Doctoral dissertation, Universidad Nacional de
Cuyo).
Morell Mirasol, F. J. (2019). Diseño, implementación y control
de un péndulo invertido rotacional (Doctoral dissertation).
[5] Luna, F. C. (2003). Levantamiento y Estabilización del
Péndulo Invertido. Centro de Investigación y de Estudios
Avanzados del Instituto Politécnico Nacional, Departamento de
Control Automático.
[6] Osorio Zúñiga, C. A. Diseño, construcción y control de un
péndulo invertido rotacional utilizando técnicas lineales y no
lineales/Design, construction and control of a rotational inverted
pendulum using linear and nonlinear techniques (Doctoral
dissertation, Universidad Nacional.

También podría gustarte