You are on page 1of 157

Unidad de Control para Fresadora CNC con

Cambio Automtico de Herramienta


Proyecto Final de Carrera







Especialidad: Electrnica y Automtica Industrial



AUTOR: Jorge Hermoso Fernndez.
DIRECTOR: Alfonso Romero Nevado


Fecha: 05 / 2012
































































A ngel por confiar en m
para desarrollar este producto,
a Mar por revisar todo el
trabajo, a Ricard por la
magnfica labor de montaje y a
todos aquellos que han
participado de alguna u otra
manera.
Muchas Gracias
4
ndice

1 Glosario ............................................................................................................... 9
1.1 Vocabulario .................................................................................................. 9
1.2 Acrnimos .................................................................................................. 10
2 Introduccin ...................................................................................................... 11
2.1 Objetivos .................................................................................................... 11
2.2 Motivaciones .............................................................................................. 11
3 Descripcin de un sistema de fresado ............................................................... 12
3.1 ATC (Automatic Tool Changer) ................................................................ 12
4 Descripcin del proyecto ................................................................................... 14
4.1 Esbozo del sistema ..................................................................................... 14
4.1.1 Dimensiones ........................................................................................... 15
4.1.2 Funciones ............................................................................................... 15
4.1.3 Tipo de material para trabajar ................................................................ 16
4.1.4 Precisin ................................................................................................. 16
4.2 Sistema ATC y anclaje de herramientas .................................................... 16
4.3 Diseo mecnico del sistema ..................................................................... 17
4.4 Seleccin de actuadores y sensores ........................................................... 22
4.4.1 Necesidades ............................................................................................ 22
4.4.2 Restricciones .......................................................................................... 23
4.4.3 Seleccin ................................................................................................ 24
4.5 Requisitos de la unidad de control ............................................................. 28
4.6 Diseo de la unidad de control .................................................................. 28
4.6.1 Requisitos y eleccin driver motores ..................................................... 29
4.6.2 Requisitos y eleccin mdem BT........................................................... 29
4.6.3 Requisitos y eleccin extras ................................................................... 30
4.6.4 Requisitos y eleccin uC ........................................................................ 31
4.6.5 Eleccin de un comicro .......................................................................... 32
4.6.6 Panel de Control ..................................................................................... 32
4.6.7 Etapa de alimentacin ............................................................................ 33
5 Diseo y fabricacin.......................................................................................... 34
5.1 Herramientas utilizadas para la elaboracin de este proyecto ................... 34
5.1.1 Arduino IDE ........................................................................................... 34
5.1.2 Eclipse .................................................................................................... 34
5.1.3 WinAVR................................................................................................. 34
5
5.1.4 Android SDK.......................................................................................... 34
5.1.5 Altium Designer ..................................................................................... 34
5.1.6 Diseo de esquemticos y variantes ....................................................... 35
5.1.7 Diseo del PCB ...................................................................................... 36
5.2 Fabricacin de los prototipos ..................................................................... 36
5.2.1 Fabricacin de prototipos del PCB......................................................... 36
5.2.2 PCB del Panel de Control ...................................................................... 36
5.2.3 Montaje de los prototipos ....................................................................... 37
5.3 Desarrollo software .................................................................................... 37
5.3.1 FKT IO ................................................................................................... 38
5.3.2 Heavy Duty ............................................................................................ 38
5.3.3 Aplicacin de Configuracin y Control Manual .................................... 38
Aplicacin Comicro ........................................................................................... 41
Aplicacin Android ............................................................................................ 43
6 Clculos ............................................................................................................. 45
6.1 Consumo total de la unidad de Control ..................................................... 45
6.1.1 Peor caso 5V........................................................................................... 45
7 Planos ................................................................................................................ 47
8 Presupuesto........................................................................................................ 60
8.1 Estudio y diseo ......................................................................................... 60
8.2 Componentes ............................................................................................. 61
8.3 Fabricacin de prototipos ........................................................................... 62
8.4 Desarrollo de SW ....................................................................................... 63
8.5 Generacin de la documentacin ............................................................... 63
8.6 Costes Globales del Proyecto .................................................................... 63
9 Conclusiones ..................................................................................................... 65
Referencias ............................................................................................................. 66
Apndice A: Cdigo Aplicacin de Configuracin (Eclipse IDE) ............................ 67
Apndice B: Cdigo Aplicacin Configuracin Comicro (Arduino IDE)................ 85
Apndice C: Cdigo Test IO (Arduino IDE) ............................................................. 96
Apndice D: Cdigo Test Heavy Duty (Eclipse IDE) ............................................... 97
Apndice E: Aplicacin Android ............................................................................... 98
Apndice F: Variantes & PnP .................................................................................. 145
Apndice G: BOM ................................................................................................... 151
Apndice H: Planos Mecnicos ............................................................................... 152


6
Resumen

Ttulo: Unidad de control para fresadora CNC con cambio automtico de herramienta
Autor: Jorge Hermoso Fernndez
Direccin: Alfonso Romero Nevado
Fecha: Junio de 2012


0. Resumen

Los sistemas de mecanizado en la industria son elementos cada vez ms comunes,
siendo uno de los principales exponentes la fresadora por control numrico. La popularidad
de estas mquinas ha ido creciendo hasta el punto de haberse convertido, incluso, en
elementos disponibles para particulares y gracias, en gran medida, a las aplicaciones CAM.
En este proyecto se presenta una aproximacin a un sistema de fresado por control
nmerico de sobremesa con cambio automtico de herramienta mediante un carrusel
dispensador. El propsito del sistema diseado ser el de poder validar el mtodo de
anclaje propuesto en el proyecto, as como las alternativas que puedan derivar. Es por ello
que el conjunto se dimensiona de una forma escalada buscando una reduccin de
complejidad y de costes y utlizando servomotores de modelismo como alternativa a los
motores paso a paso.
La fijacin de la herramienta se ha previsto con un sistema imantado de corona
dentada para facilitar el posicionamiento y reducir la complejidad de centraje y orientacin
presente en otros sistemas de cambio automtico de herramienta.
A partir del esbozo del sistema de fresado se describir el diseo y fabricacin de una
unidad de control capaz de controlar la mquina, siendo este el verdadero objetivo del
presente proyecto. Esta unidad deber permitir la comunicacin con el PC y va Bluetooth
con dispositivos Android para el desarrollo de la futura aplicacin de trabajo. Como
ejemplo, se desarrollar una aplicacin de configuracin y control manual que muestre a
los interesados el uso del sistema.








7
Resum

Ttol: Unitat de control per a fresadora CNC amb canvi automtic deina.
Autor: Jorge Hermoso Fernndez
Direcci: Alfonso Romero Nevado
Data: Juny de 2012


0. Resum

Els sistemes de mecanitzat a la industria sn elements cada cop ms comuns, essent
un del principals exponents la fresadora per control numric. La popularitat daquestes
mquines sha incrementat fins al punt dhaver-se convertit, fins i tot, en elements
disponibles per a particulars grcies, en gran mesura, a les aplicacions CAM.
En aquest projecte es presenta una aproximaci a un sistema de fresat per control
numric de sobretaula amb canvi automtic deina mitjanant un carrusel dispensador. El
propsit del sistema diseat ser el de poder validar el mtode danclatge proposat al
projecte aix com les alternatives que es puguin derivar. s per aix que el conjunt es
dimensiona duna forma escalada buscant una reducci de complexitat i de costos i
utilitzant servomotors de modelisme com a alternativa als motors pas a pas.
La fixaci de leina sha previst amb un sistema imantat de corona dentada per
facilitar el posicionament i reduir la complexitat del centratge i orientaci present en altres
sistemes de canvi automtic.
A partir de lesbo del sistema de fresat es descriur el disseny i la fabricaci duna
unitat de control capa de controlar la mquina, essent aquest el verdader objectiu del
present projecte. Aquesta unitat haur de permetere una comunicaci USB amb lordinador
i via Bluetooth amb un dispositiu Android per al desenvolupament duna futura aplicaci
de treball. Com exemple es desenvolupar una aplicaci de configuraci y control manual
que mostri als interessats ls del sistema.









8
Final Project Summary

Title: Control unit design for CNC milling machine with automatic tool changer
Author: Jorge Hermoso Fernndez
Management: Alfonso Romero Nevado
Date: June of 2012

0. Abstract

Industrial machining systems are increasingly common elements to be one of the
leading exponents the numerically controlled milling machine. The popularity of these
machines has grown as much as to become available for individuals thanks greatly to CAM
applications.
This project presents an approach to a desktop numerical control milling system with
automatic tool changer through a dispenser carousel. The main purpose of the designed
system will be the validation of the fixing tool proposed in the document as well as several
alternatives that may arise. Because of this the whole system will be accordingly sized to
reduce complexity using hobby servomotors as an alternative to stepper motors.
The tool locking system is composed by a geared ring with a magnetic core to
facilitate the positioning and centering as well as reducing complexity and orientation
issues present in other automatic tool changer systems.
From the outline of the milling system this project will describe the design and
manufacture of an electronic control unit capable of managing the machine, which is the
main goal of this project. This unit will allow communication with the PC and via
Bluetooth with Android devices for the development of future operating applications. As
an example, a configuration and manual control application will be developed to show the
reader the use of the system.









9
1 Glosario
1.1 Vocabulario
Arduino: plataforma de hardware de fuente abierta basada en una sencilla placa de
entradas y salidas simple y un simple entorno de desarrollo.

Despanelizado: Operacin de separacin dels scoring (restos sobrantes de PCB) de
un panel con diversos placas electrnicas.

Android: Sistema operativo para dispositivos mviles (smartphones y tablets)
basado en un kernel de Linux.

Diodo de clamping: Diodos que se colocan entre una salida o entrada y alimentacin
y masa para asegurar los niveles de tensin de esta.

Firmware: bloque de instrucciones de mquina para propsitos especficos, grabado
en una memoria de tipo de solo lectura.

iWrap: firmware especifico para modulos Bluetooth de Bluegiga que permite una
gestin de las funcinalidades muy simple.

Comicro: microcontrolador secundario de una unidad electrnica con los objetivos
de supervisar algunas operaciones del microcontrolador principal y liberarlo de cierta
carga.

FTDI: Compaa escocesa de fabricacin de semiconductores especializada en
conversores serie-USB. Tal es su popularidad que se abrevia el nombre de estos a chips
FTDI.

Footprint: Diseo de los pads de un componente electrnico para un PCB, es la
uella necessaria para hacer las conexiones a los pines de este.

Conector IDC: Tipo de conector para cable plano caractertico por ser de montaje
fcil al quedar atrapado el cable entre unas pequeas cuchillas que automticamente cortan
el aislamiento de plstico. Es muy popular en el hardware infrmtico.

XML: Extensible Markup Language, se trata de un lenguaje estructural que permite
la compatibilidad entre sistemas.

10
1.2 Acrnimos

CNC: Control Numrico por Computadora
CAM: Computer Aided Manufacturing
CAD: Computer Aided Design
PCB: Printed Circuit Board
ATC: Automatic Tool Changer
FSR: Force Sensing Resistor
LDR: Light Dependent Resistor
LED: Light Emitting Diode
PnP: Pick and Place
USART: Universal Synchronous/Asynchronous Receiver/Transmitter
BT: Bluetooth
IDE: Integrated Development Environment
SO (Encapsulado): Small Outline










11
2 Introduccin
Las mquinas de fresado son elementos muy comunes en los ambientes industriales.
Su uso se extiende desde la creacin de piezas diseadas mediante programas de CAD
hasta la simple tarea de despanelizado de PCBs.
En un entorno cada vez ms estricto con los tiempos de produccin y la eficiencia, la
automatizacin de los procesos se convierte poco a poco en una herramienta
imprescindible.

2.1 Objetivos
El objetivo general del presente proyecto es proponer un modelo escalado de bajo
coste de una fresadora automtica de dos ejes con un sistema automtico de cambio de
herramientas por revlver.
A partir del esbozo del prototipo se pretende disear y fabricar una unidad de control
electrnica capaz de controlar toda la mquina de forma escalada y de permitir al usuario
la configuracin del sistema y su uso mediante una conexin Bluetooth a un dispositivo
mvil con el sistema operativo Android. Se debern seleccionar los accionamientos y
sensores necesarios del mercado para dimensionar la unidad de control. La aplicacin host
para el programa CAM no se desarrollar en el presente proyecto. Tampoco se construir
el prototipo del sistema CNC.
Al tratarse de un proyecto en la especialidad de electrnica y automtica industrial
esta memoria se centrar en el diseo y fabricacin de la unidad de control as como en la
eleccin de los sensores y actuadores, aunque la totalidad del proyecto se mostrar en el
documento para permitir al lector una mejor comprensin de las necesidades de desarrollo.
Las conclusiones del proyecto acadmico se extraern sobre los resultados de la
fabricacin del prototipo electrnico, mientras que la valoracin externa del proyecto se
basar en las diferentes pruebas de los sistemas de fijacin para el sistema ATC
(Automatic Tool Changer).

2.2 Motivaciones
Con este proyecto se trata de presentar una alternativa a los actuales sistemas de
fresado mediante las conclusiones que se puedan extraer del estudio y diseo que nos
ocupan.
La realizacin de este proyecto esta motivada por la necesidad de realizar un trabajo
multidisciplinar que, si bien se encuentra claramente centrado en el desarrollo electrnico,
requiere de planteamientos y herramientas del diseo mecnico. Es, por tanto, una
excelente oportunidad para disear un sistema desde el inicio teniendo la libertad de tomar
todas las decisiones.





12
3 Descripcin de un sistema de fresado
La fresadora es una mquina de mecanizado por erosin cuyo primer modelo data de
1818 por Eli Whitney [1], un inventor estadounidense. Su principio de funcionamiento se
basa en una herramienta rotativa de varios filos, llamada fresa, que elimina el material a su
paso dando as forma a la pieza. Los primeros modelos, aunque poco efectivos, permitieron
mediante el intercambio de piezas mecanizar diseos que no habran sido posibles de
fabricar en masa de otra forma.
A diferencia de un taladro corriente, la fresadora no est limitada a acceder a la pieza
inmvil en el banco de trabajo mediante el movimiento en un nico eje, sino que la
herramienta trabaja la pieza con libertad en los ejes horizontales permitiendo de esta
manera la realizacin de formas complejas variando la posicin de la pieza, el grado de
insercin de la herramienta y el perfil de la fresa.
Por regla general, las fresadoras tienen precisiones de menos de 0.025mm gracias a
sistemas reductores en caso de accionamiento manual (mediante manivelas) o a controles
analgicos o digitales en los casos de sistemas automatizados.
Debido a su gran polivalencia las fresadoras son cada vez ms comunes en el entorno
industrial, pero con el avance tecnolgico es raro encontrar fresadoras manuales. El control
numrico por ordenador (CNC) ha permitido informatizar el mecanizado y, gracias a la
conjuncin de estas mquinas con del software de diseo y manufactura asistidos por
ordenador (CAD y CAM), se han reducido los tiempos de produccin.
La mayora de fresadoras CNC, tambin llamadas centros de mecanizado,
consisten en taladros verticales con libertad de movimiento en los tres ejes cartesianos.
Aunque el movimiento vertical en el eje Z suele realizarlo el til rotatorio, dependiendo de
la arquitectura, hay maquinas que mueven la base con la pieza fija en los ejes planos X e
Y, o bien otras que mueven la herramienta.
Los modelos ms avanzados de fresadoras han llegado a incorporar hasta dos ejes
ms de trabajo, incorporando la rotacin de la pieza como si de un torno se tratase, as
como la inclinacin de sta, permitiendo a la herramienta trabajar en ngulo.

3.1 ATC (Automatic Tool Changer)
En este escenario de avanzada automatizacin de procesos es prcticamente
indispensable intentar aumentar la eficiencia de las mquinas. Con tal efecto se introdujo el
concepto de cambio automtico de herramienta. Estos sistemas tambin son conocidos en
el mundo de la robtica, aunque en este caso existen diferencias, al requerir no slo la
transmisin de movimiento, sino tambin la de seales elctricas.
El ATC reduce los tiempos de fabricacin al eliminar la necesidad de parar el
proceso para permitir al operario acceder a cambiar la herramienta, con la posterior
calibracin. Adems, permite el cambio automtico en caso de rotura de herramientas
frgiles.
De forma general, el cambio automtico de herramienta consiste en un mecanismo de
acceso y extraccin ms un cojunto de dos piezas que conforman un sistema de fijacin
mecnico siendo el lado de la mquina el anclaje maestro y la del lado de la herramienta el
anclaje esclavo.
13
Entre los sistemas ATC para fresadoras, el ms comn con diferencia es el tipo in
line, el cual consiste en una disposicin en lnea de todas las herramientas a lo largo de un
eje exterior a la zona de trabajo. Este sistema presenta la principal ventaja de su
simplicidad, adems de la gran accesibilidad para colocar y recoger las herramientas, tanto
por parte de la mquina como del operario. La alternativa a este sistema es el carrusel o
revlver, el cual almacena las herramientas en un dispensador giratorio. Se trata de un
sistema ms complejo destinado sobretodo a grandes mquinas normalmente cerradas en
las que interesa mantener la atmsfera interior y donde se busca proteger las herramientas
de la suciedad. En este segundo caso es ms comn encontrar los sistemas de fijacin
maestro-esclavo arriba mencionados, mientras que en los sistemas en lnea se suelen
utilizar herramientas estndares, al igual que con los taladros convencionales,
automatizando el movimiento de la mordaza del motor.



Imagen 1: Sistema lineal de cambio de herramienta [2]


Imagen 2: Sistema por carrusel de cambio de herramientas [3]




14
4 Descripcin del proyecto
El proyecto tiene como objetivo el esbozo de un sistema de fresado, la eleccin de
los actuadores y el diseo y fabricacin de la placa de control, as como su interfaz de
configuracin mediante la aplicacin Android.
Con el objetivo de facilitar al lector el seguimiento del presente documento, se ha
divido el proceso de trabajo en diferentes secciones:

En primer lugar, se realizar un breve esbozo del sistema que se pretende
disear, sealando las caractersticas necesarias.
Posteriormente, y en base a las ideas expuestas en el punto anterior, se
listarn las necesidades del sistema en lo que se refiere a actuadores y
sensores elctricos.
Con los requerimientos se realizar la bsqueda de los modelos necesarios en
el mercado para la fabricacin del sistema CNC.
Una vez seleccionados los actuadores, se dimensionar la placa de control
para seleccionar los componentes.
Finalmente, se realizar el diseo y se proceder a documentar su fabricacin
y resultados.

4.1 Esbozo del sistema
La fresadora se plantea como un sistema CNC de sobremesa de tres ejes en los que
se puede controlar el movimiento relativo entre la pieza y el til en los tres ejes
cartesianos. El accionamiento de la herramienta ser un motor de corriente continua de
baja potencia, pues se tratar de un sistema a pequea escala para poder validar el sistema
de fijacin de herramientas y desarrollar la aplicacin de control para terminales mviles.


Imagen 3: Ejes de trabajo de una fresadora

A pesar de que el diseo mecnico se basar en un sistema de tres ejes, la placa de
control debe estar preparada para cinco ejes, aadiendo as la funcionalidad para tornear
piezas con inclinacin.
15
Para el sistema ATC se disear un modelo de revlver con desplazamiento en el eje
horizontal, para permitir la fijacin y extraccin de la herramienta mediante unas guas.
Este punto se discutir ms delante de forma ms extensiva.


Imagen 4: Sistema ATC de carrusel con pin y cremallera

4.1.1 Dimensiones
La mquina resultante debe ser una versin de escritorio, por lo que las dimensiones
totales del sistema no debern exceder los 600 x 600 mm. La superficie til de trabajo ser
de 360 x 360 mm, a excepcin de la zona de cambio de herramienta que le restar un rea
de 60 x 60 mm en una esquina.

4.1.2 Funciones
Con este sistema se espera, como principal resultado, mover el til de fresado por
todo el rea activa horizontal, as como vertical, y poder realizar los cambios automticos
de herramienta.
Una vez conseguidos estos objetivos, el sistema deber ser capaz de trabajar
exclusivamente materiales blandos en dos y tres dimensiones, erosionando, taladrando,
cortando o dibujando.
Una opcin que debe contemplar el sistema de control es la funcionalidad como
torno con la adicin de hasta dos ejes ms de trabajo, uno en el eje de la pieza a trabajar y
otro perpendicular a este:

16

Imagen 5: Ejes de trabajo adicionales (izquierda: inclinacin, derecha: rotacin)


4.1.3 Tipo de material para trabajar
Al tratarse de un sistema a escala con accionamientos de baja potencia, se espera
trabajar con materiales muy blandos como la espuma de poliestireno para diseos 2D y 3D.
No obstante, el objetivo no es poder mecanizar materiales, sino poder evaluar el anclaje y
su resistencia con un motor de baja potencia.
4.1.4 Precisin
Al tratarse de un sistema para el desarrollo, se busca conseguir una precisin
aceptable, aunque no se presenta como un detalle crtico, de modo que ste es un
parmetro con un margen muy abierto. Como sistema de posicionamiento, este proyecto
prev utilizar servomotores de 180 cuyas seales de control, de forma general, permiten
una resolucin de 1024 pasos para modelos digitales. En este escenario, la resolucin
esperada en los ejes horizontales es de:

360 mm/180 posiciones = 0.35 mm/paso

A este valor habra que aadir el error que pueda producir el sistema de transmisin
por correa y engranajes.

4.2 Sistema ATC y anclaje de herramientas
El sistema de fijacin en el cual se basa este proyecto consiste en cabezas con
engranajes dentados en media V y ncleo imantado. De esta forma, es posible fijar la
herramienta con poca presin gracias a la atraccin magntica y a la forma de los dientes,
pero la transmisin del movimiento rotativo es eficiente gracias al ensamblaje por la cara
plana de los engranajes en el sentido correcto de giro.
17

Imagen 6: Sistema de fijacin para ATC (izquierda maestro, derecha esclavo)

Por un lado, el eje del motor termina en una cabeza imantada que constituye la
hembra del sistema de anclaje. Tal y como se aprecia en el modelo 3D, los dientes
mecanizados en la pared interior sirven para acomodar y posicionar la herramienta al
introducirla. Mientras los imanes mantienen unida la herramienta a la mquina, los dientes
son los que transmiten la fuerza.
Este tipo de anclaje es til siempre que la herramienta trabaje a presin. En casos en
los que la herramienta pueda quedar atrapada en el material se pueden presentar problemas,
aunque en este caso la resistencia de la unin vendr dada por la velocidad de rotacin y
par de la fresadora.
El sistema de dientes en V asimtricos permite alinear correctamente la herramienta
con el eje motor en el momento de la introduccin de la herramienta sin necesidad de
ningn control de la orientacin del eje motor o de la herramienta.
Por ltimo, el cabezal de la herramienta incluye una muesca que le permite
introducirse en las guas del revolver porta-herramientas y, de esta manera, desanclarse del
eje motor al desplazarse ste verticalmente.
Este tipo de anclaje es completamente original y, por tanto, no se han podido realizar
pruebas hasta el momento. Con la mquina diseada en este proyecto se pretende validar
en el futuro la eficiencia de este anclaje, as como su utilidad para sistemas de cambio
automtico de herramienta.

4.3 Diseo mecnico del sistema
El diseo del sistema se presenta a continuacin, mediante capturas del modelo 3D
del sistema CNC creado al completo con el programa Solidworks. Se han tenido en cuenta
todas las especificaciones anteriormente descritas y se han obviado todos los elementos
irrelevantes al diseo para facilitar la comprensin del diseo (elementos de fijacin,
soportes, etc.).
18

Imagen 7: Vista 3D de la fresadora diseada en Solidworks


Imagen 8: Fresadora con tapa abierta

Tal y como se puede observar, se ha planteado un sistema de transmisin por correas
para los ejes X e Y en conjunto con un sistema de engranajes que permitir transformar el
recorrido tpico de 180 de los servomotores en un desplazamiento lineal de 360 mm. El
eje Y cuenta, adems, con una correa paralela conducida para permitir un desplazamiento
equilibrado.


Imagen 9: Detalle del sistema de engranaje
19
Para el eje Z este sistema paralelo no ha sido necesario, al tratarse de un
desplazamiento menor, por lo cual se ha previsto un sistema de pin y cremallera
directamente sobre la base del motor de taladrado.
Otro sistema de pin y cremallera es el utilizado para el desplazamiento lineal del
revlver entre las posiciones de reposo y de carga.
En todos los sistemas de desplazamiento lineal los accionamientos no soportan el
peso de las partes mviles, pues ste se libera mediante el uso de guas en las que se
integran los bloques en movimiento, como se puede observar en el detalle a continuacin.


