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

ndice

Glosario ............................................................................................................... 9
1.1

Vocabulario .................................................................................................. 9

1.2

Acrnimos .................................................................................................. 10

Introduccin ...................................................................................................... 11
2.1

Objetivos .................................................................................................... 11

2.2

Motivaciones .............................................................................................. 11

Descripcin de un sistema de fresado ............................................................... 12


3.1

ATC (Automatic Tool Changer) ................................................................ 12

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
4

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

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

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

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.

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.

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.

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.

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

10

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.

11

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.

12

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]

13

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:

4.1

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.

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.

14

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:

15

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.

16

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.).

17

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

18

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.
2.
3.
4.

Orden de cambio de herramienta.


Aproximacin a la zona de cambio de herramienta.
Desplazamiento en -Z del til.
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).

19

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.

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

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

20

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.
2.
3.
4.
5.
6.
7.

Orden de carga de revlver.


Extraccin automtica de la herramienta en uso (el til queda libre).
Desplazamiento del til a la esquina opuesta a la posicin de cambio.
El sistema cede el control al usuario para avanzar posicin por posicin.
El usuario cambia la herramienta manualmente a travs del espacio de carga.
Desplazamiento del revlver a la posicin de reposo.
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.

21

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.
22

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.

23

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.

24

El modelo escogido es de la casa Hitech, al igual que el anterior, referencia HS5065MG. 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.

25

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

26

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
27

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.

28

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.

29

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

VCC_5
P9

MOTOR1A
LED_L_RED

1
3
5
7
9
11

2
4
6
8
10
12

FSR1
FSR2
MOTOR1B
LED_L_YELLOW
LED_L_GREEN
LDR1

Imagen 22: Seales estndar para cada conector

30

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.

VCC_5
P17
1
2
3
4
5
6
7
8
9 10
11 12

MASTER_SIGNAL
D_CLOSE
D_START
PULLUP
D_BTN_1
PULL_DOWN

GND

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

31

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
32

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.

33

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.
34

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 pullup 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.

35

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

36

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
37

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
38

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:

39

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

40

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.
41

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.

42

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

43

Imagen 30: Men de control manual (izquierda) y Opcin de configuracin de los niveles de luz

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

44

Clculos

6.1

Consumo total de la unidad de Control


Dispositivo
Motor
Servomotor
Motor driver
ATmega2560
ATmega328
FTDI chip
BT modem
Temp sensor
18 bit A/D
EEPROM
LCD panel
LCD backlight

Reposo
70mA
3mA
60mA
NA
NA
NA
1.5mA
NA
0.5uA
2uA
1.5mA
0

Operacin
200mA (sin regular)
600mA (tpico)
44mA
14mA
7mA
15mA
150mA (reg. 3.3V)
1mA
190uA
5mA
4mA
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 Imic = 14mA + 7mA = 21mA

Mdem Bluetooth en modo TX, mximo consumo limitado por el regulador


de 3.3V.
o IBT = 150mA

Estado en acceso a EEPROM externa.


o IEEPROM = 5mA

Entrada lgica a nivel bajo de los drivers (peor caso).


o Idr = 4 60mA = 240mA (Cuatro motores activos)

Tres servomotores en rotacin (ejes).


o Iserv = 3 600mA + 2 3mA = 1806mA

Sensor de temperatura en conversin.


o Itemp = 1mA

FTDI chip recibiendo datos.


o Iusb = 15mA
45

Todos los LEDs activos


o Iled = 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 ILCD = 4mA + 120mA = 124mA

As que en el peor caso el regulador debe ser temporalmente capaz de entregar:


IT = IsT + Imic + IBT + IEEPROM + Idr + Iserv + Itemp + Iusb + Iled + IbutT + ILCD
IT = 6 + 21 + 150 + 5 + 240 + 1806 + 1 + 15 + 210 + 2 + 124
IT = 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.

46

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)

47

49

50

51

52

53

54

55

56

57

58

59

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

Tipo

Materiales
Cantidad Coste
(unidad) (/unit)

Trabajadores
Categoria

Horas

Coste
(/h)

Parcial

Diseo HW
Reuniones con
cliente

Engineer

30

120,0

HW spec.
Documento

Junior
Engineer

20

40,0

Schematics
design

Junior
Engineer

6,5

20

130,0

Revision
esquemticos

Engineer

1,5

30

45,0

Diseo PCB

Junior
Engineer

20

80,0

Revisin PCB

Engineer

1,5

30

45,0

Fabricacin PCB

Total
460,0

107,3

PCB

4 layer PCB

45,18

Outsource

90,4

Otros

Gastos de
gestin

16,94

Outsource

16,9

PCB panel de
control

Atacado

0,5

25,64

Laboratory
Technician

20,8

Diseo HW & PCB

567,3

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.

522-4992
727-4790
666-4530
691-7500
714-0625
669-6076
721-7924
537-846
159-4685
691-1161
684-3998
666-5662
264-4258
264-4450
264-4422
407-0025
679-1049
679-1187
679-1207
478-9505
629-0473
686-2258
435-541
487-848
720-0213
466-3908
535-9111
738-0432
725-0101
737-3005
661-0549
734-6763
652-0033
740-9072
740-9063
740-9035
740-9031
671-0435
406-580

5
5
2
5
5
2
5
1
3
10
10
1
25
25
100
5
50
50
50
10
10
5
1
2
1
40
5
5
2
10
10
4
4
50
50
50
50
5
2

