Professional Documents
Culture Documents
El autor
Universidad de La Rioja, Servicio de Publicaciones, 2012
publicaciones.unirioja.es
E-mail: publicaciones@unirioja.es
Peticionario:
Universidad de La Rioja
rea de proyectos de ingeniera
Informante:
Director:
Lugar y fecha:
ndice
ndice
Memoria ............................................................................................. 3
Anexos ..............................................................................................85
Pliego de condiciones ............................................................... 166
Planos ............................................................................................ 183
Presupuesto ................................................................................. 185
Bibliografa .................................................................................. 195
Pgina 2
MEMORIA
DOCUMENTO N 1
Memoria
ndice de la memoria
1.
Antecedentes............................................................................................ 13
2.
3.
Definiciones .............................................................................................. 17
4.
Introduccin ............................................................................................. 19
4.1.
El polmetro .............................................................................................. 19
4.2.
Osciloscopio .............................................................................................. 20
4.3.
4.4.
Actualidad ................................................................................................. 22
5.
5.1.
Estudio de ArduLab................................................................................... 23
5.2.
5.3.
6.
6.1.
6.1.1.
Pgina 4
Memoria
6.2.1.
6.2.2.
6.2.3.
6.2.4.
6.2.5.
6.2.6.
6.3.
6.3.1.
6.3.2.
6.3.3.
6.4.
Pgina 5
Memoria
6.4.1.
6.4.2.
Anlisis de Qt ..................................................................................... 49
6.4.3.
7.
7.1.
7.2.
7.3.
7.4.
8.
Desarrollo ................................................................................................. 55
8.1.
8.2.
8.2.1.
Introduccin ...................................................................................... 56
8.2.2.
8.2.4.
8.2.5.
8.2.6.
8.2.7.
Pgina 6
8.2.8.
8.3.
Memoria
Distancias y terminaciones................................................................ 63
8.3.1.
Introduccin ...................................................................................... 64
8.3.2.
8.3.3.
8.4.1.
Introduccin ...................................................................................... 74
8.4.2.
8.4.3.
8.4.4.
8.4.5.
8.4.6.
Pgina 7
Memoria
8.4.7.
8.4.8.
Pgina 8
Memoria
ndice de ilustraciones
Ilustracin 1 | Polmetro analgico .................................................................... 20
Ilustracin 2 | Polmetro digital .......................................................................... 20
Ilustracin 3 | Osciloscopio analgico ................................................................ 21
Ilustracin 4 | Osciloscopio digital ..................................................................... 21
Ilustracin 5 | Analizador lgico ......................................................................... 21
Ilustracin 6 | Captura de ArduLab .................................................................... 24
Ilustracin 7 | Bus Pirate v3.6............................................................................. 26
Ilustracin 8 | Usando el Bus Pirate con Putty ................................................... 28
Ilustracin 9 | Little Wire .................................................................................... 29
Ilustracin 10 | Arduino UNO ............................................................................. 33
Ilustracin 11 | Placa Pingino ........................................................................... 34
Ilustracin 12 | chipKIT Uno32 ........................................................................... 35
Ilustracin 13 | STM32 Discovery ....................................................................... 37
Ilustracin 14 | LPCXPRESSO con ARM Cortex-M0 ............................................ 38
Ilustracin 15 | TI Launchpad ............................................................................. 39
Ilustracin 16 | Mdulo Bluetooth ..................................................................... 42
Ilustracin 17 | XBee Serie 1 .............................................................................. 43
Pgina 9
Memoria
Pgina 10
Memoria
ndice de tablas
Tabla 1 | Anlisis Arduino UNO ......................................................................... 33
Tabla 2 | Anlisis de Pingino ............................................................................. 34
Tabla 3 | Anlisis chipKIT .................................................................................... 35
Tabla 4 | Anlisis de ST Micro ............................................................................. 37
Tabla 5 | Anlisis de NXP .................................................................................... 38
Tabla 6 | Anlisis de Launchpad ......................................................................... 39
Tabla 7 | Anlisis del puerto paralelo ................................................................. 41
Tabla 8 | Anlisis del puerto serie ...................................................................... 41
Tabla 9 | Anlisis del USB ................................................................................... 42
Tabla 10 | Anlisis del Bluetooth ........................................................................ 43
Tabla 11 | Anlisis del XBee ................................................................................ 44
Tabla 12 | Anlisis de Firmata ............................................................................ 46
Tabla 13 | Anlisis del protocolo de ArduLab .................................................... 47
Tabla 14 | Anlisis de protocolo propio ............................................................. 48
Tabla 15 | Anlisis de Java .................................................................................. 49
Tabla 16 | Anlisis de Qt ..................................................................................... 50
Tabla 17 | Anlisis de Python ............................................................................. 51
Pgina 11
Memoria
Pgina 12
Memoria
1. Antecedentes
El presente proyecto, titulado Plataforma de experimentacin para
prototipado de diseos mediante Arduino, surge de las conversaciones mantenidas
entre D. Eduardo Gallego, principal desarrollador de ArduLab y orientador del aula de
robtica del C.P. Miguel Hernndez de Madrid; D. Carlos Alberto Rodrguez Gonzlez,
profesor perteneciente al departamento de Ingeniera Elctrica de la Universidad de La
Rioja y D. Santiago Reig Chiva, alumno de Ingeniera Tcnica Industrial especialidad en
Electrnica Industrial de la Universidad de La Rioja, con motivo de la realizacin 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 elaboracin del proyecto y se presenta a
efectos de reconocimiento acadmico para la obtencin del ttulo de Ingeniero Tcnico
Industrial especialidad en Electrnica Industrial.
Pgina 13
Memoria
del
framework
debern
cumplir
las
siguientes
Pgina 14
Memoria
Todas las partes estn bajo licencias libres y sean de cdigo abierto.
Pgina 15
Memoria
Pgina 16
Memoria
3. Definiciones
El vocabulario tcnico utilizado a lo largo de este documento es definido para
su correcta comprensin:
Pgina 17
Memoria
Pgina 18
Memoria
4. ntroduccion
Las herramientas para prototipado han ido apareciendo en el tiempo segn se
iba aumentado el conocimiento existente sobre la fsica, especialmente en los campos
de la electricidad y magnetismo. Estas herramientas son vitales tanto para el desarrollo
de nuevas aplicaciones como para la reparacin y revisin del funcionamiento de las ya
existentes.
Las herramientas ms importantes y verstiles para anlisis en la historia han
sido el voltmetro, procedente del desarrollo de los galvanmetros y el osciloscopio.
La tecnologa ha ido mejorando a lo largo de los aos y esto ha permitido crear
analizadores para magnitudes fsicas que no se podan verificar con exactitud o hacerlo
de una manera ms barata, sencilla o cmoda.
El analizador lgico apareci como el sustituto de los osciloscopios para el
anlisis de circuitos digitales, que permita tener un gran nmero de entradas en
comparacin con el primero.
4.1. El polmetro
El polmetro es un instrumento elctrico porttil para medir directamente
magnitudes elctricas como pudieran ser tensiones, corrientes o pasivas como
resistencias, continuidad y otras. Las medidas pueden realizarse para corriente
continua o alterna.
Los modelos ms avanzados pueden incluir mediciones ms avanzadas tales
como temperatura, normalmente con el uso de termopares, capacidades,
inductancias, etc.
Pgina 19
Memoria
4.2. Osciloscopio
Un osciloscopio es un instrumento de medicin electrnico para la
representacin grfica de seales elctricas que pueden variar en el tiempo. Dada su
gran versatilidad, se utiliza con asiduidad en electrnica y telecomunicaciones.
Estn clasificados segn su funcionamiento interno en analgicos o digitales,
siendo el resultado mostrado prcticamente 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 caractersticas comparados con sus similares
analgicos.
Pgina 20
Memoria
Pgina 21
Memoria
4.4. Actualidad
Actualmente se utilizan todas las herramientas mencionadas anteriormente y la
prctica totalidad de ellas en las versiones digitales o electrnicas, que poseen una
funcionalidad mucho mayor a la de sus homlogos analgicos, aunque cuenta con las
limitaciones de la propia conversin de analgico a digital y al revs, como pueden ser,
velocidad, resolucin, etc.
Pgina 22
Memoria
Pgina 23
Memoria
Pgina 24
Memoria
Pgina 25
Memoria
Programar microcontroladores
o PIC
Pgina 26
Memoria
o AVR
Programador de CPLDs
Medidor de voltaje
Otras muchas
Pgina 27
Memoria
Manejo de servos
Pgina 28
Memoria
Pgina 29
Memoria
6. Analisis de soluciones
La solucin ideal ser una combinacin de placa de interfaz, protocolo de
comunicaciones y software que congenien de forma que permita realizar el proyecto
sin una gran inversin 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.
Pgina 30
Memoria
Pgina 31
Memoria
Pgina 32
Memoria
Una de las ventajas, y la razn por la que Arduino eligi la plataforma AVR, es la
existencia del compilador libre basado en GCC denominado avr-gcc.
Tabla 1 | Anlisis Arduino UNO
Ventajas
Toolchain libre y gratuito
Gran comunidad de usuarios
Cantidad de documentacin y ejemplos
Desventajas
Precio
Pgina 33
Memoria
Ventajas
Toolchain gratuito
Desventajas
Toolchain no libre
Libreras poco desarrolladas
Pgina 34
Memoria
Ventajas
Toolchain gratuito
API exactamente igual que la de Arduino
Se mantiene la API lo ms actualizada posible
Desventajas
Toolchain no libre
Pequea comunidad de usuarios
Pgina 35
Memoria
Pgina 36
Memoria
Ventajas
Toolchain gratuito y libre
Programador compatible con opciones libres
Alta velocidad de procesamiento
Desventajas
Pgina 37
Memoria
Ventajas
Toolchain gratuito y libre
Alta velocidad de procesamiento
Desventajas
Precio
Pgina 38
Memoria
La principal desventaja es que los chips bsicos de esta familia no suelen tener
mdulo hardware de UART, por lo que habra que implementarlo por software.
Ilustracin 15 | TI Launchpad
Ventajas
Toolchain gratuito y libre
Precio
Desventajas
Pocas libreras
Dificultad de desarrollo
Ausencia de USART en el microcontrolador provisto
Pgina 39
Memoria
Pgina 40
Memoria
Ventajas
Posibilidad de usarlo directamente para realizar la interfaz con el mundo fsico
Desventajas
Los sistemas operativos no suelen trabajar en tiempo real
Difcil de encontrar en equipos nuevos
Ventajas
Suficientemente rpido
Buena inmunidad al ruido
Barato de implementar
Muy utilizado y sencillo de trabajar
Desventajas
Pgina 41
Memoria
Ventajas
Muy rpido
Buena inmunidad al ruido
Muy verstil
Correccin de errores
Desventajas
Encarece el microcontrolador
Pgina 42
Memoria
Durante los ltimos aos se ha producido una reduccin enorme del coste de
implantacin de este protocolo, siendo incluido cada vez ms en proyectos de bajo
coste y comercializacin.
Los mdems Bluetooth tienen una interfaz por la que configurarlos y
comunicarse a travs de ellos basada en el puerto serie, por lo que podran reemplazar
el cable del puerto serie sin grandes modificaciones del cdigo.
Tabla 10 | Anlisis del Bluetooth
Ventajas
Inalmbrico
Velocidad similar al puerto serie
Fcil de implementar
Desventajas
Poca potencia de transmisin
No muy fiable y consistente a largo plazo
Pgina 43
Memoria
Ventajas
Largas distancias de comunicacin
Correccin de errores
Fcil de implementar
Desventajas
Precio
Pgina 44
Memoria
Pgina 45
Memoria
PWM.
Control de servomotores.
I2C.
Ventajas
Ya implementado
Comunidad de usuarios
Desarrolladores activos
Protocolo libre y gratuito
Desventajas
Ninguna
Pgina 46
Memoria
Ventajas
Ya implementado
Sencillo
Desventajas
No muy escalable
Pgina 47
Memoria
Ventajas
Totalmente adaptado a las necesidades
Desventajas
Tiempo de desarrollo
Pgina 48
Memoria
Ventajas
Gran comunidad de usuarios
Gran cantidad de ejemplos
Elimina las complejidades de C++
Desventajas
6.4.2. Anlisis de Qt
Est basado en C++ y su punto fuerte es la capa de abstraccin que han creado
encima de este para aadir caractersticas multiplataforma, tanto de escritorio como
mviles (Windows, Linux, Mac OS, Symbian, and Maemo), incluye libreras para
desarrollar interfaces de usuario con ventanas y est acompaado por una gran
cantidad de herramientas potentes y una extensa y bien organizada documentacin.
Hace una temporada tuvo un futuro incierto, ya que ste lenguaje de
programacin pertenece a Nokia, que no pas por unos aos muy buenos y su
existencia peligraba, pero hace poco decidieron liberar el lenguaje de programacin
con sus libreras, por lo que se asienta su futuro; habiendo aparecido durante el
desarrollo de este proyecto de una revisin menor y la casi finalizacin de una revisin
mayor.
Pgina 49
Memoria
Tabla 16 | Anlisis de Qt
Ventajas
Basado en C++
Gran calidad de la documentacin
Herramientas de desarrollo muy completas e integradas
Libreras para interfaces de usuario de gran calidad
Desventajas
Pgina 50
Memoria
Ventajas
Sencillez de desarrollo
Cantidad de libreras
Gran comunidad de usurarios
Desventajas
Pgina 51
7. Descripcion
adoptada
Memoria
de
la
solucion
Pgina 52
Memoria
Pgina 53
Memoria
PyQwt: es una librera que aade elementos grficos cientficos tales como
grficas, sliders con medida, etc. Se basa en la librera Qwt desarrollada
para Qt.
Pgina 54
Memoria
8. Desarrollo
8.1. Diseo general
Una vez ya conocidas las tecnologas a utilizar en el proyecto, conocemos
cuales van a ser las caractersticas y lmites que nos vamos a encontrar. El proyecto va
a constar de cuatro partes diferenciadas, las cuales son:
Pgina 55
Memoria
Pgina 56
Memoria
PWM
Control de servomotores
I2C
8.2.2.1. Mensajes
El protocolo est formado por mensajes, que consisten en una serie de 8 bits.
Cada mensaje tiene su funcin asignada. Algunos mensajes consisten en un solo byte,
mientras que otros pueden llegar a tener 2 3 bytes. Tambin existe un mensaje con
el que poder enviar un nmero ilimitado de bytes. Algo que todos los mensajes tienen
en comn 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
Pgina 57
Memoria
puede deducir entonces que los bytes de estado estn en el rango 0x800xFF, por lo
que el nmero de stos est limitado a 127 y el resto de los bytes del mensaje, los de
datos si es que existen, estarn en el rango 0x000x7F.
Tabla 18 | Comparacin mensajes MIDI y Firmata
Comando
Significado
0x90
Activar nota
0x90
I/O digital
Parmetros
Parmetro 1
MIDI
2
nota
Firmata
2
LSB (bits 06)
Parmetro 2
fuerza
MSB (bits 713)
Pgina 58
Memoria
Pgina 59
Memoria
Bits de datos
Idle o
segundo byte
Trama
Mensaje
Pgina 60
Memoria
Pgina 61
Memoria
El quinto pin existente en las versiones de los conectores micro y mini puede
estar desconectado o referenciado a masa.
Pgina 62
Memoria
Pgina 63
Memoria
Pgina 64
Memoria
Pgina 65
Memoria
Pgina 66
Memoria
Pgina 67
from
from
from
from
from
from
from
Memoria
Estas lneas cargan los archivos .py existentes en la carpeta ui y dan acceso a las
clases que controlan la interfaz de usuario de cada mdulo.
Se puede observar que tambin se carga la ventana de seleccin del puerto
serie, que ser lo primero que le aparezca al usuario.
Una vez se haya seleccionado el puerto serie, se inicializarn los mdulos
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
configuracin adecuada.
Para aadir o quitar mdulos slo hace falta hacer modificaciones en los dos
grupos de cdigo anteriores, por lo que es muy sencillo y rpido.
Las clases tienen que tener dos mtodos que se llamarn cuando se entre o se
salga de la pestaa a la que corresponde esa clase, de esta forma se pueden liberar
pines, iniciar la captura de datos, etc. de forma automtica al cambiar de pestaa y sin
tener que realizar continuamente transmisiones de datos para representar
informacin que se dibuja en una pestaa oculta.
self.tabs[self.lastIndex].exitTab()
Pgina 68
Memoria
self.tabs[index].enterTab()
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 slo se miran uno a uno cada puerto serie del 1 al 256 si existen y
son accesibles y tambin en Linux y Mac, pero los puerto series virtuales a travs 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 travs del protocolo Firmata por el puerto serie.
Pgina 69
Memoria
Una vez lista la llamada al ejecutable del programador con todos los
parmetros listos, se iniciaba la programacin.
self.program.start(command)
Pgina 70
Memoria
app
path
because
entry = os.path.realpath(entry)
appdir = os.path.dirname(entry)
BOARDS = {
'arduino' : {
Pgina 71
Memoria
self.it = util.Iterator(self.board)
self.it.start()
Una vez recibida una trama se proceder a comprobar si se trata de una trama
vlida. Para ello se comprobarn que las transmisiones que se estn recibiendo siguen
las especificaciones del protocolo que se han marcado.
byte = self.sp.read()
Pgina 72
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 segn 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 funcin que debe procesarlos pasndole una
referencia de los datos recibidos.
El envo de tramas se realiza de forma individual para cada caso, por ejemplo si
se desea cambiar el tiempo de muestreo de los pines analgicos se utiliza la siguiente
funcin para mandar los tiempos a la placa Arduino:
Pgina 73
Memoria
Pgina 74
Memoria
Pgina 75
Memoria
Ilustracin 28 | ATmega328P
Caracterstica
Microcontrolador
Voltaje de funcionamiento
Voltaje de entrada (recomendado)
Nombre
ATmega328
5V
7-12V
Pgina 76
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
Pgina 77
Memoria
ser usado tanto como entrada como salida de alimentacin, pero slo si se
est alimentando externamente.
5V: este pin est conectado a la salida del regulador de tensin que
transforma la tensin de Vin en 5V, tambin est conectado al pin de 5V del
conector USB. La mxima intensidad que se puede obtener de este pin es
de 500mA. En caso de alimentarlo por USB, en caso de alimentacin
externa es difcil de determinar ya que depende en gran medida de la
tensin de entrada, cuanto mayor sea la tensin, menor ser la intensidad
mxima que se pueda obtener.
Pgina 78
Memoria
Serie: 0 (RX) y 1 (TX). Se usan para recibir y transmitir datos serializados con
niveles TTL. Estos pines estn conectados al conversor USB-Serie para
comunicarse con el ordenador. En el proyecto se utilizar esta
comunicacin por lo que su uso como pines digitales no estar disponible.
PC
Conversor USB-Serie
Micro
Pgina 79
Memoria
Pgina 80
Memoria
Ilustracin 32 | Arduino
Leonardo
Pgina 81
Memoria
Pgina 82
Memoria
Tiene dos botones principales, que son los que realizan la tarea de verificar el
cdigo escrito mediante la compilacin de ste y el segundo el de compilacin y carga
del cdigo en la placa Arduino a travs del puerto serie.
Tambin lleva integrado un simple monitor serie, con el que poder depurar el
cdigo mandando mensajes a travs del puerto serie, o directamente interactuar con
un programa que tenga su interfaz de usuario a travs de este protocolo.
Pgina 83
Memoria
Lleva incluida una toolchain para los AVR basada en avr-gcc, que es compilador
que toma cdigo en lenguaje C/C++ de alto nivel o ensamblador y crea un archivo
binario que se pueda programar en un AVR. Tcnicamente avr-gcc es slo un
compilador, portado de GCC (GNU Compiler Collection) para la familia de AVR de
Atmel, pero las mayoras de referencias a avr-gcc se refieren a todo el toolchain.
El paquete de software tambin lleva incluido un programador para los AVR
llamado avrdude, que es un programa de lnea de comandos, ideal para automatizar.
Es compatible con el programador STK500 a travs 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 compilacin para los AVR, como el programado, son de
cdigo abierto y libres y adems estn incluidos en el paquete de software, por lo que
est listo para ser ejecutado en cualquier ordenador con slo necesitar la instalacin
de la mquina virtual de Java. De esta manera se elimina la dependencia de libreras
externas que solan traer problemas debido a la gran variedad de versiones que los
usuarios podan tener instaladas, tanto muy nuevas y con fallos de cdigo no
descubiertos como muy antiguas con caractersticas no implementadas.
Pgina 84
ANEXOS
DOCUMENTO N 2
Anexos
9.1.
9.2.
9.3.
9.4.
9.5.
9.6.
9.7.
9.8.
9.9.
9.10.
9.11.
9.12.
9.13.
10.
11.
11.1.
Pgina 86
Anexos
11.3.
12.1.
12.2.
12.3.
Pgina 87
Anexos
ndice de ilustraciones
Ilustracin 35 | Nuevo hardware encontrado ................................................. 132
Ilustracin 36 | Seleccin de mtodo de bsqueda alternativa ...................... 133
Ilustracin 37 | Ubicacin donde buscar los controladores............................. 134
Ilustracin 38 | Instalando los controladores .................................................. 135
Ilustracin 39 | Los controladores no estn firmados ..................................... 135
Ilustracin 40 | El controlador se instal correctamente ................................ 136
Ilustracin 41 | Ruta de instalacin por defecto .............................................. 138
Ilustracin 42 | Aviso de modificacin del equipo ........................................... 138
Ilustracin 43 | Centro de Software de Ubuntu ............................................... 139
Ilustracin 44 | Se proporcionan los permisos de administrador .................... 140
Ilustracin 45 | Instalacin finalizada correctamente ...................................... 140
Ilustracin 46 | Permisos insuficientes............................................................. 141
Ilustracin 47 | Ventana inicial ......................................................................... 142
Ilustracin 48 | Mdulo de configuracin ........................................................ 144
Ilustracin 49 | Lista de modos ........................................................................ 145
Ilustracin 50 | Algunos pines configurados .................................................... 145
Ilustracin 51 | Mdulo digital ......................................................................... 146
Ilustracin 52 | Estado de activacin ............................................................... 147
Pgina 88
Anexos
Pgina 89
Anexos
ndice de tablas
Tabla 20 | Asignacin de pines ......................................................................... 154
Pgina 90
Anexos
Pgina 91
Anexos
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)
Pgina 92
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()
Pgina 93
Anexos
QLabel,
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()
Pgina 94
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 comunicacin")
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:
Pgina 95
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"!Atencin", unicode(e))
self.updatePorts(True)
except TypeError, e:
logger.debug(e)
QMessageBox.warning(self, u"!Atencin", unicode(e))
self.updatePorts(True)
except serial.serialutil.SerialException, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atencin", 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",
Pgina 96
Anexos
Pgina 97
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
Pgina 98
Anexos
Pgina 99
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())
Pgina 100
Anexos
Pgina 101
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")
Pgina 102
Anexos
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)
Pgina 103
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),
Pgina 104
Anexos
Pgina 105
Anexos
Pgina 106
Anexos
=
to
=
to
Pgina 107
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))
Pgina 108
Anexos
%
%
%
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)
Pgina 109
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)
Pgina 110
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
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())
Pgina 111
logger.debug("Moved
servo
on
"+str(angle)+"")
self.mw.board.pins[pin].write(angle)
Anexos
pin
"+str(pin)+"
to
Pgina 112
Anexos
Pgina 113
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):
Pgina 114
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
Pgina 115
Anexos
(section,
(section,
Pgina 116
Anexos
QLabel,
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)
Pgina 117
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 comunicacin")
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*")
Pgina 118
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"!Atencin", unicode(e))
self.updatePorts(True)
except TypeError, e:
logger.debug(e)
QMessageBox.warning(self, u"!Atencin", unicode(e))
self.updatePorts(True)
except serial.serialutil.SerialException, e:
logger.warning(e)
QMessageBox.warning(self, u"!Atencin", 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"Atencin!", u"No se pudo
encontrar el fichero a programar")
Pgina 119
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 comunicacin
con la placa.\nAsegrate de que est correctamente conectada."
elif output.find("ser_open()") != -1: # ser_open(): ....
error = u"El puerto no se pudo abrir.\nAsegrate de
que ningn 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"Atencin!", error)
else:
logger.debug("Programmed successfully")
self.updatePorts(True)
Pgina 120
Anexos
self.connectBtn.setEnabled(True)
self.programBtn.setEnabled(True)
self.connectBtn.setFocus()
self.stackedWidget.setCurrentIndex(0)
def getBoard(self):
return self.board
Pgina 121
Anexos
name = "Platex",
version = "0.1",
description = "Control Arduino from your computer",
options = {"build_exe": build_exe_options},
executables = [Platex_Target])
Pgina 122
Anexos
Pgina 123
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
Pgina 124
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"
#######
Pgina 125
Anexos
mv $PROJECT/dist ../$PROJECT-dist
cd ..
remove build
rm "$0"
#######
header "Done!"
#######
Pgina 126
Anexos
Pgina 127
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"
#######
Pgina 128
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"
#######
Pgina 129
Anexos
20
||
#######
header "Downloading Arduino IDE $ARDUINO"
#######
Pgina 130
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!"
#######
Pgina 131
Anexos
Pgina 132
Anexos
Pgina 133
Anexos
Pgina 134
Anexos
Pgina 135
Anexos
Pgina 136
Anexos
Pgina 137
Anexos
Pgina 138
Anexos
Pgina 139
Anexos
Pgina 140
Anexos
11.1.3. Mac OS X
Durante el desarrollo del proyecto, la compatibilidad de la librera encargada de
realizar el empaquetamiento e instalador no estaba completada, por lo que ha sido
imposible realizar el paquete de instalacin de este proyecto para la plataforma Mac.
Una vez se solucione este problema, la instalacin se realizar de la misma
forma que cualquier otra aplicacin.
Como solucin para correr el software bajo este sistema operativo, se deber
realizar con la ayuda del script de compilacin 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 gua
para la utilizacin de este script viene adjuntada en el siguiente anexo.
Pgina 141
Anexos
Pgina 142
Anexos
Configuracin
Digital
Analgico
PWM
Servo
Motores
Secuenciador
Pgina 143
Anexos
11.3.1. Configuracin
Este mdulo nos muestra una representacin 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
comprobacin del modo seleccionado por el usuario.
Output: el pin se utilizar como salida con niveles lgicos (1 0). Bajo este
modo se podr hacer tambin control de servomotores de radiocontrol.
Pgina 144
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 ms precisa que el todo o nada de la lgica digital.
Los pines analgicos tambin pueden ser usados tanto como entradas como salidas
digitales, por lo que se ha dado la opcin de configurarlos como tales en el software.
Pgina 145
Anexos
Los pines 0 y 1 no estn disponibles para su uso ya que se utilizan para realizar
la comunicacin entre el software y la propia placa, son los encargados de realizar la
comunicacin por el puerto serie.
11.3.2. Digital
Este mdulo tambin muestra la representacin de un Arduino en pantalla y
slo se muestran los pines que se hayan configurado anteriormente como entrada o
salidas.
Las entradas vienen designadas por un crculo verde oscuro encima del pin,
intentando asemejarse a un led verde, y de color ms claro al detectar un nivel alto en
l.
Las salidas se muestran como un cuadrado, similar a los existentes en el
mdulo de configuracin, de un color azul grisceo cuando la salida est desactivada y
Pgina 146
Anexos
un amarillo dorado cuando se haya activado. Para cambiar de estado la salida slo hay
que pinchar con el ratn encima de l.
11.3.3. Analgico
La finalidad de ste mdulo es la de mostrar la tensin existente en los pines
analgicos que se hayan configurado como tales.
Pgina 147
Anexos
Pgina 148
Anexos
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
tcnica de conversin, aunque sencilla, tiene un problema, ya que las cuentas son el
valor del voltaje con respecto a la tensin de alimentacin, 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 pequeas desviaciones de la tensin del orden de unos pocos
cientos de milivoltios, que se suman a los errores de conversin de los ADC del
Arduino.
11.3.4. PWM
Con este mdulo podremos sacar una seal de PWM en los pines que tengan
capacidad para ello, los cuales tienen el texto PWM junto a ellos en el mdulo de
configuracin.
Pgina 149
Anexos
11.3.5. Servo
Este mdulo est creado para controlar la posicin de servomotores de hobby,
que pueden ser controlados para moverse a una determinada posicin en grados de 0
a 180.
Pgina 150
Anexos
Pgina 151
Anexos
En la lista podremos seleccionar uno de los pines que estn configurados como
entradas (Input) y al seleccionar Activar se configurar en modo servo, por lo que
estar listo para controlar dichos motores.
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 numrica.
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 mdulos.
11.3.6. Motores
Con este mdulo se podr realizar el control de motores de continua, tanto
pequeos como grandes; la limitacin vendr dada por el hardware, en concreto, por
el lmite tanto de tensin como de intensidad del driver de motores utilizado.
Pgina 152
Anexos
Pgina 153
Anexos
Motor Shield R3
Canal A
Canal B
Canal A
Canal B
Direccin
12
13
12
13
Velocidad
10
11
11
11.3.7. Secuenciador
Se podra decir que este es el mdulo ms complejo, completo y til de todos
los incluidos hasta el momento, ya que contiene una parte de casi todos los mdulos,
permitiendo adems preparar una secuencia de pasos en los que se realizarn las
acciones indicadas por el usuario.
Pgina 154
Anexos
Pgina 155
Anexos
La primera caja numrica controla los pasos del secuenciador, los cambios que
se realicen en los controles se aplicarn al paso que aparezca en esta caja. Al cambiar
el nmero de paso se guardaran los valores de los controles y se cargarn los del paso
que se haya elegido. Por defecto se inicia con un solo paso y se podrn aadir ms
como se explica ms 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 smbolos + y sirven para aadir un paso a continuacin
del actual o para eliminar el paso actual, respectivamente.
El botn Iniciar, comenzar con la ejecucin 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
accin en el programa, hasta que no se haya finalizado el ltimo paso.
Pgina 156
Anexos
12.1. Windows
Debido al bajo nmero de herramientas de automatizacin de tareas existentes
o su alta dificultad de uso o poca difusin, se ha optado por realizar una parte de ella
manualmente.
La primera tarea a realizar ser instalar una versin del intrprete de Python, el
proyecto se ha desarrollado usando la versin 2.7.2, por lo que es la que se
recomienda instalar, tambin hay una alta probabilidad de que sea compatible con las
siguientes revisiones de esta versin, tales como 2.7.3 (que ya est lanzada y es
compatible), la futura 2.7.4, etc. mientras que la subversin siga siendo la 2.7. Como
tambin se deben instalar otras libreras necesarias para el proyecto y existe un
instalador de Python enfocado desarrollo por cientficos e ingenieros con una gran
cantidad de libreras numricas y anlisis y visualizacin de datos llamada Python(x,y),
se recomienda el uso de esta, ya que contiene todas las libreras que se necesitarn y
permite instalarlas de una manera sencilla y cmoda, evitando as realizar compilacin
Pgina 157
Anexos
alguna. Para ello se realizar la descarga del paquete de instalacin desde la seccin de
descargas de su pgina web.
Una vez descargado el paquete se proceder a su instalacin siguiendo el
asistente, cuando se alcance la seccin de seleccin de componentes se debern
seleccionar como mnimo los siguientes:
Python 2.7.X
Python
o PyQt
o PyQwt
o PySerial
Pgina 158
Anexos
todos los ordenadores y hacerlo compatible con Windows XP, se deber aadir
tambin el fichero libusb0.dll, tambin 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 cdigo fuente. Arduino almacena los programas compilados
en una carpeta temporal, por lo que se deber conocer su localizacin, para ello se
activar la salida del compilador en la ventana de depuracin. Esta opcin se activa en
la ventana de preferencias, accesible en el men de herramientas Archivo>Preferencias.
Pgina 159
Anexos
12.2. Linux
La creacin del instalador en Linux est totalmente automatizada, por lo que
para iniciar la creacin del instalador slo es necesario ejecutar la siguiente lnea en
una terminal:
$ sudo bash -c "wget https://raw.github.com/gist/1427486/buildlinux.sh && bash build-linux.sh"
Pgina 160
Anexos
Pgina 161
Anexos
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 lgico difiere bastante en algunos puntos.
La creacin del script en Mac OS tambin est completamente automatizada,
por lo que para iniciar la creacin del instalador slo es necesario ejecutar la siguiente
lnea en una terminal:
$ sudo bash -c "curl -O
https://raw.github.com/gist/1427486/build-mac.sh && bash buildmac.sh"
Pgina 162
Anexos
Pgina 163
Anexos
problema funcione de manera correcta. Aunque el script falle en ese punto se podr
ejecutar el programa, ya que todas las libreras estn ya instaladas, para ello y para
ejecutar el programa desde la lnea de comandos, habr que ejecutar la siguiente lnea
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 creacin del instalador es el siguiente:
Pgina 164
PLIEGO DE CONDICIONES
DOCUMENTO N 3
Pliego de condiciones
14.
15.
16.
16.1.
16.2.
17.
17.1.
17.2.
17.4.
Conservacin....................................................................................... 176
17.5.
18.
18.1.
18.2.
Pgina 166
Pliego de condiciones
18.3.
18.4.
19.
19.1.
19.2.
19.3.
20.
Pgina 167
Pliego de condiciones
ndice de ilustraciones
Ilustracin 69 | Localizacin del ejemplo Blink ................................................ 175
Ilustracin 70 | Led L ........................................................................................ 175
Pgina 168
Pliego de condiciones
14.
Condiciones generales
Pgina 169
Pliego de condiciones
15.
Pgina 170
Pliego de condiciones
Pgina 171
Pliego de condiciones
16.
Condiciones facultativas
16.1. Direccin
La direccin 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 utilizacin podr ser realizada por cualquier
persona con conocimientos suficientes demostrables sobre el proyecto, la tecnologa
Pgina 172
Pliego de condiciones
Pgina 173
Pliego de condiciones
Pgina 174
Pliego de condiciones
Ilustracin 70 | Led L
Pgina 175
Pliego de condiciones
17.4. Conservacin
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.
Pgina 176
Pliego de condiciones
Pgina 177
Pliego de condiciones
Eric 4 IDE
Paint .NET
TinyGrab
IDE de Arduino
Intrprete de Python
VMware Workstation 8
Pgina 178
Pliego de condiciones
19.
Condiciones economicas
Pgina 179
Pliego de condiciones
19.3. Liquidacin
Terminada la elaboracin del proyecto se proceder a la liquidacin final en la
que se incluye el importe de las unidades de realizacin, as como las posibles
modificaciones del proyecto que hayan sido aprobadas por la direccin tcnica.
Al suscribir el contrato, el contratante habr de abonar al adjudicatario el 80%
del total del presupuesto. El 20% quedar como garanta durante los seis primeros
mese a partir de la fecha de puesta en marcha o de ejecucin del mismo.
Si transcurrido ese plazo no se ha puesto en evidencia ningn defecto, se
abonar la cantidad que faltaba por entregar, y a partir de ese momento, se
considerarn completamente concluidos los compromisos entre ambas partes, a
excepcin del periodo de garanta que cubrir todo lo citado anteriormente.
Pgina 180
20.
Pliego de condiciones
Disposicion final
Pgina 181
PLANOS
DOCUMENTO N 4
Planos
Pgina 183
PRESUPUESTO
DOCUMENTO N 5
Presupuesto
21.3.
22.
Pgina 185
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 alimentacin.......................................................... 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
Pgina 186
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 tcnicas en el pliego de condiciones, se puede seleccionar cualquier
ordenador que cumpla los requisitos, ya sea sobremesa o porttil.
Debido a la facilidad de transporte se ha seleccionado un ordenador porttil
Tabla 21 | Presupuesto de hardware del sistema
Descripcin
HP g6-1214es
Subtotal 1.1
Unidades
Coste unitario
Precio total
485
485
485
Pgina 187
Presupuesto
Descripcin
Unidades
Coste unitario
Precio total
Arduino UNO
20,63
20,63
2,43
2,43
Subtotal 1.2
23,06
21.1.3. Alimentacin
Tabla 23 | Presupuesto de alimentacin
Descripcin
Fuente de alimentacin
Subtotal 1.3
Unidades
Coste unitario
Precio total
16,5
16,5
16,5
Pgina 188
Presupuesto
Descripcin
Precio total
Subtotal 1.1
485
Subtotal 1.2
23,06
Subtotal 1.3
16,5
Subtotal 1
524,56
Pgina 189
Presupuesto
Descripcin
Unidades
Coste unitario
Precio total
87,95
87,95
699
699
VMware Workstation 8
177,68
177,68
Mac OS X Lion
59
59
Windows 7 Home
Premium
Subtotal 2
1.023,63
Pgina 190
Presupuesto
Descripcin
Horas
Precio total
Estudios previos
10
10
100
Programacin aplicacin
250
30
7.500
Programacin Arduino
15
50
750
20
30
600
40
15 e
600
Montaje y puesta en
marcha
Documentacin
Subtotal 3
9.550
Pgina 191
22.
Presupuesto
Presupuesto total
Tabla 27 | Presupuesto total
Descripcin
Precio total
Subtotal 1
524,56
Subtotal 2
1.023,63
Subtotal 3
9.550
Total
IVA (18%)
11.098,19
1997,67
13.095,86
Pgina 192
Presupuesto
Pgina 193
BIBLIOGRAFA
DOCUMENTO N 6
Bibliografa
ndice de la bibliografa
ndice de la bibliografa..................................................................................... 195
23.
24.
24.1.
24.2.
25.
26.
Pgina 195
Bibliografa
http://firmata.org/wiki/Protocol
Limitaciones de diseo:
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++
http://arduino.cc/en/Reference/HomePage
Guas de C++
http://www.cplusplus.com/
24.2. Python
Pgina 196
Bibliografa
http://docs.python.org/
Documentacin de Qt:
http://doc.qt.nokia.com/4.7/index.html
25.
Arquitectura Atmel
Documentacin ATmega328P:
http://www.atmel.com/devices/atmega328p.aspx?tab=documents
Pgina de Arduino:
http://arduino.cc
26.
Distribuidores
http://www.pccomponentes.com
http://www.mouser.com
http://es.rs-online.com/web/
Pgina 197