Imagen 10: Detalle de gua mecanizada para soporte de peso

Finalmente, el giro del carrusel se ha planteado con el servo directamente acollado de
forma concntrica. Esta solucin ser apta siempre que se trabaje con un modelo de
servomotor que admita trabajar a 360. En caso contrario, se deber modificar el diseo
mecnico para permitir una reduccin por engranajes.
Como se puede observar, la tapa del sistema posee una obertura para permitir la
carga y descarga de herramientas, tal y como se expuso con anterioridad, segn el proceso
que se detalla a continuacin.

Procedimiento de cambio de herramientas
El funcionamiento del sistema ATC diseado es el siguiente:

1. Orden de cambio de herramienta.
2. Aproximacin a la zona de cambio de herramienta.
3. Desplazamiento en -Z del til.
4. Desplazamiento horizontal del revolver a la posicin de cambio (herramienta
insertada en las guas del revolver).
5. Desplazamiento en +Z del til con ligero giro anti horario del motor
(herramienta extrada).
6. Rotacin del revolver hasta la posicin de la herramienta seleccionada.
7. Desplazamiento en -Z del til (insercin de la herramienta).
20
8. Desplazamiento horizontal del revolver a la posicin de reposo (herramienta
liberada del revolver).
9. Desplazamiento en +Z del til a la posicin de reposo.
10. Continuar el fresado.


























Para resolver los inicios despus de un reset de la estacin, se incorporara un sensor
de presencia que detectar qu espacios del revolver estn vacos. Para simplificar su
funcionamiento, el carrusel deber estar completo a excepcin de la herramienta en uso.
De esta manera, slo quedar disponible un espacio para retornar la herramienta en el
Power On de la mquina y se asegurar as que el orden de las herramientas se mantenga


Imagen 11: Vistas superior y frontal durante el cambio de
herramienta
Imagen 12: Vistas superior y frontal durante el cambio de
herramienta con tapa abierta
21

Imagen 13: Recorrido lineal del revlver entre
la posicin de reposo y la posicin de carga.
.
Procedimiento de carga semiautomtico de herramientas
Para los casos en los que se tenga que reponer una herramienta del revlver (cambio
de tipo o recambio), el proceso que deber seguir el sistema es el siguiente:

1. Orden de carga de revlver.
2. Extraccin automtica de la herramienta en uso (el til queda libre).
3. Desplazamiento del til a la esquina opuesta a la posicin de cambio.
4. El sistema cede el control al usuario para avanzar posicin por posicin.
5. El usuario cambia la herramienta manualmente a travs del espacio de carga.
6. Desplazamiento del revlver a la posicin de reposo.
7. Comprobacin de posiciones vacas (si hay alguna vaca, se genera error).

Este proceso se denomina semiautomtico porque el sistema en s sigue
gestionando algunos movimientos. El proceso manual se realizar sin alimentacin y con
la tapa abierta.

Todas las herramientas se suponen mecanizadas segn el sistema de fijacin descrito
y diseado por el autor de este proyecto.
22

Imagen 14: Ejemplo de herramienta con
cabezal para el sistema de fijacin propuesto

4.4 Seleccin de actuadores y sensores
Con las caractersticas descritas en los puntos anteriores se puede perfilar el conjunto
de actuadores y sensores necesarios y, posteriormente, la unidad de control del sistema
completo.
4.4.1 Necesidades
Recogiendo los elementos del diseo se presentan las siguientes necesidades por
parte del sistema de fresado CNC:
1. Accionamiento elctrico para desplazamiento en X.
2. Control de posicin en X.
3. Accionamiento elctrico para desplazamiento en Y.
4. Control de posicin en Y.
5. Accionamiento elctrico para desplazamiento en Z.
6. Control de posicin en Z.
7. Accionamiento rotatorio continuo para el fresado.
8. Control de presin para asegurar la presencia de la herramienta.

Por parte del sistema ATC:
1. Accionamiento lineal para la insercin y extraccin de la herramienta.
2. Control de posicin del accionamiento lineal.
3. Accionamiento rotatorio para la seleccin de herramienta.
4. Sensor de presencia para las herramientas.
23

Por parte de las extensiones:
1. Accionamiento rotatorio continuo para el torneado de las piezas.
2. Accionamiento rotatorio para la inclinacin de la pieza.
3. Control de inclinacin.

4.4.2 Restricciones
Para que el diseo sea fiel al requisito de la simplicidad y del coste se toman las
siguientes decisiones respecto a los actuadores y sensores necesarios:

Respecto al sistema CNC
Los accionamientos para los tres ejes sern servomotores digitales de alta
resolucin.
El accionamiento para el fresado ser un motor de 12V de menos de 1A
El control de presencia de la herramienta se realizar mediante un sensor de
presin en la base del anclaje del motor.
El eje Z contar con dos finales de carrera para asegurar la posicin alta
(extraccin herramienta) y baja (insercin de herramienta).

Respecto al ATC
El accionamiento lineal ser un motor DC de 12V con reductora y control de
posicin mediante finales de carrera.
El accionamiento rotativo ser un servomotor digital.
El sensor de presencia debe ser nico y ajustable para todos los tipos de
herramientas.

Respecto a las extensiones
Se prever un control adicional para un motor DC de altas velocidades con
reductora.
Para asegurar la fijacin de la pieza al eje de rotacin se instalarn dos
sensores de presin en los anclajes.
Se prever un control adicional para un servomotor para la inclinacin de la
pieza.

El funcionamiento de los motores DC se sealizar con indicadores LED para
asegurar una correcta utilizacin.


24
4.4.3 Seleccin
Servomotores para los ejes
La caracterstica principal que se busca en estos accionamientos es la precisin,
adems de un par adecuado para poder desplazar cada una de las estructuras mviles.
En el mercado se encuentran disponibles dos grandes grupos de servomotores de
modelismo: los analgicos y los digitales. Para este proyecto se consideran necesarios los
servomotores digitales, puesto que ofrecen ms par y ms precisin que un servo analgico
de la misma categora, con el nico inconveniente de un consumo superior.
El modelo escogido es el HS-7975HB V2 de la casa Hitech. Se trata de un servo de
alta resolucin (2048 pasos para 90) con un par de 8,6Kgcm alimentado a 4.8V.

Imagen 15: Servomotor HS-7975HB [4]

Caractersticas:
Voltaje de operacin: 4.8-6.0 V
Velocidad sin carga (4.8 V): 0.14 sec/60
Par (4.8 V): 8.6 kg.cm
Consumo en parada (4.8 V): 3 mA
Consumo en funcionamiento (4.8 V): 200 mA 2 A en carga mxima
Dimensiones: 40 x 20 x 37 mm
Peso: 53 g

El servo es programable a 180 y rotacin continua. Se debe tener en cuenta que a
180 la resolucin bajar a 1024 pasos. No obstante, a este valor deberamos sumar la
resolucin del sistema de transmisin que se utilizar para transformar el recorrido de 180
en 360mm lineales y la precisin de la seal PWM que gobernar los servomotores.
Para facilitar la construccin, y a pesar de tener que trabajar con diferentes niveles de
carga, se escoger el mismo modelo para todos los ejes.

Servomotor para el revolver
El revlver porta-herramientas puede ser accionado por un servomotor de menor
resolucin y menor precio. Se sigue enfocando a modelos digitales debido a su menor
deriva temporal y desgaste.
25
El modelo escogido es de la casa Hitech, al igual que el anterior, referencia HS-
5065MG. Se trata de un servomotor digital de 180 con un par de 1.8Kgcm.

Imagen 16: Servomotor HS-5065MG [4]

Caractersticas:
Voltaje de operacin: 4.8-6.0 V
Velocidad sin carga (4.8 V): 0.14 sec/60
Par (4.8 V): 1.8 kg.cm
Consumo en parada (4.8 V): 3 mA
Consumo en funcionamiento (4.8 V): 200 mA 2 A en carga mxima
Dimensiones: 23.6 x 11.6 x 24 mm
Peso: 11.9 g

Servomotor para la inclinacin
Al tratarse de una funcin de precisin, se escoge para esta tarea el mismo
servomotor seleccionado para el posicionamiento de los ejes. De esta manera, se
conseguir la precisin ptima y se sobredimensionar el sistema para casos de piezas ms
pesadas, aunque no sea el escenario de este proyecto.


Motor DC para la fresadora
Es difcil incluir el motor de la fresadora como un motor DC controlado
electrnicamente. En la mayora de aplicaciones este motor se alimentara con tensin de
red. No obstante, en esta aplicacin escalada se ha buscado el motor que mejor se pueda
adaptar a las necesidades del proyecto.
El motor escogido es el GP32 0019 de Trident de 14W, proporcionando un par
mximo de 2.25 Nm a una velocidad de hasta 5400rpm con un consumo mximo de 1.66A.
Se trata de un motor con caja reductora que permite obtener un buen equilibrio entre
consumo, espacio y fuerza.

26

Imagen 17: Plano con dimensiones del motor GP32 0019 [5]

Motor DC para la aproximacin del revolver
Para esta aplicacin, la velocidad no es tan importante como el par, aunque en
cualquier caso la carga que deber soportar es mnima. Para asegurar un buen
comportamiento se escoge un motor con caja reductora epicclica, el 944d41 de Como
Drills.


Imagen 18: Motor Como Drills 944d41 [5]


Tabla 1: Caractersticas del motor 944d41 [6]

Motor DC para el torneado
Para el torneado y rotacin de la pieza se asumir el mismo motor escogido para el
desplazamiento lineal del revolver.

Sensores de presin
Las medidas de presin en este proyecto no requieren de especial precisin, puesto
que en todos los casos establecen un control de presencia que fcilmente podra ser
sustituido por un final de carrera. No obstante, por cuestiones de espacio, no es viable la
aplicacin de estos interruptores. La principal ventaja de usar sensores de presin es la
27
posibilidad de expandir las tareas de monitorizacin en futuras revisiones del proyecto
gracias a la realimentacin que estos sensores puedan aportar.
De entre todos los sensores disponibles en el mercado se eligen los sensores
Flexiforce, por presentar un gran nmero de ventajas para nuestro proyecto:

Precio reducido
Tamao mnimo de instalacin
Simplicidad de lectura

Se trata de sensores resistivos que se pueden utilizar para medir presin o,
simplemente, como botones sin elementos mviles o finales de carrera. Un simple divisor
de tensin es todo el circuito necesario para poder medir la fuerza aplicada en el rea del
FSR.

Imagen 19: Sensor Flexiforce [7]

Tabla 2: Relacin presin-resistencia para los sensores Flexiforce [7]

Finales de carrera
Debido al descubrimiento de los sensores Flexiforce, estos sern los utilizados como
finales de carrera, normalizando as la lectura de sensores.

Sensor de presencia
Respetando la lnea de los sensores utilizados hasta el momento, se utilizar una
barrera ptica basada en una LDR y un LED. Este conjunto se situar de forma fija en la
28
posicin de carga del revlver. Por tanto, el proceso de deteccin se realizar en la
posicin de reposo del ATC, rotando cada herramienta y realizando una lectura de la LDR.
Este sistema aporta la ventaja de ser fcilmente ajustable por software al tratarse de una
medida analgica que permitir escoger el umbral de luz para cada herramienta. La
segunda ventaja es que permite ms flexibilidad para montar en el carrusel, cuyo diseo
puede verse sometido a variaciones.

4.5 Requisitos de la unidad de control
Una vez conocidos los actuadores necesarios es posible generar las especificaciones
de la unidad de control, que son los siguientes:

Control PWM de 5 servomotores a 5V (pulsos entre 600 y 2000us)
Control de 3 motores DC de menos de 1A 12V
Lectura de 5 sensores resistivos de presin
Lectura de 1 sensor resistivo de luz
Control de hasta 3 semforos de LEDs RGY
Comunicacin por Bluetooth
Espacio suficiente para aplicacin de control compatible con host CAM
Posibilidad de extensiones de comunicacin
Posibilidad de conectar panel de control (LCD + botonera)

La unidad de control debe ser robusta y debe incorporar todos los elementos
necesarios para poder conectar directamente todos los elementos sin necesidad de aadir
ningn hardware intermedio. El sistema CNC estar conectado siempre a la red, pero debe
de ser capaz de trabajar a 12V.

4.6 Diseo de la unidad de control
A partir de las especificaciones de la unidad se eligen los componentes necesarios
para desarrollar la placa:
El control PWM se realizar directamente desde el microcontrolador.
Para el control de los 3 motores DC ser necesario un driver.
Los sensores de presin se medirn con un divisor de tensin desde el micro,
utilizando su ADC al igual que el sensor LDR.
El control de los LEDs ser directo desde el microcontrolador.
Para la comunicacin Bluetooth ser necesario un mdem BT.
Se deber utilizar un microcontrolador de gran memoria para la aplicacin
futura.
Como mnimo, la placa deber disponer de dos puertos de 8 bits libres del
microcontrolador para poder conectar una pantalla LCD y una mnima
botonera.

29
4.6.1 Requisitos y eleccin driver motores
Es necesario controlar, como mnimo, tres motores de corriente continua alimentados
a 12V con un consumo inferior a 1A cada uno. El control debe ser bidireccional para el
actuador lineal y para el motor de la fresadora, puesto que se espera que esta opcin ayude
a la extraccin de la herramienta gracias a la estructura del anclaje. El motor del torno, por
el contrario, slo requiere una direccin, aunque no se descarta la posibilidad de la
bidireccionalidad.
Frente a estas necesidades, el control electrnico parece el ms adecuado descartando
la utilizacin de rels. En la categora de drivers de estas caractersticas aparece como
predilecto el integrado L293, siendo ste un chip con cuatro medios puentes H. Permite,
por tanto, controlar dos motores de hasta 36V de forma bidireccional y con proteccin
trmica. Se escoge el modelo L293DD por tratarse del encapsulado SO e incluir los diodos
de clamping necesarios, ahorrando espacio en el diseo final; por el contrario este
modelo soporta menos corriente por canal (600 - 1200mA por canal).


Imagen 20: Driver para motores DC L293DD

Se instalarn un total de dos L293DD en la placa de control, puesto que uno ser
necesario para los motores de fresado y de desplazamiento del revlver. El segundo driver
permitir realizar un control bidireccional del torno y aadir un motor DC extra en caso de
necesitarlo o incluso doblar la potencia de un motor en caso de necesidad.

4.6.2 Requisitos y eleccin mdem BT
Para permitir la comunicacin Bluetooth del dispositivo se escoge un mdem de la
marca finlandesa Bluegiga. De entre el catlogo disponible se elige el WT-11 por tratarse
de la solucin integrada ms simple. La ventaja principal de los mdulos de Bluegiga es la
transparencia que se consigue para incorporar comunicacin Bluetooth a los diseos
electrnicos, puesto que sus productos incorporan todos los elementos necesarios, desde la
antena hasta el firmware iWrap que permite una rpida configuracin del modulo va
USART.
30


Imagen 21: Mdem Bluetooth WT11 [8]

El WT-11 es un mdem BT de clase 2 con una potencia de transmisin de hasta
17dBm (hasta 100m).
La alimentacin necesaria es de 3.3V y posee un consumo en operacin de 170mA.

4.6.3 Requisitos y eleccin extras
Para dotar a la placa de control de ms versatilidad se aadirn los siguientes
elementos al diseo:

Sensor de temperatura
ADC de alta resolucin
EEPROM externa de gran tamao
Interfaz USB mediante chip FTDI para depuracin

Para normalizar el diseo, la distribucin de seales en conectores se realizar en
forma de mdulos independientes e intercambiables. Esto, junto con el puente H que queda
disponible, permitir la adicin de un conjunto extra de backup. Cada conjunto de seales
incluir:

1 Motor bidireccional
1 semforo de leds
entradas analgicas


Imagen 22: Seales estndar para cada conector

1 2
3 4
5 6
7 8
9 10
11 12
P9
MOTOR1B
FSR1
FSR2
LDR1
LED_L_GREEN
LED_L_YELLOW
VCC_5
MOTOR1A
LED_L_RED
31
Adems, se aadir un conector extra para seales I/O generales como, por ejemplo,
un final de carrera que detecte si el sistema ATC se encuentra debidamente cerrado, o una
barrera ptica, si fuese necesario. Las seales de control para los servomotores sern
independientes, puesto que stos ya se distribuyen con su cableado y conector.


Imagen 23: Seales genricas para extensiones

Tambin se prever un conector especial I2C que permitir en un futuro aadir ms
mdulos al sistema de forma sencilla. Como principal aplicacin se propone la
comunicacin con un mdulo de control de un motor de mayor potencia paa el uso del til.

4.6.4 Requisitos y eleccin uC
Una vez expuestas las necesidades y los componentes, es posible dimensionar el
microcontrolador necesario para gestionar le conjunto IO:

12 salidas digitales para el control de los motores.
12 salidas digitales para el control de LEDs.
12 entradas analgicas para la lectura de los sensores.
3 entradas/salidas digitales para propsitos generales.
3entradas analgicas para propsitos generales.
5 salidas PWM.
8 IO digitales para el control de LCD y botones
1 USART (comunicacin USB).
Bus I2C (comunicacin externa + ADC 18 bits).
Bus SPI (memoria externa EEPROM).
Gran memoria de programa.

Esto hace un total de:

35 IO digitales
15 entradas analgicas
5 salidas PWM

MASTER_SIGNAL
D_CLOSE
D_START
D_BTN_1
PULL_DOWN
PULLUP
1 2
3 4
5 6
7 8
9 10
11 12
P17
VCC_5
GND
32
De entre los productos que cumplen estos requisitos se escoge el ATMega2560, un
microcontrolador AVR de la casa Atmel con las siguientes especificaciones [9]:

4Kbytes de EEPROM
8Kbytes de SRAM
256Kbytes de FLASH con seccin para bootloader
4 contadores de 8 bits + 4 de 16 bits
16 canales PWM
16 canales ADC de 10bits
Cuatro USART
SPI
I2C
Watchdog
86 IO digitales

4.6.5 Eleccin de un comicro
Por diversas razones se ha decidido aadir al sistema un comicro que liberar de
carga al micro principal reforzando la dedicacin a la aplicacin de fresado para la que se
disea. De esta manera el comicro se encargar de gestionar las comunicaciones Bluetooth
y determinar en situaciones de operacin que mensajes debe recibir el micro principal y
cuando. Con esto se pretende conseguir menor vulnerabilidad de la aplicacin principal
frente a incorrectas gestiones por parte del operario. Los dos mircrocontroladres se
comunicarn mediante I2C siendo el comicro el esclavo. Esta configuracin tambin se
realiza en previsin de una futura fase de este proyecto que podra incluir el desarrollo de
un bootloader por I2C para el micro principal, de modo que desde cualquier dispositivo
Android con Bluetooth e Internet se podra descargar la aplicacin a la placa y sera el
comicro quin programara al micro principal y a todos aquellos que estuviera conectados
al bus I2C. Esto no obstante se decidir en el futuro.
La eleccin del comicro se ha basado en el Atmega328. Se escoge este
microcontrolador por tratarse de una solucin bien conocida con espacio de memoria
suficiente para la aplicacin puente y con asegurada compatibilidad con el micro
principal.

4.6.6 Panel de Control
El panel de control se realizar como una herramienta de acceso rpido a la
configuracin del sistema pues a diferencia de la comunicacin Bluetooth este
directamente comunicar con el microcontrolador principal.
Se tratar de un panel LCD 16x2 con comunicacin en modo 4 bits junto con cuatro
botones con circuito antibouncing y funcionalidades estndar:

Escape
Enter
Ms
33
Menos

4.6.7 Etapa de alimentacin
El sistema se alimentar a 12 V, la tensin necesaria para los motores de continua.
Para el circuito de control sern necesarios 5 V que se obtendrn de un regulador de
tensin. Para este proyecto se ha escogido el modelo MIC29300-5.0WU de Micrel en base
a los resultados obtenidos en el captulo de clculos. Este regulador puede proporcionar
3 A con picos de hasta 5 A. Para el modulo Bluetooth ser necesario aadir un regulador
de 3.3 V, en este caso el LP298 de National Semiconducor.
























34
5 Diseo y fabricacin
5.1 Herramientas utilizadas para la elaboracin de este proyecto
Este proyecto abarca diversas reas de la ingeniera y se ha apoyado en varias
herramientas de software para su desarrollo.

5.1.1 Arduino IDE
Se trata del entorno de desarrollo centrado en la placa de prototipado ms popular en
Internet actualmente, Arduino [10]. El entorno en si no se utilizar de froma directa aunque
si el conjunto de libreras que respaldan este proyecto de licencia libre. La diferencia de
este entorno en el desarrollo de aplicaciones para la familia de microcontroladores AVR de
Atmel con otros IDEs es prinicipalmente toda la comunidad que respalda el proyecto en la
red. Gracias a todas las soluciones presentes se reduce el tiempo de diseo de software
gracias al encapsulado en libreras y clases de prcticamente cualquier funcin de los uC
soportados.

5.1.2 Eclipse
Eclipse es un entorno de desarrollo software gratuito muy potente gracias al gran
nmero de extensiones que existen para utilizarlo en la programacin de prcticamente
todos los lenguajes actuales.
En este proyecto se utilizar este IDE para el desarrolo de las aplicaciones en C++ de
los microcontroladores utilizados as como su versin JAVA para el desarrollo de la
aplicacin Android que correra en el dispositivo mvil.

5.1.3 WinAVR
Esta aplicacin permite descargar los ficheros .hex generados mediante Eclipse a los
uCs. Se integra en el entorno de desarrollo Eclipse facilitando as el test de las
aplicaciones.

5.1.4 Android SDK
El kit de desarrollo de software para Android es un element necesario para poder
trabajar en la programacin de las aplicaciones mviles. Constituye todo el conjunto de
paquetes necesarios para cualquier release del sistema operativo.

5.1.5 Altium Designer
El diseo del circuito de control se ha llevado a cabo con esta herramienta al tratarse
de un software extremadamente eficiente para la creacin de placas electrnicas. Su
interfaz de usuario es extremadamente intuitiva facilitando el diseo y reduciendo el
tiempo gracias a todas las posibilidades que ofrece como sus excelentes algoritmos de
autorouting.
35
5.1.6 Diseo de esquemticos y variantes
El diseo se realiza mediante el software Altium Designer Release 10.
Para facilitar el trabajo y la revisin, el diseo se divide en cuatro hojas separando as
el proyecto en bloques funcionales.
El primer plano incluye el bloque de control bsico con todos los extras. Remarcar la
inclusin de los conectores de programacin ISP y de comunicaciones I2C. El control de
las seales de habilitacin de los drivers para motores se realiza mediante transistores. Por
defecto los tres primeros puentes se encuentran habilitados mediante resistencias de pull-
up mientras que el cuarto est deshabilitado. Tambin se puede observar como los dos
puentes del segundo driver pueden trabajar en paralelo gracias a los jumpers para tal
efecto. Tambin sealar que se aade un conector extra para otro servomotor.
El segundo plano incluye el circuito del comicro segn datasheet junto con el mdem
Bluetooth y la etapa a 3.3 V. Puesto que el mdem puede ofrecer muchas ms
funcionalidades que las previstas en este proyecto se han extrado todas sus seales para
poder acceder a ellas en caso de querer desarrollar aplicaciones ms exigentes con este
dispositivo.
El tercer plano incluye el bloque de comunicacin USB. Este bloque procede
directamente de la documentacin del chip FTDI y de los planos abiertos de la placa de
prototipos Arduino Duemilanova [10].
Finalmente el cuarto plano recoge la configuracin de los conectores. Todas las
entradas/salidas de los microcontroladores no utilizadas as como sus USARTs libres se
han extrado para hacerlas accesibles en caso de necesidad.
El diseo completo se distribuye en tres variantes de producto descritas a
continuacin. Para informacin ms detallada del PnP consultar los apndices.

Low: Es la variante menos populada. Solo consta del micro principal con los
componentes estrictamente necesarios para controlar servos, motores y
sensores. El objetivo de esta variante es tener una placa de control automtica
para pruebas de actuadores o procesos automticos.
High: Es la variante principal que incluye adems del control el bloque de
comunicacin Bluetooth. Esta variante es la diseada para que se puedan
realizar los test del sistema ATC.
Prototype: Esta variante es la ms populada y supone la unidad de control
completa puesto que soporta la configuracin por Bluetooth y la descarga de
datos desde la aplicacin CAM mediante una conexin USB.

Los esquemticos completos se encuentran en el captulo Planos.