Precio
Total
Descripcin
Unidad
15-bussed SMT resistor network,10K
0,516
2,58
LDO Regulator Pos 5V 1A
1,102
5,51
MCU 8-Bit ATmega RISC 256KB FL TQFP100
17,370
34,74
0805 PTC Resettable Fuse, 200mA
0,434
2,17
4-Channel Motor Driver 24V, SOIC20
3,430
17,15
8-bit DST ADC,1 ch,4sps,MCP3421A0T-E/CH
2,910
5,82
Anti-Surge Resistor, 0805, 0.25W,1%,150K
0,132
0,66
Bluetooth 2.1 Module with Class 1 RF
34,230
34,23
C.I. de conversin de seal,LM335Z TO92
1,500
4,50
Capacitor 0805 10uF 16V
0,372
3,72
Capacitor Tantalum SMT 293D 20V 2.2uF
0,141
1,41
Carbide PCB drill bit 1/8" shank 0.90mm
3,780
3,78
Cond cermico SMD 0805 C0G,22pF 50V
0,038
0,95
Cond cermico SMD 0805 Y5V,1uF 16V
0,094
2,35
Cond cermico SMD 0805 Z5U,0.1uF 50V
0,026
2,60
Condensador de tntalo SMD TPS,22uF 16V
0,988
4,94
CRCW0805 Resistor T/R 0.125W,1%,1M
0,044
2,20
CRCW0805 Resistor T/R 0.125W,1%,27R
0,012
0,60
CRCW0805 Resistor T/R 0.125W,1%,2K2
0,021
1,05
Crystal SMD 16.000MHz HC49S-SMD
0,439
4,39
DIODE SMD GF1G
0,237
2,37
EEPROM SPI 256KBit 5MHz SOIC8
1,868
9,34
Eurocard de doble cara,220x100mm
5,300
5,30
Hembra Aliment,PCB,2,1mm 5A 250V
2,500
5,00
LCD, alphanumeric 16x2, STN, reflective
8,170
8,17
LED chip transp 1206 verde KP-3216SGC
0,069
2,76
LM335M Precision temperature sensor,SO8
1,068
5,34
MCU 8-Bit AVR 32KB Flash 2.5/3.3/5V
3,200
16,00
mm SMD sealed Trimmer Pot, 10K,25%
1,080
2,16
NIC Components NAWU330M25V6.3X6.3LBF
0,264
2,64
OP Amp Dual GP 16V/32V 8-Pin SOIC
0,130
1,30
Pushbutton Switch,DP,on-mom,PCB term
1,460
5,84
Regulador lineal tensin,LP2985AIM5-3.3
0,570
2,28
SMD 0805 thick film resistor 10K 5%
0,014
0,70
SMD 0805 thick film resistor 1K 5%
0,014
0,70
SMD 0805 thick film resistor 47K 1%
0,016
0,80
SMD 0805 thick film resistor 4K7 1%
0,016
0,80
Trans MOSFET P-CH 20V 2A 3-Pin SuperSOT
0,636
3,18
USB to serial TTL level UART FT232RL
5,000
10,00

61

748-0866
Winford

3
6

WR-COM USB Connector B horizontal


Connector IDC 12 vias aereo 2.54mm

1,070
1,430
Total
Gestin
IVA
Suma

8.3

3,21
8,58
231,82
8,00
41,73
281,55

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.
Trabajadores
Coste
Coste
Cantdad (g) (/g)
Categoria
Horas (/h)
Fabricacin prototipo
Laboratory
0,5
8
Technician
Laboratory
10
0,868
0,5
8
Technician
Materiales

Fabricacin y
Test

Tipo

Parcial

Revisin
documentacin
Colocacin de
componentes

Flux y
pasta

Soldadura

Estanyo

100

0,064

Laboratory
Technician

22,4

Barnizado

Barniz

200

0,0136

Laboratory
Technician

10,7

Tests & validacin


Laboratory
Technician
Laboratory
Technician

Inspeccin
ptica

Short test

I/O test

FKT test

4,0
12,7

48,0
0,5

4,0

0,5

4,0

Junior
Engineer

20

20,0

Junior
Engineer

20

20,0

Fabricacin y Test

62

Total
49,8

97,8

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.
Trabajadores
Categoria
Horas
Coste (/h)
Diseo Sw

Parcial

Arquitectura

Engineer

30

30,0

Desarrollo de cdigo

Junior
Engineer

20

60,0

Aplicacin Host
Android

Engineer

30

60,0

Desarrollo Sw

SW Test

30,0

Aplicacin test estrs

Junior
Engineer

0,5

20

10

Aplicacin test FKT

Junior
Engineer

20

20
Desarrollo Sw

8.5

Total
150,0

180,0

Generacin de la documentacin
Solo tareas de documentacin

Documentacin
de proyecto

Categora

Trabajadores
Horas
Documentacin

Coste (/h)

Parcial

Generacin de
documentacin

Junior Engineer

20

60,0

Generacin
planos

Junior Engineer

20

80,0

Revisin
documentacin

Junior Engineer

20

20,0

Documentacin de proyecto

8.6

Total
160,0

160,0

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.

63

Componentes y materiales
Diseo Hw y fabricacin PCB
Manufactura y Test
Diseo Software
Documentacin de proyecto
Total project cost (two prototypes)

281,55
567,30
97,80
180,00
160,00
1.286,65

64

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.

65

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/

66

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{
para ms informacin
int nmenu;
String title;
String text;
int menuback;
int menuenter;
int menuplus;
int menuminus;
void (*PtrFuncSel)();
}menu;
const
const
const
const

int
int
int
int

//Esructura para el men, consultar memoria

Enter = 78;
Back = 38;
Plus = 12;
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
{5, tconfig, tservo2, 1, 33, 6, 4, servoconf}, //Configuracion

67

S1
S2

{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;
int posToSet = 0;
int
int
int
int
int

//variable para lectura temporal de EEPROM


//Variable para almacenar la posicin a grabar

light[4];
dark[4];
sensPdown[4] = {9, A1,
A4,
12}; //sensores de presion posicion A
sensPup[4] = {10, A2, A5, 13};
//sensores de presion posicion B
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;


int per[4]= {20,20,20,20};
int memper[4]= {38,39,40,41};

//espacio de memoria para lectura


//analgica del conector global
//umbrales por defecto
//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;
int tApa = 70;

//pin lectura analgica global


//PIN 70 AADIDO A PINS_ARDUINO EN C:\arduino//0022\hardware\arduino\cores\arduino

68

int tApaLow = 84;

//pin para habilitacin deteccin de tapa cerrada

int sensorValue[4] = {0,0,0,0};


int sensorMaster = 0;
int sensorTapa = 0;
int green[4] = {34,23,26,31};
int red[4] = {35,24,27,32};
int yellow[4] = {33,22,25,30};
int flagini =0;

//v temporal para lectura analgica


//v temp para lectura de la
//entrada analgica global
//variable temporal para la
//lectura del estado de la tapa
//salidas de los LEDs

//Flag que determina si puede empezar o no


//la aplicacin de mecanizado

int nservo = 1;
int npos = 0;

//numero de servo en uso


//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[1].wire(48,49);
desplazamiento del carrusel
motor[2].wire(47,46);
//motor[3].wire(45,44);

//motor sin uso


//creacin motor para el
//creacin motor del til
//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++)
de los pines de LEDs como salidas
{
pinMode(green[i], OUTPUT);
pinMode(red[i], OUTPUT);

//Declaracin

69

pinMode(yellow[i], OUTPUT);
}
pinMode(84, OUTPUT);
pinMode(80, OUTPUT);
pinMode(4, OUTPUT);
pinMode(tApa, INPUT);
pinMode(19, INPUT);
pinMode(18, INPUT);

//Declaracin de salidas y entradas del sistema

//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);
digitalWrite(tApaLow, LOW);
delay(500);

//Inici de la comunicacin I2C


//Habilitacin seal de tapa cerrada

//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(){

70

// 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();
}
}

