Sistema de Programación de Máquinas Rectilínieas 621381E74
Sistema de Programación de Máquinas Rectilínieas 621381E74
Sistema de Programación de Máquinas Rectilínieas 621381E74
PRESENTADO POR:
DANIEL ESCAMILLA GUTIÉRREZ
SEBASTIAN MOSQUERA MUÑOZ
1
IMPLEMENTACIÓN DE UN SISTEMA DE PROGRAMACIÓN DE MÁQUINAS
RECTILÍNEAS PARA LA FABRICACIÓN DE CUELLOS TEJIDOS.
PRESENTADO POR:
DANIEL ESCAMILLA GUTIÉRREZ
SEBASTIAN MOSQUERA MUÑOZ
DIRECTOR:
2
Pereira 24 de Febrero 2016
3
RESUMEN
Este documento pretende explicar las metodologías implementadas para reemplazar el sistema
actual de programación de las máquinas SCOMAR A80, el cual consiste en un conjunto de partes
mecánicas que mueven una cadena formada por eslabones y que en ella se distribuyen una
cantidad de pines que activan simultáneamente un conjunto de bobinas de acuerdo con el sentido
que la máquina lleve según el patrón de diseño que se requiera, estos pines pasan por un arreglo
de finales de carrera fijos que al accionarse permite el paso de corriente a cada una de las bobinas
conectadas al carro de la máquina. Para eso, se diseña una tarjeta electrónica que permita
reemplazar el accionar mecánico que tienen los finales de carrera por uno electrónico reduciendo
así el desgaste y las fallas, aumentando la velocidad de respuesta y la producción.
Para realizar el cambio de la cadena y los pines en la programación de la máquina se diseña una
aplicación usando el software QT Creator el cual permite programar en lenguaje C++, con la gran
ventaja de que la programación es orientada a objetos y con entorno gráfico, de esta manera
poder tener una aplicación intuitiva que facilite el diseño de cada prenda y la programación de la
máquina.
4
AGRADECIMIENTOS
Agradezco la paciencia, empuje y esfuerzo de mis padres FRAY MARTIN ESCAMILLA, BEBI GUTIERREZ que
siempre han querido que sobresalga en todos los retos a los cuales me he enfrentado y me han brindado las
herramientas para poderlo lograr, a DIOS por guiar mi camino y poner a mi alcance todo para ser cada día una
mejor persona y poder alcanzar mis sueños y mis metas. También a mi hijo ALEJANDRO ESCAMILLA que ha
tenido que aguantar mi ausencia en ciertos momentos en los cuales los he dedicado a mi estudio y es la persona que
sigue mis pasos por tal motivo es mi principal inspiración, a mi compañera, amiga y esposa ALEXANDRA
COLORADO quien es la persona que ha estado acompañándome en todo momento y es quien me ha animado a
poder terminar con este proyecto, mi hermano DAVID ESCAMILLA por su apoyo incondicional. Al M. Sc.
MAURICIO HOLGUIN LONDOÑO por ayudarnos y creer en este proyecto además de guiarnos como director de
nuestra tesis, al M. Sc. EDWIN ANDRES QUINTERO SALAZAR por su excelente gestión como director del
programa de Ingeniería Electrónica y brindarnos todas las herramientas para poder hacer realidad este proyecto.
Mis amigos, familiares, profesores y demás compañero de la Universidad que de una y otra manera han aportado a
mi formación personal, técnica y profesional que sin ellos hoy no podría alcanzar esta meta.
Agradezco a Dios ya que solo él traza nuestro camino. A mis padres GABRIEL MOSQUERA y CONSUELO
MUÑOZ, por darme el apoyo incondicional, porque han dado todo su esfuerzo para qué pueda cumplir mis metas,
por la excelencia y sabiduría inculcadas siempre en mí. A mis hermanos, TOMAS MOSQUERA MUÑOZ y DAVID
MOSQUERA MUÑOZ, por siempre estar ahí cuando lo requiero, por demostrarme día a día que siempre se puede
ser mejor. Mis Abuelos JUAN BAUTISTA MUÑOZ y MARIA CENELIA JIMENEZ, por enseñarme, que a pesar de
los años, se puede seguir soñando, creciendo y trabajando, MARIA OLEGARIA MOSQUERA y JOSÉ ALVARO
MOSQUERA, que desde el cielo me brindan su fuerza. A las personas que me apoyaron durante mi estadía en la
ciudad de Pereira, mi familia, mis amigos que se convirtieron en familia, mis compañeros de Universidad,
profesores y demás personas que conocí durante este tiempo, ya que gracias a ellos disfrute cada día en esta ciudad
y pase los mejores años de mi vida, hasta ahora. AL M. Sc. MAURICIO HOLGUÍN LONDOÑO por enfocarnos
hacia el mejor camino durante casi toda nuestra carrera, por apoyarnos en este proyecto y compartir sus
conocimientos y experiencia con nosotros. Al director del Programa de Ingeniería Electrónica, M. Sc EDWIN
ANDRES QUINTERO SALAZAR, porque siempre se preocupó por brindarnos todas las herramientas a su alcance
para lograr esta meta. A DANIEL ESCAMILLA GUTIERREZ, mi compañero de proyectos, mi amigo, agradezco su
compromiso y su entrega y ante todo, su paciencia, aunque este camino no ha sido fácil siempre he contado con su
apoyo. Esté es solo uno de los tantos proyectos que hemos realizado y sé que con la ayuda de Dios realizaremos
muchos más.
5
Tabla de contenido
6
13.1.1 Tarjeta de relés ....................................................................................................... 28
13.1.2 Tarjeta de distribución de conexiones .................................................................. 30
13.1.3 Tarjeta de acondicionamiento de sensores ........................................................... 30
14. SISTEMA DE PROGRAMACIÓN ................................................................................. 32
14.1 REQUERIMIENTOS Y RESTRICCIONES.............................................................. 32
7
18. CONCLUSIONES ............................................................................................................. 55
19. BIBLIOGRAFIA ............................................................................................................... 59
ANEXOS ....................................................................................................................................... 61
ANEXO 1: MODELOS DE LA RASPBERRY, DESCRIPCIÓN DE COMPONENTES Y
CONFIGURACIÓN E INSTALACIÓN DEL SISTEMA OPERATIVO. .......................... 62
Índice de figuras
8
Figura 16. PCB de la tarjeta de relés .......................................................................................... 30
Figura 17. PCB de la tarjeta de distribución de conexiones..................................................... 30
Figura 18. Esquemático circuito de acondicionamiento de sensores inductivos .................... 31
Figura 19. PCB circuito de acondicionamiento de sensores inductivos .................................. 32
Figura 20. Arquitectura del sistema ........................................................................................... 33
Figura 21. Diagrama de flujo de la clase cantidad .................................................................... 34
Figura 22. Diagrama de flujo de la clase thread sensores ........................................................ 35
Figura 23. Diagrama de flujo de la clase cargar programa ..................................................... 35
Figura 24. Diagrama de flujo de la clase copiar ........................................................................ 36
Figura 25. Diagrama de flujo de la clase guardar archivo ....................................................... 37
Figura 26. Diagrama de flujo de la clase modificar ciclos ........................................................ 37
Figura 27. Diagrama de flujo de la clase programación ........................................................... 38
Figura 28. Pantalla principal de la interfaz de programación ................................................. 39
Figura 29. Pantalla de creación y cargue de programas de la interfaz de programación ..... 40
Figura 30. Módulo de edición ...................................................................................................... 41
Figura 31. Definir cantidad ......................................................................................................... 42
Figura 32. Pantalla principal en funcionamiento con un programa cargado......................... 43
Figura 33. Diagrama de flujo inicio básico del sistema ............................................................ 43
Figura 34. Diagrama de flujo del funcionamiento del sistema ................................................. 44
Figura 35. Conexión pantalla y Raspberry Pi ........................................................................... 45
Figura 36. Medidas base de instalación ...................................................................................... 46
Figura 37. Pantalla en base.......................................................................................................... 46
Figura 38. Módulo de operación ................................................................................................. 46
Figura 39. Medidas base sensores ............................................................................................... 47
Figura 40. Base y soporte de los sensores ................................................................................... 47
Figura 41. Caja de distribución de conexiones SCOMAR A80 ............................................... 48
Figura 42. Posición Tarjetas de Control .................................................................................... 48
Figura 43. Tarjeta de Relés ......................................................................................................... 48
Figura 44. Pantalla principal de la aplicación ........................................................................... 49
Figura 45. Tejido sin desprender ................................................................................................ 51
Figura 46. Cuello terminado ....................................................................................................... 51
9
Figura 47. Lista de diseños .......................................................................................................... 51
Figura 48. Sistema Operativo RASPBIAN ................................................................................ 68
Figura 49. Creación de nuevo proyecto en EAGLE .................................................................. 74
Figura 50. Creación de plano esquemático ................................................................................ 75
Figura 51. Panel de selección ....................................................................................................... 75
Figura 52. Tecla de selección “Add”........................................................................................... 75
Figura 53. Ventana de selección de elementos ........................................................................... 76
Figura 54. Selección de un elemento ........................................................................................... 77
Figura 55. Elementos en plano esquemático .............................................................................. 77
Figura 56. Conexión del circuito ................................................................................................. 78
Figura 57. Ventana del plano BRD ............................................................................................. 78
Figura 58. Ubicación de componentes ........................................................................................ 79
Figura 59. Tecla de selección "Auto" ......................................................................................... 79
Figura 60. Placa final ................................................................................................................... 80
Figura 61. Tecla de selección "Route" ....................................................................................... 80
Figura 62. Ejemplo de QWidget padre con hijos ...................................................................... 83
Figura 63. Jerarquía de memoria del QWidget de la figura 62 ............................................... 83
Figura 64. Conexiones entre signals y slots de diferentes objetos ............................................ 84
Figura 65. El flujo del MOC ........................................................................................................ 85
Figura 66. Código fuente genérico de un QObject (objeto Qt) ................................................ 85
Figura 67. Distribución de carpetas librerías MinGW ............................................................. 90
Figura 68. Progreso de instalación GNU toolchain ................................................................... 90
Figura 69 Nueva conexión SmarTTY ......................................................................................... 91
Figura 70. Datos de conexión Raspberry Pi con SmarTTY ..................................................... 91
Figura 71. Terminal remota Raspberry Pi con SmarTTY ....................................................... 92
Figura 72. Datos ingresados de ubicación de librerías y cabeceras ......................................... 93
Figura 73. Selección de conexión con Raspberry Pi guardada en el SmarTTY ..................... 93
Figura 74. Progreso de sincronización de librerías y cabeceras Raspberry - PC .................. 94
Figura 75. Configuración de conexión Qt Creator con Raspberry Pi ..................................... 94
Figura 76. Datos de configuración compilador GCC................................................................ 95
Figura 77. Configuración de Kits en el Qt Creator ................................................................... 95
10
Figura 78. Directorio de descargas librería WiringPi .............................................................. 97
Figura 79. Numeración Puertos GPIO Raspberry pi y su equivalente con la librería
WiringPi ................................................................................................................................. 99
Figura 80. Selección tipo de proyecto ....................................................................................... 104
Figura 81. Selección de Compilador y Depurador para el Proyecto ..................................... 105
Figura 82. Resumen de configuración del proyecto ................................................................ 105
Figura 83. Entorno de escritura del código fuente .................................................................. 106
Figura 84. Esquema de carpetas proyecto en el Qt Creator .................................................. 106
Figura 85. Editor de código fuente ........................................................................................... 107
Figura 86. Ventana de selección de archivos de tipo C++ ...................................................... 107
Figura 87. Ventana de selección de archivos de tipo Qt ......................................................... 108
Figura 88. Selección de los diferentes template ....................................................................... 109
Figura 89. Resumen de configuración y creación del nuevo archivo .................................... 109
Índice de tablas
11
CAPITULO I: INTRODUCCIÓN
12
sistema al ser tan mecánico está expuesto a derrame de sustancias como aceite, polvo, hilos que
pueden afectar el accionar de cada interruptor, haciendo que la prenda que se está tejiendo salga
con imperfecciones o en el peor de los casos ruptura en las agujas.
Adicional a esto para cambiar de diseño se necesita detener completamente la máquina para
retirar la cadena y modificar los pines en cada eslabón, según el diseño que se requiera, esto hace
que la máquina pierda productividad por el tiempo que dura detenida, así como también la
manipulación directa del operario es frecuente que se presente daños en el diseño, como también
en el sistema mecánico por mala ubicación de la cadena en el sistema.
Con el desarrollo de este proyecto de grado se quiere dar respuesta a la pregunta de si es posible
diseñar un sistema de programación en máquinas rectilínea que permita mejorar la manera en
cómo opera la máquina y facilitar la programación de la misma, ya que es una necesidad para la
empresa Tejidos del Risaralda LTDA el contar con un dispositivo que reemplace completamente
todo el sistema mecánico en la programación de las prendas en la máquina y facilitar la
manipulación por parte del operario, permitiendo mejorar la producción y disminuir las fallas.
2. JUSTIFICACIÓN
La industria textil maneja una gran gama de procesos que se destinan para dar a los hilos y a los
tejidos diferentes propiedades específicas. Uno de los procesos más importantes que se
encuentran en la industria, es el tejido de punto, esta técnica se caracteriza por ser un enlace de un
hilo, consigo mismo, mediante técnicas de bucles o mallas, estas técnicas conceden elasticidad y
extensibilidad al tejido.
La automatización en los procesos textiles, se genera en esta industria desde la era de la
revolución industrial, la máquina a vapor y el telar industrial, representaron el cambio principal
en la automatización de los procesos de confección que aún sigue en expansión. Una integración
de variables de automatización en entornos de desarrollo de textil, constituyen una alternativa que
facilita la implementación de nuevos desarrollos tecnológicos, por esto, su uso podría ayudar a la
creación proyectos enfocados a la regeneración de la industria textil a bajo costo.
El desarrollo de este proyecto permitirá a la empresa Tejidos del Risaralda LTDA contar un
sistema de programación para sus máquinas rectilíneas modelo SCOMAR A80 completamente
electrónico y programable a través de un teclado y una pantalla haciendo uso de un software
13
diseñado de acuerdo a las necesidades que se requieren, para monitorear y crear los patrones de
diseños de una manera más sencilla e intuitiva que mejoren la manipulación por parte de los
operarios y reduzcan las fallas presentadas por un mal diseño, este desarrollo permitirá reducir las
labores de mantenimiento al no tener que reemplazar piezas mecánicas, ni adquirir elementos que
ya son de difícil acceso en el mercado por ende su costo es amplio, permitiendo de esta manera
en un largo plazo cubrir el costo del desarrollo de acuerdo al ahorro en dinero que se obtiene por
la disminución en la compra de elementos que se dañan en el sistema actual de programación.
Con este proyecto se pretende desarrollar una aplicación que permita reemplazar todo el sistema
de programación mecánico de la máquina a través del diseño de una tarjeta electrónica que sea la
encargada de sustituir todos los switches electromecánicos y mediante una tarjeta de desarrollo
conectada a una pantalla táctil y un teclado ejecute un software con la capacidad de crear los
diferentes patrones de diseños y almacenarlos en el dispositivo, de igual forma cargarlos para que
se ejecuten en la máquina y poder visualizar a través de la pantalla la cantidad de prendas y
pasadas que lleva la máquina según el patrón de diseño que se esté ejecutando. Este software
contiene además la lógica necesaria para controlar a través de los puertos digitales de la tarjeta de
desarrollo la tarjeta de control diseñada, habilitando o deshabilitando secuencialmente cada una
de las bobinas conectadas en ella de acuerdo al patrón de diseño. Como el carro de la máquina
solo puede hacer cambios de estado de las bobinas en los extremos se ubican 2 sensores
inductivos en un lugar estratégico que permita con exactitud enviar una señal a la tarjeta de
desarrollo cada vez que la máquina llegue a un extremo.
14
3. OBJETIVOS
Diseño e implementación del sistema de control electrónico que permita, teniendo en cuenta
los requerimientos y restricciones, reemplazar el accionar mecánico en la programación de la
máquina por uno electrónico.
15
CAPITULO II: METODOLOGÍA
La máquina rectilínea SCOMAR A80 expuesta en la figura 1, es una máquina italiana diseñada
especialmente para realizar cuellos y puños para camiseta, polos y buzos, que cuenta con una sola
fontura, 4 guía Hilos, sensores de nudo, caída de tejido, desprendimiento de carro, ruptura de
hilo, algunos modelos poseen un contador electrónico de piezas otros poseen un tacómetro, la
máquina maneja una aguja galga 12. Las primeras máquinas fueron importadas a Colombia por
FUKUTEX S.A.S empresa de Medellín, actualmente es uno de los principales distribuidores de
maquinaria e insumos textil y de tejido de punto.
Por su velocidad, rendimiento, dimensiones, peso y fácil mantenimiento, son muy utilizadas en la
industria del tejido de puntos en Colombia
5. RASPBERRY PI
16
Figura 2. Raspberry PI
ARQUITECTURA
17
Figura 4. Dimensiones de la Raspberry PI B+
6. PANTALLA TÁCTIL
La “Raspberry Pi 7” Touch Screen Display” es una pantalla táctil diseñada especialmente para su
funcionamiento con la tarjeta de desarrollo computacional Raspberry Pi. En la figura 5 se puede
apreciar la pantalla y sus accesorios
Características generales
18
Tamaño de pantalla visible: 155 mm x 86 mm.
Resolución de pantalla: 800 x 480 pixeles.
Conexión al Raspberry Pi utilizando un cable plano conectado al puerto DSI.
Placa de adaptación: se utiliza para alimentar la pantalla y convertir las señales paralelas de la
pantalla al puerto serie (DSI) en la Raspberry Pi.
Los Relés de Estado Sólido (SSR. Solid State Relay) son unos componentes electrónicos
formados por un conjunto de elementos independientes dentro de un circuito impreso. El relé
permite el aislamiento eléctrico entre los circuitos de entrada y el circuito de salida, entre sus
funciones se encuentran, los detectores de paso por cero, la protección frente a transitorios, como
circuito de salida CA y como aislamiento asegurado generalmente a un acoplamiento óptico.
Características generales
MODELO HHG1-0/032F-20
19
Figura 6. Relé de estado sólido (SSR) / HHG!0/032F-20
8. DIODO ZENER
Un diodo Zener es básicamente un diodo de unión, pero construido especialmente para trabajar
en la zona de ruptura de la tensión de polarización inversa. En la figura 7 se encuentran descritos
su símbolo y aspecto físico.
20
Su principal aplicación es como regulador de tensión, es decir, como circuito que mantiene la
tensión de salida casi constante, independiente de las variaciones que se presenten en la línea de
entrada o del consumo de corriente de las cargas conectadas en la salida del circuito. La relación
voltaje – corriente, característica el diodo zener, se puede observar en la figura 8.
Si a un diodo Zener se le aplica una corriente eléctrica del ánodo al cátodo (polarización directa)
toma las características de un diodo rectificador básico, pero si se le suministra corriente eléctrica
de cátodo a ánodo (polarización inversa), el diodo sólo dejara pasar una tensión constante.
9. OPTOACOPLADOR
Los optoacopladores son elementos electrónicos que permiten el aislamiento eléctrico establecido
entre circuitos de entrada y salida, estos basan su funcionamiento en el empleo de un haz de luz
de radiación luminosa para pasar señales de un circuito a otro sin conexión eléctrica.
Existen diferentes tipos de optoacopladores como lo son:
21
OPTOACOPLADOR 4N25
El optoacoplador 4N25, de tipo fototransistor, es formado por un diodo emisor de luz y una etapa
de salida formada por un transistor de tipo BJT, la configuración de pines de este elemento es
mostrado en la figura 9, así como sus características generales en la Tabla 2.
22
MODELO PSN17-5DP
El PSN17-5DP es un sensor inductivo blindado del tipo PNP. En las figuras 10 y 11 se puede ver
su forma y sus dimensiones, de igual manera sus características en la Tabla 3.
Figura 10. Sensor inductivo PSN17-5DP Figura 11. Dimensiones sensor inductivo
PSN17-5DP
Las diferentes herramientas y librerías usadas en el desarrollo de este proyecto son descritas en
este apartado.
Los PCB (Printed Circuid Board) o circuitos impresos, son medios para la conexión de
componentes electrónicos por medio de pistas o rutas de material conductor.
23
Los PCB fueron inventados en Inglaterra alrededor de 1936 por el ingeniero australiano Paul
Eisler, para su uso en la detección de proyectiles durante la segunda guerra mundial. A mediados
de 1950, la armada estadounidense desarrolló un proceso de auto-ensamblaje de circuitos
impresos, en donde las patas de los componentes eran insertadas en una lámina de cobre con el
patrón de interconexión y luego eran soldadas, aunque no eran realmente usados, ya que el
método “wire wrap” o punto a punto era el más usado, ya que los componentes electrónicos que
existían en la época contaban con patas de alambre [3].
Por lo general, la composición de los PCB’s está dada por sustrato rígido, pistas impresas, resina
de cubrimiento y pad’s de plata (material conductor). Con el desarrollo de la laminación de las
tarjetas y de la evolución tecnológica de los sistemas de grabado, se tiene la ventaja de contar con
menor sensibilidad al ruido, mayor compatibilidad electromagnética, mayor robustez mecánica y
la posibilidad de producción en serie. Los PCB pueden clasificarse de acuerdo a su material de
confección, al tipo de montaje o su nivel de capas.
Para conocer más sobre diseño de circuitos impresos y el diseño de PCB con la herramienta de
desarrollo EAGLE, ver Anexo 2.
11.2 LIBRERÍA QT
Lo que diferencia a Qt de una librería C++ cualquiera es que añade muchísimas funcionalidades a
C++, cambiándolo de tal forma, que prácticamente crea un nuevo lenguaje de programación.
Además, facilita la tarea de programar en C++ que en casos como en la programación de
entornos gráficos, puede ser bastante ardua.
No obstante, es importante destacar que Qt no deja de ser C++, es decir, siempre se pueden usar
librerías estándar o cualquier otra librería y la sintaxis de C++ común y corriente, por lo cual, es
muy versátil. Por otra parte, existen bindings (asociaciones) de Qt para que programadores de
otros lenguajes de programación puedan utilizar las librerías sin tener que dejar de usar su
lenguaje habitual. Ejemplos de estos bindings son Qt Jambi (Java), PyQt (Python), PHP-Qt
(PHP) o Qyoto (C#), entre otros muchos.
Otro punto clave de Qt es que se considera una biblioteca “multiplataforma”, ya que permite
programar el mismo código y utilizarse para crear programas para Linux, Windows, Mac OS,
24
etc., permitiendo realizar lo mismo que Java, pero siendo mucho más eficiente al no haber
“máquina virtual” de por medio, sino código compilado expresamente para cada máquina.
Puesto que Qt se creó y creció como software libre (aunque en la actualidad hay disponible una
versión comercial alternativa), existen muchas comunidades de programadores que crean librerías
bastante útiles, como son el caso de Qextserialport o Qwt, y que al ser de código abierto, se
pueden utilizar libremente y de manera gratuita.
Qt fue desarrollada inicialmente por la empresa noruega Trolltech (fundada por Haavard Nord y
Eirik Chambe-Eng, dos estudiantes del instituto noruego de Tecnología) y posteriormente
comprada por Nokia en 2008. Está disponible en tres tipos de licencia, GNU LGPL, GNU GPL y
Propietaria (Nokia) y se ha utilizado para desarrollar software de todos los ámbitos como por
ejemplo: Skype, Mathematica, Google Earth, Adobe Photoshop Album, etc.
WiringPi es una librería escrita en C y liberada baja licencia GNU LGPLv3, que puede ser
empleada en varios lenguajes de programación, además de C y C++, con alguna pequeña
modificación en forma de adaptación.
Su principal uso es en la programación de periféricos a través de los 28 pines de entradas y salida
de propósito general de o General Purpose Input Output (GPIO) de la Raspberry Pi Modelo B+.
WiringPi, además, ofrece un comando que permite programar y configurar los pines de la GPIO,
pudiendo efectuar la lectura y escritura de los pines desde la línea de comandos o incluso,
incorporándola en un Shell script.
25
CAPITULO III: DESARROLLO
La cadena de programación, mostrada en la figura 12, está formada por un conjunto de eslabones
entrelazados entre sí con una distribución de pines que definen el patrón de diseño. Cada vez que
se cambie el patrón de diseño se debe detener la máquina, retirar la cadena y manualmente
distribuir los pines, en este proceso se pueden presentar errores al momento de ubicar los pines en
posiciones incorrectas, hacer una distribución no adecuada de los pines haciendo que se activen al
mismo tiempo bobinas que cumplen funciones de forma individual como por ejemplo los
guiahilos, ocasionando daños físicos en la máquina o afectando el diseño de las prendas.
26
El sistema que hace mover la cadena está compuesto por un conjunto de piezas mecánicas
conectadas mediante una polea al eje del motor, haciendo que cada vez que la máquina llegue a
un extremo la cadena mueva una posición, la distribución de pines de la cadena pasa por una fila
de accionadores que al ser tocado por un pin sube y acciona cada uno de los switches
electromecánicos para que conmute una señal DC que va a las bobinas o a las líneas del variador
del motor. Como se puede apreciar en las figuras 13 y 14.
De igual manera se puede apreciar el desgaste que tiene los accionadores debido a mucho de los
casos a la mala ubicación de los pines dentro de la cadena, en otros casos por elementos que se
enredan en la cadena y ejercen una presión anormal sobre los accionadores haciendo que el
resorte que traen se reviente o se dañe.
27
13. SISTEMA DE CONTROL
Para el diseño de la tarjeta se optó por usar relés de estados sólidos en vez de diseñarlo con
componentes electrónicos, puesto que estos últimos generarían más puntos de fallos al requerir
más componentes en la tarjeta de igual forma el tamaño de la misma sería aun mayor y más
dificultoso el diseño del PCB. En las figuras 15 y 16, se observa el diseño de esta tarjeta.
Disponer de más módulos para la conexión de los relés de estado sólido para interconectar
futuros elementos a la tarjeta.
Aislar totalmente los niveles de tensión de la parte lógica (baja potencia) emanada por los
puertos GPIO de la Raspberry Pi, de los niveles de tensión (alta potencia) provenientes de la
máquina.
La tensión máxima que entrega las salidas del puerto GPIO son 3.3V y corriente máxima que
debe fluir por cada pin del puerto GPIO es de 50mA.
Los niveles de tensión de las salidas del puerto GPIO son HIGH (un voltaje entre 2 y 3.3 V) o
LOW (entre 0 y 0.8 V).
28
Los relés son activados por un optoacoplador, teniendo en cuenta eso cada salida del puerto
GPIO debe alimentar el led bajo una corriente de 10mA aprox.
Según la ley de Ohm la intensidad de corriente eléctrica (I) es igual a la tensión (V) divida entre
la resistencia (R). Si se desprecia la resistencia del circuito, se tendría que R = 0 y teniendo en
cuenta que el resultado de una división entre cero tiende a infinito, sin la resistencia
provocaríamos un cortocircuito que dañaría el LED o incluso la propia Raspberry.
𝑉
𝐼=
𝑅
29
Figura 16. PCB de la tarjeta de relés
Los sensores entregan una Señal de 24V que se debe acondicionar puesto que los puertos GPIO
de las Raspberry manejan un voltaje de 3.3V para ello se debe introducir un circuito que baje el
voltaje de los sensores a ese rango, para poder hacerlo se utilizó un par de diodos Zener 1N4728
30
los cuales tienen un voltaje de corte de 3.3V voltios, para aislar la parte de potencia y no tener
que acoplar la tierra de la Raspberry con la alimentación de los sensores, se conectó un
optoacoplador 4N25, cuando el sensor emite una señal el optoacoplador conmuta cero voltios al
puerto de la Raspberry proveniente de la alimentación de la tarjeta, cuando el sensor no envía
señal este permanece en 3.3V. El esquemático del circuito se muestra en la figura 18 y el PCB en
la figura 19.
El valor de las resistencias R3 y R4 que son las resistencias limitadoras de corriente para el diodo
Zener se obtienen a través del siguiente cálculo:
𝑉𝑖𝑛 − 𝑉𝑧
𝑅𝑠 =
𝐼𝐿𝑚𝑎𝑥 + 𝐼𝑍𝑚𝑖𝑛
Los datos de 𝐼𝑍𝑚𝑖𝑛 son obtenidos de la hoja de datos del diodo Zener, la corriente 𝐼𝐿𝑚𝑎𝑥 viene
dada por el led que está conectado internamente en el opto acoplador que su consumo varía entre
10mA y 50mA.
24𝑉 − 3.3𝑉
𝑅𝑠 = = 257.78Ω
0.05𝐴 + 0.0303𝐴
Las resistencias R1 y R2 que son las que limitan la corriente que pasa al diodo led interno del
optoacoplador se calcula de la siguiente manera:
𝑉 3.3 𝑉
𝑅= = = 330Ω
𝐼 0.010 𝐴
Las resistencias R5 y R6 son resistencia de Pull-Down que pueden tomar un valor entre 1K y
10K, un alto valor de resistencia de pull-down puede limitar la velocidad a la que el pin puede
31
cambiar de estado y como la máquina tiene una alta velocidad entonces la reacción de la señal al
detectar cada sensor debe ser lo más rápido posible por eso se escoge el valor mínimo en la
resistencia de pull-down.
Estos son los requerimientos mínimos que se debe tener en cuenta en el desarrollo de la interfaz
de control.
La aplicación debe permitir almacenar los archivos de programación, para ello el sistema de
almacenamiento debe ser amplio.
La interfaz debe manejar eventos y mensajes de alerta ante posibles errores como doble lectura
de sensor, producción terminada, mensajes de alerta cuando se desee eliminar algún elemento
como archivos o líneas en el patrón de diseño.
Permitir cambiar el valor de los ciclos del patrón de diseño sin necesidad de cargar
nuevamente un programa y tener que detener la máquina.
Tener la capacidad de continuar con la programación aun cuando la máquina se apague y se
encienda si el contador de piezas aún no ha finalizado.
32
Permitir ir creando patrones de diseño sin que se afecte el funcionamiento de la máquina ni se
vea alterado el rendimiento de la aplicación.
Mostrar en pantalla el sentido que lleva el carro de la máquina, de igual manera las líneas del
patrón de diseño que va efectuando en cada recorrido, así mismo mostrar el contador de piezas
y los ciclos.
14.2 ARQUITECTURA
La arquitectura de funcionamiento del sistema se muestra en la figura 20.
33
14.3 LÓGICA DE CONTROL
En este apartado se describen las clases utilizadas para el control lógico del sistema.
14.3.1 Cantidad
Esta clase se encarga de ajustar la cantidad de prendas que se desee realice la máquina. En la
figura 21 se muestra el diagrama de flujo de la clase cantidad
Esta clase es un hilo o Thread que constantemente está leyendo el estado de los sensores, como
este proceso se ejecuta en segundo plano, no afecta el funcionamiento del programa principal. El
diagrama de flujo de la clase, se muestra en la figura 22.
34
Figura 22. Diagrama de flujo de la clase thread sensores
Esta clase crea y edita los diferentes programas y patrones de diseño, que se cargan en la
máquina. Como se observa en el diagrama expuesto en la figura 23
35
14.3.4 Copiar archivo
Esta clase que se describe en la figura 24, copia el contenido de un archivo con el patrón de
diseño ya creado, en uno nuevo según el nombre de archivo que el usuario ingrese.
Esta clase se encarga de crear nuevos archivos de programación sin contenido en su interior, para
luego ser editados con el patrón de diseño que se requiera a través del módulo de programación.
En la figura 25 se muestra el diagrama de flujo de esta clase.
36
Figura 25. Diagrama de flujo de la clase guardar archivo
Esta clase lee los ciclos definidos en el patrón de diseño y permite modificar su valor guardando
los cambios directamente en el archivo sin necesidad de editarlo en el módulo de programación.
El diagrama de flujo de la clase, es mostrado en la figura 26.
37
14.3.7 Módulo programación
Esta clase permite crear y editar los patrones de diseño para luego guardarlos en un archivo de
programación. En la figura 27 se muestra el diagrama de flujo.
Este apartado describe el diseño de toda la interfaz gráfica que interactúa con el usuario y ejecuta
las operaciones lógicas de control.
Esta interfaz que se muestra al iniciar la aplicación están disponibles las diferentes opciones
básicas que posee, basta con presionar cada uno de los botones para acceder a los diferentes
módulos tal como se ven en la figura 28 y se describen más adelante.
38
1 4
3 5
6
Figura 28. Pantalla principal de la interfaz de programación
Los demás botones que se muestran desactivados son para trabajos futuros de nuevas
funcionalidades que se le requieran dar a la aplicación.
1. Cargar Programa
Este módulo permite crear, editar y cargar los diferentes programas con los patrones de diseño
que se requieran en la elaboración de cada tejido.
2. Ciclos
Este módulo permite modificar los diferentes ciclos que se hayan creado en el patrón de diseño
del programa cargado en la máquina.
3. Cuenta Prendas
Este módulo permite definir o editar la cantidad de prendas programadas en la producción del
programa cargado en la máquina.
39
4. Apagar
Este botón envía una señal de apagado a la Raspberry haciendo que la aplicación se cierre y el
sistema operativo se apague.
5. Enviar a Corte
Este botón envía una señal al programa para que inicie en la posición 1, en los casos que se
requiera iniciar nuevamente una prenda.
6. Área De Monitoreo
Esta sección indica la dirección que lleva el carro y la secuencia que va llevando el programa
según el patrón de diseño que se haya generado, además indica la cantidad de piezas programadas
y las que va completando la máquina, de igual forma muestra el conteo de los ciclos que se hayan
creado en el diseño.
Este módulo mostrado en la figura 29 permite crear, eliminar, copiar, editar los diferentes
patrones de diseños guardados localmente en la Raspberry para luego ser cargados en la máquina
para que esta lo ejecute.
40
14.4.2.1 Crear un nuevo programa
Para crear el patrón de diseño primero se debe configurar las funciones que la máquina va
ejecutar en cada pasada o sentido de ida y vuelta, definiendo la velocidad, guía hilo, estado de las
llaves así mismo como los rondós que traducido a lo que ejecuta la máquina son los diferentes
bobinas que deben ser activadas según el sentido que lleve la máquina, la opción ciclos permite
definir cuantas veces se repetirá la misma pasada una vez definida la configuración para esa
pasada se presiona el botón “Insertar Línea” para ir creando el patrón de diseño así mismo
hacerlo con los diferentes cambios o configuraciones que tendrá ese programa.
Para editar un programa se debe seleccionar de la lista y luego presionar el botón “Editar” para
que se abra el módulo donde se puede cambiar el patrón de diseño de dicho programa, cuando se
selecciona o se hace clic sobre cada uno de los programas de diseño de la lista al lado derecho se
puede observar el contenido que trae dicho programa de esta manera sin necesidad de abrirlo
saber cómo esta creado el patrón de diseño y así saber cuál que se debe modificar antes de
editarlo.
41
14.4.2.3 Eliminar programa
Para eliminar un archivo se debe seleccionar de la lista y presionar luego el botón “Eliminar” esto
abre un diálogo confirmando si se desea eliminar el archivo, al ser confirmado el archivo se
elimina totalmente.
Este módulo permite de igual forma copiar el contenido de cualquier archivo dando la opción de
escoger el nuevo nombre que tendrá, para ello se debe seleccionar de la lista el archivo y luego
presionar el botón “Copiar” esto abre un diálogo donde se pide el nuevo nombre para el archivo.
Para cargar un programa en la máquina se debe seleccionar de la lista y luego presionar el botón
“CARGAR PROGRAMA” al hacerlo se cierra el MÓDULO actual y pasa a la pantalla principal,
mostrada en la figura 31, donde se abre un diálogo solicitando la cantidad de piezas a programar.
Una vez el programa es cargado se activa el sistema que verifica el estado de los sensores y la
máquina puede ser puesta en funcionamiento. A medida que esta opere y active cada uno de los
sensores en el área de monitoreo se podrá observar el sentido que lleva, la secuencia que se
42
encuentra realizando según el patrón de diseño, el incremento en los ciclos y en el conteo de las
prendas realizadas, como se ve en la figura 32.
Cuando el conteo de las prendas realizadas es igual a la cantidad programada, el sistema mostrara
un mensaje avisando que la producción ha sido terminada y además da la opción de volver a
realizar o no la misma producción.
43
Una vez la máquina se encuentre en posición con el carro en el extremo derecho se da inicio a la
máquina presionando el botón que arranca el motor, los sensores inductivos le indican a la
Raspberry cuando llegue a cada extremo para que aumente la secuencia en el programa del
diseño. En el siguiente diagrama de flujo de la figura 34 se puede apreciar mejor el
funcionamiento.
44
CAPITULO III: ANÁLISIS DE RESULTADOS
Para efectos de resaltar y de mostrar de manera ordenada los resultados del proyecto, se muestra a
continuación las diferentes etapas de montaje, pruebas y puesta a punto del sistema y las
conclusiones finales del mismo.
15. MONTAJE
El módulo de operación está compuesto por la tarjeta Raspberry Pi y su pantalla táctil Raspberry
Pi 7” Touch Screen Display. Estas dos se conectan a través de una placa de adaptación en donde
se utiliza un cable USB - micro USB para alimentar la pantalla y un cable plano para convertir las
señales paralelas de la pantalla al puerto serie (DSI) en la Raspberry Pi como se ve en la figura
35. Para la protección de los elementos, se realiza la creación de una caja o carcaza plástica con
medidas de 20x15x5 cm, en la cual se inserta el módulo de operación.
Finalmente el módulo se instala en una base plástica, la cual esta sujetada a la máquina, las
medidas de la base son mostradas en la figura 36, en las figuras 37 y 38, se puede observar el
módulo de operación, instalado en la máquina.
45
Figura 36. Medidas base de instalación
Para la instalación de los sensores inductivos, los cuales detectan el sentido del carro tejedor, fue
necesaria la creación de una base metálica, en la cual se instalan los dos sensores en el extremo
superior e inferior. Las dimensiones de la base son mostradas en la figura 39.
46
Figura 39. Medidas base sensores
La base es instalada alrededor del extremo saliente del eje de la caja de velocidad de la máquina
SCOMAR A80. En este mismo eje, se instala un anillo plástico el cual posee un punto metálico
como se muestra en la figura 40.
El posicionamiento de este punto metálico al ser detectado por los sensores inductivos,
determina la dirección en la cual está el carro tejedor. Si el sensor superior detecta el punto
metálico, indica que el carro llegó hasta el extremo izquierdo de la máquina, así mismo si el
sensor inferior es el que detecta el punto metálico, realiza la indicación de que el carro tejedor
47
terminó su desplazamiento de izquierda a derecha. Las señales de los sensores, están conectadas a
la tarjeta de acondicionamiento de sensores. (Ver numeral 13.1.3)
Después de la creación de las PCB definidas en la etapa de control y sensado (ver 13.1) estas son
instaladas en la parte posterior de la máquina ASCOMAR A80 ya que esta cuenta con una caja de
distribución de conexiones, mostradas en las figuras 41, 42 y 43 en donde están conectadas todas
las señales, borneras, contactores y demás elementos eléctricos que permiten el funcionamiento
de la máquina.
48
16. PRUEBAS Y PUESTA A PUNTO DEL SISTEMA
Una vez conectados todos los elementos que conforman el sistema electrónico de programación
para la máquina SCOMAR A80, se procede a realizar el encendido del mismo, en la pantalla de
inicio de la aplicación que se observa en la figura 44, se cargar un programa prediseñado, con el
cual se realizan las pruebas de las conexiones y las señales emitidas y percibidas por todos los
elementos que conforman el sistema.
Este programa tiene los patrones de diseño para crear cuellos en acrílico con 3 colores, 2 colores
de ½ cm y un color de fondo. El programa se divide en 5 partes diferentes, dentro de una sola
línea de programación:
49
5;4;1;1;0;0;1;C
3;4;1;0;0;0;X;C
3;4;1;0;0;0;1;C
3;4;1;0;0;0;X;C Esta parte del programa hace el corte o separación de cada cuello
3;4;1;1;0;0;1;C
2;4;1;1;0;0;X;C
2;0;1;0;0;0;1;C
2;0;0;0;0;0;X;C
1;3;1;1;0;0;1
2;3;1;0;1;0;X
5;3;0;1;0;1;3
5;3;1;0;1;0;X Esta parte del programa hace el rondo o el principio de cada cuello y hace uso
5;0;0;0;0;0;1 de un color de hilo enhebrado en el guiahilo 3
5;0;0;0;0;0;X
3;3;1;1;0;0;1
5;3;1;1;0;0;X
3;3;0;1;0;1;1
5;3;1;0;1;0;X
Esta parte del programa hace un cambio de color usando el guiahilo 1
5;1;1;1;0;0;2
5;1;1;1;0;0;X
Nuevamente cambia de color usando el guiahilo 3
5;3;1;1;0;0;2
5;3;1;1;0;0;X
5;2;0;1;0;1;1
5;2;1;0;1;0;X
Esta parte del programa hace ya el fondo del cuello y posee un ciclo de 36
3;2;1;1;0;0;1
vueltas definido para el ancho del cuello
5;2;1;1;0;0;X
7;2;1;1;0;0;36
7;2;1;1;0;0;X
Los cuellos diseñados por el programa descrito, son mostrados en las figuras 45 y 46.
50
Figura 45. Tejido sin desprender Figura 46. Cuello terminado
Con la máquina a pleno funcionamiento, se realizan comparaciones con otra máquina de las
mismas características sin el sistema instalado. Se seleccionan 5 diseños de cuellos diferentes,
precargados en el módulo (ver figura 47) y se realiza cierta cantidad de cada uno paralelamente,
de acuerdo a la producción establecida por la compañía, para no incurrir en sobre costos
innecesarios:
51
En los tiempos de estas pruebas se obvian las detenciones comunes de la máquina como lo son,
por terminación de un hilo, falta de fluido eléctrico, por verificación en las medidas de los
cuellos, entre otras que no comprometen el sistema que se está evaluando. En las tablas 4 y 5 se
muestran, los datos de comparación entre los dos tipos de máquinas.
52
Nota: Los tiempo son tomados teniendo en cuenta que un cuello demoraba en promedio 2.8
minutos y se daba unos minutos de más por detenciones normales de la máquina.
Para poder crear un nuevo diseño en la Máquina 2 se debe detener para retirar la cadena y hacer
el patrón de diseño, luego colocarla teniendo la precaución de ubicarla bien en el tambor, en la
Máquina 1 se puede ir creando un nuevo diseño mientras está ejecutando otro diferente, además
se puede copiar un diseño ya creado y hacer los ajustes necesarios para el nuevo.
Cuando se presentan problemas con el hilo o las agujas que terminen dañando el cuello que
actualmente se está haciendo y para no generar desperdicio lo que se hace es volver a iniciar un
nuevo cuello, en el caso de la Máquina 2 se debe detener levantar el sistema de interruptores,
mover el tambor hasta la primera posición de la cadena, luego bajar el sistema de interruptores y
encender la máquina, para el caso de la Máquina 1 basta solo con presionar un botón, el sistema
solo vuelve al inicio sin necesidad de detenerla.
CUCUTA_NEGRO CUCUTA_BLANCO
PROGRAMA PROGRAMA
Diseño del Diseño del
Cantidad Horas Cantidad Horas
Programa (minutos) Programa (minutos)
DISMINUCIÓN DISMINUCIÓN
EN LOS TIEMPOS 77.77% 11.62% EN LOS TIEMPOS 89.58% 9.09%
PRODUCCIÓN PRODUCCIÓN
53
CUELLO_OFICIAL 2_RAYAS
PROGRAMA PROGRAMA
Diseño del Diseño del
Cantidad Horas Cantidad Horas
Programa (minutos) Programa (minutos)
DISMINUCIÓN DISMINUCIÓN
EN LOS TIEMPOS 80% 0% EN LOS TIEMPOS 86.66% 13.33%
PRODUCCIÓN PRODUCCIÓN
OMAR_CARTAGENA.csv
PROGRAMA
Diseño del Programa
Cantidad Horas
(minutos)
MÁQUINA 1 15 1250 60
MÁQUINA 2 75 1250 75
DISMINUCIÓN
EN LOS TIEMPOS 80% 20%
PRODUCCIÓN
Número de fallas en la
Programar un Número de fallas por
Enviar a Corte cadena de programación o
Diseño diseño al día
en el sistema por semana
5 – 8 Min
MÁQUINA 1 2 Seg. 0 0
aprox.
40 Min <
MÁQUINA 2 6 Min. 5 Veces 10 Veces
aprox.
Tabla 11. Tiempos comparativos entre ambas máquinas para ciertos eventos
54
18. CONCLUSIONES
El proyecto fue ejecutado a satisfacción a través del desarrollo de los diferentes objetivos
específicos, en los cuales se obtuvieron logros y dificultades. Estos ayudaron a la consecución
del objetivo general que fue planteado como el diseño e implementación de un sistema
automatizado capaz de controlar y cambiar el accionar mecánico por uno electrónico en la
programación de máquinas rectilíneas SCOMAR A80 para la fabricación de cuellos tejidos. El
propósito de desarrollar una solución integral que permitiera el reemplazo del sistema mecánico
de las máquinas rectilíneas, se obtuvo, facilitando la programación de los patrones de diseño por
medio de una interfaz gráfica la cual controla un sistema electrónico que remplazo el sistema
mecánico de la máquina.
Logros:
Dificultades:
Es poca la información que se logró obtener acerca del modelo de la máquina seleccionada
para este proyecto, ya que son modelos de muchos años de fabricación. Para el remplazo de
55
los elementos mecánicos que se automatizaron, fue necesario el aprendizaje del proceso de
tejido, así como el estudio del sistema de configuración que conlleva el uso de los switches
electromecánicos, la cadena de programación, el sistema de piñones y demás elementos que
componen el sistema mecánico que posee la máquina rectilínea, esto a través del conocimiento
empírico de los operarios.
Diseño e implementación del sistema de control electrónico que permita, teniendo en cuenta
los requerimientos y restricciones, reemplazar el accionar mecánico en la programación de
la máquina por uno electrónico.
Logros:
Dificultades:
Los sensores inicialmente utilizados tenían metal en su estructura y hacia masa con la
estructura de la máquina, provocando errores en el funcionamiento de los sensores ya que la
máquina al detener el motor genera una contracorriente muy alta alterando las señales que el
sensor entregaba. Por tal motivo se cambian por sensores aislados.
Los relés de estado sólidos son una gran solución cuando se requiere reemplazar un accionar
mecánico por uno electrónico, ya que dichos relés al no contar con piezas mecánicas en su
funcionamiento su respuesta es muy rápida.
56
Para no acoplar la tierra de la máquina con el sistema de control con tal de hacerlo inmune al
ruido e interferencias se usaron optoacopladores que aislaran la etapa lógica de control de la
potencia.
El soporte que se usó para instalar la pantalla en la máquina se mandó a fabricar sobre acrílico
esto con el fin de que la estructura de la máquina no interfiriera sobre la pantalla, al usar un
elemento metálico.
Logros:
El desarrollo de una interfaz de usuario de fácil manejo, permite introducir los requerimientos
básicos para el control implementado, además muestra en tiempo real lo que pasa durante
ejecución del proceso. La memoria de número de prendas realizadas, permite que la detención
del ciclo de tejido no afecte el tiempo de configuración de la máquina, ya que no es necesaria
la re-configuración mecánica o manual de la misma por parte del operario, para la terminación
del tejido.
La facilidad que ofrece guardar los programas de diseño ahorra tiempo en la programación y
permite reutilizar programas para el diseño de nuevos tejidos.
El desarrollar la interfaz de usuario y la lógica de control sobre el software Qt creator haciendo
uso de la librería Qt y demás, da al producto final un aspecto amigable a la vista y permite
organizar muy bien los elementos de tal manera que sea fácil de usar por el usuario final, así
como dotar al programa de múltiples procesos y opciones que mejoren el rendimiento y la
ejecución de varias tareas al mismo tiempo.
Dificultades:
57
Para que la librería WiringPi funcione correctamente se debe ejecutar el programa con
privilegios “sudo” ya que para el acceso al puerto GPIO el sistema operativo Debian sobre el
cual corre la Raspberry lo tiene restringido sólo al súper usuario.
Logros:
La reducción estimada del 75% del tiempo del ciclo de programación de diseño, se da gracias
a la eliminación del 100% de los problemas que se presentaban en esta etapa de configuración
de los eslabones y las cadenas para cada programa de las prendas con el sistema mecánico.
Esto representa un incremento en la eficiencia de la producción de la empresa Tejidos del
Risaralda LTDA.
La máquina logro acumular un ciclo de trabajo de 312 horas durante la etapa de pruebas, sin
presentar ningún tipo de fallas en el sistema.
Dificultades:
El ruido eléctrico que genera el motor afecta significativamente las señales lógicas que
provienen de la Raspberry ya que son señales de muy bajo voltaje 3.3V, se debió aislar el
cableado con un apantallamiento para que la incidencia del ruido no afecte las señales.
58
19. BIBLIOGRAFIA
59
[10] TUINENGA P.W. (1992). “A Guide to Circuit Simulation and Analysis Using PSpice”.
New Jersey. EE.UU. Editorial Prentice Hall.
[11] JOHN KARL-HEINZ. TIEGELKAMP MICHAEL. (2001) “IEC 61131-3:
PROGRAMMING INDUSTRIAL AUTOMATION SYSTEMS: Concepts and Programing
Languages, Requirements for Programming Systems, Aids to Decision-Making Tools”.
New York. EE.UU. Editorial Springer. [Consulta Septiembre 2015]
[12] CadSoft Computer Newark Corporation. “What is EAGLE”, Disponible en
<http://www.cadsoftusa.com/> [consulta en Noviembre de 2015]
[13] MORENO C, ALEJANDRA, BLOG: “TIPOS DE TEJIDO, TEXTILES Y TIPOS DE
TEJIDOS”, Disponible en <http://textilesytiposdetejidos.blogspot.com/2008/02/textiles-y-
tipos-de-tejidos.html> [consulta Junio de 2015]
[14] BARRERA T. FRANCISCO A. (1995), “TÉCNOLOGIA DEL TEJIDO DE PUNTO POR
TRAMA A DOS CARAS”, México DF. – México. Editorial, Universidad iberoamericana.
[15] DOUTEL, FERNANDO, BLOG: “CONOCE A LA PLACA QUE QUIERE
REVOLUCIONAR TU MUNDO DIGITAL: RASPBERRY PI A FONDO”, Disponible en
<http://www.xataka.com/componentes/conoce-a-la-placa-que-quiere-revolucionar-tu-
mundo-digital-raspberry-pi-a-fondo> [Consulta Junio de 2015]
[16] PASCUAL, JUAN A. BLOG: “RASPBERRY PI: ¿QUÉ MODELO ME COMPRO?”,
Disponible en <http://computerhoy.com/noticias/hardware/raspberry-pi-que-modelo-me-
compro-23811> [Consulta Junio de 2015]
[17] GUÍA RÁPIDA. RELÉS DE ESTADO SÓLIDO SSR’s. Disponible en,
<http://www.reitec.es> [consulta en Agosto de 2015]
[18] MARCOS A. JORGE, FERNANDEZ S. CELSO, ARNESTO Q. JOSÉ I. (Segunda Edición
2009): “AUTÓMATAS PROGRAMABLES Y SISTEMAS DE AUTOMATIZACIÓN”.
Barcelona, España. Editorial Marcombo. S.A [Consulta Septiembre 2015]
[19] OROZCO G. ÁLVARO A., GUARNIZO L. CRISTIAN HOLGUÍN L. MAURICIO,
(2008) “AUTOMATISMOS INDUSTRIALES”. Pereira, Colombia. Editorial Universidad
Tecnológica de Pereira. [Consulta Septiembre 2015]
60
ANEXOS
61
ANEXO 1: MODELOS DE LA RASPBERRY,
DESCRIPCIÓN DE COMPONENTES Y
CONFIGURACIÓN E INSTALACIÓN DEL
SISTEMA OPERATIVO.
62
MODELOS
Desde la creación en 2008 de la primera versión de la RASPBERY PI, se han lanzado 5 versiones
de las cuales 4 han salido al mercado:
FUENTE DE PODER
La fuente de poder de 5V cuenta con una entrada micro USB y un fusible de 2A, también cuenta
con un transistor de efecto de campo, P-Channel MOSFET (DMG2305UX) para protección al
cambio de polaridad.
PUERTOS GPIO
Los puertos GPIO, son un sistema de propósito general de entradas y salidas, GPIO (General
Purpose Input/Output). Los puertos incluidos en la RASPBERRY PI, son del tipo “unbuffered”,
63
esto quiere decir que no tienen protección contra altas magnitudes. Los 40 pines disponibles en el
modelo 2B cumplen diferentes funciones, como se puede observar en la Tabla 13.
El módulo computacional cuenta con 4 puertos USB 2.0 de alta velocidad, además de un puerto
Ethernet (10/100).
64
PUERTOS DE AUDIO Y VIDEO
Puerto TRRS: es un Jack de 4 polos, para conexión de Plug de 3.5mm, funciona como salida de
audio o como salida de Audio/Video.
Puerto HDMI: El puerto HDMI (High Definition Multimedia Interface) es un puerto especial de
19 o 29 terminales, capaz de transmitir de manera simultánea videos de alta definición, así como
varios canales de audio y otros datos de apoyo.
CONFIGURACIÓN
PREPARACIÓN DE LA TARJETA SD
El primer paso para operar el MÓDULO es la descarga del sistema operativo, para ello se debe
contar con una tarjeta micro SD de mínimo 8GB. Esta memoria debe ser formateada con
programas tales como SD Association’s Formating Tool, SD Formater, Flash Format, o algún
otro que nos asegure la limpieza completa de la misma, otra forma de realizar la liberación total
de la memoria micro SD es siendo inicializada con un formato FAT32, con esto el sistema
asegura que la memoria este totalmente vacía y así proceder a la instalación del sistema
operativo.
65
INSTALACIÓN DEL SISTEMA OPERATIVO
Pasos:
Descargar el archivo de RASPBIAN deseado.
Realizar la preparación de la tarjeta Micro SD
Descargar la aplicación Win32 Disk Imager (Esta aplicación está diseñada para escribir una
imagen de disco sin procesar) y ejecutarla.
Extraer el archivo de imagen del documento ZIP descargado para la versión de RASPBIAN
que se desee instalar
Con Win32 Disk Imager seleccionar el archivo de imagen extraído anteriormente.
En la opción “Device” de la aplicación seleccionar la tarjeta Micro SD.
66
Click en la opción “write” de Win32 Disk Imager y esperar a que se complete la escritura en
la tarjeta.
Con los archivos copiados en su totalidad en la tarjeta Micro SD, se puede proceder a retirar
la tarjeta de la ranura del ordenador.
Después de tener preparadas las memorias Micro SD, se requieren de algunos elementos para
realizar la preparación del sistema operativo en el módulo computacional. [6]
Elementos:
67
Dentro del menú de configuración se puede acceder al cambio de región, así como también al
idioma, entre otros.
68
ANEXO 2: DISEÑO PCB CON EAGLE
69
CLASIFICACIÓN DE LOS PCB
Tipo de montaje: Estas están determinadas por el tipo de encapsulado del componente que
desea instalarse:
o THT, Tecnología de agujeros pasantes, denominados también como componentes de
inserción, ya que se requieren orificios en el PCB, para su montaje.
o SMT, Tecnología de montaje superficial, este tipo de encapsulado no requiere de agujeros
para su montaje en las PCB, no tienen alambres de conexión, pero pueden venir con
diferentes tipos de pines como lo son, los pines metalizados, pines en forma de J, pin de
gaviota, pin forma de cuña, pin doblado, o pin en forma de I.
Número de capas: las PBC´s más sencillas tienen solo una capa de pistas, dispuestas sobre
una de sus caras, los componentes de estas generalmente son del tipo THT y suelen ser
circuitos de bajo coste y baja complejidad. Las tarjetas bicapa o doble cara, son utilizadas en
circuitos de mediana complejidad debido a que para ser montados en placas de una sola capa
requerirían de un gran tamaño o de un gran número de puentes para lograr las conexiones
entre los elementos.
70
CAD – DISEÑO ASISTIDO POR COMPUTADORA
El diseño asistido por computadora o CAD (Computers Aided Design), se describe como la
utilización de recursos computacionales para la creación de representaciones gráficas de objetos
físicos en 2D o 3D. Los CAD se han convertido en una herramienta necesaria para la creación de
los PCB, ya que gracias a ellas se han podido elaborar circuitos electrónicos de menor costo de
producción, simular el funcionamiento sin la necesidad de ser armado.
Las primeras herramientas de diseño de circuitos electrónicos fueron producidas alrededor de los
años 60 por la compañía IBM, la cual desarrollo un software para el análisis de circuitos
electrónicos, llamado ECAP (Electric Circuit Analysis Program), este programa fue el punto de
partida para que a mediados de los años 70, un grupo de investigación de la Universidad de
Berkeley en California, desarrollara SPICE (Simulation Program with Integrated Circuits
Emphasis) el cual permitía el análisis de circuitos analógicos sin necesidad de su ensamble, esto
en grandes ordenadores y workstations, donde en un fichero de texto se describía el circuito y el
tipo de análisis requerido, igualmente se permitía dejar parámetros sin especificar para lograr que
tomaran valores por defecto, SPICE realizaba la lectura del fichero y comprobaba que no
existieran conexiones y sintaxis declaradas para realizar la simulación del funcionamiento.[8-11].
Con el avance en los sistemas de cómputo en los años 80 y 90, en donde la comercialización a
computadoras personales de bajo costo y alto rendimiento tuvo un crecimiento inesperado,
sumando la evolución de los sistemas microcontrolados, los microchips y los componentes
electrónicos en general, los programas de diseño de circuito han evolucionado al punto de
convertirse en herramientas de trabajo cotidiano, creando herramientas para sistemas electrónicos
de potencia, sistemas de alta frecuencia, sistemas electromagnéticos, etc.
Para entender el diseño de circuitos impresos, se deben de conocer las diferentes definiciones
conceptos y terminologías utilizadas en los procesos que aplican hacia ellos.
71
Layout: se refiere al diseño de la tarjeta, específicamente al trazado de las líneas de la misma.
El layout hace parte del Boardfile, que es el archivo general donde se realiza el diseño físico
de la tarjeta.
Pads: es una superficie de cobre que permite la fijación de un componente a la tarjeta a través
del proceso de soldado. Los pads suelen ser rectangulares para elementos de montaje
superficial (smd) es decir, soldar el componente por el mismo lado de la placa en donde se
ubica, y redondos para los componentes through-hole pensados para introducir el pin del
componente para luego soldarla por el lado opuesto al cual se introdujo.
Soldermask: la máscara de soldado es una capa física en barniz que se utiliza para evitar la
oxidación del cobre del PCB, esta capa cubre las caras de la tarjeta a excepción de los pads.
SMD: Los SMD (Surface Mount Devices), dispositivos de montaje superficial son elementos
que no requieren agujeros para ser instalados en el circuito impreso. No se cuenta con
alambres de conexión, por el contrario el propio encapsulado posee sus extremos metalizados
o terminales cortos y rígidos de diversas formas
Track: es un segmento de línea de conexión generalmente de cobre, son requeridos para la
conexión entre pads, tienen distinto ancho, esto depende de las corrientes que fluyen a través
de ellos.
En la actualidad existen una gran cantidad de programas a los cuales se puede acceder para
realizar la simulación de los circuitos, ya sean analógicos o digitales, dibujar esquemas o diseñar
placas de circuito impreso.
Una de estas herramientas de diseño asistido por computadora es EAGLE (Easily Applicable
Graphical Layout Editor), es un software para la elaboración de circuitos impresos de
baja/mediana complejidad, diseñado por la empresa CadSoft Computer Newark Corporation a
principios de la década de los 90. El programa presenta una serie de características generales, así
como el MÓDULO esquemático, el editor de capas y el módulo de autoruter. [12]
72
Características generales:
Editor esquemático
o Hasta 999 hojas por esquema.
o Vista previa de los iconos en las hojas.
o Referencias cruzadas para redes.
o Generación automática de contactos para referencias cruzadas.
o Remplazo de las funciones de las piezas sin pérdida de coherencia entre el esquema y el
diseño (layout)
o Generación automática de las conexiones de alimentación.
o Generación automática de la placa.
o Verificación de conexiones eléctricas entre los esquemas eléctricos y de líneas de conexión
Editor de diseño
o Área máxima de dibujo de 4 x 4 m (aprox. 150 x 150 pulgadas)
o Soporte completo en SMD
o Rotación de objetos en pasos de ángulos arbitrarios de 0.1°
o Bloqueo de componentes después de ser movidos.
o Locación de texto en cualquier orientación.
o Cálculo dinámico de las rutas de señal.
o Función de Pads magnéticos.
o Extracción de las esquinas de los Tracks, en cualquier radio.
o Comprobación de las reglas de diseño para PBC (p. e. traslapas, medias de pistas o líneas
de conexión).
o Soporte para gran variedad de encapsulados.
Editor de autoruta
o Cambio del modo manual al automático en cualquier instante.
o Rejilla de trazado desde 0.02 mm
o Uso de reglas de diseño de líneas de conexión
o Sin restricciones de posicionamiento.
73
o Hasta 16 capas de señales (con direcciones preferidas definidas por el usuario)
Para realizar el diseño de un PCB, primero se debe hacer el plano esquemático, ya que se deben
verificar las conexiones de los componentes del circuito, para así proceder a realizar el diseño de
la placa de circuito impreso.
Lo primero que se debe realizar es la creación de un nuevo proyecto, ya que dentro del mismo se
realizara la creación de varios tipos de tarjeta y de librerías como se observa en la figura 49
Ahora que se realizó la creación de proyecto, se pasa a crear un nuevo plano esquemático
teniendo seleccionada la carpeta establecida para que el plano quede creado dentro de ella como
se muestra en la figura 50:
74
Figura 50. Creación de plano esquemático
75
Figura 53. Ventana de selección de elementos
76
Con la Tecla de selección “add” se adicionan cada uno de los componentes de la tabla anterior,
en la figura 54 se observa la selección del elemento opto acoplador 4N25M y en la figura 55 se
ve el componente en el plano esquemático junto con los demás elementos necesarios para la
creación del circuito.
77
Figura 56. Conexión del circuito
Después de tener el diseño del esquema del circuito, se puede pasar a la creación de la placa, para
esto es necesario hacer click en el botón board, ubicado en la parte superior del plano
esquemático. Una nueva ventana aparecerá, esto se denomina un archivo “brd”, se verá la
conexión de los elementos con hilos delgados de color dorado, pero estarán por fuera de un
recuadro que se encuentra ubicado en la parte derecha del archivo, como se muestra en la figura
57:
Ahora es necesario ubicar cada uno de los elementos dentro de la placa que aparece en la parte
derecha, con la tecla “move” se puede realizar el movimiento de los elementos hacia la placa.
78
Una vez se tengan ubicados los componentes dentro de la placa, se pueden ubicar de la mejor
manera, para reducir el tamaño de la tarjeta, o para tener la placa con la forma deseada como se
ve en la figura 58.
Una vez se obtenga la figura deseada, EAGLE presenta la opción de crear la autoruta, en donde
diseña el trazado de las pistas de la placa automáticamente, esto se realiza con el botón “auto”
mostrado en la figura 59
Después de que el autoruteador entregue las pistas trazadas, se pueden realizar algunos ajustes en
la placa, como son agregar texto para dar indicaciones en la placa y la posición de los agujeros de
fijado en la base, el resultado final se puede observar en la figura 60.
79
Figura 60. Placa final
Cuando no sea posible la traza de todas las pistas de la placa con la opción del autoruteo, EAGLE
genera la posibilidad de realizarlas individualmente mediante la opción “route” como se ve en la
figura 61
80
ANEXO 3: DESCRIPCIÓN DE
COMPONENTES DE LA LIBRERÍA QT,
INSTALACIÓN E INTEGRACIÓN CON LA
RASPBERRY.
81
COMPONENTES DE LA LIBRERIA QT
Qt se basa en el modelo de objetos Qt. esta arquitectura es la que hace que Qt sea tan potente y
fácil de usar. Los dos pilares de Qt son la clase QObject (objeto Qt) y la herramienta MOC
(compilador de metaobjetos).
La programación mediante el modelo de objetos Qt se fundamente en derivar las clases nuevas
que se creen de objetos QObject. Al hacer esto, se heredan una serie de propiedades que
caracterizan a Qt (y lo hacen especial frente al C++ estándar):
No hay que olvidar, sin embargo, que Qt no deja de ser C++ estándar con macros, por lo que
cualquier aplicación “programada en Qt”, puede tener código en C++ estándar o incluso en C.
Cuando se crea una instancia de una clase derivada de un QObject es posible pasarle al
constructor un puntero al objeto padre. Esta es la base de la gestión simple de memoria.
Al borrar un objeto padre, se borran todos sus objetos hijos asociados. Esto quiere decir que una
clase derivada de QObject puede crear instancias de objetos “hijos-de-QObject” pasándole el
puntero this como padre sin preocuparse de la destrucción de estos hijos.
Esto es una gran ventaja frente al C++ estándar, ya que en C++ estándar cuando se crea un objeto
siempre hay que tener cuidado de destruir los objetos uno a uno y de liberar memoria con la
sentencia delete.
82
Figura 62. Ejemplo de QWidget padre con hijos
Un ejemplo de aplicación podría ser crear un QWidget ventana (objeto padre) con dos botones
QPushButton y una línea de texto editable QLineEdit (hijos de esta ventana). Esto se puede ver
en la Figura 62. QWidget es una clase derivada de QObject que permite representar objetos
gráficos como ventanas, botones, etc. Por tanto, a su vez, QPushButton y QLineEdit derivan de
QWidget.
Signals y slots
Las signals y los slots (señales y ranuras, en castellano) son lo que hace que los diferentes
componentes de Qt sean tan reutilizables.
83
Figura 64. Conexiones entre signals y slots de diferentes objetos
Proporcionan un mecanismo a través del cual es posible exponer interfaces que pueden ser
interconectadas libremente (figura 64). Para realizar la interconexión se usa el método “connect”.
Un ejemplo de una signal podría ser pulsar un botón QPushButton y la signal que se emite
cuando se pulsa, clicked() y un slot podría ser por ejemplo, escribir un texto en un QLineEdit.
La ventaja principal de las signals y de los slots es que el QObject que envía la signal no tiene
que saber nada del QObject receptor. Este tipo de programación se llama en inglés “loose
coupling” y permite integrar muchos componentes en el programa de manera sencilla y
minimizando la probabilidad de fallo.
Para poder usar las signals y los slots cada clase tiene que declararse en un fichero de cabecera y
la implementación se sitúa en un archivo “.cpp” por separado. Este archivo de cabecera se pasa
entonces a través de una herramienta conocida como el MOC (compilador de metaobjetos). El
MOC produce un “.cpp” que contiene el código que permite que funcionen las signals y los slots
y otras muchas características de Qt. Para realizar este proceso de compilación que puede parecer
complejo, se utiliza la herramienta de qmake de Qt que lo realiza de manera automática. De estas
herramientas se hablará más adelante. En la Figura 65 se puede ver el flujo desde que se crea una
clase derivada de QObject hasta que se compila:
84
Figura 65. El flujo del MOC
Como ya se mencionó anteriormente, una aplicación Qt sigue siendo C++ al 100%. Por tanto, las
signals y los slots son simplemente palabras reservadas o keywords que reemplaza el
preprocesador convirtiéndolas en código C++ real.
Los slots se implementan como cualquier método miembro de la clase mientras que las signals
las implementa el MOC. Cada objeto tiene una lista de sus conexiones (qué slots se activan con
qué signals) y sus slots (cuáles se usan para construir la tabla de conexiones en el método
connect). Las declaraciones de estas tablas están escondidas en la macro Q_OBJECT. Esto se
puede ver en el código de la figura 66.
Las herramientas de Qt
Variables de entorno.
Qt Creator.
Qmake.
UIC.
MOC.
85
Variables de entorno
Para poder usar Qt es necesario que se configuren tres variables: QTDIR, PATH y
QMAKESPEC.
QTDIR. Variable que indica el directorio que contiene la distribución de Qt para permitir la
compilación de Qt.
PATH. Variable que se usa para poder invocar a las herramientas Qt desde la línea de
comandos.
QMAKESPEC. Variable que contiene la ruta del directorio mkspecs, necesario para compilar
nuestro programa.
QT Creator
Qmake
Puesto que las aplicaciones hechas con Qt dependen de las librerías Qt, sus propias librerías y en
algunos casos, librerías de terceros (como es el caso de Qwt o Qextserialport) y por otra parte,
intenta ser totalmente portable, los “makefiles” pueden convertirse en ficheros tremendamente
86
complejos. Por si fuera poco, no sólo se compila código fuente en C++, sino que el MOC
introduce un paso intermedio adicional de pre compilación y encima, los archivos “.ui”
(Interfaces de Usuario o widgets) pueden compilarse a partir de archivos XML a clases C++.
Qmake tiene el objetivo de simplificar todo este proceso de generación de código, que con la
herramienta “make” clásica, sería tremendamente complejo. Afortunadamente, si se utiliza el
IDE Qt Creator, se generan unos archivos “.pro” (archivos de descripción de proyecto) que
Qmake interpreta y permite generar todo el código para compilarlo posteriormente con gcc con
pulsar sólo un botón.
UIC
UIC (User Interface Compiler) o compilador de interfaces de usuario traduce los ficheros “.ui”
generados por Qt Designer (dentro de Qt Creator) a clases C++. Qmake configura esta
herramienta de manera automática.
Para poder utilizar una clase proveniente de un archivo “.ui” en el código Qt, los desarrolladores
recomiendan especialmente un método denominado “método de herencia múltiple”, que consiste
en crear una clase que herede de QWidget (lo habitual) y además herede de Ui::NombreForm
(donde NombreForm será el nombre del archivo “.ui” también llamado form). Con esto se
consiguen dos cosas, por una parte se puede acceder a todos los componentes del form desde el
ámbito de la subclase y por otra parte, se pueden usar signals y slots de forma habitual.
Para que todo esto funcione hay que añadir con un #include “ui_nombreform.h” (el cual será el
archivo de cabecera correspondiente al fichero “.ui” generado por el UIC). Este método tan
simple permite usar código hecho “a mano” y código generado por el UIC a partir de Qt
Designer.
MOC
MOC (Meta Object Compiler) o compilador de metaobjetos crea metaobjetos que describen las
clases haciendo uso de las signals y los slots.
87
Clases de Qt.
El número de clases de Qt es muy amplio, por tanto, en este apartado tan sólo se van a describir
algunas de las utilizadas en el proyecto.
QObject: Es la clase más importante de todas, ya que describe el objeto básico Qt, que
permite usar la gestión simple de memorias o las signals y slots.
QWidget: Es la clase que permite crear el elemento básico de interfaz de usuario.
QMainWindow: Widget de tipo MainWindow (ventana principal de programa).
QDialogBox: Widget de tipo cuadro de diálogo estándar.
QLabel: Widget que permite mostrar etiquetas de texto o imágenes.
QLineEdit: Widget que muestra una línea de texto.
QTextEdit: Similar a QLineEdit pero permitiendo mostrar texto, incluso en formato
HTML.
QPushButton: Widget que genera un botón.
QFrame: Widget de tipo marco.
QMessageBox: Widget de tipo Message Box.
QLayout: Es la clase que gestiona la geometría de los widgets.
QBoxLayout: Alinea los widgets de manera vertical u horizontal.
QThread: Clase que gestiona hilos de ejecución independientes del SO que se esté usando.
QTimer: Clase que proporciona una interfaz de alto nivel para los timers.
INSTALACIÓN
La versión de Qt creator que mejor funciona en la Raspberry es la 2.8.1 para ello se debe
descargar desde la página http://download.qt.io/official_releases/qtcreator/2.8/2.8.1/ buscar la
versión para Windows (qt-creator-windows-opensource-2.8.1.exe) e instalarlo.
88
INTEGRACIÓN CON LA RASPBERRY PI
Para poder desarrollar sobre esta aplicación, desde un sistema operativo Windows, esto para
mayor facilidad, teniendo en cuenta que la mayoría de computadores o portátiles usan este
sistema, es necesario hacer un par de configuraciones, tanto en el QT Creator, como en el equipo
portátil para que estos permitan hacer una compilación cruzada, es decir qué el código se compile
desde un sistema operativo Windows pero para un sistema Basado en Linux.
Se requieren ciertos programas y librerías para poder Integrar el QT Creator con la Raspberry Pi,
a continuación se indican cuales son y desde donde se pueden descargar:
Smartty: Este es un software que mediante conexión SSH permite la transferencia de archivos
a través del protocolo de conexión segura SCP, además de editar remotamente archivos sobre
el equipo al cual se está conectado. Este software puede ser descargado directamente desde la
página http://sysprogs.com/files/SmarTTY/SmarTTY-2.2.msi.
MinGW: Es una serie de librerías que permiten dar propiedades al sistema operativo
Windows de compilar bajo los compiladores GCC (C, C++, Fortran, Ada, etc.) que se usan
sobre sistemas operativos Unix. El archivo comprimido con todas las librerías se puede
descargar desde la página:
https://docs.google.com/uc?export=download&confirm=acIC&id=0B4D8x6CJEmtuczdiQklw
MEs4RUU.
Luego de descargar el archivo se crea una carpeta llamada MinGW (ver figura 67) en la
unidad (C:) del equipo, posteriormente se abre el archivo comprimido descargado y se extrae
el contenido de la carpeta mingw del archivo comprimido a la carpeta creada en el PC.
89
Figura 67. Distribución de carpetas librerías MinGW
librerías Qt 4.8.5: Estas librerías se descargan directamente en la Raspberry y son las que
permiten que se ejecute los archivos que son compilados en el QT Creator. La Raspberry debe
tener conexión a internet para poder ejecutar los comandos y descargar los archivos.
Toolchain RPI: El toolchain incluye el compilador C++ para poder hacer compilación
cruzada, en este caso desde Windows a Linux/ARM. Este programa se puede descargar desde
la página http://sysprogs.com/files/gnutoolchains/raspberry/raspberry-gcc4.6.3.exe.
Ejecutar el archivo descargado para iniciar el instalador, aceptar los términos de la licencia,
dejar por defecto las opciones que tiene el instalador habilitadas y presionar el botón Install
para dar inicio a la instalación como se muestra en la figura 68.
90
QtCrossTool: Utilidad que sirve para sincronizar todas las librerías y cabeceras entre la
Raspberry y el PC. El archivo comprimido que contiene esta utilidad puede descargarse desde
la página http://visualgdb.com/tools/QtCrossTool/QtCrossTool.zip
Esto hará que se abra una nueva ventana donde se debe escribir los datos básicos de conexión con
la Raspberry. Según la red a la cual esté conectada la Raspberry se escribe la dirección IP
asignada y como usuario se puede poner root si se tiene habilitado el usuario, o se puede usar el
usuario pi y contraseña Raspberry que vienen cargados por defecto en la placa o alguna otra
contraseña que haya sido modificada para el usuario pi como se muestra en la figura 70:
91
Al presionar el botón Connect, los datos de conexión serán guardados para poder utilizarla
posteriormente sin tener que introducir de nuevo los datos y se conecta a la Raspberry como se
muestra en la figura 71.
Se puede hacer desde la ventana abierta con SmarTTY o desde la propia Raspberry a través de
una terminal, por comodidad es mejor hacerlo todo desde el PC con SmarTTY.
Los comandos para ejecutar que permite instalar estas librerías son:
sudo apt-get update
sudo apt-get install libqt4-dev
sudo apt-get install libqt4-sql-sqlite
92
Figura 72. Datos ingresados de ubicación de librerías y cabeceras
La Raspberry debe estar encendida y conectada a la misma red del equipo PC para poder
sincronizar las librerías y cabeceras entre ambos, para ello se debe presionar el botón Select el
cual abre una instancia del programa SmarTTY donde aparecen los datos de conexión
establecidos previamente con la Raspberry (ver figura 73).
93
Figura 74. Progreso de sincronización de librerías y cabeceras Raspberry - PC
Configuración QT-Creator
Iniciar el programa QT Creator en el PC, y seleccionar Tools -> Options. Seleccionar Devices ->
Add -> Generic Linux Device, y pulsar Start Wizard.
Rellenar los datos para la conexión con tarjeta RPI como se muestra en la figura 75, pulsar Next y
en la siguiente pantalla Finish:
Qt Creator se intentará conectar con la tarjeta, para verificar la conexión con la Raspberry, si la
comunicación se lleva a cabo, una ventana indica que el test de conexión finalizo correctamente.
Ahora se selecciona Build & Run - > Compilers, para añadir el compilador cruzado C++, y
pulsar Add -> GCC. Rellenar los datos de acuerdo a como se indica en la imagen 76.
94
Figura 76. Datos de configuración compilador GCC
Luego se selecciona QT Versions, y se pulsa Add se abrirá una ventana con el directorio raíz del
sistema donde se debe seleccionar la ubicación del archivo qmake.exe, el cual se encuentra en la
ruta C:\SysGCC\Raspberry\bin.
Ahora se debe seleccionar la opción Kits de las pestañas superiores y se pulsa el botón Add. Se
ingresan los datos de acuerdo a como se indica en la siguiente 77.
Para finalizar se presiona los botones Apply y OK para guardar todos los cambios.
95
ANEXO 4: INSTALACIÓN Y
FUNCIONALIDADES LIBRERÍA WIRINGPI
96
INSTALACIÓN
Existen 2 maneras para instalar la librería, una es descargando directamente el archivo desde la
página principal de la librería (https://git.drogon.net/?p=wiringPi;a=summary), buscar la versión
más reciente y presionar el enlace al lado derecho que dice snapshot como se indica en la figura
78, esto hará que se descargue un archivo comprimido.
Ubicar la carpeta donde fue descargado el archivo, luego por línea de comandos descomprimir el
archivo y ejecutarlo.
Git es un software de control de versiones, libre y de código abierto, diseñado para manejar todo
tipo de proyectos, desde pequeños a grandes con rapidez y eficiencia.
En caso de no estar instalado GIT se debería instalar. Para ello en primer lugar hay que actualizar
los repositorios y posteriormente instalarlo. Estos comandos se pueden ejecutar desde una
conexión con la Raspberry a través del SmarTTY.
97
sudo apt-get update
sudo apt-get install git-core
Una vez descargado, hay que ir al directorio donde se encuentra y obtener una versión
actualizada.
cd wiringPi
git pull origin
./build
El nuevo script se encarga de compilar y ejecutar todo, sin que sea necesaria la intervención del
usuario.
FUNCIONALIDADES
Para poder utilizar esta librería es necesario indicar que se va a emplear, en la primera parte del
programa se incorpora la cabecera de la librería (#include<wiringPi.h>) y en la compilación se
especifica que utilice la misma (gcc –o pruebas -l wiringPi pruebas.c).
Hay tres funciones constructoras que permiten trabajar con la librería Wiring Pi, todas ellas
devuelven -1 en caso de que se produzca un error:
98
int wiringPiSetupGpio(void) : Idéntica a la anterior, pero utiliza la numeración de pines de
Broadcom (BCM GPIO).
int wiringPiSetupSys(void) : En este caso utiliza la interfaz /sys/class/gpio, en vez de trabajar
directamente sobre el Hardware.
A continuación en la figura 79, se muestra la tabla resumen de los pines GPIO para el Modelo
B+/PI2 B (40 Pines) de la Raspberry.
FUNCIONES GENERALES
void pinMode(int pin, int mode) : Especifica el pin (primer argumento) y modo (segundo
argumento), que puede ser entrada (INPUT), salida (OUTPUT) o salida PWM
(PWM_OUTPUT).
void digitalWrite(int pin, int value) : Se utiliza para poner un pin, que previamente ha sido
configurado como OUTPUT a dos posibles valores 1 (HIGH) o 0 (LOW).
99
void digitalWriteByte(int value) : Permite escribir en los 8 pines de la GPIO un valor.
void pwmWrite(int pin, int value) : Escribe el valor del registro PWM (segundo argumento)
al pin indicado (primer argumento). El valor suministrado debe estar comprendido entre 0 y
1024, además, hay que tener en cuenta que sólo soporta PWM el pin BCM_GPIO 18.
int digitalRead(int pin) : devuelve el valor leído en el pin indicado (único argumento), que
puede ser 1 (HIGH) o 0 (LOW).
void pullUpDnControl(int pin, int pud) : establece sobre el pin indicado (primer argumento)
el modo de tensión o resistencia, elevar a 3v3 ( PUD_UP), tirar a tierra (PUD_DOWN) o ni
elevar ni disminuir (PUD_OFF).
Las siglas PWM corresponden a pulse-width modulation, en castellano, Modulación por ancho
de pulsos, consistente en cambiar el ciclo de una señal periódica. No se pueden utilizar cuando se
trabaja en modo sistema (mode sys).
void pwmSetRange(unsigned int range) : Establece el valor máximo del rango del registro
PWM, establecido por defecto a 1024.
void pwmSetClock(int divisor) : Sirve para establecer el divisor del reloj PWM.
FUNCIONES DE TIEMPO
100
unsigned int millis(void) : Devuelve el número de milisegundos que han transcurrido desde
que se ha invocado a una función Wiring Pi.
void delay(unsigned int howLong) : Provoca la pausa del programa durante al menos
howLong milisegundos.
PROGRAM/THREAD PRIORITY
int piHiPri(int priority) : sirve para establecer la prioridad del programa o thread, que oscila
entre 0, valor establecida por defecto y 99 valor máximo y permite la planificación en tiempo
real. El valor devuelto es 0 en caso de éxito y -1 en caso de error. Sólo los programas
ejecutados como root pueden cambiar su prioridad.
FUNCIONES DE INTERRUPCIONES
int wiringPiISR(int pin, int edgeType, void (*function)(void)) : Mediante esta function se
puede establecer un manejador sobre un pin, además se debe especificar si se detecta mediante
un flanco de bajada (INT_EDGE_FALLING) , un flanco de subida (INT_EDGE_RISING ),
en ambos flancos (INT_EDGE_BOTH) o el pin no ha sido inicializado (INT_EDGE_SETUP).
El valor devuelto es 0 en caso de éxito y -1 en caso de error.
101
FUNCIONES DE PROGRAMACIÓN CONCURRENTE
WiringPi permite la utilización de hilos POSIX, así como mecanismos de exclusión mutua
(mutex).
int piThreadCreate(void * (* fn) (void *) : Crea un Thread de una función que ha sido
declarada previamente mediante PI_THREAD. La declaración sería similar a
PI_TREAD(miThread){ código } y posteriormente, esta función será el argumento de la
función. El valor devuelto es 0 en caso de éxito y -1 en caso de error.
void piLock(int keyNum) : Bloquea una clave (keyNum) cuyo valor va de 0 a 3, cuando otro
thread intenta bloquear a la clave, queda a la espera de que sea liberado.
void piUnlock(int keyNum) : Permite desbloquear una clave definida como en la función
anterior.
OTRAS FUNCIONES
void setPadDrive(int group, int value) : Establece la “fuerza” de los drivers para un grupo
de pins.
102
ANEXO 5: CREACIÓN DE UN PROYECTO
NUEVO EN QT CREATOR
103
CREACIÓN DEL PROYECTO EN QT CREATOR
Para crear un proyecto se debe hacer clic sobre la opción File en el menú superior, esto hará que
se desplegué varias opciones y en ella seleccionar la primera “New File or Project” o seguir la
secuencia de comando Ctrl+N.
Al hacerlo se abre una ventana con los diferentes tipos de proyectos que se pueden crear, se
selecciona la opción “Applications” y se escoge la opción “Qt Gui Application”, luego se
presiona el botón Choose.. para continuar como se ve en la figura 80.
En la ventana siguiente se define el nombre del proyecto y la ruta donde será guardado, la ruta
puede ser indicada manualmente o a través del botón “Browser” puede buscar directamente en las
carpetas del sistema y seleccionarla. Se presiona el botón Next para continuar.
Por defecto el asistente precarga el Kits antes configurado en el QT Creator, el cual se compone
de un conjunto de valores que definen un único entorno, como el dispositivo, compilador, la
versión Qt y el comando depurador a usar y algunos metadatos. Cómo solo se configuro un Kit,
se deja por defecto los Valores que aparecen y se presiona el botón Next, esto se puede apreciar
en la figura 81.
104
Figura 81. Selección de Compilador y Depurador para el Proyecto
En la ventana siguiente se ingresa el nombre que se le desee dar al método principal Main y se
presiona el botón Next para continuar.
La siguiente ventana en aparecer, figura 82, indica un resumen de los archivos que se generaran
al crear el proyecto y la ruta donde serán creados, de igual forma permite adicionar un control de
versión a los cambios que se hagan en el proyecto. Para finalizar se presiona el botón Finish.
Se habilita entonces el entorno de desarrollo donde se muestra el directorio raíz del proyecto,
donde está el archivo principal de configuración del proyecto, los cabeceros o archivos .h, los
105
archivos fuentes .cpp, los form o ventanas de diseño gráfico .ui, el editor de código fuente y
demás herramientas de compilación y depuración, como se ve en las figuras 83, 84 y 85.
Esquema de
Carpetas del Editor de
Proyecto Código
Fuente
Menú de
herramientas
106
Figura 85. Editor de código fuente
Para adicionar nuevos archivos de cabecera, código fuente, diseño gráfico entre otros, basta con
hacer clic sobre la carpeta principal en el esquema de carpetas del proyecto y seleccionar la
opción “Add New”. Al hacerlo este abrirá un asistente como se ve en la figura 86, donde permite
escoger los diferentes tipos de archivos que se desee adicionar al proyecto.
Para adicionar una nueva clase, cabecera o archivo de código fuente en blanco independiente de
los objetos y estructuras del framework del Qt Creator, se debe escoger el tipo de archivo C++ y
se presiona el botón “Choose..” para continuar con el asistente, el cual permite definir el nombre
107
de la clase o del archivo según la opción que se haya seleccionado, así mismo la ubicación del
archivo, se debe presionar luego el botón “Next” para continuar, en el paso siguiente se muestra
un resumen de los archivos que se van a crear y el proyecto al cual pertenecerán, para finalizar se
presiona el botón “Finish”.
Para adicionar nuevos archivos al proyecto con la estructura del framework del Qt creator, se
debe escoger la opción Qt al lado izquierdo y luego, seleccionar al lado derecho el tipo de
estructura de archivos que se deseen crear, ya sea una clase, un formulario o ventana de diseño o
un archivo de recursos, esta ventana de selección se muestra en la figura 87. Se presiona el botón
“Choose..” para continuar con el asistente
Existen diferentes tipos de formularios o template prediseñados que pueden ser seleccionados al
momento de crearlos o simplemente seleccionar una ventana principal o una sub ventana como se
ve en la figura 88. Para continuar se presiona el botón “Next”.
108
Figura 88. Selección de los diferentes template
En la siguiente ventana se escoge el nombre de la clase o del archivo según la opción que se haya
escogido y se presiona el botón “Next” para continuar.
En una nueva ventana, figura 89, se observa un resumen de los archivos a ser creados y el
proyecto al cual pertenecerán, para finalizar se presiona el botón “Finish”.
109
ANEXO 6: CÓDIGO FUENTE
110
CLASE CANTIDAD
cantidad.h
#ifndef CANTIDAD_H
#define CANTIDAD_H
#include <QWidget>
#include "ingreso.h"
namespace Ui {
class cantidad;
}
public:
explicit cantidad(QWidget *parent = 0);
~cantidad();
void definirCantidad(int, int, QString archivo);
signals:
void cantidadChanged(int);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::cantidad *ui;
int cantidadDefinida;
QString NombreArchivo;
};
#endif // CANTIDAD_H
cantidad.cpp
#include "cantidad.h"
#include "ui_cantidad.h"
#include <QSqlQuery>
cantidad::cantidad(QWidget *parent) :
QWidget(parent),
ui(new Ui::cantidad)
{
ui->setupUi(this);
cantidadDefinida = 0;
}
cantidad::~cantidad()
{
delete ui;
}
void cantidad::on_pushButton_clicked()
{
this->hide();
emit cantidadChanged(ui->spinBox->text().toInt());
ingreso conn;
conn.connOpen();
QString qry = "UPDATE PROGRAMA_CARGADO SET CANTIDAD_FALTANTE = ? WHERE NOMBRE_PROGRAMA = ?";
111
QSqlQuery query(qry);
query.addBindValue(ui->spinBox->text().toInt());
query.addBindValue(NombreArchivo);
query.exec();
conn.connClose();
}
void cantidad::on_pushButton_2_clicked()
{
this->close();
}
cargarprograma.h
#ifndef CARGARPROGRAMA_H
#define CARGARPROGRAMA_H
#include <QMainWindow>
#include <QDir>
#include <QDebug>
#include <QRegExp>
#include <QFileSystemModel>
#include <QSplitter>
//#include <qfilesystemmodel.h>
#include "MÓDULOprogramacion.h"
#include "guardararchivo.h"
#include "copiararchivo.h"
#include "ingreso.h"
namespace Ui {
class cargarPrograma;
}
public:
explicit cargarPrograma(QWidget *parent = 0);
~cargarPrograma();
private slots:
void on_actionNuevo_triggered();
void on_actionEditar_triggered();
void on_actionSalir_triggered();
void on_actionCopiar_triggered();
void on_actionEliminar_triggered();
void mostrarArchivo(QString);
void on_listView_clicked(const QModelIndex &index);
void on_pushButton_clicked();
signals:
void archivoChanged(QString);
private:
Ui::cargarPrograma *ui;
QStringList List;
QString rutaDisenos,rutaCortes;
112
//QFileSystemModel *model;
QString archivoLista;
};
#endif // CARGARPROGRAMA_H
cargarprograma.cpp
#include "cargarprograma.h"
#include "ui_cargarprograma.h"
#include <qsortfilterproxymodel.h>
cargarPrograma::cargarPrograma(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::cargarPrograma)
{
ui->setupUi(this);
//rutaProgramas = "F:/Universidad/PROYECTOS/SCOMAR/PROGRAMAS/";
rutaDisenos ="/home/pi/Desktop/PRUEBAS/PROGRAMAS/DISEÑOS";
rutaCortes ="/home/pi/Desktop/PRUEBAS/PROGRAMAS/CORTES";
ui->listView->setModel(modelDiseno);
ui->listView->setRootIndex(modelDiseno->index(rutaDisenos));
ui->listView->show();
ui->label_Total->setText(QString("%1").arg(ui->listView->model()->rowCount()));
cargarPrograma::~cargarPrograma()
{
delete ui;
}
void cargarPrograma::on_actionNuevo_triggered()
{
guardarArchivo *guardar = new guardarArchivo;
guardar->show();
}
void cargarPrograma::on_actionEditar_triggered()
{
if(!archivoLista.isNull()){
MÓDULOProgramacion *MÓDULOP = new MÓDULOProgramacion;
MÓDULOP->rutaArchivo = rutaDisenos + archivoLista;
MÓDULOP->CargarArchivo();
MÓDULOP->show();
}else{
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("SE DEBE SELECCIONAR UN ARCHIVO");
msgBox.exec();
}
void cargarPrograma::on_actionSalir_triggered()
113
{
this->close();
}
void cargarPrograma::on_actionCopiar_triggered()
{
if(!archivoLista.isNull()){
copiarArchivo *copiar = new copiarArchivo;
copiar->setRuta(rutaDisenos + archivoLista);
copiar->show();
}else{
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("SE DEBE SELECCIONAR UN ARCHIVO");
msgBox.exec();
}
}
void cargarPrograma::on_actionEliminar_triggered()
{
if(!archivoLista.isNull()){
QFile file(rutaDisenos + archivoLista);
if(!file.remove()){
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("ERROR AL ELIMINAR EL ARCHIVO");
msgBox.exec();
}
}else{
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("SE DEBE SELECCIONAR UN ARCHIVO");
msgBox.exec();
}
}
int cont = 0;
QTextStream in( &file );
QString line;
while (!in.atEnd()) {
if(cont == 0){
in.readLine();
}else{
if ((cont % 2) == 0) {
line = "Linea " + QString::number(cont) + " >> " + in.readLine();
ui->textEdit->append( line );
}else{
line = "Linea " + QString::number(cont) + " << " + in.readLine();
ui->textEdit->append( line );
}
}
cont++;
}
}
114
}else if(ui->listCorte->isActiveWindow() || ui->listCorte->isTopLevel()){
archivoLista = ui->listCorte->model()->data(index).toString();
mostrarArchivo(rutaCortes);
}
}
void cargarPrograma::on_pushButton_clicked()
{
this->hide();
emit archivoChanged(archivoLista);
ingreso conn;
QString qry;
conn.connOpen();
copiararchivo.h
#ifndef COPIARARCHIVO_H
#define COPIARARCHIVO_H
#include <QWidget>
#include <QFile>
#include <QMessageBox>
namespace Ui {
class copiarArchivo;
}
public:
explicit copiarArchivo(QWidget *parent = 0);
~copiarArchivo();
void setRuta(QString ruta);
private slots:
void on_buttonBox_accepted();
void on_buttonBox_rejected();
private:
Ui::copiarArchivo *ui;
QString rutaOrigen, rutaCopia;
};
#endif // COPIARARCHIVO_H
115
copiararchivo.cpp
#include "copiararchivo.h"
#include "ui_copiararchivo.h"
copiarArchivo::copiarArchivo(QWidget *parent) :
QWidget(parent),
ui(new Ui::copiarArchivo)
{
ui->setupUi(this);
}
copiarArchivo::~copiarArchivo()
{
delete ui;
}
void copiarArchivo::on_buttonBox_accepted()
{
QFile myFile (rutaOrigen);
QString nombreArchivo = ui->lineEdit->text();
if (!myFile.copy("/home/pi/Desktop/PRUEBAS/PROGRAMAS/"+ nombreArchivo + ".csv")){
//if (!myFile.copy("F:/Universidad/PROYECTOS/SCOMAR/PROGRAMAS/"+ nombreArchivo + ".csv")){
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("ERROR COPIANDO ARCHIVO");
msgBox.exec();
this->close();
}else{
this->close();
}
}
void copiarArchivo::on_buttonBox_rejected()
{
this->close();
}
guardararchivo.h
#ifndef GUARDARARCHIVO_H
#define GUARDARARCHIVO_H
#include <QWidget>
#include <QFile>
#include <QMessageBox>
namespace Ui {
class guardarArchivo;
}
public:
explicit guardarArchivo(QWidget *parent = 0);
~guardarArchivo();
116
private slots:
void on_buttonBox_accepted();
private:
Ui::guardarArchivo *ui;
};
#endif // GUARDARARCHIVO_H
guardararchivo.cpp
#include "guardararchivo.h"
#include "ui_guardararchivo.h"
guardarArchivo::guardarArchivo(QWidget *parent) :
QWidget(parent),
ui(new Ui::guardarArchivo)
{
ui->setupUi(this);
}
guardarArchivo::~guardarArchivo()
{
delete ui;
}
void guardarArchivo::on_buttonBox_accepted()
{
QString nombreArchivo = ui->lineEdit->text();
//QFile file("F:/Universidad/PROYECTOS/SCOMAR/PROGRAMAS/" + nombreArchivo + ".csv");
QFile file("/home/pi/Desktop/PRUEBAS/PROGRAMAS/" + nombreArchivo + ".csv");
modificarciclos.h
#ifndef MODIFICARCICLOS_H
#define MODIFICARCICLOS_H
#include <QWidget>
#include <qspinbox.h>
namespace Ui {
class modificarCiclos;
}
public:
explicit modificarCiclos(QWidget *parent = 0);
~modificarCiclos();
void cargarCiclos(QStringList);
117
int fila, columna;
public slots:
void EditarCelda();
signals:
void ciclosChanged(QStringList);
private slots:
void spinBoxChange(int value);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::modificarCiclos *ui;
QStringList data;
QStringList rowData;
QStringList datosLista;
};
#endif // MODIFICARCICLOS_H
modificarciclos.cpp
#include "modificarciclos.h"
#include "ui_modificarciclos.h"
modificarCiclos::modificarCiclos(QWidget *parent) :
QWidget(parent),
ui(new Ui::modificarCiclos)
{
ui->setupUi(this);
}
modificarCiclos::~modificarCiclos()
{
delete ui;
}
}
}
void modificarCiclos::EditarCelda(){
//ui->tableWidget->removeCellWidget(fila,columna);
fila = ui->tableWidget->currentItem()->row();
columna = ui->tableWidget->currentItem()->column();
118
connect(widget, SIGNAL(valueChanged(int)),this, SLOT(spinBoxChange(int)));
}
void modificarCiclos::on_pushButton_clicked()
{
QString datos;
for (int var = 0; var < datosLista.count(); ++var) {
rowData = datosLista.at(var).split(";");
void modificarCiclos::on_pushButton_2_clicked()
{
this->hide();
}
MÓDULOprogramacion.h
#ifndef MÓDULOPROGRAMACION_H
#define MÓDULOPROGRAMACION_H
#include <QMainWindow>
#include <QFile>
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardItemModel>
#include <QDebug>
namespace Ui {
class MÓDULOProgramacion;
}
public:
explicit MÓDULOProgramacion(QWidget *parent = 0);
~MÓDULOProgramacion();
QString rutaArchivo;
void CargarArchivo();
int fila, columna;
private slots:
void on_actionGuardar_Programa_triggered();
void on_actionInsertar_Linea_triggered();
void spinBoxChange(int value);
void on_actionSalir_triggered();
void on_actionEliminar_Linea_triggered();
119
public slots:
void EditarCelda();
private:
Ui::MÓDULOProgramacion *ui;
};
#endif // MÓDULOPROGRAMACION_H
MÓDULOprogramacion.cpp
#include "MÓDULOprogramacion.h"
#include "ui_MÓDULOprogramacion.h"
MÓDULOProgramacion::MÓDULOProgramacion(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MÓDULOProgramacion)
{
ui->setupUi(this);
}
MÓDULOProgramacion::~MÓDULOProgramacion()
{
delete ui;
}
void MÓDULOProgramacion::CargarArchivo(){
QString data;
QFile importedCSV(rutaArchivo);
QStringList rowOfData;
QStringList rowData;
data.clear();
rowOfData.clear();
rowData.clear();
if (importedCSV.open(QFile::ReadOnly))
{
data = importedCSV.readAll();
rowOfData = data.split("\n"); //Value on each row
importedCSV.close();
}
for (int x = 1; x < rowOfData.size()-1; x++) //rowOfData.size() gives the number of row
{
rowData = rowOfData.at(x).split(";"); //Number of collumn
}
}
ui->statusBar->showMessage(tr("File successfully loaded."), 3000);
}
void MÓDULOProgramacion::on_actionGuardar_Programa_triggered()
{
QFile file(rutaArchivo);
if (file.open(QFile::WriteOnly | QFile::Truncate))
{
QTextStream data(&file);
QStringList strList;
for( int c = 0; c < ui->tableWidget->columnCount(); ++c )
{
120
strList << ui->tableWidget->horizontalHeaderItem(c)-
>data(Qt::DisplayRole).toString();
}
}
data << strList.join( ";" )+"\n";
}
ui->statusBar->showMessage(tr("File saved successfully."), 3000);
file.close();
}
}
void MÓDULOProgramacion::on_actionInsertar_Linea_triggered()
{
int currentRow;
currentRow = ui->tableWidget->rowCount();
ui->tableWidget->setRowCount(currentRow + 1);
currentRow = ui->tableWidget->rowCount();
ui->tableWidget->setRowCount(currentRow + 1);
void MÓDULOProgramacion::EditarCelda(){
ui->tableWidget->removeCellWidget(fila,columna);
fila = ui->tableWidget->currentItem()->row();
columna = ui->tableWidget->currentItem()->column();
121
}
void MÓDULOProgramacion::on_actionSalir_triggered()
{
this->close();
}
void MÓDULOProgramacion::on_actionEliminar_Linea_triggered()
{
if(ui->tableWidget->isItemSelected(ui->tableWidget->currentItem())){
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("Realmente desea Eliminar las Lineas?");
msgBox.setStandardButtons(QMessageBox::Yes| QMessageBox::No);
if (msgBox.exec() == QMessageBox::Yes) {
ui->tableWidget->removeRow(ui->tableWidget->currentRow());
ui->tableWidget->removeRow(ui->tableWidget->currentRow()+1);
}
}else{
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("SE DEBE SELECCIONAR UNA LINEA");
msgBox.exec();
}
}
pantallaprincipal.h
#ifndef PANTALLAPRINCIPAL_H
#define PANTALLAPRINCIPAL_H
#include <QMainWindow>
#include "ingreso.h"
#include "cantidad.h"
#include "modificarciclos.h"
#include "cargarprograma.h"
#include "threadsensores.h"
#include "mantenimiento.h"
#include <QDebug>
#include <QMessageBox>
#include "wiringPi.h"
namespace Ui {
class pantallaPrincipal;
}
public:
explicit pantallaPrincipal(QWidget *parent = 0);
~pantallaPrincipal();
int cantidadActual;
int cantidadProg;
void configGPIO();
void definirSalidas(QString data, QString sentido);
QString Sensor1, Sensor2;
ThreadSensores *Sensores;
QMessageBox msgBox;
void lecturaSensores();
public slots:
122
void abrirCargarPrograma();
void VerPrograma(QString);
void progCantidad(int);
void leerPrograma(QString);
void progCiclos(QStringList list){
strList.clear();
strList << list;
}
void cambiarContLineas(int linea){
contLineas = linea;
}
private slots:
void on_pushButton_9_clicked();
void on_pushButton_clicked();
void on_pushButton_10_clicked(bool checked);
void on_pushButton_11_clicked();
void on_pushButton_3_clicked();
signals:
void sensorIzqChanged(QString);
void sensorDerChanged(QString);
private:
Ui::pantallaPrincipal *ui;
QString rutaProgramas;
QString NombreArchivo;
int contLineas;
QStringList strList;
QStringList rowData, salidas;
int sensorDer, sensorIzq, error, contaCiclos;
int
vel1,vel2,vel3,gui1,gui2,gui3,gui4,llaDel,llaDelMed,llaTra,llaTraMed,ronDelDer,ronTraDer,ronDelIz
q,ronTraIzq;
QString inputstate;
};
#endif // PANTALLAPRINCIPAL_H
pantallaprincipal.cpp
#include "pantallaprincipal.h"
#include "ui_pantallaprincipal.h"
pantallaPrincipal::pantallaPrincipal(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::pantallaPrincipal)
{
ui->setupUi(this);
ingreso conn;
cantidadActual = 0;
cantidadProg = 0;
rutaProgramas = "/home/pi/Desktop/PRUEBAS/PROGRAMAS/";
sensorDer = 0;
sensorIzq = 0;
error = 0;
contLineas = 0;
contaCiclos = 0;
wiringPiSetup();
configGPIO();
conn.connOpen();
QString nombrePrograma;
123
int cantidad;
QSqlQuery qry;
qry.prepare("SELECT NOMBRE_PROGRAMA, CANTIDAD_FALTANTE FROM PROGRAMA_CARGADO");
if(!qry.exec() )
qDebug() << qry.lastError();
else
while(qry.next()){
nombrePrograma = qry.value(0).toString();
cantidad = qry.value(1).toInt();
}
if (msgBox.exec() == QMessageBox::Yes) {
this->VerPrograma(nombrePrograma);
cantidadProg = cantidad;
ui->cantidadprogEdit->setText(QString::number(cantidadProg));
ui->cantidadresEdit->setText(QString::number(cantidadActual));
lecturaSensores();
}else{
this->VerPrograma("");
}
}else{
this->VerPrograma("");
}
Sensores->start();
}
pantallaPrincipal::~pantallaPrincipal()
{
delete ui;
}
void pantallaPrincipal::abrirCargarPrograma(){
cargarPrograma *CargarPrograma = new cargarPrograma;
connect(CargarPrograma,SIGNAL(archivoChanged(QString)),this,SLOT(VerPrograma(QString)));
CargarPrograma->show();
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
while (!in.atEnd()) {
strList << in.readLine();
}
strList.removeFirst();
ui->programaEdit->setText(archivo);
ui->lineasEdit->clear();
contLineas = 0;
cantidadActual = 0;
lecturaSensores();
124
qDebug() << "Sensor activo: " << Sen;
error = 0;
if(Sen == "DER"){
//if (sender()->objectName() == "pushButton_2"){
if(sensorIzq == 0 && contLineas == 0){
sensorDer = 1 ;
rowData = strList.at(contLineas).split(";");
ui->cicloProgLabel->setText(QString::number(rowData[6].toInt()));
ui->cicloReaLabel->setText("0");
}else if(sensorIzq == 1){
sensorDer = 1;
sensorIzq = 0;
}else if (sensorDer == 1 && sensorIzq == 0){
error = 1;
if(msgBox.isHidden()){
msgBox.setWindowTitle(":: MENSAJE ::");
msgBox.setText("DOBLE LECTURA DE SENSOR DERECHO");
msgBox.exec();
}
}
}
if(Sen == "IZQ"){
//if(sender()->objectName() == "pushButton_8"){
if(sensorDer == 1){
sensorIzq = 1 ;
sensorDer = 0 ;
}else if(sensorIzq == 1 && sensorDer == 0){
error = 1;
if(msgBox.isHidden()){
msgBox.setWindowTitle(":: MENSAJE ::");
msgBox.setText("DOBLE LECTURA DE SENSOR IZQUIERDO");
msgBox.exec();
}
}
}
if(ui->programaEdit->text() != ""){
if(((sensorDer == 1 || sensorIzq == 1) && error == 0)){
if (cantidadActual < cantidadProg){
if (sensorDer == 1) {
if(rowData[6].toInt() == contaCiclos){
contLineas++;
rowData = strList.at(contLineas).split(";");
ui->cicloProgLabel->setText(QString::number(rowData[6].toInt()));
contaCiclos = 0;
ui->cicloReaLabel->setText(QString::number(contaCiclos));
line = "Linea " + QString::number(contLineas+1) + " << " +
strList[contLineas];
definirSalidas(strList[contLineas], "<<");
ui->lineasEdit->setText(line);
}else{
line = "Linea " + QString::number(contLineas+1) + " << " +
strList[contLineas];
definirSalidas(strList[contLineas], "<<");
ui->lineasEdit->setText(line);
}
}
if(sensorIzq == 1){
contaCiclos++;
if(rowData[6].toInt() == contaCiclos){
contLineas++;
line = "Linea " + QString::number(contLineas+1) + " >> " +
strList[contLineas];
definirSalidas(strList[contLineas], ">>");
ui->lineasEdit->setText(line);
ui->cicloReaLabel->setText(QString::number(contaCiclos));
}else{
contLineas++;
ui->cicloReaLabel->setText(QString::number(contaCiclos));
125
line = "Linea " + QString::number(contLineas+1) + " >> " +
strList[contLineas];
definirSalidas(strList[contLineas], ">>");
ui->lineasEdit->setText(line);
contLineas--;
}
}
ui->cantidadresEdit->setText(QString::number(cantidadActual));
}else{
QMessageBox msgBox;
msgBox.setWindowTitle(":: MENSAJE ::");
msgBox.setText("PRODUCCION TERMINADA");
msgBox.exec();
cantidadActual = 0;
//ui->programaEdit->clear();
}
}else{
qDebug() << "ERROR DE DOBLE LECTURA DE SENSOR";
error = 0;
return;
}
}else{
QMessageBox msgBox;
msgBox.setWindowTitle(":: MENSAJE ::");
msgBox.setText("NO HAY UN PROGRAMA CARGADO");
msgBox.exec();
}
void pantallaPrincipal::on_pushButton_9_clicked()
{
cantidad *cant = new cantidad;
cant->definirCantidad(cantidadActual, cantidadProg, ui->programaEdit->text());
connect(cant,SIGNAL(cantidadChanged(int)),this,SLOT(progCantidad(int)));
cant->show();
}
void pantallaPrincipal::on_pushButton_clicked()
{
if(ui->programaEdit->text() != ""){
modificarCiclos *ciclo = new modificarCiclos;
ciclo->cargarCiclos(strList);
connect(ciclo,SIGNAL(ciclosChanged(QStringList)),this,SLOT(progCiclos(QStringList)));
ciclo->show();
}else{
QMessageBox msgBox;
msgBox.setWindowTitle("MENSAJE");
msgBox.setText("NO HAY UN PROGRAMA CARGADO");
msgBox.exec();
}
}
void pantallaPrincipal::configGPIO(){
126
//CONFIGURACION PINES DE ENTRADA
pinMode(5,INPUT); //SENSOR IZQUIERDO
pinMode(8,INPUT); //SENSOR DERECHO
pinMode(7,OUTPUT); //LUZ
pinMode(0,OUTPUT); //VEL1
pinMode(2,OUTPUT); //VEL2
pinMode(3,OUTPUT); //VEL3
pinMode(21,OUTPUT); //GUI1
pinMode(22,OUTPUT); //GUI2
pinMode(23,OUTPUT); //GUI3
pinMode(24,OUTPUT); //GUI4
pinMode(25,OUTPUT);
pinMode(1,OUTPUT); //llaDel
pinMode(4,OUTPUT); //llaDelMed
pinMode(5,OUTPUT); //llaTra
pinMode(6,OUTPUT); //llaTraMed
pinMode(26,OUTPUT); //ronDelDer
pinMode(27,OUTPUT); //ronTraDer
pinMode(28,OUTPUT); //ronDelIzq
pinMode(29,OUTPUT); //ronTraIzq
//VELOCIDAD
switch (salidas[0].toInt()) {
case 1:
vel1 = 0;
vel2 = 0;
vel3 = 0;
break;
case 2:
vel1 = 1;
vel2 = 0;
vel3 = 0;
break;
case 3:
vel1 = 1;
vel2 = 1;
vel3 = 0;
break;
case 4:
vel1 = 0;
vel2 = 1;
vel3 = 0;
break;
case 5:
vel1 = 0;
vel2 = 1;
vel3 = 1;
break;
case 6:
vel1 = 1;
vel2 = 1;
vel3 = 1;
break;
case 7:
vel1 = 0;
vel2 = 0;
127
vel3 = 1;
break;
default:
vel1 = 0;
vel2 = 0;
vel3 = 0;
break;
}
//GUIA HILOS
switch (salidas[1].toInt()) {
case 1:
gui1 = 1;
gui2 = 0;
gui3 = 0;
gui4 = 0;
break;
case 2:
gui1 = 0;
gui2 = 1;
gui3 = 0;
gui4 = 0;
break;
case 3:
gui1 = 0;
gui2 = 0;
gui3 = 1;
gui4 = 0;
break;
case 4:
gui1 = 0;
gui2 = 0;
gui3 = 0;
gui4 = 1;
break;
default:
gui1 = 0;
gui2 = 0;
gui3 = 0;
gui4 = 0;
break;
}
//LLAVE DELANTERA
switch (salidas[2].toInt()) {
case 0:
llaDel = 0;
llaDelMed = 0;
break;
case 1:
llaDel = 1;
llaDelMed = 1;
break;
case 6:
llaDel = 0;
llaDelMed = 1;
break;
default:
llaDel = 0;
llaDelMed = 0;
break;
}
//LLAVE TRASERA
switch (salidas[3].toInt()) {
case 0:
llaTra = 0;
llaTraMed = 0;
break;
case 1:
llaTra = 1;
llaTraMed = 1;
128
break;
case 6:
llaTra = 0;
llaTraMed = 1;
break;
default:
llaTra = 0;
llaTraMed = 0;
break;
}
if (sentido == "<<"){
//RONDO DELANTERO DERECHO
switch (salidas[4].toInt()) {
case 0:
ronDelDer = 0;
break;
case 1:
ronDelDer = 1;
break;
default:
ronDelDer = 0;
break;
}
switch (salidas[5].toInt()) {
case 0:
ronTraIzq = 0;
break;
case 1:
ronTraIzq = 1;
break;
default:
ronTraIzq = 0;
break;
}
digitalWrite(0,vel1);
digitalWrite(2,vel2);
digitalWrite(3,vel3);
digitalWrite(21,gui1);
digitalWrite(22,gui2);
digitalWrite(23,gui3);
129
digitalWrite(24,gui4);
digitalWrite(1,llaDel);
digitalWrite(4,llaDelMed);
digitalWrite(5,llaTra);
digitalWrite(6,llaTraMed);
if (sentido == "<<"){
digitalWrite(26,ronDelDer);
digitalWrite(27,ronTraDer);
digitalWrite(28,0);
digitalWrite(29,0);
}else{
digitalWrite(28,ronDelIzq);
digitalWrite(29,ronTraIzq);
digitalWrite(26,0);
digitalWrite(27,0);
}
}
void pantallaPrincipal::on_pushButton_11_clicked()
{
//system("sudo poweroff");
system("sudo halt");
}
void pantallaPrincipal::on_pushButton_3_clicked()
{
Mantenimiento *m = new Mantenimiento;
m->show();
}
void pantallaPrincipal::lecturaSensores(){
//if(Sensores->isFinished()){
Sensores = new ThreadSensores(this);
connect(Sensores,SIGNAL(sensorChanged(QString)),this,SLOT(leerPrograma(QString)));
//}
}
threadsensores.h
#ifndef THREADSENSORES_H
#define THREADSENSORES_H
#include <QThread>
130
void sleep(int valor);
signals:
void sensorChanged(QString);
public slots:
private:
int S1,S2;
};
#endif // THREADSENSORES_H
threadsensores.cpp
#include "threadsensores.h"
#include <QtCore>
#include "qdebug.h"
#include "wiringPi.h"
ThreadSensores::ThreadSensores(QObject *parent) :
QThread(parent)
{
}
void ThreadSensores::run(){
S1 = 0;
S2 = 0;
for (;;){
}
}
void ThreadSensores::sleep(int valor){
msleep(valor);
}
131