36
5.1.7 Diseo del PCB
El diseo de la placa de circuito impreso se realiz directamente sobre Altium
utilizando sus herramientas de ruteado. El diseo se realizo en cuatro capas siendo una de
ellas plano de masa necesario para el correcto funcionamiento del mdem Bluetooth y para
la disipacin de calor de los drivers y reguladores. Las dimensiones acordadas para la placa
de control son de 150mm x 90mm.
A excepcin de los conectores todos los componentes elegidos son SMD y se han
emplazado en las caras superior e inferior. Se busca con esto conseguir mejor
aprovechamiento del espacio y eficiencia adems de facilitar el montaje automtico en
caso de requerir pequeas series para prximas fases.
Varios footprints tuvieron que ser diseados o modificados a mano por no existir en
las libreras disponibles entre ellos los condensadores polarizados y el mdem Bluetooth de
Bluegiga.


Imagen 24: Captura de pantalla del diseo 3D de la placa de control mediante Altium Designer


5.2 Fabricacin de los prototipos
5.2.1 Fabricacin de prototipos del PCB
Al tratarse de un diseo complejo de PCB, la fabricacin se encargo a Eurocircuits.
Se fabricaron para tal efecto 4 placas con objetivos de desarrollo. El tiempo requerido para
la produccin fue de dos semanas.
5.2.2 PCB del Panel de Control
Esta placa fue directamente diseada de forma manual sobre PCB debido a su
simplicidad, es por ello que en esta memoria solo se incluye el esquemtico de esta placa.
Se trata de un circuito de dimensiones 90mm x 70mm de una cara que incluye el conector
37
para el panel LCD y cuatro botones cada uno con un circuito anti-rebote. El ataque fue
mediante cloruro frrico. Entrega de componentes
Gracias a las herramientas de Altium Designer es posible comprobar la
disponibilidad de los componentes en las tiendas online. Como nico proveedor de
componentes se escogi a RS online [11], a excepcin de los conectores hembra IDC
areos de 12 vas que tuvieron que pedirse a E.E.U.U. a la empresa Windford Engineering
[12] por no encontrarse disponibles en Europa.
Para ms informacin consultar la seccin presupuesto.

5.2.3 Montaje de los prototipos
El montaje de los dos primeros prototipos (variantes Low y High) se realiz con la
colaboracin de un equipo profesional de rework y prototipado.
Posterior a su montaje las unidades de control superaron los siguientes test diseados
especialmente:

Test de visin
Una vez montadas las placas se sometieron a una estricta revisin con microscopio
de soldaduras y polaridades

Test de cortocircuitos y continuidades
El equipo de montaje comprob de forma manual y segn procedimientos
industriales la presencia de cortocircuitos y de continuidades abiertas.

Test funcional de entradas salidas
A la placa se le descarg una aplicacin de test que permiti realizar un test lecturas
de entradas y de activacin de salidas.

Test de stress con cargas
Una ltima aplicacin se descarg para verificar el funcionamiento tras largos
periodos de activacin. El test se realiza con cargas reales durante una hora durante la cual
tres motores funcionan continuamente con cambios de sentido y junto a operaciones de los
servomotores.

Una vez finalizados los test las unidades son barnizadas para protegerlas de la suciedad.

5.3 Desarrollo software
Todo el desarrollo de software para los microcontroladores de la placa de control se
ha basado en la estructura diseada para el sistema Arduino en el que la ejecucin del
cdigo se divide en dos funiones principales: setup y loop. La primera de ellas se ejecuta
38
una nica vez al inicarse el microcontrolador mientras que la funcin loop se ejecuta
indefinidamente. Esto se corresponde a la estructura bsica de programacin con una
funcin while(1).

5.3.1 FKT IO
El objetivo de esta aplicacin es el de gobernar las entradas y salidas de la placa de
control mediante un cdigo simple. Para este test se utiliza la USART 0 del ATMega2560
a modo de puerto de comunicaciones. Es necesaria la ayuda de un hardware USB externo
que permita la interconexin con el PC (el mismo circuito USB que se monta en la variante
Prototype en un PCB independiente).
El modo de trabajo es muy simple y est basado en un sistema de pregunta respuesta
en el que se enva un comando a travs de una aplicacin terminal del PC y se recibe un
comando en contestacin. En el caso de lectura de entradas esta contestacin ser el valor
ledo y en el caso de una activacin de salida se esperar una respuesta que permita
asegurar la recepcin correcta del comando.
El objetivo de este test es comprobar la integridad de la placa y de sus componentes
verificando por un lado la lectura de los niveles de entrada que se forzarn a un valor
deseado y por el otro la circuitera de salida que deber activar las cargas conectadas.
Para completar el test se ha creado un nico conjunto de cargas reales y sensores que
podrn conectarse a cada puerto de la placa aprovechando as el diseo comn de los
conectores. Este incluye un motor DC, una LDR, un LED corriente, un LED doble y dos
FSR, ms un servomotor que se conecta independientemente.

5.3.2 Heavy Duty
Esta aplicacin se disea para ser ejecutada con la placa fabricada ya montada en el
sistema final o con todas las cargas reales conectadas al mismo tiempo.
A diferencia del test IO este programa est diseado para trabajar sin comunicacin
con el PC, solo debe ejecutar un recorrido de ida y vuelta de forma continua. Este recorrido
tiene su inicio en la esquina inferior derecha de la superficie de trabajo y el final en la
esquina opuesta. Durante todo el desplazamiento la herramienta est en funcionamiento.
Este test busca comprobar el funcionamiento en modo continuo de la placa de control
para asegurar un correcto funcionamiento de los componentes en condiciones de trabajo.

La ventaja de utilizar diferentes etapas de test en lugar de utilizar la aplicacin final
reside en la facilidad para diagnosticar la raz del problema sin tener que recurrir a otras
herramientas.

5.3.3 Aplicacin de Configuracin y Control Manual
La aplicacin final que este proyecto desarrolla es una simple interfaz de
configuracin que permite modificar los valores de la EEPROM que posteriormente
definirn el funcionamiento del sistema. Esta configuracin se podr realizar tanto
mediante el uso del panel de control fsico diseado o mediante el uso de un dispositivo
39
mvil con SO Android. El uso de ambos podr ser simultaneo a excepcin de los periodos
en los que una funcin en concreto se este utilizando. Para los propsitos de este proyecto
la rutina de configuracin esta planteada para leer, controlar y configurar los siguientes
elementos:
Tres servomotores: permite mover y guardar hasta 7 posiciones para cada
uno.
Tres motores: permite girar en ambos sentidos con realimentacin de las
FSRs.
Doce LEDs: permite desactivar su uso y los utiliza para sealizar el estado de
configuracin.
Tres sensores LDR: Uno por conector, ms uno general. Permite realizar
lecturas y almacenar el nivel general de luz. Permite guardar niveles umbral
para cada uno de ellos.
Seis sensores de presin: Permite realizar lecturas.

Aplicacin principal
La aplicacin principal se encargar de manejar los datos almacenados en EEPROM
que se prev sern utilizados en el programa CAM. Tambin es la encargada de manejar
los actuadores en las opciones de control manual.
Este conjunto de funciones permitirn al usuario final realizar la comprobacin del
sistema y calibrar su funcionamiento para la aplicacin posterior (siempre que se respete la
zona de EEPROM).
La gestin de estas funciones se realizar mediante el panel de control manual o
mediante los mensajes recibidos desde el dispositivo Android previamente filtrados por el
comicro. La aplicacin en este ltimo caso solo deber gestionar los mensajes que reciba
del esclavo I2C (el comicro) y en funcin de ellos decidir que funcin realizar y con que
valores.
El panel de control solo se ha instalado como solucin de emergencia para la
resolucin de problemas, es por ello por lo que su funcionamiento se controla desde la
aplicacin principal, esto puede penalizar los tiempos de trabajo del sistema final por la
necesidad de aadir un sistema de polling para determinar cuando se utiliza el teclado, o
bien por la inclusin de una rutina de atencin a la interrupcin. No obstante de esta forma
se asegura un control robusto sobre la aplicacin principal.
Para el sistema de men que utiliza el panel de control se ha creado una estructura de
datos que conforma cada elemeno del men. Esta estructura se presenta de forma grfica a
continuacin:

40


Imagen 25: Estructura Visual del Men.

Como se puede observar cada opcin del men se compone de diversos elementos:

El ndice de la opcin, que la situa en el array.
El ttulo, que indica el nivel de la opcin.
El nombre de la opcin, con fines descriptivos.
El ndice de las opciones de igual jerarqua anterior y siguiente.
El ndice de la opcin de jerarqua superior.
El ndice, si existe, de la opcin de jerarqua inferior.
El nombre, si existe, de la funcin que esa opcin debe ejecutar.


typedef struct{
int nmenu;
String title;
String text;
int menuback;
int menuenter;
int menuplus;
int menuminus;
void (*PtrFuncSel)();
}menu;

Cdigo 1: Estructura del men.



De esta forma la gestin del men se simplifica al cargar la opcin correspondiente
segn la tecla presionada, con la excepcin de las opciones finales que deben ejecutar una
funcin especfica, en ese caso el ndice de la opcin para la tecla Enter es 33 y el
41
programa en lugar de cargar el men ejecuta la funcin que seala el puntero de la
estructura.

El men completo de muestra a continuacin:


Imagen 26: Diagrama del men de configuracin

Las funciones de lecturas y escritura de EEPROM, as como las de control de
servomotores, motores DC, conversor AD y otras se han basado en librerias abiertas
sobretodo de la comunidad Arduino (la mayora modificadas para este proyecto) as como
libreras propias del autor. Las clases presentes en estas librerias no se muestran en este
documento al entenderse que el lector interesado podr recurrir a los medios digitales.
Aplicacin Comicro
El comicro se plante como una solucin para asegurar una menor carga del micro
principal durante su operacin y a la vez como un sistema de seguridad de filtrado de los
mensajes recibidos por Bluetooth. La tarea principal debe ser por tanto la de recibir
cualquier comunicacin entrante y decidir si el micro principal debe o no atenderla y
cuando. Adems deber formatear los datos para poder enviar a travs del bus I2C.
42
Otra tarea de la que se debe ocupar es de reclamar los datos que se pidan desde la
aplicacin Android al micro principal cuando sea necesario (y seguro) y formatearlos
posteriormente como JSON para poder ser correctamente tratados por la aplicacin. JSON
(JavaScript Object Notation) no es ms que un formato ligero para el intercambio de datos
que consiste en una cadena de caracteres que de por si constituyen un array. Es muy
popular sobretodo para la descarga de informacin desde Internet, sobretodo cuando se
quiere prescindir del XML. El lenguaje Java ya incorpora herramientas para recuperar los
datos necesarios de una forma transparente y de esta manera se elimina la necesidad de
enviar dato por dato con su correspondiente gestin de los mensajes. As pues las tareas a
realizar por el comicro quedan descritas en la siguiente flowchart:


Imagen 27: Flowchart de la aplicacin del comicro

Se han utilizado en esta aplicacin las libreras Amarino [13] que permiten establecer
de una forma fcil la comunicacin Bluetooth entre un microcontrolador Atmel y un
dispositivo Android. Estas libreras poseen las funciones de inicalizacin que incluyen el
handshake as como las tareas de envio y recepcin que permiten al programador reducir el
tiempo de desarrollo.

43
Aplicacin Android
La aplicacin Android deber mostrar una interfaz amigable al usuario y establecer
comunicacin con el comicro para el intercambio de datos, encargndose de procesar los
JSON recibidos para mostrarlos por pantalla.
Al tratarse de una aplicacin puramente software se omitir la descripcin de este
cdigo (presente como apndice) al entenderse que la implicacin de este apartado con la
lnea general del proyecto es mnima en comparacin con toda la informacin que debera
incluirse para facilitar al lector un correcto entendimiento del programa, teniendo adems
en cuenta que la programacin basada en Java no es objeto de estudio en el la ingeniera
que nos ocupa.
Como muestra del programa se aaden unas capturas de pantalla:


Imagen 28: Men de configuracin de la aplicacin Android


Imagen 29: Configuracin de las posiciones del servo 1





44

















Todas las pantallas se han diseado en XML optimizando las presentaciones para
ambas orientaciones.
















Imagen 30: Men de control manual (izquierda) y Opcin de configuracin de los niveles de luz
45
6 Clculos
6.1 Consumo total de la unidad de Control

Dispositivo Reposo Operacin
Motor 70mA 200mA (sin regular)
Servomotor 3mA 600mA (tpico)
Motor driver 60mA 44mA
ATmega2560 NA 14mA
ATmega328 NA 7mA
FTDI chip NA 15mA
BT modem 1.5mA 150mA (reg. 3.3V)
Temp sensor NA 1mA
18 bit A/D 0.5uA 190uA
EEPROM 2uA 5mA
LCD panel 1.5mA 4mA
LCD backlight 0 120mA
Tabla 3: Consumo de los componentes utilizados en el diseo

6.1.1 Peor caso 5V
El pero caso para dimensionar el circuito de alimentacin de %v incluye las
siguientes condiciones:
Sensores resistivos en cortocircuito reduciendo la resistencia total de las 12
redes de sensado a 10K.
o IsT12 Is 12
5V
10K
12 0.5 6
Variante con los dos microcontroladores en funcionamiento.
o I
mic
= 14mA + 7mA = 21mA
Mdem Bluetooth en modo TX, mximo consumo limitado por el regulador
de 3.3V.
o I
BT
= 150mA
Estado en acceso a EEPROM externa.
o I
EEPROM
= 5mA
Entrada lgica a nivel bajo de los drivers (peor caso).
o I
dr
= 4 60mA = 240mA (Cuatro motores activos)
Tres servomotores en rotacin (ejes).
o I
serv
= 3 600mA + 2 3mA = 1806mA
Sensor de temperatura en conversin.
o I
temp
= 1mA
FTDI chip recibiendo datos.
o I
usb
= 15mA
46
Todos los LEDs activos
o I
led
= 7 30mA = 210mA
Panel de control conectado y todos los botones presionados
o IbutT4 Ibut 4
5V
10K
4 0.5 2
LCD panel activo con Backlight On
o I
LCD
= 4mA + 120mA = 124mA

As que en el peor caso el regulador debe ser temporalmente capaz de entregar:
I
T
= I
sT
+ I
mic
+ I
BT
+ I
EEPROM
+ I
dr
+ I
serv
+ I
temp
+ I
usb
+ I
led
+ I
butT
+ I
LCD

I
T
= 6 + 21 + 150 + 5 + 240 + 1806 + 1 + 15 + 210 + 2 + 124
I
T
= 2580mA

Aunque el proceso deber asegurar que esta condicin nunca se de puesto que podra
poner en peligro la integridad del PCB al tratarse de corrientes tan elevadas.



















47
7 Planos

P1 Hoja 1 del esquemtico
P2 Hoja 2 del esquemtico
P3 Hoja 3 del esquemtico
P4 Hoja 4 del esquemtico
P5 Planos Panel de control
P6 PCB vistaTop
P7 PCB Top layer
P8 PCB Ground Layer
P9 PCB Inner Plane
P10 PCB Bottom Layer
P11 PCB Vista Bottom
P12 PCB Mechanical Layer (Eurocircuits)
















49

50

51
52

53

54

55

56

57

58

59

8 Presupuesto
La informacin de costes que se presenta en este captulo hace referencia al esbozo
del sistema de fresado y al diseo y fabricacin de la unidad de control y considera el
desarrollo del proyecto como un encargo desde cliente externo.
El total de costes se ha divido en bloques segn etapas de desarrollo.
No se incluyen costes de fabricacin del sistema mecnico ni de accionamientos o
sensores puesto que para la elaboracin de este proyecto no se ha fabricado el prototipo de
la fresadora.

8.1 Estudio y diseo
En este apartado se consideran todos los costes derivados de las reuniones con cliente
para la recopilacin de especificaciones y discusin de alternativas. Incluye tambin el
diseo hardware de la unidad de control mediante software CAD y la revisin de los
planos. Tambin se incluye la fabricacin del PCB.

Diseo HW &
PCB
Materiales Trabajadores
Parcial Total
Tipo
Cantidad
(unidad)
Coste
(/unit)
Categoria Horas
Coste
(/h)
Diseo HW 460,0
Reuniones con
cliente
- - - Engineer 4 30 120,0

HW spec.
Documento
- - -
Junior
Engineer
2 20 40,0
Schematics
design
- - -
Junior
Engineer
6,5 20 130,0
Revision
esquemticos
- - - Engineer 1,5 30 45,0
Diseo PCB - - -
Junior
Engineer
4 20 80,0
Revisin PCB - - - Engineer 1,5 30 45,0
Fabricacin PCB 107,3
PCB 4 layer PCB 2 45,18 Outsource - - 90,4
Otros
Gastos de
gestin
1 16,94 Outsource - - 16,9
PCB panel de
control
Atacado 0,5 25,64
Laboratory
Technician
1 8 20,8
Diseo HW & PCB
567,3

61
8.2 Componentes
El listado de componentes se presenta a continuacin junto con los precios. Las
cantidades estn ajustadas a las necesidades del proyecto y a los mnimos de adquisicin
fijados por el proveedor:

Ref Prov. Qty.
Descripcin
Precio
Unidad
Total
522-4992 5 15-bussed SMT resistor network,10K 0,516 2,58
727-4790 5 LDO Regulator Pos 5V 1A 1,102 5,51
666-4530 2 MCU 8-Bit ATmega RISC 256KB FL TQFP100 17,370 34,74
691-7500 5 0805 PTC Resettable Fuse, 200mA 0,434 2,17
714-0625 5 4-Channel Motor Driver 24V, SOIC20 3,430 17,15
669-6076 2 8-bit DST ADC,1 ch,4sps,MCP3421A0T-E/CH 2,910 5,82
721-7924 5 Anti-Surge Resistor, 0805, 0.25W,1%,150K 0,132 0,66
537-846 1 Bluetooth 2.1 Module with Class 1 RF 34,230 34,23
159-4685 3 C.I. de conversin de seal,LM335Z TO92 1,500 4,50
691-1161 10 Capacitor 0805 10uF 16V 0,372 3,72
684-3998 10 Capacitor Tantalum SMT 293D 20V 2.2uF 0,141 1,41
666-5662 1 Carbide PCB drill bit 1/8" shank 0.90mm 3,780 3,78
264-4258 25 Cond cermico SMD 0805 C0G,22pF 50V 0,038 0,95
264-4450 25 Cond cermico SMD 0805 Y5V,1uF 16V 0,094 2,35
264-4422 100 Cond cermico SMD 0805 Z5U,0.1uF 50V 0,026 2,60
407-0025 5 Condensador de tntalo SMD TPS,22uF 16V 0,988 4,94
679-1049 50 CRCW0805 Resistor T/R 0.125W,1%,1M 0,044 2,20
679-1187 50 CRCW0805 Resistor T/R 0.125W,1%,27R 0,012 0,60
679-1207 50 CRCW0805 Resistor T/R 0.125W,1%,2K2 0,021 1,05
478-9505 10 Crystal SMD 16.000MHz HC49S-SMD 0,439 4,39
629-0473 10 DIODE SMD GF1G 0,237 2,37
686-2258 5 EEPROM SPI 256KBit 5MHz SOIC8 1,868 9,34
435-541 1 Eurocard de doble cara,220x100mm 5,300 5,30
487-848 2 Hembra Aliment,PCB,2,1mm 5A 250V 2,500 5,00
720-0213 1 LCD, alphanumeric 16x2, STN, reflective 8,170 8,17
466-3908 40 LED chip transp 1206 verde KP-3216SGC 0,069 2,76
535-9111 5 LM335M Precision temperature sensor,SO8 1,068 5,34
738-0432 5 MCU 8-Bit AVR 32KB Flash 2.5/3.3/5V 3,200 16,00
725-0101 2 mm SMD sealed Trimmer Pot, 10K,25% 1,080 2,16
737-3005 10 NIC Components NAWU330M25V6.3X6.3LBF 0,264 2,64
661-0549 10 OP Amp Dual GP 16V/32V 8-Pin SOIC 0,130 1,30
734-6763 4 Pushbutton Switch,DP,on-mom,PCB term 1,460 5,84
652-0033 4 Regulador lineal tensin,LP2985AIM5-3.3 0,570 2,28
740-9072 50 SMD 0805 thick film resistor 10K 5% 0,014 0,70
740-9063 50 SMD 0805 thick film resistor 1K 5% 0,014 0,70
740-9035 50 SMD 0805 thick film resistor 47K 1% 0,016 0,80
740-9031 50 SMD 0805 thick film resistor 4K7 1% 0,016 0,80
671-0435 5 Trans MOSFET P-CH 20V 2A 3-Pin SuperSOT 0,636 3,18
406-580 2 USB to serial TTL level UART FT232RL 5,000 10,00
62
748-0866 3 WR-COM USB Connector B horizontal 1,070 3,21
Winford 6 Connector IDC 12 vias aereo 2.54mm 1,430 8,58


Total 231,82

Gestin 8,00

IVA 41,73

Suma 281,55


8.3 Fabricacin de prototipos
La fabricacin de los prototipos requiere un laboratorio y tcnico especializado en
soldadura SMD. En el precio por hora se incluye el coste de utilizacin del equipo
necesario.
Como ya se especifico anteriormente cada unidad se testea completamente antes de
enviarla a cliente.

Fabricacin y
Test
Materiales Trabajadores
Parcial Total Tipo Cantdad (g)
Coste
(/g) Categoria Horas
Coste
(/h)
Fabricacin prototipo 49,8
Revisin
documentacin
- - -
Laboratory
Technician
0,5 8 4,0

Colocacin de
componentes
Flux y
pasta
10 0,868
Laboratory
Technician
0,5 8 12,7
Soldadura Estanyo 100 0,064
Laboratory
Technician
2 8 22,4
Barnizado Barniz 200 0,0136
Laboratory
Technician
1 8 10,7
Tests & validacin 48,0
Inspeccin
ptica
- - -
Laboratory
Technician
0,5 8 4,0

Short test - - -
Laboratory
Technician
0,5 8 4,0
I/O test - - -
Junior
Engineer
1 20 20,0
FKT test - - -
Junior
Engineer
1 20 20,0
Fabricacin y Test 97,8

63
8.4 Desarrollo de SW
Incluye el desarrollo de la aplicacin de configuracin para las tres unidades
implicadas as como el desarrollo de las aplicaciones para el test de las unidades
fabricadas.

Desarrollo Sw
Trabajadores
Parcial Total Categoria Horas Coste (/h)
Diseo Sw 150,0
Arquitectura Engineer 1 30 30,0
Desarrollo de cdigo
Junior
Engineer
3 20 60,0
Aplicacin Host
Android
Engineer 2 30 60,0
SW Test 30,0
Aplicacin test estrs
Junior
Engineer
0,5 20 10

Aplicacin test FKT
Junior
Engineer
1 20 20
Desarrollo Sw
180,0

8.5 Generacin de la documentacin
Solo tareas de documentacin

Documentacin
de proyecto
Trabajadores
Parcial Total Categora Horas Coste (/h)
Documentacin 160,0
Generacin de
documentacin
Junior Engineer 3 20 60,0

Generacin
planos
Junior Engineer 4 20 80,0
Revisin
documentacin
Junior Engineer 1 20 20,0
Documentacin de proyecto
160,0


8.6 Costes Globales del Proyecto
La suma total de costes se especifica en la siguiente tabla. Este precio incluye el
desarrollo del proyecto as como la fabricacin de dos prototipos de variantes High y Low
completamente funcionales.

64
Componentes y materiales 281,55
Diseo Hw y fabricacin PCB 567,30
Manufactura y Test 97,80
Diseo Software 180,00
Documentacin de proyecto 160,00

Total project cost (two prototypes) 1.286,65





