71

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

72

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

73

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;

74

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
int
int
int

nser = 0;
npos = 0;
tecla = 0;
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){

75

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:

76

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");

77

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;

78

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:

79

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;

80

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-------------------------------------------------(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)
if

81

{
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;

82

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;

83

case 38:
break;

// closed

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

// stop transmitting

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

// stop transmitting

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

// stop transmitting

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
Wire.send(getvalue/4);
// sends one
Wire.endTransmission();
// stop transmitting
break;
case 45:
//pres2
getvalue = analogRead(sensPdown[value]);
Wire.beginTransmission(5); // transmit to device
Wire.send(getvalue/4);
// sends one
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
Wire.send(getvalue/4);
// sends one
Wire.endTransmission();
// stop transmitting
break;
default:
break;
}
}

84

#5
byte

#5
byte

#5
byte

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;

85

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
associated event occurs.

functions,

which

will

be

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');

86

called

when

an

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

87

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;

88

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 = "";

89

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;
}

90

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";

91

}
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 = "{\"";

92

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;
}

93

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

94

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;
}

95

Apndice C: Cdigo Test IO (Arduino IDE)


char type = '-';
char conf = '-';
char state = '-';
int num = 0;
void setup(){
Serial.begin(9600);
Serial.println('H', BYTE);

// Empieza transmission a 9600 bps:


// Envia H mayscula como seal alive

}
void loop(){
if (Serial.available() > 0) {
//
el
mensaje
consta
de
cuatro
//entrada/salida, alto/bajo, numero de pin)

bytes

(digital/analogico,

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);
}

96

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);
}

97

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
//ConfServoInit

static

final

char

sfini=

'a';

public static final char sfss= 'b';

//ConfServoSend

public static final char sfsp= 'c';


position

//ConfServoSend

public static final char sfsd= 'd';

//ConfServoSend

servo

data
public static final char sfs= 'e';

//ConfServoSave

public static final char sfo= 'f';

//ConfServoOut

public
//ConflightInit

static

final

char

clini=

'g';

public static final char cls= 'h';

//ConflightSave

public static final char clo= 'i';

//ConflightOut

public
static
//ConfthresholdInit

final

public
static
//ConfthresholdSend data 1

final

public
static
//ConfthresholdSend data 2

char

ctini=

'j';

char

ctsu=

'k';

final

char

ctsd=

'l';

public
static
//ConfthresholdSend data 3

final

char

ctst=

'm';

public
static
//ConfthresholdOut

final

cto=

'n';

char

public static final char sspu= 'o';

//ServoSend pos

public static final char sspd= 'p';

//ServoSend pos

public static final char sspt= 'q';

//ServoSend pos

public static final char mini= 'r';

//MotorInit

1
2
3
public static final char mup= 's';
up

98

//MotorMotor n

public static final char mdown= 't';

//MotorMotor n

down
public static final char pini= 'u';
public static final char po= 'v';

//PressureInit
//PressureOut

public static final char sp= 'w';


PositionInit

//Start

public static final char info= 'x';


version/BatteryInit
public static final char ss= 'y';

//Software
//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,
"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);
}

99

0,

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
"00:07:80:40:7D:07";//"00:07:80:99:56:B3";

DEVICE_ADDRESS

private boolean popup_flag;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null){

100

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
R.drawable.btn_config),

IconItem

("Configuracin",

//new
R.drawable.btn_config),

IconItem

("Configuracin",

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
Configuration.class);

new

Intent(v.getContext(),

startActivity(myIntent);
}
if(position == 1){
myIntent = new Intent(v.getContext(), Manual.class);
startActivity(myIntent);
}
if(position == 2){

101

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
BluetoothAdapter.getDefaultAdapter();

mBluetoothAdapter

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) {

102

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
layout.findViewById(R.id.widget41);

but

=
(Button)

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();

103

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,
Toast.LENGTH_SHORT).show();

"Otro

"

startActivity(new Intent(
this,
Motor.class));
///
coordinates.

this

is

just

another

}
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;

104

example

of

another

set

of

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
null);

item

(ViewGroup)inflater.inflate(R.layout.menuone,

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;
}
}

105

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);

106

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);
}

107

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(),
leds, ledstate);

DEVICE_ADDRESS,

}
});
}
@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
}

108

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);

109

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;

110

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
ArduinoReceiverThresholds();

thres

new

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);

111

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);

112

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) {

113

}
@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) {
}

114

@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,
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

new

// 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
accordingly.

data

from

the

intent

and

updates

the

*/
private class ArduinoReceiverLevels extends BroadcastReceiver {

115

graph

@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) + "%");
}
}
}
}

116

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();
}

117

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,

Amarino.sendDataToArduino(getBaseContext(),
clini, "0");

DEVICE_ADDRESS,

cto, "0");

registerReceiver(levels,
IntentFilter(AmarinoIntent.ACTION_RECEIVED));
}
}

package befaust.jorges119.eclipseBT;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;

118

new

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);

119

Amarino.sendDataToArduino(getBaseContext(),
mdown, 1);

DEVICE_ADDRESS,

}
});
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(),
mdown, 2);

DEVICE_ADDRESS,

}
});
up2 = (Button)findViewById(R.id.up2);
up2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//edit.setVisibility(View.VISIBLE);

120

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(),
mdown, 3);

DEVICE_ADDRESS,

}
});
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(),
mup, 3);
}

121

DEVICE_ADDRESS,

});
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) {

122

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. */

123

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,
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

new

// this is how you tell Amarino to connect to a specific BT device


from within your own code
Amarino.sendDataToArduino(getBaseContext(),

DEVICE_ADDRESS,

2);
/*

left.setText(Integer.toString(pressures[1][1]));
center.setText(Integer.toString(pressures[1][2]));
right.setText(Integer.toString(pressures[1][3]));*/

124

pini,

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
accordingly.

data

from

the

intent

and

updates

the

graph

*/
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

125

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;

126

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);

127

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

new

// 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
accordingly.

data

from

the

intent

and

updates

*/
private class ArduinoReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

