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
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! 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
# +++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! 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
# +++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! 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
# +++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)
# +++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