65
9 Conclusiones
El enfoque propuesto en este proyecto para el sistema de cambio automtico de
herramienta a resultado interesante desde diversos puntos de vista pero sobretodo para la
concepcin de un sistema de fresado compacto y original de buenas caractersticas para un
uso espordico no profesional.
Debe tenerse en cuenta que la estructura de fresadora propuesta abre una abanico de
posibilidades ms amplio que el expuesto aqu, dado que en este caso el proyecto se ha
visto limitado por los objetivos de simplicidad y de economa al tratarse de una primera
aproximacin a lo que en futuras revisiones debe presentarse como una solucin completa.
Partiendo de esta idea principal el desarrollo de la placa de control ha sido una tarea
complicada por el nmero de restricciones propuestas en el planteamiento del proyecto. El
propsito de dichas restricciones estaba bien claro y de esta manera pretendan facilitar el
objetivo final para el que debe servir el sistema aqu descrito (la validacin de la solucin
ATC y de anclaje), no obstante han apartado al diseo completamente de las pautas
generales para este tipo de mquinas en las que predominan los motores paso a paso como
accionamientos principales y donde el til fresador no se ve limitado por una alimentacin
en corriente continua de baja tensin.
A pesar de estas diferencias se ha conseguido cumplir con las especificaciones, y lo
que es ms importante, producir una placa de control con un alto grado de polivalencia
gracias a detalles como las variantes de diseo, las funcionalidades aadidas, y la
normalizacin de las seales de los conectores. Tanto es as que el producto de este
proyecto ya se encuentra hoy en da en otros dispositivos.
La capacidad del sistema se ha podido demostrar con la aplicacin de configuracin,
requeriendo esta una distribucin de software completa para dos microcontroladores y un
dispositivo Android genrico con Bluetooth. Cabe remarcar el uso de estas dos tecnologas
(tanto el Bluetooth como el uso de Smartphones como paneles de control) dentro del
proyecto para dotar al producto de capacidades innovadoras dentro las opciones presentes
en el mercado.
Como conclusin final se puede afirmar que se han conseguido las metas propuestas
para este trabajo de forma satisfactoria, pero adems se han asentado las bases para un
desarrollo ms profundo de una fresadora por control numrico que en futuros estudios
requerir una mayor precisin en la elaboracin de los planos mecnicos y un rediseo de
la placa de control en base a los resultados de las pruebas que se lleven a cabo con el
sistema ATC descrito, para producir finalmente una herramienta capaz de introducirse en
el mercado.








66
Referencias

[1] US Army, Milling Machine Operations, 1988
[2] http://www.vortechcnc.com/accessories.html
[3] http://mfgnewsweb.com/archives/general_editorials/jan06/DMG_ultra.htm
[4] http://www.hitecrcd.com/
[5] http://www.tridenteng.co.uk/
[6] http://www.mfacomodrills.com/
[7] http://www.tekscan.com/flexiforce.html
[8] http://www.bluegiga.com/home
[9] http://www.atmel.com/devices/atmega2560.aspx
[10] http://www.atmel.com/devices/atmega2560.aspx
[11] http://es.rs-online.com/web/
[12] http://www.winfordeng.com/
[13] http://www.amarino-toolkit.net/
















67
Apndice A: Cdigo Aplicacin de Configuracin (Eclipse IDE)

/*
// Created 25/02/2012
// by Jorge Hermoso <jorges119@hotmail.com>
// for XXXXXXXXX.com and URV
*/


#include "CNC.h"

typedef struct{ //Esructura para el men, consultar memoria
para ms informacin
int nmenu;
String title;
String text;
int menuback;
int menuenter;
int menuplus;
int menuminus;
void (*PtrFuncSel)();
}menu;

const int Enter = 78;
const int Back = 38;
const int Plus = 12;
const int Minus = 13;

//Mensajes display--------------------------------------
const String twelcome = "CNC v02";
const String tenter = "Pulse Enter";
const String tautoma = "Ini Work";
const String tmenu = "Menu";
const String tconfig = "Configuracion";
const String tBT = "Bluetooth";
const String tmanual = "Ctrl Manual";
const String tservo1 = "Servo 1";
const String tservo2 = "Servo 2";
const String tservo3 = "Servo 3";
const String tposicion = "Posicion";
const String tcarga = "Carga";
const String tsubir = "Subir";
const String tbajar = "Bajar";
const String tluz = "Niveles de luz";
const String tsup = "Sens Pres Up";
const String tsdown = "Sens Pres Down";
const String tosc1 = "Oscur 1";
const String tosc2 = "Oscur 2";
const String tosc3 = "Oscur 3";
const String tmotor1 = "Motor 1";
const String tmotor2 = "Motor 2";
const String tmotor3 = "Motor 3";
const String tON = "On";
const String tOFF = "Off";
const String tCargar = "Cargar";
const String tper1 = "Porcentaje inf 1";
const String tper2 = "Porcentaje inf 2";
const String tper3 = "Porcentaje inf 3";
const String tleds = "Estado Leds";


const menu Menus[] = {
{0, "", "", NULL, NULL, NULL, NULL, NULL},
{1, tmenu, tconfig, 0, 4, 2, 21, NULL }, //Configuracion
{2, tmenu, tmanual, 0, 13, 3, 1, NULL }, //Manual
{3, tmenu, tBT, 0, 19, 21, 2, NULL }, //Bluetooth
{4, tconfig, tservo1, 1, 33, 5, 22, servoconf}, //Configuracion S1
{5, tconfig, tservo2, 1, 33, 6, 4, servoconf}, //Configuracion S2
68
{6, tconfig, tservo3, 1, 33, 7, 5, servoconf}, //Configuracion S3
{7, tconfig, tluz, 1, 33, 8, 6, lightconf}, //Ver nivel luz
{8, tconfig, tsup, 1, 33, 9, 7, upconf}, //Configuracion L2
{9, tconfig, tsdown, 1, 33, 10, 8, downconf}, //Configuracion L3
{10,tconfig, tper1, 1, 33, 11, 9, perconf}, //Configurar umbrales
{11,tconfig, tper2, 1, 33, 12, 10, perconf}, //Configurar umbrales
{12,tconfig, tper3, 1, 33, 22, 11, perconf}, //Configurar umbrales
{13, tmanual, tservo1, 2, 33, 14, 18, moveservo}, //S1
{14, tmanual, tservo2, 2, 33, 15, 13, moveservo}, //S2
{15, tmanual, tservo3, 2, 33, 16, 14, moveservo}, //S3
{16, tmanual, tmotor1, 2, 33, 17, 15, movemotor}, //M1
{17, tmanual, tmotor2, 2, 33, 18, 16, movemotor}, //M2
{18, tmanual, tmotor3, 2, 33, 13, 17, movemotor}, //M3
{19, tBT, tON, 3, 33, 20, 20, poscarga}, //BT ON
{20, tBT, tOFF, 3, 33, 19, 19, NULL}, //BT OFF
{21, tmenu, tCargar, 0, 33, 1, 3, poscarga}, //Inicializacin
{22, tconfig, tleds, 1, 33, 4, 12, enableleds} //Deshabilitar leds
};

menu currentmenu = {0, "", "", NULL, 0, NULL, NULL, NULL}; //variable
temporal para la carga del menu en uso

int outmenu=0;
bool flagleds = true;
//-----------------------------------------------------------

Servo servo[4];
mOtor motor[4];

int temp; //variable para lectura temporal de EEPROM
int posToSet = 0; //Variable para almacenar la posicin a grabar

int light[4];
int dark[4];
int sensPdown[4] = {9, A1, A4, 12}; //sensores de presion posicion A
int sensPup[4] = {10, A2, A5, 13}; //sensores de presion posicion B
int sens[4] = {8, A0, A3, A11}; //sensores de luz



int pos[4][9] = { // array para almacenar
//las posiciones de los servos,
{1,2,3,4,5,6,7,8,9}, //4 servos 9 posiciones para cada uno
{10,11,12,13,14,15,16,17,18}, //permite tratar de la misma
//manera al servo del ATC
{19,20,21,22,23,24,25,26,27}, //y a los servos de posicionamiento
//para los que se guardaran
{28,29,30,31,32,33,34,35,36}}; //las posiciones crticas

int memMaster = 37; //espacio de memoria para lectura
//analgica del conector global
int per[4]= {20,20,20,20}; //umbrales por defecto
int memper[4]= {38,39,40,41}; //espacios de memoria para los
//valoRes umbrales

int giro[4] = {0,0,0,0}; //variable indice de posicion en el array
//de posiciones de servomotores

int posini[4][7] = { // array con las posiciones iniciales de
//los servomotores
{0,1,2,3,4,5,6},
{16, 26, 37, 49, 60, 72, 90},
{16, 26, 37, 49, 60, 72, 90},
{16, 26, 37, 49, 60, 72, 90}};


int mAster = A6; //pin lectura analgica global
int tApa = 70; //PIN 70 AADIDO A PINS_ARDUINO EN C:\arduino-
//0022\hardware\arduino\cores\arduino
69
int tApaLow = 84; //pin para habilitacin deteccin de tapa cerrada

int sensorValue[4] = {0,0,0,0}; //v temporal para lectura analgica
int sensorMaster = 0; //v temp para lectura de la
//entrada analgica global
int sensorTapa = 0; //variable temporal para la
//lectura del estado de la tapa

int green[4] = {34,23,26,31}; //salidas de los LEDs
int red[4] = {35,24,27,32};
int yellow[4] = {33,22,25,30};

int flagini =0; //Flag que determina si puede empezar o no
//la aplicacin de mecanizado

int nservo = 1; //numero de servo en uso
int npos = 0; //posicion inicial dentro
//del array

LiquidCrystal lcd(79, 39, 40, 41, 82, 81); //Creacin del objeto LCD
//segn librerias OpenSource


//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

void setup() {

lcd.begin(16,2);
lcd.print("Inicializando...");

//motor[0].wire(1,2); //motor sin uso
motor[1].wire(48,49); //creacin motor para el
desplazamiento del carrusel
motor[2].wire(47,46); //creacin motor del til
//motor[3].wire(45,44); //motor sin uso



for (int hole=0; hole<=4; hole++)
{
for (int dir = 0; dir <= 6; dir++) { //loop para recuperar
todas las posiciones de memoria
temp = EEPROM.read(pos[hole][dir]);
posini[hole][dir] = temp;
}
}
servo[0].attach(9); //Creacin de
los servomotores
servo[0].write(posini[1][0]); //Y situacin en la
posicin inicial
delay(1000);
servo[1].attach(6);
servo[1].write(posini[1][0]);
delay(1000);
servo[2].attach(7);
servo[2].write(posini[2][0]);
delay(1000);
servo[3].attach(8);
servo[3].write(posini[3][0]);
delay(1000);


for (int i=0; i<=3; i++) //Declaracin
de los pines de LEDs como salidas
{
pinMode(green[i], OUTPUT);
pinMode(red[i], OUTPUT);
70
pinMode(yellow[i], OUTPUT);
}

pinMode(84, OUTPUT); //Declaracin de salidas y entradas del sistema
pinMode(80, OUTPUT);
pinMode(4, OUTPUT);
pinMode(tApa, INPUT);
pinMode(19, INPUT);
pinMode(18, INPUT);

//Carga de datos de memoria----------------------------------------------


for (int hole=0; hole<=3; hole++) //recuperacin de los datos
//almacenados en EEPROM
{
temp = EEPROM.read(memper[hole]);
per[hole] = temp;
}


Wire.begin(1); //Inici de la comunicacin I2C

digitalWrite(tApaLow, LOW); //Habilitacin seal de tapa cerrada
delay(500);

//esperar con tapa abierta



for (int hole=0; hole<=3; hole++)

//Iluminacin LEDS rojos y amarillos para sealar configuracin


{
onRed(hole);
onYellow(hole);
}

delay(2000);


if (digitalRead(tApa) == HIGH) panel();
//Si la seal de tapa abierta est activa se lanza
else {
//la rutina de configuracin configuracin
lcd.clear();
//De lo contrario se borra el LCD y se apagan los leds
offYellow(0);
offYellow(1);
offYellow(2);
offYellow(3);
}

flagini = 1;
//Una vez aqu se activa el flag que sealiza el inicio de operacin

onGreen(0);
//LEDs en verde para sealar mquina activa
onGreen(1);
onGreen(2);
onGreen(3);

delay(1000);
}

void loop(){

71
// XXX Aplicacin de trabajo

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------FUNCIONES ESPECIFICAS---------------------------------
//-----------------------------------------------------------------------
void onRed(int nhole) //Funcin que activa LED rojo
{
if (flagleds==true){
digitalWrite(red[nhole], HIGH);
digitalWrite(green[nhole], LOW);
}
}

void onGreen(int nhole) //Funcin que activa LED verde
{
if (flagleds==true){
digitalWrite(red[nhole], LOW);
digitalWrite(green[nhole], HIGH);
}
}

void offRed(int nhole) //Funcin que desactiva LED rojo
{
digitalWrite(red[nhole], LOW);
digitalWrite(green[nhole], LOW);
}

void offGreen(int nhole) //Funcin que desactiva LED verde
{
digitalWrite(red[nhole], LOW);
digitalWrite(green[nhole], LOW);
}

void onYellow(int nhole) //Funcin que activa LED amarillo
{
if (flagleds==true){
digitalWrite(yellow[nhole], LOW);
}
}

void offYellow(int nhole) //Funcin que desactiva LED amarillo
{
digitalWrite(yellow[nhole], HIGH);
}

void motordown(int nhole)
//mueve el motor en un sentido hasta activar FSR
{
motor[nhole].onCCW(); //bajar
sensorValue[nhole] = analogRead(sensPdown[nhole]);
if (nhole ==1) {
//Si se trata del motor del til solo moverlo durante 2 segundos
motor[nhole].onCCW();
delay (2000);
motor[nhole].off();
}

else if (sensorValue[nhole] > 200) {
delay (500);
sensorValue[nhole] = analogRead(sensPdown[nhole]);

if (sensorValue[nhole] > 200){
motor[nhole].off();
}
}

72
else {
motor[nhole].onCCW(); //bajar
}
}


void motorup(int nhole)
//mueve el motor en otro sentido hasta activar FSR
{
motor[nhole].onCW();

sensorValue[nhole] = analogRead(sensPup[nhole]);
if (nhole ==1) {
//Si se trata del motor del til solo moverlo durante 2 segundos
motor[nhole].onCW();
delay (2000);
motor[nhole].off();
}
else if (sensorValue[nhole] > 200){
delay (500);
sensorValue[nhole] = analogRead(sensPup[nhole]);

if (sensorValue[nhole] > 150){
motor[nhole].off();
}

}

else {
// turn LED on:
motor[nhole].onCW();
}
}

void panel()
//Funcin que gestiona el menu LCD e incluye menu BT
{
pinMode(Enter, INPUT);
pinMode(Back, INPUT);
pinMode(Plus, INPUT);
pinMode(Minus, INPUT);

offRed(0);
offGreen(0);
offYellow(0);
offRed(1);
offGreen(1);
offYellow(1);
offRed(2);
offGreen(2);
offYellow(2);
offRed(3);
offGreen(3);
offYellow(3);


int tecla=0;
//Rutina inicial Si pulsa enter continuamos
fshownumber();

while (outmenu!=1){
//flag que determina cuando se sale del menu
//delay(800);
tecla = teclapulsada();

switch(tecla){
case 1: //Enter
menuenter(currentmenu.menuenter);
//cargamos el menu elegido
73
break;
//si se pulsa la tecla enter puede querer

//cargar una aplicacin
case 2: //Back
loadmenu(currentmenu.menuback);
break;

case 3: //Plus
loadmenu(currentmenu.menuplus);
break;

case 4: //Minus
loadmenu(currentmenu.menuminus);
break;

default:

break;
}
tecla = 0;
bt_config();
//Aqu es donde se lanza la rutina BT, mientras se espera tecla pulsada
}
//de esta manera los dos mtodos de configuracin son compatibles
digitalWrite(4, LOW);
//Cuando se sale del menu se apaga el LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Cerrar tapa...");

while (digitalRead(tApa) != LOW)
//Se espera a que la seal de tapa cerrada est inactiva
{
}


}

int teclapulsada(){
//Detecta si se ha pulsado una tecla, cual es y efecto antibounce
int index = 0;
if (digitalRead(Enter)== LOW){
while (digitalRead(Enter)== LOW){}
delay(500);
index =1;
}
else if (digitalRead(Back)== LOW){
while (digitalRead(Back)== LOW){}
delay(500);
index =2;
}
else if (digitalRead(Plus)== LOW){
while (digitalRead(Plus)== LOW){}
delay(500);
index =3;
}
else if (digitalRead(Minus)== LOW){
while(digitalRead(Plus)== LOW){}
delay(500);
index =4;
}
return index;
}

void menuenter(int menustep)
//Rutina que carga el menu o la aplicacin correspondiente
{
//Si el cdigo es 33 significa que debe ejecutar la funcin del puntero
74
void (*PtrComando)(void);

//Cargas las variables del menu que toca
if (currentmenu.menuenter !=33)
{
currentmenu = Menus[menustep];
lcd.clear();
lcd.setCursor(0,0);
lcd.print(currentmenu.title);
lcd.setCursor(0,1);
lcd.print(currentmenu.text);
}
else
{
PtrComando = currentmenu.PtrFuncSel;
PtrComando();
}
}

void loadmenu(int menustep)
//Rutina que carga el menu correspondiente
{
if (menustep == 0)
{
outmenu = 1;
goto endloadmenu;
}

//Cargas las variables del menu que toca
currentmenu = Menus[menustep];
lcd.clear();
lcd.setCursor(0,0);
lcd.print(currentmenu.title);
lcd.setCursor(0,1);
lcd.print(currentmenu.text);

endloadmenu:
while (0) {}
}

void fshownumber()
//Funcion que permite acceder al menu en un tiempo determinado

{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(twelcome);
lcd.setCursor(0,1);
lcd.print(tenter);

for (int thisChar = 20; thisChar > 0; thisChar--)
{
lcd.setCursor(12,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print(thisChar);
delay(1000);
if (digitalRead(Enter) == LOW)
{
delay (200);
while (digitalRead(Enter)== LOW){}
goto endloop;
}
}
goto endmenu;

endmenu:
outmenu = 1;

75

endloop:
digitalWrite(80, LOW);
digitalWrite(4, HIGH);
loadmenu(1);
}

void servoconf()
//Funcin que permite la configuracin de las posiciones de los servos
{
//El incremento de posiciones se acelera para reducir el tiempo

int nser = 0;
int npos = 0;
int tecla = 0;
int speed = 1;

switch (currentmenu.nmenu)
{
case 4:
nser=1;
break;
case 5:
nser=2;
break;
case 6:
nser=3;
break;
}

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Servo ");
lcd.print(nser);


while (digitalRead(Back)!= LOW){
lcd.setCursor(0,1);
lcd.print("Pos ");
lcd.print(npos);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
servo[nser].write(posini[nser][npos]);

//Aumentar-------------------------------------------------
if (digitalRead(Plus)== LOW){
speed = 20;
while (digitalRead(Plus)== LOW){
if (posini[nser][npos] <= 180)
posini[nser][npos] ++;
//Se decrementa un paso la posicin actual
servo[nser].write(posini[nser][npos]);
//actualiza la posicin del servo
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
delay (500/(speed/20));
speed += 10;
}
}

//Disminuir--------------------------------------------------
-
if (digitalRead(Minus)== LOW){
speed = 20;
while (digitalRead(Minus)== LOW){
76
if (posini[nser][npos] >= 3) posini[nser][npos]
--; //Se decrementa un paso la posicin actual
servo[nser].write(posini[nser][npos]);
//actualiza la posicin del servo
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
delay (500/(speed/20));
speed += 10;
}
}
tecla = teclapulsada();
if (tecla== 1)
{
if (npos <= 9)
{
npos++;
}
else
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardar?");
tecla=teclapulsada();
while (tecla==0){
tecla=teclapulsada();
}
if (tecla== 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardando...");
for (int dir = 0; dir <= 6; dir++)
{ //loop para recuperar todas las posiciones de memoria
EEPROM.write(pos[nser][dir],
posini[nser][dir]);
delay (500);
}
lcd.setCursor(0,1);
lcd.print("Guard con exito!");

servo[nser].write(posini[nser][0]);
delay (2000);
goto salir;
}
else if (tecla == 2)
{
goto salir;
}
}
}

else if (tecla == 2)
{
goto salir;
}
}

salir:

loadmenu(currentmenu.menuback);
}

void lightconf()
//Funcin que muestra por pantalla los niveles analgicos
{
//Y permite guardar el nivel del sensor global
int tecla= 0;
vuelta:
77

lcd.clear();
lcd.setCursor(0,0);
lcd.print("H1 H2 H3 M");

while (digitalRead(Back)!= LOW)
{

sensorValue[1] = analogRead(sens[1]);
delay(20);
sensorValue[2] = analogRead(sens[2]);
delay(20);
sensorValue[3] = analogRead(sens[3]);
delay(20);
sensorMaster = analogRead(mAster);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(sensorValue[1]);
lcd.setCursor(4,1);
lcd.print(sensorValue[2]);
lcd.setCursor(8,1);
lcd.print(sensorValue[3]);
lcd.setCursor(12,1);
lcd.print(sensorMaster);
delay(200);

if (teclapulsada()== 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guard Mastr min?");
lcd.setCursor(0,1);
lcd.print(sensorMaster);

tecla=teclapulsada();
while (tecla==0){
tecla=teclapulsada();
}
if (tecla== 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardando...");
EEPROM.write(memMaster,
sensorMaster);
delay (500);
lcd.setCursor(0,1);
lcd.print("Guard con exito!");
delay (1000);
goto salir2;
}
else goto vuelta;
}
}
while (digitalRead(Back)!= HIGH){}

salir2:

loadmenu(currentmenu.menuback);
}

void downconf()
//Funcin que muestra por pantalla los niveles analgicos (sensores de
//presin B)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("H1 H2 H3");
78

while (digitalRead(Back)!= LOW)
{

sensorValue[1] = analogRead(sensPdown[1]);
delay(20);
sensorValue[2] = analogRead(sensPdown[2]);
delay(20);
sensorValue[3] = analogRead(sensPdown[3]);

lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(sensorValue[1]);
lcd.setCursor(5,1);
lcd.print(sensorValue[2]);
lcd.setCursor(10,1);
lcd.print(sensorValue[3]);
delay(200);
}
while (digitalRead(Back)!= HIGH){}
loadmenu(currentmenu.menuback);
}

void upconf()
//Funcin que muestra por pantalla los niveles analgicos (sensores de
//presin A)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("H1 H2 H3");

while (digitalRead(Back)!= LOW)
{

sensorValue[1] = analogRead(sensPup[1]);
delay(20);
sensorValue[2] = analogRead(sensPup[2]);
delay(20);
sensorValue[3] = analogRead(sensPup[3]);

lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(sensorValue[1]);
lcd.setCursor(5,1);
lcd.print(sensorValue[2]);
lcd.setCursor(10,1);
lcd.print(sensorValue[3]);
delay(200);
}
while (digitalRead(Back)!= HIGH){}
loadmenu(currentmenu.menuback);
}


void moveservo()
//Funcion que mueve el servo a traves de cada posicion seteada
//sin posibilidad de variarla o guardarla
{
int nser = 0;
int npos = 0;
int tecla = 0;
bool outfunc = false;

switch (currentmenu.nmenu)
{
case 13:
nser=1;
79
break;
case 14:
nser=2;
break;
case 15:
nser=3;
break;
}

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Servo ");
lcd.print(nser);


while (outfunc == false){
lcd.setCursor(0,1);
lcd.print("Pos ");
lcd.print(npos);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
servo[nser].write(posini[nser][npos]);
tecla = teclapulsada();
//Aumentar-------------------------------------------------
if (tecla== 3)
{
if (npos <= 8)
{
npos++;
servo[nser].write(posini[nser][npos]);
//actualiza la posicin del servo
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
}
}
else if (tecla== 4)
{
if (npos >= 1)
{
npos--;
servo[nser].write(posini[nser][npos]);
//actualiza la posicin del servo
lcd.setCursor(8,1);
lcd.print(posini[nser][npos]);
lcd.print(" ");
}
}
else if (tecla == 2) outfunc = true;
}
loadmenu(currentmenu.menuback);
}
void movemotor() //mueve los motores arriba y abajo hasta
activar los finales de carrera
//en el caso del til
simplemente gira de forma continua
{
int nmotor = 0;
bool outfunc = false;
int tecla = 0;

switch (currentmenu.nmenu)
{
case 16:
nmotor=1;
break;
case 17:
80
nmotor=2;
break;
case 18:
nmotor=3;
break;
}

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Motor ");
lcd.print(nmotor);

while (outfunc == false){
lcd.setCursor(0,1);
lcd.print(" ");
tecla = teclapulsada();
if (tecla == 4) {
motordown(nmotor);
lcd.setCursor(0,1);
lcd.print("Bajando... ");
}
else if (tecla == 3) {
motorup(nmotor);
lcd.setCursor(0,1);
lcd.print("Subiendo... ");
}
else if (tecla == 2) outfunc = true;
}
loadmenu(currentmenu.menuback);
}