128

the

graph

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");

129

}
}

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;

130

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);

131

}
});

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();
}

132

@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
spinnerScaleOnItemSelectedListener

Spinner.OnItemSelectedListener

= 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];
}};

133

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);

134

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
R.drawable.servo_norm),

IconItem

("Servo

Izquierda",

new IconItem ("Servo Centro", R.drawable.servo_norm),


new
R.drawable.servo_norm)));

IconItem

("Servo

Derecha",

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;

135

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;

136

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);

137

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;

138

//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,
IntentFilter(AmarinoIntent.ACTION_RECEIVED));

new

// this is how you tell Amarino to connect to a specific BT device


from within your own code
Amarino.sendDataToArduino(getBaseContext(),
nservo);

DEVICE_ADDRESS,

sfss,

// 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();
}

139

@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
seekbarRotateSeekBarChangeListener

SeekBar.OnSeekBarChangeListener

= new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {

140

// 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
spinnerScaleOnItemSelectedListener

Spinner.OnItemSelectedListener

= 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();
}

141

@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(),
"0");

142

DEVICE_ADDRESS,

sfo,

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" />

143

<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>

144

<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

P3

HDR2X3

C1

T491X

2290mil

4710mil

C2

CapElec

3237.5mil

C3

C0805

2315mil

Mid Y

3265mil

Ref X

4610mil

Ref Y

3215mil

Pad X

4610mil

Pad Y TB

3215mil T

Rotation Comment

0.00 Header 3X2H, PIN CORTO

6375mil

2290mil

6375mil

2183.7mil

6375mil T

180.00 Cap Pol3, 407-0025

6330mil

3240mil

6330mil

3340mil

6330mil T

0.00 Cap Pol3, 737-3021

6210mil 2285.472mil

6210mil T

360.00 0.1u, 264-4422

6210mil

2315mil

145

C4

C0805

3615mil 3949.999mil

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

D2

3.2X1.6X1.1

2540mil

5560mil

2540mil

5560mil

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

3250mil

HDR2X6

RIGTH

6025mil

3890mil

HDR2X6

3615mil 3949.999mil

3250mil

6190mil

5560mil

6025mil

3640mil

6190mil

5310mil

2140mil

4095mil

2140mil

3995mil

S6

HDR1X3

2475mil

4650mil

2475mil

S3

HDR1X3

2140mil

4650mil

2140mil

S5

HDR1X3

2475mil

4095mil

2475mil

SPARE

4725mil

HDR2X6

MASTER

6190mil

6395mil

HDR2X6

7230mil

6140mil T

5310mil

360.00 Header 6X2H, PIN CORTO

6140mil T

360.00 Header 6X2H, PIN CORTO

3995mil T

90.00 Header 3H, PIN CORTO 90

4550mil

2475mil

4550mil T

90.00 Header 3H, PIN CORTO 90

4550mil

2140mil

4550mil T

90.00 Header 3H, PIN CORTO 90

3995mil

2475mil

3995mil T

90.00 Header 3H, PIN CORTO 90

6140mil

6145mil

6190mil

180.00 Diode 1N4005, 629-0473


270.00 HSMD-C150, 692-0969

2140mil

4475mil

6190mil

6025mil T

3640mil

6140mil

HDR1X3

HDR2X6

3100mil

270.00 Cap Semi, 264-4258

2540mil 5628.898mil T

6140mil

S2

CENTER

3615mil 3979.527mil B

4475mil

6140mil

6980mil

6140mil T

6145mil

6140mil

6140mil T

6980mil

6140mil T

360.00 Header 6X2H, PIN CORTO


360.00 Header 6X2H, PIN CORTO
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

R2

6-0805_N

2540mil 5830.001mil

5790mil

R4

SO-16

R5

6-0805_N

3630.001mil

4935mil

3630mil

4935mil 3594.568mil

4935mil T

R6

6-0805_N

4205.001mil

3830mil

4205mil

3830mil 4169.568mil

3830mil T

0.00 Res3, 740-9063

R7

6-0805_N

5585mil

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

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

R18

6-0805_N

6765mil

5715mil

6765mil 5714.999mil

6765mil 5679.567mil B

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

U3

SO20_N

5865mil

5545mil

5865mil

5545mil 6044.134mil

5320mil T

5170.001mil

6470mil 5789.999mil
2540mil

4865mil

5705mil

2810mil

5830mil

5170mil

4865mil

2810mil

90.00 Res3, 679-1207

2540mil 5794.568mil T

90.00 1K, 740-9063

5033.19mil

5585mil 5704.999mil

5715mil

6470mil 5754.567mil B

5040mil T

7465mil 5664.567mil B

5715mil 2900.552mil 5829.174mil T

U4

100A_N

3505mil

4440mil

3505mil

4440mil 3207.756mil

4676.22mil T

U5

SO20_N

7070mil

5540mil

7070mil

5540mil 6890.866mil

5765mil T

Y1

HC49/4H_SMX

J1

DC_JACK

3510mil

3745mil

3510mil

3745mil 3697.008mil

2686.575mil 6177.815mil

2785mil

6595mil

2785mil

3745mil T
6055.63mil T

High PnP
146

270.00 EXBM16P, 522-4992


360.00 Res3, 740-9063

90.00 Res3, 740-9072

90.00 Res3, 740-9072


90.00 Res3, 740-9072

270.00 LM2940IMP-5.0/NOPB, 727-4790


180.00 L293DD, 714-0625
360.00 ATmega2560-16AU, 666-4530
0.00 L293DD, 714-0625
180.00 16MHz, 478-9505
270.00 PWR2.5, 487-848

Designator Footprint

P3
BT1

HDR2X3
WT11

Mid X

Mid Y

119.634mm

82.931mm

174.146mm

90.436mm

C1

T491X

58.166mm

C2

CapElec

82.2325mm

C3

C0805

58.801mm

Ref X

Ref Y

117.094mm

82.296mm

157.734mm

C4

C0805

91.821mm

100.33mm

91.821mm

100.33mm

C5

C0805

113.03mm

124.714mm

113.03mm

124.714mm

C6

C0805

94.107mm

100.457mm

94.107mm

100.457mm

C7

C0805

83.693mm

100.33mm

83.693mm

100.33mm

C10

C0805

78.105mm

120.269mm

78.105mm

C11

C0805

101.219mm

111.887mm

101.219mm

C12

C0805

85.852mm

100.457mm

85.852mm

125.095mm

160.782mm T

360.00 0.1u, 264-4422

