Plataforma de experimentación para prototipado de diseños

Transcripción

Plataforma de experimentación para prototipado de diseños
TRABAJO FIN DE ESTUDIOS
PROYECTO FIN DE CARRERA
Plataforma de experimentación para prototipado de
diseños mediante Arduino
Santiago Reig Chiva
Tutor: Carlos Alberto Rodríguez González
Curso 2011-2012
Plataforma de experimentación para prototipado de diseños mediante
Arduino, trabajo fin de estudios
de Santiago Reig Chiva, dirigido por Carlos Alberto Rodríguez González (publicado por la
Universidad de La Rioja), se difunde bajo una Licencia
Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.
Permisos que vayan más allá de lo cubierto por esta licencia pueden solicitarse a los
titulares del copyright.
©
©
El autor
Universidad de La Rioja, Servicio de Publicaciones, 2012
publicaciones.unirioja.es
E-mail: [email protected]
“PLATAFORMA DE EXPERIMENTACIÓN PARA
PROTOTIPADO DE DISEÑOS MEDIANTE ARDUINO”
Peticionario:
Universidad de La Rioja
Área de proyectos de ingeniería
Informante:
Santiago Reig Chiva
Alumno de I.T.I. Electrónica Industrial
Universidad de La Rioja
Director:
Carlos Alberto Rodríguez González
Departamento de Ingeniería Eléctrica
Lugar y fecha:
Logroño, 20 de julio de 2012
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Índice
Índice
Memoria ............................................................................................. 3
Anexos ..............................................................................................85
Pliego de condiciones ............................................................... 166
Planos ............................................................................................ 183
Presupuesto ................................................................................. 185
Bibliografía .................................................................................. 195
Página 2
MEMORIA
DOCUMENTO Nº 1
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Índice de la memoria
1.
Antecedentes............................................................................................ 13
2.
Objetivo del proyecto ............................................................................... 14
3.
Definiciones .............................................................................................. 17
4.
Introducción ............................................................................................. 19
4.1.
El polímetro .............................................................................................. 19
4.2.
Osciloscopio .............................................................................................. 20
4.3.
Analizador lógico ...................................................................................... 21
4.4.
Actualidad ................................................................................................. 22
5.
Estudios previos al diseño ........................................................................ 23
5.1.
Estudio de ArduLab................................................................................... 23
5.2.
Estudio de Bus Pirate ................................................................................ 25
5.3.
Estudio de Little Wire ............................................................................... 28
6.
Análisis de soluciones ............................................................................... 30
6.1.
Comparativa de soluciones para la placa de interfaz ............................... 31
6.1.1.
Análisis de la plataforma Atmel AVR................................................. 32
6.1.1.1. Análisis de Arduino ...................................................................... 32
6.1.2.
Análisis de la plataforma Microchip PIC............................................ 33
Página 4
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.1.2.1. Análisis de Pingüino ..................................................................... 33
6.1.2.2. Análisis chipKIT ............................................................................ 34
6.1.3.
Análisis de la plataforma ARM .......................................................... 35
6.1.3.1. Análisis de ST Micro ..................................................................... 36
6.1.3.2. Análisis de NXP ............................................................................ 37
6.1.4.
Análisis de la plataforma de Texas Instruments MSP430 ................. 38
6.1.4.1. Análisis de Launchpad ................................................................. 38
6.2.
Comparativa de soluciones para el medio de comunicación ................... 40
6.2.1.
Análisis del puerto paralelo............................................................... 40
6.2.2.
Análisis del puerto serie .................................................................... 41
6.2.3.
Análisis del USB ................................................................................. 42
6.2.4.
Análisis del Bluetooth........................................................................ 42
6.2.5.
Análisis del XBee................................................................................ 43
6.2.6.
Otras soluciones ................................................................................ 44
6.3.
Comparativa de soluciones para el protocolo de comunicaciones .......... 45
6.3.1.
Análisis de Firmata ............................................................................ 45
6.3.2.
Análisis del protocolo de ArduLab .................................................... 47
6.3.3.
Análisis para la creación de un protocolo propio ............................. 47
6.4.
Comparativa de soluciones para el lenguaje de programación ............... 48
Página 5
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.4.1.
Análisis de Java .................................................................................. 48
6.4.2.
Análisis de Qt ..................................................................................... 49
6.4.3.
Análisis de Python ............................................................................. 50
7.
Descripción de la solución adoptada ........................................................ 52
7.1.
Descripción de la placa de interfaz adoptada .......................................... 52
7.2.
Descripción del medio de comunicación adoptado ................................. 52
7.3.
Descripción del protocolo de comunicación adoptado ........................... 53
7.4.
Descripción del lenguaje adoptado .......................................................... 53
8.
Desarrollo ................................................................................................. 55
8.1.
Diseño general .......................................................................................... 55
8.2.
Análisis del protocolo Firmata .................................................................. 56
8.2.1.
Introducción ...................................................................................... 56
8.2.2.
Descripción del protocolo ................................................................. 57
8.2.2.1. Mensajes ...................................................................................... 57
8.2.3.
Descripción de la comunicación ........................................................ 58
8.2.4.
Mejoras en la implementación del protocolo ................................... 60
8.2.5.
Descripción de la capa física.............................................................. 61
8.2.6.
Descripción de los conectores........................................................... 61
8.2.7.
Descripción del cableado .................................................................. 63
Página 6
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
8.2.8.
8.3.
Memoria
Distancias y terminaciones................................................................ 63
Análisis de la aplicación software ............................................................. 64
8.3.1.
Introducción ...................................................................................... 64
8.3.2.
Entorno de trabajo utilizado para el desarrollo ................................ 66
8.3.3.
Descripción del código fuente........................................................... 67
8.3.3.1. Inicialización de los módulos ....................................................... 67
8.3.3.2. Selección del puerto serie ........................................................... 69
8.3.3.3. Programación del Arduino ........................................................... 70
8.3.3.4. Comunicación con Firmata .......................................................... 71
8.4.
Análisis de la placa de interfaz ................................................................. 74
8.4.1.
Introducción ...................................................................................... 74
8.4.2.
Características principales ................................................................. 76
8.4.3.
Formas de alimentación eléctrica ..................................................... 77
8.4.4.
Análisis de la memoria ...................................................................... 78
8.4.5.
Análisis de las entradas y salidas....................................................... 78
8.4.6.
Análisis de la Interfaz USB-Serie........................................................ 79
8.4.6.1. Chip FTDI ...................................................................................... 80
8.4.6.2. Chip Atmel ................................................................................... 80
8.4.6.3. Sin chip......................................................................................... 81
Página 7
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8.4.7.
Análisis de los métodos de programación ........................................ 82
8.4.8.
Análisis del entorno de trabajo ......................................................... 82
Página 8
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Índice de ilustraciones
Ilustración 1 | Polímetro analógico .................................................................... 20
Ilustración 2 | Polímetro digital .......................................................................... 20
Ilustración 3 | Osciloscopio analógico ................................................................ 21
Ilustración 4 | Osciloscopio digital ..................................................................... 21
Ilustración 5 | Analizador lógico ......................................................................... 21
Ilustración 6 | Captura de ArduLab .................................................................... 24
Ilustración 7 | Bus Pirate v3.6............................................................................. 26
Ilustración 8 | Usando el Bus Pirate con Putty ................................................... 28
Ilustración 9 | Little Wire .................................................................................... 29
Ilustración 10 | Arduino UNO ............................................................................. 33
Ilustración 11 | Placa Pingüino ........................................................................... 34
Ilustración 12 | chipKIT Uno32 ........................................................................... 35
Ilustración 13 | STM32 Discovery ....................................................................... 37
Ilustración 14 | LPCXPRESSO con ARM Cortex-M0 ............................................ 38
Ilustración 15 | TI Launchpad ............................................................................. 39
Ilustración 16 | Módulo Bluetooth ..................................................................... 42
Ilustración 17 | XBee Serie 1 .............................................................................. 43
Página 9
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 18 | Diagrama de conexiones ........................................................... 56
Ilustración 19 | Conectores USB ......................................................................... 62
Ilustración 20 | Líneas de datos.......................................................................... 63
Ilustración 21 | Cable USB A-B............................................................................ 63
Ilustración 22 | Proyecto ejecutado en Windows 7 ........................................... 64
Ilustración 23 | Proyecto ejecutado en Linux Ubuntu 12.04 ............................. 65
Ilustración 24 | Proyecto ejecutado en Mac OS X Lion ...................................... 65
Ilustración 25 | Eric IDE ...................................................................................... 66
Ilustración 26 | Logo Arduino ............................................................................. 74
Ilustración 27 | Arduino UNO R2 ........................................................................ 75
Ilustración 28 | ATmega328P ............................................................................. 76
Ilustración 29 | Interfaz USB-Serie ..................................................................... 79
Ilustración 30 | Arduino Duemilanove ............................................................... 80
Ilustración 31 | Arduino UNO ............................................................................. 81
Ilustración 32 | Arduino Leonardo ..................................................................... 81
Ilustración 33 | Software Arduino en Windows 7 .............................................. 83
Ilustración 34 | Botones de verificación y carga ................................................ 83
Página 10
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Índice de tablas
Tabla 1 | Análisis Arduino UNO ......................................................................... 33
Tabla 2 | Análisis de Pingüino ............................................................................. 34
Tabla 3 | Análisis chipKIT .................................................................................... 35
Tabla 4 | Análisis de ST Micro ............................................................................. 37
Tabla 5 | Análisis de NXP .................................................................................... 38
Tabla 6 | Análisis de Launchpad ......................................................................... 39
Tabla 7 | Análisis del puerto paralelo ................................................................. 41
Tabla 8 | Análisis del puerto serie ...................................................................... 41
Tabla 9 | Análisis del USB ................................................................................... 42
Tabla 10 | Análisis del Bluetooth ........................................................................ 43
Tabla 11 | Análisis del XBee ................................................................................ 44
Tabla 12 | Análisis de Firmata ............................................................................ 46
Tabla 13 | Análisis del protocolo de ArduLab .................................................... 47
Tabla 14 | Análisis de protocolo propio ............................................................. 48
Tabla 15 | Análisis de Java .................................................................................. 49
Tabla 16 | Análisis de Qt ..................................................................................... 50
Tabla 17 | Análisis de Python ............................................................................. 51
Página 11
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Tabla 18 | Comparación mensajes MIDI y Firmata ............................................ 58
Tabla 19 | Características del Arduino UNO ....................................................... 76
Página 12
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
1. Antecedentes
El presente proyecto, titulado “Plataforma de experimentación para
prototipado de diseños mediante Arduino”, surge de las conversaciones mantenidas
entre D. Eduardo Gallego, principal desarrollador de ArduLab y orientador del aula de
robótica del C.P. Miguel Hernández de Madrid; D. Carlos Alberto Rodríguez González,
profesor perteneciente al departamento de Ingeniería Eléctrica de la Universidad de La
Rioja y D. Santiago Reig Chiva, alumno de Ingeniería Técnica Industrial especialidad en
Electrónica Industrial de la Universidad de La Rioja, con motivo de la realización del
proyecto final de carrera de dicho alumno.
El nombre en clave utilizado para el proyecto es Platex, por lo que en las
ocasiones en las que aparezca esta palabra, se referirá al proyecto en si.
Este documento es el resultado de la elaboración del proyecto y se presenta a
efectos de reconocimiento académico para la obtención del título de Ingeniero Técnico
Industrial especialidad en Electrónica Industrial.
Página 13
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
2. Objetivo del proyecto
El objetivo de este proyecto es el desarrollo de una solución formada por
aplicación multiplataforma, garantizando su funcionamiento en Windows, Linux y Mac
OS, con la que poder manejar la información desde y hacia la placa de interfaz; un
protocolo de comunicación y una placa de interfaz con el mundo físico.
Hace dos años apareció ArduLab, un software que combinado con una placa
Arduino permitía controlar manualmente los periféricos del chip integrado en la placa
Arduino, por lo que facilitaba las tareas de prototipado al poder cambiar los valores
lógicos en los pines, leer dichos valores o tensiones de forma analógica, sacar ondas
PWM y todo esto sin tener que cambiar cables ni programar una línea de código por
parte del usuario. El problema de este programa es que es de código cerrado y
programado sobre LabView, por lo que depende también depende de las librerías
cerradas de éste. La idea inicial fue la de que el programa llegara a la mayor cantidad
de personas, pero para ello se necesitaba soporte para Windows, Linux y Mac, y
aunque LabView en las especificaciones proveía ese soporte, a la hora de la realidad no
se podía preparar el compilar el programa para los sistemas operativos Linux y Mac,
quedando sólo disponible la versión de Windows. Las actualizaciones de las librerías
han ido arreglando problemas existentes en el pasado, pero llegan muy lentamente y
no solucionan el problema de forma completa, por lo que no es viable la dependencia
que existe sobre éste paquete de software.
El proyecto surge como respuesta a estos problemas, crear un programa similar
en funcionamiento para solucionar este problema de dependencia, por lo que se vio la
necesidad evidente de crear un framework desde cero, implementando desde el
comienzo el soporte multiplataforma, a partir del cual ir incorporando tanto módulos
similares a los ya existentes como otros nuevos. También era requisito indispensable
que fuera de código abierto, para permitir que cualquier persona pudiera modificar,
adaptar o añadir los cambios que crea necesarios sin tener que depender del
desarrollador principal en caso de que se tengan los conocimientos necesarios para
ello.
Las características
especificaciones:
del
framework
deberán
cumplir
las
siguientes
Página 14
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria

Placa de interfaz con el mundo físico accesible a todo el mundo y de bajo
coste.

Los periféricos de la placa de interfaz deben incluir al menos los siguientes:
entradas y salidas digitales, entradas analógicas, salidas de PWM y USART
para la comunicación con el ordenador.

Fácil montaje de la placa de interfaz de manera casera y con componentes
comunes.

Protocolo de comunicaciones simple pero estable.

Programa de la interfaz de usuario en el ordenador intuitiva.

Fácil inclusión de nuevos módulos al programa.

Todas las partes estén bajo licencias libres y sean de código abierto.

Multiplataforma: Windows, Linux, Mac OS.
Por todo ello se consideran importantes las siguientes tareas:

Estudio del estado del arte sobre sistemas de prototipado similares ya
existentes.

Aprendizaje y uso del entorno de desarrollo integrado Eric, así como del
lenguaje de programación Python.

Análisis del protocolo de comunicaciones Firmata.

Aprendizaje y uso tanto entorno de desarrollo integrado Arduino como su
ecosistema y los lenguajes de programación C y C++.

Estudio de la plataforma y programación de los AVR de Atmel.
Página 15
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Página 16
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
3. Definiciones
El vocabulario técnico utilizado a lo largo de este documento es definido para
su correcta comprensión:

Microcontrolador: es un circuito integrado programable, capaz de ejecutar
órdenes grabadas en su memoria. Está formado por la unidad central de
procesamiento, memoria y periféricos de entrada y salida.

Framework: es un conjunto estandarizado de conceptos, prácticas y
criterios para enfocar un tipo de problemática particular, que sirve como
referencia para enfrentar y resolver nuevos problemas de índole similar.

Bit: es la unidad mínima de información empleada en informática, capaz de
representar dos estados, verdadero o falso, activado o desactivado.

Byte: unidad de información formada por 8 bits.

Core: (núcleo) parte principal de los microcontroladores y
microprocesadores que se encarga de todo el procesamiento. Está formado
por los registros, la unidad de control, la unidad aritmético lógica y los
buses.

Compilador: programa informático que traduce el código fuente escrito en
un lenguaje de programación a otro lenguaje de programación de menor
nivel, generando un programa equivalente que la máquina sea capaz de
interpretar. Normalmente al lenguaje al que se compila suele ser a lenguaje
máquina.

Toolchain: (cadena de herramientas) conjunto de herramientas de
compilación y enlazado, necesarias para transformar el código fuente en un
programa ejecutable compatible con la plataforma con la que se desarrolla.
Página 17
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria

DIP: empaquetado en el que se pueden fabricar los chips, consistente en
dos filas paralelas de pines distribuidas a lo largo del empaquetado y con
una separación de 0,1 pulgadas entre ellos.

Shield: en el mundo relacionado con Arduino, se refiere a la placa que se
conecta encima de éste para ampliar sus capacidades tanto de
procesamiento, como de control o interfaz.

Bootloader: porción de código almacenado en una zona especial de la flash
del microcontrolador que le permite ejecutarse en cada inicio.
Normalmente es utilizado para poder programar el microcontrolador a
través del puerto serie en vez de con un programador especializado.
Página 18
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
4. Íntroduccion
Las herramientas para prototipado han ido apareciendo en el tiempo según se
iba aumentado el conocimiento existente sobre la física, especialmente en los campos
de la electricidad y magnetismo. Estas herramientas son vitales tanto para el desarrollo
de nuevas aplicaciones como para la reparación y revisión del funcionamiento de las ya
existentes.
Las herramientas más importantes y versátiles para análisis en la historia han
sido el voltímetro, procedente del desarrollo de los galvanómetros y el osciloscopio.
La tecnología ha ido mejorando a lo largo de los años y esto ha permitido crear
analizadores para magnitudes físicas que no se podían verificar con exactitud o hacerlo
de una manera más barata, sencilla o cómoda.
El analizador lógico apareció como el sustituto de los osciloscopios para el
análisis de circuitos digitales, que permitía tener un gran número de entradas en
comparación con el primero.
4.1. El polímetro
El polímetro es un instrumento eléctrico portátil para medir directamente
magnitudes eléctricas como pudieran ser tensiones, corrientes o pasivas como
resistencias, continuidad y otras. Las medidas pueden realizarse para corriente
continua o alterna.
Los modelos más avanzados pueden incluir mediciones más avanzadas tales
como temperatura, normalmente con el uso de termopares, capacidades,
inductancias, etc.
Página 19
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Ilustración 1 | Polímetro analógico
Memoria
Ilustración 2 | Polímetro digital
Los polímetros han sido tradicionalmente analógicos, basados en la tecnología
del galvanómetro, aunque en las últimas décadas ha desaparecido totalmente del
mercado en favor de los modelos digitales.
4.2. Osciloscopio
Un osciloscopio es un instrumento de medición electrónico para la
representación gráfica de señales eléctricas que pueden variar en el tiempo. Dada su
gran versatilidad, se utiliza con asiduidad en electrónica y telecomunicaciones.
Están clasificados según su funcionamiento interno en analógicos o digitales,
siendo el resultado mostrado prácticamente iguales, teniendo cada uno sus ventajas y
desventajas, aunque la tendencia actual es la de adoptar la digital, ya que suelen
incorporar una mayor cantidad de características comparados con sus similares
analógicos.
Página 20
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 3 | Osciloscopio analógico
Ilustración 4 | Osciloscopio digital
4.3. Analizador lógico
Es un instrumento de medida que captura los datos de un circuito digital y los
muestra para su análisis, de un modo similar a un osciloscopio, como un diagrama de
tiempos. Pero también existen otras representaciones que pueden ser de más utilidad
como decodificación de un protocolo que se esté usando, lenguaje ensamblador o
relacionar el código ensamblador con el código fuente.
Un analizador lógico, al igual que el osciloscopio, inicia la captura cuando en el
circuito a analizar se da una determinada condición lógica (entre todos los canales). En
ese momento se realiza una gran captura de datos del sistema que se está observando,
para más tarde poder observarlos.
Ilustración 5 | Analizador lógico
Página 21
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Estos analizadores pueden existir como dispositivos independientes, con sus
controles, pantallas y demás hardware necesario; como basados en PC, normalmente
conectados a través de USB o Ethernet y mostrando los datos en el software del
ordenador, por lo que son más baratos al sólo necesitar el hardware de captura; o
como está empezando a aparecer, integrados en osciloscopio digitales de alto
rendimiento, teniendo ambos dispositivos en uno solo.
4.4. Actualidad
Actualmente se utilizan todas las herramientas mencionadas anteriormente y la
práctica totalidad de ellas en las versiones digitales o electrónicas, que poseen una
funcionalidad mucho mayor a la de sus homólogos analógicos, aunque cuenta con las
limitaciones de la propia conversión de analógico a digital y al revés, como pueden ser,
velocidad, resolución, etc.
Página 22
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
5. Estudios previos al diseno
Para definir las características del proyecto final, se han realizado estudios
previos de las soluciones ya existentes para poder mejorarlas.
5.1. Estudio de ArduLab
La única solución similar existente hasta la fecha, ha sido el paquete de
software ArduLab, también en combinación con una placa Arduino.
ArduLab ha sido desarrollado por la asociación de robótica educativa
Complubot, localizada en el C.P. Miguel Hernández de la ciudad de Alcalá de Henares
en la comunidad autónoma de Madrid. Se puede descargar sin limitaciones desde la
página del grupo.
ArduLab es un software similar, salvando las distancias, al realizado en éste
proyecto. Permite interactuar con una placa Arduino para crear un laboratorio virtual y
de esta manera, realizar actividades y experimentos.
Es un programa realizado en LabView, por lo que es necesaria la adquisición de
una licencia de éste para poder realizar su distribución, también se depende completa
y únicamente de la empresa desarrolladora para solucionar los fallos existentes en las
librerías y procesos.
Página 23
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 6 | Captura de ArduLab
Pretendía ser un programa gratuito multiplataforma y se consiguió el primer
objetivo, pero el segundo no fue todavía terminado, ya sea por fallos en las librerías
que no permitían que el software funcionara como debiera o en los procesos de
compilación, por lo que no se podía conseguir siquiera el paquete para distribuir.
El programa está distribuido bajo una licencia freeware, es decir, se puede
descargar el programa de forma gratuita y con acceso a toda su funcionalidad de
forma ilimitada. El código fuente del Arduino fue liberado (aunque sin especificar bajo
que licencia) y está disponible a cualquiera que se baje su paquete de software,
mientras que el del propio software nunca ha sido liberado para que la comunidad
pudiera solucionar posibles fallos existentes o se facilitara la conversión del software a
una plataforma que permita sin licencias que restrinjan su desarrollo o distribución y
garanticen en mayor medida la compatibilidad multiplataforma, tal y como se
pretende en el proyecto de que trata este documento.
Página 24
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
La transmisión entre la placa Arduino y el software se realiza a través del puerto
serie virtual sobre el protocolo USB y se utiliza un protocolo de comunicación de
creación propia, que es simple y eficaz, aunque de limitada escalabilidad, no muy
optimizado y difícil de rescribir para ser utilizado por otras vías de comunicación como
podría ser Ethernet.
5.2. Estudio de Bus Pirate
Bus Pirate es una herramienta que comparte la misma filosofía que este
proyecto, descubrir el funcionamiento de un dispositivo sin tener que llegar a
programar una sola línea de código.
Fue creada por Ian Lesnet mientras era escritor en el blog de noticias de
electrónica Hackaday, que debido al éxito del proyecto creó la empresa Dangerous
Prototypes, la cual se ocupa del actual desarrollo de éste proyecto entre otros tantos
que han ido apareciendo. La evolución del proyecto no es realizada sólo por Ian, si no
que al tratarse de un proyecto de software y hardware libre, mucha gente colabora
con su tiempo y código para la mejora de la herramienta en beneficio de toda la
comunidad de usuarios.
El hardware de Bus Pirate es un diseño propio basado en la familia de
microcontroladores PIC, utilizando un chip de la empresa FTDI para realizar la
conversión de serie a USB y poder conectarlo al PC de una manera sencilla una vez los
drivers estén instalados correctamente. En futuras revisiones se va a eliminar este chip
conversor e implementar el stack USB dentro del propio PIC, gracias a unas librerías
USB que se han desarrollado recientemente y de software libre, que permiten la
distribución libre del código fuente del proyecto, al contrario de lo que ocurría con las
librerías propietarias de Microchip.
Página 25
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 7 | Bus Pirate v3.6
BusPirate está más orientado a desarrolladores, ya que sus funcionalidades son
las siguientes:

Interfaz con buses de comunicación
o 1-Wire
o I2C
o SPI
o Serie
o JTAG
o MIDI
o Teclados de PC
o Y más

Programar microcontroladores
o PIC
Página 26
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
o AVR

Herramienta de depuración de chips ARM

Programador de CPLDs

Flasheador de ROMs serie

Medidor de frecuencia y generador de onda cuadrada

Analizador lógico de bajo coste

Medidor de voltaje

Otras muchas
Como se podrá apreciar más adelante, comparte muchas funcionalidades con el
proyecto del que trata este documento, pero el proyecto Bus Pirate está orientado
más hacia el desarrollador, ya que la interfaz se realiza a través de una consola a través
del puerto serie, aunque recientemente han ido saliendo interfaces de usuario que
realizan la comunicación con el Bus Pirate y facilitan el uso de éste.
Página 27
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 8 | Usando el Bus Pirate con Putty
5.3. Estudio de Little Wire
Little Wire es un proyecto basado en el programador de microcontroladores
AVR vusbtiny, al que se le añadieron características extras, quedando su funcionalidad
en:

Programación de microcontroladores Atmel AVR

Control de pines digitales

Control de pines con PWM

Manejo de servos

Control del módulo I2C

Control del módulo SPI
Página 28
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva

Memoria
Control del módulo UART
Como se puede ver, es muy similar al Bus Pirate en cuanto a funcionalidad,
pero su principal diferencia es que la comunicación se realiza a través del protocolo
USB puro, sin emulación de puerto serie u otras técnicas, y junto con el proyecto se
desarrollaron librerías con una API basadas en la librería multiplataforma de
comunicación por USB LibUSB. Estas librerías fueron realizadas en varios lenguajes de
comunicación tales como C, C++, C#, etc. por lo que le permite a una gran masa de
desarrolladores utilizar dicha placa sin mayores complicaciones.
Ilustración 9 | Little Wire
Página 29
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6. Analisis de soluciones
La solución ideal será una combinación de placa de interfaz, protocolo de
comunicaciones y software que congenien de forma que permita realizar el proyecto
sin una gran inversión de tiempo.
Al ser un proyecto de software libre, podremos utilizar el trabajo pasado y
actual de la comunidad de software libre sobre el que construir nuestro proyecto.
Página 30
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.1. Comparativa de soluciones para la placa de
interfaz
Para realizar la interacción entre el software y el mundo físico, lo más sencillo
es utilizar una placa con un microcontrolador con una cantidad aceptable de pines
disponibles para nuestro uso, salidas de PWM, temporizadores y entradas analógicas,
con lo que poder tener un gran abanico de posibilidades de uso.
Las características que deberán reunir estos componentes para ser objetos del
estudio, serán las siguientes:

Alta disponibilidad en los distribuidores de componentes electrónicos más
conocidos y presentes alrededor del mundo.

Larga vida útil, es decir, que no estén en proceso de ser descatalogados en
corto plazo, para evitar tener que rescribir o portar el código de la parte de
hardware a otra plataforma.

Precio reducido, incluso en bajas cantidades, con una alta relación
funcionalidad/precio.

Baja cantidad de electrónica adicional necesaria para el funcionamiento del
microcontrolador, así como su precio, facilitando de esta manera poder se
replicada de forma a partir de los planos de la placa recomendada. Esto
facilita el acceso al proyecto en lugares y países en los que el acceso a la
electrónica está muy limitado.

Existencia de placas de desarrollo basadas en el microcontrolador
analizado, que permitan ser utilizadas junto al proyecto sin realizar grandes
modificaciones. De esta manera se facilita el acceso al hardware por parte
de los usuarios finales, ya que no se dependerá de una placa propia
exclusiva para el proyecto y probablemente tengan mejores precios al estar
algunas de ellas subvencionadas en parte por los fabricantes. Se valorará su
alta disponibilidad, precio y diseño abierto.
Página 31
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.1.1. Análisis de la plataforma Atmel AVR
La arquitectura AVR, perteneciente a Atmel, es de 8 bits y fue diseñado desde
el comienzo para una eficiente ejecución de código C compilado.
Esta arquitectura ha sufrido un aumento importante en popularidad y
desarrollos durante estos últimos años debido al lanzamiento de la plataforma
Arduino, que ha logrado una popularidad sin precedentes. Como consecuencia de
esto, existen una gran cantidad de documentación, ejemplos de código y comunidad
de usuarios.
6.1.1.1. Análisis de Arduino
Arduino es un conjunto de librerías que facilitan en gran medida el desarrollo
en la plataforma AVR, que aunque no muy extensamente documentadas debido a su
simpleza y facilidad de uso, existen innumerables proyectos realizados por sus
usuarios.
Arduino también es una sencilla placa de desarrollo, que está actualmente muy
extendida y puede encontrarse en prácticamente cualquier distribuidor de electrónica
del mundo, a un precio que ronda los 18 a 26 euros según modelo y distribuidor y
cuenta además con un diseño libre. La sencillez de esta placa también es uno de sus
puntos fuertes, ya que permite replicar de forma artesanal la placa con componentes
disponibles en las tiendas de electrónica.
Página 32
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 10 | Arduino UNO
Una de las ventajas, y la razón por la que Arduino eligió la plataforma AVR, es la
existencia del compilador libre basado en GCC denominado avr-gcc.
Tabla 1 | Análisis Arduino UNO
Ventajas
 Toolchain libre y gratuito
 Gran comunidad de usuarios
 Cantidad de documentación y ejemplos
Desventajas
 Precio
6.1.2. Análisis de la plataforma Microchip PIC
Microchip con su familia de microcontroladores PIC ha estado durante años
liderando el mercado del desarrollo de proyectos personales gracias al programa de
muestras de Microchip. Sus compiladores y librerías, aunque gratuitos o con límite de
compilación poseen licencias con cláusulas que dificultan la distribución del código
fuente en según que casos.
6.1.2.1. Análisis de Pingüino
Dado que Arduino está basado en la arquitectura AVR, un grupo de
desarrolladores se propuso portar las librerías a la arquitectura del PIC, de donde nació
el proyecto Pingüino. Aunque funcionales, dichas librerías no están totalmente a la
par, ni tan desarrolladas y probadas como las de Arduino. La plataforma consiguió una
sólida base de usuarios debido al programa de muestras de Microchip, ya que con
unos pocos componentes de bajo precio y fácil adquisición era posible montarse una
placa compatible.
Página 33
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 11 | Placa Pingüino
Tabla 2 | Análisis de Pingüino
Ventajas
 Toolchain gratuito
Desventajas
 Toolchain no libre
 Librerías poco desarrolladas
6.1.2.2. Análisis chipKIT
chipKit apareció más tarde como una seria alternativa a Arduino en la
plataforma PIC, en una colaboración entre la propia Microchip y Digilent, portando con
fiabilidad las librerías de Arduino e intentando mantenerlas a la par con respecto a
estas. El principal problema es que aunque el entorno de desarrollo, que es el mismo
que el de Arduino, es libre, el compilador no lo era, ya que seguía usando los
propietarios ya existentes. Más tarde se liberó parte del compilador para su uso con las
placas chipKIT, pero algunas librerías seguían siendo propietarias. La gran ventaja es
que utiliza un microcontrolador de 32 bits, por lo que se nota una gran mejoría en
trabajos que requieren una gran cantidad de procesamiento con respecto al
microcontrolador de 8 bits de Arduino.
Página 34
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 12 | chipKIT Uno32
Tabla 3 | Análisis chipKIT
Ventajas
 Toolchain gratuito
 API exactamente igual que la de Arduino
 Se mantiene la API lo más actualizada posible
Desventajas
 Toolchain no libre
 Pequeña comunidad de usuarios
6.1.3. Análisis de la plataforma ARM
Los procesadores de ARM han venido siendo muy competitivos desde siempre
tanto en precio como en rendimiento, llegando a hacer frente a los existentes
fabricantes tanto microcontroladores como de microprocesadores que lideran el
mercado actual.
Página 35
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
La arquitectura Cortex-M ha sido la apuesta de ARM en el segmento de los
microcontroladores de baja potencia, siendo mucho más potente y eficiente que los ya
existentes y con un precio muy competitivo. El modelo más adecuado para el proyecto
sería el ARM Cortex-M0, ya que es el de menor capacidad de procesamiento, que no se
va a necesitar, pero también el de menor coste. Esta familia dispone de una gran
cantidad de pines, módulos de comunicación, etc.
Dicha arquitectura es prácticamente nueva y esto sumando a que ARM licencia
los cores a distintas empresas fabricantes de electrónica (Texas Instruments, NXP, ST
Electronics, etc.), crea una gran segmentación, ya que cada fabricante añade los
periféricos que más les interesa, crea sus propias librerías, etc., siendo la
documentación de la programación en esta arquitectura y de las librerías de los
fabricantes algo escasa. También existe una gran variedad de compiladores tanto
propietarios como de código abierto y todo esto hace que se tenga que estar bastante
familiarizado tanto como con la arquitectura ARM como con las librerías y periféricos
propios de cada fabricante.
Otro problema es que los chips con este núcleo casi siempre están a la venta
con empaquetado de montaje superficial, por lo que dificulta su montaje si no se tiene
los conocimientos necesarios, aunque actualmente están empezando a aparecer las
primeras versiones con empaquetado en tipo DIP.
6.1.3.1. Análisis de ST Micro
ST Micro tiene disponible una gama de placas de evaluación de los
microcontroladores ARM que ellos fabrican, es llamada Discovery. Son placas de bajo
coste que incluyen un microcontrolador, un programador y algún periférico extra, todo
en una misma placa, con los pines fácilmente accesibles y programable por USB. Se
disponen de varios de modelos con la familia Cortex-M de ARM, que sería la más
indicada para el proyecto.
Página 36
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 13 | STM32 Discovery
Se dispone tanto de compilador propietario como la versión gratuita y de
código abierto de GCC.
Tabla 4 | Análisis de ST Micro
Ventajas
 Toolchain gratuito y libre
 Programador compatible con opciones libres
 Alta velocidad de procesamiento
Desventajas

Pines de conexión por el lado inferior de la placa
6.1.3.2. Análisis de NXP
NXP es la Antigua división de electrónica de Philips, que también se introdujo
en el mercado de los microcontroladores de bajo coste y consumo y alto rendimiento
con una familia basada en ARM. Dispone de placas de evaluación de bajo coste basada
en microcontroladores de la familia ARM Cortex-M con el programador y
microcontrolador en una misma placa y comunicación con el entorno de desarrollo a
través de USB o JTAG, según se prefiera.
Página 37
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 14 | LPCXPRESSO con ARM Cortex-M0
Tabla 5 | Análisis de NXP
Ventajas
 Toolchain gratuito y libre
 Alta velocidad de procesamiento
Desventajas

Precio
Se dispone tanto de compilador propietario como la versión gratuita y de
código abierto de GCC.
6.1.4. Análisis de la plataforma de Texas Instruments
MSP430
El MSP430 es una familia de controladores producidos por Texas Instruments
con una arquitectura de 16 bits, pero con un precio a la par con sus competidores de 8
bits.
También existe un grupo de usuarios en esta plataforma para portar las
librerías de Arduino o una simplificación/aproximación de ellas, pero debido al bajo
número de desarrolladores implicados en el proyecto, no están muy completas.
6.1.4.1. Análisis de Launchpad
Esta familia es interesante debido a que tiene una placa de desarrollo
denominada Launchpad, realizada por la misma TI, que cumpliría con los requisitos del
proyecto y a un precio extremadamente competitivo.
Página 38
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
La principal desventaja es que los chips básicos de esta familia no suelen tener
módulo hardware de UART, por lo que habría que implementarlo por software.
Ilustración 15 | TI Launchpad
Aunque el fabricante nos recomienda utilizar unos compiladores propietarios,
también existe una versión libre basada en GCC denominada mspgcc.
Tabla 6 | Análisis de Launchpad
Ventajas
 Toolchain gratuito y libre
 Precio
Desventajas
 Pocas librerías
 Dificultad de desarrollo
 Ausencia de USART en el microcontrolador provisto
Página 39
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.2. Comparativa de soluciones para el medio de
comunicación
Para realizar el intercambio de información y datos entre el software en el
ordenador y la placa de interfaz con el mundo físico, es necesario realizarlo a través de
un medio de comunicación.
La velocidad de transmisión, así como su ancho de banda, no serán altos, que
aunque esto viene determinado principalmente por el protocolo, suele estar
directamente relacionado con el medio de transmisión. Esto nos permite poder
seleccionar un amplio abanico de soluciones simples, muy maduras y altamente
compatibles con los ordenadores.
Los que se han estudiado para su posible implantación en el proyecto, han sido
los siguientes:
6.2.1. Análisis del puerto paralelo
El puerto paralelo nos podría servir de interfaz entre el mundo virtual y real, ya
que podemos controlar las tensiones en los pines de éste y tenemos pines que pueden
ser configurados como salida pero también como entrada.
La desventaja es que no existe manera de realizar lecturas de tensiones de
forma analógica y debido a que los sistemas operativos comunes no son en tiempo
real, tampoco se podría realizar PWM en los pines de forma eficaz y consistente a lo
largo del tiempo. Estas deficiencias pueden ser suplidas con la ayuda de circuitería
externa, pero debiendo de poner casi obligatoriamente un microcontrolador, es
mucho más eficiente y cómodo trabajar por el puerto serie.
Otro problema existente es que cada vez es más difícil que un ordenador que
disponga de un puerto paralelo, siendo hoy en día casi imposible encontrar uno.
Página 40
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Tabla 7 | Análisis del puerto paralelo
Ventajas
 Posibilidad de usarlo directamente para realizar la interfaz con el mundo físico
Desventajas
 Los sistemas operativos no suelen trabajar en tiempo real
 Difícil de encontrar en equipos nuevos
6.2.2. Análisis del puerto serie
El puerto serie es un estándar de comunicación simple y con una gran madurez,
por lo que no suele ser difícil realizar una comunicación a través de éste. También
tiene la ventaja de que un gran abanico de microcontroladores, incluso los de bajo
precio y prestaciones, suelen tener un módulo hardware, que trabaja
independientemente del núcleo, dedicado a las comunicaciones por este medio,
facilitando en gran medida el funcionamiento de cara al implementador.
Aunque al igual que el puerto paralelo cada vez es más difícil encontrar dicha
interfaz en ordenadores nuevos, aunque debido a su gran versatilidad y utilidad
todavía siguen apareciendo en ordenadores de sobremesa, pero prácticamente
desaparecido en los ordenadores portátiles. De todas maneras, debido a esta
desaparición, fomentada en gran medida por la aparición del puerto USB, se han
creado chips que traducen el protocolo serie desde el microcontrolador y lo
empaquetan a través del USB, mostrando luego al ordenador un puerto serie virtual a
través del cual se realiza la conexión.
Tabla 8 | Análisis del puerto serie
Ventajas
 Suficientemente rápido
 Buena inmunidad al ruido
 Barato de implementar
 Muy utilizado y sencillo de trabajar
Desventajas

Difícil de encontrar en nuevos equipos
Página 41
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.2.3. Análisis del USB
Cada vez es más común ver pequeños microcontroladores de bajo coste con
módulos hardware de comunicación por USB, aunque suelen duplicar su precio con
respecto a sus homólogos sin este módulo. También han ido apareciendo librerías que
implementan la funcionalidad USB en software mediante bit banging, pero a costa de
largos tiempos de procesamiento e interrupciones que deben ser atendidas lo más
rápido posible.
Tabla 9 | Análisis del USB
Ventajas
 Muy rápido
 Buena inmunidad al ruido
 Muy versátil
 Corrección de errores
Desventajas

Encarece el microcontrolador
6.2.4. Análisis del Bluetooth
Es un canal de comunicación inalámbrico de corto alcance (menos a 100 metros
en el mejor de los casos), pero con velocidades similares a la del puerto serie, que
permite realizar una conexión entre dos dispositivos. Su bajo coste y orientación al uso
por el consumidor, le ha permitido situarse como el medio de comunicación entre
dispositivos móviles.
Ilustración 16 | Módulo Bluetooth
Página 42
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Durante los últimos años se ha producido una reducción enorme del coste de
implantación de este protocolo, siendo incluido cada vez más en proyectos de bajo
coste y comercialización.
Los módems Bluetooth tienen una interfaz por la que configurarlos y
comunicarse a través de ellos basada en el puerto serie, por lo que podrían reemplazar
el cable del puerto serie sin grandes modificaciones del código.
Tabla 10 | Análisis del Bluetooth
Ventajas
 Inalámbrico
 Velocidad similar al puerto serie
 Fácil de implementar
Desventajas
 Poca potencia de transmisión
 No muy fiable y consistente a largo plazo
6.2.5. Análisis del XBee
Los dispositivos XBee, basados en la tecnología ZigBee, disponen de un stack
con añadidos que les permite realizar una función similar a la del bluetooth pero con
algunas diferencias: un menor consumo, la posibilidad de realizar redes de conexión
avanzadas como en malla y una mayor distancia, aunque a una velocidad menor.
Ilustración 17 | XBee Serie 1
Página 43
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Dependiendo del modelo escogido, podríamos llegar a alcanzar incluso decenas
de kilómetros.
Tabla 11 | Análisis del XBee
Ventajas
 Largas distancias de comunicación
 Corrección de errores
 Fácil de implementar
Desventajas

Precio
6.2.6. Otras soluciones
Existen otros muchos protocolos por los que se podría realizar la comunicación
entre la placa de interfaz física y el ordenador con el software, tales como
radiofrecuencia, WiFi, Ethernet, GSM y cualquier otro para el que exista una puerta de
enlace que haga de traductora entre ambos protocolos.
Página 44
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.3. Comparativa de soluciones para el protocolo
de comunicaciones
El protocolo de comunicaciones será el encargado de definir como se transmite
toda la información relativa a la configuración de la placa y el estado de ésta entre ésta
y el ordenador con el software.
La cantidad de información va a ser muy baja durante la mayor parte del
tiempo, por lo que un protocolo sencillo de implementar, que funcione a través de un
medio de bajo coste y sea de bajo ancho de banda para facilitar su portabilidad e
implantación. Además que cuanto menor sean estos requerimientos, menor coste
tendrá la placa de interfaz que se necesite para utilizar junto al software del proyecto.
6.3.1. Análisis de Firmata
Firmata es un protocolo de comunicación genérico para controlar los
periféricos de un microcontrolador desde un software en un ordenador. Está diseñado
para ser incluido en cualquier software, ya que es de sencilla implementación.
Firmata está centrado principalmente en realizar el intercambio de información
a través del puerto serie y codificado en binario en vez de en ASCII como puede ocurrir
con otros, por lo que se aumenta bastante la cantidad de información posible de
transmitir en un solo paquete.
Éste protocolo esta desarrollado alrededor del ecosistema de Arduino,
pensando en las capacidades de estas placas. De hecho, junto a las distribuciones del
software de Arduino viene el firmware con la versión más actualizada del protocolo
listo para ser incorporado en las placas. Este firmware soporta las placas Arduino tanto
Uno, Duemilanove, Diecimila como las Mega.
El protocolo guarda una estrecha relación con el protocolo MIDI, ya que ha sido
su referencia desde casi la primera versión, cuando se rescribió el código para hacerse
compatible con éste.
Las principales funciones que están implementadas en el protocolo en la actual
versión 2.2, son las siguientes:
Página 45
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria

Configurar los pines: entrada, salida.

Lectura estado de los pines: alto, bajo.

Lectura entradas analógicas (con control de velocidad de muestreo).

PWM.

Control de servomotores.

I2C.
La licencia de las librerías de Firmata, así como de su implementación en el
firmware en la versión de Arduino, son libres, por lo que se podrán utilizar sin
problemas para el proyecto y al disponer del código fuente, se pueden realizar
modificaciones a éste para arreglar fallos de programación o añadir funcionalidades
que no existían.
Al estar incluido en el software de Arduino, el protocolo es usado por infinidad
de personas en cantidad de aplicaciones distintas, que demuestran la diversidad de
aplicaciones que puede tener el protocolo y confirman su estabilidad. Su desarrollo
también es continuo, con un flujo constante de ideas y mejoras que poco a poco se van
implementando.
Tabla 12 | Análisis de Firmata
Ventajas
 Ya implementado
 Comunidad de usuarios
 Desarrolladores activos
 Protocolo libre y gratuito
Desventajas

Ninguna
Página 46
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
6.3.2. Análisis del protocolo de ArduLab
El paquete de software de ArduLab viene implementado con un protocolo de
comunicaciones propio, que en el fondo no difiere mucho de Firmata y con unas
funciones muy similares a éste último.
No es el más adecuado, ya que aunque es muy simple en su implementación,
limita su escalabilidad y no es lo suficientemente conocido en la comunidad tanto de
usuario como de desarrolladores para que siga el desarrollo del protocolo por su
propia inercia.
Tabla 13 | Análisis del protocolo de ArduLab
Ventajas
 Ya implementado
 Sencillo
Desventajas

No muy escalable
6.3.3. Análisis para la creación de un protocolo propio
La alternativa a utilizar los protocolos ya existentes, sería realizar un protocolo
propio, en el que se implementaran las capacidades exactas que se vayan a utilizar y
según se vayan necesitando.
Teniendo en cuenta que Firmata es un protocolo muy similar a lo que se
acabaría diseñando una vez avance el protocolo y ya dispone de muchas de las
optimizaciones que se le pueden realizar para mejorar su desempeño. Por lo que lo
más razonable en el caso de querer implementar un protocolo propio sería, tomar
como base el protocolo de Firmata, eliminar lo que no se necesite o interfiera en lo
planificado y desarrollar a partir de ahí.
Página 47
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Tabla 14 | Análisis de protocolo propio
Ventajas
 Totalmente adaptado a las necesidades
Desventajas

Tiempo de desarrollo
6.4. Comparativa de soluciones para el lenguaje
de programación
La elección del lenguaje de programación es posiblemente la que va a influir en
mayor medida durante el desarrollo del proyecto, por lo que habrá que seleccionarlo
tras un buen análisis de las opciones existentes.
En este análisis solo se tendrán en cuenta los lenguajes de programación para
la parte de software que funcionará en el lado del ordenador, la parte de
programación en la placa de interfaz será con una muy alta probabilidad C o C++,
debido a la capacidad de proceso y almacenamiento de estos dispositivos.
El lenguaje deberá ser multiplataforma, sin tener que realizar grandes cambios
en el código para tener que conseguirlo, ser un lenguaje conocido y estable y que el
desarrollo con él sea simple y versátil, con el que poder realizar todas las
funcionalidades del proyecto que se nos ocurran. Al deber ser multiplataforma la parte
de software, se descartarán de entrada la familia de lenguajes Visual y .NET de
Microsoft.
6.4.1. Análisis de Java
Es un lenguaje orientado a objetos, toma mucha de la sintaxis de C++, pero con
un modelo de objetos más simples, eliminando las herramientas de bajo nivel tales
como la manipulación directa de punteros y memoria, que solían inducir a error.
Al contrario de muchos lenguajes, Java se compila a bytecode pudiéndose
también compilar también a código máquina, pero estos suele realizarse por el
Página 48
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
intérprete en tiempo real desde el código en bytecode, que permite ejecutarse en
cualquier plataforma que tenga el intérprete adecuado.
La principal desventaja es la antigüedad de la interfaz de usuario disponible con
y prácticamente sin actualizaciones en los últimos años, siendo esta además un
compleja para el desarrollo, que sigue los estilos de programación del momento en el
que se lanzó.
Tabla 15 | Análisis de Java
Ventajas
 Gran comunidad de usuarios
 Gran cantidad de ejemplos
 Elimina las complejidades de C++
Desventajas

Librería para interfaces de usuario incluida muy antigua
6.4.2. Análisis de Qt
Está basado en C++ y su punto fuerte es la capa de abstracción que han creado
encima de este para añadir características multiplataforma, tanto de escritorio como
móviles (Windows, Linux, Mac OS, Symbian, and Maemo), incluye librerías para
desarrollar interfaces de usuario con ventanas y está acompañado por una gran
cantidad de herramientas potentes y una extensa y bien organizada documentación.
Hace una temporada tuvo un futuro incierto, ya que éste lenguaje de
programación pertenece a Nokia, que no pasó por unos años muy buenos y su
existencia peligraba, pero hace poco decidieron liberar el lenguaje de programación
con sus librerías, por lo que se asienta su futuro; habiendo aparecido durante el
desarrollo de este proyecto de una revisión menor y la casi finalización de una revisión
mayor.
Página 49
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Tabla 16 | Análisis de Qt
Ventajas
 Basado en C++
 Gran calidad de la documentación
 Herramientas de desarrollo muy completas e integradas
 Librerías para interfaces de usuario de gran calidad
Desventajas

Futuro algo incierto
6.4.3. Análisis de Python
Es un lenguaje de alto nivel y de propósito general, cuya filosofía se centra en la
legibilidad, notable potencia y una muy clara sintaxis, con una biblioteca estándar
grande y completa.
Python es un lenguaje ideal tanto para realizar programas prototipo como para
programas finales, ya que aunque es interpretado, los ordenadores hoy en día son lo
suficientemente potentes como para poder con esta sobrecarga. La ventaja es que se
pueden probar trozos de código directamente en la consola de ejecución para su
prueba, pero con la desventaja de que los fallos de programación no aparecen hasta
que el intérprete ejecuta la instrucción errónea, pudiendo pasarse por alto en las
revisiones de código.
Al igual que Java, Python es interpretado y también puede ser compilado a
bytecode, aunque no a código máquina, pero si que puede ser ejecutado con el código
fuente, realizando el propio intérprete la compilación a bytecode antes de ejecutarlo.
Python viene por defecto con la librería de Tk para realizar interfaces de
ventanas, aunque su uso es complicado y su apariencia deja bastante de desear. Este
problema se compensa debido a la existencia de librerías que enlazan con proyectos
como Qt, wxWidgets o GTK+, con una excelente apariencia y mayor facilidad de uso.
Uno de los problemas es que la creación de paquetes de distribución en Python
no está muy documentada, por lo que en principio se hace casi imprescindible el uso
de librerías que facilitan su uso, pero no son todo lo completas que se desearían.
Página 50
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Tabla 17 | Análisis de Python
Ventajas
 Sencillez de desarrollo
 Cantidad de librerías
 Gran comunidad de usurarios