void poscarga() //Situa a la fresadora en la posicion
de inicio seguro
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Espere a que se ");
lcd.setCursor(0,1);
lcd.print("situe en posicion...");
servo[0].write(posini[1][0]);
delay (1000);
servo[1].write(posini[1][0]);
delay (1000);
servo[2].write(posini[2][0]);
delay (1000);
servo[3].write(posini[3][0]);
delay (1000);
motorup(1);
motorup(2);
motorup(3);
lcd.clear();
}


void perconf()
//Funcin que permite configurar hasta 3 umbrales para las seales
//analgicas
{
int nlight = 0;
int tecla = 0;
int speed = 1;

switch (currentmenu.nmenu)
{
case 10:
nlight=1;
break;
case 11:
nlight=2;
81
break;
case 12:
nlight=3;
break;
}

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Porcentaje inf ");
lcd.print(nlight);


while (digitalRead(Back)!= LOW){
lcd.setCursor(0,1);
lcd.print("Porc. ");
lcd.setCursor(6,1);
lcd.print(per[nlight]);

//Aumentar-------------------------------------------------
if (digitalRead(Plus)== LOW){
speed = 20;
while (digitalRead(Plus)== LOW){
if (per[nlight] <= 99) per[nlight] ++;
//Se decrementa un paso la posicin actual
lcd.setCursor(6,1);
lcd.print(per[nlight]);
lcd.print(" ");
delay (500/(speed/20));
speed += 10;
}
}

//Disminuir--------------------------------------------------
-
if (digitalRead(Minus)== LOW){
speed = 20;
while (digitalRead(Minus)== LOW){
if (per[nlight] >= 1) per[nlight] --;
//Se decrementa un paso la posicin actual
lcd.setCursor(6,1);
lcd.print(per[nlight]);
lcd.print(" ");
delay (500/(speed/20));
speed += 10;
}
}
tecla = teclapulsada();
if (tecla== 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardar?");
tecla=teclapulsada();
while (tecla==0){
tecla=teclapulsada();
}
if (tecla== 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardando...");
EEPROM.write(memper[nlight],
per[nlight]);
delay (500);
lcd.setCursor(0,1);
lcd.print("Guard con exito!");
goto lsalir;
}
else if (tecla == 2)
82
{
goto lsalir;
}
}
else if (tecla == 2) goto lsalir;
}

lsalir:

loadmenu(currentmenu.menuback);
}
bool outfunc = false;
int tecla = 0;

void enableleds() {
//Funcin que permite deshabilitar el uso de los leds se sealizacin
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Estado leds");
lcd.setCursor(0,1);
lcd.print("Habilitados");

while (outfunc == false){
tecla = teclapulsada();
if (tecla == 1) {
if (flagleds==false){
flagleds =true;
lcd.setCursor(0,1);
lcd.print("Habilitados ");
}
else {
flagleds=false;
lcd.setCursor(0,1);
lcd.print("Deshabilitados");
}
}
else if (tecla == 2) outfunc = true;
}
loadmenu(currentmenu.menuback);
}


void bt_config()
//Solicita mensaje I2C del esclavo y si est en la tabla ejecuta la
//accin prevista
{
//Solo se han implementado algunas funciones como ejemplo
byte code = 0;
byte value = 1;
int getvalue = 0;

Wire.requestFrom(5, 2);
// request 2 bytes from slave device #5
if (Wire.available()) {
code = Wire.receive();
value = Wire.receive();
}
else {
}

switch(code){
case 11: // sfini

break;
case 12: // sfss
nservo = value;
break;
case 13: // sfsp
npos = value;
83
break;
case 14: // sfsd
servo[nservo].write(value);
break;
case 15: // sfs
EEPROM.write(pos[nservo][npos], value);
posini[nservo][npos]=value;
delay(500);
break;
case 16: // sfo
break;
case 17: // clini
break;
case 18: // cls
break;
case 19: // clo
break;
case 20: // ctini
break;
case 21: // ctsu
EEPROM.write(memper[1], value);
delay(500);
per[1] = value;
break;
case 23: // ctsd
EEPROM.write(memper[2], value);
delay(500);
per[2] = value;
break;
case 24: // ctst
EEPROM.write(memper[3], value);
delay(500);
per[3] = value;
break;
case 25: // cto
break;
case 26: // sspu
servo[1].write(posini[1][value]);
break;
case 27: // sspd
servo[2].write(posini[2][value]);
break;
case 28: // sspt
servo[3].write(posini[3][value]);
break;
case 29: // mini
break;
case 30: // mup
motorup(value);
break;
case 31: // mdown
motordown(value);
break;
case 32: // pini
break;
case 33: // po
break;
case 34: // sp
poscarga();
break;
case 35: // info
break;
case 36: // ss
outmenu =1;
break;
case 37: // leds
if (value==1) flagleds = true;
else flagleds = false;
break;
84
case 38: // closed
break;

case 40: //s1
Wire.beginTransmission(5); // transmit to device #5
Wire.send(posini[1][value-1]); // sends
one byte
Wire.endTransmission(); // stop transmitting
break;

case 41: //s2
Wire.beginTransmission(5); // transmit to device #5
Wire.send(posini[2][value-1]); // sends
one byte
Wire.endTransmission(); // stop transmitting
break;

case 42: //s3
Wire.beginTransmission(5); // transmit to device #5
Wire.send(posini[3][value-1]); // sends
one byte
Wire.endTransmission(); // stop transmitting
break;

case 43: //umb
Wire.beginTransmission(5); // transmit to device #5
Wire.send(per[value]); // sends one byte
Wire.endTransmission(); // stop transmitting
break;

case 44: //pres1
getvalue = analogRead(sensPup[value]);
//sensPup[value]);
Wire.beginTransmission(5); // transmit to device #5
Wire.send(getvalue/4); // sends one byte
Wire.endTransmission(); // stop transmitting
break;
case 45: //pres2
getvalue = analogRead(sensPdown[value]);
Wire.beginTransmission(5); // transmit to device #5
Wire.send(getvalue/4); // sends one byte
Wire.endTransmission(); // stop transmitting
break;
case 46: //luz
if (value==4) getvalue = analogRead(mAster);
else getvalue = analogRead(sens[value]);
Wire.beginTransmission(5); // transmit to device #5
Wire.send(getvalue/4); // sends one byte
Wire.endTransmission(); // stop transmitting
break;


default:

break;
}
}





85
Apndice B: Cdigo Aplicacin Configuracin Comicro (Arduino
IDE)

#include <MeetAndroid.h>
#include <Wire.h>
#include <avr/io.h>
#include <avr/wdt.h>

MeetAndroid meetAndroid;

String message;

byte msend[2] = {0,0};
int mreceived = 0;
boolean flagi2cs = false;
boolean flagi2cr = false;
boolean sendflag = false;
int temp[10];

int s1 = 40;
int s2 = 41;
int s3 = 42;
int umb = 43;
int pres1 = 44;
int pres2 = 45;
int luz = 46;

int nsfini = 11;
int nsfss = 12;
int nsfsp = 13;
int nsfsd = 14;
int nsfs = 15;
int nsfo = 16;
int nclini = 17;
int ncls = 18;
int nclo = 19;
int nctini = 20;
int nctsu = 21;
int nctsd = 23;
int nctst = 24;
int ncto = 25;
int nsspu = 26;
int nsspd = 27;
86
int nsspt = 28;
int nmini = 29;
int nmup = 30;
int nmdown = 31;
int npini = 32;
int npo = 33;
int nsp = 34;
int ninfo = 35;
int nss = 36;
int nleds = 37;
int nclosed = 38;



String jname;
String jiden;
int jindex;
String jmeasure;

void setup()
{

Serial.begin(115200);
Wire.begin(5); // join i2c bus with address #2
Wire.onRequest(requestEvent); // register event
Wire.onReceive(receiveEvent); // register event
wdt_enable(WDTO_8S);

// register callback functions, which will be called when an
associated event occurs.
meetAndroid.registerFunction(sfini , 'a');
meetAndroid.registerFunction(sfss , 'b');
meetAndroid.registerFunction(sfsp , 'c');
meetAndroid.registerFunction(sfsd , 'd');
meetAndroid.registerFunction(sfs , 'e');
meetAndroid.registerFunction(sfo , 'f');
meetAndroid.registerFunction(clini , 'g');
meetAndroid.registerFunction(cls , 'h');
meetAndroid.registerFunction(clo , 'i');
meetAndroid.registerFunction(ctini , 'j');
meetAndroid.registerFunction(ctsu , 'k');
meetAndroid.registerFunction(ctsd , 'l');
meetAndroid.registerFunction(ctst , 'm');
meetAndroid.registerFunction(cto , 'n');
87
meetAndroid.registerFunction(sspu , 'o');
meetAndroid.registerFunction(sspd , 'p');
meetAndroid.registerFunction(sspt , 'q');
meetAndroid.registerFunction(mini , 'r');
meetAndroid.registerFunction(mup , 's');
meetAndroid.registerFunction(mdown , 't');
meetAndroid.registerFunction(pini , 'u');
meetAndroid.registerFunction(po , 'v');
meetAndroid.registerFunction(sp , 'w');
meetAndroid.registerFunction(info , 'x');
meetAndroid.registerFunction(ss , 'y');
meetAndroid.registerFunction(leds , 'z');
meetAndroid.registerFunction(closed , 'A');


delay (2000);
}

void loop()
{
String messageK = "";


meetAndroid.receive(); // you need to keep this in your loop() to
receive events
delay (150);
if (sendflag == true)
{
getValues(jmeasure);
messageK = json(jname, jiden, jindex);
meetAndroid.send(messageK);
}
wdt_reset();
}


//-----------------------------------------------------------------
//------------------------------------ Funciones i2c --------------
//-----------------------------------------------------------------

void requestEvent()
{
Wire.send(msend, 2); // respond with message of 6 bytes
// as expected by master
88
flagi2cs = true;
msend[0] = 0;
}


void receiveEvent(int howMany)
{
if(Wire.available()) // loop through all but the last
{
mreceived = Wire.receive(); // receive byte as an integer
flagi2cr = true;
}
//else mreceived = 515;
}

//-----------------------------------------------------------------
//------------------------------------ Funciones Registro BT ------
//---------------------------------------------------------------

void sfini (byte flag, byte numOfValues) {
}
void sfss (byte flag, byte numOfValues) {
int val = 1;
String mes = "";
val = meetAndroid.getInt();
jname = "servo";
jname = jname + val;
jiden = "p";
jindex = 7;

msend[0] = nsfss;
msend[1] = val;
delay (300);
if (val == 1) getValues("p1");
else if (val == 2) getValues("p2");
else if (val == 3) getValues("p3");
mes = json(jname, jiden, jindex);
meetAndroid.send(mes);
}
void sfsp (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
89
msend[1] = val;
msend[0] = nsfsp;

}
void sfsd (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nsfsd;

}
void sfs (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nsfs;
}
void sfo (byte flag, byte numOfValues) {
}
void clini (byte flag, byte numOfValues) {
jname = "light";
jiden = "l";
jindex = 4;
jmeasure = "luz";
sendflag = true;
}
void cls (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = ncls;
}
void clo (byte flag, byte numOfValues) {
message = "";
sendflag = false;
}
void ctini (byte flag, byte numOfValues) {
String mes = "";
90

jname = "threshold";
jiden = "t";
jindex = 3;
getValues("umbrales");
mes = json(jname, jiden, jindex);
meetAndroid.send(mes);
}
void ctsu (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nctsu;
}
void ctsd (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nctsd;
}
void ctst (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nctst;
}
void cto (byte flag, byte numOfValues) {
message = "";
sendflag = false;
}
void sspu (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nsspu;
}
91
void sspd (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nsspd;
}
void sspt (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nsspt;
}
void mini (byte flag, byte numOfValues) {
}
void mup (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nmup;
}
void mdown (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();
msend[0] = 0;
msend[1] = val;
msend[0] = nmdown;
}
void pini (byte flag, byte numOfValues) {
int val;

val = meetAndroid.getInt();

if (val == 1){
jname = "pres";
jiden = "u";
jindex = 3;
jmeasure = "pres1";
92
}

else if (val == 2)
{
jname = "pres";
jiden = "d";
jindex = 3;
jmeasure = "pres2";
}
sendflag = true;
}
void po (byte flag, byte numOfValues) {
message = "";
sendflag = false;
}
void sp (byte flag, byte numOfValues) {
msend[0] = nsp;
}
void info (byte flag, byte numOfValues) {
}
void ss (byte flag, byte numOfValues) {
msend[0] = nss;
}
void leds (byte flag, byte numOfValues) {
int on;

on = meetAndroid.getInt();
msend[0] = 0;
msend[1] = flag;
msend[0] = nleds;
}
void closed (byte flag, byte numOfValues) {
}

//-----------------------------------------------------------------
//------------------------------------ Funciones publicas ---------
//-----------------------------------------------------------------
String json (String name, String iden, int index)
{
//"{\"light\": {\"l1\": \"212\", \"l2\": \"222\", \"l3\": \"233\",
\"l4\": \"111\"}}"
String message;

String one = "{\"";
93
String two = "\": {";
String three = "\"";
String four = "";
String five = "\": \"";
String six = "\",";
String seven = "\"}}";

message = one + name; //\"light
message = message + two; //"\"light\":

for (int a = 0; a < index; a++) {
four = iden + (a+1);
message = message + three;
message = message + four;
message = message + five;
message = message + temp[a];

if (a == (index - 1)) {
message = message + seven;
}
else {
message = message + six;
}

}
return message;
}

void getValues (String name)
{
int index;
int code;
int esc;

if (name == "p1") {
index = 7;
code = s1;
esc = 1;
}
else if (name == "p2") {
index = 7;
code = s2;
esc = 1;
}
94
else if (name == "p3") {
index = 7;
code = s3;
esc = 1;
}
else if (name == "umbrales") {
index = 3;
code = umb;
esc = 1;
}
else if (name == "pres1") {
index = 3;
code = pres1;
esc = 4;
}
else if (name == "pres2") {
index = 3;
code = pres2;
esc = 4;
}
else if (name == "luz")
{
index = 4;
code = luz;
esc = 4;
}
else {
goto fin;
}

for (int i = 0; i<index; i++) {
temp[i] = geti2c(code, i + 1, esc);
}

fin:
int none = 0;
//return temp;
}

int geti2c(int code, int index, int esc)
{
int valor;

//SET code as response
95
msend[0] = code;
msend[1] = index;
flagi2cs = false;
//wait for request
//while ( flagi2cs != true)
//{}
delay (50);
//return response
flagi2cr = false;
//wait for request
//while ( flagi2cr != true)
//{}
//mreceived = random(250);
valor = esc * mreceived;


return valor;
}


















96
Apndice C: Cdigo Test IO (Arduino IDE)

char type = '-';
char conf = '-';
char state = '-';
int num = 0;

void setup(){
Serial.begin(9600); // Empieza transmission a 9600 bps:
Serial.println('H', BYTE); // Envia H mayscula como seal alive
}

void loop(){
if (Serial.available() > 0) {
// el mensaje consta de cuatro bytes (digital/analogico,
//entrada/salida, alto/bajo, numero de pin)
type = Serial.read();
conf = Serial.read();
state = Serial.read();
num = Serial.read();

if (type == 'd') doDigital (conf, state, num);
else if (type == 'a') doAnalog (num);
}}

void doDigital(char inout, char estado, int numero) {
if (inout == 'o'){
pinMode(numero, OUTPUT);
if (estado == 'h') digitalWrite(numero, HIGH);
else if (estado == 'l') digitalWrite(numero, LOW);
Serial.println(inout, DEC);
}
if (inout == 'i'){
pinMode(numero, INPUT);
int valor = digitalRead(numero);
Serial.println(valor, DEC);
}}

void doAnalog(int numero) {
int sensor = analogRead(numero);
Serial.println(sensor, DEC);
}

97
Apndice D: Cdigo Test Heavy Duty (Eclipse IDE)

onYellow(1);
onYellow(2);
onYellow(3);

delay (5000);


onGreen(1);
onGreen(2);
onGreen(3);

servo[1].write(0);
//delay (500);
servo[2].write(0);
//delay (500);
servo[3].write(0);

delay (5000);

servo[1].write(10);
servo[2].write(10);
servo[3].write(50);

while (1)
{
delay (5000);

motor[1].onCW();
motor[2].onCW();
motor[3].onCW();
servo[1].write(160);
delay (500);
servo[2].write(160);
delay (500);
servo[3].write(80);


delay (5000);

motor[1].onCCW();
motor[2].onCCW();
motor[3].onCCW();
servo[1].write(10);
delay (500);
servo[2].write(10);
delay (500);
servo[3].write(50);
}








98
Apndice E: Aplicacin Android


package befaust.jorges119.eclipseBT;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import at.abraxas.amarino.Amarino;

public class BTActivity extends Activity {

public static final String DEVICE_ADDRESS = "00:07:80:40:7D:07";
public static final char sfini= 'a';
//ConfServoInit
public static final char sfss= 'b'; //ConfServoSend
servo
public static final char sfsp= 'c'; //ConfServoSend
position
public static final char sfsd= 'd'; //ConfServoSend
data
public static final char sfs= 'e'; //ConfServoSave
public static final char sfo= 'f'; //ConfServoOut
public static final char clini= 'g';
//ConflightInit
public static final char cls= 'h'; //ConflightSave
public static final char clo= 'i'; //ConflightOut
public static final char ctini= 'j';
//ConfthresholdInit
public static final char ctsu= 'k';
//ConfthresholdSend data 1
public static final char ctsd= 'l';
//ConfthresholdSend data 2
public static final char ctst= 'm';
//ConfthresholdSend data 3
public static final char cto= 'n';
//ConfthresholdOut
public static final char sspu= 'o'; //ServoSend pos
1
public static final char sspd= 'p'; //ServoSend pos
2
public static final char sspt= 'q'; //ServoSend pos
3
public static final char mini= 'r'; //MotorInit
public static final char mup= 's'; //MotorMotor n
up
99
public static final char mdown= 't'; //MotorMotor n
down
public static final char pini= 'u'; //PressureInit
public static final char po= 'v'; //PressureOut
public static final char sp= 'w'; //Start
PositionInit
public static final char info= 'x'; //Software
version/BatteryInit
public static final char ss= 'y'; //Start ShowInit
public static final char leds= 'z'; //LedsInit



public static boolean[] motors = {false, false, false, false};
public static int[][] servopos = new int[4][7];
public static int[] thresholds = {20, 20, 20, 20};
public static int[] lights = {0,0,0,0};
public static int master = 0;
public static boolean ledon = true;
public static int[][] pressures = {{0,0,0,0},{0,0,0,0},{0,0,0,0}};


public static String servo = "servo";
public static String light = "light";
public static String threshold = "threshold";
public static String motor = "motor";
public static String pressure = "pressure";



@Override
public boolean onCreateOptionsMenu(Menu menu) {
//menu.add(1, 1, 0, "Volver a Conectar");
menu.add(0, 1, 0,
"Conectar").setIcon(android.R.drawable.stat_sys_data_bluetooth);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Amarino.connect(getBaseContext(), DEVICE_ADDRESS);

}
100
return true;
}

}



package befaust.jorges119.eclipseBT;



import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;

public class HomeActivity extends BTActivity {
/** Called when the activity is first created. */

private static final String TAG = "servoControl";

//private static final String DEVICE_ADDRESS =
"00:07:80:40:7D:07";//"00:07:80:99:56:B3";

private boolean popup_flag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null){
101
popup_flag = savedInstanceState.getBoolean("Popup_flag",
false);
}
else popup_flag = false;

//setContentView(R.layout.main);
LayoutInflater inflater = getLayoutInflater();
GridView view = (GridView)inflater.inflate(R.layout.main, null);

view.setAdapter(new IconAdapter(this,
new IconItem ("Configuracin", R.drawable.config_norm),
new IconItem ("Control Manual", R.drawable.man_norm),
//new IconItem ("Configuracin",
R.drawable.btn_config),
//new IconItem ("Configuracin",
R.drawable.btn_config),
new IconItem ("Sistema", R.drawable.system_norm),
new IconItem ("Show", R.drawable.show_norm)));
setContentView(view);
/*view.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent,
View v, int position, long id)
{
Toast.makeText(getBaseContext(),
"pic" + (position + 1) + " selected",
Toast.LENGTH_SHORT).show();
}
}); */
view.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
//Intent i = new Intent(nclApp2.this, Screen2.class);

Intent myIntent = null;
if(position == 0){
myIntent = new Intent(v.getContext(),
Configuration.class);
startActivity(myIntent);
}
if(position == 1){
myIntent = new Intent(v.getContext(), Manual.class);
startActivity(myIntent);
}
if(position == 2){
102
myIntent = new Intent(v.getContext(), Sys.class);
startActivity(myIntent);
}
if(position == 3){
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, sp, 0);
try{
Thread.sleep(1000);
}
catch (Exception e){}
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, ss, 0);
Amarino.disconnect(getBaseContext(), DEVICE_ADDRESS);

BluetoothAdapter mBluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
if (!mBluetoothAdapter.isEnabled()) {

}else{
mBluetoothAdapter.disable();
}

finish();
}

}

});

/* ImageView image = (ImageView) findViewById(R.id.test_image);
image.setOnTouchListener(this); */
if (popup_flag == false) {
new Handler().postDelayed(new Runnable() {
public void run() {
showPopup();
popup_flag = true;
}
}, 100);

}

}

@Override
protected void onSaveInstanceState(Bundle outState) {
103
super.onSaveInstanceState(outState);
outState.putBoolean("Popup_flag", popup_flag);
}

@Override
protected void onStop() {
super.onStop();
// stop Amarino's background service, we don't need it any
more
//Amarino.disconnect(this, DEVICE_ADDRESS);
}

public void showPopup(){

LayoutInflater inflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout =
inflater.inflate(R.layout.welcome_popup, null, false);
Button but = (Button)
layout.findViewById(R.id.widget41);
final PopupWindow pw = new PopupWindow(layout, 600,
400, true);
OnClickListener cancel_button_click_listener = new
OnClickListener()
{
public void onClick(View v)
{
Amarino.connect(getBaseContext(),
DEVICE_ADDRESS);
pw.dismiss();
}
};
but.setOnClickListener(cancel_button_click_listener);
pw.showAtLocation(findViewById(R.id.main),
Gravity.CENTER, 0, 0);

}



/* @Override
public boolean onTouch(View v, MotionEvent e) {
// TODO Auto-generated method stub
float x = e.getX();
float y = e.getY();

104

switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:

if (x > 1 & x < 200 & y > 1 & y < 200) {
startActivity(new Intent(
this,
AndroidBitmap.class));
}
if (x > 1 & x < 200 & y > 200 & y < 400) {
//Toast.makeText(HomeActivity.this, "Otro " ,
Toast.LENGTH_SHORT).show();
startActivity(new Intent(
this,
Motor.class));

/// this is just another example of another set of
coordinates.
}

break;
}

return true;

}*/
}


class IconItem {

final String name;
final int image;
IconItem(String name, int image) {
this.name = name;
this.image = image;
}
}

class IconAdapter extends BaseAdapter {
private final IconItem[] icons;



105
public IconAdapter(Context c, IconItem... icons) {
this.icons = icons;
}

public int getCount(){
return icons.length;
}
public Object getItem(int index){
return icons[index];
}
public long getItemId(int index){
return index;
}

private ViewGroup getViewGroup(View reuse, ViewGroup parent){
if(reuse instanceof ViewGroup) {
return (ViewGroup)reuse;
}
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
ViewGroup item = (ViewGroup)inflater.inflate(R.layout.menuone,
null);
return item;
}

public View getView(int index, View reuse, ViewGroup parent) {
ViewGroup item = getViewGroup(reuse, parent);
TextView text = (TextView)item.findViewById(R.id.text);
ImageView but = (ImageView)item.findViewById(R.id.but1);

IconItem icon = icons[index];
text.setText(icon.name);
but.setImageResource(icon.image);



return item;
}

}




106

package befaust.jorges119.eclipseBT;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;

public class Configuration extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* if (savedInstanceState != null){
popup_flag = savedInstanceState.getBoolean("Popup_flag",
false);
}
else popup_flag = false;*/

//setContentView(R.layout.main);
LayoutInflater inflater = getLayoutInflater();
GridView view = (GridView)inflater.inflate(R.layout.conf, null);

view.setAdapter(new IconAdapter(this,
new IconItem ("Posiciones", R.drawable.servosf_norm),
new IconItem ("Master Ligth", R.drawable.luz_norm),
//new IconItem ("Umbrales", R.drawable.umbr_norm),
new IconItem ("LEDs", R.drawable.led_norm)));
setContentView(view);

view.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
//Intent i = new Intent(nclApp2.this, Screen2.class);