101.08mm B

113.03mm

270.00 Cap Semi, 264-4258

123.964mm T

94.107mm

90.00 Cap Semi, 264-4422

99.707mm T

83.693mm

90.00 Cap Semi, 264-4258

101.08mm T

78.855mm

270.00 Cap Semi, 264-4258

120.269mm T

101.969mm
85.852mm

180.00 Cap Semi, 264-4422

111.887mm T

180.00 Cap Semi, 264-4422

101.207mm T

C0805

83.82mm

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

C21

C0805

92.71mm

130.81mm

92.71mm

C24

C0805

108.204mm

146.685mm

108.204mm

146.685mm

108.954mm

146.685mm B

C25

C0805

130.429mm

131.191mm

130.429mm

131.191mm

130.429mm

130.441mm B

C26

C0805

118.364mm

139.7mm

D1

DIODE_SMC

D2

3.2X1.6X1.1

J2

1-1470156

P1

HDR2X3

70.358mm

P2

HDR1X2

P4

HDR2X3

S1

HDR1X3

S4

HDR1X3

LEFT

HDR2X6

RIGTH

HDR2X6

153.035mm

180.00 Diode 1N4005, 629-0473


270.00 HSMD-C150, 692-0969
180.00 1-1470156-1, 748-0866

120.65mm T

270.00 Header 3X2, PIN CORTO

112.649mm

98.552mm

112.649mm

99.822mm

166.243mm

110.617mm

167.513mm

108.077mm

54.356mm

89.916mm

54.356mm

87.376mm

54.356mm

132.588mm

54.356mm

130.048mm

98.806mm

157.226mm

141.224mm

S5

HDR1X3

62.865mm

92.456mm

90.00 Header 3H, PIN CORTO 90

155.956mm T

134.874mm

115.57mm

62.865mm

115.57mm T

90.00 Header 3H, PIN CORTO 90

115.57mm

54.356mm

115.57mm T

90.00 Header 3H, PIN CORTO 90

104.013mm

62.865mm

101.473mm

157.226mm

156.083mm

157.226mm
81.661mm

196.85mm
122.047mm

R1

6-0805_N

164.338mm

147.066mm

164.338mm

R2

6-0805_N

64.516mm

148.082mm

64.516mm

R3

POT4MM-2

R4

SO-16

R5

6-0805_N

92.202mm

R6

6-0805_N

106.807mm

R7

6-0805_N

R8
R9

123.571mm

123.571mm

155.956mm

81.661mm
156.718mm

147.066mm

125.349mm

92.202mm

97.282mm

106.807mm

141.859mm

144.907mm

141.859mm

144.907mm

6-0805_N

106.68mm

101.6mm

6-0805_N

128.905mm

108.585mm

128.905mm

360.00 Header 6X2H, PIN CORTO


360.00 Header 6X2H, PIN CORTO

155.956mm T
81.661mm T

360.00 Header 6X2H, PIN CORTO


180.00 Header 20, PIN HEMBRA

196.85mm

156.718mm T

270.00 Header 20, PIN HEMBRA

120.922mm

130.368mm B

360.00 IRLML5103, 671-0435

64.516mm

123.571mm

123.571mm

90.00 Header 3H, PIN CORTO 90

155.956mm T
155.956mm T

177.292mm

164.338mm

148.082mm

165.735mm

113.665mm

109.347mm

131.318mm

90.00 Header 3H, PIN CORTO 90

101.473mm T

156.083mm

155.956mm

131.318mm

106.68mm

62.865mm

155.956mm

177.292mm
109.347mm

132.588mm
131.318mm

113.665mm

101.473mm T

360.00 Header 6X2H, PIN CORTO

62.865mm

157.226mm

54.356mm

360.00 Header 6X2H, PIN CORTO

155.956mm T

54.356mm

SOT-23_N

165.735mm

90.00 Header 3H, PIN CORTO 90

130.048mm T

118.11mm

Q5

131.318mm

90.00 Header 3X2, PIN CORTO

87.376mm T

54.356mm

155.956mm

270.00 Header 2

108.077mm T

118.11mm

183.642mm

196.85mm

54.356mm

155.956mm

134.874mm

99.822mm T

167.513mm

101.473mm

162.433mm

122.047mm

112.649mm

54.356mm

120.015mm

85.217mm

92.456mm

157.226mm

54.356mm

HDR1X20

153.035mm T
142.974mm T
146.705mm T

62.865mm

OUT2

78.74mm
64.516mm
60.349mm

HDR1X3

HDR1X20

90.00 Cap Semi, 264-4422


360.00 Cap Semi, 264-4450

69.088mm

HDR1X3

OUT1

139.7mm B

180.00 Cap Semi, 264-4422

120.65mm

S3

HDR2X6

141.224mm

90.00 Cap Pol3, 684-3998

360.00 Cap Semi, 264-4422

147.955mm

S6

HDR2X6

117.614mm

153.035mm

64.516mm

130.81mm B

69.088mm

104.013mm

MASTER

91.96mm

147.653mm B

45.339mm

54.356mm

SPARE

82.55mm

126.111mm

270.00 Cap Semi, 264-4422

118.11mm

HDR1X3

HDR2X6

139.7mm

125.845mm T

147.955mm

S2

CENTER

118.364mm

141.224mm

57.994mm

130.81mm

83.82mm

270.00 Cap Semi, 264-4422

C13

64.516mm

125.095mm

0.00 Cap Pol3, 737-3021

157.734mm T

91.821mm

100.457mm

180.00 Cap Pol3, 407-0025

C14

82.55mm

83.82mm

84.836mm

111.887mm

270.00 Bluegiga WT11, 537-846

161.925mm T

58.051mm

120.269mm

0.00 Header 3X2H, PIN CORTO

97.536mm T

55.466mm

160.782mm

58.801mm

81.661mm T

183.896mm

161.925mm

157.734mm

Rotation Comment

117.094mm

97.536mm

58.166mm

160.782mm

Pad Y TB

81.661mm

183.896mm

161.925mm

Pad X

146.166mm B

90.00 Res3, 679-1207

147.182mm T

164.585mm

90.00 1K, 740-9063

125.571mm T

270.00 10K, 725-0101

127.843mm

128.016mm T

270.00 EXBM16P, 522-4992

125.349mm

91.302mm

125.349mm T

360.00 Res3, 740-9063

97.282mm

105.907mm

97.282mm T

0.00 Res3, 740-9063

101.6mm
108.585mm

141.859mm
105.78mm