Desventajas

Librería para interfaces de usuario incluida muy antigua
Página 51
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
7. Descripcion
adoptada
Memoria
de
la
solucion
7.1. Descripción de la placa de interfaz adoptada
En el proyecto utilizaremos la placa Arduino, por su alta disponibilidad y
cantidad de documentación disponible. Es una placa con entradas y salidas digitales y
salidas de PWM, entradas analógicas, pudiendo conectarla a una gran cantidad de
periféricos como leds, sensores resistivos o de voltaje, servomotores, dimmers, etc.
Al estar todo lo que necesitamos de esa plataforma (hardware, librerías,
compilador y protocolo) bajo una licencia libre, se podrá utilizar sin problemas en el
desarrollo del proyecto.
Una de las principales ventajas es que el firmware del protocolo Firmata viene
ya implementado y probado, por lo que se puede centrar todo el esfuerzo en el
desarrollo de la parte de la interfaz de usuario.
7.2. Descripción del medio de comunicación
adoptado
Debido a que la placa Arduino posee un puerto USB por el que es posible
realizar una comunicación serie, se utilizará este medio de comunicación. Además el
USB es un estándar implementado en prácticamente cualquier ordenador en su
versión 2.0 desde hace más de una década, por lo que se asegura una compatibilidad
prácticamente total.
Al estar la comunicación serie encapsulada en el protocolo USB, se pueden
llegar a utilizar velocidades mucho mayores que a través del tradicional puerto serie.
La única desventaja es la necesidad de instalar los drivers USB en la plataforma
Windows al conectar por primera vez una placa Arduino para realizar la comunicación,
Página 52
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
pero debido a la gran cantidad de documentación existente sobre este tema y su
sencillez no se tendrá en cuenta como un problema mayor.
De todas maneras, se podrá utilizar cualquier solución de comunicación que sea
invisible para el Arduino, tales como Bluetooth, XBee, puerto serie y otros muchos con
el hardware y software adecuado, sin necesidad de cambiar una sola línea de código
del firmware contenido en el Arduino.
7.3. Descripción del protocolo de comunicación
adoptado
El protocolo utilizado para la comunicación será Firmata, ya que al estar
bastante asentado y probado para este tipo de uso, con una base de datos y lista de
correo para solucionar los problemas durante su uso o implementación, no tiene
sentido implementar un protocolo dedicado para este proyecto cuando su
funcionamiento sería similar en un 90%.
Su evolución es constante y con visos a dar compatibilidad a los nuevos
modelos de Arduino, también a hacer las adaptaciones correspondientes para permitir
ser utilizado a través de Ethernet u otros medios de comunicación.
7.4. Descripción del lenguaje adoptado
Python ha sido el lenguaje escogido para la programación de la interfaz de
usuario, ya que es multiplataforma y permite un desarrollo rápido de aplicaciones.
Para suplir las deficiencias de la librería estándar de Python se hará uso de las
siguientes librerías adicionales:

PyQt: para la parte de interfaz de usuario se usarán las librerías de Qt para
Python, por lo que también se tendrá a disposición todo el poder de este
lenguaje, tanto con los tipos de datos como la creación de interfaces de
usuario, todo ello también compatible con cualquier plataforma. Qt tiene
una interfaz de usuario multiplataforma que imita muy bien la apariencia de
Página 53
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
las aplicaciones nativas, por lo que el usuario se sentirá familiar con la
forma de ésta, dejando también la opción al desarrollador de modificarlo a
su gusto.

PyQwt: es una librería que añade elementos gráficos científicos tales como
gráficas, sliders con medida, etc. Se basa en la librería Qwt desarrollada
para Qt.

PySerial: librería que se ocupa de las comunicaciones desde Python con el
puerto serie, ya sea real o virtual (a través de USB). Su interfaz es muy
simple y de fácil uso.

PyFirmata: se encarga del protocolo de comunicación y en conjunción con
PySerial, realiza la transmisión de datos con la placa de interfaz mediante el
protocolo Firmata a través del puerto serie. No es una librería muy común,
por lo que presenta algunos fallos que tuvieron que ser solucionados.

cx_Freeze: una vez terminado el proyecto debe ser empaquetado para su
distribución de forma sencilla por los usuarios. Al ser la interfaz de
empaquetamiento de Python un poco compleja, esta librería hace de
intermediario facilitando su uso. Nos permite crear instaladores para
cualquiera de las plataformas más conocidas.
Tanto el lenguaje de programación, como las librerías listadas anteriormente
son de uso sin restricciones para proyectos de código abierto, por lo que no se tendrá
ningún problema en este sentido.
Página 54
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8. Desarrollo
8.1. Diseño general
Una vez ya conocidas las tecnologías a utilizar en el proyecto, conocemos
cuales van a ser las características y límites que nos vamos a encontrar. El proyecto va
a constar de cuatro partes diferenciadas, las cuales son:

Aplicación software: es el centro de control de los periféricos de la placa a
la que está conectado. Se comunica con la placa para configurarla según se
ha indicado por el usuario y muestra la información recibida de la placa de
forma visual en la pantalla. Se desarrollará en Python y Qt con
compatibilidad multiplataforma.

Interfaz USB-serie: es el encargado de convertir la señal USB procedente
del PC a serie estándar. Este conversor existe en la propia placa Arduino,
que en las placas antiguas es un FTDI FT2332 y en las nuevas versiones un
ATmega 16u2. Como se ha comentado anteriormente, la comunicación
también puede realizarse por muchos otros medios adecuados para el uso.

Arduino: interpreta los comandos recibidos por el puerto serie, realizando
las tareas adecuadas e informando al PC de los cambios que se han
producido en la placa.

Alimentación: si no se van a conectar grandes cargas al Arduino que
superen los 500mA, se podrá usar la alimentación procedente del USB (en
el caso que lo tengamos conectado a éste), si no, se utilizará un
transformador conectado a la toma de red que nos provea de una tensión
continua de 5 a 9V y se enchufará al conector provisto para esto.
Página 55
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 18 | Diagrama de conexiones
8.2. Análisis del protocolo Firmata
8.2.1. Introducción
Firmata es un protocolo de comunicación entre un ordenador y un
microcontrolador que apareció en los inicios de la historia de Arduino, por lo que las
características de este protocolo están muy centradas en las capacidades del Arduino.
Es un protocolo de comunicación genérico para controlar los periféricos de un
microcontrolador desde un software en un ordenador. Está diseñado para ser incluido
en cualquier software y hardware, ya que es de sencilla implementación.
Éste protocolo soporta las placas Arduino tanto Uno, Duemilanove, Diecimila
como las Mega, aunque en el proyecto se ha decidido soportar la placa más común y
utilizada que es la Uno.
Firmata realiza el intercambio de información a través del puerto serie y
codificado en binario en vez de en ASCII como puede ocurrir con otros, por lo que se
Página 56
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
aumenta bastante la cantidad de información posible de transmitir en un solo
paquete.
Con las distribuciones del software de Arduino, se adjunta una copia del
firmware de Firmata para las placas Arduino, que implementa el protocolo y nos
permite realizar las siguientes acciones:

Configurar los pines: entrada, salida

Lectura estado de los pines: alto, bajo

Lectura entradas analógicas (con control de velocidad de muestreo)

PWM

Control de servomotores

I2C
8.2.2. Descripción del protocolo
Durante la realización del protocolo, los creadores vieron que era similar al
existente MIDI, por lo que lo modificaron para hacerlo totalmente compatible con
este, que aunque no es directamente usable con controladores MIDI, puede coexistir
con MIDI sin problemas y ser tratado por intérpretes MIDI sin problemas, aunque
algunos datos de los mensajes son utilizados de forma diferente al estándar.
8.2.2.1. Mensajes
El protocolo está formado por mensajes, que consisten en una serie de 8 bits.
Cada mensaje tiene su función asignada. Algunos mensajes consisten en un solo byte,
mientras que otros pueden llegar a tener 2 ó 3 bytes. También existe un mensaje con
el que poder enviar un número ilimitado de bytes. Algo que todos los mensajes tienen
en común es que el primer byte del mensaje es el de estado, que es especial ya que es
el único que tiene el bit 7 activado, mientras que los siguientes bytes del mensaje no lo
tienen activado, de ésta manera se puede detectar siempre el inicio de un mensaje. Se
Página 57
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
puede deducir entonces que los bytes de estado están en el rango 0x80÷0xFF, por lo
que el número de éstos está limitado a 127 y el resto de los bytes del mensaje, los de
datos si es que existen, estarán en el rango 0x00÷0x7F.
Tabla 18 | Comparación mensajes MIDI y Firmata
Comando
Significado
0x90
Activar nota
0x90
I/O digital
Parámetros
Parámetro 1
MIDI
2
nota
Firmata
2
LSB (bits 0÷6)
Parámetro 2
fuerza
MSB (bits 7÷13)
8.2.3. Descripción de la comunicación
El firmware de Firmata para las placas Arduino, realiza la comunicación por la
USART de éste, por lo que abre un gran abanico de posibilidades de comunicación a
través de diversos medios.
En el caso más común, se realizaría la conexión al PC utilizando el propio
conversor serie-USB disponible en la propia placa Arduino, también podría conectarse
al puerto serie del PC usando un adaptador de niveles serie de TTL a RS-232, que
permitiría distanciar la placa del PC decenas de metros gracias a la robustez del medio
de transmisión. En caso de disponer de los conversores adecuados y desear la
comunicación de esta manera, puede realizarse a través de redes XBee, Bluetooth,
radiofrecuencia, Ethernet, Internet y otros muchos.
La comunicación es bidireccional ya que la placa necesita enviar al PC su estado
(lecturas digitales y analógicas, estado de los pines, etc.) y el PC enviar los comandos
necesarios para configurar la placa según requiera el usuario del software; y si el
medio lo permite (en la implementación en Arduino se puede) será una comunicación
totalmente full-duplex.
Las transferencias se realizan en paquetes de 1 byte, utilizándose los 7 bits de
menos peso para datos y el octavo para indicar si es un comando. Los mensajes están
formados por una cantidad de 1 a 3 bytes según sea, pero en el caso de que
necesitemos enviar una mayor cantidad de información puede extenderse a cualquier
longitud utilizando el comando SysEx.
Página 58
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
La configuración de la comunicación serie por defecto se realiza a 57600
baudios, con 8 bits de trama, 1 bit de parada y sin control de paridad o flujo, aunque al
realizarse la transmisión por USB puede llegarse a sobrepasar el millón de baudios en
el caso de ser estrictamente necesario.
El paquete de transmisión se compone de:
1. Idle: en ausencia de comunicación, la línea tendrá una señal mantenida a
nivel alto (break).
2. Inicio: antes de recibir la trama de información, se transmitirá un bit a nivel
bajo (space) para indicar la transmisión de la trama.
3. Trama: información que recibirá la placa o el PC (suponemos que se recibe
primero el bit de mayor nivel). Está compuesta por 8 bits, divididos en dos
partes.
1. Bit de comando: si el bit está activo (break), indica que el byte
recibido es un comando y deberá ser tratado como tal, si no, será
información. Este bit debe estar siempre activo en el primer byte de
un mensaje.
2. Información: los 7 bits restantes son el comando o los datos
transferidos, según se haya recibido el bit de comando.
4. Bit de stop: al finalizar la trama se transmitirá un bit de stop a nivel alto
(break).
Después de esto pueden ocurrir dos cosas, o se deja de recibir/transmitir y la
línea se deja a nivel alto (break) o se vuelve a transmitir otro byte en el caso de
mensajes de 2 o más bytes, por lo que se volverá a comenzar en el punto número 1.
Página 59
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
La plantilla para interpretar una transmisión sería la siguiente:
Bits de datos
Idle o
segundo byte
Trama
Mensaje
8.2.4. Mejoras en la implementación del protocolo
El firmware de Firmata para Arduino (en su actual versión 2.2 en el momento
de realizar éste documento) al inicializar los pines de éste, los configura como salida y
a nivel alto, cosa que puede ser peligrosa para mantener la integridad de la placa
Arduino a largo plazo, ya que si se conecta el cable de salida de un sensor o ya se tiene
conectado uno a la hora de encender la placa, probablemente este sensor no tenga la
salida a 5V, por lo que se producirá un cortocircuito, estresando el pin provocando una
degradación prematura del silicio que en el caso extremo podría llegar a su
inutilización, pudiendo también afectar al sensor o circuito conectado.
Gracias a que este firmware es de código abierto, se procedió a añadir un
nuevo modo en el que los pines estuvieran como entrada y a nivel bajo y se hizo que
todos los pines se configuraran a este modo al inicio del programa o cuando se deje de
utilizar un pin, dando una solución adecuada al anterior problema.
Página 60
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
También se modificó el orden de inicio de las funciones de Firmata, ya que
según estaba implementado, se necesitaba alrededor de dos segundos como mínimo
de espera hasta poder realizar la conexión de la placa.
8.2.5. Descripción de la capa física
La capa física no viene definida por el protocolo, aunque indirectamente se
prevé que por su campo de aplicación en microcontroladores sea la transmisión
mediante transmisión serie asíncrona (USART) a niveles de tensión TTL a 5V en la
mayoría de los casos y a 3.3V en una minoría, que es como viene diseñado el protocolo
por defecto. Aunque como se ha comentado anteriormente, el protocolo puede ser
transmitido por cualquier medio siempre que se tengan las herramientas y
conocimientos necesarios para ello, ya que en el caso de la implementación en
Arduino, la capa de procesamiento del protocolo está completamente desacoplada de
la de transmisión, facilitando inmensamente esta tarea.
8.2.6. Descripción de los conectores
Desde el punto de vista del usuario, el medio de transmisión va a ser el USB,
por lo que será este el que se analizará en este apartado.
Las conexiones son extremadamente simples, ya que debido a la forma que
poseen los conectores, es prácticamente imposible conectarlos de forma errónea. Se
recomienda el uso de cables de al menos 1m. de largo y apantallados.
El conector tipo A será el que se conecte al ordenador y el tipo B a la placa
Arduino, aunque los nuevos modelos están siendo lanzados con el conector micro-B y
otras placas compatibles con la Arduino UNO realizadas por otros fabricantes suelen
llevar el conector mini-B.
Página 61
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 19 | Conectores USB
La asignación de pines para el estándar USB, es el siguiente:

Pin 1: Vcc, línea de alimentación para los dispositivos conectados, la tensión
es de 5V y 0,5A de corriente máxima. El color habitual es el rojo.

Pin 2: Data-, señal de transmisión invertida a -3,3V a nivel bajo, polo
negativo. El color habitual es el blanco.

Pin 3: Data+, señal de transmisión no invertida a 3,3V a nivel alto. El color
habitual es el verde.