Intent myIntent = null;
if(position == 0){
myIntent = new Intent(v.getContext(), ServoSel.class);
107
myIntent.putExtra("type", 1);
}
if(position == 1){
myIntent = new Intent(v.getContext(),
MasterLight.class);
}
if(position == 2){
myIntent = new Intent(v.getContext(), Leds.class);
}
/* if(position == 3){
myIntent = new Intent(v.getContext(), Motor.class);
}*/
startActivity(myIntent);
}

});

}
}



package befaust.jorges119.eclipseBT;



import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;


public class Leds extends BTActivity{

private Button onoff;
boolean ledstate;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
ledstate=savedInstanceState.getBoolean("state",false);
}
108
else{
ledstate = false;
}
setContentView(R.layout.leds);
onoff = (Button)findViewById(R.id.switch1);
if (ledstate == true)
{
onoff.setBackgroundResource(R.drawable.switch_on);
}
onoff.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (ledstate == true)
{
ledstate = false;
onoff.setBackgroundResource(R.drawable.switch_off);
}
else
{
ledstate = true;

onoff.setBackgroundResource(R.drawable.switch_on);
}
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
leds, ledstate);
}
});
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("state", ledstate);
}

@Override
protected void onStop() {
super.onStop();
// save state
Bundle bundle = new Bundle();
bundle.putBoolean("state", ledstate);


// stop Amarino's background service, we don't need it
any more
}
109
}


package befaust.jorges119.eclipseBT;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;

public class Manual extends Activity {
/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* if (savedInstanceState != null){
popup_flag = savedInstanceState.getBoolean("Popup_flag",
false);
}
else popup_flag = false;*/

//setContentView(R.layout.main);
LayoutInflater inflater = getLayoutInflater();
GridView view = (GridView)inflater.inflate(R.layout.man, null);

view.setAdapter(new IconAdapter(this,
new IconItem ("Servos", R.drawable.servo_norm),
new IconItem ("Motores", R.drawable.motor_norm),
new IconItem ("Presin", R.drawable.pres_norm)));
setContentView(view);

view.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {

Intent myIntent = null;
if(position == 0){
myIntent = new Intent(v.getContext(), ServoSel.class);
110
myIntent.putExtra("type", 2);
}
if(position == 1){
myIntent = new Intent(v.getContext(), Motor.class);
}
if(position == 2){
myIntent = new Intent(v.getContext(), PresSel.class);
}
startActivity(myIntent);
}

});

}
}


package befaust.jorges119.eclipseBT;

import org.json.JSONObject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

public class MasterLight extends BTActivity {
/** Called when the activity is first created. */

private TextView left;
private TextView center;
private TextView right;
private TextView mast;
private Button save;
111

private Button setthre1;
private Button setthre2;
private Button setthre3;
private Button savethre1;
private Button savethre2;
private Button savethre3;
private ProgressBar level1;
private ProgressBar level2;
private ProgressBar level3;
private TextView textthreshold1;
private TextView textthreshold2;
private TextView textthreshold3;
private SeekBar t1;
private SeekBar t2;
private SeekBar t3;
int umb1 =0;
int umb2 =0;
int umb3 =0;

public boolean lightok = false;
private JSONObject jObject;
public String exString = "{\"light\": {\"l1\": \"211\", \"l2\":
\"222\", \"l3\": \"233\", \"l4\": \"111\"}}";
public String exString2 = "{\"threshold\": {\"t1\": \"15\", \"t2\":
\"12\", \"t3\": \"20\"}}";
private Boolean freceived =false;

private ArduinoReceiverThresholds thres = new
ArduinoReceiverThresholds();
private ArduinoReceiverLevels levels = new ArduinoReceiverLevels();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lightandmore);
left = (TextView) findViewById(R.id.value1);
center = (TextView) findViewById(R.id.value2);
right = (TextView) findViewById(R.id.value3);
mast = (TextView) findViewById(R.id.value4);

textthreshold1 = (TextView) findViewById(R.id.umbral1);
textthreshold2 = (TextView) findViewById(R.id.umbral2);
textthreshold3 = (TextView) findViewById(R.id.umbral3);

112
save = (Button) findViewById(R.id.save);

OnClickListener save_list = new OnClickListener()
{
public void onClick(View v)
{
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, cls, master);
}
};
save.setOnClickListener(save_list);

setthre1 = (Button)findViewById(R.id.import1);
setthre1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
t1.setProgress(umb1);
}
});

setthre2 = (Button)findViewById(R.id.import2);
setthre2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
t2.setProgress(umb2);
}
});


setthre3 = (Button)findViewById(R.id.import3);
setthre3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
t3.setProgress(umb3);
}
});


savethre1 = (Button)findViewById(R.id.save1);
savethre1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, ctsu, thresholds[1]);
}
});

savethre2 = (Button)findViewById(R.id.save2);
113
savethre2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, ctsd, thresholds[2]);
}
});


savethre1 = (Button)findViewById(R.id.save3);
savethre1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Amarino.sendDataToArduino(getBaseContext(),
DEVICE_ADDRESS, ctst, thresholds[3]);
}
});

level1=(ProgressBar)findViewById(R.id.progressIzq);
level2=(ProgressBar)findViewById(R.id.progressCent);
level3=(ProgressBar)findViewById(R.id.progressDer);

t1 =(SeekBar)findViewById(R.id.seekBar1);
t1.setOnSeekBarChangeListener(sb1);

t2 =(SeekBar)findViewById(R.id.seekBar2);
t2.setOnSeekBarChangeListener(sb2);

t3 =(SeekBar)findViewById(R.id.seekBar3);
t3.setOnSeekBarChangeListener(sb3);

}

private SeekBar.OnSeekBarChangeListener sb1
= new SeekBar.OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
thresholds[1]=t1.getProgress();
textthreshold1.setText(Integer.toString(thresholds[1])+ "%");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
114

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}};

private SeekBar.OnSeekBarChangeListener sb2
= new SeekBar.OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
thresholds[2]=t2.getProgress();
textthreshold2.setText(Integer.toString(thresholds[2])+ "%");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}};

private SeekBar.OnSeekBarChangeListener sb3
= new SeekBar.OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
thresholds[3]=t3.getProgress();
textthreshold3.setText(Integer.toString(thresholds[3])+ "%");
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}
115

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}};


@Override
protected void onStart() {
super.onStart();
// in order to receive broadcasted intents we need to register our
receiver
registerReceiver(thres, new
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

// this is how you tell Amarino to connect to a specific BT device
from within your own code
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, ctini,
"0");

}


@Override
protected void onStop() {
super.onStop();

// if you connect in onStart() you must not forget to disconnect
when your app is closed
//Amarino.disconnect(this, DEVICE_ADDRESS);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, clo,
"0");
// do never forget to unregister a registered receiver
if (freceived==true) unregisterReceiver(levels);
else unregisterReceiver(thres);
}

/**
* ArduinoReceiver is responsible for catching broadcasted Amarino
* events.
*
* It extracts data from the intent and updates the graph
accordingly.
*/
private class ArduinoReceiverLevels extends BroadcastReceiver {

116
@Override
public void onReceive(Context context, Intent intent) {
String data = null;

// the device address from which the data was sent, we don't
need it here but to demonstrate how you retrieve it
final String address =
intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

// the type of data which is added to the intent
final int dataType =
intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

// we only expect String data though, but it is better to
check if really string was sent
// later Amarino will support differnt data types, so far
data comes always as string and
// you have to parse the data to the type you have sent from
Arduino, like it is shown below
if (dataType == AmarinoIntent.STRING_EXTRA){
data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

if (data != null){
try {
parse(data);
} catch (Exception e) {
e.printStackTrace();
}
left.setText(Integer.toString(lights[1]));
center.setText(Integer.toString(lights[2]));
right.setText(Integer.toString(lights[3]));
mast.setText(Integer.toString(master));
level1.setProgress(lights[1]);
level2.setProgress(lights[2]);
level3.setProgress(lights[3]);
umb1 = (lights[1] /8);
umb2 = (lights[2] /8);
umb3 = (lights[3] /8);
setthre1.setText(Integer.toString(umb1) + "%");
setthre2.setText(Integer.toString(umb2) + "%");
setthre3.setText(Integer.toString(umb3) + "%");

}
}
}
}
117


private void parse(String jString) throws Exception {

jObject = new JSONObject(jString);

JSONObject menuObject = jObject.getJSONObject("light");
//String attributeId = menuObject.getString("id");
lights[1] = menuObject.getInt("l1");
lights[2] = menuObject.getInt("l2");
lights[3] = menuObject.getInt("l3");
master = menuObject.getInt("l4");

}

private class ArduinoReceiverThresholds extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent) {
String data = null;

// the device address from which the data was sent, we
don't need it here but to demonstrate how you retrieve it
final String address =
intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

// the type of data which is added to the intent
final int dataType =
intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

// we only expect String data though, but it is better
to check if really string was sent
// later Amarino will support differnt data types, so
far data comes always as string and
// you have to parse the data to the type you have sent
from Arduino, like it is shown below
if (dataType == AmarinoIntent.STRING_EXTRA){
data =
intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

if (data != null){
try {
parseValue(data);
} catch (Exception e) {
e.printStackTrace();
}
118

textthreshold1.setText(Integer.toString(thresholds[1]));

textthreshold2.setText(Integer.toString(thresholds[2]));

textthreshold3.setText(Integer.toString(thresholds[3]));
t1.setProgress(thresholds[1]);
t2.setProgress(thresholds[2]);
t3.setProgress(thresholds[3]);
changeRegister();
freceived=true;
}
}
}
}

private void parseValue(String jString) throws Exception {

jObject = new JSONObject(jString);

JSONObject menuObject2 = jObject.getJSONObject("threshold");
thresholds[1] = menuObject2.getInt("t1");
thresholds[2] = menuObject2.getInt("t2");
thresholds[3] = menuObject2.getInt("t3");

}

private void changeRegister(){
unregisterReceiver(thres);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
cto, "0");
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
clini, "0");
registerReceiver(levels, new
IntentFilter(AmarinoIntent.ACTION_RECEIVED));
}

}



package befaust.jorges119.eclipseBT;

import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
119
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;


public class Motor extends BTActivity {
Button down1;
Button up1;
ImageView base1;

Button down2;
Button up2;
ImageView base2;

Button down3;
Button up3;
ImageView base3;

View layout;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.motor);
base1 = (ImageView)findViewById(R.id.test_image1);
base2 = (ImageView)findViewById(R.id.test_image2);
base3 = (ImageView)findViewById(R.id.test_image3);
down1 = (Button)findViewById(R.id.down1);
down1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, 0,200
);
slide.setDuration(2000);
slide.setFillAfter(true);
base1.startAnimation(slide);
up1.setEnabled(true);
down1.setEnabled(false);
120
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mdown, 1);
}
});
up1 = (Button)findViewById(R.id.up1);
up1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, 200,0
);
slide.setDuration(2000);
slide.setFillAfter(true);
base1.startAnimation(slide);
up1.setEnabled(false);
down1.setEnabled(true);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mup, 1);
}
});

down2 = (Button)findViewById(R.id.down2);
down2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, 0,200
);
slide.setDuration(2000);
slide.setFillAfter(true);
base2.startAnimation(slide);
up2.setEnabled(true);
down2.setEnabled(false);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mdown, 2);
}
});
up2 = (Button)findViewById(R.id.up2);
up2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
121
TranslateAnimation slide = new TranslateAnimation(0, 0, 200,0
);
slide.setDuration(2000);
slide.setFillAfter(true);
base2.startAnimation(slide);
up2.setEnabled(false);
down2.setEnabled(true);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mup, 2);
}
});


down3 = (Button)findViewById(R.id.down3);
down3.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, 0,200
);
slide.setDuration(2000);
slide.setFillAfter(true);
base3.startAnimation(slide);
up3.setEnabled(true);
down3.setEnabled(false);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mdown, 3);
}
});
up3 = (Button)findViewById(R.id.up3);
up3.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, 200,0
);
slide.setDuration(2000);
slide.setFillAfter(true);
base3.startAnimation(slide);
up3.setEnabled(false);
down3.setEnabled(true);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
mup, 3);
}
122
});
layout = (View) findViewById(R.id.layout);




}

@Override
protected void onStart() {
super.onStart();
up1.setEnabled(false);
up2.setEnabled(false);
up3.setEnabled(false);
}

}



package befaust.jorges119.eclipseBT;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class PresSel extends BTActivity{

Button up;
Button down;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.selectpres);



down = (Button)findViewById(R.id.button2);
down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
123
Intent myIntent = null;
myIntent = new Intent(v.getContext(),
PressureDown.class);
startActivity(myIntent);
}
});

up = (Button)findViewById(R.id.button1);
up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = null;
myIntent = new Intent(v.getContext(),
PressureUp.class);
startActivity(myIntent);
}
});
}
}



package befaust.jorges119.eclipseBT;

import org.json.JSONArray;
import org.json.JSONObject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

public class PressureDown extends BTActivity {
/** Called when the activity is first created. */
124

private TextView left;
private TextView center;
private TextView right;
private TextView text1;
private TextView text2;
private TextView text3;

public boolean lightok = false;
private JSONObject jObject;
public String exString = "{\"pres\": {\"u1\": \"211\", \"d1\":
\"211\", \"u2\": \"222\",\"d2\": \"211\", \"u3\": \"233\",\"d3\":
\"211\"}}";

private ArduinoReceiver arduinoReceiver = new ArduinoReceiver();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simplepressure);
left = (TextView) findViewById(R.id.value1);
center = (TextView) findViewById(R.id.value2);
right = (TextView) findViewById(R.id.value3);
text1 = (TextView) findViewById(R.id.text1);
text2 = (TextView) findViewById(R.id.text2);
text3 = (TextView) findViewById(R.id.text3);


}

@Override
protected void onStart() {
super.onStart();
// in order to receive broadcasted intents we need to register our
receiver
registerReceiver(arduinoReceiver, new
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

// this is how you tell Amarino to connect to a specific BT device
from within your own code
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, pini,
2);

/* left.setText(Integer.toString(pressures[1][1]));
center.setText(Integer.toString(pressures[1][2]));
right.setText(Integer.toString(pressures[1][3]));*/
125
text1.setText("Inferior");
text2.setText("Inferior");
text3.setText("Inferior");
}


@Override
protected void onStop() {
super.onStop();

// if you connect in onStart() you must not forget to disconnect
when your app is closed
//Amarino.disconnect(this, DEVICE_ADDRESS);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, po,
"0");
// do never forget to unregister a registered receiver
unregisterReceiver(arduinoReceiver);
}

/**
* ArduinoReceiver is responsible for catching broadcasted Amarino
* events.
*
* It extracts data from the intent and updates the graph
accordingly.
*/
private class ArduinoReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String data = null;

// the device address from which the data was sent, we don't
need it here but to demonstrate how you retrieve it
final String address =
intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

// the type of data which is added to the intent
final int dataType =
intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

// we only expect String data though, but it is better to
check if really string was sent
// later Amarino will support differnt data types, so far
data comes always as string and
// you have to parse the data to the type you have sent from
Arduino, like it is shown below
126
if (dataType == AmarinoIntent.STRING_EXTRA){
data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

if (data != null){
try {
parse(data);
} catch (Exception e) {
e.printStackTrace();
}
left.setText(Integer.toString(pressures[2][1]));

center.setText(Integer.toString(pressures[2][2]));
right.setText(Integer.toString(pressures[2][3]));
}
}
}
}


private void parse(String jString) throws Exception {

jObject = new JSONObject(jString);

JSONObject menuObject = jObject.getJSONObject("pres");
//String attributeId = menuObject.getString("id");
pressures[2][1] = menuObject.getInt("d1");
pressures[2][2] = menuObject.getInt("d2");
pressures[2][3] = menuObject.getInt("d3");


}

}




package befaust.jorges119.eclipseBT;

import org.json.JSONArray;
import org.json.JSONObject;

import android.content.BroadcastReceiver;
import android.content.Context;
127
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

public class PressureUp extends BTActivity {
/** Called when the activity is first created. */

private TextView left;
private TextView center;
private TextView right;
private TextView text1;
private TextView text2;
private TextView text3;

public boolean lightok = false;
private JSONObject jObject;
public String exString = "{\"pres\": {\"u1\": \"211\", \"d1\":
\"211\", \"u2\": \"222\",\"d2\": \"211\", \"u3\": \"233\",\"d3\":
\"211\"}}";

private ArduinoReceiver arduinoReceiver = new ArduinoReceiver();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simplepressure);
left = (TextView) findViewById(R.id.value1);
center = (TextView) findViewById(R.id.value2);
right = (TextView) findViewById(R.id.value3);
text1 = (TextView) findViewById(R.id.text1);
text2 = (TextView) findViewById(R.id.text2);
text3 = (TextView) findViewById(R.id.text3);


}
128

@Override
protected void onStart() {
super.onStart();
// in order to receive broadcasted intents we need to register our
receiver
registerReceiver(arduinoReceiver, new
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

// this is how you tell Amarino to connect to a specific BT device
from within your own code
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, pini,
1);

/* left.setText(Integer.toString(pressures[1][1]));
center.setText(Integer.toString(pressures[1][2]));
right.setText(Integer.toString(pressures[1][3]));*/
text1.setText("Superior");
text2.setText("Superior");
text3.setText("Superior");
}


@Override
protected void onStop() {
super.onStop();

// if you connect in onStart() you must not forget to disconnect
when your app is closed
//Amarino.disconnect(this, DEVICE_ADDRESS);
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, po, 1);
// do never forget to unregister a registered receiver
unregisterReceiver(arduinoReceiver);
}

/**
* ArduinoReceiver is responsible for catching broadcasted Amarino
* events.
*
* It extracts data from the intent and updates the graph
accordingly.
*/
private class ArduinoReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
129
String data = null;

// the device address from which the data was sent, we don't
need it here but to demonstrate how you retrieve it
final String address =
intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

// the type of data which is added to the intent
final int dataType =
intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

// we only expect String data though, but it is better to
check if really string was sent
// later Amarino will support differnt data types, so far
data comes always as string and
// you have to parse the data to the type you have sent from
Arduino, like it is shown below
if (dataType == AmarinoIntent.STRING_EXTRA){
data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

if (data != null){
try {
parse(data);
} catch (Exception e) {
e.printStackTrace();
}
left.setText(Integer.toString(pressures[1][1]));

center.setText(Integer.toString(pressures[1][2]));
right.setText(Integer.toString(pressures[1][3]));
}
}
}
}


private void parse(String jString) throws Exception {

jObject = new JSONObject(jString);

JSONObject menuObject = jObject.getJSONObject("pres");
//String attributeId = menuObject.getString("id");
pressures[1][1] = menuObject.getInt("u1");
pressures[1][2] = menuObject.getInt("u2");
pressures[1][3] = menuObject.getInt("u3");

130

}

}




package befaust.jorges119.eclipseBT;

import org.json.JSONObject;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

public class ServoCont extends BTActivity {

final int DELAY = 150;
int pos; //variable temporal posicin actual
int lastindex;
int nservo;
boolean loaded;


ImageView myImageView;
Spinner spinnerScale;
131

private static final String[] strScale
= {"Posicin 1", "Posicin 2", "Posicin 3", "Posicin 4", "Posicin 5",
"Posicin 6", "Posicin 7"};
private int SpinnerSelect = 0;

private ArrayAdapter<String> adapterScale;

private float curScale = 1F;
private float curRotate = 0F;

Bitmap bitmap;
int bmpWidth, bmpHeight;
TextView value;
TextView title;
Button prev;
Button next;
Button plus;
Button minus;
Button save;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
lastindex=savedInstanceState.getInt("index",0);
}
else{
lastindex = 0;
}
Bundle bundle = getIntent().getExtras();
nservo = bundle.getInt("selected");
setContentView(R.layout.servocont);
title = (TextView)findViewById(R.id.text);
myImageView = (ImageView)findViewById(R.id.imageview);
value = (TextView)findViewById(R.id.value);
title.setText("Servo" + nservo);
prev = (Button)findViewById(R.id.previous);
prev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (SpinnerSelect == 0) SpinnerSelect = 6;
else SpinnerSelect--;
spinnerScale.setSelection(SpinnerSelect);
132
}
});


next = (Button)findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (SpinnerSelect == 6) SpinnerSelect = 0;
else SpinnerSelect++;
spinnerScale.setSelection(SpinnerSelect);
}
});

spinnerScale = (Spinner)findViewById(R.id.scale);


adapterScale = new ArrayAdapter<String>(this,
R.layout.my_spinner, strScale);

adapterScale.setDropDownViewResource(android.R.layout.simple_spinner_drop
down_item);

spinnerScale.setAdapter(adapterScale);
spinnerScale.setSelection(SpinnerSelect);
curScale = 1F;

//bitmap = BitmapFactory.decodeFile(imageInSD);
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.rotate);
bmpWidth = bitmap.getWidth();
bmpHeight = bitmap.getHeight();

drawMatrix();


spinnerScale.setOnItemSelectedListener(spinnerScaleOnItemSelectedListener
);

}

@Override
protected void onStart() {
super.onStart();

}
133

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("index", lastindex);
}

@Override
protected void onStop() {
super.onStop();

}

private void drawMatrix(){

Matrix matrix = new Matrix();
matrix.postScale(curScale, curScale);
matrix.postRotate(curRotate);

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
bmpHeight, matrix, true);
myImageView.setImageBitmap(resizedBitmap);

}



private Spinner.OnItemSelectedListener
spinnerScaleOnItemSelectedListener
= new Spinner.OnItemSelectedListener(){

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int index, long arg3) {
SpinnerSelect= index;
refresh(index);
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
spinnerScale.setSelection(SpinnerSelect);
//curScale = floatScale[SpinnerSelect];
}};
134

private void refresh (int index){
if (index >=lastindex) curRotate = curRotate + 100;
else curRotate = curRotate - 100;
drawMatrix();
if (nservo==1){
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, sspu, index);
}
else if (nservo==2)
{
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, sspd, index);

}
else if (nservo==3)
{
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, sspt, index);

}
lastindex=index;
}


}



package befaust.jorges119.eclipseBT;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;

public class ServoSel extends Activity {
/** Called when the activity is first created. */
int type;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
135
Bundle bundle = getIntent().getExtras();
type = bundle.getInt("type");
LayoutInflater inflater = getLayoutInflater();
GridView view = (GridView)inflater.inflate(R.layout.servo_sel,
null);

view.setAdapter(new IconAdapter(this,
new IconItem ("Servo Izquierda",
R.drawable.servo_norm),
new IconItem ("Servo Centro", R.drawable.servo_norm),
new IconItem ("Servo Derecha",
R.drawable.servo_norm)));
setContentView(view);

view.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
//Intent i = new Intent(nclApp2.this, Screen2.class);

Intent myIntent = null;
if (type==1) myIntent = new Intent(v.getContext(),
ServoSF.class);
else if (type ==2) myIntent = new Intent(v.getContext(),
ServoCont.class);
myIntent.putExtra("selected", position + 1);
startActivity(myIntent);
}

});

}
}



package befaust.jorges119.eclipseBT;

import org.json.JSONObject;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
136
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import at.abraxas.amarino.Amarino;
import at.abraxas.amarino.AmarinoIntent;

public class ServoSF extends BTActivity {

final int DELAY = 150;
SeekBar servoOne;
private JSONObject jObject;
int pos; //variable temporal posicin actual
long lastChange;
public String exString = "{\"servo1\": {\"p1\": \"10\", \"p2\":
\"20\", \"p3\": \"30\", \"p4\": \"40\", \"p5\": \"50\", \"p6\": \"60\",
\"p7\": \"70\"}}";
int nservo;
private ArduinoReceiver arduinoReceiver = new ArduinoReceiver();
boolean loaded;

private final String imageInSD = "/sdcard/er.PNG";

ImageView myImageView;
Spinner spinnerScale;
SeekBar seekbarRotate;

private static final String[] strScale
= {"Posicin 1", "Posicin 2", "Posicin 3", "Posicin 4", "Posicin 5",
"Posicin 6", "Posicin 7"};
private static final Float[] floatScale
= {0.2F, 0.5F, 1F, 2F, 5F};
private int SpinnerSelect = 0;

private ArrayAdapter<String> adapterScale;

137
private float curScale = 1F;
private float curRotate = 0F;

Bitmap bitmap;
int bmpWidth, bmpHeight;
TextView value;
TextView title;
Button prev;
Button next;
Button plus;
Button minus;
Button save;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
nservo = bundle.getInt("selected");
setContentView(R.layout.servo);
title = (TextView)findViewById(R.id.text);
myImageView = (ImageView)findViewById(R.id.imageview);
value = (TextView)findViewById(R.id.value);
title.setText("Servo" + nservo);
prev = (Button)findViewById(R.id.previous);
prev.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (SpinnerSelect == 0) SpinnerSelect = 6;
else SpinnerSelect--;
spinnerScale.setSelection(SpinnerSelect);
}
});