144.007mm B
101.6mm T

128.005mm

147

108.585mm T

90.00 Res3, 740-9072


0.00 Res3, 740-9063
360.00 Res3, 721-7924

R10

6-0805_N

128.905mm

103.759mm

128.905mm

103.759mm

128.005mm

103.759mm T

R11

6-0805_N

160.909mm

145.923mm

160.909mm

145.923mm

160.909mm

145.023mm B

R12

6-0805_N

121.031mm

90.678mm

121.031mm

90.678mm

R13

6-0805_N

118.11mm

90.678mm

118.11mm

R14

6-0805_N

189.611mm

144.78mm

189.611mm

R15

6-0805_N

129.54mm

93.98mm

129.54mm

R16

6-0805_N

125.222mm

93.853mm

125.222mm

R17

6-0805_N

88.519mm

100.33mm

88.519mm

R18

6-0805_N

171.831mm

145.161mm

171.831mm

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

121.031mm

90.678mm

93.98mm

129.54mm

100.33mm

90.00 Res3, 740-9031

143.88mm B
94.88mm T

125.222mm

90.00 Res3, 740-9072


270.00 Res3, 740-9063

94.753mm T

88.519mm

145.161mm

90.00 Res3, 740-9031

89.778mm B

189.611mm

93.853mm

90.00 Res3, 740-9072

89.778mm B

118.11mm

144.78mm

360.00 Res3, 740-9035

99.43mm B

171.831mm

270.00 Res3, 740-9063


90.00 Res3, 740-9072

144.261mm B

90.00 Res3, 740-9072

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

166.751mm

140.843mm

166.751mm

140.843mm

169.151mm

142.748mm B

U1

M08A_N

U2

MP04A_N

71.374mm

145.161mm

73.674mm

148.061mm T

U3

SO20_N

148.971mm

140.843mm

148.971mm

140.843mm

153.521mm

135.128mm T

U4

100A_N

89.027mm

112.776mm

89.027mm

U5

SO20_N

179.578mm

140.716mm

179.578mm

U7

SOP8_N

69.469mm

107.061mm

69.469mm

107.061mm

66.969mm

U8

32A_N

140.208mm

103.505mm

140.208mm

103.505mm

137.408mm

U9

MF05A_N

U11

D008_L

Y1

HC49/4H_SMX

Y2
J1

71.374mm

117.602mm
137.16mm

HC49/4H_SMX
DC_JACK

145.161mm

147.955mm
143.764mm

137.16mm

95.123mm

139.954mm

89.662mm

156.9165mm

143.764mm

139.51mm

99.305mm T

180.00 L293DD, 714-0625


360.00 ATmega2560-16AU, 666-4530

145.669mm B
95.123mm T

135.204mm
70.739mm

0.00 L293DD, 714-0625


360.00 ST95P08M1, 686-2258
90.00 ATmega328-AU, 738-0432

146.755mm B

93.904mm

89.662mm

167.513mm

270.00 LM2940IMP-5.0/NOPB, 727-4790

146.431mm T
105.156mm B

118.552mm

95.123mm

139.954mm

118.776mm T

175.028mm

147.955mm

89.154mm

70.739mm

81.477mm

140.716mm

117.602mm

89.154mm

68.239mm

112.776mm

0.00 Res Thermal, 691-7500


180.00 LM335M/NOPB, 535-9111

90.00 LP2985AIM5-3.3, 652-0033


180.00 LM358D, 661-0549
180.00 16MHz, 478-9505

89.662mm T

153.813mm T

360.00 16MHz, 478-9505


270.00 PWR2.5, 487-848

Prototype PnP
Designator Footprint

P3
BT1

HDR2X3
WT11

Mid X

Mid Y

4710mil

3265mil

6856.142mil 3560.472mil
6375mil

Ref X

Ref Y

Pad X

4610mil

3215mil

4610mil

7240mil

3840mil

7240mil

Rotation Comment

3215mil T
3840mil T

0.00 Header 3X2H, PIN CORTO


270.00 Bluegiga WT11, 537-846

C1

T491X

2290mil

C2

CapElec

3237.5mil

C3

C0805

2315mil

C4

C0805

3615mil 3949.999mil

C5

C0805

4450mil

4910mil

4450mil

4910mil

4450mil 4880.472mil T

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

C9

C0805

2965mil

3950mil

2965mil

3950mil

C10

C0805

3075mil

4735mil

3075mil

4735mil 3104.528mil

4735mil T

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

6330mil
6210mil

2290mil

Pad Y TB

3240mil
2315mil

6375mil

2183.7mil

6375mil T

6330mil

3340mil

6330mil T

0.00 Cap Pol3, 737-3021

6210mil 2285.472mil

6210mil T

360.00 0.1u, 264-4422

3615mil 3949.999mil

3615mil 3979.527mil B

180.00 Cap Pol3, 407-0025

270.00 Cap Semi, 264-4258


90.00 Cap Semi, 264-4422

4210mil T

180.00 Cap Semi, 264-4422

2965mil 3920.472mil T

90.00 Cap Semi, 691-1161

4565mil T

148

180.00 Cap Semi, 264-4422

360.00 Cap Semi, 264-4258

C15

C0805

5560mil

C16

C0805

5439.999mil

4470mil

5560mil

4470mil 5530.472mil

C17

C0805

5355mil

3720mil

5355mil

C18

C0805

5690mil

3725mil

C20

C0805

4475mil

5920mil

C21

C0805

3649.999mil

C22

C0805

3305mil

5650mil

3305mil

5650mil 3334.528mil

C23

C0805

3020mil

3475mil

3020mil

3475mil

C24

C0805

4259.999mil

4345mil 5439.999mil

4470mil T

4345mil 5410.471mil
3720mil

5355mil 3749.528mil T

5690mil

3725mil

5690mil 3754.528mil T

4475mil

5920mil 4504.528mil

5150mil 3649.999mil

5135mil 5164.999mil

360.00 Cap Semi, 264-4422


270.00 Cap Semi, 264-4258
270.00 Cap Semi, 264-4258

5920mil T

5150mil 3620.471mil

5775mil 4259.999mil

360.00 Cap Semi, 264-4422

4345mil B

180.00 Cap Semi, 264-4422

5150mil B

360.00 Cap Semi, 264-4422

5650mil T

180.00 Cap Semi, 264-4422

3020mil 3445.472mil T

90.00 Cap Semi, 264-4422

5775mil 4289.527mil

180.00 Cap Semi, 264-4422

C25

C0805

