Professional Documents
Culture Documents
Fecha: 05 / 2012
ndice
Glosario ............................................................................................................... 9
1.1
Vocabulario .................................................................................................. 9
1.2
Acrnimos .................................................................................................. 10
Introduccin ...................................................................................................... 11
2.1
Objetivos .................................................................................................... 11
2.2
Motivaciones .............................................................................................. 11
4.3
4.4
4.6
Diseo y fabricacin.......................................................................................... 34
5.1
Clculos ............................................................................................................. 45
6.1
Planos ................................................................................................................ 47
Presupuesto........................................................................................................ 60
8.1
8.2
Componentes ............................................................................................. 61
8.3
Fabricacin de prototipos........................................................................... 62
8.4
Desarrollo de SW ....................................................................................... 63
8.5
8.6
Conclusiones ..................................................................................................... 65
Referencias ............................................................................................................. 66
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
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
0.
Abstract
Glosario
1.1
Vocabulario
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
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
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
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.
13
4.1
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.
14
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
4.2
16
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
17
18
19
20
.
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.
21
4.4
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
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
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.
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.
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.
25
Imagen 17: Plano con dimensiones del motor GP32 0019 [5]
26
Precio reducido
Tamao mnimo de instalacin
Simplicidad de lectura
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
4.5
Una vez conocidos los actuadores necesarios es posible generar las especificaciones
de la unidad de control, que son los siguientes:
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
28
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.
29
Sensor de temperatura
ADC de alta resolucin
EEPROM externa de gran tamao
Interfaz USB mediante chip FTDI para depuracin
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
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
35 IO digitales
15 entradas analgicas
5 salidas PWM
31
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
Escape
Enter
Ms
32
Menos
33
Diseo y fabricacin
5.1
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.
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.
35
Imagen 24: Captura de pantalla del diseo 3D de la placa de control mediante Altium Designer
5.2
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.3
Desarrollo software
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.
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:
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
Como se puede observar cada opcin del men se compone de diversos elementos:
typedef struct{
int nmenu;
String title;
String text;
int menuback;
int menuenter;
int menuplus;
int menuminus;
void (*PtrFuncSel)();
}menu;
40
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:
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:
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
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
5V
10K
12 0.5 6
5V
10K
4 0.5 2
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
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
567,3
8.2
Componentes
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
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
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
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
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
Junior
Engineer
0,5
20
10
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
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
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
int
int
int
int
Enter = 78;
Back = 38;
Plus = 12;
Minus = 13;
67
S1
S2
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] = {
int posini[4][7] = {
{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;
68
int nservo = 1;
int npos = 0;
//----------------------------------------------------------------------//----------------------------------------------------------------------//----------------------------------------------------------------------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);
//Declaracin
69
pinMode(yellow[i], OUTPUT);
}
pinMode(84, OUTPUT);
pinMode(80, OUTPUT);
pinMode(4, OUTPUT);
pinMode(tApa, INPUT);
pinMode(19, INPUT);
pinMode(18, INPUT);
{
temp = EEPROM.read(memper[hole]);
per[hole] = temp;
}
Wire.begin(1);
digitalWrite(tApaLow, LOW);
delay(500);
70
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
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");
77
");
}
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
11;
int nsfss =
12;
int nsfsp =
13;
int nsfsd =
14;
int nsfs =
15;
int nsfo =
16;
85
String jname;
String jiden;
int jindex;
String jmeasure;
void setup()
{
Serial.begin(115200);
Wire.begin(5);
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 = "";
87
flagi2cs = true;
msend[0] = 0;
}
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
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
//\"light
//"\"light\":
index = 7;
code = s1;
esc = 1;
}
else if (name == "p2")
index = 7;
code = s2;
esc = 1;
}
93
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++)
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
}
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
97
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';
//ConfServoSend
//ConfServoSend
//ConfServoSend
servo
data
public static final char sfs= 'e';
//ConfServoSave
//ConfServoOut
public
//ConflightInit
static
final
char
clini=
'g';
//ConflightSave
//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
//ServoSend pos
//ServoSend pos
//ServoSend pos
//MotorInit
1
2
3
public static final char mup= 's';
up
98
//MotorMotor n
//MotorMotor n
down
public static final char pini= 'u';
public static final char po= 'v';
//PressureInit
//PressureOut
//Start
//Software
//Start ShowInit
//LedsInit
@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
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",
*/
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
mBluetoothAdapter
if (!mBluetoothAdapter.isEnabled()) {
}else{
mBluetoothAdapter.disable();
}
finish();
}
}
});
/*
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)
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
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;
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);
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
thres
new
111
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
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);
116
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;
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
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
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
}
@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
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);
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]));
}
}
}
}
}
}
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
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
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
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;
int lastindex;
int nservo;
boolean loaded;
ImageView myImageView;
Spinner spinnerScale;
130
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);
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
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
view
(GridView)inflater.inflate(R.layout.servo_sel,
null);
view.setAdapter(new IconAdapter(this,
new
R.drawable.servo_norm),
IconItem
("Servo
Izquierda",
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;
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
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
DEVICE_ADDRESS,
sfss,
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);
}
SeekBar.OnSeekBarChangeListener
= new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
140
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];
}};
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));
}
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>
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
6375mil
2290mil
6375mil
2183.7mil
6375mil T
6330mil
3240mil
6330mil
3340mil
6330mil T
6210mil 2285.472mil
6210mil T
6210mil
2315mil
145
C4
C0805
3615mil 3949.999mil
C6
C0805
3705mil
3955mil
3705mil
3955mil
3705mil 3925.472mil T
C7
C0805
3295mil
3950mil
3295mil
3950mil
3295mil 3979.528mil T
C10
C0805
3075mil
4735mil
3075mil
4735mil 3104.528mil
4735mil T
C11
C0805
3985mil
4405mil
3985mil
4405mil 4014.528mil
4405mil T
C12
C0805
3380mil
3955mil
3380mil
3955mil
3380mil 3984.528mil T
C13
C0805
3300mil
4925mil
3300mil
4925mil
3300mil 4954.528mil T
D1
DIODE_SMC
D2
3.2X1.6X1.1
2540mil
5560mil
2540mil
5560mil
P1
HDR2X3
2770mil
4650mil
2720mil
4750mil
2720mil
4750mil T
P2
HDR1X2
4435mil
3880mil
4435mil
3930mil
4435mil
3930mil T
270.00 Header 2
S1
HDR1X3
2140mil
3540mil
2140mil
3440mil
2140mil
3440mil T
S4
HDR1X3
2140mil
5220mil
2140mil
5120mil
2140mil
5120mil T
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
6140mil T
3995mil T
4550mil
2475mil
4550mil T
4550mil
2140mil
4550mil T
3995mil
2475mil
3995mil T
6140mil
6145mil
6190mil
2140mil
4475mil
6190mil
6025mil T
3640mil
6140mil
HDR1X3
HDR2X6
3100mil
2540mil 5628.898mil T
6140mil
S2
CENTER
3615mil 3979.527mil B
4475mil
6140mil
6980mil
6140mil T
6145mil
6140mil
6140mil T
6980mil
6140mil T
OUT1
HDR1X20
3355mil
3215mil
4305mil
3215mil
4305mil
3215mil T
OUT2
HDR1X20
7750mil
5220mil
7750mil
6170mil
7750mil
6170mil T
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
R7
6-0805_N
5585mil
5585mil 5669.567mil B
R8
6-0805_N
4200.001mil
4000mil
4200mil
4000mil 4164.568mil
4000mil T
R9
6-0805_N
5075.001mil
4275mil
5075mil
4275mil 5039.568mil
4275mil T
R10
6-0805_N
5075.001mil
4085mil
5075mil
4085mil 5039.568mil
4085mil T
R11
6-0805_N
6335mil
5745mil
6335mil 5744.999mil
6335mil 5709.567mil B
R12
6-0805_N
4765mil
3570mil
4765mil 3569.999mil
4765mil 3534.567mil B
R13
6-0805_N
4650mil
3570mil
4650mil 3569.999mil
4650mil 3534.567mil B
R14
6-0805_N
7465mil
5700mil
7465mil 5699.999mil
R15
6-0805_N
5100mil
3700mil
5100mil
3700mil
5100mil 3735.434mil T
R16
6-0805_N
4930mil
3695mil
4930mil
3695mil
4930mil 3730.434mil T
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
R20
6-0805_N
3510mil
3545mil
3510mil
3545mil 3545.434mil
3545mil T
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
2540mil 5794.568mil T
5033.19mil
5585mil 5704.999mil
5715mil
6470mil 5754.567mil B
5040mil T
7465mil 5664.567mil B
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
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
101.08mm B
113.03mm
123.964mm T
94.107mm
99.707mm T
83.693mm
101.08mm T
78.855mm
120.269mm T
101.969mm
85.852mm
111.887mm T
101.207mm T
C0805
83.82mm
C0805
154.432mm
115.951mm
154.432mm
115.951mm
153.682mm
115.951mm T
C15
C0805
141.224mm
113.538mm
141.224mm
113.538mm
140.474mm
113.538mm T
C16
C0805
138.176mm
110.363mm
138.176mm
110.363mm
137.426mm
110.363mm B
C17
C0805
136.017mm
94.488mm
136.017mm
94.488mm
136.017mm
95.238mm T
C18
C0805
144.526mm
94.615mm
144.526mm
94.615mm
144.526mm
95.365mm T
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
120.65mm T
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
155.956mm T
134.874mm
115.57mm
62.865mm
115.57mm T
115.57mm
54.356mm
115.57mm T
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
155.956mm T
81.661mm T
196.85mm
156.718mm T
120.922mm
130.368mm B
64.516mm
123.571mm
123.571mm
155.956mm T
155.956mm T
177.292mm
164.338mm
148.082mm
165.735mm
113.665mm
109.347mm
131.318mm
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
62.865mm
157.226mm
54.356mm
155.956mm T
54.356mm
SOT-23_N
165.735mm
130.048mm T
118.11mm
Q5
131.318mm
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
69.088mm
HDR1X3
OUT1
139.7mm B
120.65mm
S3
HDR2X6
141.224mm
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
118.11mm
HDR1X3
HDR2X6
139.7mm
125.845mm T
147.955mm
S2
CENTER
118.364mm
141.224mm
57.994mm
130.81mm
83.82mm
C13
64.516mm
125.095mm
157.734mm T
91.821mm
100.457mm
C14
82.55mm
83.82mm
84.836mm
111.887mm
161.925mm T
58.051mm
120.269mm
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
147.182mm T
164.585mm
125.571mm T
127.843mm
128.016mm T
125.349mm
91.302mm
125.349mm T
97.282mm
105.907mm
97.282mm T
101.6mm
108.585mm
141.859mm
105.78mm
144.007mm B
101.6mm T
128.005mm
147
108.585mm T
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
R20
6-0805_N
89.154mm
90.043mm
89.154mm
90.043mm
90.054mm
90.043mm T
R21
6-0805_N
154.559mm
120.904mm
154.559mm
120.904mm
153.659mm
120.904mm T
R22
6-0805_N
122.682mm
108.585mm
122.682mm
108.585mm
123.582mm
108.585mm T
R23
6-0805_N
122.809mm
103.886mm
122.809mm
103.886mm
123.709mm
103.886mm T
121.031mm
90.678mm
93.98mm
129.54mm
100.33mm
143.88mm B
94.88mm T
125.222mm
94.753mm T
88.519mm
145.161mm
89.778mm B
189.611mm
93.853mm
89.778mm B
118.11mm
144.78mm
99.43mm B
171.831mm
144.261mm B
R24
6-0805_N
155.702mm
85.344mm
155.702mm
85.344mm
156.602mm
85.344mm T
R25
6-0805_N
122.936mm
99.822mm
122.936mm
99.822mm
123.836mm
99.822mm T
R26
6-0805_N
140.081mm
86.106mm
140.081mm
86.106mm
140.981mm
86.106mm B
R27
6-0805_N
140.081mm
94.742mm
140.081mm
94.742mm
140.981mm
94.742mm B
R31
6-0805_N
140.208mm
131.064mm
140.208mm
131.064mm
140.208mm
131.964mm B
R32
6-0805_N
135.382mm
131.064mm
135.382mm
131.064mm
135.382mm
130.164mm B
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
145.669mm B
95.123mm T
135.204mm
70.739mm
146.755mm B
93.904mm
89.662mm
167.513mm
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
89.662mm T
153.813mm T
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
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
C7
C0805
3295mil
3950mil
3295mil
3950mil
3295mil 3979.528mil T
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
C12
C0805
3380mil
3955mil
3380mil
3955mil
3380mil 3984.528mil T
C13
C0805
3300mil
4925mil
3300mil
4925mil
3300mil 4954.528mil T
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
6210mil 2285.472mil
6210mil T
3615mil 3949.999mil
3615mil 3979.527mil B
4210mil T
2965mil 3920.472mil T
4565mil T
148
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
5920mil T
5150mil 3620.471mil
5775mil 4259.999mil
4345mil B
5150mil B
5650mil T
3020mil 3445.472mil T
5775mil 4289.527mil
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
D4
3.2X1.6X1.1
3248.898mil
5290mil 3248.898mil
5290mil
3180mil
5290mil T
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
6025mil T
2540mil 5628.898mil T
2720mil
4750mil T
3930mil
4435mil
3930mil T
270.00 Header 2
4255mil
6595mil
4255mil T
4060mil
7590mil
4060mil T
180.00 MHDR1X14
3110mil
7590mil
3110mil T
180.00 MHDR1X14
3440mil
2140mil
3440mil T
5120mil
2140mil
5120mil T
3640mil
6190mil
3100mil
5560mil
J2
LEFT
2283.228mil
5135mil 5135.471mil B
6025mil
6140mil
5310mil
3640mil
6140mil
6140mil T
5310mil
6140mil T
S2
HDR1X3
2140mil
4095mil
2140mil
3995mil
2140mil
3995mil T
S6
HDR1X3
2475mil
4650mil
2475mil
4550mil
2475mil
4550mil T
S3
HDR1X3
2140mil
4650mil
2140mil
4550mil
2140mil
4550mil T
S5
HDR1X3
2475mil
4095mil
2475mil
3995mil
2475mil
3995mil T
CENTER
SPARE
HDR2X6
HDR2X6
MASTER
HDR2X6
4725mil
6190mil
6395mil
4475mil
6190mil
7230mil
6140mil
6145mil
6190mil
4475mil
6140mil
6980mil
6145mil
6140mil
6980mil
6140mil T
6140mil T
6140mil T
OUT1
HDR1X20
3355mil
3215mil
4305mil
3215mil
4305mil
3215mil T
OUT2
HDR1X20
7750mil
5220mil
7750mil
6170mil
7750mil
6170mil T
Q1
SOT23_N
5800mil 5714.999mil
Q2
SOT23_N
6095mil 5709.999mil
Q3
SOT23_N
7265mil 5704.999mil
Q4
SOT23_N
6980mil 5704.999mil
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
R7
6-0805_N
5585mil
5585mil 5669.567mil B
R8
6-0805_N
4200.001mil
4000mil
4200mil
4000mil 4164.568mil
4000mil T
R9
6-0805_N
5075.001mil
4275mil
5075mil
4275mil 5039.568mil
4275mil T
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
6470mil 5789.999mil
2540mil
6525mil
5170mil
5830mil
5585mil 5704.999mil
6470mil 5754.567mil B
2540mil 5794.568mil T
4865mil 6479.724mil
4865mil
5033.19mil
4943.74mil T
5040mil T
4085mil T
6335mil 5709.567mil B
4765mil 3569.999mil
4765mil 3534.567mil B
4650mil 3569.999mil
4650mil 3534.567mil B
5700mil
7465mil 5699.999mil
7465mil 5664.567mil B
5100mil
3700mil
5100mil
3700mil
5100mil 3735.434mil T
4930mil
3695mil
4930mil
3695mil
4930mil 3730.434mil T
149
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
R20
6-0805_N
3510mil
3545mil
3510mil
3545mil 3545.434mil
3545mil T
R21
6-0805_N
6085.001mil
R22
6-0805_N
4830mil
4275mil
4830mil
4275mil 4865.434mil
4275mil T
R23
6-0805_N
4835mil
4090mil
4835mil
4090mil 4870.434mil
4090mil T
R24
6-0805_N
6130mil
3360mil
6130mil
3360mil 6165.434mil
3360mil T
R25
6-0805_N
4840mil
3930mil
4840mil
3930mil 4875.434mil
3930mil T
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
R28
6-0805_N
4029.999mil
5365mil 4029.999mil
5365mil 3994.565mil
5365mil B
R29
6-0805_N
2968.898mil
5165mil 2968.898mil
5165mil 3004.332mil
5165mil T
R30
6-0805_N
2963.898mil
5280mil 2963.898mil
5280mil 2999.332mil
5280mil T
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
4760mil T
5520mil 5195.433mil B
5330mil 5124.567mil B
5210mil 4344.568mil
2810mil
5210mil T
5545mil 6659.487mil
5620mil B
U2
MP04A_N
U3
SO20_N
5865mil
5545mil
5865mil
5545mil 6044.134mil
5320mil T
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
4140mil B
5470mil 3654.999mil
5660mil 5399.999mil
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
3745mil T
150
Apndice G: BOM
Comment
Description
Designator
Quantity
Value
Bluegiga WT11
Bluegiga WT11-A
BT1
1,00
Cap Pol3
C1
1,00 22uF
Cap Pol3
C2
1,00 0.47uF
Cap Semi
Cap Semi
C3,C5, C8, C10, C11, C12, C13, C15, C16, C20, C21, C22, C23, C24, C25
Cap Semi
C9
1,00 10uF
Cap Pol3
C19
1,00 2.2uF
Cap Semi
C26
1,00 1uF
Diode 1N4005
D1
1,00
HSMD-C150
D2, D3, D4
3,00
PWR2.5
J1
1,00
1-1470156-1
J2
1,00
Header 3X2
P1, P4
2,00
6,00 22pF
15,00 100n
Header 2
Header, 2-Pin
P2
1,00
Header 3X2H
P3
1,00
MHDR1X14
Header, 14-Pin
P5, P6
2,00
Header 3H
6,00
Header 6X2H
5,00
Header 20
Header, 20-Pin
P18, P19
2,00
PDTC114YT
4,00
IRLML5103
Q5
1,00
10K
R3
1,00 10k
EXBM16P
R4
1,00
Res3
Resistor
8,00 1K
Res3
Resistor
8,00 10K
Res3
Resistor
R9
1,00 150K
Res3
Resistor
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
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
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
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
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
U9
1,00
FT232RL-Reel
USB UART Asynchronous Serial Data Transfer Chip, SSOP-28, Tape and Reel
U10
1,00
LM358D
U11
1,00
Jumper
Jumper Wire
W1, W2, W3
3,00
16MHz
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
152
153
154
155
156