next = (Button)findViewById(R.id.next);
next.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (SpinnerSelect == 6) SpinnerSelect = 0;
else SpinnerSelect++;
spinnerScale.setSelection(SpinnerSelect);
}
});

plus = (Button)findViewById(R.id.plus);
138
plus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
pos= seekbarRotate.getProgress() + 2;
seekbarRotate.setProgress(pos);
}
});

minus = (Button)findViewById(R.id.minus);
minus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
pos= seekbarRotate.getProgress() - 2;
seekbarRotate.setProgress(pos);
}
});

save = (Button)findViewById(R.id.save);
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
sfsp, SpinnerSelect);
try{
Thread.sleep(100);
}
catch (Exception e){}
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS,
sfs, pos);
servopos[nservo][SpinnerSelect]=pos;
}
});




spinnerScale = (Spinner)findViewById(R.id.scale);
seekbarRotate = (SeekBar)findViewById(R.id.rotate);

adapterScale = new ArrayAdapter<String>(this,
R.layout.my_spinner, strScale);

adapterScale.setDropDownViewResource(android.R.layout.simple_spinner_drop
down_item);

spinnerScale.setAdapter(adapterScale);
spinnerScale.setSelection(SpinnerSelect);
curScale = 1F;
139

//bitmap = BitmapFactory.decodeFile(imageInSD);
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.rotate);
bmpWidth = bitmap.getWidth();
bmpHeight = bitmap.getHeight();

drawMatrix();


spinnerScale.setOnItemSelectedListener(spinnerScaleOnItemSelectedListener
);

seekbarRotate.setOnSeekBarChangeListener(seekbarRotateSeekBarChangeListen
er);

}

@Override
protected void onStart() {
super.onStart();
// in order to receive broadcasted intents we need to register our
receiver
registerReceiver(arduinoReceiver, new
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

// this is how you tell Amarino to connect to a specific BT device
from within your own code
Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, sfss,
nservo);
// load last state
SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(this);
pos = prefs.getInt("pos", 0);
// set seekbars and feedback color according to last state
seekbarRotate.setProgress(pos);

new Thread(){
public void run(){
try {
Thread.sleep(6000);
} catch (InterruptedException e) {}
updatePos();
}
}.start();

}
140

@Override
protected void onStop() {
super.onStop();
// save state
pos= seekbarRotate.getProgress();
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putInt("pos", pos)
.putBoolean("flag", loaded)
.commit();

// stop Amarino's background service, we don't need it any
more
}

private void updatePos(){
// I have chosen random small letters for the flag 'o' for
red, 'p' for green and 'q' for blue
// you could select any small letter you want
// however be sure to match the character you register a
function for your in Arduino sketch
Amarino.sendDataToArduino(this, DEVICE_ADDRESS, sfsd, pos);
//textView2.setText(pos);
}


private void drawMatrix(){

Matrix matrix = new Matrix();
matrix.postScale(curScale, curScale);
matrix.postRotate(curRotate);

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth,
bmpHeight, matrix, true);
myImageView.setImageBitmap(resizedBitmap);

}

private SeekBar.OnSeekBarChangeListener
seekbarRotateSeekBarChangeListener
= new SeekBar.OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
141
// TODO Auto-generated method stub
curRotate = (float)progress;
drawMatrix();
value.setText(Integer.toString(progress/2));

if (System.currentTimeMillis() - lastChange > DELAY ){
updateState(seekBar);
lastChange = System.currentTimeMillis();
}
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
lastChange = System.currentTimeMillis();
updateState(seekBar);

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
lastChange = System.currentTimeMillis();
updateState(seekBar);

}};

private void updateState(final SeekBar seekBar) {
pos = (seekBar.getProgress())/2;
updatePos();
}

private Spinner.OnItemSelectedListener
spinnerScaleOnItemSelectedListener
= new Spinner.OnItemSelectedListener(){

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int index, long arg3) {
// TODO Auto-generated method stub
//curScale = floatScale[arg2];
//drawMatrix();
SpinnerSelect= index;
refresh();
}

142
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
spinnerScale.setSelection(SpinnerSelect);
//curScale = floatScale[SpinnerSelect];
}};


private class ArduinoReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String data = null;

// the device address from which the data was sent, we don't
need it here but to demonstrate how you retrieve it
final String address =
intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS);

// the type of data which is added to the intent
final int dataType =
intent.getIntExtra(AmarinoIntent.EXTRA_DATA_TYPE, -1);

// we only expect String data though, but it is better to
check if really string was sent
// later Amarino will support differnt data types, so far
data comes always as string and
// you have to parse the data to the type you have sent from
Arduino, like it is shown below
if (dataType == AmarinoIntent.STRING_EXTRA){
data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA);

if ((data != null)&(loaded ==false)){
try {
parse(data);
} catch (Exception e) {
e.printStackTrace();
}
refresh();
int x=0;
for (int i = 0; i < 7; i++) {
if (servopos[nservo][i] != 0) x++;
}
if (x == 7) {

Amarino.sendDataToArduino(getBaseContext(), DEVICE_ADDRESS, sfo,
"0");
143
loaded = true;
}
}
}
}
}

private void parse(String jString) throws Exception {

jObject = new JSONObject(jString);

JSONObject menuObject = jObject.getJSONObject("servo" +
nservo);
//String attributeId = menuObject.getString("id");
for (int i = 0; i < 7; i++) {
servopos[nservo][i] = menuObject.getInt("p"+ (i+1));
}

}

private void refresh (){
pos = servopos[nservo][SpinnerSelect];
pos = 2*pos;
seekbarRotate.setProgress(pos);
//value.setText(Integer.toString(pos));
}


}



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="befaust.jorges119.eclipseBT"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
android:icon="@drawable/servo_norm"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".HomeActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

144
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>

<activity
android:label="Configuration"
android:name=".Configuration" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.Configuration" />
</intent-filter>
</activity>

<activity
android:label="Manual"
android:name=".Manual" >
<intent-filter >
<action android:name="befaust.jorges119.eclipseBT.Manual"
/>
</intent-filter>
</activity>

<activity
android:label="ServoSel"
android:name=".ServoSel" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.ServoSel" />
</intent-filter>
</activity>


<activity
android:label="ServoSF"
android:name=".ServoSF" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.ServoSF" />
</intent-filter>
</activity>


<activity
android:label="Motor"
android:name=".Motor" >
<intent-filter >
<action android:name="befaust.jorges119.eclipseBT.Motor"
/>
</intent-filter>
</activity>


<activity
android:label="MasterLight"
android:name=".MasterLight" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.MasterLight" />
</intent-filter>
</activity>

<activity
android:label="Leds"
android:name=".Leds" >
<intent-filter >
<action android:name="befaust.jorges119.eclipseBT.Leds"
/>
</intent-filter>
</activity>
145

<activity
android:label="PressureUp"
android:name=".PressureUp" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.PressureUp" />
</intent-filter>
</activity>


<activity
android:label="PressureDown"
android:name=".PressureDown" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.PressureDown" />
</intent-filter>
</activity>

<activity
android:label="PresSel"
android:name=".PresSel" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.PresSel" />
</intent-filter>
</activity>

<activity
android:label="ServoCont"
android:name=".ServoCont" >
<intent-filter >
<action
android:name="befaust.jorges119.eclipseBT.ServoCont" />
</intent-filter>
</activity>

<activity
android:label="Sys"
android:name=".Sys" >
<intent-filter >
<action android:name="befaust.jorges119.eclipseBT.Sys" />
</intent-filter>
</activity>

</application>

</manifest>


Apndice F: Variantes & PnP

Low PnP
Designator Footprint Mid X Mid Y Ref X Ref Y Pad X Pad Y TB Rotation Comment

P3 HDR2X3 4710mil 3265mil 4610mil 3215mil 4610mil 3215mil T 0.00 Header 3X2H, PIN CORTO
C1 T491X 2290mil 6375mil 2290mil 6375mil 2183.7mil 6375mil T 180.00 Cap Pol3, 407-0025
C2 CapElec 3237.5mil 6330mil 3240mil 6330mil 3340mil 6330mil T 0.00 Cap Pol3, 737-3021
C3 C0805 2315mil 6210mil 2315mil 6210mil 2285.472mil 6210mil T 360.00 0.1u, 264-4422
146
C4 C0805 3615mil 3949.999mil 3615mil 3949.999mil 3615mil 3979.527mil B 270.00 Cap Semi, 264-4258
C6 C0805 3705mil 3955mil 3705mil 3955mil 3705mil 3925.472mil T 90.00 Cap Semi, 264-4258
C7 C0805 3295mil 3950mil 3295mil 3950mil 3295mil 3979.528mil T 270.00 Cap Semi, 264-4258
C10 C0805 3075mil 4735mil 3075mil 4735mil 3104.528mil 4735mil T 180.00 Cap Semi, 264-4422
C11 C0805 3985mil 4405mil 3985mil 4405mil 4014.528mil 4405mil T 180.00 Cap Semi, 264-4422
C12 C0805 3380mil 3955mil 3380mil 3955mil 3380mil 3984.528mil T 270.00 Cap Semi, 264-4422
C13 C0805 3300mil 4925mil 3300mil 4925mil 3300mil 4954.528mil T 270.00 Cap Semi, 264-4422
D1 DIODE_SMC 3250mil 6025mil 3250mil 6025mil 3100mil 6025mil T 180.00 Diode 1N4005, 629-0473
D2 3.2X1.6X1.1 2540mil 5560mil 2540mil 5560mil 2540mil 5628.898mil T 270.00 HSMD-C150, 692-0969
P1 HDR2X3 2770mil 4650mil 2720mil 4750mil 2720mil 4750mil T 270.00 Header 3X2, PIN CORTO
P2 HDR1X2 4435mil 3880mil 4435mil 3930mil 4435mil 3930mil T 270.00 Header 2
S1 HDR1X3 2140mil 3540mil 2140mil 3440mil 2140mil 3440mil T 90.00 Header 3H, PIN CORTO 90
S4 HDR1X3 2140mil 5220mil 2140mil 5120mil 2140mil 5120mil T 90.00 Header 3H, PIN CORTO 90
LEFT HDR2X6 3890mil 6190mil 3640mil 6140mil 3640mil 6140mil T 360.00 Header 6X2H, PIN CORTO
RIGTH HDR2X6 5560mil 6190mil 5310mil 6140mil 5310mil 6140mil T 360.00 Header 6X2H, PIN CORTO
S2 HDR1X3 2140mil 4095mil 2140mil 3995mil 2140mil 3995mil T 90.00 Header 3H, PIN CORTO 90
S6 HDR1X3 2475mil 4650mil 2475mil 4550mil 2475mil 4550mil T 90.00 Header 3H, PIN CORTO 90
S3 HDR1X3 2140mil 4650mil 2140mil 4550mil 2140mil 4550mil T 90.00 Header 3H, PIN CORTO 90
S5 HDR1X3 2475mil 4095mil 2475mil 3995mil 2475mil 3995mil T 90.00 Header 3H, PIN CORTO 90
CENTER HDR2X6 4725mil 6190mil 4475mil 6140mil 4475mil 6140mil T 360.00 Header 6X2H, PIN CORTO
SPARE HDR2X6 6395mil 6190mil 6145mil 6140mil 6145mil 6140mil T 360.00 Header 6X2H, PIN CORTO
MASTER HDR2X6 7230mil 6190mil 6980mil 6140mil 6980mil 6140mil T 360.00 Header 6X2H, PIN CORTO
OUT1 HDR1X20 3355mil 3215mil 4305mil 3215mil 4305mil 3215mil T 180.00 Header 20, PIN HEMBRA
OUT2 HDR1X20 7750mil 5220mil 7750mil 6170mil 7750mil 6170mil T 270.00 Header 20, PIN HEMBRA
R1 6-0805_N 6470mil 5790mil 6470mil 5789.999mil 6470mil 5754.567mil B 90.00 Res3, 679-1207
R2 6-0805_N 2540mil 5830.001mil 2540mil 5830mil 2540mil 5794.568mil T 90.00 1K, 740-9063
R4 SO-16 5170.001mil 4865mil 5170mil 4865mil 5033.19mil 5040mil T 270.00 EXBM16P, 522-4992
R5 6-0805_N 3630.001mil 4935mil 3630mil 4935mil 3594.568mil 4935mil T 360.00 Res3, 740-9063
R6 6-0805_N 4205.001mil 3830mil 4205mil 3830mil 4169.568mil 3830mil T 0.00 Res3, 740-9063
R7 6-0805_N 5585mil 5705mil 5585mil 5704.999mil 5585mil 5669.567mil B 90.00 Res3, 740-9072
R8 6-0805_N 4200.001mil 4000mil 4200mil 4000mil 4164.568mil 4000mil T 0.00 Res3, 740-9063
R9 6-0805_N 5075.001mil 4275mil 5075mil 4275mil 5039.568mil 4275mil T 360.00 Res3, 721-7924
R10 6-0805_N 5075.001mil 4085mil 5075mil 4085mil 5039.568mil 4085mil T 360.00 Res3, 740-9035
R11 6-0805_N 6335mil 5745mil 6335mil 5744.999mil 6335mil 5709.567mil B 90.00 Res3, 740-9072
R12 6-0805_N 4765mil 3570mil 4765mil 3569.999mil 4765mil 3534.567mil B 90.00 Res3, 740-9031
R13 6-0805_N 4650mil 3570mil 4650mil 3569.999mil 4650mil 3534.567mil B 90.00 Res3, 740-9031
R14 6-0805_N 7465mil 5700mil 7465mil 5699.999mil 7465mil 5664.567mil B 90.00 Res3, 740-9072
R15 6-0805_N 5100mil 3700mil 5100mil 3700mil 5100mil 3735.434mil T 270.00 Res3, 740-9063
R16 6-0805_N 4930mil 3695mil 4930mil 3695mil 4930mil 3730.434mil T 270.00 Res3, 740-9063
R17 6-0805_N 3485mil 3950mil 3485mil 3949.999mil 3485mil 3914.567mil B 90.00 Res3, 740-9072
R18 6-0805_N 6765mil 5715mil 6765mil 5714.999mil 6765mil 5679.567mil B 90.00 Res3, 740-9072
R19 6-0805_N 3510mil 3425mil 3510mil 3425mil 3545.434mil 3425mil T 180.00 Res3, 679-1187
R20 6-0805_N 3510mil 3545mil 3510mil 3545mil 3545.434mil 3545mil T 180.00 Res3, 679-1049
U2 MP04A_N 2810mil 5715mil 2810mil 5715mil 2900.552mil 5829.174mil T 270.00 LM2940IMP-5.0/NOPB, 727-4790
U3 SO20_N 5865mil 5545mil 5865mil 5545mil 6044.134mil 5320mil T 180.00 L293DD, 714-0625
U4 100A_N 3505mil 4440mil 3505mil 4440mil 3207.756mil 4676.22mil T 360.00 ATmega2560-16AU, 666-4530
U5 SO20_N 7070mil 5540mil 7070mil 5540mil 6890.866mil 5765mil T 0.00 L293DD, 714-0625
Y1 HC49/4H_SMX 3510mil 3745mil 3510mil 3745mil 3697.008mil 3745mil T 180.00 16MHz, 478-9505
J1 DC_JACK 2686.575mil 6177.815mil 2785mil 6595mil 2785mil 6055.63mil T 270.00 PWR2.5, 487-848


High PnP

147
Designator Footprint Mid X Mid Y Ref X Ref Y Pad X Pad Y TB Rotation Comment

P3 HDR2X3 119.634mm 82.931mm 117.094mm 81.661mm 117.094mm 81.661mm T 0.00 Header 3X2H, PIN CORTO
BT1 WT11 174.146mm 90.436mm 183.896mm 97.536mm 183.896mm 97.536mm T 270.00 Bluegiga WT11, 537-846
C1 T491X 58.166mm 161.925mm 58.166mm 161.925mm 55.466mm 161.925mm T 180.00 Cap Pol3, 407-0025
C2 CapElec 82.2325mm 160.782mm 82.296mm 160.782mm 84.836mm 160.782mm T 0.00 Cap Pol3, 737-3021
C3 C0805 58.801mm 157.734mm 58.801mm 157.734mm 58.051mm 157.734mm T 360.00 0.1u, 264-4422
C4 C0805 91.821mm 100.33mm 91.821mm 100.33mm 91.821mm 101.08mm B 270.00 Cap Semi, 264-4258
C5 C0805 113.03mm 124.714mm 113.03mm 124.714mm 113.03mm 123.964mm T 90.00 Cap Semi, 264-4422
C6 C0805 94.107mm 100.457mm 94.107mm 100.457mm 94.107mm 99.707mm T 90.00 Cap Semi, 264-4258
C7 C0805 83.693mm 100.33mm 83.693mm 100.33mm 83.693mm 101.08mm T 270.00 Cap Semi, 264-4258
C10 C0805 78.105mm 120.269mm 78.105mm 120.269mm 78.855mm 120.269mm T 180.00 Cap Semi, 264-4422
C11 C0805 101.219mm 111.887mm 101.219mm 111.887mm 101.969mm 111.887mm T 180.00 Cap Semi, 264-4422
C12 C0805 85.852mm 100.457mm 85.852mm 100.457mm 85.852mm 101.207mm T 270.00 Cap Semi, 264-4422
C13 C0805 83.82mm 125.095mm 83.82mm 125.095mm 83.82mm 125.845mm T 270.00 Cap Semi, 264-4422
C14 C0805 154.432mm 115.951mm 154.432mm 115.951mm 153.682mm 115.951mm T 360.00 Cap Semi, 264-4258
C15 C0805 141.224mm 113.538mm 141.224mm 113.538mm 140.474mm 113.538mm T 360.00 Cap Semi, 264-4422
C16 C0805 138.176mm 110.363mm 138.176mm 110.363mm 137.426mm 110.363mm B 360.00 Cap Semi, 264-4422
C17 C0805 136.017mm 94.488mm 136.017mm 94.488mm 136.017mm 95.238mm T 270.00 Cap Semi, 264-4258
C18 C0805 144.526mm 94.615mm 144.526mm 94.615mm 144.526mm 95.365mm T 270.00 Cap Semi, 264-4258
C19 293D 126.111mm 144.653mm 126.111mm 144.653mm 126.111mm 147.653mm B 90.00 Cap Pol3, 684-3998
C21 C0805 92.71mm 130.81mm 92.71mm 130.81mm 91.96mm 130.81mm B 360.00 Cap Semi, 264-4422
C24 C0805 108.204mm 146.685mm 108.204mm 146.685mm 108.954mm 146.685mm B 180.00 Cap Semi, 264-4422
C25 C0805 130.429mm 131.191mm 130.429mm 131.191mm 130.429mm 130.441mm B 90.00 Cap Semi, 264-4422
C26 C0805 118.364mm 139.7mm 118.364mm 139.7mm 117.614mm 139.7mm B 360.00 Cap Semi, 264-4450
D1 DIODE_SMC 82.55mm 153.035mm 82.55mm 153.035mm 78.74mm 153.035mm T 180.00 Diode 1N4005, 629-0473
D2 3.2X1.6X1.1 64.516mm 141.224mm 64.516mm 141.224mm 64.516mm 142.974mm T 270.00 HSMD-C150, 692-0969
J2 1-1470156 57.994mm 147.955mm 45.339mm 147.955mm 60.349mm 146.705mm T 180.00 1-1470156-1, 748-0866
P1 HDR2X3 70.358mm 118.11mm 69.088mm 120.65mm 69.088mm 120.65mm T 270.00 Header 3X2, PIN CORTO
P2 HDR1X2 112.649mm 98.552mm 112.649mm 99.822mm 112.649mm 99.822mm T 270.00 Header 2
P4 HDR2X3 166.243mm 110.617mm 167.513mm 108.077mm 167.513mm 108.077mm T 90.00 Header 3X2, PIN CORTO
S1 HDR1X3 54.356mm 89.916mm 54.356mm 87.376mm 54.356mm 87.376mm T 90.00 Header 3H, PIN CORTO 90
S4 HDR1X3 54.356mm 132.588mm 54.356mm 130.048mm 54.356mm 130.048mm T 90.00 Header 3H, PIN CORTO 90
LEFT HDR2X6 98.806mm 157.226mm 92.456mm 155.956mm 92.456mm 155.956mm T 360.00 Header 6X2H, PIN CORTO
RIGTH HDR2X6 141.224mm 157.226mm 134.874mm 155.956mm 134.874mm 155.956mm T 360.00 Header 6X2H, PIN CORTO
S2 HDR1X3 54.356mm 104.013mm 54.356mm 101.473mm 54.356mm 101.473mm T 90.00 Header 3H, PIN CORTO 90
S6 HDR1X3 62.865mm 118.11mm 62.865mm 115.57mm 62.865mm 115.57mm T 90.00 Header 3H, PIN CORTO 90
S3 HDR1X3 54.356mm 118.11mm 54.356mm 115.57mm 54.356mm 115.57mm T 90.00 Header 3H, PIN CORTO 90
S5 HDR1X3 62.865mm 104.013mm 62.865mm 101.473mm 62.865mm 101.473mm T 90.00 Header 3H, PIN CORTO 90
CENTER HDR2X6 120.015mm 157.226mm 113.665mm 155.956mm 113.665mm 155.956mm T 360.00 Header 6X2H, PIN CORTO
SPARE HDR2X6 162.433mm 157.226mm 156.083mm 155.956mm 156.083mm 155.956mm T 360.00 Header 6X2H, PIN CORTO
MASTER HDR2X6 183.642mm 157.226mm 177.292mm 155.956mm 177.292mm 155.956mm T 360.00 Header 6X2H, PIN CORTO
OUT1 HDR1X20 85.217mm 81.661mm 109.347mm 81.661mm 109.347mm 81.661mm T 180.00 Header 20, PIN HEMBRA
OUT2 HDR1X20 196.85mm 132.588mm 196.85mm 156.718mm 196.85mm 156.718mm T 270.00 Header 20, PIN HEMBRA
Q5 SOT-23_N 122.047mm 131.318mm 122.047mm 131.318mm 120.922mm 130.368mm B 360.00 IRLML5103, 671-0435
R1 6-0805_N 164.338mm 147.066mm 164.338mm 147.066mm 164.338mm 146.166mm B 90.00 Res3, 679-1207
R2 6-0805_N 64.516mm 148.082mm 64.516mm 148.082mm 64.516mm 147.182mm T 90.00 1K, 740-9063
R3 POT4MM-2 165.735mm 123.571mm 165.735mm 123.571mm 164.585mm 125.571mm T 270.00 10K, 725-0101
R4 SO-16 131.318mm 123.571mm 131.318mm 123.571mm 127.843mm 128.016mm T 270.00 EXBM16P, 522-4992
R5 6-0805_N 92.202mm 125.349mm 92.202mm 125.349mm 91.302mm 125.349mm T 360.00 Res3, 740-9063
R6 6-0805_N 106.807mm 97.282mm 106.807mm 97.282mm 105.907mm 97.282mm T 0.00 Res3, 740-9063
R7 6-0805_N 141.859mm 144.907mm 141.859mm 144.907mm 141.859mm 144.007mm B 90.00 Res3, 740-9072
R8 6-0805_N 106.68mm 101.6mm 106.68mm 101.6mm 105.78mm 101.6mm T 0.00 Res3, 740-9063
R9 6-0805_N 128.905mm 108.585mm 128.905mm 108.585mm 128.005mm 108.585mm T 360.00 Res3, 721-7924
148
R10 6-0805_N 128.905mm 103.759mm 128.905mm 103.759mm 128.005mm 103.759mm T 360.00 Res3, 740-9035
R11 6-0805_N 160.909mm 145.923mm 160.909mm 145.923mm 160.909mm 145.023mm B 90.00 Res3, 740-9072
R12 6-0805_N 121.031mm 90.678mm 121.031mm 90.678mm 121.031mm 89.778mm B 90.00 Res3, 740-9031
R13 6-0805_N 118.11mm 90.678mm 118.11mm 90.678mm 118.11mm 89.778mm B 90.00 Res3, 740-9031
R14 6-0805_N 189.611mm 144.78mm 189.611mm 144.78mm 189.611mm 143.88mm B 90.00 Res3, 740-9072
R15 6-0805_N 129.54mm 93.98mm 129.54mm 93.98mm 129.54mm 94.88mm T 270.00 Res3, 740-9063
R16 6-0805_N 125.222mm 93.853mm 125.222mm 93.853mm 125.222mm 94.753mm T 270.00 Res3, 740-9063
R17 6-0805_N 88.519mm 100.33mm 88.519mm 100.33mm 88.519mm 99.43mm B 90.00 Res3, 740-9072
R18 6-0805_N 171.831mm 145.161mm 171.831mm 145.161mm 171.831mm 144.261mm B 90.00 Res3, 740-9072
R19 6-0805_N 89.154mm 86.995mm 89.154mm 86.995mm 90.054mm 86.995mm T 180.00 Res3, 679-1187
R20 6-0805_N 89.154mm 90.043mm 89.154mm 90.043mm 90.054mm 90.043mm T 180.00 Res3, 679-1049
R21 6-0805_N 154.559mm 120.904mm 154.559mm 120.904mm 153.659mm 120.904mm T 0.00 Res3, 740-9072
R22 6-0805_N 122.682mm 108.585mm 122.682mm 108.585mm 123.582mm 108.585mm T 180.00 Res3, 740-9035
R23 6-0805_N 122.809mm 103.886mm 122.809mm 103.886mm 123.709mm 103.886mm T 180.00 Res3, 740-9035
R24 6-0805_N 155.702mm 85.344mm 155.702mm 85.344mm 156.602mm 85.344mm T 180.00 Res3, 679-1207
R25 6-0805_N 122.936mm 99.822mm 122.936mm 99.822mm 123.836mm 99.822mm T 180.00 Res3, 679-1207
R26 6-0805_N 140.081mm 86.106mm 140.081mm 86.106mm 140.981mm 86.106mm B 180.00 Res3, 679-1187
R27 6-0805_N 140.081mm 94.742mm 140.081mm 94.742mm 140.981mm 94.742mm B 180.00 Res3, 679-1049
R31 6-0805_N 140.208mm 131.064mm 140.208mm 131.064mm 140.208mm 131.964mm B 270.00 Res3, 740-9072
R32 6-0805_N 135.382mm 131.064mm 135.382mm 131.064mm 135.382mm 130.164mm B 90.00 Res3, 740-9072
RT1 6-0805_N 111.252mm 132.334mm 111.252mm 132.334mm 110.352mm 132.334mm T 0.00 Res Thermal, 691-7500
U1 M08A_N 166.751mm 140.843mm 166.751mm 140.843mm 169.151mm 142.748mm B 180.00 LM335M/NOPB, 535-9111
U2 MP04A_N 71.374mm 145.161mm 71.374mm 145.161mm 73.674mm 148.061mm T 270.00 LM2940IMP-5.0/NOPB, 727-4790
U3 SO20_N 148.971mm 140.843mm 148.971mm 140.843mm 153.521mm 135.128mm T 180.00 L293DD, 714-0625
U4 100A_N 89.027mm 112.776mm 89.027mm 112.776mm 81.477mm 118.776mm T 360.00 ATmega2560-16AU, 666-4530
U5 SO20_N 179.578mm 140.716mm 179.578mm 140.716mm 175.028mm 146.431mm T 0.00 L293DD, 714-0625
U7 SOP8_N 69.469mm 107.061mm 69.469mm 107.061mm 66.969mm 105.156mm B 360.00 ST95P08M1, 686-2258
U8 32A_N 140.208mm 103.505mm 140.208mm 103.505mm 137.408mm 99.305mm T 90.00 ATmega328-AU, 738-0432
U9 MF05A_N 117.602mm 147.955mm 117.602mm 147.955mm 118.552mm 146.755mm B 90.00 LP2985AIM5-3.3, 652-0033
U11 D008_L 137.16mm 143.764mm 137.16mm 143.764mm 139.51mm 145.669mm B 180.00 LM358D, 661-0549
Y1 HC49/4H_SMX 89.154mm 95.123mm 89.154mm 95.123mm 93.904mm 95.123mm T 180.00 16MHz, 478-9505
Y2 HC49/4H_SMX 139.954mm 89.662mm 139.954mm 89.662mm 135.204mm 89.662mm T 360.00 16MHz, 478-9505
J1 DC_JACK 68.239mm 156.9165mm 70.739mm 167.513mm 70.739mm 153.813mm T 270.00 PWR2.5, 487-848