D1

DIODE_SMC

D2

3.2X1.6X1.1

2540mil

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

3250mil

5135mil 5164.999mil

5775mil B

6025mil

3250mil

5560mil

2540mil

1-1470156

P1

HDR2X3

2770mil

4650mil

2720mil

4750mil

P2

HDR1X2

4435mil

3880mil

4435mil

P4

HDR2X3

6545mil

4355mil

6595mil

P5

HDR1X14

6940mil

4060mil

7590mil

P6

HDR1X14

6940mil

3110mil

7590mil

S1

HDR1X3

2140mil

3540mil

2140mil

S4

HDR1X3

2140mil

5220mil

2140mil

HDR2X6

RIGTH

HDR2X6

5825mil

3890mil

1785mil

6190mil

5560mil

90.00 Cap Semi, 264-4422

6025mil T

180.00 Diode 1N4005, 629-0473

2540mil 5628.898mil T

270.00 HSMD-C150, 692-0969

5825mil 2375.944mil 5775.788mil T

180.00 1-1470156-1, 748-0866

2720mil

4750mil T

270.00 Header 3X2, PIN CORTO

3930mil

4435mil

3930mil T

270.00 Header 2

4255mil

6595mil

4255mil T

90.00 Header 3X2, PIN CORTO

4060mil

7590mil

4060mil T

180.00 MHDR1X14

3110mil

7590mil

3110mil T

180.00 MHDR1X14

3440mil

2140mil

3440mil T

90.00 Header 3H, PIN CORTO 90

5120mil

2140mil

5120mil T

90.00 Header 3H, PIN CORTO 90

3640mil

6190mil

3100mil

5560mil

J2

LEFT

2283.228mil

5135mil 5135.471mil B

6025mil

6140mil

5310mil

3640mil

6140mil

6140mil T

5310mil

360.00 Header 6X2H, PIN CORTO

6140mil T

360.00 Header 6X2H, PIN CORTO

S2

HDR1X3

2140mil

4095mil

2140mil

3995mil

2140mil

3995mil T

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
SPARE

HDR2X6
HDR2X6

MASTER

HDR2X6

4725mil

6190mil

6395mil

4475mil

6190mil

7230mil

6140mil

6145mil

6190mil

4475mil

6140mil

6980mil

6145mil

6140mil

6980mil

90.00 Header 3H, PIN CORTO 90

6140mil T

360.00 Header 6X2H, PIN CORTO

6140mil T

360.00 Header 6X2H, PIN CORTO

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

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

R1

6-0805_N

6470mil

R2

6-0805_N

2540mil 5830.001mil

R3

POT4MM-2

R4

SO-16

R5

6-0805_N

3630.001mil

4935mil

3630mil

4935mil 3594.568mil

4935mil T

R6

6-0805_N

4205.001mil

3830mil

4205mil

3830mil 4169.568mil

3830mil T

0.00 Res3, 740-9063

R7

6-0805_N

5585mil

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

5075mil

4085mil 5039.568mil

R11

6-0805_N

6335mil

5745mil

6335mil 5744.999mil

R12

6-0805_N

4765mil

3570mil

R13

6-0805_N

4650mil

3570mil

R14

6-0805_N

7465mil

R15

6-0805_N

R16

6-0805_N

4804.999mil

6525mil
5170.001mil

5170mil 4804.999mil
5790mil

4865mil
4865mil

5705mil

4085mil

5170mil 4760.707mil 5132.598mil B

6470mil 5789.999mil
2540mil
6525mil
5170mil

5830mil

5585mil 5704.999mil

360.00 IRLML5103, 671-0435

6470mil 5754.567mil B

90.00 Res3, 679-1207

2540mil 5794.568mil T

90.00 1K, 740-9063

4865mil 6479.724mil
4865mil

270.00 PDTC114YT, 518-2775

5033.19mil

4943.74mil T
5040mil T

270.00 10K, 725-0101


270.00 EXBM16P, 522-4992
360.00 Res3, 740-9063

4085mil T

360.00 Res3, 740-9035

6335mil 5709.567mil B

90.00 Res3, 740-9072

4765mil 3569.999mil

4765mil 3534.567mil B

90.00 Res3, 740-9031

4650mil 3569.999mil

4650mil 3534.567mil B

90.00 Res3, 740-9031

5700mil

7465mil 5699.999mil

7465mil 5664.567mil B

5100mil

3700mil

5100mil

3700mil

5100mil 3735.434mil T

270.00 Res3, 740-9063

4930mil

3695mil

4930mil

3695mil

4930mil 3730.434mil T

270.00 Res3, 740-9063

149

90.00 Res3, 740-9072

R17

6-0805_N

3485mil

3950mil

3485mil 3949.999mil

3485mil 3914.567mil B

R18

6-0805_N

6765mil

5715mil

6765mil 5714.999mil

6765mil 5679.567mil B

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

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

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

R32

6-0805_N

5330mil

RT1
U1

6-0805_N
M08A_N

4760mil

6085mil

4760mil 6049.568mil

5520mil 5159.999mil

5160mil

5330mil 5159.999mil

4380.001mil

5210mil

6564.999mil

5545mil 6564.999mil

2810mil

4380mil

5715mil

90.00 Res3, 740-9072

4760mil T

0.00 Res3, 740-9072

180.00 Res3, 679-1187

5520mil 5195.433mil B

270.00 Res3, 740-9072

5330mil 5124.567mil B

5210mil 4344.568mil

2810mil

90.00 Res3, 740-9072

90.00 Res3, 740-9072

5210mil T

5545mil 6659.487mil

0.00 Res Thermal, 691-7500

5620mil B

U2

MP04A_N

U3

SO20_N

5865mil

5545mil

5865mil

5545mil 6044.134mil

5320mil T

180.00 LM335M/NOPB, 535-9111

5715mil 2900.552mil 5829.174mil T

270.00 LM2940IMP-5.0/NOPB, 727-4790


180.00 L293DD, 714-0625

U4

100A_N

3505mil

4440mil

3505mil

4440mil 3207.756mil

4676.22mil T

U5

SO20_N

7070mil

5540mil

7070mil

5540mil 6890.866mil

5765mil T

U6

SOT-23-CH6_N

U7

SOP8_N

2734.999mil

U8

32A_N

5520mil

U10

SSOP-28_N

3654.999mil

U11

D008_L

5399.999mil

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

Y2
J1

HC49/4H_SMX
DC_JACK

4259.999mil

5575mil 4259.999mil
4215mil 2734.999mil