Pin 4: referencia, retorno de la alimentación y conexión al mallado del
cable. El color habitual es el negro.
El quinto pin existente en las versiones de los conectores micro y mini puede
estar desconectado o referenciado a masa.
Página 62
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8.2.7. Descripción del cableado
El estándar USB utiliza un cable de 4 conductores, uno para alimentación, otro
para la tensión de referencia y otros dos para transmisión de datos. Éstos últimos son
diferenciales y los cables están trenzados, por lo que poseen una gran inmunidad al
ruido.
Ilustración 20 | Líneas de datos
El cable debe tener una cobertura exterior de
policloruro de vinilo (PVC), una protección contra
ruido externo que conste de una malla de cobre
estañado entrelazado, una capa de protección
interna de poliéster metalizado de aluminio, los
cables de datos con una sección mínima 28 AWG,
que según el estándar al que hace referencia,
equivaldría a un diámetro de 0,38 mm y 23,20
ohmios máximo por 100 m y de 28 a 20 AWG para la
línea de alimentación que sería de 0,32 mm a 0,89
mm y de 23,20 a 3,58 ohmios máximo por 100 m.
Ilustración 21 | Cable USB A-B
La capacitancia del bus con un dispositivo esclavo conectado a un cable USB, no
debe ser menor a 200 pF o mayor a 450 pF en las líneas D- o D+.
8.2.8. Distancias y terminaciones
La terminación de los buses, es decir, las resistencias de terminación para evitar
la reflexión de la señal en el final del cable y que rebote volviendo a aparecer en el bus,
no es necesario añadirlas, ya que está diseñado de forma transparente al usuario,
estando ya incluidas en el driver.
La longitud máxima de transmisión viene dada por la atenuación de la señal y el
tiempo de propagación, aunque como regla general se recomienda no exceder los 5
metros de cable
Página 63
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8.3. Análisis de la aplicación software
8.3.1. Introducción
Considerando lo anteriormente citado sobre software ya disponible, se procede
a la realización de un software de control visual de la placa de interfaz.
Para dicho efecto, se va a realizar una aplicación multiplataforma compatible
con Windows, Linux y Mac con un único código fuente, sin necesidad de rescribir la
aplicación para cada uno de ellos.
Ilustración 22 | Proyecto ejecutado en Windows 7
Página 64
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 23 | Proyecto ejecutado en Linux Ubuntu 12.04
Ilustración 24 | Proyecto ejecutado en Mac OS X Lion
Página 65
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Uno de los requisitos que se va a tener en cuenta a la hora de su elaboración,
es que se trate de un programa sencillo e intuitivo, de modo que personas no
especializadas en la electrónica puedan ser capaces de aprovechar todas sus
posibilidades. También se diseñará de forma que sea sencillo añadir, por parte de
cualquier usuario o desarrollador, nuevos módulos al programa que extiendan su
funcionalidad.
La aplicación mandará por el cable USB las modificaciones de los valores que
realicemos y mostrará la información del estado de la placa de interfaz.
8.3.2. Entorno de trabajo utilizado para el desarrollo
Para el desarrollo de la aplicación se ha escogido Eric IDE, el cual es un entorno
de desarrollo integrado.
El entorno de desarrollo contiene múltiples ventanas y da acceso a variada
funcionalidad, por lo es denominado como entorno de desarrollo integrado (integrated
development enviroment, IDE).
Ilustración 25 | Eric IDE
Página 66
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Soporta los lenguajes de programación Ruby y Python, siendo éste último el
elegido para la programación de la parte de software del proyecto. Se ha escogido este
entorno de desarrollo, aparte de por ser compatible con el desarrollo en Python, por
estar centrado principalmente en el desarrollo con PyQt, que es una de las librerías
que más se utilizarán durante la programación. Las principales características son,
coloreado de código, depurador, visualizador de variables, ejecución paso a paso, muy
integrado con PyQt, lo que permite realizar de forma automática tareas que de otra
forma se deberían realizar de forma manual y es multiplataforma, por lo que se podrá
desarrollar el software tanto en Windows como en Linux o Mac, aunque la principal
plataforma de este desarrollo será Windows.
Para que la aplicación se ejecute correctamente, es necesario que las librerías
que se han detallado anteriormente (PyQt, pySerial, pyFirmata y PyQwt) estén
instaladas. Si se ejecuta el programa usando el instalador provisto en el CD adjunto, no
será necesaria ninguna acción adicional, ya que se instalan automáticamente, dejando
el programa listo para utilizar.
8.3.3. Descripción del código fuente
El código fuente está programado en Python como se ha mencionado
anteriormente, es un lenguaje sencillo, potente, interpretado y multiplataforma.
Debido a la extensión del código, se van a describir sólo las partes más
importantes de éste. Una versión más extendida del código puede encontrarse en los
anexos y la totalidad de éste en el CD que se adjunta con este documento.
8.3.3.1. Inicialización de los módulos
Como se ha comentado a lo largo del documento, el programa está formado
por distintos módulos que realizan cada uno una función distinta.
Una vez se ha terminado de arrancar el subsistema que dé el soporte a la
aplicación para ejecutarse, se importarán las clases de los módulos indicados para
poder ser luego inicializados y accedidos.
from selectportdlg import SelectPortDlg
Página 67
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
from
from
from
from
from
from
from
Memoria
mode import ModeTab
analog import AnalogTab
digital import DigitalTab
pwm import PWMTab
servo import ServoTab
motor import MotorTab
sequencer import SequencerTab
Estas líneas cargan los archivos .py existentes en la carpeta ui y dan acceso a las
clases que controlan la interfaz de usuario de cada módulo.
Se puede observar que también se carga la ventana de selección del puerto
serie, que será lo primero que le aparezca al usuario.
Una vez se haya seleccionado el puerto serie, se inicializarán los módulos
llamando a los constructores de las clases que hemos importado. De esta manera se
acelera el arranque del programa, en vez de cargarlos desde el primer momento,
cuando incluso puede que el usuario cierre el programa directamente y no llegue a
usarlo.
self.tabs
=
(ModeTab(self),
DigitalTab(self),
AnalogTab(self),
PWMTab(self), ServoTab(self), MotorTab(self), SequencerTab(self))
De esta forma se inicializa la interfaz de usuario con los valores por defecto y
configuración adecuada.
Para añadir o quitar módulos sólo hace falta hacer modificaciones en los dos
grupos de código anteriores, por lo que es muy sencillo y rápido.
Las clases tienen que tener dos métodos que se llamarán cuando se entre o se
salga de la pestaña a la que corresponde esa clase, de esta forma se pueden liberar
pines, iniciar la captura de datos, etc. de forma automática al cambiar de pestaña y sin
tener que realizar continuamente transmisiones de datos para representar
información que se dibuja en una pestaña oculta.
self.tabs[self.lastIndex].exitTab()
Página 68
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
self.tabs[index].enterTab()
8.3.3.2. Selección del puerto serie
En el diálogo de selección del puerto serie, se muestran los puertos serie
disponibles en el sistema. Es el conjunto de los disponibles en hardware, es decir, con
conector hembra DB-9 y protocolo RS-232 y los virtuales a través de USB.
La estrategia seguida para encontrar los puertos disponibles en Linux y Mac
varía con la de Windows:
ports = list()
if POSIX:
ports
+=
glob.glob("/dev/ttyACM*")
glob.glob("/dev/ttyUSB*")
+
glob.glob("/dev/tty.usb*")
glob.glob("/dev/tty.serial*")
for i in xrange(256):
try:
s = serial.Serial(i)
ports.append(s.portstr)
s.close()
except serial.SerialException:
pass
+
+
En Windows sólo se miran uno a uno cada puerto serie del 1 al 256 si existen y
son accesibles y también en Linux y Mac, pero los puerto series virtuales a través de
USB, se deben buscar en la ruta /dev.
Una vez se haya seleccionado un puerto serie, se crea un objeto que representa
el Arduino, y se comunica con el a través del protocolo Firmata por el puerto serie.
board = Board(self.portsCmb.currentText(), BOARDS['arduino'])
Una vez comprobada que la placa Arduino se comunica correctamente con el
software, se inician las pestañas como se ha indicado en el punto anterior.
Página 69
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8.3.3.3. Programación del Arduino
Para comunicarse con la placa Arduino mediante Firmata, debe estar
programada con el firmware adecuado que pueda realizar dicha comunicación. Debido
a que es común que una placa Arduino sea reprogramada para otros usos, la inclusión
de un programador del firmware en la pantalla de bienvenida era una característica
obligatoria.
Para descargar el firmware en la placa Arduino se utiliza el programador
avrdude, un proyecto de código abierto que programa infinidad de microcontroladores
de Atmel en conjunto con un programador compatible con ellos, en este caso el
programador va incluido en el bootloader del Arduino, por lo que no hace falta un
programador externo.
La llamada al programador fue una parte problemática ya que cada sistema
operativo tiene una forma distinta de llamar a los ejecutables y de tratar las rutas de
archivos con espacios entre medios, por lo que para no ensuciar el código con partes
distintas para cada S.O., se buscó una solución compatible a todos ellos.
executable = os.path.join(appdir, "avrdude", "avrdude")
configuration = os.path.join(appdir, "avrdude", "avrdude.conf")
hexadecimal = os.path.join(appdir, "avrdude", "PlatexFirmata.hex")
command = "\""+executable+"\" -q -V -C \""+configuration+"\" -p
atmega328p -c arduino -P "+self.portsCmb.currentText()+" -b 115200 -D -U
flash:w:\""+hexadecimal+"\":i"
Una vez lista la llamada al ejecutable del programador con todos los
parámetros listos, se iniciaba la programación.
self.program.start(command)
Una vez terminada la programación se comprueba el resultado de esta y se
informa el usuario, apareciendo una ventana de aviso si se ha producido algún fallo.
Otra parte muy problemática fue la de encontrar la ruta de los archivos del
proyecto, ya que es una tarea relativamente sencilla si se ejecuta desde el código
Página 70
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
fuente, pero una vez es empaquetado en forma de instalador, la estructura del
programa cambia completamente, habiendo casos en los que el ejecutable y los
archivos del proyecto se instalan en rutas distintas, por lo que el algoritmo para
encontrar dichos ficheros se complicó en gran medida debiendo tener en cuenta todas
las posibles combinaciones de empaquetado que se realizan para cada uno de los
sistemas operativos.
isfrozen = getattr(sys, 'frozen', False)
if isfrozen:
if not sys.path or not sys.path[0]:
raise
RuntimeError('Cannot
determine
sys.path[0] is empty!')
else:
entry = sys.path[0]
else:
if not sys.argv or not sys.argv[0]:
entry = '<interpreter>'
else:
entry = sys.argv[0]
app
path
because
entry = os.path.realpath(entry)
appdir = os.path.dirname(entry)
8.3.3.4. Comunicación con Firmata
El proyecto hace uso de una librería para la comunicación siguiendo el
protocolo Firmata a través del puerto serie. Esta librería fue desarrollada por Tino de
Bruijn, desarrollador residente en los Países Bajos y que liberó su código fuente para
uso no comercial.
Es una librería que aunque funcional, se le han realizado una serie de
modificaciones para mejorar la velocidad de respuesta, arreglar una serie de bugs,
aumentar la funcionalidad e integrarla con la estructura del proyecto.
La configuración de pines para limitar las funciones que podemos asignar a
cada pin pueden está definido en un archivo de configuración.
BOARDS = {
'arduino' : {
Página 71
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
'digital' : tuple(x for x in range(24)),
'analog' : tuple(x for x in range(14, 20)),
'pwm' : (3, 5, 6, 9, 10, 11),
'use_ports' : True,
'disabled' : (0, 1, 20, 21, 22, 23) # Rx, Tx, Crystal
},
'arduino_mega' : {
'digital' : tuple(x for x in range(54)),
'analog' : tuple(x for x in range(16)),
'pwm' : tuple(x for x in range(2,14)),
'use_ports' : True,
'disabled' : (0, 1, 14, 15) # Rx, Tx, Crystal
}
}
Cada función tiene asignados determinados pines tanto de forma paramétrica
como individualmente. En el proyecto sólo se hará uso de la placa Arduino normal, por
lo que la configuración de la versión Mega no se utilizará.
El archivo de configuración ha sido modificado con respecto al original debido a
que no permitía utilizar las características digitales que los pines analógicos también
poseen. También se modificó la numeración de los pines analógicos para hacerla
correlativa con respecto a los digitales y poder hacer uso de ellos tanto de forma
digital como analógica.
Una vez se ha seleccionado el puerto serie como se ha indicado en el apartado
anterior, se inicia un iterador que mira continuamente si ha llegado algún byte a través
del puerto serie para procesarlo y esto se realiza de forma paralela al programa en
otro hilo de ejecución.
self.it = util.Iterator(self.board)
self.it.start()
Una vez recibida una trama se procederá a comprobar si se trata de una trama
válida. Para ello se comprobarán que las transmisiones que se están recibiendo siguen
las especificaciones del protocolo que se han marcado.
byte = self.sp.read()
Página 72
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
if not byte:
return
data = ord(byte)
received_data = []
handler = None
if data < START_SYSEX:
try:
handler = self._command_handlers[data & 0xF0]
except KeyError:
return
received_data.append(data & 0x0F)
while len(received_data) < handler.bytes_needed:
received_data.append(ord(self.sp.read()))
elif data == START_SYSEX:
data = ord(self.sp.read())
handler = self._command_handlers.get(data)
if not handler:
return
data = ord(self.sp.read())
while data != END_SYSEX:
received_data.append(data)
data = ord(self.sp.read())
else:
try:
handler = self._command_handlers[data]
except KeyError:
return
while len(received_data) < handler.bytes_needed:
received_data.append(ord(self.sp.read()))
try:
handler(*received_data)
except ValueError:
pass
Se discrimina según el tipo de dato que se haya recibido para ser procesado de
la forma que se debe hacer, una vez identificado el tipo de dato, y separado el
comando de los datos, se llama a la función que debe procesarlos pasándole una
referencia de los datos recibidos.
El envío de tramas se realiza de forma individual para cada caso, por ejemplo si
se desea cambiar el tiempo de muestreo de los pines analógicos se utiliza la siguiente
función para mandar los tiempos a la placa Arduino:
def sampling_interval(self, interval=19):
Página 73
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
if interval < 19: inteval = 19
elif interval > 16383: interval = 16383
self.send_sysex(SAMPLING_INTERVAL, to_two_bytes(interval))
El dato de tiempo de muestreo se envía a través del mensaje extendido SysEx,
ya que no tiene asignado un comando directamente. En la transmisión van incluidas el
identificador de tiempo de muestreo y el propio tiempo de muestreo que en este caso
se ha decidido mandarlo en un máximo de 14 bits, que equivalen a dos bytes de
transmisión a través de Firmata.
En los casos en los que existe un comando para la acción a realizar, por
ejemplo, para cambiar el modo de funcionamiento de un pin, el código sería algo
distinto:
command = chr(SET_PIN_MODE)
command += chr(self.pin_number)
command += chr(mode)
self.board.sp.write(command)
8.4. Análisis de la placa de interfaz
8.4.1. Introducción
Como se ha estipulado anteriormente, la placa de interfaz estará basada en la
plataforma Arduino.
Ilustración 26 | Logo Arduino
Página 74
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Arduino es una plataforma de electrónica abierta, centrada en la creación de
prototipos, basada en hardware y software libre fáciles de usar, ya que el usuario final
para el que se diseñó eran artistas, diseñadores y aficionados.
Arduino toma información del entorno a través de sus pines de entrada por los
que se puede conectar una gran variedad de sensores y puede interactuar con lo que
le rodea a través de actuadores tales como luces, motores, etc.
El microcontrolador existente en la placa Arduino se programa en C/C++
haciendo uso de las librerías de Arduino, aunque también es posible programar sin
utilizarlas utilizando sólo las librerías estándares de avrlibc o haciéndolo directamente
en ensamblador.
Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de estar
conectados a un ordenador, el código es grabado en la memoria flash de la placa y su
ejecución comienza automáticamente al alimentar la placa.
El proyecto Arduino está basado en otros proyectos de código abierto y libres
tales como Wiring para las librerías del microcontrolador y Processing para el entorno
de desarrollo. El propio proyecto Arduino también es de código abierto y libre, tanto
para la parte de hardware como para la de software, por lo que las placas pueden ser
fabricadas a mano o compradas a través de los distribuidores existentes, pudiendo
descargar los ficheros de diseño con la posibilidad de modificarlos para adaptarlos a la
aplicación que se desee.
Ilustración 27 | Arduino UNO R2
Página 75
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
El proyecto se ha desarrollado utilizando la placa Arduino UNO R2, aunque es
compatible tanto con las revisiones 1 y 3 de la misma placa como con la Arduino
Duemilanove y Diecimila. La compatibilidad con la Arduino Leonardo debería ser total
una vez se asiente la recién salida placa.
8.4.2. Características principales
El Arduino UNO es una placa electrónica basada en el Atmega328 de Atmel.
Este integrado se intenta en la medida de lo posible que sea en la versión PDIP para
poder cambiar el chip fácilmente y sin herramientas por cualquier usuario, en caso de
que falle o se rompa, aunque este tipo de empaquetado está tendiendo a desparecer,
en favor del montaje superficial mucho más difícil de sustituir, pero más barato de
fabricar y montar.
Ilustración 28 | ATmega328P
Dicho microcontrolador cuenta con 20 entradas/salidas digitales, de los cuales
6 pueden ser utilizados como salidas PWM y otros 6 como entradas analógicas, un
cristal de 16Mhz, una conexión serie a la que se puede acceder también por puerto
serie como se explicará en el siguiente apartado, un conector ICSP para conectar un
programador, un botón de reseteo, un conector jack para alimentación externa y un
conversor USB-Serie.
Tabla 19 | Características del Arduino UNO
Característica
Microcontrolador
Voltaje de funcionamiento
Voltaje de entrada (recomendado)
Nombre
ATmega328
5V
7-12V
Página 76
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Voltaje de entrada (límites)
Pines digitales I/O
Pines de entrada analógica
Corriente continua de los pines I/O
Corriente continua del pin de 3,3 V
Memoria Flash
SRAM
EEPROM
Velocidad de reloj
Memoria
6-20V
14 (6 de las cuales proporcionan
una salida PWM)
6
40 mA
50 mA
32 KB (ATmega328) de los
cuales 0,5 KB utilizado por
gestor de arranque
2 KB (ATmega328)
1 KB (ATmega328)
16 MHz
8.4.3. Formas de alimentación eléctrica
La placa puede ser alimentada a través de la conexión USB o con una fuente de
alimentación externa. La fuente de la alimentación es escogida automáticamente
mediante la electrónica integrada en la placa, dando prioridad a la alimentación
externa que probablemente tenga una capacidad mucho mayor a la del USB.
La alimentación externa puede ser introducida a la placa por el conector jack de
2,1mm existente en la placa o mediante cables sueltos conectándolos a GND y Vin.
La tensión mínima recomendada para alimentar la placa de forma externa es de
7V, ya que hay caídas de tensión tanto en el regulador de tensión para obtener los 5V
como en las distintas protecciones eléctricas como la de conexión inversa, que crean
pequeñas caídas de tensión. Como máximo se recomienda utilizar 9V, aunque es
posible alimentar con 12V, el regulador de tensión se sobrecalentará excesivamente,
pudiendo llegar a apagarse por sobrepasar la temperatura máxima de funcionamiento.
Los pines relativos a la alimentación que podemos encontrar en la placa son:

Vin: es la entrada de voltaje no regulado a la placa de alimentación, está
conectado a la entrada de alimentación externa por el jack. Este pin puede
Página 77
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
ser usado tanto como entrada como salida de alimentación, pero sólo si se
está alimentando externamente.

5V: este pin está conectado a la salida del regulador de tensión que
transforma la tensión de Vin en 5V, también está conectado al pin de 5V del
conector USB. La máxima intensidad que se puede obtener de este pin es
de 500mA. En caso de alimentarlo por USB, en caso de alimentación
externa es difícil de determinar ya que depende en gran medida de la
tensión de entrada, cuanto mayor sea la tensión, menor será la intensidad
máxima que se pueda obtener.

3V3: es una tensión de 3.3V obtenida por un regulador de tensión a partir
de raíl de 5V. La máxima intensidad que se puede obtener de este pin es de
120mA en las nuevas versiones y 50mA en las antiguas.

GND: tensión de referencia, masa.
8.4.4. Análisis de la memoria
El Atmega328 tiene 32KB de memoria flash, que permite una rápida descarga
del programa en el microcontrolador. De los 32KB, 0,5KB son utilizados por el
bootloader.
También posee 2KB de memoria RAM estática y 1KB de memoria EEPROM, que
a esta última no se le dará uso en el proyecto, aunque en el plan de ruta del protocolo
Firmata se usará para guardar el estado de la placa entre usos aunque esta haya sido
desconectada de la alimentación.
8.4.5. Análisis de las entradas y salidas
Cada una de los 20 pines digitales del Arduino puede ser usado como entrada o
salida, usando las funciones adecuadas. Todos los pines funcionan a 5V, por lo que si
se les conecta a una tensión mayor puede que dejen de funcionar permanentemente.
Cada pin tiene una salida de intensidad de 40mA máximo y una resistencia de pull-up
integrada de unos 20-50 kOhms.
Página 78
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Además, algunos pines tienen alguna función adicional:

Serie: 0 (RX) y 1 (TX). Se usan para recibir y transmitir datos serializados con
niveles TTL. Estos pines están conectados al conversor USB-Serie para
comunicarse con el ordenador. En el proyecto se utilizará esta
comunicación por lo que su uso como pines digitales no estará disponible.

Interrupciones externas: 2 y 3, pueden ser configurados para interrumpir la
ejecución del código y realizar otra tarea. Pueden ser configurados para
interrumpir por nivel, por flanco o por cambio de valor.

PWM: seis pines marcados en la placa con el símbolo ~, pueden proveer
una salida de PWM con una precisión de 8 bits y con una frecuencia en el
orden de kilohercios.

SPI: protocolo de comunicación serie mediante 4 hilos muy utilizado para
comunicación de corto alcance entre microcontroladores. Suele ser
utilizado también para programar el microcontrolador Atmel mediante un
programador compatible.

I2C: protocolo de comunicación serie mediante 2 hilos muy utilizado para la
comunicación de corto alcance con sensores inteligentes.
8.4.6. Análisis de la Interfaz USB-Serie
La comunicación de la placa de interfaz con el software se realizará a través de
USB, pero el microcontrolador con el que se comunica sólo tiene interfaz serie, por lo
que habrá que realizar dicha conversión externamente, utilizando para ello un circuito
integrado que haga de conversor entre ambos protocolos.
PC
Conversor USB-Serie
Micro
Ilustración 29 | Interfaz USB-Serie
Página 79
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
8.4.6.1. Chip FTDI
Los primeros modelos de placas Arduino contenían un chip denominado
FT232R fabricado por Future Technology Devices International (FTDI) que está hecho a
medida y está centrado en la conversión del protocolo serie a USB, emulando un
puerto serie en el lado del ordenador al que se ha conectado.
Ilustración 30 | Arduino Duemilanove
El nivel de soporte de drivers existente es bastante bueno y se han desarrollado
tanto para los principales sistemas operativos como para otros no tan conocidos,
existiendo también versiones para 32 y 64 bits.
La principal ventaja de esta alternativa es que el chip no necesita configuración
y no se tiene que tener conocimiento alguno del protocolo USB para realizar dicha
conversión.
El precio no es excesivamente alto y la cantidad de componentes externos se
limita a unos pocos condensadores y a unos leds en el caso de que se desee una
visualización de la actividad del puerto serie.
8.4.6.2. Chip Atmel
Las siguientes revisiones de las placas Arduino, cambiaron el chip conversor
USB-Serie FTDI por un chip de Atmel (el Atmega16u2) con un módulo USB, de esta
manera se mantenía el chip principal de Arduino intacto sin tener que desarrollar
nuevas librerías y el chip FTDI, de un precio algo elevado, era sustituido por el Atmel.
Página 80
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Se desarrolló un firmware que hiciera
exactamente la misma función que l FTDI al
que reemplaza. Para ello se utilizó la
especificación Communication Device Class
(CDC), que entre los varios tipos de interfaces
existentes, permite emular un puerto serie
siguiendo las especificaciones del protocolo
Ilustración 31 | Arduino UNO
USB. Al estar en las especificaciones y tratarse
el USB de un estándar de comunicaciones
bastante extendido, no se necesita la instalación de drivers en los sistemas operativos
Linux y Mac OS, aunque en Windows si que siguen siendo necesarios.
Como defecto, se necesita más espacio en placa, ya que el microcontrolador
necesita de un cristal externo para mantener la precisión en la comunicación USB,
aparte del conector ICSP de programación.
Una ventaja de estos chips es que reprogramándolos se puede emular otros
tipos de dispositivos USB, tales como teclados, ratones, etc.
8.4.6.3. Sin chip
El último modelo de la placa Arduino,
denominada Leonardo, no necesita este chip conversor
de USB a serie ya que el nuevo chip de Atmel que incluye
(el Atmega32u4) contiene un módulo USB, por lo que
permite eliminar el conversor intermedio al poder recibir
el mismo la trama USB, procesarla y comunicarse.
Ilustración 32 | Arduino
Leonardo
En el paquete de software de Arduino, se
incluyen las librerías necesarias para configurar dicho
módulo de la forma adecuada, de manera que emule un puerto serie tanto para el
sistema operativo al que se conecta como para el programador de la placa.
La principal ventaja de esta solución es que no es necesaria la instalación de
drivers en las plataformas Linux y Mac OS y elimina el chip conversor que tenía un peso
importante en el precio de venta final.
Página 81
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Cualquier solución, de las citadas anteriormente, utilizada en las placas es
compatible con la parte de software del proyecto.
8.4.7. Análisis de los métodos de programación
El Arduino UNO puede ser programado desde el software de Arduino,
seleccionando el modelo adecuado de la placa y el puerto serie al que está conectado.
El Atmega328 incluido en las placas Arduino, viene pregrabado con un
bootloader que emula el protocolo del programador STK500, por lo que es compatible
con variedad de software de programación además del software de Arduino.
También existe la posibilidad de programar el Atmega328 a través del conector
ICSP de seis pines, mediante el uso de un programador ICSP. Habrá que utilizar uno de
los modelos soportados por el software Arduino o utilizar un software externo para
realizar la operación de descarga del software.
8.4.8. Análisis del entorno de trabajo
El software de Arduino está basado en Java, por lo que posee compatibilidad
multiplataforma.
Página 82
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Ilustración 33 | Software Arduino en Windows 7
Es un entorno de desarrollo muy simple, aunque esa es su principal baza, que lo
hace muy fácil de usar al no tener nada que configurar. Tiene una ventana principal
donde se edita el código con coloreado de funciones y una inferior en la que aparecen
los mensajes de error de los procesos de compilado y programación del
microcontrolador.
Ilustración 34 | Botones de verificación y carga
Tiene dos botones principales, que son los que realizan la tarea de verificar el
código escrito mediante la compilación de éste y el segundo el de compilación y carga
del código en la placa Arduino a través del puerto serie.
También lleva integrado un simple monitor serie, con el que poder depurar el
código mandando mensajes a través del puerto serie, o directamente interactuar con
un programa que tenga su interfaz de usuario a través de este protocolo.
Página 83
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Memoria
Lleva incluida una toolchain para los AVR basada en avr-gcc, que es compilador
que toma código en lenguaje C/C++ de alto nivel o ensamblador y crea un archivo
binario que se pueda programar en un AVR. Técnicamente avr-gcc es sólo un
compilador, portado de GCC (GNU Compiler Collection) para la familia de AVR de
Atmel, pero las mayorías de referencias a avr-gcc se refieren a todo el toolchain.
El paquete de software también lleva incluido un programador para los AVR
llamado avrdude, que es un programa de línea de comandos, ideal para automatizar.
Es compatible con el programador STK500 a través del puerto serie, que es el
programador que emulan los chips con el bootloader de Arduino para grabar en la
flash el archivo binario del programa desde el propio microcontrolador.
Tanto la toolchain de compilación para los AVR, como el programado, son de
código abierto y libres y además están incluidos en el paquete de software, por lo que
está listo para ser ejecutado en cualquier ordenador con sólo necesitar la instalación
de la máquina virtual de Java. De esta manera se elimina la dependencia de librerías
externas que solían traer problemas debido a la gran variedad de versiones que los
usuarios podían tener instaladas, tanto muy nuevas y con fallos de código no
descubiertos como muy antiguas con características no implementadas.
Página 84
ANEXOS
DOCUMENTO Nº 2
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Índice de los anexos
9.
Anexo I: Diseño y programación de la aplicación..................................... 91
9.1.
Código inicialización aplicación: platex.pyw ............................................ 91
9.2.
Código de la pantalla principal: mainwindow.py ..................................... 92
9.3.
Código ventana selección puerto serie: selectportdlg.py ........................ 94
9.4.
Módulo configuración pines: mode.py .................................................... 99
9.5.
Módulo control pines digitales: digital.py .............................................. 101
9.6.
Módulo lectura analógica: analog.py ..................................................... 103
9.7.
Módulo control de PWM: pwm.py ......................................................... 107
9.8.
Módulo control de servomotores: servo.py ........................................... 109
9.9.
Módulo control de motores DC: motor.py ............................................. 113
9.10.
Módulo secuenciador: sequencer.py ................................................. 117
9.11.
Código para crear instalador: setup.py............................................... 122
9.12.
Script de compilación para Linux: build-linux.sh ................................ 123
9.13.
Script de compilación para Mac: build-mac.sh ................................... 127
10.
Anexo II: Instalación del dispositivo USB ................................................ 132
11.
Anexo III: Manual de usuario de Platex .................................................. 137
11.1.
Instalación ........................................................................................... 137
11.1.1. Microsoft Windows ........................................................................ 137
Página 86
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
11.1.2. Linux Ubuntu .................................................................................. 139
11.1.3. Mac OS X ........................................................................................ 141
11.2.
Ventana inicial..................................................................................... 142
11.3.
Ventana principal ................................................................................ 143
11.3.1. Configuración ................................................................................. 144
11.3.2. Digital.............................................................................................. 146
11.3.3. Analógico ........................................................................................ 147
11.3.4. PWM ............................................................................................... 149
11.3.5. Servo ............................................................................................... 150
11.3.6. Motores .......................................................................................... 152
11.3.7. Secuenciador .................................................................................. 154
12.
Anexo IV: Compilación y distribución del software................................ 157
12.1.
Windows ............................................................................................. 157
12.2.
Linux .................................................................................................... 160
12.3.
Mac OS ................................................................................................ 162
Página 87
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Índice de ilustraciones
Ilustración 35 | Nuevo hardware encontrado ................................................. 132
Ilustración 36 | Selección de método de búsqueda alternativa ...................... 133
Ilustración 37 | Ubicación donde buscar los controladores............................. 134
Ilustración 38 | Instalando los controladores .................................................. 135
Ilustración 39 | Los controladores no están firmados ..................................... 135
Ilustración 40 | El controlador se instaló correctamente ................................ 136
Ilustración 41 | Ruta de instalación por defecto .............................................. 138
Ilustración 42 | Aviso de modificación del equipo ........................................... 138
Ilustración 43 | Centro de Software de Ubuntu ............................................... 139
Ilustración 44 | Se proporcionan los permisos de administrador .................... 140
Ilustración 45 | Instalación finalizada correctamente ...................................... 140
Ilustración 46 | Permisos insuficientes............................................................. 141
Ilustración 47 | Ventana inicial ......................................................................... 142
Ilustración 48 | Módulo de configuración ........................................................ 144
Ilustración 49 | Lista de modos ........................................................................ 145
Ilustración 50 | Algunos pines configurados .................................................... 145
Ilustración 51 | Módulo digital ......................................................................... 146
Ilustración 52 | Estado de activación ............................................................... 147
Página 88
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 53 | Módulo analógico ................................................................... 148
Ilustración 54 | Traza analógica oculta ............................................................. 149
Ilustración 55 | Módulo PWM .......................................................................... 150
Ilustración 56 | Servomotor de hobby ............................................................. 151
Ilustración 57 | Módulo servos......................................................................... 151
Ilustración 58 | Activación de servos................................................................ 152
Ilustración 59 | Módulo motores ..................................................................... 153
Ilustración 60 | Motor Shield 3.0...................................................................... 154
Ilustración 61 | Motor Shield R3 ...................................................................... 154
Ilustración 62 | Módulo secuenciador ............................................................. 155
Ilustración 63 | Controles específicos .............................................................. 156
Ilustración 64 | Activar salida del compilador .................................................. 159
Ilustración 65 | Botón de verificar código ........................................................ 159
Ilustración 66 | Localización del firmware ....................................................... 160
Ilustración 67 | Comando en una terminal de Linux Ubuntu ........................... 161
Ilustración 68 | Comando en una terminal de Mac OS X Lion ......................... 163
Página 89
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Índice de tablas
Tabla 20 | Asignación de pines ......................................................................... 154
Página 90
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9. Anexo Í: Diseno y programacion
de la aplicacion
9.1. Código inicialización aplicación: platex.pyw
#!/usr/bin/env python
# -*- coding: utf-8 -*import sip
sip.setapi('QString', 2)
from PyQt4 import QtCore, QtGui
import sys, logging, os
from ui.mainwindow import MainWindow
import resources_rc
if __name__ == "__main__":
logging.basicConfig(format="%(levelname)-8s %(asctime)s %(module)12s %(message)s", level=logging.DEBUG)
logger = logging.getLogger(__name__)
app = QtGui.QApplication(sys.argv)
app.setOrganizationName("Universidad de La Rioja")
app.setOrganizationDomain("unirioja.es")
app.setApplicationName("Platex")
main = MainWindow()
main.show()
sys.exit(app.exec_())
Página 91
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.2. Código de la pantalla principal:
mainwindow.py
# -*- coding: utf-8 -*"""
This module contains the class MainWindow.
"""
import logging
from PyQt4.QtGui import QMainWindow, QPushButton, QMenu, QActionGroup
from PyQt4.QtCore import QTimer, pyqtSlot
from pyfirmata import Arduino, util
from
from
from
from
from
from
from
from
from
Ui_mainwindow import Ui_mainWindow
selectportdlg import SelectPortDlg
mode import ModeTab
analog import AnalogTab
digital import DigitalTab
pwm import PWMTab
servo import ServoTab
motor import MotorTab
sequencer import SequencerTab
logger = logging.getLogger(__name__)
class MainWindow(QMainWindow, Ui_mainWindow):
"""
MainWindow: this is the class that manages all the funcionality of
receiving input from the user.
"""
def __init__(self, parent=None):
"""
Default Constructor. It can receive a top window as parent.
"""
QMainWindow.__init__(self, parent)
logger.debug("Created MainWindow")
self.setupUi(self)
for x in xrange(2, 20):
eval("self.pin%02d"
{padding:0px}")
self.board = None
self.lastIndex = 0
%
(x)).setStyleSheet("*
QTimer.singleShot(0, self.selectPort)
Página 92
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
def selectPort(self):
dialog = SelectPortDlg(self)
dialog.exec_()
# If empty object is returned, we exit
self.board = dialog.getBoard()
if not self.board:
self.close()
else:
self.tabs
=
(ModeTab(self),
AnalogTab(self),
PWMTab(self),
ServoTab(self),
SequencerTab(self))
self.tabs[0].enterTab()
DigitalTab(self),
MotorTab(self),
self.it = util.Iterator(self.board)
self.it.start()
@pyqtSlot(int)
def on_tabWidget_currentChanged(self, index):
"""
Slot documentation goes here.
"""
self.tabs[self.lastIndex].exitTab()
self.tabs[index].enterTab()
self.lastIndex = index
def closeEvent(self, event):
if hasattr(self.board, "exit"):
self.board.exit()
event.accept()
Página 93
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.3. Código ventana selección puerto serie:
selectportdlg.py
# -*- coding: utf-8 -*import logging, serial, os, sys
from PyQt4.QtGui import QDialog, QPushButton, QComboBox,
QStackedWidget, QHBoxLayout, QVBoxLayout, QWidget, QMessageBox
from PyQt4.QtCore import QTimer, pyqtSlot, QProcess
QLabel,
from pyfirmata import Board
from pyfirmata.boards import BOARDS
POSIX = False
if os.name == "posix":
import glob
POSIX = True
# Code for getting app folder
isfrozen = getattr(sys, 'frozen', False)
if isfrozen:
if not sys.path or not sys.path[0]:
raise
RuntimeError('Cannot
determine
sys.path[0] is empty!')
else:
entry = sys.path[0]
else:
if not sys.argv or not sys.argv[0]:
entry = '<interpreter>'
else:
entry = sys.argv[0]
app
path
because
entry = os.path.realpath(entry)
appdir = os.path.dirname(entry)
logger = logging.getLogger(__name__)
class SelectPortDlg(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
logger.debug("Port selection dialog created")
statusLbl = QLabel("Programando el Arduino...")
self.connectBtn = QPushButton("&Conectar")
self.programBtn = QPushButton("&Programar")
exitBtn = QPushButton("Salir")
multiLbl = QLabel("&Selecciona la placa:")
self.portsCmb = QComboBox()
Página 94
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
multiLbl.setBuddy(self.portsCmb)
self.stackedWidget = QStackedWidget()
mainWidget = QWidget()
mainLayout = QHBoxLayout()
mainLayout.addWidget(multiLbl)
mainLayout.addWidget(self.portsCmb)
mainWidget.setLayout(mainLayout)
self.stackedWidget.addWidget(mainWidget)
progWidget = QWidget()
progLayout = QHBoxLayout()
progLayout.addWidget(statusLbl)
progLayout.addStretch()
progWidget.setLayout(progLayout)
self.stackedWidget.addWidget(progWidget)
buttonLayout = QHBoxLayout()
buttonLayout.addWidget(self.connectBtn)
buttonLayout.addWidget(self.programBtn)
buttonLayout.addStretch()
buttonLayout.addWidget(exitBtn)
layout = QVBoxLayout()
layout.addWidget(self.stackedWidget)
layout.addLayout(buttonLayout)
self.setLayout(layout)
self.boards = list()
self.board = None
self.programBtn.clicked.connect(self.programBoard)
self.portsCmb.currentIndexChanged[int].connect(self.updatePorts)
self.connectBtn.clicked.connect(self.connectBoard)
exitBtn.clicked.connect(self.reject)
self.setWindowTitle(u"Iniciando comunicación")
self.updatePorts(True)
logger.debug("Working dir: "+appdir)
@pyqtSlot()
def updatePorts(self, force=False):
# FIXME: Program button gets focus when opening QComboBox
if self.portsCmb.currentText() != "Actualizar" and not force:
return
logger.debug("Searching available serial ports")
self.connectBtn.setEnabled(False)
self.programBtn.setEnabled(False)
ports = list()
if POSIX:
Página 95
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
ports
+=
glob.glob("/dev/ttyACM*")
+
glob.glob("/dev/ttyUSB*")
+
glob.glob("/dev/tty.usb*")
+
glob.glob("/dev/tty.serial*")
for i in xrange(256):
try:
s = serial.Serial(i)
ports.append(s.portstr)
s.close()
except serial.SerialException:
pass
logger.debug("Found %d serial port(s): %s", len(ports), ports)
if not len(ports):
ports = [""]
self.portsCmb.clear()
self.portsCmb.addItems(ports)
self.portsCmb.addItem("Actualizar")
if self.portsCmb.currentText() != "":
self.connectBtn.setEnabled(True)
self.programBtn.setEnabled(True)
self.connectBtn.setFocus()
@pyqtSlot()
def connectBoard(self):
try:
logger.debug("Connecting
to
Arduino
board
on
port
"+self.portsCmb.currentText())
board
=
Board(self.portsCmb.currentText(),
BOARDS['arduino'])
except ValueError, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
except TypeError, e:
logger.debug(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
except serial.serialutil.SerialException, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
else:
logger.debug("Using
Arduino
board
on
port
"+board.sp.portstr)
self.board = board
self.accept()
@pyqtSlot()
def programBoard(self):
if
not
os.path.exists(os.path.join(appdir,
"PlatexFirmata.hex")):
"avrdude",
Página 96
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
logger.error("Hexadecimal file not found")
QMessageBox.warning(self, u"¡Atención!", u"No se pudo
encontrar el fichero a programar")
return
self.programBtn.setEnabled(False)
self.connectBtn.setEnabled(False)
self.stackedWidget.setCurrentIndex(1)
logger.debug("Programming
Arduino
board
on
"+self.portsCmb.currentText())
executable = os.path.join(appdir, "avrdude", "avrdude")
configuration
=
os.path.join(appdir,
"avrdude",
"avrdude.conf")
hexadecimal
=
os.path.join(appdir,
"avrdude",
"PlatexFirmata.hex")
self.program = QProcess()
#
avrdude
reference:
http://www.ladyada.net/learn/avr/avrdude.html
command = "\""+executable+"\" -q -V -C \""+configuration+"\" p atmega328p -c arduino -P "+self.portsCmb.currentText()+" -b 115200 -D -U
flash:w:\""+hexadecimal+"\":i"
logger.debug("avrdude call: "+command)
self.program.start(command)
self.program.finished.connect(self.programFinished)
@pyqtSlot()
def programFinished(self):
output = str(self.program.readAllStandardError())
if output.find("flash written") == -1: # avrdude: xxxx bytes
of flash written
if output.find("Expected signature") != -1: # avrdude:
Expected signature for ATMEGA328P is 1E 95 0F
error = u"La placa conectada no tiene un chip
compatible."
elif output.find("not in sync: resp=0x00") != -1: #
avrdude: stk500_getsync(): not in sync: resp=0x00
error = u"No parece que haya ninguna placa conectada
al puerto."
elif output.find("ser_send()") != -1: # ser_send(): write
error: sorry no info avail
error = u"Se produjo un error durante la comunicación
con la placa.\nAsegúrate de que está correctamente conectada."
elif output.find("ser_open()") != -1: # ser_open(): ....
error = u"El puerto no se pudo abrir.\nAsegúrate de
que ningún programa lo está usando."
else:
error = u"Se produjo un error al programar la
placa.\nComprueba el conexionado."
logger.warning("avrdude output: "+output)
logger.warning("An error ocurred: "+error)
QMessageBox.warning(self, u"¡Atención!", error)
Página 97
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
else:
logger.debug("Programmed successfully")
self.updatePorts(True)
self.connectBtn.setEnabled(True)
self.programBtn.setEnabled(True)
self.connectBtn.setFocus()
self.stackedWidget.setCurrentIndex(0)
def getBoard(self):
return self.board
Página 98
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.4. Módulo configuración pines: mode.py
# -*- coding: utf-8 -*import logging
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtGui import QMenu, QActionGroup
logger = logging.getLogger(__name__)
class ModeTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
for x in xrange(2, 20):
pin = eval("self.mw.pin%02d" % (x))
menu = QMenu(pin)
modeGroup = QActionGroup(self.mw)
modeGroup.setExclusive(True)
none = menu.addAction("&None")
modeGroup.addAction(none)
none.triggered.connect(self.clickNone)
none.setCheckable(True)
none.setChecked(True)
input = menu.addAction("&Input")
modeGroup.addAction(input)
input.triggered.connect(self.clickInput)
input.setCheckable(True)
output = menu.addAction("&Output")
modeGroup.addAction(output)
output.triggered.connect(self.clickOutput)
output.setCheckable(True)
if self.mw.board.pins[x].PWM_CAPABLE:
pwm = menu.addAction("&PWM")
modeGroup.addAction(pwm)
pwm.triggered.connect(self.clickPWM)
pwm.setCheckable(True)
if self.mw.board.pins[x].type == 2:
analogic = menu.addAction(u"&Analógico")
modeGroup.addAction(analogic)
analogic.triggered.connect(self.clickAnalog)
analogic.setCheckable(True)
pin.setMenu(menu)
pin.setStyleSheet("/* */") # force stylesheet update
def enterTab(self):
logger.debug("Entering mode tab")
Página 99
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
def exitTab(self):
logger.debug("Exiting mode tab")
@pyqtSlot()
def clickNone(self):
self._changeMode(self.mw.sender(), 7)
@pyqtSlot()
def clickInput(self):
self._changeMode(self.mw.sender(), 0)
@pyqtSlot()
def clickOutput(self):
self._changeMode(self.mw.sender(), 1)
@pyqtSlot()
def clickPWM(self):
self._changeMode(self.mw.sender(), 3)
@pyqtSlot()
def clickAnalog(self):
self._changeMode(self.mw.sender(), 2)
def _changeMode(self, action, mode):
pin = action.parentWidget().parentWidget()
text = ['I', 'O', 'A', 'P', '', '', '', 'N']
pin.setText(text[mode])
pin.setStyleSheet("/* */") # force stylesheet update
number = int(pin.property("objectName").toString()[-2:])
self.mw.board.pins[number].mode = mode
if mode == 2:
self.mw.board.pins[number].disable_reporting()
logger.debug("Changed
pin
%d
mode
to
'%s'",
number,
pin.text())
Página 100
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.5. Módulo control pines digitales: digital.py
# -*- coding: utf-8 -*import logging
from PyQt4.QtCore import pyqtSlot
logger = logging.getLogger(__name__)
class DigitalTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
for x in self.mw.board.ports:
x.pinChanged.connect(self.updatePin)
@pyqtSlot(int, bool)
def updatePin(self, number, state):
logger.debug("Input pin "+str(number)+" changed its state to
"+str(state))
eval("self.mw.di%02d" % (number)).setChecked(state)
def enterTab(self):
logger.debug("Entering digital tab")
for x in xrange(2, 20):
digPin = eval("self.mw.d%02d" % (x))
digInPin = eval("self.mw.di%02d" % (x))
digPin.setVisible(False)
digInPin.setVisible(False)
mode = self.mw.board.pins[x].mode
if mode == 1:
digPin.clicked.connect(self.digPinClicked)
digPin.setVisible(True)
digPin.setChecked(self.mw.board.pins[x].read())
elif mode == 0:
digInPin.setVisible(True)
digInPin.setChecked(self.mw.board.pins[x].read())
self.mw.board.pins[x].enable_reporting()
def exitTab(self):
logger.debug("Exiting digital tab")
for x in xrange(2, 20):
self.mw.board.pins[x].disable_reporting()
@pyqtSlot()
def digPinClicked(self):
pin = self.mw.sender()
Página 101
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
number = int(pin.property("objectName").toString()[-2:])
if pin.isChecked():
self.mw.board.pins[number].write(1)
logger.debug("Changed output pin "+str(number)+" state to
True")
else:
self.mw.board.pins[number].write(0)
logger.debug("Changed output pin "+str(number)+" state to
False")
Página 102
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.6. Módulo lectura analógica: analog.py
# -*- coding: utf-8 -*import logging
from functools import partial
from PyQt4.Qwt5 import QwtPlotGrid, QwtPlotCurve, QwtPlot, QwtPlotItem
from PyQt4.Qt import Qt, QPen
from PyQt4.QtCore import pyqtSlot
logger = logging.getLogger(__name__)
HISTORY = 60
class AnalogTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
self.curves = list()
self.data = list()
self.bars = list()
for i in xrange(0, 6):
self.bars.append({ 'group' : eval("self.mw.gbAnalog%d" %
(i)),
'bar'
:
eval("self.mw.analogBar%d"
%
eval("self.mw.lbAnalog%d"
%
(i)),
'label'
:
(i)),
'active'
:
eval("self.mw.analogShow%d"
% (i)) })
eval("self.mw.analogShow%d"
(i)).stateChanged.connect(partial(self._channelVisible, i))
%
self.mw.analogPlot.setAutoReplot(False)
self.mw.analogPlot.plotLayout().setAlignCanvasToScales(True)
grid = QwtPlotGrid()
grid.enableXMin(True)
grid.enableYMin(True)
grid.attach(self.mw.analogPlot)
grid.setPen(QPen(Qt.black, 0, Qt.DotLine))
grid.setMinPen(QPen(Qt.lightGray, 0, Qt.DotLine))
self.mw.analogPlot.setAxisScale(QwtPlot.xBottom, 0, HISTORY)
self.mw.analogPlot.setAxisScale(QwtPlot.yLeft, 0, 5)
self.mw.analogUnits.insertItems(0, ("Voltios", "Cuentas"))
self.mw.board.updateAnalog.connect(self._newSample)
self.mw.analogUnits.currentIndexChanged.connect(self._changedUnits)
Página 103
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.mw.analogUnitsTime.currentIndexChanged.connect(self._changedUnitsTime)
self.mw.analogTime.valueChanged[int].connect(self._changedTime)
colors
=
(Qt.blue,
Qt.red,
Qt.black,
Qt.darkCyan, Qt.magenta)
for i in xrange(0, 6):
curve = QwtPlotCurve()
curve.setPen(QPen(colors[i], 2))
curve.attach(self.mw.analogPlot)
self.curves.append(curve)
self.data.append(self._zeros(HISTORY+1))
self.bars[i]['bar'].setFillBrush(colors[i])
Qt.darkGreen,
self.mw.analogPlot.replot()
@pyqtSlot(int, int)
def _newSample(self, channel, value):
if self.mw.analogUnits.currentIndex() is 0:
value = round(float(value*5) / 1023, 2)
self.data[channel] = self.data[channel][1:]
self.data[channel].append(value)
self.curves[channel].setData(range(0,
self.data[channel])
self._updatePlot(channel)
HISTORY+1),
def _updatePlot(self, channel):
if self.mw.analogUnits.currentIndex() is 0:
self.bars[channel]['bar'].setValue(round(self.data[channel][HISTORY], 1))
self.bars[channel]['label'].setText(str(round(self.data[channel][HISTORY],
1)))
else:
self.bars[channel]['bar'].setValue(int(self.data[channel][HISTORY]))
self.bars[channel]['label'].setText(str(int(self.data[channel][HISTORY])))
self.mw.analogPlot.replot()
def enterTab(self):
logger.debug("Entering analog tab")
self._changedTime(self.mw.analogTime.value())
for pin in self.mw.board.pins:
if pin.type is 2:
channel = pin.pin_number-14
if pin.mode is 2:
pin.enable_reporting()
Página 104
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
logger.debug("Enabled analog reporting of analog
pin "+str(channel))
self.curves[channel].setVisible(self.bars[channel]['active'].isChecked())
self.bars[channel]['group'].setEnabled(True)
else:
self.curves[channel].setVisible(False)
self.bars[channel]['group'].setEnabled(False)
self.bars[channel]['bar'].setValue(0)
self.bars[channel]['label'].setText(str(0))
self.data[channel] = self._zeros(HISTORY+1)
self.curves[channel].setData(range(0,
HISTORY+1),
self.data[channel])
self._updatePlot(channel)
def exitTab(self):
logger.debug("Exiting analog tab")
for pin in self.mw.board.pins:
if pin.type is 2 and pin.mode is 2:
channel = pin.pin_number-14
logger.debug("Disabled analog reporting of analog pin
"+str(channel))
pin.disable_reporting()
self.data[channel] = self._zeros(HISTORY+1)
self.mw.board.sampling_interval()
def _zeros(self, length):
x = list()
for i in xrange(0, length):
x.append(0)
return x
def _resizeHistory(self, factor):
for channel in xrange(0, len(self.data)):
for sample in xrange(0, len(self.data[channel])):
self.data[channel][sample] *= factor
self.curves[channel].setData(range(0,
HISTORY+1),
self.data[channel])
self._updatePlot(channel)
@pyqtSlot(int)
def _changedUnits(self, index):
if index is 0:
logger.debug("Changed analog units to volts")
self._resizeHistory(5.0/1024)
self.mw.analogPlot.setAxisScale(QwtPlot.yLeft, 0, 5)
self.mw.analogPlot.replot()
for bar in self.bars:
bar['bar'].setRange(0, 5)
else:
Página 105
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
logger.debug("Changed analog units to counts")
self._resizeHistory(1024.0/5)
self.mw.analogPlot.setAxisScale(QwtPlot.yLeft, 0, 1024)
self.mw.analogPlot.replot()
for bar in self.bars:
bar['bar'].setRange(0, 1024)
self.mw.analogPlot.replot()
@pyqtSlot(int, int)
def _channelVisible(self, channel, state):
self.curves[channel].setVisible(state)
self._updatePlot(channel)
@pyqtSlot(int)
def _changedUnitsTime(self, index):
value = self.mw.analogTime.value()
self.mw.analogTime.blockSignals(True)
if index is 0:
self.mw.analogTime.setRange(19, 16383)
self.mw.analogTime.setValue(value*1000)
else:
self.mw.analogTime.setRange(0, 16)
self.mw.analogTime.setValue(value/1000)
self.mw.analogTime.blockSignals(False)
@pyqtSlot(int)
def _changedTime(self, time):
if self.mw.analogUnitsTime.currentIndex() is 0:
self.mw.board.sampling_interval(time)
else:
self.mw.board.sampling_interval(time*1000)
Página 106
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.7. Módulo control de PWM: pwm.py
# -*- coding: utf-8 -*import logging
from PyQt4.QtCore import pyqtSlot
logger = logging.getLogger(__name__)
class PWMTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
self.sliders = list()
for x in self.mw.board.pins:
if x.PWM_CAPABLE:
slider = eval("self.mw.pwmBar%02d" % x.pin_number)
slider.valueChanged.connect(self.updatePwm)
self.sliders.append(slider)
self.mw.cbPwmUnit.insertItems(0, ("Porcentaje", "Cuentas"))
self.mw.cbPwmUnit.currentIndexChanged.connect(self.changedUnits)
@pyqtSlot(int)
def updatePwm(self, value):
if self.mw.cbPwmUnit.currentIndex() is 0:
number
int(self.mw.sender().property("objectName").toString()[-2:])
logger.debug("PWM
value
pin
"+str(number)+"
set
"+str(int(value))+"%")
self.mw.board.pins[number].write(value/100)
else:
number
int(self.mw.sender().property("objectName").toString()[-2:])
logger.debug("PWM
value
pin
"+str(number)+"
set
"+str(int(value)))
self.mw.board.pins[number].write(round(value/1023, 2))
def enterTab(self):
logger.debug("Entering PWM tab")
for x in self.mw.board.pins:
if x.PWM_CAPABLE:
slider = eval("self.mw.pwmBar%02d" % x.pin_number)
slider.blockSignals(True)
eval("self.mw.gbPwm%02d"
x.pin_number).setEnabled(x.mode is 3)
=
to
=
to
%
Página 107
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
slider.setValid(x.mode is 3)
slider.blockSignals(False)
def exitTab(self):
logger.debug("Exiting PWM tab")
@pyqtSlot(int)
def changedUnits(self, index):
if index is 0:
logger.debug("Changed PWM units to percentage")
for slider in self.sliders:
value = slider.value()
slider.blockSignals(True)
slider.setRange(0, 100, 1)
slider.blockSignals(False)
slider.setValue(round(value*100/1023))
else:
logger.debug("Changed PWM units to counts")
for slider in self.sliders:
value = slider.value()
slider.blockSignals(True)
slider.setRange(0, 1023, 1)
slider.blockSignals(False)
slider.setValue(round(value*1023/100))
Página 108
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.8. Módulo control de servomotores: servo.py
# -*- coding: utf-8 -*import logging
from PyQt4.QtCore import pyqtSlot
from functools import partial
logger = logging.getLogger(__name__)
class ServoTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
self.sliders = list()
self.selected = [0 for x in range(0, 6)]
for x in xrange(1, 7):
slider = eval("self.mw.servoBar%d" % x)
spinBox = eval("self.mw.servoBox%d" % x)
slider.setRange(0, 180, 1)
self.sliders.append(slider)
self._groupEnabled(x, False)
self._disableCheckBox(x)
slider.valueChanged.connect(spinBox.setValue)
spinBox.valueChanged[int].connect(slider.setValue)
spinBox.valueChanged[int].connect(partial(self._updateServo, x))
eval("self.mw.servoCmb%d"
x).currentIndexChanged[str].connect(partial(self._pinSelected, x))
eval("self.mw.servoCb%d"
x).stateChanged[int].connect(partial(self._activated, x))
eval("self.mw.servoBut%d"
x).clicked.connect(partial(self._zero, x-1))
self.mw.servoBut0.clicked.connect(self._allZero)
%
%
%
def enterTab(self):
logger.debug("Entering servo tab")
self._updateAvailable()
def exitTab(self):
logger.debug("Exiting servo tab")
@pyqtSlot(int)
def _zero(self, slider):
if self.sliders[slider].isValid():
self.sliders[slider].setValue(0)
Página 109
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
@pyqtSlot()
def _allZero(self):
for x in xrange(0, len(self.sliders)):
self._zero(x)
@pyqtSlot(int, int)
def _activated(self, group, status):
if status:
self._groupEnabled(group, True)
pin
=
int(eval("self.mw.servoCmb%d"
group).currentText())
logger.debug("Pin "+str(pin)+" set to Servo mode")
self.selected[group-1] = pin
self.mw.board.pins[pin].mode = 4
else:
self._groupEnabled(group, False)
pin = self.selected[group-1]
logger.debug("Pin "+str(pin)+" restored to Output mode")
self.selected[group-1] = 0
self.mw.board.pins[pin].mode = 1
self.mw.board.pins[pin].write(0)
%
def _groupEnabled(self, group, state):
eval("self.mw.servoBar%d" % group).setEnabled(state)
eval("self.mw.servoBar%d" % group).setValid(state)
eval("self.mw.servoBox%d" % group).setEnabled(state)
eval("self.mw.servoBut%d" % group).setEnabled(state)
def _disableCheckBox(self, group):
eval("self.mw.servoCb%d" % group).setChecked(False)
eval("self.mw.servoCb%d" % group).setEnabled(False)
@pyqtSlot(str)
def _pinSelected(self, group, pin):
if pin:
try:
self.suitables.remove(int(pin))
eval("self.mw.servoCb%d" % group).setEnabled(True)
except ValueError:
pass
else:
eval("self.mw.servoBox%d" % group).blockSignals(True)
eval("self.mw.servoBar%d" % group).setValue(0)
eval("self.mw.servoBox%d" % group).blockSignals(False)
self._groupEnabled(group, False)
self._disableCheckBox(group)
self._updateAvailable()
def _updateAvailable(self):
Página 110
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.suitables = list()
# Search for pins set as output or servo modes
for x in self.mw.board.pins:
if x.mode in (1, 4):
self.suitables.append(x.pin_number)
# Search for non used pins
for x in xrange(1, 7):
combo = eval("self.mw.servoCmb%d" % x)
try:
number = int(combo.currentText())
if number in self.suitables:
# If pin is on available list, remove it, we are
already using it
self.suitables.remove(number)
continue
except ValueError:
# If combobox content is not a number, is empty,
ignore
pass
# Create custom list for each combobox
# Made from available pin list plus the selected pin in the
combobox
for x in xrange(1, 7):
combo = eval("self.mw.servoCmb%d" % x)
items = self.suitables[:]
number = 0
try:
number = int(combo.currentText())
items.append(number)
# copy list
# no pin selected
# add pin selected
in combobox
items.sort()
except ValueError:
pass
combo.blockSignals(True)
combo.clear()
combo.addItem("")
if len(items):
for pin in items:
combo.addItem(str(pin))
if number:
combo.setCurrentIndex(items.index(number)+1)
#eval("self.mw.servoCb%d" % x).setChecked(True)
combo.blockSignals(False)
@pyqtSlot(int, int)
def _updateServo(self, group, angle):
pin = int(eval("self.mw.servoCmb%d" % group).currentText())
Página 111
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
logger.debug("Moved
servo
on
"+str(angle)+"º")
self.mw.board.pins[pin].write(angle)
Anexos
pin
"+str(pin)+"
to
Página 112
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.9. Módulo control de motores DC: motor.py
# -*- coding: utf-8 -*import logging
from PyQt4.QtCore import pyqtSlot
from functools import partial
logger = logging.getLogger(__name__)
class MotorTab(object):
def __init__(self, mwHandle):
self.mw = mwHandle
for page in xrange(0, 3):
eval("self.mw.motorBut%d"
%
page).clicked.connect(partial(self.mw.motorSw.setCurrentIndex, page))
eval("self.mw.motorSAll%d"
%
page).clicked.connect(partial(self._allZero, page))
eval("self.mw.motorBut%d"
%
page).clicked.connect(partial(self._changedPage, page))
for section in ("A", "B"):
eval("self.mw.motorStop%s%d"
%
(section,
page)).clicked.connect(partial(self._zero, section, page))
eval("self.mw.motorPer%s%d"
%
(section,
page)).valueChanged[int].connect(partial(self._updateMotor, section, page))
eval("self.mw.motorAct%s%d"
%
(section,
page)).clicked.connect(partial(self._activated, section, page))
self._groupEnabled(section, page, False)
if page is 3:
eval("self.mw.motorPwm%s%d"
%
(section,
page)).currentIndexChanged[str].connect(partial(self._pinSelected, section))
eval("self.mw.motorDir%s%d" % (section, page))
def enterTab(self):
logger.debug("Entering motor tab")
self._updateAvailable()
for page in xrange(0, 3):
for section in ("A", "B"):
try:
pin1 = int(eval("self.mw.motorPwm%s%d" % (section,
page)).currentText())
pin2 = int(eval("self.mw.motorDir%s%d" % (section,
page)).currentText())
state = self.mw.board.pins[pin1].mode is 3 and
self.mw.board.pins[pin2].mode is 1
except ValueError:
Página 113
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
state = False
eval("self.mw.motorAct%s%d"
page)).setEnabled(state)
Anexos
%
(section,
def exitTab(self):
logger.debug("Exiting motor tab")
@pyqtSlot(int)
def _zero(self, section, page):
if eval("self.mw.motorAct"+section+str(page)).isChecked():
eval("self.mw.motorPer"+section+str(page)).setValue(0)
@pyqtSlot()
def _allZero(self, page):
for section in ("A", "B"):
self._zero(section, page)
@pyqtSlot(str, int, bool)
def _activated(self, section, page, status):
pin
=
int(eval("self.mw.motorPwm%s%d"
%
(section,
page)).currentText())
self._groupEnabled(section, page, status)
if status:
logger.debug("Activating
motor
"+section+"
in
pin
"+str(pin))
else:
logger.debug("Deactivating
motor
"+section+"
in
pin
"+str(pin))
eval("self.mw.motorPer%s%d" % (section, page)).setValue(0)
self._updateAvailable()
def _groupEnabled(self, section, page, state):
eval("self.mw.motorSli%s%d"
%
page)).setEnabled(state)
eval("self.mw.motorPer%s%d"
%
page)).setEnabled(state)
eval("self.mw.motorStop%s%d"
%
page)).setEnabled(state)
(section,
(section,
(section,
@pyqtSlot(str, str)
def _pinSelected(self, section, pin):
try:
pwm = eval("self.mw.motorPwm%s2" % section).currentText()
dir = eval("self.mw.motorDir%s2" % section).currentText()
eval("self.mw.servoCb%d" % group).setEnabled(True)
except ValueError:
pass
self._updateAvailable()
def _updateAvailable(self):
Página 114
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.suitableDir = list()
self.suitablePwm = list()
# Search for pins set as output or servo modes
for x in self.mw.board.pins:
if x.mode is 1:
self.suitableDir.append(x.pin_number)
elif x.mode is 3:
self.suitablePwm.append(x.pin_number)
# Remove used pins in active configurations of page 2
for section in ("A", "B"):
try:
pwm
=
int(eval("self.mw.motorPwm%s2"
%
section).currentText())
dir
=
int(eval("self.mw.motorDir%s2"
%
section).currentText())
if eval("self.mw.motorAct%s2" % section).isChecked():
if pwm in self.suitablePwm:
self.suitablePwm.remove(pwm)
if dir in self.suitableDir:
self.suitableDir.remove(dir)
except ValueError:
pass
# Create custom list for each combobox
for section in ("A", "B"):
for type in ("Pwm", "Dir"):
combo = eval("self.mw.motor%s%s2" % (type, section))
if
not
eval("self.mw.motorAct%s2"
%
section).isChecked():
items = eval("self.suitable%s" % type)[:]
else:
items = [int(eval("self.mw.motor%s%s2" % (type,
section)).currentText())]
combo.blockSignals(True)
combo.clear()
if len(items):
for pin in items:
combo.addItem(str(pin))
combo.blockSignals(False)
@pyqtSlot(str, int, int)
def _updateMotor(self, section, page, speed):
pin
=
int(eval("self.mw.motorDir%s%d"
page)).currentText())
pwm
=
int(eval("self.mw.motorPwm%s%d"
page)).currentText())
logger.debug("Changed
motor
"+section+"
"+str(speed)+"%")
%
(section,
%
(section,
speed
to
Página 115
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.mw.board.pins[pin].write(1 if speed > 0 else 0)
self.mw.board.pins[pwm].write(abs(speed)/100.0)
@pyqtSlot(int)
def _changedPage(self, page):
eval("self.mw.motorBut%d" % page).setChecked(True)
for x in [y for y in range(0,3) if y is not page]:
eval("self.mw.motorBut%d" % x).setChecked(False)
for section in ("A", "B"):
if
eval("self.mw.motorAct%s%d"
%
x)).isChecked():
eval("self.mw.motorAct%s%d"
%
x)).setChecked(False)
self._activated(section, page, False)
self._updateAvailable()
(section,
(section,
Página 116
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.10. Módulo secuenciador: sequencer.py
# -*- coding: utf-8 -*import logging, serial, os, sys
from PyQt4.QtGui import QDialog, QPushButton, QComboBox,
QStackedWidget, QHBoxLayout, QVBoxLayout, QWidget, QMessageBox
from PyQt4.QtCore import QTimer, pyqtSlot, QProcess
QLabel,
from pyfirmata import Board
from pyfirmata.boards import BOARDS
POSIX = False
if os.name == "posix":
import glob
POSIX = True
# Code for getting app folder
isfrozen = getattr(sys, 'frozen', False)
if isfrozen:
if not sys.path or not sys.path[0]:
raise
RuntimeError('Cannot
determine
sys.path[0] is empty!')
else:
entry = sys.path[0]
else:
if not sys.argv or not sys.argv[0]:
entry = '<interpreter>'
else:
entry = sys.argv[0]
app
path
because
entry = os.path.realpath(entry)
appdir = os.path.dirname(entry)
logger = logging.getLogger(__name__)
class SelectPortDlg(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
logger.debug("Port selection dialog created")
statusLbl = QLabel("Programando el Arduino...")
self.connectBtn = QPushButton("&Conectar")
self.programBtn = QPushButton("&Programar")
exitBtn = QPushButton("Salir")
multiLbl = QLabel("&Selecciona la placa:")
self.portsCmb = QComboBox()
multiLbl.setBuddy(self.portsCmb)
Página 117
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.stackedWidget = QStackedWidget()
mainWidget = QWidget()
mainLayout = QHBoxLayout()
mainLayout.addWidget(multiLbl)
mainLayout.addWidget(self.portsCmb)
mainWidget.setLayout(mainLayout)
self.stackedWidget.addWidget(mainWidget)
progWidget = QWidget()
progLayout = QHBoxLayout()
progLayout.addWidget(statusLbl)
progLayout.addStretch()
progWidget.setLayout(progLayout)
self.stackedWidget.addWidget(progWidget)
buttonLayout = QHBoxLayout()
buttonLayout.addWidget(self.connectBtn)
buttonLayout.addWidget(self.programBtn)
buttonLayout.addStretch()
buttonLayout.addWidget(exitBtn)
layout = QVBoxLayout()
layout.addWidget(self.stackedWidget)
layout.addLayout(buttonLayout)
self.setLayout(layout)
self.boards = list()
self.board = None
self.programBtn.clicked.connect(self.programBoard)
self.portsCmb.currentIndexChanged[int].connect(self.updatePorts)
self.connectBtn.clicked.connect(self.connectBoard)
exitBtn.clicked.connect(self.reject)
self.setWindowTitle(u"Iniciando comunicación")
self.updatePorts(True)
logger.debug("Working dir: "+appdir)
@pyqtSlot()
def updatePorts(self, force=False):
# FIXME: Program button gets focus when opening QComboBox
if self.portsCmb.currentText() != "Actualizar" and not force:
return
logger.debug("Searching available serial ports")
self.connectBtn.setEnabled(False)
self.programBtn.setEnabled(False)
ports = list()
if POSIX:
ports
+=
glob.glob("/dev/ttyACM*")
+
glob.glob("/dev/ttyUSB*")
+
glob.glob("/dev/tty.usb*")
+
glob.glob("/dev/tty.serial*")
Página 118
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
for i in xrange(256):
try:
s = serial.Serial(i)
ports.append(s.portstr)
s.close()
except serial.SerialException:
pass
logger.debug("Found %d serial port(s): %s", len(ports), ports)
if not len(ports):
ports = [""]
self.portsCmb.clear()
self.portsCmb.addItems(ports)
self.portsCmb.addItem("Actualizar")
if self.portsCmb.currentText() != "":
self.connectBtn.setEnabled(True)
self.programBtn.setEnabled(True)
self.connectBtn.setFocus()
@pyqtSlot()
def connectBoard(self):
try:
logger.debug("Connecting
to
Arduino
board
on
port
"+self.portsCmb.currentText())
board
=
Board(self.portsCmb.currentText(),
BOARDS['arduino'])
except ValueError, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
except TypeError, e:
logger.debug(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
except serial.serialutil.SerialException, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atención¡", unicode(e))
self.updatePorts(True)
else:
logger.debug("Using
Arduino
board
on
port
"+board.sp.portstr)
self.board = board
self.accept()
@pyqtSlot()
def programBoard(self):
if
not
os.path.exists(os.path.join(appdir,
"avrdude",
"PlatexFirmata.hex")):
logger.error("Hexadecimal file not found")
QMessageBox.warning(self, u"¡Atención!", u"No se pudo
encontrar el fichero a programar")
Página 119
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
return
self.programBtn.setEnabled(False)
self.connectBtn.setEnabled(False)
self.stackedWidget.setCurrentIndex(1)
logger.debug("Programming
Arduino
board
on
"+self.portsCmb.currentText())
executable = os.path.join(appdir, "avrdude", "avrdude")
configuration
=
os.path.join(appdir,
"avrdude",
"avrdude.conf")
hexadecimal
=
os.path.join(appdir,
"avrdude",
"PlatexFirmata.hex")
self.program = QProcess()
#
avrdude
reference:
http://www.ladyada.net/learn/avr/avrdude.html
command = "\""+executable+"\" -q -V -C \""+configuration+"\" p atmega328p -c arduino -P "+self.portsCmb.currentText()+" -b 57600 -D -U
flash:w:\""+hexadecimal+"\":i"
logger.debug("avrdude call: "+command)
self.program.start(command)
self.program.finished.connect(self.programFinished)
@pyqtSlot()
def programFinished(self):
output = str(self.program.readAllStandardError())
if output.find("flash written") == -1: # avrdude: xxxx bytes
of flash written
if output.find("Expected signature") != -1: # avrdude:
Expected signature for ATMEGA328P is 1E 95 0F
error = u"La placa conectada no tiene un chip
compatible."
elif output.find("not in sync: resp=0x00") != -1: #
avrdude: stk500_getsync(): not in sync: resp=0x00
error = u"No parece que haya ninguna placa conectada
al puerto."
elif output.find("ser_send()") != -1: # ser_send(): write
error: sorry no info avail
error = u"Se produjo un error durante la comunicación
con la placa.\nAsegúrate de que está correctamente conectada."
elif output.find("ser_open()") != -1: # ser_open(): ....
error = u"El puerto no se pudo abrir.\nAsegúrate de
que ningún programa lo está usando."
else:
error = u"Se produjo un error al programar la
placa.\nComprueba el conexionado."
logger.warning("avrdude output: "+output)
logger.warning("An error ocurred: "+error)
QMessageBox.warning(self, u"¡Atención!", error)
else:
logger.debug("Programmed successfully")
self.updatePorts(True)
Página 120
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
self.connectBtn.setEnabled(True)
self.programBtn.setEnabled(True)
self.connectBtn.setFocus()
self.stackedWidget.setCurrentIndex(0)
def getBoard(self):
return self.board
Página 121
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.11. Código para crear instalador: setup.py
# http://cx_freeze.readthedocs.org/en/latest/distutils.html#distutils
import sys, os
from cx_Freeze import setup, Executable
base = None
targetName = "platex"
includes = []
if sys.platform == "win32":
base = "Win32GUI"
targetName = "platex.exe"
includes.extend(['numpy.core.multiarray', 'serial.win32'])
Platex_Target = Executable( script = "platex.pyw",
initScript = None,
base = base,
targetName = targetName,
compress = True,
copyDependentFiles = True,
appendScriptToExe = False,
appendScriptToLibrary = False,
shortcutName = "Platex",
shortcutDir = "ProgramMenuFolder")
include_files = ['avrdude/']
build_exe_options = {"packages": [],
"includes": includes,
"excludes": [],
"include_files": include_files}
setup(
name = "Platex",
version = "0.1",
description = "Control Arduino from your computer",
options = {"build_exe": build_exe_options},
executables = [Platex_Target])
Página 122
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.12. Script de compilación para Linux: buildlinux.sh
#!/bin/bash
asterisks ()
{
echo "*********************************************"
}
header ()
{
echo
asterisks
echo "$1"
asterisks
echo
}
remove()
{
if [ -d $1 ]; then
rm -rf $1
fi
}
create()
{
if [ ! -d $1 ]; then
mkdir -p $1
fi
}
remove_and_create()
{
remove $1
create $1
}
copy()
{
echo "COPYING [$1] TO [$2]"
cp $1 $2
}
PYQWT=5.2.0
ARDUINO=1.0
PROJECT=Platex
Página 123
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
CXFREEZE=4.2.3
# Comprobar si tenemos permisos
if [ "$(id -u)" != "0" ]; then
echo "Uso: sudo $0"
exit 6
fi
#######
header \
"DO NOT RUN THIS SCRIPT ON A PRODUCTION COMPUTER
IT MAY END UP BREAKING THINGS
Press Ctrl+C to exit"
for i in {15..1}; do echo -ne "$i.." && sleep 1; done; echo
#######
#######
header "Creating build folder"
#######
remove_and_create build
cd build
#######
header "Installing libraries available in repositories"
#######
apt-get update
apt-get -y install git avrdude python-qt4 pyqt4-dev-tools python-pip
qt4-qmake g++ libqt4-dev python-sip-dev python-qt4-dev arduino-core alien rpm
pip install pyserial --upgrade
#######
header "Installing cx_Freeze $CXFREEZE"
#######
wget
--trust-server-name
http://prdownloads.sourceforge.net/cxfreeze/cx_Freeze-$CXFREEZE.tar.gz || exit 1
tar -zxvf cx_Freeze-$CXFREEZE.tar.gz
pushd cx_Freeze-$CXFREEZE
python setup.py install
popd
#######
header "Installing PyQwt $PYQWT"
#######
wget
--trust-server-name
http://prdownloads.sourceforge.net/pyqwt/PyQwt-$PYQWT.tar.gz || exit 1
tar -zxvf PyQwt-$PYQWT.tar.gz
Página 124
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
pushd PyQwt-$PYQWT/configure
python configure.py -Q
disable-numeric --disable-numpy
make
make install
popd
Anexos
../qwt-5.2
--qt4
--disable-numarray
--
#######
header "Downloading Arduino IDE $ARDUINO"
#######
wget http://arduino.googlecode.com/files/arduino-$ARDUINO-linux.tgz ||
exit 1
tar -zxvf arduino-$ARDUINO-linux.tgz
#######
header "Downloading and compiling $PROJECT source code"
#######
git clone https://github.com/chiva/$PROJECT.git
pushd $PROJECT
python mkpyqt.py -b -r
mkdir avrdude
pushd avrdude
cp `which avrdude` .
cp /etc/avrdude.conf .
popd
pushd firmware
pushd ${PROJECT}Firmata
make -f Makefile-linux
mv applet/${PROJECT}Firmata.hex ../../avrdude/
popd
popd
popd
#######
header "Creating distribution files"
#######
pushd $PROJECT
python setup.py bdist_rpm
pushd dist
alien -d $PROJECT-*.i386.rpm
popd
popd
#######
header "Cleaning workspace"
#######
Página 125
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
mv $PROJECT/dist ../$PROJECT-dist
cd ..
remove build
rm "$0"
#######
header "Done!"
#######
Página 126
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
9.13. Script de compilación para Mac: buildmac.sh
#!/bin/bash
asterisks ()
{
echo "*********************************************"
}
header ()
{
echo
asterisks
echo "$1"
asterisks
echo
}
remove()
{
if [ -d $1 ]; then
rm -rfv $1
fi
}
create()
{
if [ ! -d $1 ]; then
mkdir -p $1
fi
}
remove_and_create()
{
remove $1
create $1
}
copy()
{
echo "COPYING [$1] TO [$2]"
cp $1 $2
}
PROJECT=Platex
GCC=10.7-v2
GIT=1.7.8.3
Página 127
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
PYTHON=2.7.2
QT=4.7.4
SIP=4.13.2
PYQT=4.9.1
PYQWT=5.2.0
AVRDUDE=5.11.1
ARDUINO=1.0
CXFREEZE=4.2.3
#######
header \
"DO NOT RUN THIS SCRIPT ON A PRODUCTION COMPUTER
IT MAY END UP BREAKING THINGS
RUN WITH SUDO
Press Ctrl+C to exit"
for i in {15..1}; do echo -ne "$i.." && sleep 1; done; echo
#######
#######
header "Creating build folder"
#######
remove_and_create build
cd build
#######
header "Installing GCC $GCC"
#######
curl -fLO --retry 20 https://github.com/downloads/kennethreitz/osxgcc-installer/GCC-$GCC.pkg || exit 1
installer -pkg GCC-$GCC.pkg -target "/"
#######
header "Installing Git $GIT"
#######
curl -fO --retry 20 http://git-osx-installer.googlecode.com/files/git$GIT-intel-universal-snow-leopard.dmg || exit 1
hdiutil attach git-$GIT-intel-universal-snow-leopard.dmg
installer
-pkg
/Volumes/Git\
$GIT\
Snow\
Leopard\
Intel\
Universal/git-$GIT-intel-universal-snow-leopard.pkg -target "/"
hdiutil detach /Volumes/Git\ $GIT\ Snow\ Leopard\ Intel\ Universal
#######
header "Installing Python $PYTHON"
#######
Página 128
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
curl
-fO
--retry
20
http://python.org/ftp/python/$PYTHON/python$PYTHON-macosx10.6.dmg || exit 1
hdiutil attach python-$PYTHON-macosx10.6.dmg
installer -pkg /Volumes/Python\ $PYTHON/Python.mpkg -target "/"
hdiutil detach /Volumes/Python\ $PYTHON/
PATH="/Library/Frameworks/Python.framework/Versions/Current/bin:${PATH
}"
export PATH
#######
header "Installing Qt $QT"
#######
curl
-fO
--retry
20
http://get.qt.nokia.com/qt/source/qt-macopensource-$QT.dmg || exit 1
hdiutil attach qt-mac-opensource-$QT.dmg
installer -pkg /Volumes/Qt\ $QT/Qt.mpkg -target "/"
hdiutil detach /Volumes/Qt\ $QT
#######
header "Installing SIP $SIP"
#######
curl
-fO
--retry
http://www.riverbankcomputing.co.uk/static/Downloads/sip4/sip-$SIP.tar.gz
exit 1
tar -zxvf sip-$SIP.tar.gz
pushd sip-$SIP
python configure.py
make
make install
popd
20
||
#######
header "Installing PyQt $PYQT"
#######
curl
-fO
--retry
http://www.riverbankcomputing.co.uk/static/Downloads/PyQt4/PyQt-mac-gpl$PYQT.tar.gz || exit 1
tar -zxvf PyQt-mac-gpl-$PYQT.tar.gz
pushd PyQt-mac-gpl-$PYQT
echo "yes" | python configure.py
make
make install
popd
20
#######
header "Installing PyQwt $PYQWT"
#######
Página 129
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
MIN_PYQWT=`echo "$PYQWT" | cut -d. -f 1-2`
curl -fLO --retry 20 http://prdownloads.sourceforge.net/pyqwt/PyQwt$PYQWT.tar.gz || exit 1
ln /usr/bin/qmake /bin/qmake
tar -zxvf PyQwt-$PYQWT.tar.gz
pushd PyQwt-$PYQWT/configure
python configure.py -Q ../qwt-$MIN_PYQWT --qt4 --disable-numarray
--disable-numeric --disable-numpy
make
make install
popd
#######
header "Installing pySerial"
#######
easy_install pip
pip install pyserial
#######
header "Installing cx_Freeze $CXFREEZE"
#######
curl
-fLO
--retry
20
http://prdownloads.sourceforge.net/cxfreeze/cx_Freeze-$CXFREEZE.tar.gz || exit 1
tar -zxvf cx_Freeze-$CXFREEZE.tar.gz
pushd cx_Freeze-$CXFREEZE
python setup.py install
popd
#######
header "Installing avrdude $AVRDUDE"
#######
curl
-fLO
--retry
http://download.savannah.gnu.org/releases/avrdude/avrdude-$AVRDUDE.tar.gz
exit 1
tar -zxvf avrdude-$AVRDUDE.tar.gz
pushd avrdude-$AVRDUDE
./configure
make
make install
popd
20
||
#######
header "Downloading Arduino IDE $ARDUINO"
#######
Página 130
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
curl
-fO
--retry
20
http://arduino.googlecode.com/files/arduino$ARDUINO-macosx.zip || exit 1
unzip arduino-$ARDUINO-macosx.zip
#######
header "Downloading and compiling $PROJECT source code"
#######
git clone https://github.com/chiva/$PROJECT.git
pushd $PROJECT
python mkpyqt.py -b -r
mkdir avrdude
pushd avrdude
cp `which avrdude` .
cp /usr/local/etc/avrdude.conf .
popd
pushd firmware
pushd ${PROJECT}Firmata
make -f Makefile-mac
mv applet/${PROJECT}Firmata.hex ../../avrdude/
popd
popd
popd
#######
header "Creating distribution files"
#######
pushd $PROJECT
python setup.py bdist_dmg
popd
#######
header "Cleaning workspace"
#######
mv $PROJECT/dist ../$PROJECT-dist
cd ..
remove build
rm "$0"
#######
header "Done!"
#######
Página 131
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
10. Anexo ÍÍ: Ínstalacion del
dispositivo USB
Al ser el medio de comunicación escogido a través del Arduino y el ordenador,
el puerto serie emulado a través de USB, puede que debamos instalar los drivers
adecuados para que el sistema operativo reconozca este periférico y se pueda utilizar
con el proyecto.
En las plataformas Linux y Mac OS X se instalarán los drivers automáticamente
pasados unos segundos tras conectar la placa, por lo que no hay que realizar ninguna
acción más.
En Linux el puerto serie aparecerá listado como ‘ttyACMxx’, mientras que en
Mac OS X aparecerá como ‘tty.usbserialxxxx’.
Si por el contrario, se desea trabajar bajo una plataforma Windows, se
requieren realizar unos pasos adicionales.
El primer paso es descargar el software de Arduino, que trae consigo los
controladores necesarios para la correcta identificación de la placa por el sistema
operativo. Se puede obtener de la sección ‘Downloads’ de la página oficial de Arduino
(www.arduino.cc), archivo que deberá descomprimirse para permitir el acceso a su
contenido.
Al realizar la conexión de la placa de interfaz Arduino al ordenador por primera
vez, aparecerá el siguiente aviso en la barra de tareas, indicando que se están
buscando los drivers adecuados.
Ilustración 35 | Nuevo hardware encontrado
Página 132
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Transcurridos unos segundos, nos aparecerá una nueva ventana para
seleccionar la localización driver manualmente, ya que el asistente no pudo
encontrarlos por si mismo. Hacemos clic en 'Buscar software de controlador en el
equipo' para continuar con el proceso de instalación.
Ilustración 36 | Selección de método de búsqueda alternativa
Le indicamos la ubicación donde están los drivers de Arduino, que será la
carpeta 'drivers' dentro de la carpeta del software de Arduino que nos hemos
descargado anteriormente. Es importante que la opción de buscar en subcarpetas esté
activada. Hacemos clic en 'Siguiente' para que inicie la búsqueda.
Página 133
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 37 | Ubicación donde buscar los controladores
El asistente comprobará si existen los drivers adecuados para el Arduino dentro
de las carpetas indicadas.
Página 134
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 38 | Instalando los controladores
Puede que durante el proceso se te pida autorizar a Windows el instalar unos
drivers no firmados, selecciona la segunda opción para poder continuar con la
instalación. Este aviso solo sale con las placas de la última generación, por lo que es
posible que no te aparezca.
Ilustración 39 | Los controladores no están firmados
La placa Arduino ya está lista para ser usada con Platex.
Página 135
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 40 | El controlador se instaló correctamente
El puerto serie aparecerá listado como cualquier otro, siguiendo la
nomenclatura de ‘COMxx’.
Página 136
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
11. Anexo ÍÍÍ: Manual de usuario
de Platex
11.1. Instalación
Debido a que los usuarios a los que va dirigidos el proyecto, probablemente no
dispongan de conocimientos avanzados sobre Python, sus librerías y la compatibilidad
con los principales sistemas operativos, se ha decidido crear una serie de instaladores
para la mayoría de los sistemas operativos que un usuario normal use.
El instalador posee los ficheros del proyecto, las librerías de las que éste hace
uso y el intérprete de Python sobre el que se haya creado el instalador, por lo que para
el usuario, no tiene diferencia alguna la instalación de este software a otros muchos de
los que hayan pasado por sus manos, dejando todo listo para su uso y sin requisitos
previos de software algunos.
11.1.1. Microsoft Windows
El desarrollo del programa fue realizado sobre este sistema operativo,
concretamente sobre Windows 7, por lo que es el que se recomienda para disfrutar de
la mejor experiencia de usuario posible. La compatibilidad del programa sobre
Windows XP también fue tenida en cuenta, añadiendo los ficheros necesarios para la
correcta ejecución del proyecto sobre dicho sistema operativo.
El instalador disponible para la plataforma Windows es compatible tanto con
XP, como con Vista y 7 (y probablemente con las siguientes versiones mientras se
mantenga la interfaz).
Al abrir el instalador, tras configurarse, nos mostrará la ruta por defecto para la
instalación. Se aconseja dejar esta ruta por defecto. La instalación requiere de
permisos de administrador, para realizar las modificaciones necesarias al sistema.
Página 137
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 41 | Ruta de instalación por defecto
Una vez iniciada la instalación, nos aparecerá la ventana pidiendo permisos de
administrador para continuar con la instalación.
Ilustración 42 | Aviso de modificación del equipo
Una vez finalizada la instalación y cerrado el asistente, podremos entrar a la
aplicación a través del acceso directo creado en el menú de inicio.
Página 138
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
11.1.2. Linux Ubuntu
Las pruebas de compatibilidad y el paquete de instalación fueron creados sobre
Linux Ubuntu 11.10, asegurando, como mínimo, la completa funcionalidad del
proyecto bajo esta versión. Aunque según las pruebas realizadas también se puede
realizar la instalación en Linux Ubuntu 12.04 sin problema alguno.
También se han incluido los paquetes de instalación para otras distribuciones,
aunque no se garantiza su funcionamiento debido a la gran diversidad de
configuraciones que pueden existir.
Para instalar el proyecto en Linux Ubuntu 11.10, se deberá utilizar el paquete
de instalación con la extensión de archivo ‘.deb’. Una vez se disponga de este archivo
en el sistema, se ejecutará haciendo doble clic sobre él, abriendo el ‘Centro de
Software de Ubuntu’ que asistirá la instalación.
Ilustración 43 | Centro de Software de Ubuntu
Para iniciar la instalación se pinchará sobre ‘Instalar’, que ejecutará la
instalación del paquete en segundo plano.
Antes de iniciar la instalación se nos requerirá dar permisos de administrador,
para que así el instalador pueda realizar todas las tareas satisfactoriamente.
Página 139
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 44 | Se proporcionan los permisos de administrador
Una vez se haya instalado correctamente el software, se nos darán las
instrucciones de como ejecutar el programa instalado.
Ilustración 45 | Instalación finalizada correctamente
Como se puede observar, se debe ejecutar ‘platex’ en la terminal de Ubuntu.
Si al ejecutar el programa nos aparece una ventana de error, que nos avisa de
que ha sido imposible abrir el puerto serie, significa que no tenemos los permisos
suficientes par ello, por lo que deberemos añadir nuestro usuario al grupo adecuado
para poder realizar esta operación.
Página 140
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 46 | Permisos insuficientes
Para solucionar este problema se deberá ejecutar en una terminal:
$ usermod –a –G dialout USUARIO
Donde USUARIO es el nombre del usuario con el que se haya iniciado sesión en
el sistema. Para que se hagan efectivos los cambios, se deberá cerrar la sesión y volver
a entrar.
11.1.3. Mac OS X
Durante el desarrollo del proyecto, la compatibilidad de la librería encargada de
realizar el empaquetamiento e instalador no estaba completada, por lo que ha sido
imposible realizar el paquete de instalación de este proyecto para la plataforma Mac.
Una vez se solucione este problema, la instalación se realizará de la misma
forma que cualquier otra aplicación.
Como solución para correr el software bajo este sistema operativo, se deberá
realizar con la ayuda del script de compilación del proyecto para Mac, que aunque está
preparado para no interferir con el normal funcionamiento del ordenador en su uso
diario, no es recomendable realizarlo sin conocimiento del funcionamiento. La guía
para la utilización de este script viene adjuntada en el siguiente anexo.
Página 141
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
11.2. Ventana inicial
El resto del manual de uso, al ser un programa multiplataforma que se muestra
y funciona de forma similar en todas ellas, sólo se realizará la explicación en una de
ellas. En esta explicación se utilizará la ejecución en Windows, al haber sido la
plataforma donde se ha realizado la mayor parte del desarrollo.
Al ejecutar el programa se nos mostrará una ventana con la que podemos
realizar varias operaciones.
Ilustración 47 | Ventana inicial
Primero deberemos seleccionar el puerto serie al que está conectada la placa
Arduino que se desea utilizar con el programa. Si todavía no está conectada, se puede
realizar la conexión y luego repetir la búsqueda de puertos serie activos desplegando la
lista y seleccionando Actualizar. Si no aparece la placa en la lista, se deberá comprobar
que los drivers estén correctamente instalados y el puerto serie aparezca en los
recursos del sistema.
Una vez seleccionado el puerto serie, podemos realizar tres operaciones:

Conectar: se inicia la comunicación con la placa que se haya indicado y si
está con el firmware adecuado y no hay problemas de comunicación, se
podrá empezar a usar el programa en todo su potencial.

Programar: las placas Arduino son reprogramables, por lo que no siempre
tendrán el firmware adecuado para realizar la comunicación con el
software. Por ello se da la opción de descargar el firmware adecuado a la
placa con un único clic de ratón.
Página 142
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva

Anexos
Salir: se cierra el programa, para esta opción no es necesario tener
seleccionado un puerto serie.
Para poder acceder a la ventana principal del programa deberemos
conectarnos a la placa una vez tenga el firmware adecuado.
11.3. Ventana principal
En la ventana principal del programa podremos ver los distintos módulos de los
que se compone éste. Cada módulo corresponde a una pestaña y en el momento de la
realización de este documento, existen los siete siguientes:

Configuración

Digital

Analógico

PWM

Servo

Motores

Secuenciador
El programa se abrirá por defecto con el módulo de configuración en primer
plano, ya que no es posible realizar ninguna acción sin primero configurar alguno de
los pines.
A continuación se explicarán el motivo por el que se han incluido y su
funcionamiento.
Página 143
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
11.3.1. Configuración
Este módulo nos muestra una representación del Arduino en pantalla,
pudiendo seleccionar individualmente en cada pin de la placa el modo en el que
queremos hacerlo funcionar. Cada modo tiene un color asignado, que facilitará la
comprobación del modo seleccionado por el usuario.
Ilustración 48 | Módulo de configuración
Existen los siguientes modos de funcionamiento:

None: el pin no tiene ninguna función, se configura como entrada y se
desactivan las resistencias internas de pull-up.

Input: el pin se utilizará para realizar lecturas digitales (1 ó 0).

Output: el pin se utilizará como salida con niveles lógicos (1 ó 0). Bajo este
modo se podrá hacer también control de servomotores de radiocontrol.
Página 144
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos

PWM: el pin se utilizará como salida de ancho de pulso modulado, útil para
reguladores, dimmers y otros elementos que necesiten una forma de
control más precisa que el todo o nada de la lógica digital.

Analógico: el pin se utilizará como entrada analógica con una resolución de
lectura de 10 bits.
Para cambiar el modo de un pin se deberá pinchar sobre el que queremos
realizar la operación, desplegándose una lista con todos los posibles modos de
funcionamiento compatibles con el pin seleccionado, para realizar el cambio sólo se
deberá seleccionar de entre los modos disponibles. Los cambios de modo realizados
son aplicados instantáneamente tras realizar la selección.
Ilustración 49 | Lista de modos
Ilustración 50 | Algunos pines configurados
Los pines analógicos también pueden ser usados tanto como entradas como salidas
digitales, por lo que se ha dado la opción de configurarlos como tales en el software.
Página 145
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Los pines 0 y 1 no están disponibles para su uso ya que se utilizan para realizar
la comunicación entre el software y la propia placa, son los encargados de realizar la
comunicación por el puerto serie.
11.3.2. Digital
Este módulo también muestra la representación de un Arduino en pantalla y
sólo se muestran los pines que se hayan configurado anteriormente como entrada o
salidas.
Ilustración 51 | Módulo digital
Las entradas vienen designadas por un círculo verde oscuro encima del pin,
intentando asemejarse a un led verde, y de color más claro al detectar un nivel alto en
él.
Las salidas se muestran como un cuadrado, similar a los existentes en el
módulo de configuración, de un color azul grisáceo cuando la salida esté desactivada y
Página 146
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
un amarillo dorado cuando se haya activado. Para cambiar de estado la salida sólo hay
que pinchar con el ratón encima de él.
Ilustración 52 | Estado de activación
Si la entrada parpadea rápidamente, probablemente signifique que el pin
correspondiente esta al aire leyendo ruido, sin ninguna tensión aplicada.
11.3.3. Analógico
La finalidad de éste módulo es la de mostrar la tensión existente en los pines
analógicos que se hayan configurado como tales.
Página 147
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 53 | Módulo analógico
El valor de la tensión analógica en el pin se muestra en forma de texto y
gráficamente en forma de barra, de forma individual de cada pin. También se muestra
en una gráfica a través del tiempo de forma que se puede ver la evolución de la
tensión. Esta gráfica es común a todos los pines, por lo que se puede realizar
comparaciones de tensiones de forma sencilla y rápida y mediante los selectores en
cada uno de los pines, se puede indicar si se desea o no que se grafique la tensión de
dicho pin en la gráfica general. Cada pin analógico tiene asignado un color, por lo que
es fácil relacionar el pin con la tensión que se dibuja en la gráfica común a todos ellos.
Página 148
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 54 | Traza analógica oculta
Hay que tener en cuenta que el voltaje se muestra mediante una simple regla
de 3 desde el valor en cuentas, es decir, de 0 a 1023 se convierte de 0 a 5V. Esto
técnica de conversión, aunque sencilla, tiene un problema, ya que las cuentas son el
valor del voltaje con respecto a la tensión de alimentación, por lo que una lectura de
1023, no es la misma a 3V que a 5V, representando 3V y 5V respectivamente. En el
software se ha supuesto que se utiliza el Arduino tal y como es recomendado, a 5V,
aunque pueden existir pequeñas desviaciones de la tensión del orden de unos pocos
cientos de milivoltios, que se suman a los errores de conversión de los ADC del
Arduino.
11.3.4. PWM
Con este módulo podremos sacar una señal de PWM en los pines que tengan
capacidad para ello, los cuales tienen el texto PWM junto a ellos en el módulo de
configuración.
Página 149
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Los deslizadores solo se activarán si el pin correspondiente está configurado
como PWM y permiten modificar el ancho de pulso tanto en porcentaje (0÷100%)
como en cuentas de 8 bits (0÷256). Siendo el 0% una salida continua a nivel bajo y al
100% una salida a nivel alto, que en este caso serían los 5V de alimentación.
Ilustración 55 | Módulo PWM
11.3.5. Servo
Este módulo está creado para controlar la posición de servomotores de hobby,
que pueden ser controlados para moverse a una determinada posición en grados de 0°
a 180°.
Página 150
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 56 | Servomotor de hobby
Se pueden controlar hasta un máximo de seis servos simultáneamente,
pudiendo activarse, desactivarse y cambiar la asignación de pines en cualquier
momento.
Ilustración 57 | Módulo servos
Página 151
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
En la lista podremos seleccionar uno de los pines que estén configurados como
entradas (Input) y al seleccionar Activar se configurará en modo servo, por lo que
estará listo para controlar dichos motores.
Ilustración 58 | Activación de servos
El ángulo de giro de los servos puede ser controlado tanto con la barra
deslizadora como introduciendo manualmente el valor en grados en la caja numérica.
Se han incluido botones para devolver al origen los motores tanto individualmente
como de forma general a todos ellos.
Si se desea volver a utilizar ese pin para otras funciones, se deberá desmarcar la
casilla de Activar, volviendo a configurarse el pin como entrada, listo para poder ser
usado en otros módulos.
11.3.6. Motores
Con este módulo se podrá realizar el control de motores de continua, tanto
pequeños como grandes; la limitación vendrá dada por el hardware, en concreto, por
el límite tanto de tensión como de intensidad del driver de motores utilizado.
Página 152
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 59 | Módulo motores
Por defecto se incluyen la configuración para las shields de control de motores
oficiales de Arduino, que son la Motor Shield 3.0 y la Motor Shield R3. La shield de
Sparkfun Ardumoto, que aunque no es oficial, es compatible con la configuración de la
Motor Shield R3, ya que está diseñada con el mismo hardware y la misma asignación
de pines.
Página 153
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 60 | Motor Shield 3.0
Ilustración 61 | Motor Shield R3
Tabla 20 | Asignación de pines
Motor Shield 3.0
Motor Shield R3
Canal A
Canal B
Canal A
Canal B
Dirección
12
13
12
13
Velocidad
10
11
3
11
También se incluye la posibilidad de definir manualmente los pines en el modo
Personalizado para poder utilizar placas creadas por otros fabricantes o por el mismo
usuario. El control está pensado para los drivers L293D y L298 de Texas Instruments,
pero también podría utilizarse con otros drivers de otros fabricantes que tengan una
interfaz de control similar o con un puente en H discreto con la circuitería de interfaz
adecuada.
Para comenzar el control se deberá activar cada canal de la placa marcando la
casilla de Activar y para empezar a mover el motor, se podrá deslizar la barra a la
izquierda para moverlo en un sentido o hacia la derecha para moverlo en el contrario
(el control de sentido de giro se hace automáticamente). También se podrá realizar el
control introduciendo el valor en porcentaje de velocidad del motor de 0 a 100 y con el
signo adecuado para el sentido de giro que se desee. En este módulo también se han
incluido botones de paro tanto individuales para cada canal, como globales.
11.3.7. Secuenciador
Se podría decir que este es el módulo más complejo, completo y útil de todos
los incluidos hasta el momento, ya que contiene una parte de casi todos los módulos,
permitiendo además preparar una secuencia de pasos en los que se realizarán las
acciones indicadas por el usuario.
Página 154
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 62 | Módulo secuenciador
Debido al limitado espacio existente en pantalla, se han limitado las opciones
para que la usabilidad del mismo no se reduzca considerablemente.
Se han incluido en este módulo, seis salidas digitales, tres pines para controlar
servos y 3 salidas de PWM. Los pines a los que están asignados cada función son fijos y
no modificables, estando indicados por el número encima de cada control. Los
controles solo estarán activos si el pin al que están asignados está configurado de
forma que sea compatible con la función que desempeñan en este módulo.
La utilización de los controles es similar a la que se encuentra en cada uno de
los módulos por separado, por lo que no es necesaria repetir su explicación, siendo
más importante centrarse en los nuevos y específicos encontrados sólo en este
módulo.
Página 155
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 63 | Controles específicos
La primera caja numérica controla los pasos del secuenciador, los cambios que
se realicen en los controles se aplicarán al paso que aparezca en esta caja. Al cambiar
el número de paso se guardaran los valores de los controles y se cargarán los del paso
que se haya elegido. Por defecto se inicia con un solo paso y se podrán añadir más
como se explica más adelante.
En la segunda caja, se podrá indicar el tiempo en milisegundos durante que
estará activo el paso actual. Se puede introducir los valores manualmente o usando las
flechas en el borde derecho y puede tomar valores desde 1 ms a 10000 ms (10
segundos).
Los botones con los símbolos + y – sirven para añadir un paso a continuación
del actual o para eliminar el paso actual, respectivamente.
El botón Iniciar, comenzará con la ejecución en secuencia de los pasos,
realizando las acciones que se hayan indicado en cada uno de ellos y durante el tiempo
establecido. Una vez iniciada la secuencia no es posible pararla ni realizar ninguna otra
acción en el programa, hasta que no se haya finalizado el último paso.
Página 156
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
12. Anexo ÍV: Compilacion y
distribucion del software
Al estar todo el software del proyecto licenciado bajo GPL, el acceso y la
redistribución del código fuente de este proyecto es libre, por lo que no sería extraño
que se diera el caso de que una persona necesitara rehacer el instalador desde el
código fuente tras haber realizado una serie de cambios, ya sea para mejorar, adaptar
o cualquier otra razón. Para ello se indicarán los pasos a realizar en cada plataforma
con los que pasar del código fuente al instalador, listo para distribuir e instalar de
manera sencilla para el usuario final.
El código fuente al completo puede encontrarse en el CD que acompaña este
documento, aunque las herramientas de creación del instalador están preparadas para
obtenerlo desde la copia que se mantiene actualizada en un servidor de control de
versiones: https://github.com/chiva/Platex
12.1. Windows
Debido al bajo número de herramientas de automatización de tareas existentes
o su alta dificultad de uso o poca difusión, se ha optado por realizar una parte de ella
manualmente.
La primera tarea a realizar será instalar una versión del intérprete de Python, el
proyecto se ha desarrollado usando la versión 2.7.2, por lo que es la que se
recomienda instalar, también hay una alta probabilidad de que sea compatible con las
siguientes revisiones de esta versión, tales como 2.7.3 (que ya está lanzada y es
compatible), la futura 2.7.4, etc. mientras que la subversión siga siendo la 2.7. Como
también se deben instalar otras librerías necesarias para el proyecto y existe un
instalador de Python enfocado desarrollo por científicos e ingenieros con una gran
cantidad de librerías numéricas y análisis y visualización de datos llamada Python(x,y),
se recomienda el uso de esta, ya que contiene todas las librerías que se necesitarán y
permite instalarlas de una manera sencilla y cómoda, evitando así realizar compilación
Página 157
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
alguna. Para ello se realizará la descarga del paquete de instalación desde la sección de
descargas de su página web.
Una vez descargado el paquete se procederá a su instalación siguiendo el
asistente, cuando se alcance la sección de selección de componentes se deberán
seleccionar como mínimo los siguientes:

Python 2.7.X

Python
o PyQt
o PyQwt
o PySerial
Obtener el código fuente, del CD que acompaña a este documento
(probablemente no sea la última versión existente a la fecha de lectura de este
documento), del repositorio (puede contener código inestable) o de la sección de
descargas de la página del proyecto (recomendado, sería descargar el fichero con
extensión .tar.gz). Este paso no sería necesario si ya se tiene o se han realizado
modificaciones a éste.
Seguidamente se procederá a convertir los ficheros de Qt a PyQt, ejecutando
en una terminal de comandos dentro de la carpeta del código fuente:
> mkpyqt.py -b -r
Se realizará la descarga del paquete de software de Arduino, que se encuentra
en la sección de descargas de su página oficial. Una vez descargado se descomprimirá
para poder acceder a su contenido. Este paquete de software nos permitirá realizar la
compilación del firmware de Firmata, para poder luego descargarlo en una placa
Arduino con el programador que lleva incorporado.
Se deberá crear una carpeta nueva llamada avrdude, donde se copiarán los
ficheros avrdude.exe y avrdude.conf, existentes en la descarga de Arduino que hemos
descargado anteriormente. Para aumentar la fiabilidad del programador (avrdude) en
Página 158
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
todos los ordenadores y hacerlo compatible con Windows XP, se deberá añadir
también el fichero libusb0.dll, también existente en la descarga de Arduino.
Para crear el firmware de la placa Arduino es necesario compilarlo desde el
software, por lo que abriremos el fichero firmware/PlatexFirmata/PlatexFIrmata.ino,
existente en la carpeta del código fuente. Arduino almacena los programas compilados
en una carpeta temporal, por lo que se deberá conocer su localización, para ello se
activará la salida del compilador en la ventana de depuración. Esta opción se activa en
la ventana de preferencias, accesible en el menú de herramientas Archivo>Preferencias.
Ilustración 64 | Activar salida del compilador
Ahora se compilará el código pulsando el botón de verificar.
Ilustración 65 | Botón de verificar código
Una vez terminada la compilación, aparecerá la localización del fichero .hex en
la parte inferior del programa. Hay que tener en cuenta que es posible que la ruta pase
por carpetas ocultas, por lo que se deberá activar la visibilidad de éstas en la
configuración de Windows.
Página 159
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 66 | Localización del firmware
El archivo PlatexFirmata.cpp.hex resultante, se deberá copiar en la carpeta
avrdude con nombre PlatexFirmata.hex.
Finalmente se creará el instalador:
> python setup.py bdist_rpm
Una vez finalizado el proceso, dentro de la carpeta del código fuente, aparecerá
una nueva carpeta llamada dist, donde estará el instalador con extensión .msi listo
para usar y distribuir.
12.2. Linux
La creación del instalador en Linux está totalmente automatizada, por lo que
para iniciar la creación del instalador sólo es necesario ejecutar la siguiente línea en
una terminal:
$ sudo bash -c "wget https://raw.github.com/gist/1427486/buildlinux.sh && bash build-linux.sh"
Página 160
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 67 | Comando en una terminal de Linux Ubuntu
Durante el proceso, se va mostrando la salida de los comandos que se van
ejecutando, apareciendo al finalizar la tarea Done!, cuando aparecerá la carpeta
Platex-dist, donde dentro de ella aparecerán los instaladores .deb y .rpm para los
distintas distribuciones de Linux. Hay que tener en cuenta que las librerías cambian de
una distribución Linux a otra, es probable que el instalador no sea compatible, por lo
que habría que crearlo en la propia distribución sobre la que se va a usar para asegurar
totalmente su compatibilidad.
El script se va actualizando para mantener al día las versiones de los paquetes a
descargar, ya que las versiones antiguas se suelen borrar y no son accesibles para la
descarga y suelen aparecer nuevas versiones con cierta asiduidad, por lo que es
posible que el script falle al descargar alguna de las librerías, debiendo fijarse en cual
ha sido y comprobar la versión que se ha intentado bajar con la que aparece en la
página oficial de la librería, si es distinta se deberá actualizar el script con dicha versión
en las definiciones al principio de éste y ejecutando de nuevo el script como se indica a
más adelante.
El comando anterior, sirve para realizar el instalador con el código original, si se
desea crear el instalador con un código que haya sido modificado por otra persona, se
deberá descargar manualmente el archivo build-linux.sh y modificar las rutas para
tomar la que se desea. Una vez realizado esto se ejecutará el script:
$ sudo bash build-linux.sh
El proceso que realiza el script de creación del instalador es el siguiente:

Se crea la carpeta temporal build donde guardar los ficheros necesarios en
el proceso.
Página 161
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos

Se instalan y actualizan las librerías existentes en los repositorios.

Se descargan, compilan e instalan las librerías no existentes en los
repositorios.

Se descargar el IDE de Arduino.

Se compila el firmware para la placa Arduino.

Se descarga y compila el código fuente del proyecto.

Se crean los archivos de distribución (instaladores).

Se borra la carpeta temporal y el propio script.
El script de creación del instalador se recomienda ejecutarlo en un entorno de
desarrollo para evitar problemas tanto cara al script como para el usuario al modificar
e instalar nuevos paquetes de software. De todas maneras, el script está pensado para
minimizar su impacto, manteniendo la configuración del entorno intacta.
12.3. Mac OS
El script para crear el instalador en Mac OS es muy similar al de Linux, debido a
su similar naturaleza, aunque como es lógico difiere bastante en algunos puntos.
La creación del script en Mac OS también está completamente automatizada,
por lo que para iniciar la creación del instalador sólo es necesario ejecutar la siguiente
línea en una terminal:
$ sudo bash -c "curl -O
https://raw.github.com/gist/1427486/build-mac.sh && bash buildmac.sh"
Página 162
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
Ilustración 68 | Comando en una terminal de Mac OS X Lion
Durante el proceso, se va mostrando la salida de los comandos que se van
ejecutando, apareciendo al finalizar la tarea Done!, cuando aparecerá la carpeta
Platex-dist, donde dentro de ella aparecerá el instalador .dmg. El script sólo está
preparado para crear instaladores para ordenadores Mac con arquitectura Intel.
La compatibilidad del instalador con las distintas versiones de Mac es probable
que sea alta, ya que el instalador contiene dentro de él todas las librerías que necesita
el software para funcionar, dependiendo de la compatibilidad de las propias librerías.
El script se va actualizando para mantener al día las versiones de los paquetes a
descargar, ya que las versiones antiguas se suelen borrar y no son accesibles para la
descarga y suelen aparecer nuevas versiones con cierta asiduidad, por lo que es
posible que el script falle al descargar alguna de las librerías, debiendo fijarse en cual
ha sido y comprobar la versión que se ha intentado bajar con la que aparece en la
página oficial de la librería, si es distinta se deberá actualizar el script con dicha versión
en las definiciones al principio de éste y ejecutando de nuevo el script como se indica a
más adelante.
El comando anterior, sirve para realizar el instalador con el código original, si se
desea crear el instalador con un código que haya sido modificado por otra persona, se
deberá descargar manualmente el archivo build-mac.sh y modificar las rutas para
tomar la que se desea. Una vez realizado esto se ejecutará el script:
$ sudo bash build-mac.sh
En el momento de la realización del documento, la compatibilidad del software
de creación del instalador con Mac OS estaba rota, por lo que el último paso de
creación del script dará error, pero se ha dejado para que cuando se solucione el
Página 163
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Anexos
problema funcione de manera correcta. Aunque el script falle en ese punto se podrá
ejecutar el programa, ya que todas las librerías están ya instaladas, para ello y para
ejecutar el programa desde la línea de comandos, habrá que ejecutar la siguiente línea
dentro de la carpeta build/Platex que existirá en la carpeta donde ejecutaste el
script:
$
/Library/Frameworks/Python.framework/Versions/Current/bin/python
platex.pyw
El proceso que realiza el script de creación del instalador es el siguiente:

Se crea la carpeta temporal build donde guardar los ficheros necesarios
en el proceso.

Se descargan, compilan e instalan las librerías no existentes en los
repositorios.

Se descargar el IDE de Arduino.

Se compila el firmware para la placa Arduino.

Se descarga y compila el código fuente del proyecto.

Se crean los archivos de distribución (instaladores).

Se borra la carpeta temporal y el propio script.
Página 164
PLIEGO DE CONDICIONES
DOCUMENTO Nº 3
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
Índice del pliego de condiciones
13.
Introducción al pliego de condiciones .................................................... 169
14.
Condiciones generales ............................................................................ 169
15.
Normas, leyes y reglamentos ................................................................. 170
16.
Condiciones facultativas ......................................................................... 172
16.1.
Dirección ............................................................................................. 172
16.2.
Libro de órdenes ................................................................................. 173
17.
Condiciones de ejecución y montaje ...................................................... 173
17.1.
Condiciones de fabricación del circuito impreso ................................ 173
17.2.
Pruebas y ensayos del montaje de la placa ........................................ 173
17.2.1. Prueba de alimentación ................................................................. 174
17.2.2. Prueba de la placa .......................................................................... 174
17.2.3. Conexionado de los circuitos ......................................................... 175
17.3.
Instalación y uso de las aplicaciones .................................................. 175
17.4.
Conservación....................................................................................... 176
17.5.
Funcionamiento normal del equipo ................................................... 176
18.
Condiciones de materiales y equipo ...................................................... 176
18.1.
Condiciones técnicas de los materiales .............................................. 176
18.2.
Condiciones técnicas del material informático .................................. 177
Página 166
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
18.3.
Condiciones técnicas de los circuitos impresos .................................. 178
18.4.
Condiciones técnicas de los elementos pasivos ................................. 179
19.
Condiciones económicas ........................................................................ 179
19.1.
Errores en el proyecto ........................................................................ 179
19.2.
Jornadas y salarios .............................................................................. 179
19.3.
Liquidación .......................................................................................... 180
20.
Disposición final ...................................................................................... 181
Página 167
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
Índice de ilustraciones
Ilustración 69 | Localización del ejemplo Blink ................................................ 175
Ilustración 70 | Led L ........................................................................................ 175
Página 168
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
13. Íntroduccion al pliego de
condiciones
Las características y la descripción del diseño del proyecto “Plataforma de
experimentación para prototipado de diseños mediante Arduino”, los componentes
que intervienen, el cableado y conexionado eléctrico y control del funcionamiento del
mismo se detallan en el documento de la memoria y en los correspondientes planos
del documento.
En este documento se exponen todas las condiciones técnicas de montaje,
especificaciones a cumplir por los elementos y materiales normalizados y comerciales
que se deben considerar a la hora de llevar a cabo la realización del proyecto.
En caso de no realizarse según las condiciones tal y como se presentan en este
documento, el proyectista no se responsabilizará de los posibles fallos y averías
propios del funcionamiento, repercutiéndose todo el peso del problema sobre terceras
personas.
Todas las modificaciones de las que pueda ser susceptible el proyecto, deberán
ser aprobadas por el ingeniero o proyectista.
14.
Condiciones generales
La realización del presente proyecto titulado “Plataforma de experimentación
para prototipado de diseños mediante Arduino”, se enmarca bajo la designación del
proyecto final de carrera, y tiene como propósito terminar con éxito los estudios de
Ingeniería Técnica Industrial en la especialidad de Electrónica.
El autor del proyecto ha cursado los estudios en la Universidad de La Rioja,
cumpliendo en su elaboración con las directrices especificadas por dicho centro, en la
normativa del proyecto de fin de carrera, aprobada por el Consejo de Gobierno el 15
de abril de 2005.
Página 169
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
Este proyecto se ajusta en su desarrollo a los reglamentos y disposiciones
electrónicas vigentes.
Atendiendo a esto, una vez se haya aprobado por el Ministerio de Industria,
tendrá carácter de obligado cumplimiento.
Una vez realizado el proyecto, se podrán realizar diversas modificaciones
siempre bajo la supervisión del ingeniero o proyectista.
En caso de efectuarse alguna modificación, el correspondiente proyecto
modificado se considera como parte integrante del proyecto definitivo y como tal,
sujeto a las condiciones y especificaciones citadas y aprobadas por el Ministerio.
La empresa adjudicataria suscribirá contrato ante notario donde se hará
constar, a parte de términos legales obligatorios, plazos de entrega y la conformidad
con la sanción cuyo incumplimiento pueda acarrear consigo.
15.
Normas, leyes y reglamentos
La realización del proyecto se regirá por la Ordenanza General de Seguridad e
Higiene en el Trabajo del 7 de abril de 1970 y posteriores revisiones.
Así mismo, se regirá por el Reglamento Electrotécnico de Baja Tensión, en el
que se tendrá en cuenta las siguientes normativas:

M.I. B.T.029, la cual se refiere a instalaciones de pequeñas tensiones,
menores de 50 voltios.

M.I. B.T.031, la cual se refiere a las condiciones generales de
instalación, de utilización, así como de los requisitos a cumplir a la hora
del diseño.
El proyecto cumple también con las siguientes normativas DIN y UNE:
Página 170
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones

Los materiales que pueden ser utilizados para la realización de placas de
circuito impreso UNE 20-621-85/3.

Los espesores de los materiales con recubrimiento metálico y sus
tolerancias especificadas en la norma UNE 20-621-84/3.

La norma UNE 20552 especifica las tolerancias sobre el espesor total en
la zona de contactos.

En cuanto a la anchura de las pistas, según la intensidad que circule por
el material conductor, se referirá a la norma UNE 20-621.

Los diámetros de los taladros están especificados en la norma UNE 20621-84/3.

La norma UNE 20-612/2 recoge varios tipos de ensayos que pueden
realizarse y los materiales, como pueden ser los ensayos de espesor,
adherencia, porosidad, etc.

En las distancias entre taladros para la colocación de componentes, se
seguirá lo indicado en la norma UNE 20-524/1, UNE 20-524/2 y UNE 20524/3.

Reglas de seguridad para los aparatos electrónicos de norma UNE 20514-82.

DIN 40801, referente a circuitos impresos, fundamentos, orificios y
espesores.

DIN 40803, referente a circuitos impresos, placas y documentación.

DIN 40804, referente a circuitos impresos, conceptos.

DIN41494, referente a las formas de construcción para dispositivos
electrónicos.
Página 171
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones

Reglas para el diseño y utilización de placas de circuito impresas UNE
20-621-3.

Especificación para la realización de placas de simple o doble cara con
agujeros no metalizados y metalizados UNE 20-621-4 y UNE 20-621-5.

Especificación para las placas impresas multicapas UNE 20-621-6.

UNE 20902 que hace referencia a la técnica de circuitos impresos,
terminología.

UNE-EN 60249 en la cual se citan los materiales base para circuitos
impresos.
Este proyecto debido a sus características se encuentra recogido dentro del
reglamento eléctrico de baja tensión.
“Se calificará como instalación eléctrica de baja tensión todo conjunto de
aparatos y circuitos asociados en previsión de un fin particular, producción,
conversión, transformación, distribución, o utilización de la energía eléctrica,
cuyas tensiones nominales sean iguales o inferiores a 1000 voltios para
corriente alterna y 1500 voltios para corrientes continuas.”
16.
Condiciones facultativas
16.1. Dirección
La dirección del montaje estará realizada en su totalidad por el ingeniero o
proyectista o por otra persona que ésta delegue atendiendo a la capacidad de dicha
persona para realizar este trabajo.
Una vez realizado el montaje, su utilización podrá ser realizada por cualquier
persona con conocimientos suficientes demostrables sobre el proyecto, la tecnología
Página 172
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
en él implicada y su funcionamiento. En caso de avería o pérdida de datos por
incorrecta utilización, el proyectista queda exento de culpa.
16.2. Libro de órdenes
El montaje de los elementos del proyecto se realizará atendiendo a los
documentos y planos del mismo.
Si es necesario realizar una modificación, se realizará bajo el pertinente
consentimiento del propio ingeniero o proyectista.
17. Condiciones de ejecucion y
montaje
17.1. Condiciones de fabricación del circuito
impreso
Si se decide por la fabricación de una placa de interfaz Arduino propia, a partir
de los diseños de referencia disponibles en la página web de Arduino, la fabricación del
circuito impreso deberá regirse por la norma UNE-621-80, en la cual se especifican los
ensayos a los que debe ser sometido el circuito impreso, así como los métodos para la
ejecución de dichos ensayos.
17.2. Pruebas y ensayos del montaje de la placa
Una vez montados todos los componentes y estén soldados correctamente a la
placa, se procederá a efectuar los siguientes ensayos:
Página 173
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
17.2.1. Prueba de alimentación
Para verificar el correcto funcionamiento de cada placa, se debe alimentar con
un transformador de 230V a 7÷12V o a través de los 5V del USB.
Se deberá comprobar que al conectar ambas tensiones no se produzca ningún
tipo de fallo tal y como un cortocircuito entre las alimentaciones.
Si se ha conectado la alimentación externa, se comprobará que en el pin
marcado como Vin, se tiene la misma tensión que la que saca el transformador.
Independientemente del modo en el que esté alimentado, deben aparecer 5V en el pin
marcado como 5V y 3,3V en el pin marcado como 3V3.
Las placas disponen de un LED de color verde el cual se ilumina cuando la placa
está siendo alimentada correctamente. Si este LED se desvanece lentamente al realizar
alguna conexión es el principal indicativo de que se está produciendo un cortocircuito
y el limitador de corriente está realizando su trabajo.
17.2.2. Prueba de la placa
Para realizar el ensayo de la puesta en marcha de la placa, se deberá utilizar el
IDE de Arduino.
Se hará uso del programa de ejemplo denominado “Blink” que hace parpadear
intermitentemente cada segundo el LED que la placa de interfaz tiene conectada al pin
13, que se puede identificar en la placa por estar marcado con una L. Este ejemplo es
el más simple de todos, ideal para asegurar que si se produce algún fallo sea de
hardware y no esté siendo enmascarado por un fallo de software.
Página 174
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
Ilustración 69 | Localización del ejemplo Blink
Ilustración 70 | Led L
Una vez probada la placa, puede ser probada con más
17.2.3. Conexionado de los circuitos
El conexionado de los circuitos que intervienen en el sistema se realiza
siguiendo las instrucciones provistas por el fabricante del hardware.
17.3. Instalación y uso de las aplicaciones
Para el correcto funcionamiento de todo el sistema, se debe instalar el
controlador de la placa de interfaz en el caso de que sea necesario para su
funcionamiento y la aplicación siguiendo las instrucciones que se encuentran en los
anexos.
Página 175
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
Para el manejo de la aplicación se puede consultar el Manual de Usuario, Anexo
IV y para la instalación de los controladores en el caso de que fuera necesario se puede
consultar el manual correspondiente en el Anexo III.
17.4. Conservación
Si para el montaje y puesta en marcha de los equipos y materiales que
componen la placa de interfaz se siguen todas las indicaciones, recomendaciones y se
cumplen las especificaciones que se dan en el pliego de condiciones, anexos y
memoria, la vida útil de los elementos estará supeditada a aquella que de el fabricante
siguiendo sus recomendaciones de mantenimiento.
17.5. Funcionamiento normal del equipo
Una vez realizados todos los pasos anteriores, el equipo estará listo para
funcionar permanentemente.
El equipo no necesita de un mantenimiento riguroso, siempre que su uso se
realice dentro de los límites especificados para cada componente.
El deterioro de los materiales puede ser debido al propio envejecimiento del
material con el paso del tiempo.
18. Condiciones de materiales y
equipo
18.1. Condiciones técnicas de los materiales
Lo materiales a emplear en este proyecto deberán cumplimentar todas y cada
una de las normas descritas en el presente documento y podrán ser sometidos a
diferentes pruebas y ensayos para asegurarse así de su correcto funcionamiento. En
Página 176
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
caso de no realizarse dichas pruebas y ensayos, el proyectista quedará exento de
responsabilidad en el posible deterioro de los elementos durante su utilización.
Estos materiales deben cumplir las especificaciones citadas para cada uno de
ellos. Si son reemplazados por unos nuevos, estos deben tener las mismas
características que los que reemplazan, inhibiéndose de cualquier responsabilidad por
fallo si estos requisitos no son cumplidos.
18.2. Condiciones técnicas del material
informático
Los requisitos mínimos del sistema informático necesario para poder ejecutar el
software diseñado, son los siguientes:

Ordenador personal con procesador Intel Pentium IV a 2.0 GHz o
equivalente.

512 MB de memoria RAM DDR.

Un puerto USB libre para la conexión de la placa de interfaz.

100 MB de espacio en disco duro para la instalación del software.

Microsoft Windows XP, Linux Ubuntu 11.10, Mac OS X Snow Leopard o
posterior.
Para la realización del presente proyecto se ha utilizado la siguiente
configuración de hardware y software:

Ordenador personal con procesador Intel i5 520M a 2,4 GHz, 4096MB
de memoria RAM DDR2, disco duro de 500 GB, tarjeta de sonido
integrada y conexión a Internet.

Sistema operativo Microsoft Windows 7 Home Premium, Linux Ubuntu
12.04 LTS y Mac OS X Lion.
Página 177
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones

Navegador de Internet Google Chrome

Eric 4 IDE

Adobe Acrobat Reader X

Paint .NET

TinyGrab

Microsoft Word 2011

Microsoft Visio 2011

IDE de Arduino

Intérprete de Python

VMware Workstation 8
18.3. Condiciones técnicas de los circuitos
impresos
Las placas de los circuitos impresos serán de fibra de vidrio y tendrán un
espesor no inferior a 750 μm. Siendo una vez atacadas con ácido las placas para crear
las pistas, cubiertas con un barniz protector fotosensible de manera que el proceso no
oculte las zonas donde se deberán realizar la soldadura de los componentes.
Se deberá tener especial cuidado en el proceso de soldadura de ciertos
componentes tales como los semiconductores, tratando de reducir en la medida de lo
posible el tiempo del proceso, ya que debido a la sensibilidad de éstos a la
temperatura se podrían producir daños por sobrecalentamiento.
Página 178
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
18.4. Condiciones técnicas de los elementos
pasivos
Las resistencias y condensadores tendrán unas tolerancias o márgenes de error
permisibles.
En el caso de las resistencias se considerará aceptable un error de hasta el 5%,
siendo tolerable para los condensadores un valor del 20%.
19.
Condiciones economicas
19.1. Errores en el proyecto
En el caso de existir errores materiales o de cualquier otra índole en el
proyecto, se dará cuenta de ello lo más rápidamente posible al proyectista. De no
realizar este protocolo de seguimiento del desarrollo, el proyectista quedará libre de
culpa o sanción por los posibles errores.
19.2. Jornadas y salarios
Las jornadas y salarios correrán a cargo de la empresa contratista del proyecto,
así como de los gastos producidos durante el proceso de montaje hasta que se realice
la entrega del proyecto finalizado.
Correrán a cargo de la empresa los derechos de alta del proyecto en la
delegación provincial del Ministerio de Industria y organismo competente en el lugar
donde se desarrolle el proyecto.
Para llevar a cabo la ejecución del proyecto, deberán estar abonados lo
honorarios del proyectista, pudiendo recaer cargos sobre ello si esta parte no es
cumplimentada para su desarrollo.
Página 179
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Pliego de condiciones
19.3. Liquidación
Terminada la elaboración del proyecto se procederá a la liquidación final en la
que se incluye el importe de las unidades de realización, así como las posibles
modificaciones del proyecto que hayan sido aprobadas por la dirección técnica.
Al suscribir el contrato, el contratante habrá de abonar al adjudicatario el 80%
del total del presupuesto. El 20% quedará como garantía durante los seis primeros
mese a partir de la fecha de puesta en marcha o de ejecución del mismo.
Si transcurrido ese plazo no se ha puesto en evidencia ningún defecto, se
abonará la cantidad que faltaba por entregar, y a partir de ese momento, se
considerarán completamente concluidos los compromisos entre ambas partes, a
excepción del periodo de garantía que cubrirá todo lo citado anteriormente.
Página 180
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
20.
Pliego de condiciones
Disposicion final
Las partes contratantes, dirección técnica y empresa, se ratifican en el
contenido del siguiente pliego de condiciones, el cual tiene igual validez, a todos los
efectos, que una escritura pública, prometiendo el fiel cumplimiento.
Fdo: Santiago Reig Chiva
Logroño, 20 de julio de 2012
Página 181
PLANOS
DOCUMENTO Nº 4
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Planos
El presente proyecto no necesita de planos para su realización, por lo que está
sección no contiene información.
Página 183
PRESUPUESTO
DOCUMENTO Nº 5
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
Índice del presupuesto
21.
21.1.
Presupuesto parcial ................................................................................ 187
Materiales ........................................................................................... 187
21.1.1. Hardware del sistema..................................................................... 187
21.1.2. Placa de interfaz ............................................................................. 188
21.1.3. Alimentación .................................................................................. 188
21.2.
Software del sistema........................................................................... 189
21.3.
Mano de obra...................................................................................... 190
22.
Presupuesto total ................................................................................... 192
Página 185
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
Índice de tablas
Tabla 21 | Presupuesto de hardware del sistema ............................................ 187
Tabla 22 | Presupuesto de la placa de interfaz ................................................ 188
Tabla 23 | Presupuesto de alimentación.......................................................... 188
Tabla 24 | Presupuesto de materiales.............................................................. 189
Tabla 25 | Presupuesto de software del sistema ............................................. 190
Tabla 26 | Presupuesto de mano de obra ........................................................ 191
Tabla 27 | Presupuesto total ............................................................................ 192
Página 186
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
21.
Presupuesto
Presupuesto parcial
21.1. Materiales
21.1.1. Hardware del sistema
Siguiendo las especificaciones que han sido descritas en el apartado de
condiciones técnicas en el pliego de condiciones, se puede seleccionar cualquier
ordenador que cumpla los requisitos, ya sea sobremesa o portátil.
Debido a la facilidad de transporte se ha seleccionado un ordenador portátil
Tabla 21 | Presupuesto de hardware del sistema
Descripción
HP g6-1214es
Subtotal 1.1
Unidades
Coste unitario
Precio total
1
485 €
485 €
485 €
Página 187
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
21.1.2. Placa de interfaz
Tabla 22 | Presupuesto de la placa de interfaz
Descripción
Unidades
Coste unitario
Precio total
Arduino UNO
1
20,63 €
20,63 €
Cable USB A-B
1
2,43 €
2,43 €
Subtotal 1.2
23,06 €
21.1.3. Alimentación
Tabla 23 | Presupuesto de alimentación
Descripción
Fuente de alimentación
Subtotal 1.3
Unidades
Coste unitario
Precio total
1
16,5 €
16,5 €
16,5 €
Página 188
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
El presupuesto total de materiales es el siguiente:
Tabla 24 | Presupuesto de materiales
Descripción
Precio total
Subtotal 1.1
485 €
Subtotal 1.2
23,06 €
Subtotal 1.3
16,5 €
Subtotal 1
524,56 €
El precio total de la partida de materiales asciende a los 524,56 € (quinientos
veinticuatro euros con cincuenta y seis céntimos).
21.2. Software del sistema
En este apartado se desglosa el valor de las licencias de los programas
utilizados para la realización del proyecto.
Página 189
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
Tabla 25 | Presupuesto de software del sistema
Descripción
Unidades
Coste unitario
Precio total
1
87,95 €
87,95 €
Microsoft Office 2010
1
699 €
699 €
VMware Workstation 8
1
177,68 €
177,68 €
Mac OS X Lion
1
59 €
59 €
Windows 7 Home
Premium
Subtotal 2
1.023,63 €
El precio total de la partida de software asciende a 1.123,63 € (mil veintitrés
con sesenta euros y tres céntimos).
21.3. Mano de obra
En este apartado se detallan los costes de mano de obra. Se desglosa en horas
requeridas, tarea realizada, precio por hora y precio total.
Página 190
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
Tabla 26 | Presupuesto de mano de obra
Descripción
Horas
Precio por hora
Precio total
Estudios previos
10
10 €
100 €
Programación aplicación
250
30 €
7.500 €
Programación Arduino
15
50 €
750 €
20
30 €
600 €
40
15 e
600 €
Montaje y puesta en
marcha
Documentación
Subtotal 3
9.550 €
El precio total de la partida de mano de obra asciende a 9.550€ (nueve mil
quinientos cincuenta euros).
Página 191
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
22.
Presupuesto
Presupuesto total
Tabla 27 | Presupuesto total
Descripción
Precio total
Subtotal 1
524,56 €
Subtotal 2
1.023,63 €
Subtotal 3
9.550 €
Total
IVA (18%)
Total (IVA incluido)
11.098,19 €
1997,67 €
13.095,86 €
Página 192
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Presupuesto
El presupuesto total del sistema, incluyendo costes, honorarios e impuestos
asciende a TRECE MIL NOVEINTA Y CINCO EUROS CON OCHENTA Y SEIS CÉNTIMOS.
Fdo: Santiago Reig Chiva
Logroño, 20 de julio de 2012
Página 193
BIBLIOGRAFÍA
DOCUMENTO Nº 6
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Bibliografía
Índice de la bibliografía
Índice de la bibliografía..................................................................................... 195
23.
Protocolo Firmata ................................................................................... 196
24.
Programación software .......................................................................... 196
24.1.
C/C++ ................................................................................................... 196
24.2.
Python ................................................................................................. 196
25.
Arquitectura Atmel ................................................................................. 197
26.
Distribuidores ......................................................................................... 197
Página 195
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Bibliografía
23. Protocolo Firmata

Detalles del protocolo:
http://firmata.org/wiki/Protocol

Limitaciones de diseño:
http://firmata.org/wiki/Design_Issues

Protocolo Midi:
https://ccrma.stanford.edu/~craig/articles/linuxmidi/misc/essenmidi.html
http://es.wikipedia.org/wiki/MIDI
24.
Programacion software
24.1. C/C++

Referencia de las librerías de Arduino.
http://arduino.cc/en/Reference/HomePage

Guías de C++
http://www.cplusplus.com/
24.2. Python


Rapid GUI Programming with Python and Qt, Mark Summerfield,
Prentice Hall, 2007.
Documentación de Python:
Página 196
Plataforma de experimentación para prototipado de diseños mediante Arduino
Santiago Reig Chiva
Bibliografía
http://docs.python.org/

Documentación de Qt:
http://doc.qt.nokia.com/4.7/index.html
25.
Arquitectura Atmel

Documentación ATmega328P:
http://www.atmel.com/devices/atmega328p.aspx?tab=documents

Página de Arduino:
http://arduino.cc
26.
Distribuidores

Tienda de componentes informáticos:
http://www.pccomponentes.com

Distribuidor de componentes informáticos Mouser:
http://www.mouser.com

Distribuidor de componentes informáticos RS Amidata:
http://es.rs-online.com/web/
Página 197

Documentos relacionados