Prototype PnP
Designator Footprint Mid X Mid Y Ref X Ref Y Pad X Pad Y TB Rotation Comment

P3 HDR2X3 4710mil 3265mil 4610mil 3215mil 4610mil 3215mil T 0.00 Header 3X2H, PIN CORTO
BT1 WT11 6856.142mil 3560.472mil 7240mil 3840mil 7240mil 3840mil T 270.00 Bluegiga WT11, 537-846
C1 T491X 2290mil 6375mil 2290mil 6375mil 2183.7mil 6375mil T 180.00 Cap Pol3, 407-0025
C2 CapElec 3237.5mil 6330mil 3240mil 6330mil 3340mil 6330mil T 0.00 Cap Pol3, 737-3021
C3 C0805 2315mil 6210mil 2315mil 6210mil 2285.472mil 6210mil T 360.00 0.1u, 264-4422
C4 C0805 3615mil 3949.999mil 3615mil 3949.999mil 3615mil 3979.527mil B 270.00 Cap Semi, 264-4258
C5 C0805 4450mil 4910mil 4450mil 4910mil 4450mil 4880.472mil T 90.00 Cap Semi, 264-4422
C6 C0805 3705mil 3955mil 3705mil 3955mil 3705mil 3925.472mil T 90.00 Cap Semi, 264-4258
C7 C0805 3295mil 3950mil 3295mil 3950mil 3295mil 3979.528mil T 270.00 Cap Semi, 264-4258
C8 C0805 2950mil 4210mil 2950mil 4210mil 2979.528mil 4210mil T 180.00 Cap Semi, 264-4422
C9 C0805 2965mil 3950mil 2965mil 3950mil 2965mil 3920.472mil T 90.00 Cap Semi, 691-1161
C10 C0805 3075mil 4735mil 3075mil 4735mil 3104.528mil 4735mil T 180.00 Cap Semi, 264-4422
C11 C0805 3985mil 4405mil 3985mil 4405mil 4014.528mil 4405mil T 180.00 Cap Semi, 264-4422
C12 C0805 3380mil 3955mil 3380mil 3955mil 3380mil 3984.528mil T 270.00 Cap Semi, 264-4422
C13 C0805 3300mil 4925mil 3300mil 4925mil 3300mil 4954.528mil T 270.00 Cap Semi, 264-4422
C14 C0805 6080mil 4565mil 6080mil 4565mil 6050.472mil 4565mil T 360.00 Cap Semi, 264-4258
149
C15 C0805 5560mil 4470mil 5560mil 4470mil 5530.472mil 4470mil T 360.00 Cap Semi, 264-4422
C16 C0805 5439.999mil 4345mil 5439.999mil 4345mil 5410.471mil 4345mil B 360.00 Cap Semi, 264-4422
C17 C0805 5355mil 3720mil 5355mil 3720mil 5355mil 3749.528mil T 270.00 Cap Semi, 264-4258
C18 C0805 5690mil 3725mil 5690mil 3725mil 5690mil 3754.528mil T 270.00 Cap Semi, 264-4258
C20 C0805 4475mil 5920mil 4475mil 5920mil 4504.528mil 5920mil T 180.00 Cap Semi, 264-4422
C21 C0805 3649.999mil 5150mil 3649.999mil 5150mil 3620.471mil 5150mil B 360.00 Cap Semi, 264-4422
C22 C0805 3305mil 5650mil 3305mil 5650mil 3334.528mil 5650mil T 180.00 Cap Semi, 264-4422
C23 C0805 3020mil 3475mil 3020mil 3475mil 3020mil 3445.472mil T 90.00 Cap Semi, 264-4422
C24 C0805 4259.999mil 5775mil 4259.999mil 5775mil 4289.527mil 5775mil B 180.00 Cap Semi, 264-4422
C25 C0805 5135mil 5164.999mil 5135mil 5164.999mil 5135mil 5135.471mil B 90.00 Cap Semi, 264-4422
D1 DIODE_SMC 3250mil 6025mil 3250mil 6025mil 3100mil 6025mil T 180.00 Diode 1N4005, 629-0473
D2 3.2X1.6X1.1 2540mil 5560mil 2540mil 5560mil 2540mil 5628.898mil T 270.00 HSMD-C150, 692-0969
D3 3.2X1.6X1.1 3243.898mil 5165mil 3243.898mil 5165mil 3175mil 5165mil T 360.00 HSMD-C150, 692-0969
D4 3.2X1.6X1.1 3248.898mil 5290mil 3248.898mil 5290mil 3180mil 5290mil T 360.00 HSMD-C150, 692-0969
J2 1-1470156 2283.228mil 5825mil 1785mil 5825mil 2375.944mil 5775.788mil T 180.00 1-1470156-1, 748-0866
P1 HDR2X3 2770mil 4650mil 2720mil 4750mil 2720mil 4750mil T 270.00 Header 3X2, PIN CORTO
P2 HDR1X2 4435mil 3880mil 4435mil 3930mil 4435mil 3930mil T 270.00 Header 2
P4 HDR2X3 6545mil 4355mil 6595mil 4255mil 6595mil 4255mil T 90.00 Header 3X2, PIN CORTO
P5 HDR1X14 6940mil 4060mil 7590mil 4060mil 7590mil 4060mil T 180.00 MHDR1X14
P6 HDR1X14 6940mil 3110mil 7590mil 3110mil 7590mil 3110mil T 180.00 MHDR1X14
S1 HDR1X3 2140mil 3540mil 2140mil 3440mil 2140mil 3440mil T 90.00 Header 3H, PIN CORTO 90
S4 HDR1X3 2140mil 5220mil 2140mil 5120mil 2140mil 5120mil T 90.00 Header 3H, PIN CORTO 90
LEFT HDR2X6 3890mil 6190mil 3640mil 6140mil 3640mil 6140mil T 360.00 Header 6X2H, PIN CORTO
RIGTH HDR2X6 5560mil 6190mil 5310mil 6140mil 5310mil 6140mil T 360.00 Header 6X2H, PIN CORTO
S2 HDR1X3 2140mil 4095mil 2140mil 3995mil 2140mil 3995mil T 90.00 Header 3H, PIN CORTO 90
S6 HDR1X3 2475mil 4650mil 2475mil 4550mil 2475mil 4550mil T 90.00 Header 3H, PIN CORTO 90
S3 HDR1X3 2140mil 4650mil 2140mil 4550mil 2140mil 4550mil T 90.00 Header 3H, PIN CORTO 90
S5 HDR1X3 2475mil 4095mil 2475mil 3995mil 2475mil 3995mil T 90.00 Header 3H, PIN CORTO 90
CENTER HDR2X6 4725mil 6190mil 4475mil 6140mil 4475mil 6140mil T 360.00 Header 6X2H, PIN CORTO
SPARE HDR2X6 6395mil 6190mil 6145mil 6140mil 6145mil 6140mil T 360.00 Header 6X2H, PIN CORTO
MASTER HDR2X6 7230mil 6190mil 6980mil 6140mil 6980mil 6140mil T 360.00 Header 6X2H, PIN CORTO
OUT1 HDR1X20 3355mil 3215mil 4305mil 3215mil 4305mil 3215mil T 180.00 Header 20, PIN HEMBRA
OUT2 HDR1X20 7750mil 5220mil 7750mil 6170mil 7750mil 6170mil T 270.00 Header 20, PIN HEMBRA
Q1 SOT23_N 5800mil 5714.999mil 5800mil 5714.999mil 5762.598mil 5756.337mil B 270.00 PDTC114YT, 518-2775
Q2 SOT23_N 6095mil 5709.999mil 6095mil 5709.999mil 6057.598mil 5751.337mil B 270.00 PDTC114YT, 518-2775
Q3 SOT23_N 7265mil 5704.999mil 7265mil 5704.999mil 7227.598mil 5746.337mil B 270.00 PDTC114YT, 518-2775
Q4 SOT23_N 6980mil 5704.999mil 6980mil 5704.999mil 7017.402mil 5746.337mil B 270.00 PDTC114YT, 518-2775
Q5 SOT-23_N 4804.999mil 5170mil 4804.999mil 5170mil 4760.707mil 5132.598mil B 360.00 IRLML5103, 671-0435
R1 6-0805_N 6470mil 5790mil 6470mil 5789.999mil 6470mil 5754.567mil B 90.00 Res3, 679-1207
R2 6-0805_N 2540mil 5830.001mil 2540mil 5830mil 2540mil 5794.568mil T 90.00 1K, 740-9063
R3 POT4MM-2 6525mil 4865mil 6525mil 4865mil 6479.724mil 4943.74mil T 270.00 10K, 725-0101
R4 SO-16 5170.001mil 4865mil 5170mil 4865mil 5033.19mil 5040mil T 270.00 EXBM16P, 522-4992
R5 6-0805_N 3630.001mil 4935mil 3630mil 4935mil 3594.568mil 4935mil T 360.00 Res3, 740-9063
R6 6-0805_N 4205.001mil 3830mil 4205mil 3830mil 4169.568mil 3830mil T 0.00 Res3, 740-9063
R7 6-0805_N 5585mil 5705mil 5585mil 5704.999mil 5585mil 5669.567mil B 90.00 Res3, 740-9072
R8 6-0805_N 4200.001mil 4000mil 4200mil 4000mil 4164.568mil 4000mil T 0.00 Res3, 740-9063
R9 6-0805_N 5075.001mil 4275mil 5075mil 4275mil 5039.568mil 4275mil T 360.00 Res3, 721-7924
R10 6-0805_N 5075.001mil 4085mil 5075mil 4085mil 5039.568mil 4085mil T 360.00 Res3, 740-9035
R11 6-0805_N 6335mil 5745mil 6335mil 5744.999mil 6335mil 5709.567mil B 90.00 Res3, 740-9072
R12 6-0805_N 4765mil 3570mil 4765mil 3569.999mil 4765mil 3534.567mil B 90.00 Res3, 740-9031
R13 6-0805_N 4650mil 3570mil 4650mil 3569.999mil 4650mil 3534.567mil B 90.00 Res3, 740-9031
R14 6-0805_N 7465mil 5700mil 7465mil 5699.999mil 7465mil 5664.567mil B 90.00 Res3, 740-9072
R15 6-0805_N 5100mil 3700mil 5100mil 3700mil 5100mil 3735.434mil T 270.00 Res3, 740-9063
R16 6-0805_N 4930mil 3695mil 4930mil 3695mil 4930mil 3730.434mil T 270.00 Res3, 740-9063
150
R17 6-0805_N 3485mil 3950mil 3485mil 3949.999mil 3485mil 3914.567mil B 90.00 Res3, 740-9072
R18 6-0805_N 6765mil 5715mil 6765mil 5714.999mil 6765mil 5679.567mil B 90.00 Res3, 740-9072
R19 6-0805_N 3510mil 3425mil 3510mil 3425mil 3545.434mil 3425mil T 180.00 Res3, 679-1187
R20 6-0805_N 3510mil 3545mil 3510mil 3545mil 3545.434mil 3545mil T 180.00 Res3, 679-1049
R21 6-0805_N 6085.001mil 4760mil 6085mil 4760mil 6049.568mil 4760mil T 0.00 Res3, 740-9072
R22 6-0805_N 4830mil 4275mil 4830mil 4275mil 4865.434mil 4275mil T 180.00 Res3, 740-9035
R23 6-0805_N 4835mil 4090mil 4835mil 4090mil 4870.434mil 4090mil T 180.00 Res3, 740-9035
R24 6-0805_N 6130mil 3360mil 6130mil 3360mil 6165.434mil 3360mil T 180.00 Res3, 679-1207
R25 6-0805_N 4840mil 3930mil 4840mil 3930mil 4875.434mil 3930mil T 180.00 Res3, 679-1207
R26 6-0805_N 5514.999mil 3390mil 5514.999mil 3390mil 5550.433mil 3390mil B 180.00 Res3, 679-1187
R27 6-0805_N 5514.999mil 3730mil 5514.999mil 3730mil 5550.433mil 3730mil B 180.00 Res3, 679-1049
R28 6-0805_N 4029.999mil 5365mil 4029.999mil 5365mil 3994.565mil 5365mil B 360.00 Res3, 740-9063
R29 6-0805_N 2968.898mil 5165mil 2968.898mil 5165mil 3004.332mil 5165mil T 180.00 Res3, 740-9063
R30 6-0805_N 2963.898mil 5280mil 2963.898mil 5280mil 2999.332mil 5280mil T 180.00 Res3, 740-9063
R31 6-0805_N 5520mil 5159.999mil 5520mil 5159.999mil 5520mil 5195.433mil B 270.00 Res3, 740-9072
R32 6-0805_N 5330mil 5160mil 5330mil 5159.999mil 5330mil 5124.567mil B 90.00 Res3, 740-9072
RT1 6-0805_N 4380.001mil 5210mil 4380mil 5210mil 4344.568mil 5210mil T 0.00 Res Thermal, 691-7500
U1 M08A_N 6564.999mil 5545mil 6564.999mil 5545mil 6659.487mil 5620mil B 180.00 LM335M/NOPB, 535-9111
U2 MP04A_N 2810mil 5715mil 2810mil 5715mil 2900.552mil 5829.174mil T 270.00 LM2940IMP-5.0/NOPB, 727-4790
U3 SO20_N 5865mil 5545mil 5865mil 5545mil 6044.134mil 5320mil T 180.00 L293DD, 714-0625
U4 100A_N 3505mil 4440mil 3505mil 4440mil 3207.756mil 4676.22mil T 360.00 ATmega2560-16AU, 666-4530
U5 SO20_N 7070mil 5540mil 7070mil 5540mil 6890.866mil 5765mil T 0.00 L293DD, 714-0625
U6 SOT-23-CH6_N 4259.999mil 5575mil 4259.999mil 5575mil 4212.755mil 5537.598mil B 360.00 MCP3421A0T-E/CH, 669-6076
U7 SOP8_N 2734.999mil 4215mil 2734.999mil 4215mil 2636.573mil 4140mil B 360.00 ST95P08M1, 686-2258
U8 32A_N 5520mil 4075mil 5520mil 4075mil 5409.764mil 3909.646mil T 90.00 ATmega328-AU, 738-0432
U10 SSOP-28_N 3654.999mil 5470mil 3654.999mil 5470mil 3519.173mil 5303.662mil B 360.00 FT232RL-Reel, 406-580
U11 D008_L 5399.999mil 5660mil 5399.999mil 5660mil 5492.519mil 5735mil B 180.00 LM358D, 661-0549
W1 RAD-0.2 7080mil 4965mil 7080mil 4965mil 6980mil 4965mil T 360.00 Jumper
W2 RAD-0.2 7085mil 5150mil 7085mil 5150mil 6985mil 5150mil T 360.00 Jumper
W3 RAD-0.2 4475mil 5655mil 4475mil 5655mil 4475mil 5555mil T 90.00 Jumper
Y1 HC49/4H_SMX 3510mil 3745mil 3510mil 3745mil 3697.008mil 3745mil T 180.00 16MHz, 478-9505
Y2 HC49/4H_SMX 5510mil 3530mil 5510mil 3530mil 5322.992mil 3530mil T 360.00 16MHz, 478-9505
J1 DC_JACK 2686.575mil 6177.815mil 2785mil 6595mil 2785mil 6055.63mil T 270.00 PWR2.5, 487-848


Apndice G: BOM

Comment Description Designator Quantity Value Ref RS
Bluegiga WT11 Bluegiga WT11-A BT1 1,00 537-846
Cap Pol3 Polarized Capacitor (Surface Mount) C1 1,00 22uF 407-0025
Cap Pol3 Polarized Capacitor (Surface Mount) C2 1,00 0.47uF 737-3021
Cap Semi Capacitor (Semiconductor SIM Model) C4, C6, C7, C14, C17, C18 6,00 22pF 264-4258
Cap Semi Capacitor (Semiconductor SIM Model) C3,C5, C8, C10, C11, C12, C13, C15, C16, C20, C21, C22, C23, C24, C25 15,00 100n 264-4422
Cap Semi Capacitor (Semiconductor SIM Model) C9 1,00 10uF 691-1161
Cap Pol3 Polarized Capacitor (Surface Mount) C19 1,00 2.2uF 684-3998
Cap Semi Capacitor (Semiconductor SIM Model) C26 1,00 1uF 264-4450
Diode 1N4005 1 Amp General Purpose Rectifier D1 1,00 629-0473
HSMD-C150 Surface Mount Chip LED, Orange D2, D3, D4 3,00 692-0969
PWR2.5 Low Voltage Power Supply Connector J1 1,00 487-848
1-1470156-1 USB 1.1, Right Angle, Thru-Hole, B Type, Receptacle, 4 Position, White J2 1,00 748-0866
Header 3X2 Header, 3-Pin, Dual row P1, P4 2,00 PIN CORTO
Header 2 Header, 2-Pin P2 1,00
Header 3X2H Header, 3-Pin, Dual row, Right Angle P3 1,00 PIN CORTO
MHDR1X14 Header, 14-Pin P5, P6 2,00 PIN HEMBRA
Header 3H Header, 3-Pin, Right Angle P7, P8, P11, P12, P13, P14 6,00 PIN CORTO 90
Header 6X2H Header, 6-Pin, Dual row, Right Angle P9, P10, P15, P16, P17 5,00 PIN CORTO
Header 20 Header, 20-Pin P18, P19 2,00 PIN HEMBRA
PDTC114YT NPN Resistor-equipped Transistor Q1, Q2, Q3, Q4 4,00 518-2775
IRLML5103 HEXFET Power MOSFET Q5 1,00 671-0435
10K Square Trimming Potentiometer R3 1,00 10k 725-0101
EXBM16P Common terminal Resistor Network R4 1,00 522-4992
Res3 Resistor R2,R5, R6, R8, R15, R16, R28, R29, R30 8,00 1K 740-9063
Res3 Resistor R7, R11, R14, R17, R18, R21, R31, R32 8,00 10K 740-9072
Res3 Resistor R9 1,00 150K 721-7924
Res3 Resistor R10, R22, R23 3,00 50K 740-9035
Res3 Resistor R12, R13 2,00 4.7K 740-9031
Res3 Resistor R19, R26 2,00 27 679-1187
Res3 Resistor R20, R27 2,00 1M 679-1049
Res3 Resistor R1, R24, R25 3,00 2K2 679-1207
Res Thermal Thermistor RT1 1,00 691-7500
KSS222GLFG Switch, Subminiature Side-Actuated Tact, SMT, KSS Series, Std Actuator, 2 Gull Wing Leads, SPST, 2N Force, Gold Contact S1, S2 2,00
LM335M/ NOPB Precision Temperature Sensor, 8-pin Narrow SOIC, Pb-Free U1 1,00 535-9111
LM2940IMP-5.0/ NOPB1A Low Dropout Regulator, 4-pin SOT-223, Pb-Free U2 1,00 727-4790
L293DD Push-Pull Four Channel Driver With Diode U3, U5 2,00 714-0625
ATmega2560-16AU 8-bit AVR Microcontroller, 4.5-5.5V, 256KB Flash, 4KB EEPROM, 8KB SRAM, 86 GPIO pins, 100-pin TQFP, Industrial Grade (-40C to 85C), Pb-Free U4 1,00 666-4530
MCP3421A0T-E/ CH 18-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference, 6-Pin SOT-23, Extended Temperature, Tape and Reel U6 1,00 669-6076
ST95P08M1 8 Kbit Serial SPI EEPROM with Positive Clock Strobe U7 1,00 686-2258
ATmega328-AU 8-bit AVR Microcontroller, 32KB Flash, 1KB EEPROM, 2KB SRAM, 32-pin TQFP, Industrial Grade (-40C to 85C) U8 1,00 738-0432
LP2985AIM5-3.3 Micropower 150 mA Low-Noise Ultra Low-Dropout Regulator, 5-pin SOT-23 U9 1,00 652-0033
FT232RL-Reel USB UART Asynchronous Serial Data Transfer Chip, SSOP-28, Tape and Reel U10 1,00 406-580
LM358D Dual Operational Amplifier U11 1,00 661-0549
Jumper Jumper Wire W1, W2, W3 3,00
16MHz Surface Mount Quartz Crystal Y1, Y2 2,00 478-9505
152
Apndice H: Planos Mecnicos

Plano 1: Ensamblaje completo
Plano 2: Revolver
Plano 3: Anclaje esclavo
Plano 4: Anclaje maestro













153

154

155

156

You might also like