4075mil

5520mil

360.00 ATmega2560-16AU, 666-4530


0.00 L293DD, 714-0625

5575mil 4212.755mil 5537.598mil B


4215mil 2636.573mil

4140mil B

4075mil 5409.764mil 3909.646mil T

5470mil 3654.999mil
5660mil 5399.999mil

90.00 ATmega328-AU, 738-0432

5470mil 3519.173mil 5303.662mil B


5660mil 5492.519mil

3510mil

3745mil

3510mil

3745mil 3697.008mil

5510mil

3530mil

5510mil

3530mil 5322.992mil

2686.575mil 6177.815mil

2785mil

6595mil

2785mil

5735mil B

3530mil T
6055.63mil T

360.00 FT232RL-Reel, 406-580


180.00 LM358D, 661-0549

3745mil T

150

360.00 MCP3421A0T-E/CH, 669-6076

360.00 ST95P08M1, 686-2258

180.00 16MHz, 478-9505


360.00 16MHz, 478-9505
270.00 PWR2.5, 487-848

Apndice G: BOM
Comment

Description

Designator

Quantity

Value

Bluegiga WT11

Bluegiga WT11-A

BT1

1,00

Cap Pol3

Polarized Capacitor (Surface Mount)

C1

1,00 22uF

Cap Pol3

Polarized Capacitor (Surface Mount)

C2

1,00 0.47uF

Cap Semi

Capacitor (Semiconductor SIM Model)

C4, C6, C7, C14, C17, C18

Cap Semi

Capacitor (Semiconductor SIM Model)

C3,C5, C8, C10, C11, C12, C13, C15, C16, C20, C21, C22, C23, C24, C25

Cap Semi

Capacitor (Semiconductor SIM Model)

C9

1,00 10uF

Cap Pol3

Polarized Capacitor (Surface Mount)

C19

1,00 2.2uF

Cap Semi

Capacitor (Semiconductor SIM Model)

C26

1,00 1uF

Diode 1N4005

1 Amp General Purpose Rectifier

D1

1,00

HSMD-C150

Surface Mount Chip LED, Orange

D2, D3, D4

3,00

PWR2.5

Low Voltage Power Supply Connector

J1

1,00

1-1470156-1

USB 1.1, Right Angle, Thru-Hole, B Type, Receptacle, 4 Position, White

J2

1,00

Header 3X2

Header, 3-Pin, Dual row

P1, P4

2,00

6,00 22pF
15,00 100n

Header 2

Header, 2-Pin

P2

1,00

Header 3X2H

Header, 3-Pin, Dual row, Right Angle

P3

1,00

MHDR1X14

Header, 14-Pin

P5, P6

2,00

Header 3H

Header, 3-Pin, Right Angle

P7, P8, P11, P12, P13, P14

6,00

Header 6X2H

Header, 6-Pin, Dual row, Right Angle

P9, P10, P15, P16, P17

5,00

Header 20

Header, 20-Pin

P18, P19

2,00

PDTC114YT

NPN Resistor-equipped Transistor

Q1, Q2, Q3, Q4

4,00

IRLML5103

HEXFET Power MOSFET

Q5

1,00

10K

Square Trimming Potentiometer

R3

1,00 10k

EXBM16P

Common terminal Resistor Network

R4

1,00

Res3

Resistor

R2,R5, R6, R8, R15, R16, R28, R29, R30

8,00 1K

Res3

Resistor

R7, R11, R14, R17, R18, R21, R31, R32

8,00 10K

Res3

Resistor

R9

1,00 150K

Res3

Resistor

R10, R22, R23

3,00 50K

Res3

Resistor

R12, R13

2,00 4.7K

Res3

Resistor

R19, R26

2,00 27

Res3

Resistor

R20, R27

2,00 1M

Res3

Resistor

R1, R24, R25

3,00 2K2

Res Thermal

Thermistor

RT1

1,00

KSS222GLFG

Switch, Subminiature Side-Actuated Tact, SMT, KSS Series, Std Actuator, 2 Gull Wing Leads, SPST,
S1, S2
2N Force, Gold Contact

LM335M/ NOPB

Precision Temperature Sensor, 8-pin Narrow SOIC, Pb-Free

PIN CORTO
PIN HEMBRA
PIN CORTO 90
PIN CORTO
PIN HEMBRA
518-2775
671-0435
725-0101
522-4992
740-9063
740-9072
721-7924
740-9035
740-9031
679-1187
679-1049
679-1207
691-7500

2,00

U1

1,00

LM2940IMP-5.0/ NOPB
1A Low Dropout Regulator, 4-pin SOT-223, Pb-Free

U2

1,00

L293DD

Push-Pull Four Channel Driver With Diode

U3, U5

2,00

ATmega2560-16AU

8-bit AVR Microcontroller, 4.5-5.5V, 256KB Flash, 4KB EEPROM, 8KB SRAM, 86 GPIO pins, 100-pin
U4
TQFP, Industrial Grade (-40C to 85C), Pb-Free

1,00

MCP3421A0T-E/ CH

18-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference, 6-Pin SOT-23, Extended
U6
Temperature, Tape and Reel

1,00

ST95P08M1

8 Kbit Serial SPI EEPROM with Positive Clock Strobe

ATmega328-AU

8-bit AVR Microcontroller, 32KB Flash, 1KB EEPROM, 2KB SRAM, 32-pin TQFP, Industrial Grade
U8
(-40C to 85C)

1,00

LP2985AIM5-3.3

Micropower 150 mA Low-Noise Ultra Low-Dropout Regulator, 5-pin SOT-23

U9

1,00

FT232RL-Reel

USB UART Asynchronous Serial Data Transfer Chip, SSOP-28, Tape and Reel

U10

1,00

LM358D

Dual Operational Amplifier

U11

1,00

Jumper

Jumper Wire

W1, W2, W3

3,00

16MHz

Surface Mount Quartz Crystal

Y1, Y2

2,00

U7

Ref RS

537-846
407-0025
737-3021
264-4258
264-4422
691-1161
684-3998
264-4450
629-0473
692-0969
487-848
748-0866
PIN CORTO

1,00

535-9111
727-4790
714-0625
666-4530
669-6076
686-2258
738-0432
652-0033
406-580
661-0549
478-9505

Apndice H: Planos Mecnicos

Plano 1: Ensamblaje completo


Plano 2: Revolver
Plano 3: Anclaje esclavo
Plano 4: Anclaje maestro

152

153

154

155

156

You might also like