You are on page 1of 140

Proyecto Fin de Carrera

Desarrollo e implantacin de un sistema de


adquisicin de datos y monitorizacin para un
sistema de deteccin
de materia oscura
Autor
Alberto Peir Val
Director
Jos Ramn Asensio Diago
Escuela de ngenier!a y Arquitectura
"#$%
Repositorio de la Universidad de Zaragoza Zaguan http://zaguan.unizar.es
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
2
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
DESARROLLO E IMPLANTACIN DE UN SISTEMA DE
ADQUISICIN DE DATOS Y MONITARIZACIN PARA UN
SISTEMA DE DETECCIN DE MATERIA OSCURA
RESUMEN
El proyecto consiste en realizar un sistema de adquisicin de datos para los
experimentos de deteccin de materia oscura que se llevan a cabo en la Facultad de
Ciencias de Zaragoza.
Para este caso, por sus caractersticas, se plantea una solucin en la que se
construyen conuntos con !"C
#
$aspberry Pi y !%C
&
'rduino que integran, de una
(orma modular, todos los equipos a una red Et)ernet. Consiguiendo as un sistema
con un alto grado de (lexibilidad.
El proyecto tambi*n incluye el desarrollo de los programas necesarios para el uso
de estos conuntos. El so(t+are )a sido realizado en su mayor parte en Pyt)on por
ser un lenguae sencillo y (,cilmente adaptable a cualquier cambio que surgiese en
el proyecto. Comprende desde una inter(az gr,(ica de usuario, al uso de soc-ets
.CP/0P para la red Et)ernet, un servidor que )ace de puente con el puerto serie y
los programas para el micro1controlador 'rduino, estos 2ltimos en C, para la
digitalizacin de las se3ales, comunicacin, y control en bucle abierto de un motor
paso a paso.
1 Single Board Computer.
2 Single Board Microcontroller.
3
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
4
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
NDICE
#. 0ntroduccin. Problema a resolver 7
&. Estructura 4ard+are 10
&.# 'n,lisis de los equipos #5
&.& 'rquitectura de la solucin #5
6. Estructura !o(t+are 13
6.# !o(t+are y lenguae de programacin #6
6.& 0nter(az gr,(ica #6
6.6 %dulos Pyt)on #7
6.7 Comunicacin por soc-ets .CP/0P #8
6.8 Comunicacin serie #8
6.9 :igitalizacin de se3ales #;
6.; Controlador del motor paso a paso #<
7. Conclusiones y trabaos (uturos 19
8. "ibliogra(a y enlaces 21
9. 'gradecimientos 22
'nexos
'nexo #. 0n(ormacin de los equipos 25
'nexo &. Presentacin previa de opciones para el sistema de
adquisicin y monitorizacin 27
'nexo 6. Estructura de la inter(az gr,(ica 33
'nexo 7. 'cceso a (unciones C desde Pyt)on 37
'nexo 8. Control de un motor paso a paso con 'rduino y %otor !)ield 43
'nexo 9. Programas 55
5
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
6
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
MEMORIA
1. INTRODUCCIN. Problema a resolver
El proyecto, como el ttulo adelanta, consiste en construir un sistema de adquisicin de
datos para los experimentos de deteccin de materia oscura que se realizan en la
Facultad de Ciencias de Zaragoza= en concreto, por el >aboratorio de Fsica ?uclear y
'stropartculas.
El experimento se enmarca en el proyecto .$E@ A?ovel :evelopments in t)e .ime
Proection C)ambers (or $are Event !earc)esB, (inanciado por una Starting Grant del
European $esearc) Center, que (ue otorgada en &55< al investigador 0gor Carca
0rastorza. !u obetivo principal es la consolidacin de las actividades del grupo en .PCs
A.ime Proection C)amberB y el equipamiento de un laboratorio especializado en .PCs
para aplicaciones de bao (ondo en la Dniversidad de Zaragoza. :entro de este proyecto,
se encuentra la actividad .$E@1:%, consistente en la construccin de una .PC con
%icromegas para la deteccin de %ateria Escura con un bao umbral de energa y un
bao nivel de (ondo.
El montae, (igura #, consta de una carcasa cilndrica en la que )ay aloados una placa y
unos anillos que crean un (uerte campo el*ctrico longitudinal al ee. Contenido en la
carcasa )ay un gas con el que las partculas buscadas interaccionando creando pares
7
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
electrn1in a lo largo de su trayectoria. Estos electrones son arrastrados por el campo
el*ctrico )acia uno de los detectores donde se obtiene una medida de la cantidad de
energa depositada y datos que permiten la reconstruccin de la trayectoria de la
partcula inicial.
>o que se desea es monitorizar las variables (sicas en las que el experimento se
desarrolla Apresin, temperatura, campo el*ctricoB, adem,s de tener la posibilidad de
interactuar con los equipos a distancia a trav*s de una red. Estos equipos, como puede
verse en la (igura #, son (uentes de tensin, caudalmetros, un vacumetro, un
manmetro y un termmetro.
Objetivos.
>as caractersticas que deba tener el sistema de adquisicin de datos (ueron (iadas por
consenso con los encargados del experimento tras una presentacin en la que se
expusieron distintas soluciones. En *stas se consideraron desde usar un PC con taretas
PC0, pasando por >abFie+ con los mdulos de )ard+are de ?ational 0nstruments, )asta
P>Cs con un sistema !C':'. Fer 'nexo #.
Finalmente, con esta in(ormacin y teniendo en cuenta las restricciones en cuanto a
tiempo de respuesta y resolucin, se decidi construir conuntos con !"C $aspberry Pi y
!"% 'rduino que )iciesen de inter(az entre los equipos y una red Et)ernet Aver (igura
&B. Cada uno ellos dotado con una inter(az gr,(ica de usuario independiente ACD0B,
consigui*ndose as una modularidad que )ace al sistema (,cilmente reutilizable en otros
experimentos, con solo trasladar el conunto a un nuevo experimento Ao duplicarloB y
empezar a utilizarlo desde su correspondiente inter(az gr,(ica de usuario ACD0B. 0gual de
(,cil es conectar al sistema un nuevo equipo similar.
Como lenguae de programacin se escogi Pyt)on, por ser un lenguae sencillo y de alto
nivel que permite a cualquier usuario modi(icarlo y adaptarlo r,pida y (,cilmente a
cualquier cambio en el dise3o del experimento.
' pesar de no )aberse dado especi(icaciones sobre la robustez del sistema, por no ser un
aspecto crtico, se intenta que este sea lo m,s robusto posible con la menor probabilidad
de error en la toma de las medidas. Para ello, en todo momento, se usa el protocolo con
mayor inmunidad al ruido disponible en el equipo de medida, programacin con
tratamiento de excepciones y, adem,s, se incorpora alg2n control para detectar y evitar
errores.
Contenido.
>a memoria se divide en dos secciones principales bien di(erenciadas, una para el
)ard+are y otra para el so(t+are.
En la primera de ellas, se )ace un an,lisis de los equipos centr,ndonos en los tipos de
conexin disponibles y en su inmunidad al ruido. Con esta in(ormacin, de(inimos los
conuntos de $aspberry Pi y 'rduino que )acen de inter(az con la red Et)ernet.
>a segunda seccin, m,s extensa, trata del so(t+are necesario para conseguir la
integracin de los equipos en la red. Este constara de las siguiente partes dependiendo
del tipo de conexin existente en el equipo.
G Dna inter(az gr,(ica de usuario que usa )ilos de eecucin para evitar bloqueos en la
aplicacin y una cola F0FE a la que se accede en exclusin mutua para organizar la
8
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
9
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
salida por pantalla de los datos proporcionados por las tareas.
G %dulos Pyt)on, que son el equivalente a las bibliotecas, que aglutinan las
instrucciones para entenderse y operar con los equipos. Casi todos ellos est,n
constituidas por (unciones que construyen mensaes en el lenguae comprensible de
cada equipo de medida. 'unque tambi*n se )an utilizado otras (acilidades de Pyt)on,
como el mdulo Ctypes que permite usar las (unciones C de bibliotecas de enlace
din,mico, proporcionadas por el (abricante, directamente desde Pyt)on.
G Dso de soc-ets .CP/0P para la comunicacin Et)ernet
G Dn programa servidor que )ace de puente con la conexin serie.
G Programas para el micro1controlador 'rduino que realizan las tareas de
digitalizacin de las se3ales, comunicacin, y de control en bucle abierto del motor
paso a paso.
2. ESTRUCTURA HARDWARE
2.1 Anlisis de los equipos
Empezamos por )acer un an,lisis de los tipos de conexin disponibles en los equipos
involucrados en el experimento. 's, teniendo presente la tabla #, que recoge las
caractersticas de cada conexin, construimos la parte sombreada en gris de la (igura 6
en la que aparece el equipo, su (uncin, y el tipo de conexin m,s con(iable disponible.
Entendiendo por con(iable la m,s inmune al ruido, y por tanto m,s segura y menos
propensa a la aparicin de errores. $esumiendo, seg2n la tabla &, escogeremos como
primera opcin Et)ernet, seguida de D!", $!&6& y, (inalmente, la conexin analgica.
Para una in(ormacin m,s detallada de los equipos se puede consultar el anexo &.
2.2 Arquitectura de la solucin
!intetizando, la solucin, consensuada con el equipo de los experimentos, consiste en
construir conuntos con !"C $aspberry Pi y !"% 'rduino que )acen de inter(az entre
los equipos y la red Et)ernet, ver (iguras & y 6. Este dise3o modular permite una alta
(lexibilidad en la que es muy (,cil a3adir nuevos equipos o reutilizarlos en otros
experimentos.
'ntes de continuar con la creacin de los bloques, describimos brevemente qu* es un
!"C $aspberry Pi y un !"% 'rduino.
10
Comunicacin nmunidad longitud
Et&ernet Encapsulamiento inform. +
comprobacin CRC
Depende del tipo de medio
fsico
'() Seal diferencial 1600m
R("%" Nieles de olta!e "m tpico
Analgica Nin#uno
Tabla 1: Anlisis de inmunidad al ruido del protocolo de comunicacin.
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
11
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Dn !"C A!ingle "oard ComputerB
$aspberry Pi, (igura 7, es un ordenador
completo construido en una 2nica placa.
El tama3o es del de una tareta de
cr*dito, porta un microprocesador '$%
Aarquitectura $0!CB y usa >inux como
sistema operativo. Fue desarrollado en
$eino Dnido por la (undacin $aspberry
Pi H#I, cuyos miembros est,n de alg2n
modo relacionados con la empresa
"roadcom.
El !"% A!ingle "oard %icrocontrollerB
'rduino H&I, (igura 8, es una plata(orma
de )ard+are libre, basada en una placa
con un micro1controlador y un entorno de
desarrollo. Existen distintos modelos, de
entre los cuales, usaremos el 'rduino Dno
rev.6, que viene con un puerto D!" y un
micro1controlador 'tmega 6&J de #9 %)z
con 9 entradas multiplexadas para la
digitalizacin con una resolucin de #5
bits, que es su(iciente para lo que se
requera, y dos salidas PK% APulse Kit)
%odulation.
Folviendo a la tarea de crear los
conuntos , vemos en la (igura 6 que ya
)ay dos equipos, !pellman y Caen, que ya
vienen con conexin Et)ernet, por lo que
no necesitar,n ning2n dispositivo extra.
>os dos siguientes, %axigauge y "ron-)orst, disponen solo de conexin serie $!&6&. >a
cual, como )emos visto, tiene poca inmunidad al ruido por lo que conviene reducir la
longitud de este tipo de conexin a la menor posible para meorar la robustez. Para este
caso, usamos un cable conversor $!&6&1D!" Acon distancia $!&6& aproximadamente
nulaB que conectaremos a un $aspberry Pi, en el que se estar, eecutando un programa
servidor que )ace de puente entre la conexin .CP/0P en la red Et)ernet y el puerto
serie del dispositivo.
Para los equipos con salida analgica, el primer paso ser, digitalizar la se3al utilizando
un 'rduino. Este es capaz de digitalizar la se3al con #5 bits de resolucin y tomando una
muestra cada 5.&8ms. Puesto que el 'rduino es un dispositivo peque3o, cuanto m,s
cerca lo podamos colocar de la (uente reduciendo la distancia del cable de la se3al,
mayor ser, la calidad de la medicin. En el siguiente paso conectamos el 'rduino con un
cable D!" a un $aspberry Pi, obteniendo ya un conunto similar al descrito al caso
anterior.
Por 2ltimo, en el caso del motor paso a paso, el )ard+are del conunto es el mismo que
el que acabamos de ver. !iendo la 2nica di(erencia el programa que corre en el 'rduino,
que a)ora es un control en bucle abierto de un motor paso a paso.
12
Figura 5. Arduino
Figura 4. Raspberry pi
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Para terminar, )abra que mencionar que durante la realizacin del proyecto )an ido
apareciendo otras opciones de )ard+are, y parece que la tendencia actual es la de
seguir ampliando a2n m,s la o(erta= por mencionar dos eemplos, el Cnublin es otro !"C
similar a $aspberry Pi y el 4ummingbird al 'rduino.
En la misma direccin, tambi*n son posibles otras con(iguraciones distintas a los
conuntos presentados y que son compatibles con los programas desarrollados. Por
tanto, otras con(iguraciones como la de la (igura 9 podran ser alternativas a los dise3os
realizados.
3. ESTRUCTURA SOFTWARE
3.1 Software y lenguaje de programacin.
En la (igura 6 aparece todo el so(t+are unto al )ard+are que lo aloa. Casi todo *l, est,
realizado en Pyt)on H6IH7IH8I, o en C en el caso de los programas para el 'rduino H&I.
Dna de las caractersticas de Pyt)on, el nombre le viene de los %onty Pyt)on y no de la
serpiente, es que es un lenguae interpretado utilizado para prototipado r,pido con
multitud de bibliotecas, y que )ace )incapi* en una sintaxis clara,. Eso lo )ace muy
apropiado para casos como el que tratamos, en el
que se van a e(ectuar muc)os cambios y
modi(icaciones, y lo meor es poderlas )acer
r,pido y sin muc)as complicaciones.
En los siguientes apartados vamos a ir explicando
con m,s detalle las caractersticas m,s
importantes de los programas que contiene el
conunto.
3.2 Interfaz grfica del usuario
Pensando en la modularidad de la solucin se )an
13
Figura 7. Ejemplo de interfaz grfica
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
construido inter(aces gr,(icas independientes para cada equipo. Dn eemplo de cmo
son estas se muestra en la (igura ;. Est,n realizadas en Pyt)on y usan la biblioteca
gr,(ica tkinter, la cual se eecuta en un modo conducido por eventos, es decirL
permanece inactiva )asta que un evento la )ace despertar. $azn por la que se tienen
que usar )ilos para eecutar tareas de (ondo y evitar bloqueos. 'dem,s, puesto que la
salida por pantalla es un recurso compartido se necesita usar una cola F0FE para
acceder en exclusin mutua y organizar la salida de los datos. >a estructura puede verse
en la (igura J.
.odos estos temas, )ilos, estructuras de datos, y el mdulo tkinter, son tratados en
pro(undidad en el libro de la re(erencia H8I, incluso apunta la solucin que )emos usado,
la cual se explica en detalle en el anexo 6.
3.3 Mdulos Python
>os mdulos de Pyt)on son el equivalente a las bibliotecas en otros lenguaes H6IH7I.
!e )an creado mdulos espec(icos para cada equipo que aglutinan las instrucciones
para la comunicacin con cada uno de ellos. Estos mdulos son usados desde las
inter(aces gr,(icas para interactuar con los equipos, ya sea solicitando datos o
modi(icando alguna salida. !u construccin es autosu(iciente, es decir, que contienen
todo lo necesario para e(ectuar por si solos una comunicacin .CP/0P, enviar un mensae
y esperar su respuesta. Por tanto esto les permite ser usados desde cualquier programa,
e incluso desde el int*rprete de Pyt)on. Este es una especie de !)ell de comandos desde
el que se puede cargar un mdulo y utilzar directamente sus (unciones. Con lo que
14
Figura 8. Alternativas de diseo a los conjuntos
*AREA PR+CPA,
- .' -
Conducida por e/entos
0espera inacti/a a la
espera de e/entos12
Programacin peridica
de un re3resco y toma
de los datos de la pila2
Variables globales
,anzamiento de tareas en paralelo
0&ilos de e4ecucin1
Cola FF5
0mute61
E+*5R+5 DE, PR5.RA7A PR+CPA,
(lo el &ilo principal
escribe en las
/ariables globales
(lo lectura
*area *area
+C5
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
disponemos de una plata(orma extra para comunicarnos con los equipos sin la necesidad
de una inter(az gr,(ica.
El caso del equipo C'E?, es un poco distinto, ya que en *ste se )a utilizado el mdulo
Ctypes para usar las (unciones de una biblioteca C proporcionada por el (abricante, el
resto usa Pyt)on para crear los mensaes y soc-ets como medio de comunicacin.
0gualmente tenemos para dic)o equipo un mdulo Pyt)on autosu(iciente, pero que a)ora
no slo necesita Pyt)on, sino tambi*n la biblioteca C del equipo. En el anexo 7 se explica
el uso de Ctypes para el uso de (unciones C desde Pyt)on.
3.4 Comunicacin por sockets TCP/IP
Como medio de comunicacin entre aplicaciones dentro de una red Et)ernet, usamos
soc-ets .CP/0P. :i(erenciamos dos tipos de soc-ets. Dno, el soc-et servidor que est,
esperando en un puerto determinado a una peticin de conexin, y otro, los soc-ets
clientes entre los que se establece la comunicacin, la cual generalmente se compone
del intercambio de unos pocos mensaes. Cuando se da por (inalizada se destruye la
conexin liberando todos los recursos utilizados.
Explicado en detalle, figura 9, la cual no debe tomarse como una esecificaci!n
formal, sino simlemente como un ao"o gr#fico a la e$licaci!n., el proceso se
inicia cuando un cliente realiza una peticin de conexin al soc-et servidor. En caso de
ser aceptada, este soc-et servidor crea un nuevo soc-et, del tipo cliente, asoci,ndolo
con el primero y (ormando una parea de iguales Apeer to peerB entre los que se
establece la conexin. Esta parea est, ligada a un puerto cada vez distinto, o al menos
*ste no se va a repetir en muc)o tiempo, del ordenador del que parte la peticin. El uso
de puerto distinto cada vez, unido a que slo se enva una 2nica instruccin al equipo en
cada conexin, se traduce en que )ay una relacin instruccin1respuesta que dota al
sistema de una mayor robustez ya que no puede darse un error por el que un cliente
obtenga una respuesta que no le corresponda.
>a conversacin, como se )a adelantado, consta del envo de un solo mensae, donde se
encuentra la instruccin, y una espera de la respuesta. Para evitar bloqueos la
conversacin acabar, cuando se reciba una respuesta o cuando se supere un tiempo
lmite Alos rect,ngulos representan transiciones temporizadasB. En ambos casos cuando
acaban de usarse los soc-ets se destruyen liberando los recursos Abuffers de redB que el
sistema operativo est* usando.
%ientras transcurra la conversacin, el soc-et servidor sigue aceptando peticiones de
conexin, las cuales quedan a la espera de que les sea asociado un soc-et Ao sean
anuladas porque el soc-et cliente ya no existeB. >a asociacin se )a dispuesto de (orma
secuencial y no ocurrir, )asta que la anterior comunicacin )aya sido completada. Esta
estructura permite tener a varios clientes comunic,ndose con una mismo dispositivo
serie con lo que podemos tener varias inter(aces gr,(icas abiertas al mismo tiempo.
3.5 Comunicacin serie
Dna biblioteca de Pyt)on, PySerial, proporciona todos los los elemento necesarios para
interactuar con el puerto serie. En la p,gina del proyecto Py!erial H9I )ay varios
eemplos de uso y en los cuales nos basamos para )acer el programa para la gestin de
15
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
16
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
la conexin serie.
?os ayudaremos de la figura 10, %ue igual %ue antes no debe tomarse como una
esecificaci!n formal, sino simlemente como un ao"o gr#fico a la e$licaci!n.
'dem,s, para tener un modelo adecuado quiz,s se debera usar una $ed de Petri
Coloreada en la que intervendra el orden de llegada de las marcas. En una primera
versin muy simple en la que el cliente )iciese una peticin al dispositivo serie y
esperase inde(inidamente la respuesta aparecera el problema de que un mensae
corrupto Acomo el no encontrar el car,cter (in de mensaeB bloquease el sistema.
>a primera solucin (ue a3adir un tiempo de espera lmite en el cliente, similar a como
(uncionan los soc-ets. El problema que aparece es que al sobrepasarse este tiempo, el
cliente puede volver a enviar otro mensae con lo que estos se pueden ir acumulando en
los buffers de entrada y salida. 'unque tiene la ventaa de que puede avisar aguas arriba
de que el problema se encuentra en el dispositivo serie y no en la red Et)ernet.
Esta acumulacin de mensaes puede producir una p*rdida de sincronizacin entre la
peticin y su respuesta. Para evitar esto podemos vacar los bu((ers, una (orma de
)acerlo es leer todo el buffer y descartar los m,s antiguos qued,ndonos slo con el
2ltimo, como se representa en la (igura #5. !in embargo queda por resolver un problema
m,s sutil. !i un cliente enva una peticin al dispositivo serie y supera el tiempo de
espera sin obtener respuesta, quiz, porque la peticin sigue siendo procesada, despu*s
de que el siguiente cliente )aga su peticin la respuesta que encontrar, ser, la del
cliente anterior y no la suya. Para evitar esta situacin lo que )acemos es devolver la
respuesta con el mensae de entrada que la gener. :e (orma que podemos comprobar si
coincide y actuar en consecuencia. %uc)o meor si a3adimos un n2mero de secuencia a
la orden para el caso en que estas sean id*nticas.
.odo esto 2ltimo est, implementado en el programa que )ace de puente entre la
conexin serie y la red Et)ernet. .ambi*n dispone de tratamiento de excepciones para
evitar que el programa se cuelgue por cualquier circunstancia no esperada, por eemplo
campos de datos inexistentes, o tipos incorrectos que puedan aparecer por corrupcin
de los mensaes en la transmisin. .ambi*n usando excepciones, el mismo programa es
capaz de detectar la desconexin del dispositivo serie y lanzar un )ilo para su
reconexin. %ientras, el programa principal sigue atento a cualquier conexin que
venga de la inter(az gr,(ica in(ormando que el dispositivo serie se )a desconectado.
3.6 Digitalizacin de seales
El programa que se encarga de la digitalizacin de las se3ales analgicas se encuentra
en los 'rduino. Este posee 9 entradas multiplexadas para la digitalizacin de la se3al
con #5 bits de resolucin, su(icientes para lo que se requera.
El programa sigue el esquema de comunicacin, que acabamos de ver en el apartado
anterior, e(ectuando una digitalizacin a instancia de una peticin y devolviendo la
respuesta acompa3ada de la orden. En el caso que no entendiese la orden, simplemente,
la remitira volviendo a estado de inicial de escuc)a. El programa, como todos los
dem,s, se encuentra en los anexos.
17
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
18
Figura 10. Comunicacin por el puerto serie
(erial2read01
5peracin
8rite01
read01
serial*imeout
E6ception
bu33er entrada
tiempo otorgado
a toda la operacin
bu33er salida
Compara mensa4e de salida
con el mensa4e esperado
y act9a en consecuencia2
C&ec:
Por orden
de llegada
Por orden
de llegada
,ee &asta que
queda solo el
9ltimo mensa4e
*iempo de
e4ecucin
+ue/a
peticin
;ueda el mensa4e
m<s nue/o
;ueda el mensa4e
m<s nue/o
C,E+*E D(P5(*V5 (ERE
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
3.7 Controlador del motor paso a paso
:urante la (ase de desarrollo de este proyecto, el equipo de investigacin sugiri una
ampliacin consistente en que la (uente de radiacin de baa intensidad, que en un
principio iba a permanecer (ia, se moviese entre oc)o posiciones en el interior de la
carcasa.
El dispositivo para guiar el movimiento se vale
de una sirga conducida por el interior de un
tubo )ueco de pl,stico, y movida por (riccin
a trav*s de una polea por un motor paso a
paso. El motor seleccionado deba transmitir
un par de #?m sin un conunto reductor, por
razones de espacio, y tener una resolucin
aceptable. 'mbos condicionantes podan
cumplirse con un motor paso a paso )brido
bipolar de &55 pasos por vuelta. Figura ##.
Para su control se usa un 'rduino Dno $ev6
acompa3ado de una placa %otor !)ield $ev6
que es la encargada 2ltima de cortar o )acer
(luir en un sentido u otro la corriente que
circula por las bobinas del motor. Dna sntesis
del )ard+are relevante de esta placa y la
relacin con los pines del 'rduino puede verse en la (igura #&, en la que tambi*n se
incluyen los elementos m,s importantes que intervienen en el proceso de control de las
intensidades que )acen girar el motor. En el anexo 8 se recoge in(ormacin m,s
detallada, y tanto en este como en la p,gina +eb H;I se puede encontrar el esquema
el*ctrico completo.
En lo respectivo al so(t+are, existe una biblioteca, pero esta no se corresponde con el
)ard+are del %otor !)ield rev6 por ser nuevo A(ebrero de &5#6, de aqu la utilidad de la
(igura #&B. Por tanto, se )an programado las (unciones espec(icas para el movimiento
del motor. Estas se basan en generar una secuencia que va cambiando la intensidad que
pasa por los distintos polos )aciendo que el campo magn*tico gire y con *l arrastre el
rotor. Como no se )a instalado ning2n tipo de sensor para la posicin del conunto, no
)ay realimentacin de la posicin, por lo que lo 2nico que podemos )acer es (iarnos del
auste experimental, de la (uerza y el tiempo de paso, y esperar que llegue a la posicin
correcta. Para tener al menos un punto de cero, se instal un interruptor que )ace de
(inal de carrera, por lo que adem,s de estas (unciones, tambi*n se )a programado una
interrupcin en el 'rduinoL *sta se lanza cuando la se3al del (inal de carrera pasa de 5 a
#, e inmediatamente interrumpe el giro del motor y reausta la posicin eliminando
cualquier error en *sta que se )ubiese podido ir acumulando.
4. CONCLUSIONES Y TRABAJOS FUTUROS
El aspecto m,s destacable de la solucin, seguramente, es su dise3o modular que le da
una gran (lexibilidad. !iendo muy (,cil volver a reutilizar los conuntos en otros
experimentos, o incluso a3adir otros completamente nuevos modi(icando solo las partes
espec(icas del so(t+are existente, que puede tomarse como una plantilla.
19
Figura 11. Motor paso a paso
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
20
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Etra caracterstica a rese3ar, es que el )ard+are utilizado es de uso general y est,
destinado al consumo de masas, por lo que tiende a ser m,s barato que cualquier otro
espec(ico. 'dem,s, estos dispositivos )an aparecido )ace poco, con lo que la solucin es
bastante novedosa. Por el eemplo el $asberry Pi se lanz al mercado )ace a3o y medio,
el &< de (ebrero del &5#&.
>o que (altara )acer, o meor, lo que no se )a podido )acer, por retrasos en la
instalacin y puesta en marc)a del experimento, es probar el comportamiento del
sistema en condiciones de trabao continuo, y cu,l sera su (iabilidad.
Este proyecto dea la puerta abierta a (uturas meoras. :esde el punto de vista de
control quedara cerrar el bucle de control del motor paso a paso, usando el PK% como
modulador de la accin e incorporando alg2n sensor para la realimentacin.
.ambi*n se podran incorporar m*todos de deteccin y correccin de errores en los
mensaes para aumentar la robustez. Dn m*todo apropiado sera el de 4amming. 's
mismo se podra pensar en usar alg2n m*todo de hash, aunque el uso de estos en
mensaes cortos, como los que se envan en esta aplicacin, )ace que aumente de (orma
importante la longitud de la cadena.
5. BIBLIOGRAFA Y ENLACES
H#I $aspberry Pi
)ttpL//+++.raspberrypi.org/
H&I 'rduino
)ttpL//+++.arduino.cc/
H6I Pyt)on
)ttpL//+++.pyt)on.org/
H7I >earning Pyt)on 8t) Ed &5#6
'utorL %ar- >utz. Editorial EM$eilly %edia 0nc.
H8I Programming Pyt)on 7t) Ed &5#5
'utorL %ar- >utz. Editorial EM$eilly %edia 0nc.
H9I Py!erial
)ttpL//pyserial.source(orge.net/
H;I Esquema el*ctrico del 'rduino %otor !)ield $6
)ttpL//arduino.cc/en/%ain/'rduino%otor!)ield$6
21
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
6. AGRADECIMIENTOS
Nuiero expresar mi agradecimiento a las personas que me )an ayudado a la realizacin
de este proyecto (in de carrera, en especial al personal del >aboratorio de Fsica
?uclear y 'stropartculasL
' :. 0gor Carca 0rastorza, investigador principal del proyecto en el que se encuadra la
solucin aportada en este PFC.
' :. Francisco 0guaz Cutierrez, con quien )e trabaado en el laboratorio, por su tiempo,
receptividad, y con quien el que el intercambio de ideas )a sido crucial para la
culminacin de este PFC.
' :. Ouan Castel por su continua disposicin a ec)ar una mano.
P a :. Oos* $amn 'sensio por toda la experiencia que )a aportado como por su trato
personal y ayuda prestada en la realizacin de este proyecto.
22
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXOS:
23
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
24
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO 1. INFORMACION EQUIPOS
Introduccin
'mpliamos la in(ormacin de los equipos involucrados en el experimento detallando el modelo y
dando la p,gina +eb donde se puede encontrar las caractersticas correspondientes al modelo.
Spellman
%odeloL !pellman !>. Fuente de alta tensin.
)ttpL//+++.spellman)v.com/en/Products/$ac-1!upplies/!>.aspx
!tandard 0nter(ace control option A!0CB. Epcin adicional que permite la comunicacin por
$!&6&/D!"/Et)ernet
)ttpL//+++.spellman)v.com/en/Products/'ccessories/!0C1Eption.aspx
CAEN
%odeloL C'E? !P&8&;. Dniversal %ultic)annel Po+er !upply !ystem.
)ttpL//+++.caen.it/csite/CaenProd.spQidmodR#&6SparentR&5
C'E? 4F Krapper. "iblioteca C. Aversin 8.&5B.
)ttpL//+++.caen.it/csite/CaenProd.spQidmodRJ68SparentR6J
MaxiGauge
%odeloL %axigauge .PC &89 '. Facuum measurement and control unit (or Compact Cauges.
)ttpL//+++.p(ei((er1
vacuum.com/products/measurement/activeline/controllers/onlinecatalog.actionQ
detailPdo0dR68&9Tproduct1accessories
Bronkhorst
%odeloL "ron-)orst F1&5#CF1%C:1661F
)ttpL//+++.bron-)orst.com/en/products/gasU(lo+UmetersUandUcontrollers/el(lo+Uselect/
%anual del protocolo Flo+"us pa
)ttpL//+++.bron-)orst.com/(iles/do+nloads/manualsUenglis)/<#;5&;manualUrs&6&Uinter(ace.pd(
Swagelok
%odeloL !+agelo- P.D. Dltra 4ig) Purity .ransducer.
)ttpsL//+++.s+agelo-.com/products/measurement1devices/pressure1transducers/ultra)ig)1purity1
(lo+1t)roug).aspx
25
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Motor paso a paso
$! 8;mm stepper motor,#&9?cm #.Jdeg. &.8F
)ttpL//es.rs1online.com/+eb/p/motores1paso1a1paso/868576</
26
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO 2. PRESENTACIN DE OPCIONES PARA EL SISTEMA
DE ADQUISICIN Y MONITORIZACIN
Ebetivo del documentoL presentar cinco opciones de sistema de control y toma de datos para el
proyecto .$E@1:%, resaltando caractersticas y di(erencias para su comparacin, y (inal seleccin
de una de ellas.
Esquem !"#$e%&#
En el esquema que se encuentra al (inal del documento quedan re(leados los dispositivos usados
en el proyecto de (orma que sea (,cil su identi(icacin y el estudio de su conexionado. Figura 8.
T'( !"&#s)!"#&#%#(# *e %#+e,-.+
Tabla -protocolos- RS232, RS48, !S", #thernet, Cone$i%n anal%gica&
Excepto donde no sea posible descartamos el protocolo $!1&6& por ser este muy sensible al ruido
Ano m,s de 8 o #5 (rente a #-m del $!17J8B. 'dem,s, cada conexin necesitara un puerto de la
placa.
>a meor opcin es usar $!17J8, con este protocolo se pueden conectar )asta 6& dispositivos en
cadena, (ormando una red y usando un solo puerto.
Ebservando la tabla, vemos que no podemos conseguir agruparlas en un mismo tipo de protocolo,
por tanto vamos a necesitar varios tipos de taretas de adquisicin de datos.
>a (uente !pellman de alta tensin la podremos conectar usando D!" o Et)ernet.
P por 2ltimo, a (alta de (iar el termmetro y caudalmetro nos queda una se3al entrada analgica,
que )abr, que digitalizar.
P"#!ues&s
1) National Instruments (PC-Mdulos) + LabView
Consistira en un bloque en el que se insertan el PC y
los mdulos para adquisicin de datos. !e usara
>abFie+ como so(t+are de programacin. Figura #.
>emaL V!olucin empresarialV
W Empresa >der en el sector de la
instrumentacin.
27
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
W !olucin utilizada en el ,mbito empresarial.
Podemos con(ar en su robustez, (iabilidad,
(acilidad de desarrollo y mantenibilidad.
W Dsa >abFie+, lenguae est,ndar a la )ora de
buscar continuidad o ampliacin.
2) PC + tarjetas + LabView
Dsaramos un PC normal con las taretas necesarias
para la captura de datos. P como lenguae de
programacin >abFie+.
>emaL V!olucin austada a una situacin concretaV
W %,s barata que la opcin #.
1 Probable aparicin de di(icultades en el desarrollo Adrivers taretas1PCB ante los cuales se
producir,n retrasos y en el caso m,s grave vas muertas en las que )ubiese que cambiar
)ard+are.
W H>abFie+I Dsar >abvie+ permite una mayor (acilidad a que el so(t+are sea modi(icado
por otros.
3) PC + tarjetas + Python
Dsaramos un PC normal con las taretas necesarias para la captura de datos. P como lenguae de
programacin Pyt)on.
>emaL V!olucin austada a una situacin concreta usando so(t+are libreV
R %ismas consideraciones que en la opcin & respecto al )ard+are.
W HPyt)onI !o(t+are libre. >enguae sencillo con amplia gama de bibliotecas usado para
prototipado r,pido.
1 HPyt)onI llevar, muc)as m,s )oras de desarrollo del so(t+are.
1 HPyt)onI 'unque el programa resultante est* bien documentado, el uso de un so(t+are
que no est, estandarizado en la industria, sumado a que ser, un trabao individual,
conducir,, seguramente, a que sea di(cil de retomar o modi(icar por otros.
4) Red Ethernet con Raspberry Pi y Arduinos.
Dn 'rduino es un microcontrolador que
usaramos para la adquisicin de datos,
mientras el $aspberry Pi es un ordenador del
tama3o de una tareta de cr*dito en el que
instalaramos un servidor con el que nos
comunicaramos por .CP/0P desde cualquier
otro ordenador. Figura 6.
>emaL V!olucin experimental e innovadoraV
1 $obustez y (iabilidad son una
incgnita. Es algo muy nuevo
1 HPyt)onI !o(t+are libre. :esarrollo
28
Figura 2. Tarjeta PCI
t
Figura 3. Raspberry Pi y Arduino
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
costoso en tiempo.
W Epcin barata.
W $educcin del ruido en la adquisicin de datos. .CP/0P es tambi*n muy robusto al ruido.
W Exportable al resto del laboratorio.
W %odularidad
5) PLC + tarjetas + SCADA
Consistira en un P>C AProgrammable >ogic ControllerB o autmata programable, este es un
dispositivo que eecuta secuencialmente rdenes, sin necesidad de un sistema operativo al uso
AKindo+s, >inux, "!:..B a la vez que interact2a con el exterior. ?ecesitara de las taretas de
adquisicin de datos que se pueden a3adir modularmente, y (inalmente, un sistema !C':' para
control y monitorizacin remota. Figura 7.
>emaL V!olucin $obustaV
W Es la opcin m,s robusta y (iable. X?o se colgara en &5 a3osY.
1 El programa del P>C es m,s di(cil de modi(icar o reutilizar.
1 Coste, opcin m,s cara que las anteriores, tanto en )ard+are como en so(t+are.
P"esu!ues&#
29
PXI de N.I. PC + LabView PC + Python Red Arduino Rbpi
LabView 5.800 LabView 5.800 Python 0 Python 0
Controlador 1.700 PC 400 PC 400
Mdulo RS-485 592 Tjta C422 2xRS485 225 Tjta C422 2xRS485 225 Arduino (x2) 50
Mdulo Analgico 1.330 Tjta PCI 9112 analog. 450 Tjta PCI 9112 analog. 450 Raspberry Pi (x4) 200
Chasis 5+1 1.209 Router/Switcher 100
Cables Cables Cables Cables
10.630 6.875 1.075 350
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
T'( "esume+
FiabilidadL comprendera tanto el )ard+are como el so(t+are.
:esarrolloL )ara mencin a las )oras de trabao para instalar todo el sistema. 4ard+are y
so(t+are.
CosteL desembolso total.
%antenibilidadL (acilidad para que otra persona modi(ique el sistema.
C#+%(us-.+
Propondramos una solucin mixta entre la opcin 6 y 7.
Esta consistira en ensayar la solucin con 'rduino y $aspberry Pi en los sensores de temperatura,
la cual se adapta muy bien porque al colocar el conunto pegado al sensor reducimos el ruido.
Paso seguido valoraramos su (uncionamiento. P seg2n sea este, podramos seguir con esta opcin
o cambiar a usar un PC central con las taretas de adquisicin sin muc)o costo a3adido.
30
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
31
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
32
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO /. ESTRUCTURA DE LA INTERFAZ 0R1FICA
I+&"#*u%%-.+
:os ideasL A#B .areas en paralelo par no bloquear la CD0. A&B >a CD0 es un recurso compartido al
que se debe acceder en exclusin mutua.
>a inter(az gr,(ica ACD0B utilizada para la comunicacin con el usuario se eecuta en un modo
llamado conducido por eventos, es decir, que est, durmiendo esperando, por eemplo la pulsacin
con el ratn de un botn, para eecutar el cdigo relacionado con ese evento. Para no bloquear la
CD0, en vez de pasarle el control y esperar el tiempo que tarda en realizar la tarea, la lanzamos en
paralelo. !in embargo, tener un programa con varias tareas corriendo en paralelo, impone, que
tengamos un especial cuidado con recursos compartidos Avariables o CD0B a la )ora de escribir y
leer datos.
Esquem $ '"e2e e,!(-%%-.+ *e sus e(eme+&#s
>a estructura del programa en eecucin quedara re(leada en la (igura #.
Explicacin breve de cada elemento representado.
&ntorno del rograma
El entorno del programa sera el marco donde coexisten tareas con su control de eecucin,
estructuras como la cola F0FE, y las varibles globales accesibles por todas las tareas.
'area rincial
Es el bucle de la inter(az gr,(ica. ' partir de esta, seg2n se demande, se lanzan otras tareas en
33
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
paralelo.
El modo en que trabaa es conducido por eventos. Espera durmiente a que ocurra un evento para
eecutar el cdigo correspondiente. Para no congelar la inter(az, este cdigo se lanza como tareas
en paralelo.
Para actualizar la CD0 programamos una accin peridica que se encargar, de re(rescar las
variables mostradas.
'areas en aralelo
>as tareas en paralelo son trozos de cdigo cuya eecucin se realiza al mismo tiempo y sin parar
la tarea principal. El resultado de su trabao se guarda en una cola F0FE a la que se accede en
exclusin mutuaZ.
Z Exclusin mutua. !e trata de evitar el problema de que al usar un recurso compartido se
produzcan inconsistencias. Por eemplo, si dos tareas intentan escribir una cadena de caracteres
en la salida estandar al mismo tiempo, ambas se entremezclaran perdiendo su sentido.
Cola ()(O en e$clusi!n mutua
Es una estructura que va guardando los resultados del trabao e(ectuado por las tareas en
paralelo. >os datos luego son recogidos peridicamente por la tarea principal y mostrados en la
CD0.
*ariables globales
!on accesibles por tadas las tareas que comparten el mismo entorno. En este caso son variables
booleanas. Carantizamos la consistencia de los datos permitiendo que slo la tarea principal
escriba en ellos, y el resto solo las puede leer.
Estas variables globales tienen como (uncin (inalizar las tareas en paralelo.
+alida ordenada
Dna vez que al programa le llega la orden de (inalizar, este sale del bucle de la CD0 y ordena el
cierre del resto de tareas por medio de las anteriores variables globales. Dna vez que todas la
tareas )an (inalizado se sale completamente del programa borrando de memoria el entonrno del
programa.
Se%ue+%- *e
3u+%-#+m-e+&#
Para explicar como (unciona vamos a
seguir una eecucin del programa.
)nicio
'l iniciar el programa se creara el entorno
del programa. Este contendra la tarea
principal en eecucin, y las variables,
tanto las globales como la pila F0FE.
Figura &.
En este momento inicial solo )abra una
tarea en eecucin. Esta sera la CD0, la
cual, est, )aciendo slo dos cosas. Dna,
34
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
contrario, la CD0 quedara congelada )asta que esta tarea acabase su trabao, y que se encargar,
de leer los datos del sensor y proporcion,rselos a la CD0.
Puesto que podemos tener varias tareas en paralelo, )ay que tener cuidado con los recursos
compartidos, por eemplo la CD0. ?o podemos permitir que tareas independientes la actualicen al
mismo tiempo. Para salvar este problema, )acemos que todas estas tareas escriban los datos que
generan en una cola F0FE a la que se accede en exclusin mutua. Peridicamente, la CD0 los va
tomando para representarlos en pantalla.
+alida ordenada del rograma
Cuando se enva la se3al de cerrar la CD0, es exactamente eso, cerrar la CD0 y no el programa. >o
que ocurre es que se sigue eecutando las instrucciones del programa principal que se encuentran
a continuacin del bucle de la CD0. En este trozo de programa, lo que )acemos es, por medio de
unas variables globales, indicar a las tareas que se eecutan en paralelo que deben (inalizar. Dna
vez )ec)o esto la tarea principal acaba, pero no se sale del programa )asta que el resto de las
tareas )a acabado. Cuando (inalmente todas acaban se borra el entorno del programa con todas
sus estructuras de la memoria.
35
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
36
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO 4. ACCESO A FUNCIONES C DESDE PYT5ON
Explicamos el mdulo ctypes de Pyt)on y varias soluciones a puntos problem,ticos que nos
pueden aparecer.
,ndice
El mdulo ctypes
!oluciones a puntos problem,ticos
Compilacin de una biblioteca con (unciones C de prueba
Funcin C gen*rica
Funcin C que usa punteros como par,metros de entrada y reusados como salida
Funcin C con arrays de C
E( m.*u(# %&$!es
Pyt)on permite m2ltiples (ormas de usar (unciones de C desde su cdigo. ?os vamos a centrar en
el uso del mdulo ctypes para acceder a (unciones de C compiladas en una biblioteca de enlace
din,mico A:>>B u obeto compartido A.soB en Znix.
Ctypes es un mdulo de la biblioteca est,ndar de Pyt)on, es decir que se distribuye al mismo
tiempo que el int*rprete de Pyt)on, y por tanto, est, presente en todas las implementaciones del
lenguae. Ctypes contiene m*todos que envuelven la biblioteca Adll o soB creando un obeto en el
que los atributos se corresponden con las (unciones de C. Permitiendo acceder a estas desde
cdigo interpretado de Pyt)on.
Como eemplo introductorio vamos a usar la (uncin print( de C desde el int*rprete de Pyt)on.
Python 3.3.2
>>>import ctypes
>>>libcpy = ctypes.cdll.LoadLibrary('libc.so.6') #ruta completa
/usr/lib/libc.so.6 (o lib6)
>>>libcpy.print!(b'hola"n') # todas las cadenas en Python 3 son unicode con lo
#ue hay #ue especi!icar una cadena de bytes con el pre!i$o b.
% # n&mero de caracteres. 'alida de la !unci(n.
hola # la cadena esperada. )cci(n de la !unci(n.
S#(u%-#+es !u+&#s !"#'(em6&-%#s
Cuando uno se pone a trabaar con (unciones de C se encuentra que ciertas construcciones son
extra3as, desde el punto de vista de Pyt)on, y que no tienen una solucin inmediata. Para
introducir estos problemas vamos a crear una biblioteca de enlace din,mico con varias (unciones
que eempli(ican cada uno de estos casos y sobre las que probaremos las soluciones.
Creacin de una biblioteca con funciones C de prueba
>as (unciones est,n distribuidas en cada eemplo para (acilitar la explicacin, pero podemos crear
un 2nico (ic)ero con todas ellas y compilarlas con gcc. :igamos que le )emos puesto el nombre de
37
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
simple.c y a partir de este vamos a crear con los siguientes pasos una biblioteca de enlace
din,mico u obeto compartido en >inux.
#B Compilar creando cdigo de posicin independienteL
*cc +,all +!pic +c simple.c
!iendo 1c la opcin para que compile y 1Kall signi(ica que muestre todos los +arnings.
&B Crear la biblioteca o el obeto compartido a partir del (ic)ero obeto simple.o
*cc +shared +o libsimple.so simple.o
'3adir el pre(io MlibM al nombre del (ic)ero de salida indicado con la opcin 1o, de output.
Funcin C genrica
Con la (uncin MsumaM vamos a dar un eemplo de como usar tipos de variables b,sicas, tales como
enteros y apuntadores.
Cdigo de la (uncin C.
Funcin suma de una dll u objeto compartido
// simple.c
// codi*o de la biblioteca de enlace dinamico libsimple.so
// con$unto de !unciones
// suma dos enteros
int suma (int a- int .b) /
return ( a 0 .b)1
2
Creamos el obeto compartido libsimple.so como se )a indicado en el apartado anterior y lo
guardamos en la misma carpeta que el programa de Pyt)on desde donde se va a usar.
Programa Pyt)on que usa la (uncin sumaL
Uso de suma desde Python
# sample.py
import ctypes
# 3reamos ob$eto 34LL #ue en5uel5e libreria de 3
lib'imple = ctypes.cdll.LoadLibrary('./libsimple.so')
# 6uncion suma en Python
suma = lib'imple.suma # suma = atributo del ob$eto- tipo 34LL- lib'imple
suma.ar*types = (ctypes.c7int- ctypes.P89:;<=(ctypes.c7int))
suma.restypes = ctypes.c7int
# Llamada a la !unci(n suma
a = ctypes.c7int(3)
b = ctypes.pointer(ctypes.c7int(6))
print(suma(a-b)) # resultado >
38
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Explicacin del script de Pyt)onL
Creamos el obeto lib!imple que es el que envuelve la biblioteca C. !iendo cada atributo de este
obeto una (uncin de la biblioteca. 's, lib!imple.suma )ace re(erencia a la (uncin MsumaM.
' continuacin, con argtypes y restypes indicamos que tipos de par,metros deben ser pasados a la
(uncin. ?o es estrictamente necesario, pero en caso de no enviarle el par,metro adecuado
intentar, convertirlo al tipo correspondiente o dar, un error dentro de Pyt)on. >a lista de todos
los tipos de ctypes se encuentra en la p,gina o(icial de Pyt)on
A)ttpL//docs.pyt)on.org/6/library/ctypes.)tmlB.
Por 2ltimo, )acemos una llamada a la (uncin suma en el que primero )emos creado
explcitamente los par,metros correspondientes en el tipo adecuado. En caso de enteros, cadenas
y bytes la conversin es autom,tica. Pero no para el resto.
En los punteros distinguimos las dos instrucciones PE0?.E$ y pointer en las que la primera crea
una clase correspondiente a un tipo y la segunda una instancia del tipo correspondiente.
P R ctypes.PE0?.E$AtypeB crea y devuelve un nuevo tipo de puntero de ctypes. [class \.]
p R ctypes.pointerAobB crea una instancia del puntero que apunta al obeto del tipo
PE0?.E$AtypeAobBB
Funcin de C que usa punteros como parmetros de entrada y reusados como
salida
Dna t*cnica, com2nmente usada en C, utiliza punteros en los argumentos tanto para pasar un
valor a la (uncin como para recogerlos es similar al uso de tipos mutables de Pyt)on. En el (ondo,
es el mismo concepto de puntero. !in embargo, )ay que )acerlo explcito en Pyt)on para no
encontrarnos con variables que siendo Mno1mutablesM, como n2meros Aenteros, realesB y cadenas,
de repente, se comportan como MmutablesM. Para austarnos a la (orma de actuar de Pyt)on
crearemos (unciones intermedias que se comportar,n exteriormente como es esperable de una
(uncin de Pyt)on.
Funcin division_entera en C
// di5ision entera
int di5ision7entera (int .4- int d) /
int resto = .4 ? d1
.4 = .4 / d1
return resto1
2
Uso de division_entera desde Python
# 6uncion di5ision entera
7di5ision7entera = lib'imple.di5ision7entera
7di5ision7entera.ar*types = (ctypes.P89:;<=(ctypes.c7int)- ctypes.c7int)
7di5ision7entera.restypes = ctypes.c7int
# 6uncion para usar en Python
de! di5ision7entera(di5isor- di5idendo)@
4 = ctypes.c7int(di5isor) # ctypes.c7int es mutable
resto = 7di5ision7entera(4- di5idendo) # enteros y cadenas son
automAticamente con5ertidos
39
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
# el tipo entero de ctypes tiene el atributo 5alue #ue es un entero python
return (4.5alue- resto)

# Llamada a la !uncion di5ision entera
res = di5ision7entera(B-2)
print('3onciente ='- resC>D- ' =esto ='-resCED) # =esultado@ 3ociente = B =esto=
E
Funcin de C con arrays
')ora vamos a ver como tratar con arrays. En Pyt)on una conversin natural sera una lista o una
tupla, as que vamos a construir otro eemplo en el que )allaremos la media de una serie de
valores guardados en una lista.
'ntes, un resumen de lo b,sico para construir arrays.
)rray%int = ctypes.c7int.% # clase de un array de % enteros
array% = (ctypes.c7int.%)(E-2-3--%) # instancia de un array de % enteros
array% = )rray%int(E-2-3--%) # construye la misma instancia de un array
de % enteros
lista = CE- 2- 3- - %D # de!inimos una lista de Python
array%int = (ctypes.c7int.%)(.lista) # .lista no es un puntero- es la !orma de
pasar la lista elemento a elemento a la !unci(n.
$especto al uso de punteros, en general, ctypes )ace un c)equeo estricto de los tipos. Esto
signi(ica que, si en la lista de argumentos de una (uncin A.argtypesB se tiene AcUintB solo seran
aceptadas instancias de ese tipo. !in embargo, )ay una excepcin a esta regla en el caso de
punteros, estos admiten instancias de arrays compatibles. Por eemplo, PE0?.E$AcUintB admite no
solo enteros sino arrays de enteros. Por otro lado, PE0?.E$AcUintZ8B (ia el tama3o y no admite
arrays de otras dimensiones, aunque si enteros en lo que debera ser un error.
Como en los apartados anteriores se a escrito una (uncin que recoge todo anterior a modo de
modelo. En este caso la (uncin media espera un array de enteros largos y un entero con su
n2mero para )acer la media y devolverla como otro entero largo.
Funcin media en C
// media
lon* int media(lon* int .lista- int n) /
int i1
lon* int total = >1
!or (i=>1 iFn1 i00) /
total 0= listaCiD1
2
return total/n1
2
Dso de la (uncin media desde Pyt)on creando otra (uncin intermedia.
Uso de la funcin media desde Python
# 6uncion media
7media = lib'imple.media
# 'iendo una eGcepci(n- un puntero de un tipo acepta arrays de ese mismo tipo
40
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
7media.ar*types = (ctypes.P89:;<=(ctypes.c7lon*)- ctypes.c7int)
7media.restypes = ctypes.c7lon*
de! media(lista)@
# .lista- no es un puntero- es la !orma de pasar la lista elemento a elem.
return 7media( ((ctypes.c7lon*).len(lista))(.lista)- len(lista) )
res = media(C3-%-E-BD)
print ('Hedia = '-res)
Referencias:
:ocumentacin de ctypes en la p,gina o(icial de Pyt)on.
)ttpL//docs.pyt)on.org/6/library/ctypes.)tml
41
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
42
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO 5. CONTROL DE UN MOTOR PASO A PASO CON
ARDUINO Y MOTOR S5IELD 7"e2/8
&l roblema %ue %uer-amos resolver utili.ando un motor aso a aso era el de llevar
un disositivo, conducido or una sirga dentro de un tubo, a oc/o osiciones de forma
reetitiva. &n este documento e$licaremos el funcionamiento de un motor aso a aso
/-brido, " su control con un 0rduino rev.3 " un motor s/ield rev.3. 1n 2s/ield3 es un
circuito integrado rearado ara conectar directamente al 0rduino.
CONTENIDO
# %otores paso a paso
#.# %otor paso a paso )brido
#.& Circuito $> y par motor
& 'rduino y 'rduino !)ield
&.# Circuito del M%otor !)ieldM
&.& Control del M%otor !)ieldM con el 'rduino
6 Programacin
6.# Fariables y (unciones
6.& Comunicacin y mdulo Pyt)on
6.6 Dna interrupcin reausta la posicin
7 'uste del par
8 "ibliogra(a
1. Esquema y breve explicacin de un motor paso paso
4ay varios tipos de motores paso a paso, estos pueden ser de reluctancia variable, de im,n
permanente, e )bridos. ?os vamos a centrar en este 2ltimo tipo que es que se )a utilizado en
nuestro proyecto. El principio de (uncionamiento es
similar en todos ellos Hver enlace #I. Este se basa en
poder controlar de una (orma di(erenciada la corriente
que pasa por las bobinas, y as, ir creando un campo
magn*tico al que el rotor sigue para alinearse con *l en
su busca de un camino de reluctancia mnima.
1.1 Motor hbrido
El motor )brido consiste en un rotor, (ormado por un
im,n permanente dividido en dos discos, o ruedas, y que
presenta una serie de dientes alternados, (igura #. P en
un est,tor con varios polos bobinados. Este tipo de
motores consiguen una resolucin entre #55 y 755
pasos por vuelta.
Para entender el (uncionamiento vamos a seguir la serie
de pasos presentados en la (igura &. 0niciamos la
secuencia desde el estado en el que la intensidad paso
por las bobinas # y 6 del est,tor, y en el que los dientes
del polo ? del rotor est,n alineados con los dientes del
polo # del est,tor, al igual que los del polo ! del rotor lo
43
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
+
(
+
(
+
(
$
"
%
= +
(
Rotor de un motor &!brido de "> dientes
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
est,n con los del polo 6. En el siguiente paso, la intensidad dea de pasar por las bobinas # y &
activ,ndose a)ora los polos & y 7. El rotor se mueve en el sentido de las aguas del relo )acia
posiciones de menor energa en las que los dientes se alinean creando un circuito magn*tico de
mnima reluctancia. >a cantidad girada en cada paso es de ^ de diente, como el rotor
representado tiene &8 dientes, este )abr, girado #/#55 de vuelta. >os siguientes pasos pueden
seguirse en las (igura & constituyendo una secuencia que se va repitiendo para girar el rotor.
?o es la 2nica (orma de )acer girar el motor. El expuesto en la (igura & correspondera con el
denominado de paso completo. Pero existen otros modos entre los que los m,s comunes son el de
medio paso en el que )ay cuatro pasos extra intercalados y en los que todas las bobinas est,n
activas. P el micro1stepping, en el que las corrientes varan de una (orma continua y no en
escalones todo o nada= Henlace #I.
1.! Circuito R" y par motor
>os dos t*rminos m,s importantes en el par motor, son la intensidad de la corriente y la posicin
relativa del rotor respecto del campo magn*tico. HEnlaces # y &I.
$especto a la intensidad, el par Ao la (uerza si se (ia un radioB es, en base a la >ey de >orentz,
proporcional a la intensidad que recorre las bobinas. El par m,ximo es un dato de dise3o que
aparece en las )oas de caractersticas y que depende de la cantidad de calor que puede disipar
las bobinas al paso de la corriente. Por tanto, )ay que tener cuidado en exceder esa intensidad.
.ambi*n, )ay que tener en cuenta que a este valor m,ximo no se llega instant,neamente, sino que
se )ace de una (orma progresiva ya que es un circuito con una alta inductancia que )ace de
inercia Acircuito $1>B. El comportamiento puede verse en la (igura 6.
El otro (actor es la posicin relativa. >a (uerza va desde el valor 5, cuando est,n per(ectamente
alineados los dientes del rotor con los de los polos de las bobinas, y de all, se va incrementando
)asta un m,ximo cuando )ay un desplazamiento de ^ de diente Aque equivale a que el 85_ de la
super(icie del diente este en(rentadaB, para luego disminuir )asta un mnimo inestable en el que
los dientes est,n alternados. >a (igura 7 representa el par, o la (uerza, en (uncin del
desplazamiento entre el rotor y el est,tor.
'delant,ndonos al punto 7 en el que tratamos el auste del par, vamos a describir como un motor
dara un paso estando bao la accin de un par resistente. !upongamos que este par es de valor la
45
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
mitad al valor m,ximo y que se parte de una posicin a de equilibrio. Entonces avanzamos un paso
activando y desactivando las bobinas correspondientes, la nueva posicin con respecto a la
alineacin de los dientes pasara a ser aM. Como el par del motor es superior al resistente )ace que
el rotor se mueva )acia b, que ser, la siguiente posicin de equilibrio.
Etro par,metro que aparece en las )oas de especi(icaciones es el par de retencin A)olding
torqueB. Este )ace re(erencia al par que muestra el motor a un cambio de posicin cuando ya no
pasa ninguna corriente. Este (enmeno aparece por la imanacin del material (erromagn*tico y es
interesante a la )ora del dise3o porque podemos saber si el rotor va a mantener la posicin una
vez que se corte la intensidad.
2. Arduino y Arduino Motor Shield
En el apartado anterior )emos visto como es por dentro y como (unciona un motor paso a paso.
')ora, nos vamos a centrar en el dispositivo de control que gobierna la intensidad que pasa por
las bobinas.
El dispositivo de control consta de un micro1
controlador, en nuestro caso un 'rduino Dno
rev.6 H(igura 8I, y dos puentes completos
Adouble (ull1bridge driverB que es el
encargado 2ltimo de cortar o dear (luir la
corriente por las bobinas. Para construir
este 2ltimo tendramos tres opciones.
Primera, crearlo desde los componentes
b,sicos. !egunda, usar componentes ya
empaquetados. P tercera, que es la que se
)a utilizado, es un 'rduino !)ield.
Dn 'rduino !)ield H(igura 9I es un placa ya
preparada para conectar al 'rduino que trae
consigo un >&<J que incorpora dos drivers
de puente completo.
46
'igura & (r)uino !no re*&3&
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
!.1 Circuito del #rduino Motor $hield
El esquema del circuito completo, por ser libre, puede descargarse de la p,gina +eb o(icial.
HEnlaces 6 y 7I. El componente principal es un >&<J, dual (ull1bridge driver, que como )emos
dic)o antes se encarga de dirigir el sentido de las corrientes en la bobinas y que explicaremos en
el siguiente apartado. .ambi*n incluye unas peque3as resistencias de 5.#8 o)mnios con sus
correspondientes ampli(icadores operacionales que nos pueden servir para controlar la intensidad
que circula Aexiste la posibilidad de cortocircuitarlasB. >a (igura 9AaB resume lo m,s importante del
esquema.
El M'rduino %otor !)ield r6M tiene sus
lmites, sobre todo en lo concerniente a la
intensidad m,xima que puede tratar. Estos
vienen dado sobre todos por el componente
principal que es el >&<J. Es conveniente
mirar la )oa de caractersticas Henlace 8I
antes de conectar el motor. Pero podemos
tomar el valor de &' como lmite de la zona
segura, para valores m,s altos )ay que tener
en cuenta la alternancia y la duracin de
intensidad m,xima. Por eemplo podemos
tener &.8' durante J5_ de #5ms y el resto,
un &5_, sin circular. $especto al voltae, el
mismo que alimenta la (uente puede usarse
para alimentar el 'rduino Amicro1
controladorB y en ese caso el voltae debera
estar entre 8 y #&F.
' la )ora de conectar el motor, del cual seguramente tendremos las especi(icaciones de par,
voltae, resistencia, inductancia, debemos tener en mente que el voltae de la (uente no es el que
se ve entre las bobinas del motor en (uncionamiento. Esto se debe a que )ay intercalados varios
transistores y una resistencia y provocan una cada de tensin y que depende de la intensidad, por
eemplo podemos encontrarnos una cada de #.;F cuando la intensidad es de #.8'. Podemos
encontrar los valores en las )oas de especi(icaciones del >&<J, y luego a3adir los de las
resistencias del Mmotor !)ieldM.
!.! Control del Motor $hield con el #rduino
' da de )oy, la in(ormacin para controlar un motor paso a paso con un 'rduino y su M%otor
!)ieldM es bastante escasa, por no decir inexistente. P casi toda la que se puede encontrar trata
del control de motores de corriente continua. 0ncluso, todas las re(erencias a relacin entre los
pines del 'rduino y su (uncin en un motor son las correspondientes a las de uno corriente
continua, PK%, "ra-e y :irection. Por tanto, lo que a)ora vamos a ver cmo (unciona el puente
completo y que pines del 'rduino controlan cada (uncin para luego dise3ar el control de un
motor paso a paso.
Funcin ' "
:ireccin 4E2 4E3
PK%/Enable 43 4EE
"ra-e 4I 4J
47
'igura +& (r)uino ,otor Shiel) re*&3
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
!ensor de corriente )> )E
En la (igura ;AaB podemos ver qu* relacin existe entre cada pin del 'rduino y el conductor de
puente completo. P en las (iguras ;AbB y ;AcB, se puede obtener qu* valores deben tener las
puertas para conducir la corriente en un sentido u en otro. Faltara representar el estado en el que
no se permite la circulacin que simplemente es poner la entrada MenableM a cero.
Es importante no olvidar, que en circuitos con altas impedancias no se puede cortar la corriente y
debe proporcionarse siempre un camino. !i no se )iciese, tendramos un voltae muy alto debido a
que FR>Gd0/dtR>Gin(inito. Este camino viene dado por unos diodos que al cerrar los transistores
crearan un circuito de descarga.
.ampoco )emos usado la (uncin bra-e. Este lo que )ace es crear un camino que cierra el circuito
de la bobina. !i alguien est, interesado y mira el esquema del circuito, la puerta ?'?: con una MeM
en el interior es una puerta @?E$ Aexclusive not E$B.
')ora, construimos la siguiente tabla en la que relacionamos cada paso de la secuencia de giro del
motor, (igura 6, con el conunto de valores correspondientes a las entradas del Mmotor s)ieldM.
Enable ' :ir ' Enable " :ir " "obina ' "obina "
Paso 5 # # 5 5 ` @
Paso # 5 # # # @ `
Paso & # 5 5 # a @
Paso 6 5 5 # 5 @ a
!.EP 5 111 5 111 @ @
>a conexin entre el PK% y el enable del >&<J es muy interesante, aunque no se )a usado en este
proyecto, se puede utilizar para controlar el par, aunque )ay que tener en cuenta que no va a ser
lineal por el tipo de crecimiento de la intensidad.
3. P"#9"m%-.+
En este punto explicamos el programa introducido en el y 'rduino que se encarga de ir dando las
se3ales necesarios para ordenar la realizacin de cada paso.
Para generar las se3ales va siguiendo la secuencia de la tabla anterior, en la que si se sigue en una
direccin u otra dar, un sentido de giro u otro.
%.1 &ariables y funciones
FariablesL
absPos!tep posicin absoluta en pasos, entero largo.
+)atstep clase matem,tica del estado del paso del motor, los valores pueden ser 5, #, &, 6.
nsteps numero de pasos a dar, es un entero largo.
sentido sentido del giro
tstep tiempo para cada paso
FuncionesL
step5, step#, step&, step6 (unciones que establecen los valores en los pines de salida
48
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
49
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
correspondientes a cada paso.
.urnAB realiza el numero de pasos dado por nsteps llamando a las (unciones steps. El
primer paso dado es el siguiente correspondiente al 2ltimo estado en la secuencia dada por el
sentido de giro. Dn retraso en microsegundo se intercala entre cada llamada, el tiempo entre cada
llamada es el mismo.
!topAB para el motor.
!.! Comunicacin con el #rduino.
:esde la consola del 0:E de 'rduino, o desde un programa Pyt)on usando Py!erial.
>as instrucciones que entiende el programa son cadenas '!C00 compuestas de car,cter de inicio,
6 caracteres de la instruccin, seguidas de una M,M cuando )ay que enviar un par,metro, el valor
del par,metro, y el car,cter de (inalizacin del mensae.
!et ?umber o( steps to turn L sns
eemploL b5&sns,J55b56
%.% 'na interrupcin rea(usta la posicin
Es probable que durante el (uncionamiento aparezcan errores de posicin como consecuencia del
deslizamiento entre la polea movida por el motor y la sirga. Para disminuir en lo posible este error,
lo que )acemos es que cada vez que inicie la serie de oc)o posiciones el sistema se mueva en una
direccin buscando un punto MceroM que produce el lanzamiento de una interrupcin del micro1
controlador. >a (uncin asociada a esta, detiene el motor y pone a cero la variable que almacena la
posicin absoluta de la sirga, reaustando as, la posicin supuesta con la posicin real.
4ines del 0rduino " circuito
En el 'rduino, son los pines & y 6, los correspondientes a la captura de los eventos que lanzan la
interrupciones 5 y # respectivamente. En la (igura J puede verse el circuito para para detectar el
cierre de un pulsador. ?otar que mientras el interruptor est, abierto el pin & est, a voltae 5, si no
50
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
(uese as, y no lo conect,semos a tierra, el valor del pin & quedara indeterminado con lo que la
interrupcin podra lanzarse en cualquier momento.
.ambi*n colocamos un resistencia para no conectar directamente la salida de 8F con tierra.
4rogramaci!n de la interruci!n
Con la instruccin attac)0nterruptAinterrupt, (unction, modeB enlazamos la interrupcin 5 Apin&B
# Apin6B con la (uncin X(unctionY que se lanzar, cuando se produzca un cambio de estado en el
que el pin pase de nivel bao a alto AmodeR$0!EB. .ambi*n se encarga de des)abilitar las
intererrupciones para que estas no se aniden y luego volverlas a )abilitar.
>as variables usadas y que sean compartidas en el programa principal deben ser cali(icadas como
volatiles.
>as lneas que a3adiramos al programa seran las siguientesL
// Kariables Llobales
5olatile lon* absPos'tep = >1 // absolute position in steps
5olatile unsi*ned lon* nsteps = >1 // number o! steps to turn
// 9nterrupcion
5oid Mero7position() /
absPos'tep = >1
nsteps = >1
2
'unque una comparacin al inicio del procedimiento que eecuta cada paso podra ser su(iciente,
sobre todo pensando en que el movimiento no es continuo sino que se va pasando de un paso a
otro paso, utilizamos una interrupcin para evitar perder el cambio de valor en momentos
intermedios, con lo que podramos pasarnos el punto de MceroM.
4. A:us&e *e( !"
Con lo visto en el apartado #.&. en el que se explica como se genera el par. Este podemos austarlo
usando una resistencia para (iar la intensidad o usar una modulacin por pulso APK%B en la que
vamos cortando la intensidad a intervalos cortos para tener un valor entre el m,ximo y el mnimo.
>a idea del auste es conseguir un movimiento suave combinando par y tiempo entre pasos. :e
(orma que activemos el siguiente paso cuando el rotor llegue a la posicin del paso actual, y no
antes porque si no dearemos atr,s el movimiento real y no se mover,, ni tampoco muc)o despu*s
porque el movimiento podra ser una oscilacin subamortiguada si el par es muy alto con lo que se
producira una (uerte vibracin. >a cual es (,cilmente detectable por el ruido y traqueteo del
motor. Entre estas dos situaciones queda un margen en el que el motor girar, correctamente e
incluso ser, capaz de absorber cambios en la magnitud de la (uerza que tiene que vencer.
'mbos (actores nos pueden servir para saber si el auste es correcto o incluso para realizar este
auste.
;. <-'(-#9"3= $ e+(%es
Henlace #I ?ociones b,sicas del motores paso a paso.
)ttpL//+++.solarbotics.net/library/pd(lib/pd(/motorbas.pd(
Henlace &I Circuitos de control de motores paso a paso.
)ttpL//+++.solarbotics.net/library/pd(lib/pd(/drive.pd(
Henlace 6I P,gina o(icial del 'rduino.
51
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
)ttpL//+++.arduino.cc/
Henlace 7I P,gina del 'rduino %otor !)ield $ev.6. 'puntar que en el esquema las puertas ?'?:
marcadas con una e son puertas @?E$.
)ttpL//arduino.cc/en/%ain/'rduino%otor!)ield$6
Henlace 8I 4oa de especi(icaciones del dual (ull1bridge driver >&<J.
)ttpL//+++.st.com/+eb/catalog/senseUpo+er/F%#7&/C>J8#/!C#;<5/!!#888/PF96#7;
52
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
53
'igura -& #s.ue/a )el (r)uino ,otor Shiel re*3
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
54
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ANEXO >. PRO0RAMAS
Introduccin
En los siguientes apartados, que se )an estructurado por conuntos de )ard+are, recogemos y
explicamos los puntos m,s importantes de los programas realizados para el proyecto.
Por indicar un conunto que puede tomarse como base o plantilla tomara el de digitalizacin de la
se3al analgica. Por ser este el m,s simple, pero a la vez el m,s completo al reunir todos los tipos
de programas que pueden aparecer.
cndice de conuntos y programas
Conjunto +5agelo6 " 'emeratura7 8igitali.aci!n de una se9al anal!gica. 57
!-etc) 'rduino :igitalizacin 8<
'nalog'rduino!erver 9&
!oc-etClient 99
'nalog%odule 9;
'nalogCui 9J
Conjunto :otor aso a aso 75
!-etc) 'rduino motor ;9
%otor'rduino!erver ;<
!oc-etClient J6
%otor!)ield%odule J7
%otorCui J9
Conjunto ;ron6/orst 93
"ron-)orst!erver <7
!oc-etClient <J
"ron-)ors%odule <<
"ron-)orstCui #5&
Conjunto :a$i<auge 105
%axiCauge!erver #59
!oc-etClient ##5
%axiCauge%odule ###
%axiCaugeCui ##6
Conjunto +ellman 117
!pellman%odule ##J
!pellmaCui #&6
55
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto C0&= 129
Caen%odule #65
CaenCui #67
56
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto Swagelok y Temperatura:
Digitalizacin de una seal analgica.
'mbos conuntos, el del transductor de presin !+agelo- y
el de temperatura, son similares ya que su misin es tomar
una se3al analgica, discretizarla y permitir su
visualizacin desde la inter(az gr,(ica. Figura #.
>os programas que la constituyen son los mismos y solo
son necesarios algunos cambios en las opciones de estos
programas. Por eemplo la seleccin de la (uncin de
discretizacin y de direccin en la red, 0P y puerto.
En los siguientes puntos desgranamos la estructura y
explicamos los detalles m,s importantes de cada
programa.
+6etc/ 0rduino 8igitali.aci!n. Programa corriendo en
el 'rduino que se encarga de digitalizar la se3al y enviar
la respuesta cuando es requerida desde la inter(az gr,(ica. >a digitalizacin cuesta 5.&8ms con #5
bits de resolucin. P la (orma en que se realiza la comunicacin serie est, recogida en la seccin
correspondiente de la memoria siendo. En caso de no entender la instruccin, por ser errnea o
(allo en la comunicacin, simplemente devuelve el mensae que le )a llegado sin )acer nada.
0nalog0rduino+erver. Programa en Pyt)on que se est, eecutando en el $aspberry Pi, aunque
tambi*n lo podra )acer en cualquier PC, y que )ace de puente entre el puerto serie y la red
Et)ernet.
Entre las caractersticas que posee, es el uso de excepciones para mantener el servidor en
(uncionamiento en cualquier caso. Como eemplo, el cable serie podra desconectarse y
simplemente avisara a la vez que intenta volverse a conectar cada 8s
Fariables que deben austarse,seg2n sea el caso, son el puerto del dispositivo serie y el puerto en
el que el soc-et servidor est, a la escuc)a.
+oc6etClient. Es un mdulo Pyt)on, com2n a todas las inter(az gr,(icas, que resume la mec,nica
de comunicacin por soc-ets en una (uncin para ser utilizada desde cualquier programa Pyt)on
que llame al mdulo. .ambi*n usa excepciones para, en cualquier caso, cerrar correctamente la
conexin.
>a 0P y el puerto al que se conecta pueden ser especi(icadas en los par,metros de la (uncin o en
variables globales que se usan como valores por de(ecto. Estos tambi*n pueden ser modi(icados
desde el programa que carga al mdulo.
0nalog:odule. Este es el mdulo en el que se encuentran las instrucciones de operacin con el
programa de digitalizacin del 'rduino. En este caso, solo )ay una, sensorAiB, que )ace una
peticin de una medicin de la se3al en la entrada i devolviendo un valor entero, o una cadena de
texto in(ormativa del tipo de error.
Puede usarse la instruccin )elpA'nalog%oduleB para obtener la ayuda que consta de la
explicacin de cada comando, como de los par,metros de entrada y salida que intervienen.
Dsa el mdulo !oc-etClient anterior para realizar la conexin y el intercambio de mensaes.
57
Figura 1. Interfaz grfica analogGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
0nalog<ui. Es la inter(az gr,(ica. Es completamente intuitiva y las variables para austar 0P,
puertos, tiempos... se encuentran al inicio del programa con su explicacin. Dsa el mdulo
anterior para obtener los datos.
58
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Sketch Arduino Digitalizacin
const char ';N='">2'1 // ';N = ">2
const char <;N='">3'1 // <;N = ">3
const char '<P='-'1 // 'eparador
const int str7len=2%1 // maG len*th messa*e strin*s
char charin1
char entradaCstr7lenD1
int indeG = >1
int 5alor1 // operations inte*er 5ar
// 6unctions / 6unciones
5oid clear7bu!!er()
/
Ohile ('erial.read() >= >)1
2
// 'etup
5oid setup()
/
'erial.be*in(I6>>)1
2
// Pro*ram loop
5oid loop()
/
indeG = >1
entradaCindeGD = '">'1
// *et command !rom serial
do
/
Ohile ('erial.a5ailable() == >) /delay(E>)12
charin = 'erial.read()1 // *et a character
sOitch (charin)
/
case <;N@
breaP1
case ';N@
indeG = >1
entradaCindeGD = '">'1
breaP1
case '<P@ // !uture
breaP1
de!ault@
//strcat(entrada-charin)1
entradaCindeGD= charin1
indeG001
59
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
entradaCindeGD= '">'1
i! (indeG > 6)/indeG=612 // B chars 0 null- no sobrepasar lon*itud maGima
2
2 Ohile( (charin Q= <;N) RR ('erial.a5ailable() > >) )1

'erial.print(';N)1 // <3S8 command
'erial.print(entrada)1 //

sOitch (entradaC>D)
/
case 'r'@ // it's a re#uest / es una peticion
sOitch (entradaCED)
/
case 's'@ // it's a sensor / es un sensor
sOitch (entradaC2D) // !orma de ase*urarnos #ue estamos dentro de los
limites
/
case 'E'@
'erial.print(T-T)1
'erial.print(analo*=ead(>))1
breaP1
case '2'@
'erial.print(T-T)1
'erial.print(analo*=ead(E))1
breaP1
case '3'@
'erial.print(T-T)1
'erial.print(analo*=ead(2))1
breaP1
case ''@
'erial.print(T-T)1
'erial.print(analo*=ead(3))1
breaP1
case '%'@
'erial.print(T-T)1
'erial.print(analo*=ead())1
breaP1
case '6'@
'erial.print(T-T)1
'erial.print(analo*=ead(%))1
breaP1
2
breaP1
case 'c'@ // clear
sOitch (entradaC2D)
/
case '!'@
clear7bu!!er()1 // clear input bu!!er
breaP1
2
breaP1
2
60
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
breaP1
2
// return
'erial.print(<;N)1 // end messa*e
'erial.!lush()1 // Oait send output bu!!er
2
61
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Analog Arduino Server
# analo*)rduino'er5er
# Python 3
# Pro*rama puente
# )cepta una coneGion a tra5es de un socPet ;3P/9P #ue hace de puente
# con un puerto serie
import socPet
import serial
import time
import threadin*
# +++3onstantes+++
';N = b'"G>2'
<;N = b'"G>3'
# +++Kariables+++
acti5idad = /2 # 4iccionario con el estado
acti5idadC'run'D = ;rue # 'i 6alse => salir del pro*rama
acti5idadC'serial'D = 6alse # <stado del puerto serie
contador = >
socPetSost = ''
socPetPort = %>>>>
socPetLenerator = :one
serialPort = '/de5/tty)3H>'
ob$ect'erial = :one
serial;ime8ut = 2 # se*undos1 tiempo maGimo de espera
serial;ime8p = >.>>E # se*undos1 tiempo estimado de operacion
# +++3lases+++
class Hessa*e()@
'''3lase Hensa$e'''
de! 77init77(sel!- byte'trin* = b''- n=>)@
sel!.bytes9n = byte'trin*
sel!.bytes8ut = b''
sel!.time = time.time()
sel!.contador = n

de! Orite(sel!- ob$ect'erial)@
ob$ect'erial.Orite(sel!.bytes9n)

de! read(sel!- ob$ect'erial)@
sel!.bytes8ut = b''
time> = time.time()
Ohile ;rue@
62
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
data = ob$ect'erial.read()
sel!.bytes8ut 0= data
i! data == ';N@ sel!.bytes8ut = ';N
i! (data == <;N) and (ob$ect'erial.in,aitin*() == >)@ breaP
i! time.time() > time>0serial;ime8ut0serial;ime8p@
raise serial.'erial;imeout<Gception

de! serie(sel!- ob$ect'erial)@
print('<n5iando y recibiendo por serie') #
try@
n=bytes('?>3d' ? (sel!.contador)- encodin*='ascii')
sel!.bytes9n = sel!.bytes9nC@D0n0sel!.bytes9nC@D
sel!.Orite(ob$ect'erial)
sel!.read(ob$ect'erial)
i! sel!.bytes9nC@BD == sel!.bytes8utC@BD@
sel!.bytes8ut = sel!.bytes8utC@D0sel!.bytes8utCB@D
else@
time.sleep(E)
sel!.read(ob$ect'erial)
i! sel!.bytes9nC@BD == sel!.bytes8utC@BD@
sel!.bytes8ut =
sel!.bytes8utC@D0sel!.bytes8utCB@D
else@
sel!.bytes8ut = ';N 0 b'error' 0 <;N
eGcept serial.'erial;imeout<Gception@
print(messa*e.bytes9n) #
print(messa*e.bytes8ut) #
print(''erial;imeout<Gception')
pass
eGcept serial.'erial<Gception@
print('3oneGion serie caida')
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
eGcept <Gception as G@
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
print('8tro tipo de eGcepcion"n'erial doOn"n'- G)
else@
return
sel!.bytes9n = ';N 0 b'error' 0 <;N

# +++6unciones+++
# '<=9<
de! serial7up()@
63
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
''';hread that maPe an ob$ect serial instance
Silo para establecer la coneGion serie
3rea una instancia de un ob$eto serial (LL8U)L ob$ect'erial).
<l ob$eto esta conectado al puerto proporcionado por serialPort'''
*lobal ob$ect'erial- serialPort
Ohile not acti5idadC'serial'D and acti5idadC'run'D@
try@
ob$ect'erial = serial.'erial(
serialPort-
baudrate=I6>>-
timeout=E-
Orite;imeout=E)
eGcept serial.serialutil.'erial<Gception@
print('<Gcepcion@"n'-
'a) <l dispositi5o no se encuentra en el puerto indicado."n'-
'b) o no estA conectado."n> =eintentando en % se*undos')
# en5iar un mensa$e al a*ente #ue se ha conectado
time.sleep(%)
else@
time.sleep(3)# ;iempo de acti5acion
print('3oneGion serie up')
acti5idadC'serial'D = ;rue
# '83V<;
de! socPet7up()@
*lobal *en'ocPet
try@
*en'ocPet = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
eGcept 8'<rror@
print('<Gcepcion al crear una instancia del tipo socPet')
print('+++ 3errando +++')
try@
*en'ocPet.bind((socPetSost- socPetPort))
*en'ocPet.listen(%)
print(''ocPet up.')
print(' 'ocPet host@'-socPet.*ethostname())
print(' 'ocPet port@'-socPetPort)
eGcept 8'<rror@
print('<Gcepcion al crear el socPet receptor de peticiones de
coneGion'-
'puede ser debido a #ue el puerto o la direccion 9P'-
socPetPort-
'estan siendo usados por otra aplicaci(n')
print('+++ 3errando +++')
*en'ocPet.close()
acti5idadC'run'D = 6alse
# +++++ 9:9398 P=8L=)H) +++++
print('+++ iniciando +++')
64
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
threadin*.;hread(tar*et=serial7up).start() # ;hread
socPet7up()
Ohile acti5idadC'run'D@ # Uucle
try@
# 3rea un socPet cliente tras una peticion de coneGion
print(',aitin* nue5a coneGion ;3P/9P...')
coneGion=ed- address = *en'ocPet.accept()
coneGion=ed.settimeout(2)
print('3oneGion con'- address)
# recepcion del mensa$e
data = b''
Ohile not <;N in data@ # reconstruye el mensa$e
troMo = coneGion=ed.rec5(E>2)
i! not troMo@ breaP
data 0= troMo
messa*e = Hessa*e(data- contador)
contador = (contador 0 E) ? E>>>
i! acti5idadC'serial'D@ messa*e.serie(ob$ect'erial)
else@ messa*e.bytes8ut = ';N 0 b'error-serial7doOn' 0 <;N
coneGion=ed.sendall(messa*e.bytes8ut)
eGcept socPet.timeout@
pass
eGcept <Gception@
pass
!inally@
coneGion=ed.close()
65
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
SocketClient
# socPet3lient
# Hodulo para la comunicacion como cliente por socPet
# especi!ico para el )rduino'er5er.py
# 3aracteristicas@
# Propa*a eGcepciones
# 3ierra siempre el socPet
import socPet
import time
de! send7rec5(messa*e- ip='localhost'- port=%>>>J- t8p=>- t8ut=E)@
'''
<n5ia un mensa$e y espera su respuesta.
'intaGis@
send7rec5(messa*e- ip- port- t7operacion- t7out)
Parametros pasados a la !uncion@
messa*e = cadena Wnicode o )'399
ip = cadena de teGto de la direccion 9P del ser5idor
port = entero del puerto de escucha del ser5idor
t7operacion = tiempo de estimado
t7out = tiempo de en5io
t7operacion 0 t7out 0 t7out = t7maG
=espuesta@
cadena Wnicode.
'''
try@
so = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
so.settimeout(t8ut)
so.connect((ip-port))
#print(so.*etpeername())
#print(so.*etsocPname())
so.sendall(bytes(messa*e- encodin*='ascii'))
so.shutdoOn(socPet.'SW;7,=)
so.settimeout(t8ut0t8p)
resp = b''
Ohile ;rue@
troMo = so.rec5(E>2)
i! not troMo@ breaP
resp 0= troMo
!inally@
so.close()
return str(resp- encodin*='ascii')
66
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

AnalogModule
# analo*icHodule.py
# Python 3
# Hodulo con las instrucciones del )rduino con5ersor de la seXal analo*ica a
# di*ital

import sys
import socPet3lient as sc
# 4ireccion y puerto donde se encuentra el ser5idor
ser5erSost = 'localhost' # e$emplos@ 'localhost'- 'EI2.E6J.2.3'
ser5erPort = %>>>>
';N = '"G>2' # 'tart o! ;eGt character
<;N = '"G>3' # <nd o! ;eGt character
# 'intaGis del protocolo
# ';N 0 3ommand 0 '-' 0 )r*umentos 0 <;N
# 6unciones basicas
de! sensor(i = E)@
'''=e#uest sensor i 5alue.
i must be E to 6.
Pide la medici(n del sensor i
i debe ser un 5alor de E a 6 (5alor entero o caracter)
La orden de5uel5e un entero entre > y E>23-
o una cadena de error
'''
cmd = 'rs' 0 str(i) 0 '7'
ar* = :one
messa*e = ';N 0 cmdC@3D 0 <;N
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort -t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
ans = ans.strip(';N0<;N0'-').split('-')
i! cmdC@3D == ansC>D@
resp = int(ansCED)
i! >F=respFE>2@ return resp # correcto
eli! 'error' == ansC>D@
return ansCED # mensa$e asociado al error
else@
return 'corrupcion del mensa$e'
eGcept <Gception@
return 'corrupcion del mensa$e'
67
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
AnalogGui
# analo*Lui
# Python 3
# 9nter!aM *ra!ica
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import analo*Hodule as ana
# 38:';):;<' LL8U)L<'
# LocaliMacion del ser5idor 5olcadas en el modulo analo*icHodule
ana.ser5erSost = 'localhost' # 'localhost' o 'EI2.E6J.2.E3'
ana.ser5erPort = %>>>>
t7inter5alo = E # inter5alo entre peticiones (en se*undos)
# K)=9)UL<'
# Kariables *lobales
buttons = /2 # diccionario de ob$etos *ra!icos1 campos a actualiMar.
labels = /2 # diccionario de ob$etos *ra!icos1 campos a actualiMar.
checPbuttons = /2
checPs = /2 # 5ariables del entorno de 5entanas
checPKalues = /2 # 5alores de las 5ariables anteriores
interpols = /2 # con$unto de !unciones de interpolacion a aplicar
acti5idad = /'play'@;rue- 'record'@6alse2 # bit- si 6alse => close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso en eGclusion.
# 5alores iniciales
checPKaluesC'sensor7E'D = >
checPKaluesC'sensor72'D = >
checPKaluesC'sensor73'D = >
checPKaluesC'sensor7'D = >
checPKaluesC'sensor7%'D = >
checPKaluesC'sensor76'D = >
# 6unciones matematicas
de! interpol(G)@
'''4e5uel5e un 5alor entero'''
G>=>
y>=>
GE=E>23
yE=E>23
m = (yE+y>)/(GE+G>)
G = int(G)
return m.(G+G>) 0 y>
de! interpol7LH3%(G)@
'''4e5uel5e un numero
68
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
;C3D = > 0 >.>E;CKD'''
G>=>
y>=>
GE=E>23
yE=%>> # %>>3
m = (yE+y>)/(GE+G>)
G = m.(G+G>) 0 y>
return '?0.E63' ? (G)
interpolsC'sensor7E'D = interpol7LH3%
interpolsC'sensor72'D = interpol
interpolsC'sensor73'D = interpol
interpolsC'sensor7'D = interpol
interpolsC'sensor7%'D = interpol
interpolsC'sensor76'D = interpol
# 6unciones
de! repeater(t7re!resco=2>>)@
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
labelsCdataC>DD.con!i*(teGt=dataCED)
Oinroot.a!ter(t7re!resco- repeater) # llamada periodica ms
de! clean7labels()@
time.sleep(E)
!or Pey in checPs@
i! not checPKaluesCPeyD@ data#ueue.put((Pey- '+++++'))
de! checPer()@
''')ctualiMa la 5arible *lobal checPs
con los 5alores de las 5ariables del entorno *ra!ico'''
!or Pey in checPs@
checPKaluesCPeyD = checPsCPeyD.*et()
threadin*.;hread(tar*et=clean7labels).start()

de! record()@
# :o implementado. 'e*uir el e$emplo HaGiLau*e
threadin*.;hread(tar*et=record7thread).start()
de! record7thread()@
!ichero = open('temperature7data.tGt'- 'a')
!ichero.Orite('+++++ 9nicio de sesion +++++"n')
Ohile acti5idadC'record'D@
pass
!ichero.close()
69
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
de! play()@
# lanMador del hilo play7thread
threadin*.;hread(tar*et=play7thread).start()
de! play7thread()@
t = time.time()
Ohile acti5idadC'play'D@
t> = t
!or Pey in checPKalues@
i! checPKaluesCPeyD@
try@
resp = ana.sensor(int(PeyC+ED))
i! type(resp) == int@
resp = interpolsCPeyD(resp)
eGcept <Gception@
resp = 'error'
data#ueue.put((Pey- resp))
try@
t = t 0 t7inter5alo
time.sleep(t + time.time())
eGcept <Gception@ # el tiempo era ne*ati5o- no espera.
resp = 'sobrepasamiento'
i! t> == t@
t = t 0 t7inter5alo
try@
time.sleep(t + time.time())
eGcept@
pass
# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
70
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
toolmenu = tP.Henu(menubar)
toolmenu.add7command(label='9nit'- command=notdone- underline=>)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
de! maPechecP(Oin- checPbuttons=checPbuttons- labels=labels)@
'''3onstruye los checPbuttons'''
!rame = tP.6rame(Oin)
!rame.pacP()
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor E
checPsC'sensor7E'D = tP.9ntKar()
checP7E = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor E@'- 5ariable=checPsC'sensor7E'D- Oidth=E>)
checP7E.pacP(side='le!t')
checPbuttonsC'checP7E'D = checP7E
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor E
sensor7E = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor7E.pacP(side='ri*ht')
labelsC'sensor7E'D = sensor7E
!rame = tP.6rame(Oin)
!rame.pacP()
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor 2
checPsC'sensor72'D = tP.9ntKar()
checP72 = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor 2@'- 5ariable=checPsC'sensor72'D- Oidth=E>)
checP72.pacP(side='le!t')
checPbuttonsC'checP72'D = checP72
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor 2
sensor72 = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor72.pacP(side='ri*ht')
labelsC'sensor72'D = sensor72

!rame = tP.6rame(Oin)
!rame.pacP()
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor 3
checPsC'sensor73'D = tP.9ntKar()
checP73 = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor 3@'- 5ariable=checPsC'sensor73'D- Oidth=E>)
checP73.pacP(side='le!t')
checPbuttonsC'checP73'D = checP73
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor 3
sensor73 = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor73.pacP(side='ri*ht')
labelsC'sensor73'D = sensor73
!rame = tP.6rame(Oin)
!rame.pacP()
71
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor
checPsC'sensor7'D = tP.9ntKar()
checP7 = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor @'- 5ariable=checPsC'sensor7'D- Oidth=E>)
checP7.pacP(side='le!t')
checPbuttonsC'checP7'D = checP7
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor
sensor7 = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor7.pacP(side='ri*ht')
labelsC'sensor7'D = sensor7
!rame = tP.6rame(Oin)
!rame.pacP()
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor %
checPsC'sensor7%'D = tP.9ntKar()
checP7% = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor %@'- 5ariable=checPsC'sensor7%'D- Oidth=E>)
checP7%.pacP(side='le!t')
checPbuttonsC'checP7%'D = checP7%
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor %
sensor7% = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor7%.pacP(side='ri*ht')
labelsC'sensor7%'D = sensor7%
!rame = tP.6rame(Oin)
!rame.pacP()
# 3reacion ob$eto *ra!ico@ 3hecPbutton del sensor 6
checPsC'sensor76'D = tP.9ntKar()
checP76 = tP.3hecPbutton(!rame- command=checPer-
teGt=' 'ensor 6@'- 5ariable=checPsC'sensor76'D- Oidth=E>)
checP76.pacP(side='le!t')
checPbuttonsC'checP76'D = checP76
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor 6
sensor76 = tP.Label(!rame- teGt=' ++++++ '- Oidth=J)
sensor76.pacP(side='ri*ht')
labelsC'sensor76'D = sensor76
de! maPetable(Oin)@
marco = tP.6rame(Oin)
marco.pacP()
# cabecera
titulo7status = tP.Label(marco- teGt='st'- relie!='!lat'-
Oidth=3- b*='bei*e')
titulo7sensor = tP.Label(marco- teGt='sensor'- relie!='!lat'-
Oidth=I- b*='bei*e')
titulo7data = tP.Label(marco- teGt='data'- relie!='!lat'-
Oidth=E3- b*='bei*e')
titulo7status.pacP(side='le!t')
titulo7sensor.pacP(side='le!t')
72
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
titulo7data.pacP(side='le!t')
# tabla
tabla = C(titulo7status- titulo7sensor- titulo7data)D
!or i in ran*e(E-60E)@
marco = tP.6rame(Oin)
marco.pacP()
status = tP.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3)
sensor = tP.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I)
data = tP.Label(marco- teGt='++++'- relie!='sunPen'- Oidth=E3)
status.pacP(side='le!t')
sensor.pacP(side='le!t')
data.pacP(side='le!t')
tabla.append((status- sensor- data))
return tabla
# 9:9398 P=8L=)H)
i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title(';emperatura')
Oinroot.a!ter(%>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
checPbuttons = maPechecP(Oinroot)
play()
# lanMamiento del sistema de e5entos
Oinroot.mainloop()
# cierre de hilos
print('cerrando')
acti5idadC'play'D=6alse
acti5idadC'record'D=6alse
73
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
74
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto motor paso a paso
>a estructura de los programas es similar al caso
anterior. Cambiando la inter(az gr,(ica, el mdulo de
instrucciones Amotor%oduleB, y algunos cambios
mnimos en el motor'rduino!erver respecto al
analog'rduino!erver.
+6etc/ 0rduino motor. Programa que corre en el
'rduino, que genera la secuencia de se3ales que el
%otor !)ield utiliza para cerrar o dear pasar la
corriente en un sentido u otro. 4ay una explicacin
m,s extensa en el anexo 8.
motor0rduino+erver. Programa que )ace de puente
entre la red Et)ernet y el dispositivo serie, en este
caso el 'rduino.
+oc6etClient. El mismo mdulo que en el caso
anterior, es un mdulo que se encarga de )acer las
conexiones .CP/0P de la inter(az gr,(ica al servidor
Amotor'rduino!erverB.
motor+/ield:odule. 0nstrucciones para operar con
el motor. >a m,s importante es turnAinteger, booleanB
por la que se ordena al motor a girar el n2mero de pasos indicados por el n2mero entero en una
direccin u otra seg2n el booleano.
Etras instrucciones son setUstepUdurationAmicrosegundosB, getUabsUposAB.
Con )elpAmotor!)ield%oduleB se puede obtener m,s in(ormacin en el int*rprete de Pyt)on.
:otor<ui. 0nter(az gr,(ica donde seleccionamos la siguiente posicin. Figura &.
75
Figura 2. Interfaz grfica motorGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Sketch Arduino motor
/. 'tepper Hotor- )rduino uno motor shield =3 ./
// 9nclude 'tepper Library
#include F'tepper.h>
// Hap pins to constants
const int pOm)=31
const int pOmU=EE1
const int braPe)=I1
const int braPeU=J1
const int dir)=E21
const int dirU=E31
// steps !or a re5olution
const int ';<P'=2>>1
const int periodo=2>1
// 9nitialiMe the stepper class
//'tepper my'tepper(';<P'-pOm)-pOmU-dir)-dirU)1
5oid stepE()/
di*ital,rite(pOm)-S9LS)1
di*ital,rite(pOmU-L8,)1
di*ital,rite(dir)-S9LS)1
di*ital,rite(dirU-L8,)1
2
5oid step2()/
di*ital,rite(pOm)-L8,)1
di*ital,rite(pOmU-S9LS)1
di*ital,rite(dir)-S9LS)1
di*ital,rite(dirU-S9LS)1
2
5oid step3()/
di*ital,rite(pOm)-S9LS)1
di*ital,rite(pOmU-L8,)1
di*ital,rite(dir)-L8,)1
di*ital,rite(dirU-L8,)1
2
5oid step()/
di*ital,rite(pOm)-L8,)1
di*ital,rite(pOmU-S9LS)1
di*ital,rite(dir)-L8,)1
di*ital,rite(dirU-L8,)1
2
5oid stop()/
di*ital,rite(pOm)-L8,)1
di*ital,rite(pOmU-L8,)1
2
5oid setup() /
76
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
//=PH o! the motor
// my'tepper.set'peed(E)1
// <nable
pinHode(pOm)- 8W;PW;)1
di*ital,rite(pOm)- L8,)1
pinHode(pOmU- 8W;PW;)1
di*ital,rite(pOmU- L8,)1
pinHode(dir)- 8W;PW;)1
di*ital,rite(dir)- L8,)1
pinHode(dirU- 8W;PW;)1
di*ital,rite(dirU- L8,)1

pinHode(braPe)- 8W;PW;)1
di*ital,rite(braPe)- L8,)1
pinHode(braPeU- 8W;PW;)1
di*ital,rite(braPeU- L8,)1
2
5oid loop() /
// delay(2>>>)1
// di*ital,rite(pOm)-S9LS)1
// di*ital,rite(pOmU-L8,)1
// di*ital,rite(dir)-L8,)1
// di*ital,rite(dirU-L8,)1
// delay(2>>>)1
// di*ital,rite(pOm)-L8,)1
// di*ital,rite(pOmU-S9LS)1
// di*ital,rite(dir)-L8,)1
// di*ital,rite(dirU-L8,)1
delay(>>>>)1
stepE()1
delay(periodo)1
step2()1
delay(periodo)1
step3()1
delay(periodo)1
step()1
delay(periodo)1
stop()1
//di*ital,rite(pOm)- L8,)1
//delay(E>>>)1
//di*ital,rite(pOm)- S9LS)1
//delay(E>>>)1
//my'tepper.step(';<P')1
// di*ital,rite(pOm)- S9LS)1
// di*ital,rite(pOmU- S9LS)1
// di*ital,rite(dir)- S9LS)1
// di*ital,rite(dirU- S9LS)1
// delay(E>>>)1
// di*ital,rite(pOm)- L8,)1
// di*ital,rite(pOmU- L8,)1
77
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
// di*ital,rite(dir)- L8,)1
// di*ital,rite(dirU- L8,)1
// delay(E>>>)1
// //my'tepper.step(+';<P')1
// di*ital,rite(pOm)- S9LS)1
// di*ital,rite(pOmU- S9LS)1
// di*ital,rite(dir)- S9LS)1
// di*ital,rite(dirU- S9LS)1
// delay(E>>>)1
// di*ital,rite(pOm)- L8,)1
// di*ital,rite(pOmU- L8,)1
// di*ital,rite(dir)- L8,)1
// di*ital,rite(dirU- L8,)1
// delay(E>>>)1
2
78
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
motorArduinoServer
# motor)rduino'er5er
# Python 3
# Pro*rama puente
# )cepta una coneGion a tra5es de un socPet ;3P/9P #ue hace de puente
# con un puerto serie
import socPet
import serial
import time
import threadin*
# +++3onstantes+++
';N = b'"G>2'
<;N = b'"G>3'
# +++Kariables+++
acti5idad = /2 # 4iccionario con el estado
acti5idadC'run'D = ;rue # 'i 6alse => salir del pro*rama
acti5idadC'serial'D = 6alse # <stado del puerto serie
contador = >
socPetSost = ''
socPetPort = %>>>>
socPetLenerator = :one
serialPort = '/de5/tty)3H>'
ob$ect'erial = :one
serial;ime8ut = 3> # se*undos1 tiempo maGimo de espera
serial;ime8p = >.>>% # se*undos1 tiempo estimado de operacion
# +++3lases+++
class Hessa*e()@
'''3lase Hensa$e'''
de! 77init77(sel!- byte'trin* = b''- n=>)@
sel!.bytes9n = byte'trin*
sel!.bytes8ut = b''
sel!.time = time.time()
sel!.contador = n

de! Orite(sel!- ob$ect'erial)@
ob$ect'erial.Orite(sel!.bytes9n)

de! read(sel!- ob$ect'erial)@
sel!.bytes8ut = b''
79
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
time> = time.time()
Ohile ;rue@
data = ob$ect'erial.read()
sel!.bytes8ut 0= data
i! data == ';N@ sel!.bytes8ut = ';N
i! (data == <;N) and (ob$ect'erial.in,aitin*() == >)@ breaP
i! time.time() > time>0serial;ime8ut0serial;ime8p@
raise serial.'erial;imeout<Gception

de! serie(sel!- ob$ect'erial)@
print('<n5iando y recibiendo por serie') #
try@
n=bytes('?>3d' ? (sel!.contador)- encodin*='ascii')
sel!.bytes9n = sel!.bytes9nC@D0n0sel!.bytes9nC@D
sel!.Orite(ob$ect'erial)
sel!.read(ob$ect'erial)
i! sel!.bytes9nC@BD == sel!.bytes8utC@BD@
sel!.bytes8ut = sel!.bytes8utC@D0sel!.bytes8utCB@D
else@
time.sleep(E)
sel!.read(ob$ect'erial)
i! sel!.bytes9nC@BD == sel!.bytes8utC@BD@
sel!.bytes8ut =
sel!.bytes8utC@D0sel!.bytes8utCB@D
else@
sel!.bytes8ut = ';N 0 b'error' 0 <;N
eGcept serial.'erial;imeout<Gception@
print(messa*e.bytes9n) #
print(messa*e.bytes8ut) #
print(''erial;imeout<Gception')
pass
eGcept serial.'erial<Gception@
print('3oneGion serie caida')
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
eGcept <Gception as G@
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
print('8tro tipo de eGcepcion"n'erial doOn"n'- G)
else@
return
sel!.bytes9n = ';N 0 b'error' 0 <;N

# +++6unciones+++
# '<=9<
80
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
de! serial7up()@
''';hread that maPe an ob$ect serial instance
Silo para establecer la coneGion serie
3rea una instancia de un ob$eto serial (LL8U)L ob$ect'erial).
<l ob$eto esta conectado al puerto proporcionado por serialPort'''
*lobal ob$ect'erial- serialPort
Ohile not acti5idadC'serial'D and acti5idadC'run'D@
try@
ob$ect'erial = serial.'erial(
serialPort-
baudrate=I6>>-
timeout=E-
Orite;imeout=E)
eGcept serial.serialutil.'erial<Gception@
print('<Gcepcion@"n'-
'a) <l dispositi5o no se encuentra en el puerto indicado."n'-
'b) o no estA conectado."n> =eintentando en % se*undos')
# en5iar un mensa$e al a*ente #ue se ha conectado
time.sleep(%)
else@
time.sleep(3)# ;iempo de acti5acion
print('3oneGion serie up')
acti5idadC'serial'D = ;rue

# '83V<;
de! socPet7up()@
*lobal *en'ocPet
try@
*en'ocPet = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
eGcept 8'<rror@
print('<Gcepcion al crear una instancia del tipo socPet')
print('+++ 3errando +++')
try@
*en'ocPet.bind((socPetSost- socPetPort))
*en'ocPet.listen(%)
print(''ocPet up.')
print(' 'ocPet host@'-socPet.*ethostname())
print(' 'ocPet port@'-socPetPort)
eGcept 8'<rror@
print('<Gcepcion al crear el socPet receptor de peticiones de
coneGion'-
'puede ser debido a #ue el puerto o la direccion 9P'-
socPetPort-
'estan siendo usados por otra aplicaci(n')
print('+++ 3errando +++')
*en'ocPet.close()
acti5idadC'run'D = 6alse
81
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
# +++++ 9:9398 P=8L=)H) +++++
print('+++ iniciando +++')
threadin*.;hread(tar*et=serial7up).start() # ;hread
socPet7up()
Ohile acti5idadC'run'D@ # Uucle
try@
# 3rea un socPet cliente tras una peticion de coneGion
print(',aitin* nue5a coneGion ;3P/9P...')
coneGion=ed- address = *en'ocPet.accept()
coneGion=ed.settimeout(2)
print('3oneGion con'- address)
# recepcion del mensa$e
data = b''
Ohile not <;N in data@ # reconstruye el mensa$e
troMo = coneGion=ed.rec5(E>2)
i! not troMo@ breaP
data 0= troMo
messa*e = Hessa*e(data- contador)
contador = (contador 0 E) ? E>>>
i! acti5idadC'serial'D@ messa*e.serie(ob$ect'erial)
else@ messa*e.bytes8ut = ';N 0 b'error-serial7doOn' 0 <;N
coneGion=ed.sendall(messa*e.bytes8ut)
eGcept socPet.timeout@
pass
eGcept <Gception@
pass
!inally@
coneGion=ed.close()
82
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
SocketClientt
# socPet3lient
# Hodulo para la comunicacion como cliente por socPet
# especi!ico para el )rduino'er5er.py
# 3aracteristicas@
# Propa*a eGcepciones
# 3ierra siempre el socPet
import socPet
import time
de! send7rec5(messa*e- ip='localhost'- port=%>>>J- t8p=>- t8ut=E)@
'''
<n5ia un mensa$e y espera su respuesta.
'intaGis@
send7rec5(messa*e- ip- port- t7operacion- t7out)
Parametros pasados a la !uncion@
messa*e = cadena Wnicode o )'399
ip = cadena de teGto de la direccion 9P del ser5idor
port = entero del puerto de escucha del ser5idor
t7operacion = tiempo de estimado
t7out = tiempo de en5io
t7operacion 0 t7out 0 t7out = t7maG
=espuesta@
cadena Wnicode.
'''
try@
so = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
so.settimeout(t8ut)
so.connect((ip-port))
#print(so.*etpeername())
#print(so.*etsocPname())
so.sendall(bytes(messa*e- encodin*='ascii'))
so.shutdoOn(socPet.'SW;7,=)
so.settimeout(t8ut0t8p)
resp = b''
Ohile ;rue@
troMo = so.rec5(E>2)
i! not troMo@ breaP
resp 0= troMo
!inally@
so.close()
return strAresp, encodingRMasciiMB
83
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
motorShieldModule
# motor'hieldHodule
# Python 3
# Hodulo para interaccionar con el sPetch del motor
import sys
import socPet3lient as sc
# 4ireccion y puerto donde se encuentra el ser5idor
ser5erSost = 'localhost' # e$emplos@ 'localhosts'- 'EI2.E6J.2.3'
ser5erPort = %>>>>
';N = '"G>2' # 'tart o! ;eGt character
<;N = '"G>3' # <nd o! ;eGt character
# 'intaGis
# ';N 0 3ommand 0 '-' 0 )r*umentos 0 <;N
# 6unciones basicas
de! turn(i-d)@
'''Sace *irar el motor i pasos en la direccion d
i es un entero.
d es interpretado como un booleano.
'''
i! d@
cmd = 'sns' 0 '-'0 str(i) 0 '0'
else@
cmd = 'sns' 0 '-'0 str(i) 0 '+'
ar* = :one
messa*e = ';N 0 cmd 0 <;N
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E -t8ut=6>)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
i! messa*e == ans@
pass
de! set7step7duration(i)@
'''6i$a la duracion del paso
i es un entero interpretado como microse*undos
'''
cmd = 'str' 0 '-' 0 str(i)
ar* = :one
messa*e = ';N 0 cmd 0 <;N
# socPet
84
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=2 -t8ut=2)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
i! messa*e == ans@
return 'oP'
de! set7abs7pos(i)@
'''6i$a la posicion absoluta del motor
'''
cmd = 'sap' 0 '-' 0 str(i)
ar* = :one
messa*e = ';N 0 cmd 0 <;N
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=2 -t8ut=2)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
i! messa*e == ans@
return 'oP'
de! *et7abs7pos()@
'''8btiene la posicion absoluta del motor en pasos
'''
cmd = '*ap'
ar* = :one
messa*e = ';N 0 cmd 0 <;N
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=2 -t8ut=2)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
ans = ans.strip(';N0<;N0'-').split('-')
i! cmdC@3D == ansC>D@
resp = int(ansCED)
return resp
eGcept <Gception@
return 'corrupcion del mensa$e'

85
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
motorGui
# motorLui
# python 3
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import motor'hieldHodule as motor
# 38:';):;<' LL8U)L<'
# LocaliMacion del ser5idor 5olcadas en el modulo analo*icHodule
motor.ser5erSost = 'localhost' # 'localhost' o 'EI2.E6J.2.E3'
motor.ser5erPort = %>>>>
t7inter5alo = E # inter5alo entre peticiones (en se*undos)
# K)=9)UL<'
# Kariables *lobales
buttons = /2 # diccionario de ob$etos *ra!icos1 campos a actualiMar.
labels = /2 # diccionario de ob$etos *ra!icos1 campos a actualiMar.
acti5idad = /'play'@6alse- 'record'@6alse2 # bit- si 6alse => close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso en eGclusion.
posicion = ''
#posicion = 'pos7E'
pasos<ntrePos = B>
pasosPos> = %>>
posiciones = /
'pos7E'@ pasosPos> 0 >.pasos<ntrePos-
'pos72'@ pasosPos> 0 E.pasos<ntrePos-
'pos73'@ pasosPos> 0 2.pasos<ntrePos-
'pos7'@ pasosPos> 0 3.pasos<ntrePos-
'pos7%'@ pasosPos> 0 .pasos<ntrePos-
'pos76'@ pasosPos> 0 %.pasos<ntrePos-
'pos7B'@ pasosPos> 0 6.pasos<ntrePos-
'pos7J'@ pasosPos> 0 B.pasos<ntrePos-
'rea$ustar'@>
2
# 6unciones
de! steps7to7neO(neOPos)@
*lobal posicion
i! posicion == ''@
try@
*et()
time.sleep(E)
eGcept <Gception@
pass
else@
86
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
try@
steps = posicionesCneOPosD + posicionesCposicionD
posicion = neOPos
i! steps > >@ return (steps-E)
else@ return (abs(steps)->)
eGcept <Gception@
return (>->)


de! *et()@
*lobal posicion
resp = motor.*et7abs7pos()
i! type(resp) == int@
!or Pey in posiciones@
buttonsCPeyD.con!i*(relie!='raise')
i! posicionesCPeyD == resp@
posicion = Pey
buttonsCPeyD.con!i*(relie!='sunPen')
else@
return

de! pos7E()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos7E'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos7E')
motor.turn(stepdC>D-stepdCED)
de! pos72()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos72'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos72')
motor.turn(stepdC>D-stepdCED)
de! pos73()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos73'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos73')
motor.turn(stepdC>D-stepdCED)
de! pos7()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos7'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos7')
motor.turn(stepdC>D-stepdCED)
de! pos7%()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos7%'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos7%')
motor.turn(stepdC>D-stepdCED)
de! pos76()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos76'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos76')
motor.turn(stepdC>D-stepdCED)
87
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
de! pos7B()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos7B'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos7B')
motor.turn(stepdC>D-stepdCED)
de! pos7J()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'pos7J'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('pos7J')
motor.turn(stepdC>D-stepdCED)
de! rea$ustar()@
!or Pey in posiciones@ buttonsCPeyD.con!i*(relie!='raise')
buttonsC'rea$ustar'D.con!i*(relie!='sunPen')
stepd = steps7to7neO('rea$ustar')
i! stepdCED == >@ motor.turn(E>>-E)
time.sleep(E.%)
motor.turn(stepdC>D0%>>-stepdCED)
time.sleep(E>)
motor.set7abs7pos(>)
time.sleep(E)
*et()
de! repeater(t7re!resco=%>>)@
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
#labelsCdataC>DD.con!i*(teGt=dataCED)
pass
Oinroot.a!ter(t7re!resco- repeater) # llamada periodica ms
de! play()@
# lanMador del hilo play7thread
threadin*.;hread(tar*et=play7thread).start()
de! play7thread()@
# 6uturo uso
Ohile acti5idadC'play'D@
time.sleep(E)
motor.*et7abs7pos()

# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
88
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
toolmenu = tP.Henu(menubar)
toolmenu.add7command(label='Let position'- command=*et- underline=>)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
de! maPebuttons(Oin- buttons=buttons- labels=labels)@
'''3onstruye los botones'''
!rame = tP.6rame(Oin)
!rame.pacP()
bttn7pos7E = tP.Uutton(!rame- teGt='Posicion E'- command=pos7E- Oidth=2>)
bttn7pos72 = tP.Uutton(!rame- teGt='Posicion 2'- command=pos72- Oidth=2>)
bttn7pos73 = tP.Uutton(!rame- teGt='Posicion 3'- command=pos73- Oidth=2>)
bttn7pos7 = tP.Uutton(!rame- teGt='Posicion '- command=pos7- Oidth=2>)
bttn7pos7% = tP.Uutton(!rame- teGt='Posicion %'- command=pos7%- Oidth=2>)
bttn7pos76 = tP.Uutton(!rame- teGt='Posicion 6'- command=pos76- Oidth=2>)
bttn7pos7B = tP.Uutton(!rame- teGt='Posicion B'- command=pos7B- Oidth=2>)
bttn7pos7J = tP.Uutton(!rame- teGt='Posicion J'- command=pos7J- Oidth=2>)
bttn7rea$ustar = tP.Uutton(!rame- teGt='=ea$ustar'- command=rea$ustar-
Oidth=2>)
bttn7pos7E.pacP()
bttn7pos72.pacP()
bttn7pos73.pacP()
bttn7pos7.pacP()
bttn7pos7%.pacP()
bttn7pos76.pacP()
bttn7pos7B.pacP()
bttn7pos7J.pacP()
bttn7rea$ustar.pacP()
buttonsC'pos7E'D = bttn7pos7E
buttonsC'pos72'D = bttn7pos72
buttonsC'pos73'D = bttn7pos73
buttonsC'pos7'D = bttn7pos7
buttonsC'pos7%'D = bttn7pos7%
buttonsC'pos76'D = bttn7pos76
buttonsC'pos7B'D = bttn7pos7B
89
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
buttonsC'pos7J'D = bttn7pos7J
buttonsC'rea$ustar'D = bttn7rea$ustar
return buttons- labels
de! maPebar(Oin- buttons=buttons- labels=labels)@
'''3onstruye los campos donde se representan las lecturas de los
sensores'''
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor E
sensor7E = tP.Label(!rame- teGt='lectura sensor E @ ++++++ '- Oidth=2>)
sensor7E.pacP(side='le!t')
labelsC'sensor7E'D = sensor7E
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor 2
sensor72 = tP.Label(!rame- teGt='lectura sensor 2 @ ++++++ '- Oidth=2>)
sensor72.pacP()
labelsC'sensor72'D = sensor72
# 3reacion ob$eto *ra!ico@ <ti#ueta del sensor 3
sensor73 = tP.Label(Oin- teGt='lectura sensor 3 @ ++++++ '- Oidth=2>)
sensor73.pacP()
labelsC'sensor73'D = sensor73
return buttons- labels
de! maPetable(Oin)@
marco = tP.6rame(Oin)
marco.pacP()
# cabecera
titulo7status = tP.Label(marco- teGt='st'- relie!='!lat'-
Oidth=3- b*='bei*e')
titulo7sensor = tP.Label(marco- teGt='sensor'- relie!='!lat'-
Oidth=I- b*='bei*e')
titulo7data = tP.Label(marco- teGt='data'- relie!='!lat'-
Oidth=E3- b*='bei*e')
titulo7status.pacP(side='le!t')
titulo7sensor.pacP(side='le!t')
titulo7data.pacP(side='le!t')
# tabla
tabla = C(titulo7status- titulo7sensor- titulo7data)D
!or i in ran*e(E-60E)@
marco = tP.6rame(Oin)
marco.pacP()
status = tP.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3)
sensor = tP.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I)
data = tP.Label(marco- teGt='++++'- relie!='sunPen'- Oidth=E3)
status.pacP(side='le!t')
sensor.pacP(side='le!t')
data.pacP(side='le!t')
tabla.append((status- sensor- data))
return tabla
# 9:9398 P=8L=)H)
90
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title('Posicion Hotor')
Oinroot.a!ter(%>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
buttons- labels = maPebuttons(Oinroot)
#buttons- labels = maPebar(Oinroot)
# lanMamiento del sistema de e5entos
Oinroot.mainloop()
# cierre de hilos
print('cerrando')
acti5idadC'play'D=6alse
acti5idadC'record'D=6alse
91
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
92
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto Bronkhorst
!igue siendo similar a los programas anteriores necesitando como ellos un progama que )aga de
puente entre la red Et)ernet y el dispositivo serie.
bron6/orst+erver. Programa
que )ace de puente entre la red
Et)ernet y el dispositivo serie.
+oc6etClient. El mismo mdulo
que en los casos anteriores, que
se encarga de )acer las
conexiones .CP/0P entre la
inter(az gr,(ica y el servidor que
)ace de puente.
bron6o/orst:odule. 0nstrucciones para operar con el caudalmetro "ron-)orst.
bron6/orst<ui. 0nter(az gr,(ica donde se puede seleccionar el punto de trabao Acomo v,lvulaB y
conocer el (luo A%easureB. Figura 6.
93
Figura 3. Interfaz grfica bronkhorstGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
bronkhorstServer
# bronPhorst'er5er
# Python 3
# Pro*rama puente
# )cepta una coneGion a tra5es de un socPet ;3P/9P #ue hace de puente
# con un puerto serie
import socPet
import serial
import time
import threadin*
# +++3onstantes+++
';N = b'@'
<;N = b'"n'
# +++Kariables+++
acti5idad = /2 # 4iccionario con el estado
acti5idadC'run'D = ;rue # 'i 6alse => salir del pro*rama
acti5idadC'serial'D = 6alse # <stado del puerto serie
socPetSost = ''
socPetPort = %>>>>
socPetLenerator = :one
serialPort = '/de5/ttyW'U>'
#serialPort = '/de5/tty)3H>'
ob$ect'erial = :one
serial;ime8ut = 2 # se*undos1 tiempo maGimo de espera
serial;ime8p = >.>% # se*undos1 tiempo estimado de operacion
# +++3lases+++
class Hessa*e()@
'''3lase Hensa$e'''
de! 77init77(sel!- byte'trin* = b''- n=>)@
sel!.bytes9n = byte'trin*
sel!.bytes8ut = b''
sel!.time = time.time()
sel!.contador = n

de! Orite(sel!- ob$ect'erial)@
ob$ect'erial.Orite(sel!.bytes9n)

de! read(sel!- ob$ect'erial)@
sel!.bytes8ut = b''
time> = time.time()
Ohile ;rue@
94
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
data = ob$ect'erial.read()
sel!.bytes8ut 0= data
i! data == ';N@ sel!.bytes8ut = ';N
i! (data == <;N) and (ob$ect'erial.in,aitin*() == >)@ breaP
i! time.time() > time>0serial;ime8ut@
raise serial.'erial;imeout<Gception

de! serie(sel!- ob$ect'erial)@
print('<n5iando y recibiendo por serie') #
try@
sel!.Orite(ob$ect'erial)
time.sleep(serial;ime8p)
sel!.read(ob$ect'erial)
eGcept serial.'erial;imeout<Gception@
print(messa*e.bytes9n) #
print(messa*e.bytes8ut) #
print(''erial;imeout<Gception')
pass
eGcept serial.'erial<Gception@
print('3oneGion serie caida')
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
eGcept <Gception as G@
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
print('8tro tipo de eGcepcion"n'erial doOn"n'- G)
else@
return
sel!.bytes9n = ';N 0 b'error' 0 <;N

# +++6unciones+++
# '<=9<
de! serial7up()@
''';hread that maPe an ob$ect serial instance
Silo para establecer la coneGion serie
3rea una instancia de un ob$eto serial (LL8U)L ob$ect'erial).
<l ob$eto esta conectado al puerto proporcionado por serialPort
'''
*lobal ob$ect'erial- serialPort
Ohile not acti5idadC'serial'D and acti5idadC'run'D@
try@
ob$ect'erial = serial.'erial(
serialPort-
baudrate=3J>>-
timeout=E-
95
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Orite;imeout=E)
# baudrate=3J>>
eGcept serial.serialutil.'erial<Gception@
print('<Gcepcion@"n'-
'a) <l dispositi5o no se encuentra en el puerto indicado."n'-
'b) o no estA conectado."n> =eintentando en % se*undos')
# en5iar un mensa$e al a*ente #ue se ha conectado
time.sleep(%)
else@
time.sleep(3)# ;iempo de acti5acion
print('3oneGion serie up')
acti5idadC'serial'D = ;rue
# '83V<;
de! socPet7up()@
*lobal *en'ocPet
try@
*en'ocPet = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
eGcept 8'<rror@
print('<Gcepcion al crear una instancia del tipo socPet')
print('+++ 3errando +++')
try@
*en'ocPet.bind((socPetSost- socPetPort))
*en'ocPet.listen(%)
print(''ocPet up.')
print(' 'ocPet host@'-socPet.*ethostname())
print(' 'ocPet port@'-socPetPort)
eGcept 8'<rror@
print('<Gcepcion al crear el socPet receptor de peticiones de
coneGion'-
'puede ser debido a #ue el puerto o la direccion 9P'-
socPetPort-
'estan siendo usados por otra aplicaci(n')
print('+++ 3errando +++')
*en'ocPet.close()
acti5idadC'run'D = 6alse
# +++++ 9:9398 P=8L=)H) +++++
print('+++ iniciando +++')
threadin*.;hread(tar*et=serial7up).start() # ;hread
socPet7up()
Ohile acti5idadC'run'D@ # Uucle
try@
# 3rea un socPet cliente tras una peticion de coneGion
print(',aitin* nue5a coneGion ;3P/9P...')
coneGion=ed- address = *en'ocPet.accept()
coneGion=ed.settimeout(2)
print('3oneGion con'- address)
# recepcion del mensa$e
96
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
data = b''
Ohile not <;N in data@ # reconstruye el mensa$e
troMo = coneGion=ed.rec5(E>2)
i! not troMo@ breaP
data 0= troMo
messa*e = Hessa*e(data)
i! acti5idadC'serial'D@ messa*e.serie(ob$ect'erial)
else@ messa*e.bytes8ut = ';N 0 b'error-serial7doOn' 0 <;N
# contestacion
coneGion=ed.sendall(messa*e.bytes8ut)
eGcept socPet.timeout@
pass
eGcept <Gception@
print('<Gception')
!inally@
coneGion=ed.close()
97
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
socketClient
# socPet3lient
# Hodulo para la comunicacion como cliente por socPet
# especi!ico para el )rduino'er5er.py
# 3aracteristicas@
# Propa*a eGcepciones
# 3ierra siempre el socPet
import socPet
import time
de! send7rec5(messa*e- ip='localhost'- port=%>>>J- t8p=>- t8ut=E)@
'''
<n5ia un mensa$e y espera su respuesta.
'intaGis@
send7rec5(messa*e- ip- port- t7operacion- t7out)
Parametros pasados a la !uncion@
messa*e = cadena Wnicode o )'399
ip = cadena de teGto de la direccion 9P del ser5idor
port = entero del puerto de escucha del ser5idor
t7operacion = numero real con el tiempo de duracion de la
operacion
t7out = numero real con el tiempo de espera en las operaciones
de
coneGion- en5io- y recepcion.
t7operacion 0 t7out 0 t7out = t7maG
=espuesta@
cadena Wnicode.
'''
try@
so = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
so.settimeout(t8ut)
so.connect((ip-port))
#print(so.*etpeername())
#print(so.*etsocPname())
so.sendall(bytes(messa*e- encodin*='ascii'))
so.shutdoOn(socPet.'SW;7,=)
so.settimeout(t8ut0t8p)
resp = b''
Ohile ;rue@
troMo = so.rec5(E>2)
i! not troMo@ breaP
resp 0= troMo
!inally@
so.close()
return str(resp- encodin*='ascii')
98
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
bronkhorstModule
# bronPhorstHodule
# python 3
# 6unciones basicas
#
import socPet3lient as sc
# 4ireccion y puerto donde se encuentra el ser5idor
ser5erSost = 'localhost' #
ser5erPort = %>>>>
';N = '@'
<;N = '"n'
de! set7point(n)@
'''
'elecciona el punto de traba$o- set7point(n) con n entero de > a 32>>>.
Yue se corresponde al > y al E>>? de la abertura de la 5al5ula
'''
#n = bytes(heG(n)- encodin*='ascii')C2@D # 5alor heGadecimal E6>>>=3<J>
i! (> > n and n > 32>>)@ return '!uera de ran*o'
i! type(n) == int@ n = int(n)
else@ return 'type error'
n = ('>>>>' 0 heG(n)C2@D)C+D # di*itos heGadecimales
l = '>6'
nodo = '>3'
comando = '>E'
proceso = '>E'
tipo = '2E'
messa*e = '@'0 l 0 nodo 0 comando 0 proceso 0 tipo 0 n 0 '"r"n'
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
i! int(ansCB@ID) == >@ ans = >
else@
ans = 'error'
eGcept <Gception@
ans = 'eGception'
return ans

de! *et7point()@
# try o ran*o de n
l = '>6'
nodo = '>3'
99
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
comando = '>'
proceso = '>E'
tipo = '2E'
messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 tipo
0 proceso 0 tipo 0 '"r"n')
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
ans = int(ansCEE@E%D-E6) # de heGadecimal strin* a entero
eGcept <Gception@
ans = 'eGception'
return ans

de! measure()@
'''
Sace una medida del !lu$o.
5alor entero #ue puede tomar 5alores en ter +23%I3 a EI2- aun#ue
32>>> e#ui5ale al E>>?
'''
l = '>6'
nodo = '>3'
comando = '>' # re#uest parameter
proceso = '>E' # proceso
tipo = '2E' # entero 0 indeG (tipo del 5alor #ue me a a de5ol5er)
proceso = '>E' # proceso
parametro = '2>' # tipo entero 0 6Unr (tipo del parametro)
messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 tipo 0
proceso 0 parametro 0 '"r"n')
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
ans = int(ansCEE@E%D-E6) # de heGadecimal strin* a entero
eGcept <Gception@
ans = 'eGception'
return ans
# ++++ !unciones no usadas
de! close()@
'''
100
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
tipo strin* de J caracters
'''
l = '>3' # E2
nodo = '>3'
comando = '>2' # send parameter sin peticion de estado
proceso = '>E' # proceso
parametro = '>6' # tipo caracter (>) 0 6Unr (parametro)
5alor = '>E>E>E>E>E>E>E>E'
messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 parametro
0 5alor 0 '"r"n')
de! open()@
'''
tipo strin* de J caracters
'''
l = '>3' # E2
nodo = '>3'
comando = '>2' # send parameter sin peticion de estado
proceso = '>E' # proceso
parametro = '>6' # tipo caracter (>) 0 6Unr (parametro)
5alor = '>>>>>>>>>>>>>>>>'
messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 parametro
0 5alor 0 '"r"n')
de! status()@
'''
<stado de la 5al5ula open/close
'''
l = '>3' # E2
nodo = '>3'
comando = '>' # send parameter sin peticion de estado
proceso = '>E' # proceso
parametro = '>6' # tipo caracter (>) 0 6Unr (parametro)
5alor = '>>>>>>>>>>>>>>>>'
messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 parametro
0 5alor 0 '"r"n')
101
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
bronkhorstGui
# bronPhorstLui
# python 3
# inter!aM *ra!ica para caudalimetro UronPhorst
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import bronPhorstHodule as br
# 38:';):;<' LL8U)L<'
# K)=9)UL<'
# Kariables *lobales
botones = /2 # diccionario de ob$etos *ra!icos Uutton. record- play- stop.
labels = /2 # diccionario de ob$etos *ra!icos Labels- campos a actualiMar.
dialo*os = /2
acti5idad = /'run'@;rue- 'sa5e'@6alse 2 # boolean- i! 6alse => close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso en eGclusi(n mutua
# 6unciones
de! repeater()@
''')ctualiMacion periodica'''
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
labelsCdataC>DD.con!i*(teGt=dataCED)
Oinroot.a!ter(E>>- repeater) # pro*ramar nue5a llamada
de! readin*()@
threadin*.;hread(tar*et=readin*7thread).start()
de! readin*7thread()@
Ohile acti5idadC'run'D@
try@
ans = br.*et7point()
ans = ans
data#ueue.put(('point'-'?.E!' ? (ans/32)))
time.sleep(>.%)
ans = br.measure()
data#ueue.put(('measure'-'?.E!' ? (ans/32)))
time.sleep(>.%)
eGcept <Gception@
print('eGcepcion')
time.sleep(>.%)
102
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

de! dialo*7chan*e7point()@
de! push()@
5alor = dialo*o.*et()
chan*e7point(5alor)
popup.destroy()
popup = tP.;ople5el()
dialo*o = tP.<ntry(popup)
dialo*o.pacP(side='top')
tP.Uutton(popup- teGt='3ancel'- command=popup.destroy).pacP(side='le!t')
tP.Uutton(popup- teGt = ')pply'-command=push).pacP(side='ri*ht')
de! chan*e7point(5alor)@
threadin*.;hread(tar*et=chan*e7point7thread-ar*s=(5alor-)).start()
de! chan*e7point7thread(5alor)@
try@
5alor = int(5alor)
eGcept@
pass
else@
i! ((5alor >= >) and (5alor F E>>))@
try@
br.set7point(int(5alor/32))
eGcept <Gception@
pass
# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
toolmenu = tP.Henu(menubar)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
103
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

de! maPeUar(Oin- botones- labels)@
measure7teGt= tP.Label(Oin- teGt='Heasure(?)@ '- Oidth=E2- hei*ht=2)
measure7label = tP.Label(Oin- teGt='++++'- Oidth=J)
measure7teGt.pacP(side='le!t')
measure7label.pacP(side='le!t')
point7teGt= tP.Label(Oin- teGt=''etpoint (?)@ '- Oidth=E2- hei*ht=2)
point7label = tP.Label(Oin- teGt='++++'- Oidth=J)
point7teGt.pacP(side='le!t')
point7label.pacP(side='le!t')
boton7point = tP.Uutton(Oin- teGt='3S):L<'-
command=dialo*7chan*e7point- Oidth=)
boton7point.pacP(side='le!t')
labelsC'measure'D=measure7label
labelsC'point'D=point7label
botonesC'point'D=boton7point
return botones- labels
# 9:9398 P=8L=)H)
i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title('UronPhorst')
Oinroot.a!ter(E>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
topmarco=tP.6rame()
topmarco.pacP()
#botones- labels = maPecanalbar(topmarco- botones- labels)
botones- labels = maPeUar(Oinroot- botones- labels)
readin*()
# lanMamiento del sistema de e5entos
Oinroot.mainloop()
# cierre de hilos
acti5idadC'record'D=6alse
acti5idadC'run'D = 6alse
104
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto MaxiGauge
Etro dispositivo serie con lo que la estructura general a los vistos anteriormente.
ma$i<auge+erver. Programa que )ace de puente
entre la red Et)ernet y el dispositivo serie.
+oc6etClient. El mismo mdulo que en los casos
anteriores, que se encarga de )acer las conexiones
.CP/0P entre la inter(az gr,(ica y el servidor que
)ace de puente.
ma$i<auge:odule. 0nstrucciones para operar
con la %axiCauge.
ma$i<auge<ui. 0nter(az gr,(ica en la que aparece
el estado de los sensores y su medida. Figura 7.
105
Figura 4. Interfaz grfica maxiGaugeGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
maxiGaugeServer
# mauGiLau*e'er5er
# Python 3
# Pro*rama puente
# )cepta una coneGion a tra5es de un socPet ;3P/9P #ue hace de puente
# con un puerto serie
import socPet
import serial
import time
import threadin*
# +++3onstantes+++
';N= b'"G>2'
<;N= b'"G>3' # <nd o! ;eGt. =eset bu!!er.
3= = b'"G>4' # 3arria*e =eturn.
L6 = b'"G>)' # Line 6eed. Uetter don't send.
<:Y= b'"G>%' # <n#uiry. =e#uest !o data transmission
)3V= b'"G>6' # )cPnoOled*e.
:)V= b'"GE%' # :o acPnoOled*e.
<'3= b'"GEU' # <scape.
# +++Kariables+++
acti5idad = /2 # 4iccionario con el estado
acti5idadC'run'D = ;rue # 'i 6alse => salir del pro*rama
acti5idadC'serial'D = 6alse # <stado del puerto serie
socPetSost = ''
socPetPort = %>>>>
socPetLenerator = :one
serialPort = '/de5/ttyW'U>'
#serialPort = '/de5/tty)3H>'
ob$ect'erial = :one
serial;ime8ut = 2 # se*undos1 tiempo maGimo de espera
serial;ime8p = >.% # se*undos1 tiempo estimado de operacion
# +++3lases+++
class Hessa*e()@
'''3lase Hensa$e'''
de! 77init77(sel!- byte'trin* = b''- n=>)@
sel!.bytes9n = byte'trin*
sel!.bytes8ut = b''
sel!.time = time.time()
sel!.contador = n

de! Orite(sel!- ob$ect'erial)@
106
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ob$ect'erial.Orite(sel!.bytes9n)

de! read(sel!- ob$ect'erial)@
sel!.bytes8ut = b''
time> = time.time()
Ohile ;rue@
data = ob$ect'erial.read()
sel!.bytes8ut 0= data
i! (data == L6) and (ob$ect'erial.in,aitin*() == >)@ breaP
i! time.time() > time>0serial;ime8ut0serial;ime8p@
raise serial.'erial;imeout<Gception

de! serie(sel!- ob$ect'erial)@
print('<n5iando y recibiendo por serie') #
try@
lineas = sel!.bytes9n.strip(';N03=0<;N).split(3=)
!or linea in lineas@
sel!.bytes9n = linea03=
sel!.Orite(ob$ect'erial)
sel!.read(ob$ect'erial)
i! sel!.bytes8ut == )3V03=0L6@ pass
eli! sel!.bytes8ut == :)V03=0L6@ breaP
else@ breaP
eGcept serial.'erial;imeout<Gception@
print(messa*e.bytes9n) #
print(messa*e.bytes8ut) #
print(''erial;imeout<Gception')
pass
eGcept serial.'erial<Gception@
print('3oneGion serie caida')
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
eGcept <Gception as G@
acti5idadC'serial'D = 6alse
ob$ect'erial.close()
ob$ect'erial == :one
threadin*.;hread(tar*et=serial7up).start() # ;hread
print('8tro tipo de eGcepcion"n'erial doOn"n'- G)
else@
sel!.bytes8ut = ';N 0 sel!.bytes8ut 0 <;N
return
sel!.bytes9n = ';N 0 b'error' 0 <;N

# +++6unciones+++
# '<=9<
de! serial7up()@
''';hread that maPe an ob$ect serial instance
107
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Silo para establecer la coneGion serie
3rea una instancia de un ob$eto serial (LL8U)L ob$ect'erial).
<l ob$eto esta conectado al puerto proporcionado por serialPort
'''
*lobal ob$ect'erial- serialPort
Ohile not acti5idadC'serial'D and acti5idadC'run'D@
try@
ob$ect'erial = serial.'erial(
serialPort-
baudrate=I6>>-
timeout=E-
Orite;imeout=E)
# baudrate=3J>>
eGcept serial.serialutil.'erial<Gception@
print('<Gcepcion@"n'-
'a) <l dispositi5o no se encuentra en el puerto indicado."n'-
'b) o no estA conectado."n> =eintentando en % se*undos')
# en5iar un mensa$e al a*ente #ue se ha conectado
time.sleep(%)
else@
time.sleep(3)# ;iempo de acti5acion
print('3oneGion serie up')
acti5idadC'serial'D = ;rue
# '83V<;
de! socPet7up()@
*lobal *en'ocPet
try@
*en'ocPet = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
eGcept 8'<rror@
print('<Gcepcion al crear una instancia del tipo socPet')
print('+++ 3errando +++')
try@
*en'ocPet.bind((socPetSost- socPetPort))
*en'ocPet.listen(%)
print(''ocPet up.')
print(' 'ocPet host@'-socPet.*ethostname())
print(' 'ocPet port@'-socPetPort)
eGcept 8'<rror@
print('<Gcepcion al crear el socPet receptor de peticiones de
coneGion'-
'puede ser debido a #ue el puerto o la direccion 9P'-
socPetPort-
'estan siendo usados por otra aplicaci(n')
print('+++ 3errando +++')
*en'ocPet.close()
acti5idadC'run'D = 6alse
# +++++ 9:9398 P=8L=)H) +++++
108
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
print('+++ iniciando +++')
threadin*.;hread(tar*et=serial7up).start() # ;hread
socPet7up()
Ohile acti5idadC'run'D@ # Uucle
try@
# 3rea un socPet cliente tras una peticion de coneGion
print(',aitin* nue5a coneGion ;3P/9P...')
coneGion=ed- address = *en'ocPet.accept()
coneGion=ed.settimeout(2)
print('3oneGion con'- address)
# recepcion del mensa$e
data = b''
Ohile not <;N in data@ # reconstruye el mensa$e
troMo = coneGion=ed.rec5(E>2)
i! not troMo@ breaP
data 0= troMo
messa*e = Hessa*e(data)
i! acti5idadC'serial'D@ messa*e.serie(ob$ect'erial)
else@ messa*e.bytes8ut = ';N 0 b'error-serial7doOn' 0 <;N
# contestacion
coneGion=ed.sendall(messa*e.bytes8ut)
eGcept socPet.timeout@
pass
eGcept <Gception@
print('<Gception')
!inally@
coneGion=ed.close()
109
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
socketClient
# socPet3lient
# Hodulo para la comunicacion como cliente por socPet
# especi!ico para el )rduino'er5er.py
# 3aracteristicas@
# Propa*a eGcepciones
# 3ierra siempre el socPet
import socPet
import time
de! send7rec5(messa*e- ip='localhost'- port=%>>>J- t8p=>.E- t8ut=E)@
'''
<n5ia un mensa$e y espera su respuesta.
'intaGis@
send7rec5(messa*e- ip- port- t7operacion- t7out)
Parametros pasados a la !uncion@
messa*e = cadena Wnicode o )'399
ip = cadena de teGto de la direccion 9P del ser5idor
port = entero del puerto de escucha del ser5idor
t7operacion = numero real con el tiempo de duracion de la
operacion
t7out = numero real con el tiempo de espera en las operaciones
de coneGion- en5io- y recepcion.
t7operacion 0 t7out 0 t7out = t7maG
=espuesta@
cadena Wnicode.
'''
try@
so = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
so.settimeout(t8ut)
so.connect((ip-port))
#print(so.*etpeername())
#print(so.*etsocPname())
so.sendall(bytes(messa*e- encodin*='ascii'))
so.shutdoOn(socPet.'SW;7,=)
so.settimeout(t8ut0t8p)
resp = b''
Ohile ;rue@
troMo = so.rec5(E>2)
i! not troMo@ breaP
resp 0= troMo
!inally@
so.close()
return str(resp- encodin*='ascii')
110
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
maxiGaugeModule
# HaGiLau*eHodule
# Python 3
# + ;raduce ordenes a la maGi*au*e en cadenas comprensibles por esta
# y las en5ia a un ser5idor #ue se encar*a de mandarlas a la HaGiLau*e.
import socPet3lient as sc
# direccion 9P del ser5idor
ser5erSost = 'localhost'
ser5erPort = %>>>>
';N= '"G>2'
<;N= '"G>3' # <nd o! ;eGt. =eset bu!!er.
3= = '"G>4' # 3arria*e =eturn.
L6 = '"G>)' # Line 6eed. Uetter don't send.
<:Y= '"G>%' # <n#uiry. =e#uest !o data transmission
)3V= '"G>6' # )cPnoOled*e.
:)V= '"GE%' # :o acPnoOled*e.
<'3= '"GEU' # <scape.
# 6unciones basicas
de! read7press(sensor)@
''' sensor es un 5alor de E a 6'''
# de5uel5e una tupla con el estado (tipo entero) y un 5alor (tipo !loat)
messa*e = ';N 0 'P=' 0 str(sensor) 0 3= 0 <:Y 0 3= 0 <;N
# socPet
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort -t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
i! ans == :)V@ return 'error'
ans = ans.strip(';N0<;N0'-'03=0L6).split('-')
return (int(ansC>D)- !loat(ansCED))
eGcept <Gception@
return 'corrupcion del mensa$e'

de! sensor7on(i)@
try@
i = i+E
lista = C'>'-'>'-'>'-'>'-'>'-'>'D
listaCiD = '2'
y=''
!or G in lista@
y 0= '-'0G
eGcept <Gception@
111
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
return '8ut o! ran*e'
messa*e = ';N 0 ''<:' 0 y 0 3= 0 <:Y 0 3= 0 <;N
try@
ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort -t8p=E- t8ut=E)
eGcept sc.socPet.timeout@
return 'timeout'
eGcept <Gception@
return 'socPet error'
# comprobacion de la respuesta
try@
ans = ans.strip(';N0<;N0'-'03=0L6).split('-')
i! ansC>D == :)V@
return ':)V'
eGcept <Gception@
return 'corrupcion del mensa$e'
return ans
112
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
maxiGaugeGui
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import maGiLau*eHodule as mG*
# 38:';):;<' LL8U)L<'
estado7sensor = C'8V'-'Wnd'-'85e'-'<rr'-'8!!'-':''-'9d<'D
# K)=9)UL<'
# Kariables *lobales
botones = /2 # diccionario de ob$etos *ra!icos- botones record- play- stop.
tabla = CD # lista de ob$etos *ra!icos- 5entanas de actualiMacion
acti5idad = /'play'@6alse- 'record'@6alse2 # bit- si 6alse => close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso
# 6unciones
de! repeater()@
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
tablaCdataC>DDC>D.con!i*(teGt=estado7sensorCdataCEDD)
tablaCdataC>DDC2D.con!i*(teGt=str(dataC2D))
Oinroot.a!ter(E>>- repeater) # llamada periodica
de! record()@
botonesC'record'D.con!i*(relie!='sunPen')
botonesC'play'D.con!i*(relie!='sunPen')
botonesC'record'D.con!i*(state='disabled'-b*='#d!!!')
botonesC'play'D.con!i*(state='disabled'- b*='#!d!!')
i! acti5idadC'record'D == ;rue@
pass
eli! acti5idadC'record'D == 6alse@
acti5idadC'record'D=;rue
acti5idadC'play'D=6alse
# lanMa el hilo
threadin*.;hread(tar*et=record7thread).start()
print('record')
de! record7thread()@
!ichero = open('maGiLau*e7data.tGt'- 'a')
!ichero.Orite('+++++ 9nicio de sesion +++++"n')
Ohile acti5idadC'record'D@
linea = ''
!or i in ran*e(E-B)@
try@
113
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ans = mG*.read7press(i)
(st- 5alor) = ans
eGcept <Gception@
pass
data#ueue.put((i-st-5alor))
#tablaCiDC>D.con!i*(teGt=estado7sensorCstD)
#tablaCiDC2D.con!i*(teGt=str(5alor))
linea 0= str(5alor) 0 '-'
!ichero.Orite(linea 0 str(time.time()) 0 '"n')
!ichero.!lush()
time.sleep(E)
!ichero.close()
de! play()@
botonesC'play'D.con!i*(relie!='sunPen')
botonesC'play'D.con!i*(state='disabled'- b*='#!d!!')
i! acti5idadC'play'D==;rue or acti5idadC'record'D== ;rue@
pass
eli! acti5idadC'play'D == 6alse@
acti5idadC'play'D=;rue
threadin*.;hread(tar*et=play7thread).start()
print('play')
de! play7thread()@
Ohile acti5idadC'play'D@
!or i in ran*e(E-B)@
try@
ans = mG*.read7press(i)
(st- 5alor) = ans
i! st==%@ 5alor ='++++'
data#ueue.put((i-st-5alor))
eGcept <Gception@
pass
#tablaCiDC>D.con!i*(teGt=estado7sensorCstD)
#tablaCiDC2D.con!i*(teGt=str(5alor))
time.sleep(E)
de! stop()@
botonesC'record'D.con!i*(relie!='raised')
botonesC'play'D.con!i*(relie!='raised')
botonesC'record'D.con!i*(state='normal'- b*='li*ht *rey')
botonesC'play'D.con!i*(state='normal'- b*='li*ht *rey')
acti5idadC'record'D=6alse
acti5idadC'play'D=6alse
print('stop')
de! init()@
''' <ncendido de los sensores de la maGi*au*e
'''
!or i in CE-2-3--%-6D@
try@
ans = mG*.sensor7on(i)
114
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
eGcept@
print('eGception')
# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
toolmenu = tP.Henu(menubar)
toolmenu.add7command(label='9nit'- command=notdone- underline=>)
toolmenu.add7command(label='Play'- command=notdone- underline=>)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
de! maPecommandbar(Oin)@
marco = tP.6rame(Oin)
marco.pacP()
boton7init = tP.Uutton(marco- teGt='9:9;'- command=init- Oidth=3)
boton7rec = tP.Uutton(marco- teGt='=<3'- command=record- Oidth=3)
boton7play = tP.Uutton(marco- teGt='PL)Z'- command=play- Oidth=3)
boton7stop = tP.Uutton(marco- teGt='';8P'- command=stop- Oidth=3)
boton7init.pacP(side='le!t')
boton7rec.pacP(side='le!t')
boton7play.pacP(side='le!t')
boton7stop.pacP(side='le!t')
return / 'init'@ boton7init-
'record'@ boton7rec-
'play'@ boton7play-
'stop'@ boton7stop2
de! maPetable(Oin)@
marco = tP.6rame(Oin)
marco.pacP()
# cabecera
115
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
titulo7status = tP.Label(marco- teGt='st'- relie!='!lat'-
Oidth=3- b*='bei*e')
titulo7sensor = tP.Label(marco- teGt='sensor'- relie!='!lat'-
Oidth=I- b*='bei*e')
titulo7data = tP.Label(marco- teGt='data'- relie!='!lat'-
Oidth=E3- b*='bei*e')
titulo7status.pacP(side='le!t')
titulo7sensor.pacP(side='le!t')
titulo7data.pacP(side='le!t')
# tabla
tabla = C(titulo7status- titulo7sensor- titulo7data)D
!or i in ran*e(E-60E)@
marco = tP.6rame(Oin)
marco.pacP()
status = tP.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3)
sensor = tP.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I)
data = tP.Label(marco- teGt='++++'- relie!='sunPen'- Oidth=E3)
status.pacP(side='le!t')
sensor.pacP(side='le!t')
data.pacP(side='le!t')
tabla.append((status- sensor- data))
return tabla
# 9:9398 P=8L=)H)
i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title('HaGiLau*e')
Oinroot.a!ter(E>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
botones = maPecommandbar(Oinroot)
tabla = maPetable(Oinroot)
# lanMamiento del sistema de e5entos
Oinroot.mainloop()
# cierre de hilos
acti5idadC'play'D=6alse
acti5idadC'record'D=6alse
116
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto Spellman
Primer dispositivo que aparece con conexin Et)ernet. Por lo que no se va a necesitar el programa
servidor que )aca de puente con el dispositivo serie.
sellman:odule. %dulo donde se recogen las instrucciones para operar con la !pellman.
sellam<ui. 0nter(az gr,(ica para monitorizar y actuar sobre la !pellman. Figura 8.
117
Figura 5. Interfaz grfica spellmaGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
spellmanModule
# spellmanHodule
# python 3
# modulo para en5iar comandos por socPets ;3P/9P
import sys
import socPet
import time
ser5erSost = 'EI2.E6J.E.'
ser5erSost = 'localhost' # 3oneGion serie
ser5erPort = %>>>>
';N = b'"G>2' # 'tart o! ;eGt character
<;N = b'"G>3' # <nd o! ;eGt character
'W33<'' = b'"G2' # caracter [
# ';N 0 3ommand 0 '-' 0 )r*umentos 0 '-' 0 <;N
# 6unciones basicas
de! conect()@
socPob$ect = socPet.socPet(socPet.)679:<;- socPet.'83V7';=<)H)
socPob$ect.settimeout(3)
socPob$ect.connect((ser5erSost- ser5erPort))
return socPob$ect
de! send(socPob$ect- byte7strin*)@
socPob$ect.send(byte7strin*)
de! recei5e(socPob$ect)@
data = b''
Ohile ;rue@
try@
data 0= socPob$ect.rec5(E>2)
eGcept socPet.timeout@
return data
i! <;N in data@
return data
de! close7socPet(socPob$ect)@
socPob$ect.close()
# 6unciones compuestas
de! command(cmd-ar*=:one)@
cmd = bytes(str(cmd)- encodin* = 'ascii')
i! ar* == :one@
messa*e = ';N 0 cmd 0 b'"G23' 0 <;N
else@
ar* = bytes(str(ar*)- encodin* = 'ascii')
messa*e = ';N 0 cmd 0 b'"G23' 0 ar* 0 b'"G23' 0 <;N
118
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
print('sendin*@'-messa*e)
try@
coneGion = conect()
time.sleep(>.>>E) # tiempo eGtra para crear la coneGion
send(coneGion-messa*e)
data = recei5e(coneGion)
i! (';N0cmd) in data@
data = dataCdata.!ind(';N0cmd)@D
i! <;N in data@
data = dataC@data.!ind(<;N)D
else@ data = b''
else@data = b''
eGcept <Gception@
data = b''
!inally@
close7socPet(coneGion)
print('recei5in*'-data)
return data
# 6unciones especi!icas
de! set74)3(i-n)@
''''et di*ital analo* con5erter
i=> Kolta*e- ar* is a inte*er = maG7K/>I6
i=E 3urrent- ar* is a inte*er = maG79/>I6'''
cmd = E>0i
ar* = n
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
eGcept <Gception@
return b''
de! re#uest74)3(i)@
'''=ed#uest di*ital analo* con5erter
i=> Kolta*e- ar* is a inte*er = maG7K/>I6
i=E 3urrent- ar* is a inte*er = maG79/>I6
return a tupla Oith command- 5alue'''
cmd = E0i
ar* = :one
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
eGcept <Gception@
return b''
de! analo*()@
'''=e#uest analo* inputs
return a tupla Oith command and B ar*s
ansC3D = 5olta*e- inte*er = maG7K/>I6
ansCD = current- inte*er = maG79/>I6'''
cmd = 2>
119
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ar* = :one
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED-ansC2D-ansC3D-ansCD-ansC%D-ansC6D-ansCBD
eGcept <Gception@
return b''
de! system()@
'''=e#uest system status
return a tupla Oith command- SK on/o!!- interlocP- !ault
ansCED Si*h Kolta*e on/o!!'''
cmd = 22
ar* = :one
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED-ansC2D-ansC3D
eGcept <Gception@
return b''
de! status()@
'''=e#uest di*ital input status
return a tupla Oith command and B ar*s
ansC3D remote on(E)/o!!(>)
ansCBD )=3'''
cmd = B6
ar* = :one
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return
ansC>D-ansCED-ansC2D-ansC3D-ansCD-ansC%D-ansC6D-ansCBD-ansCJD
eGcept <Gception@
return b''
de! remote7on()@
''';urn on remote mode
return a tupla Oith command code and error code ([=>oP)'''
cmd = J%
ar* = E
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
eGcept <Gception@
return b''
de! remote7o!!()@
''';urn o!! remote mode
return a tupla Oith command code and error code ([=>oP)'''
cmd = J%
ar* = >
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
120
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
eGcept <Gception@
return b''
de! h57on()@
''';urn on hi*h 5olta*e
return a tupla Oith command code and error code ([=>oP)'''
cmd = II
ar* = E
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
eGcept <Gception@
return b''
de! h57o!!()@
''';urn o!! hi*h 5olta*e
return a tupla Oith command code and error code ([=>oP)'''
cmd = II
ar* = >
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED
eGcept <Gception@
return b''
de! 5ersion()@
cmd = 2%
ar* = :one
command(cmd-ar*)
de! re#uest7netOorP7settin*s()@
cmd = %>
ar* = :one
try@
ans = command(cmd-ar*).strip(';N0<;N0b'-').split(b'-')
return ansC>D-ansCED-ansC2D-ansC3D-ansCD-ansC%D-ansC6D
eGcept <Gception@
return b''
de! set7netOorP7settin*s(name-ip-port-masP-*ateOay-H)3)@
'''3han*e the netOorP settin*s.
;aPe 6 strin*s ar*s@
4e5ice :ame
=emote )ddress
=emote Port
'ubnet HasP
4e!ault LateOay
H)3 )ddress
Wse re#uest7netOorP7settin*s() to see 5alues.
Wse str(b'777'- encodin*='ascii') to !eed parameters'''
cmd = %E
try@
121
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ar* = name 0'-'0 ip 0'-'0 port 0'-'0 masP 0'-'0 *ateOay 0'-'0 H)3
command(cmd-ar*)
eGcept <Gception@
return b''
de! set7ip(ip)@
cmd = %E
ar* = re#uest7netOorP7settin*s()
ar* = C str(G-encodin*='ascii') !or G in ar* D
print( '8ld settin*s@ '- ar*)
ar*C2D=ip
print( ':eO settin*s@ '- ar*)
ar* = ar*CED 0'-'0 ar*C2D 0'-'0 ar*C3D 0'-'0 ar*CD 0'-'0 ar*C%D 0'-'0
ar*C6D
command(cmd-ar*)
122
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
spellmanGui
# spellmanLui
# python 3
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import spellmanHodule as spll
#import alerta7correo as alerta
# 38:';):;<' LL8U)L<'
maG7K=%< #%>.>>>->> K
coe!7K=maG7K/>I%
maG79=>.6 #>.6 m)
coe!79=maG79/>I%
# K)=9)UL<'
alerta7acti5a = 6alse
# Kariables *lobales
botones = /2 # diccionario de ob$etos *ra!icos Uutton. record- play- stop.
labels = /2 # diccionario de ob$etos *ra!icos Labels- campos a actualiMar.
dialo*os = /2
acti5idad = /'connected'@6alse- 'sa5e'@6alse- 'remote'@6alse2 # boolean- i! 6alse
=> close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso en eGclusi(n mutua
# 6unciones
de! init()@
'''9nicialiMa el pro*rama'''
# try connection
acti5idadC'connected'D=;rue
readin*()
de! repeater()@
''')ctualiMacion periodica'''
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
labelsCdataC>DD.con!i*(teGt=dataCED)
Oinroot.a!ter(E>>- repeater) # pro*ramar nue5a llamada
de! readin*()@
threadin*.;hread(tar*et=readin*7thread).start()
123
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

de! readin*7thread()@
hi*h75olta*e7anterior = >
Ohile acti5idadC'connected'D@
ans = spll.analo*()
i! ans Q= b''@
5olta*e = int(ansC3D).coe!7K
current = int(ansCD).coe!79
data#ueue.put(('5olta*e'-'?>%i' ? 5olta*e)) #E
data#ueue.put(('current'-'?>6.%!' ? current)) #2
ans = spll.system()
i! ans Q= b''@
hi*h75olta*e = str(int(ansCED))
data#ueue.put(('h5'- hi*h75olta*e)) #3
i! (hi*h75olta*e7anterior == 'E') and (hi*h75olta*e == '>')@
print ('====3)HU98===='-alerta7acti5a)
i! alerta7acti5a == ;rue@
threadin*.;hread(tar*et=alerta.send7email).start()
hi*h75olta*e7anterior = hi*h75olta*e
ans = spll.status()
i! ans Q= b''@
remote = str(int(ansC3D))
arc = str(int(ansCJD))
data#ueue.put(('remote'-remote)) #
data#ueue.put(('arc'- arc)) #%
ans = spll.re#uest74)3(>)
i! ans Q= b''@
5olta*e7dac = int(ansCED).coe!7K
data#ueue.put(('5olta*e7dac'-'?%i' ?5olta*e7dac))#6
ans = spll.re#uest74)3(E)
i! ans Q= b''@
current7dac = int(ansCED).coe!79
data#ueue.put(('current7dac'-'?>6.%!' ?current7dac))#B
time.sleep(E)
de! remote7on()@
threadin*.;hread(tar*et=remote7on7thread).start()
de! remote7on7thread()@
ans = spll.remote7on()

de! remote7o!!()@
threadin*.;hread(tar*et=remote7o!!7thread).start()
de! remote7o!!7thread()@
ans = spll.remote7o!!()
de! h57on()@
threadin*.;hread(tar*et=h57on7thread).start()
de! h57on7thread()@
ans = spll.h57on()
de! h57o!!()@
124
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
threadin*.;hread(tar*et=h57o!!7thread).start()
de! h57o!!7thread()@
ans = spll.h57o!!()
de! dialo*7chan*e75olta*e7dac()@
de! push7dac()@
5alor = dialo*o.*et()
chan*e75olta*e7dac(5alor)
popup.destroy()
popup = tP.;ople5el()
dialo*o = tP.<ntry(popup)
dialo*o.pacP(side='top')
tP.Uutton(popup- teGt='3ancel'- command=popup.destroy).pacP(side='le!t')
tP.Uutton(popup- teGt = ')pply'-command=push7dac).pacP(side='ri*ht')
de! chan*e75olta*e7dac(5alor)@
threadin*.;hread(tar*et=chan*e75olta*e7dac7thread-ar*s=(5alor-)).start()
print ('3S):L9:L 4)3QQQQQQQQQQQ')
de! chan*e75olta*e7dac7thread(5alor)@
try@
5alor = int(5alor)
eGcept@
pass
print('P)''''''')
else@
i! (5alor >= >) and (5alor F (>I%.coe!7K))@
5alor = int(5alor/coe!7K)
print('...............'-5alor)
spll.set74)3(>-5alor)
de! dialo*7chan*e7current7dac()@
de! push7dac()@
5alor = dialo*o.*et()
chan*e7current7dac(5alor)
popup.destroy()
popup = tP.;ople5el()
dialo*o = tP.<ntry(popup)
dialo*o.pacP(side='top')
tP.Uutton(popup- teGt='3ancel'- command=popup.destroy).pacP(side='le!t')
tP.Uutton(popup- teGt = ')pply'-command=push7dac).pacP(side='ri*ht')
de! chan*e7current7dac(5alor)@
threadin*.;hread(tar*et=chan*e7current7dac7thread-ar*s=(5alor-)).start()
print ('3S):L9:L 4)3QQQQQQQQQQQ')
de! chan*e7current7dac7thread(5alor)@
print('5alor de entrada'-type(5alor))
try@
5alor = !loat(5alor)
print(5alor)
eGcept@
pass
print('P)''''''')
else@
i! (5alor >= >) and (5alor F (>I%.coe!79))@
125
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
5alor = int(5alor/coe!79)
print('............... 3W==<:;'-5alor)
spll.set74)3(E-5alor)
de! alerta7correo7on()@
*lobal alerta7acti5a
alerta7acti5a = ;rue
de! alerta7correo7o!!()@
*lobal alerta7acti5a
alerta7acti5a = 6alse
# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
toolmenu = tP.Henu(menubar)
toolmenu.add7command(label=')lerta correo on'- command=alerta7correo7on)
toolmenu.add7command(label=')lerta correo o!!'- command=alerta7correo7o!!)
toolmenu.add7command(label='=emote on'- command=remote7on)
toolmenu.add7command(label='=emote o!!'- command=remote7o!!)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
de! maPeh5bar(Oin- botones- labels)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
eti#ueta7teGt = tP.Label(marco- teGt=' SK @ '-Oidth=E>)
eti#ueta = tP.Label(marco- teGt=' ++ '-Oidth=%)
boton7h57on = tP.Uutton(marco- teGt='8:'- command=h57on- Oidth=3)
boton7h57o!!= tP.Uutton(marco- teGt='866'-command=h57o!!- Oidth=3)
eti#ueta7teGt.pacP(side='le!t')
eti#ueta.pacP(side='le!t')
boton7h57on.pacP(side='le!t')
126
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
boton7h57o!!.pacP(side='le!t')
labelsC'h5'D=eti#ueta
botonesC'h57on'D=boton7h57on
botonesC'h57o!!'D=boton7h57o!!
return botones- labels
de! maPeremotebar(Oin- botones- labels)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
eti#ueta7teGt = tP.Label(marco- teGt=' =<H8;< @ '-Oidth=E>)
eti#ueta = tP.Label(marco- teGt=' ++ '-Oidth=%)
boton7remote7on = tP.Uutton(marco- teGt='8:'- command=remote7on- Oidth=3)
boton7remote7o!!= tP.Uutton(marco- teGt='866'-command=remote7o!!- Oidth=3)
eti#ueta7teGt.pacP(side='le!t')
eti#ueta.pacP(side='le!t')
boton7remote7on.pacP(side='le!t')
boton7remote7o!!.pacP(side='le!t')
labelsC'remote'D=eti#ueta
botonesC'remote7on'D=boton7remote7on
botonesC'remote7o!!'D=boton7remote7o!!
return botones- labels
de! maPetable(Oin)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
# !ilas
marcoE = tP.6rame(marco)
marcoE.pacP()
marco2 = tP.6rame(marco)
marco2.pacP()
marco3 = tP.6rame(marco)
marco3.pacP()
5olta*e7teGt = tP.Label(marcoE- teGt='Kolta*e(K) @ '- Oidth=E)
5olta*e7label = tP.Label(marcoE- teGt='Kolta*e'- Oidth=E2)
current7teGt = tP.Label(marco2- teGt='3urrent(m))@ '- Oidth=E)
current7label = tP.Label(marco2- teGt='3urrent'- Oidth=E2)
arc7teGt = tP.Label(marco3- teGt=')rc @ '- Oidth=E)
arc7label = tP.Label(marco3- teGt=')rc'- Oidth=E2)
5olta*e7teGt.pacP(side='le!t')
5olta*e7label.pacP(side='le!t')
current7teGt.pacP(side='le!t')
current7label.pacP(side='le!t')
arc7teGt.pacP(side='le!t')
arc7label.pacP(side='le!t')
diccionario7labels=/2
diccionario7labelsC'5olta*e'D=5olta*e7label
diccionario7labelsC'current'D=current7label
diccionario7labelsC'arc'D=arc7label
return diccionario7labels
de! maPedac(Oin- botones- labels)@
127
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
marco = tP.6rame(Oin)
marco.pacP(side='bottom')
marcoE = tP.6rame(marco)
marcoE.pacP()
marco2 = tP.6rame(marco)
marco2.pacP()
5olta*e7dac7teGt= tP.Label(marcoE- teGt='Kolta*e 4)3(K) @ '- Oidth=E)
5olta*e7dac = tP.Label(marcoE- teGt='++++'- Oidth=J)
5olta*e7dac7teGt.pacP(side='le!t')
5olta*e7dac.pacP(side='le!t')
boton75olta*e7dac = tP.Uutton(marcoE- teGt='3S):L<'-
command=dialo*7chan*e75olta*e7dac- Oidth=)
boton75olta*e7dac.pacP(side='le!t')
current7dac7teGt= tP.Label(marco2- teGt='3urrent 4)3(m))@ '- Oidth=E)
current7dac = tP.Label(marco2- teGt='++++'- Oidth=J)
current7dac7teGt.pacP(side='le!t')
current7dac.pacP(side='le!t')
boton7current7dac = tP.Uutton(marco2- teGt='3S):L<'-
command=dialo*7chan*e7current7dac- Oidth=)
boton7current7dac.pacP(side='le!t')
labelsC'5olta*e7dac'D=5olta*e7dac
labelsC'current7dac'D=current7dac
botonesC'5olta*e7dac'D=boton75olta*e7dac
botonesC'current7dac'D=boton7current7dac
return botones- labels
# 9:9398 P=8L=)H)
i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title(''pellman')
Oinroot.a!ter(E>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
topmarco=tP.6rame()
topmarco.pacP()
botones- labels = maPeh5bar(topmarco- botones- labels)
botones- labels = maPeremotebar(topmarco- botones- labels)
labels.update(maPetable(Oinroot))
botones- labels = maPedac(Oinroot- botones- labels)
# lanMamiento del sistema de e5entos
init()
Oinroot.mainloop()
# cierre de hilos
acti5idadC'connected'D=6alse
acti5idadC'record'D=6alse
128
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
Conjunto CAEN
En este equipo se usa una biblioteca C a la que accedemos usando ctypes.
caen:odule. %dulo con instrucciones que llaman a (unciones C usando ctypes para
comunicarse con el equipo C'E?.
caen<ui. 0nter(az gr,(ica para operar con el eqeuipo C'E?. Figura 9.
129
Figura 6. Interfaz grfica caenGui
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
caenModule
# caenHodule
# python 3
# Hodulo con instrucciones para 3)<:
import ctypes
path = './G6/libcaenh5Orapper.so.%.2>' # lu*ar de la biblioteca
path = './libcaenh5Orapper.so.%.2>' # lu*ar de la biblioteca
lib3aen = ctypes.cdll.LoadLibrary(path)
# 5ariables
slot = 3
# <stablecimiento de la coneGion
# 4e5uel5e un entero #ue reco*e el estado de la coneGion
# int 3)<:SK9nit'ystem(
# const char .'ystem:ame- //in
# int LinP;ype- //in
# char .)r*- //in
# const char .Wser:ame- //in
# const char .PassOord //in
# )1
7init'ystem = lib3aen.3)<:SK9nit'ystem
7init'ystem.ar*types = (
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7int-
ctypes.P89:;<=(ctypes.c7char)-
ctypes.P89:;<=(ctypes.c7char)-
ctypes.P89:;<=(ctypes.c7char)
)
7init'ystem.restype = (ctypes.c7int)
de! init'ystem( system:ame = b''ystem2'-
linP;ype = >-
adress = b'EI2.E6J.>.E32'-
user:ame = b'admin'-
passOord = b'admin')@
return 7init'ystem(system:ame- linP;ype- adress- user:ame- passOord)
# 4einit'ystem
7deinit'ystem = lib3aen.3)<:SK4einit'ystem
7deinit'ystem.ar*types = (
ctypes.P89:;<=(ctypes.c7char)-
)
7deinit'ystem.restype = (ctypes.c7int)
de! deinit'ystem( system:ame = b''ystem2')@
return 7deinit'ystem(system:ame)
130
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
# int 3)<:SK'et3hParam(
# const char .'ystem:ame- //in
# unsi*ned short slot- //in
# const char .Parname- //in
# unsi*ned short 3h:um- //in
# cnst uns* short .3hList- //in
# const char .ParKalue //in
de! 'et3hParam( system:ame-
slot-
par:ame-
ch:um-
chList-
parKalue)@
# de!inicion de los tipos de entrada
7'et3hParam= lib3aen.3)<:SK'et3hParam
7'et3hParam.ar*types = (
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7ushort)-
ctypes.P89:;<=(ctypes.c7!loat)
)
7'et3hParam.restype = (ctypes.c7int)
# con5ersion de los parametros de entrada
system:ame = ctypes.c7char7p(system:ame)
slot = ctypes.c7ushort(slot)
par:ame = ctypes.c7char7p(par:ame)
ch:um = ctypes.c7ushort(ch:um)
chList = (ctypes.c7ushort.len(chList))(.chList)
#chList = (ctypes.c7ushort.len(chList))(.chList)
#chList = ctypes.c7ushort()
#print(chList)
parKalue = ctypes.c7!loat(parKalue)
return 7'et3hParam(system:ame- slot- par:ame- ch:um- chList- parKalue)
# int 3)<:SKLet3hParam(
# const char .'ystem:ame- //in
# unsi*ned short slot- //in
# const char .Parname- //in
# unsi*ned short 3h:um- //in
# cnst uns* short .3hList- //in
# const char .ParKalList //out
de! Let3hParam( system:ame-
slot-
par:ame-
ch:um-
chList)@
7Let3hParam= lib3aen.3)<:SKLet3hParam
7Let3hParam.ar*types = (
ctypes.P89:;<=(ctypes.c7char)-
131
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7ushort)-
ctypes.P89:;<=(ctypes.c7!loat)
)
7Let3hParam.restype = (ctypes.c7int)
system:ame = ctypes.c7char7p(system:ame)
slot = ctypes.c7ushort(slot)
par:ame = ctypes.c7char7p(par:ame)
ch:um = ctypes.c7ushort(ch:um)
chList = (ctypes.c7ushort.len(chList))(.chList)
parKalue = (ctypes.c7!loat.ch:um.5alue)()
return( 7Let3hParam(system:ame- slot- par:ame- ch:um- chList-
parKalue)-
CparKalueCiD !or i in ran*e(ch:um.5alue)D )
# int 3)<:SK'et3hParam(
# const char .'ystem:ame- //in
# unsi*ned short slot- //in
# const char .Parname- //in
# unsi*ned short 3h:um- //in
# cnst u short .3hList- //in
# const int .ParKalue //in #boolean
de! 'et3hUool( system:ame-
slot-
par:ame-
ch:um-
chList-
parKalue)@
7'et3hUool= lib3aen.3)<:SK'et3hParam
7'et3hUool.ar*types = (
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7char)-
ctypes.c7ushort-
ctypes.P89:;<=(ctypes.c7ushort)-
ctypes.P89:;<=(ctypes.c7int)
)
7'et3hUool.restype = (ctypes.c7int)
system:ame = ctypes.c7char7p(system:ame)
slot = ctypes.c7ushort(slot)
par:ame = ctypes.c7char7p(par:ame)
ch:um = ctypes.c7ushort(ch:um)
chList = (ctypes.c7ushort.len(chList))(.chList)
parKalue = ctypes.c7int(parKalue)
return 7'et3hUool(system:ame- slot- par:ame- ch:um- chList- parKalue)
# 6unciones especi!icas
de! init()@
'''3oneGion a la 3)<:
>G> no hay error'''
132
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
return init'ystem()
de! out()@
'''4esconeGion'''
return deinit'ystem()
de! setK(n-G)@
'''6i$a el 5alor de 5olta$e del canal n en G
ch:um es el numero de canales pasados en chList'''
return 'et3hParam(b''ystem2'- slot- b'K>'et'- E- CnD- G)
de! set9(n-G)@
'''6i$a el 5alor de la intensidad del canal n en G'''
return 'et3hParam(b''ystem2'- slot- b'9>'et'- E- CnD- G)
de! *etK(n)@
return Let3hParam(b''ystem2'- slot- b'K>'et'- E- CnD )
de! *et9(n)@
return Let3hParam(b''ystem2'- slot- b'9>'et'- E- CnD )
de! *etKHon(n)@
return Let3hParam(b''ystem2'- slot- b'KHon'- E- CnD )
de! *et9Hon(n)@
return Let3hParam(b''ystem2'- slot- b'9Hon'- E- CnD )
de! on(n)@
return 'et3hUool(b''ystem2'- slot- b'PO'- E- CnD- E )
de! o!!(n)@
return 'et3hUool(b''ystem2'- slot- b'PO'- E- CnD- > )
133
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
caenGui
# caenLui
# python 3
# inter!aM *ra!ica para 3)<:
import tPinter as tP
import tPinter.messa*eboG as tPm
import threadin*- #ueue- time
import caenHodule as caen
# 38:';):;<' LL8U)L<'
# K)=9)UL<'
# Kariables *lobales
botones = /2 # diccionario de ob$etos *ra!icos Uutton. record- play- stop.
labels = /2 # diccionario de ob$etos *ra!icos Labels- campos a actualiMar.
dialo*os = /2
acti5idad = /'run'@;rue- 'connected'@6alse- 'sa5e'@6alse- 'remote'@6alse2 #
boolean- i! 6alse => close thread
data#ueue = #ueue.Yueue() # 3ola de datos de acceso en eGclusi(n mutua
caen.slot =3
canal = %
# 6unciones
de! repeater()@
''')ctualiMacion periodica'''
try@
data = data#ueue.*et(blocP=6alse)
eGcept #ueue.<mpty@
pass
else@
# actualiMar LW9
labelsCdataC>DD.con!i*(teGt=dataCED)
Oinroot.a!ter(E>>- repeater) # pro*ramar nue5a llamada
de! readin*()@
threadin*.;hread(tar*et=readin*7thread).start()
de! readin*7thread()@
Ohile acti5idadC'run'D@
i! acti5idadC'connected'D@
try@
ans = caen.*etK(canal)
data#ueue.put(('5olta*e>'-'?.E!' ? (ansCEDC>D)))
time.sleep(>.%)
ans = caen.*et9(canal)
data#ueue.put(('current>'-'?.E!' ? (ansCEDC>D)))
time.sleep(>.%)
134
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
ans = caen.*etKHon(canal)
data#ueue.put(('5olta*e'-'?.E!' ? (ansCEDC>D)))
time.sleep(>.%)
ans = caen.*et9Hon(canal)
data#ueue.put(('current'-'?.E!' ? (ansCEDC>D)))
time.sleep(>.%)
eGcept <Gception@
pass
else@
time.sleep(>.%)
de! remote7on()@
# threadin*.;hread(tar*et=remote7on7thread).start()
#de! remote7on7thread()@
try@
ans = caen.init()
i! ans == >@
data#ueue.put(('remote'- 'on'))
acti5idadC'connected'D=;rue
else@
data#ueue.put(('remote'- 'err'))
eGcept <Gception@
pass

de! remote7o!!()@
# threadin*.;hread(tar*et=remote7o!!7thread).start()
#de! remote7o!!7thread()@
try@
ans = caen.out()
i! ans == >@
data#ueue.put(('remote'- 'o!!'))
acti5idadC'connected'D=6alse
else@
data#ueue.put(('remote'- 'err'))
eGcept <Gception@
pass
de! canal7on()@
# threadin*.;hread(tar*et=canal7on7thread).start()
#de! canal7on7thread()@
try@
ans = caen.on(canal)
i! ans == >@
data#ueue.put(('canal'- 'on'))
else@
pass
eGcept <Gception@
pass
de! canal7o!!()@
# threadin*.;hread(tar*et=canal7o!!7thread).start()
135
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
#de! canal7o!!7thread()@
try@
ans = caen.o!!(canal)
i! ans == >@
data#ueue.put(('canal'- 'o!!'))
else@
pass
eGcept <Gception@
pass
de! dialo*7chan*e75olta*e()@
de! push()@
5alor = dialo*o.*et()
chan*e75olta*e(5alor)
popup.destroy()
popup = tP.;ople5el()
dialo*o = tP.<ntry(popup)
dialo*o.pacP(side='top')
tP.Uutton(popup- teGt='3ancel'- command=popup.destroy).pacP(side='le!t')
tP.Uutton(popup- teGt = ')pply'-command=push).pacP(side='ri*ht')
de! chan*e75olta*e(5alor)@
threadin*.;hread(tar*et=chan*e75olta*e7thread-ar*s=(5alor-)).start()
de! chan*e75olta*e7thread(5alor)@
try@
5alor = int(5alor)
eGcept@
pass
else@
i! ((5alor >= >) and (5alor F E>>>>))@
try@
caen.setK(canal-5alor)
eGcept <Gception@
pass
de! dialo*7chan*e7current()@
de! push()@
5alor = dialo*o.*et()
chan*e7current(5alor)
popup.destroy()
popup = tP.;ople5el()
dialo*o = tP.<ntry(popup)
dialo*o.pacP(side='top')
tP.Uutton(popup- teGt='3ancel'- command=popup.destroy).pacP(side='le!t')
tP.Uutton(popup- teGt = ')pply'-command=push).pacP(side='ri*ht')
de! chan*e7current(5alor)@
threadin*.;hread(tar*et=chan*e7current7thread-ar*s=(5alor-)).start()
de! chan*e7current7thread(5alor)@
try@
5alor = !loat(5alor)
eGcept@
pass
else@
136
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
i! ((5alor >= >) and (5alor F E>>>>))@
try@
caen.set9(canal-5alor)
eGcept <Gception@
pass
# 4e!inicion de las 5entanas
de! notdone()@
tPm.shoOerror(':8 implementado'- ':8 disponible."n<n desarrollo')
de! maPemenu(Oin)@
menubar = tP.Henu(Oin)
Oin.con!i*(menu=menubar)
!ilemenu = tP.Henu(menubar)
!ilemenu.add7command(label=''a5e...'- command=notdone- underline=>)
!ilemenu.add7command(label=''a5e as'- command=notdone- underline=>)
!ilemenu.add7separator()
!ilemenu.add7command(label='Yuit...'- command=Oin.#uit-underline=>)
menubar.add7cascade(label='6ile'- menu=!ilemenu- underline=>)
editmenu = tP.Henu(menubar)
editmenu.add7command(label='Pre!erences'- command=notdone)
menubar.add7cascade(label='<dit'- menu=editmenu- underline=>)
toolmenu = tP.Henu(menubar)
toolmenu.add7command(label='=emote on'- command=remote7on)
toolmenu.add7command(label='=emote o!!'- command=remote7o!!)
menubar.add7cascade(label=';ools'- menu=toolmenu- underline=>)
helpmenu = tP.Henu(menubar)
helpmenu.add7command(label=')bout'-command=notdone)
menubar.add7cascade(label='Selp'- menu=helpmenu- underline=>)
de! maPecanalbar(Oin- botones- labels)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
eti#ueta7teGt = tP.Label(marco- teGt=' 3):)L @ '-Oidth=E>)
eti#ueta = tP.Label(marco- teGt=' ++ '-Oidth=%)
boton7canal7on = tP.Uutton(marco- teGt='8:'- command=canal7on- Oidth=3)
boton7canal7o!!= tP.Uutton(marco- teGt='866'-command=canal7o!!- Oidth=3)
eti#ueta7teGt.pacP(side='le!t')
eti#ueta.pacP(side='le!t')
boton7canal7on.pacP(side='le!t')
boton7canal7o!!.pacP(side='le!t')
labelsC'canal'D=eti#ueta
botonesC'canal7on'D=boton7canal7on
botonesC'canal7o!!'D=boton7canal7o!!
return botones- labels
137
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.

de! maPeremotebar(Oin- botones- labels)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
eti#ueta7teGt = tP.Label(marco- teGt=' =<H8;< @ '-Oidth=E>)
eti#ueta = tP.Label(marco- teGt=' ++ '-Oidth=%)
boton7remote7on = tP.Uutton(marco- teGt='8:'- command=remote7on- Oidth=3)
boton7remote7o!!= tP.Uutton(marco- teGt='866'-command=remote7o!!- Oidth=3)
eti#ueta7teGt.pacP(side='le!t')
eti#ueta.pacP(side='le!t')
boton7remote7on.pacP(side='le!t')
boton7remote7o!!.pacP(side='le!t')
labelsC'remote'D=eti#ueta
botonesC'remote7on'D=boton7remote7on
botonesC'remote7o!!'D=boton7remote7o!!
return botones- labels
de! maPetable(Oin)@
marco = tP.6rame(Oin)
marco.pacP(side='le!t')
# !ilas
marcoE = tP.6rame(marco)
marcoE.pacP()
marco2 = tP.6rame(marco)
marco2.pacP()
marco3 = tP.6rame(marco)
marco3.pacP()
5olta*e7teGt = tP.Label(marcoE- teGt='Kolta*e(K) @ '- Oidth=E- hei*ht=2)
5olta*e7label = tP.Label(marcoE- teGt='+++'- Oidth=E2)
current7teGt = tP.Label(marco2- teGt='3urrent(u))@ '- Oidth=E- hei*ht=2)
current7label = tP.Label(marco2- teGt='+++'- Oidth=E2)
5olta*e7teGt.pacP(side='le!t')
5olta*e7label.pacP(side='le!t')
current7teGt.pacP(side='le!t')
current7label.pacP(side='le!t')
diccionario7labels=/2
diccionario7labelsC'5olta*e'D=5olta*e7label
diccionario7labelsC'current'D=current7label
return diccionario7labels
de! maPedac(Oin- botones- labels)@
marco = tP.6rame(Oin)
marco.pacP(side='bottom')
marcoE = tP.6rame(marco)
marcoE.pacP()
marco2 = tP.6rame(marco)
marco2.pacP()
5olta*e>7teGt= tP.Label(marcoE- teGt='Kolta*e > (K) @ '- Oidth=E-
hei*ht=2)
5olta*e> = tP.Label(marcoE- teGt='++++'- Oidth=J)
5olta*e>7teGt.pacP(side='le!t')
5olta*e>.pacP(side='le!t')
138
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
boton75olta*e> = tP.Uutton(marcoE- teGt='3S):L<'-
command=dialo*7chan*e75olta*e- Oidth=)
boton75olta*e>.pacP(side='le!t')
current>7teGt= tP.Label(marco2- teGt='3urrent > (u))@ '- Oidth=E-
hei*ht=2)
current> = tP.Label(marco2- teGt='++++'- Oidth=J)
current>7teGt.pacP(side='le!t')
current>.pacP(side='le!t')
boton7current> = tP.Uutton(marco2- teGt='3S):L<'-
command=dialo*7chan*e7current- Oidth=)
boton7current>.pacP(side='le!t')
labelsC'5olta*e>'D=5olta*e>
labelsC'current>'D=current>
botonesC'5olta*e>'D=boton75olta*e>
botonesC'current>'D=boton7current>
return botones- labels
# 9:9398 P=8L=)H)
i! 77name77=='77main77'@
Oinroot = tP.;P()
Oinroot.title('3aen')
Oinroot.a!ter(E>>-repeater) # actualiMacion de la LW9
maPemenu(Oinroot)
topmarco=tP.6rame()
topmarco.pacP()
botones- labels = maPecanalbar(topmarco- botones- labels)
botones- labels = maPeremotebar(topmarco- botones- labels)
labels.update(maPetable(Oinroot))
botones- labels = maPedac(Oinroot- botones- labels)
readin*()
# lanMamiento del sistema de e5entos
Oinroot.mainloop()
# cierre de hilos
acti5idadC'connected'D=6alse
acti5idadC'record'D=6alse
actividadHMrunMI R False
139
Desarrollo e implantacin de un sistema de adquisicin de datos y monitorizacin para
un sistema de deteccin de materia oscura.
140

You might also like