Proyecto Fin de Carrera
Desarrollo Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura Autor
Alberto Peiró Val
Director
José Ramón Asensio Diago
Escuela de ngenier!a y Arquitectura "#$% Repositorio de la Universidad de Zaragoza – Zaguan http://zaguan. http://zaguan.unizar unizar.es .es
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
2
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
DESARROLLO E IMPLANTACIÓN DE UN SISTEMA DE ADQUISICIÓN DE DATOS Y MONITARIZACIÓN PARA UN SISTEMA DE DETECCIÓN DE MATERIA OSCURA
RESUMEN El proyec proyecto to consist consiste e en realiz realizar ar un sistem sistema a de adquis adquisició ición n de datos datos para para los experimentos de detección de materia oscura que se llevan ll evan a cabo en la Facultad de Ciencias de Zaragoza. Para este caso, caso, por sus carac caracter teríst ística icas, s, se plante plantea a una solución solución 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 progr programa amass para para el micro1 micro1con contro trolad lador or 'rduin 'rduino, o, estos estos 2ltimo 2ltimoss en C, para para la digitalización de las se3ales, comunicación, y control en bucle abierto de un motor paso a paso.
1 2
Single Single Board Board Comput Computer. er. Single Board Microcontrol Microcontroller. ler.
3
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
4
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ÍNDICE #. 0ntroducción. Problema a resolver
7
&. Estructura 4ard+are
10
&.# 'nlisis de los equipos &.& 'rquitectura de la solución 6. Estructura !o(t+are 6.# !o(t+are y lenguae de programación
#5 #5 13
#6
6.& 0nter(az gr(ica
#6
6.6 %ódulos Pyt)on
#7
6.7 Comunicación por soc-ets CP/0P 6.8 Comunicación serie
#8 #8
6.9 :igitalización 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(ormación de los equipos
25
'nexo &. Presentación previa de opciones para el sistema de adquisición y monitorización
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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
6
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
MEMORIA 1. INTRODUCCIÓN. Problema a resolver El proyecto, como el título adelanta, consiste en construir un sistema de adquisición de datos para los experimentos de detección de materia oscura que se realizan en la Facultad de Ciencias de Zaragoza= en concreto, por el >aboratorio de Física ?uclear y 'stropartículas. 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 arcía 0rastorza. !u obetivo principal es la consolidación de las actividades del grupo en PCs Aime 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 construcción de una PC con %icromegas para la detección de %ateria scura con un bao umbral de energía y un bao nivel de (ondo. El montae, (igura #, consta de una carcasa cilíndrica 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 partículas buscadas interaccionando creando pares
7
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
electrón1ión 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 energía depositada y datos que permiten la reconstrucción de la trayectoria de la partícula inicial. >o que se desea es monitorizar las variables (ísicas en las que el experimento se desarrolla Apresión, temperatura, campo el*ctricoB, adems 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 tensión, caudalímetros, un vacuómetro, un manómetro y un termómetro. Objetivos.
>as características que debía tener el sistema de adquisición de datos (ueron (iadas por consenso con los encargados del experimento tras una presentación en la que se expusieron distintas soluciones. En *stas se consideraron desde usar un PC con taretas PC0, pasando por >abie+ con los módulos de )ard+are de ?ational 0nstruments, )asta P>Cs con un sistema !C':'. er 'nexo #. Finalmente, con esta in(ormación y teniendo en cuenta las restricciones en cuanto a tiempo de respuesta y resolución, se decidió construir conuntos con !"C $aspb erry 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 AD0B, 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 AD0B. 0gual de (cil es conectar al sistema un nuevo equipo similar. Como lenguae de programación se escogió Pyt)on, por ser un lenguae sencillo y de alto nivel que permite a cualquier usuario modi(icarlo y adaptarlo rpida 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 crítico, se intenta que este sea lo ms 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, programación con tratamiento de excepciones y, adems, 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 anlisis de los equipos centrndonos en los tipos de conexión disponibles y en su inmunidad al ruido. Con esta in(ormación, de(inimos los conuntos de $aspberry Pi y 'rduino que )acen de inter(az con la red Et)ernet. >a segunda sección, ms extensa, trata del so(t+are necesario para conseguir la integración de los equipos en la red. Este constaría de las siguiente partes dependiendo del tipo de conexión existente en el equipo. G Dna inter(az gr(ica de usuario que usa )ilos de eecución para evitar bloqueos en la aplicación y una cola F0F a la que se accede en exclusión mutua para organizar la 8
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
9
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 estn 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 módulo Ctypes que permite usar las (unciones C de bibliotecas de enlace dinmico, proporcionadas por el (abricante, directamente desde Pyt)on. G Dso de soc-ets CP/0P para la comunicación Et)ernet G Dn programa servidor que )ace de puente con la conexión serie. G Programas para el micro1controlador 'rduino que realizan las tareas de digitalización de las se3ales, comunicación, y de control en bucle abierto del motor paso a paso.
2. ESTRUCTURA HARDWARE 2.1 Análisis de los equipos Empezamos por )acer un anlisis de los tipos de conexión disponibles en los equipos involucrados en el experimento. 'sí, teniendo presente la tabla #, que recoge las características de cada conexión, construimos la parte sombreada en gris de la (igura 6 en la que aparece el equipo, su (unción, y el tipo de conexión ms con(iable disponible. Entendiendo por con(iable la ms inmune al ruido, y por tanto ms segura y menos propensa a la aparición de errores. $esumiendo, seg2n la tabla &, escogeremos como primera opción Et)ernet, seguida de D!", $!&6& y, (inalmente, la conexión analógica. Comunicación
nmunidad
longitud
Et&ernet
Encapsulamiento inform. + comprobación CRC
Depende del tipo de medio físico
'()
Señal diferencial
1600m
R("%"
Nieles de olta!e
"m típico
Analógica
Nin#uno
Tabla 1: Análisis de inmunidad al ruido del protocolo de comunicación.
Para una in(ormación ms detallada de los equipos se puede consultar el anexo &.
2.2 Arquitectura de la solución !intetizando, la solución, 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 creación de los bloques, describimos brevemente qu* es un !"C $aspberry Pi y un !"% 'rduino. 10
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
11
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 (undación $aspberry Pi H#I, cuyos miembros estn de alg2n modo relacionados con la empresa "roadcom.
Figura 4. Raspberry pi
Figura 5. Arduino
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 digitalización con una resolución de #5 bits, que es su(iciente para lo que se requería, y dos salidas PK% APulse Kit) %odulation. olviendo a la tarea de crear los conuntos , vemos en la (igura 6 que ya )ay dos equipos, !pellman y Caen, que ya vienen con conexión Et)ernet, por lo que no necesitarn ning2n dispositivo extra.
>os dos siguientes, %axigauge y "ron-)orst, disponen solo de conexión serie $!&6&. >a cual, como )emos visto, tiene poca inmunidad al ruido por lo que conviene reducir la longitud de este tipo de conexión 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 conexión CP/0P en la red Et)ernet y el puerto serie del dispositivo. Para los equipos con salida analógica, el primer paso ser digitalizar la se3al utilizando un 'rduino. Este es capaz de digitalizar la se3al con #5 bits de resolución y tomando una muestra cada 5.&8ms. Puesto que el 'rduino es un dispositivo peque3o, cuanto ms cerca lo podamos colocar de la (uente reduciendo la distancia del cable de la se3al, mayor ser la calidad de la medición. 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
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Para terminar, )abría que mencionar que durante la realización del proyecto )an ido apareciendo otras opciones de )ard+are, y parece que la tendencia actual es la de seguir ampliando a2n ms la o(erta= por mencionar dos eemplos, el nublin es otro !"C similar a $aspberry Pi y el 4ummingbird al 'rduino. En la misma dirección, 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 podrían ser alternativas a los dise3os realizados.
3. ESTRUCTURA SOFTWARE 3.1 Software y lenguaje de programación. 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 características 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 rpido 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 rpido y sin muc)as complicaciones. En los siguientes apartados vamos a ir explicando con ms detalle las características ms importantes de los programas que contiene el conunto.
3.2 Interfaz gráfica del usuario Pensando en la modularidad de la solución se )an
Figura 7. Ejemplo de interfaz gr á fica
13
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
E+*5R+5 DE, PR5.RA7A PR+CPA, +C5 ,anzamiento de tareas en paralelo 0&ilos de e4ecución1 *AREA PR+CPA, - .' Conducida por e/entos 0espera inacti/a a la espera de e/entos12
*area
Programación periódica de un re3resco y toma de los datos de la pila2
(ólo el &ilo principal escribe en las /ariables globales
*area
Cola FF5 0mute61
Variables globales (ólo lectura
Figura 8. Alternativas de diseño a los conjuntos
construido inter(aces gr(icas independientes para cada equipo. Dn eemplo de cómo son estas se muestra en la (igura ;. Estn 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. $azón por la que se tienen que usar )ilos para eecutar tareas de (ondo y evitar bloqueos. 'dems, puesto que la salida por pantalla es un recurso compartido se necesita usar una cola F0F para acceder en exclusión 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 módulo tkinter , son tratados en pro(undidad en el libro de la re(erencia H8I, incluso apunta la solución que )emos usado, la cual se explica en detalle en el anexo 6.
3.3 Módulos Python >os módulos de Pyt)on son el equivalente a las bibliotecas en otros lenguaes H6IH7I. !e )an creado módulos especí(icos para cada equipo que aglutinan las instrucciones para la comunicación con cada uno de ellos. Estos módulos son usados desde las inter(aces gr(icas para interactuar con los equipos, ya sea solicitando datos o modi(icando alguna salida. !u construcción es autosu(iciente, es decir, que contienen todo lo necesario para e(ectuar por si solos una comunicación 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 módulo y utilzar directamente sus (unciones. Con lo que 14
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 módulo 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 comunicación. 0gualmente tenemos para dic)o equipo un módulo Pyt)on autosu(iciente, pero que a)ora no sólo 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 Comunicación por sockets TCP/IP Como medio de comunicación 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 petición de conexión, y otro, los soc-ets clientes entre los que se establece la comunicación, la cual generalmente se compone del intercambio de unos pocos mensaes. Cuando se da por (inalizada se destruye la conexión 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 petición de conexión al soc-et servidor. En caso de ser aceptada, este soc-et servidor crea un nuevo soc-et, del tipo cliente, asocindolo con el primero y (ormando una parea de iguales Apeer to peer B entre los que se establece la conexión. 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 petición. El uso de puerto distinto cada vez, unido a que sólo se envía una 2nica instrucción al equipo en cada conexión, se traduce en que )ay una relación instrucción1respuesta 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 correspondía. >a conversación, como se )a adelantado, consta del envío de un solo mensae, donde se encuentra la instrucción, y una espera de la respuesta. Para evitar bloqueos la conversación acabar cuando se reciba una respuesta o cuando se supere un tiempo límite Alos rectngulos representan transiciones temporizadasB. En ambos casos cuando acaban de usarse los soc-ets se destruyen liberando los recursos A buffers de redB que el sistema operativo est* usando. %ientras transcurría la conversación, el soc-et servidor sigue aceptando peticiones de conexión, 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 asociación se )a dispuesto de (orma secuencial y no ocurrir )asta que la anterior comunicación )aya sido completada. Esta estructura permite tener a varios clientes comunicndose con una mismo dispositivo serie con lo que podemos tener varias inter(aces gr(icas abiertas al mismo tiempo.
3.5 Comunicación serie Dna biblioteca de Pyt)on, PySerial, proporciona todos los los elemento necesarios para interactuar con el puerto serie. En la pgina del proyecto Py!erial H9I )ay varios eemplos de uso y en los cuales nos basamos para )acer el programa para la gestión de 15
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
16
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
la conexión 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 . 'dems, para tener un modelo adecuado quizs se debería usar una $ed de Petri Coloreada en la que intervendría el orden de llegada de las marcas. En una primera versión muy simple en la que el cliente )iciese una petición al dispositivo serie y esperase inde(inidamente la respuesta aparecería el problema de que un mensae corrupto Acomo el no encontrar el carcter (in de mensaeB bloquease el sistema. >a primera solución (ue a3adir un tiempo de espera límite 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 acumulación de mensaes puede producir una p*rdida de sincronización entre la petición y su respuesta. Para evitar esto podemos vacíar los bu((ers, una (orma de )acerlo es leer todo el buffer y descartar los ms antiguos quedndonos sólo con el 2ltimo, como se representa en la (igura #5. !in embargo queda por resolver un problema ms sutil. !i un cliente envía una petición al dispositivo serie y supera el tiempo de espera sin obtener respuesta, quiz porque la petición sigue siendo procesada, despu*s de que el siguiente cliente )aga su petición la respuesta que encontrar ser la del cliente anterior y no la suya. Para evitar esta situación 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 conexión 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 corrupción de los mensaes en la transmisión. ambi*n usando excepciones, el mismo programa es capaz de detectar la desconexión del dispositivo serie y lanzar un )ilo para su reconexión. %ientras, el programa principal sigue atento a cualquier conexión que venga de la inter(az gr(ica in(ormando que el dispositivo serie se )a desconectado.
3.6 Digitalización de señales El programa que se encarga de la digitalización de las se3ales analógicas se encuentra en los 'rduino. Este posee 9 entradas multiplexadas para la digitalización de la se3al con #5 bits de resolución, su(icientes para lo que se requería. El programa sigue el esquema de comunicación, que acabamos de ver en el apartado anterior, e(ectuando una digitalización a instancia de una petición y devolviendo la respuesta acompa3ada de la orden. En el caso que no entendiese la orden, simplemente, la remitiría volviendo a estado de inicial de escuc)a. El programa, como todos los dems, se encuentra en los anexos.
17
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
C,E+*E
D(P5(*V5 (ERE
8rite01
Por orden de llegada
(erial2read01
bu33er entrada
+ue/a petición ;ueda el mensa4e m
,ee &asta que queda solo el 9ltimo mensa4e
5peración
*iempo de e4ecución
Por orden de llegada tiempo otorgado a toda la operación serial*imeout E6ception
bu33er salida
;ueda el mensa4e m
Compara mensa4e de salida con el mensa4e esperado y act9a en consecuencia2
Figura 10. Comunicación por el puerto serie
18
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
3.7 Controlador del motor paso a paso :urante la (ase de desarrollo de este proyecto, el equipo de investigación sugirió una ampliación consistente en que la (uente de radiación 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 plstico, y movida por (ricción a trav*s de una polea por un motor paso a paso. El motor seleccionado debía transmitir un par de #?m sin un conunto reductor, por razones de espacio, y tener una resolución aceptable. 'mbos condicionantes podían 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 Figura 11. Motor paso a paso circula por las bobinas del motor. Dna síntesis del )ard+are relevante de esta placa y la relación con los pines del 'rduino puede verse en la (igura #&, en la que tambi*n se incluyen los elementos ms importantes que intervienen en el proceso de control de las intensidades que )acen girar el motor. En el anexo 8 se recoge in(ormación ms detallada, y tanto en este como en la pgina +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 posición del conunto, no )ay realimentación de la posición, 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 posición correcta. Para tener al menos un punto de cero, se instaló un interruptor que )ace de (inal de carrera, por lo que adems de estas (unciones, tambi*n se )a programado una interrupción 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 posición eliminando cualquier error en *sta que se )ubiese podido ir acumulando.
4. CONCLUSIONES Y TRABAJOS FUTUROS El aspecto ms destacable de la solución, 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
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
20
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
tra característica 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 ms barato que cualquier otro especí(ico. 'dems, estos dispositivos )an aparecido )ace poco, con lo que la solución es bastante novedosa. Por el eemplo el $asberry Pi se lanzó al mercado )ace a3o y medio, el &< de (ebrero del &5#&. >o que (altaría )acer, o meor, lo que no se )a podido )acer, por retrasos en la instalación y puesta en marc)a del experimento, es probar el comportamiento del sistema en condiciones de trabao continuo, y cul sería su (iabilidad. Este proyecto dea la puerta abierta a (uturas meoras. :esde el punto de vista de control quedaría cerrar el bucle de control del motor paso a paso, usando el PK% como modulador de la acción e incorporando alg2n sensor para la realimentación. ambi*n se podrían incorporar m*todos de detección y corrección de errores en los mensaes para aumentar la robustez. Dn m*todo apropiado sería el de 4amming. 'sí mismo se podría pensar en usar alg2n m*todo de hash, aunque el uso de estos en mensaes cortos, como los que se envían en esta aplicación, )ace que aumente de (orma importante la longitud de la cadena.
5. BIBLIOGRAFÍ A 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 M$eilly %edia 0nc. H8I Programming Pyt)on 7t) Ed &5#5 'utorL %ar- >utz. Editorial M$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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
6. AGRADECIMIENTOS Nuiero expresar mi agradecimiento a las personas que me )an ayudado a la realización de este proyecto (in de carrera, en especial al personal del >aboratorio de Física ?uclear y 'stropartículasL ' :. 0gor arcía 0rastorza, investigador principal del proyecto en el que se encuadra la solución aportada en este PFC. ' :. Francisco 0guaz utierrez, 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 culminación de este PFC. ' :. Ouan Castel por su continua disposición a ec)ar una mano. a :. Oos* $amón 'sensio por toda la experiencia que )a aportado como por su trato personal y ayuda prestada en la realización de este proyecto.
22
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXOS:
23
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
24
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO 1. INFORMACION EQUIPOS Introducción 'mpliamos la in(ormación de los equipos involucrados en el experimento detallando el modelo y dando la pgina +eb donde se puede encontrar las características correspondientes al modelo.
Spellman %odeloL !pellman !>. Fuente de alta tensión. )ttpL//+++.spellman)v.com/en/Products/$ac-1!upplies/!>.aspx !tandard 0nter(ace control option A!0CB. pción adicional que permite la comunicación por $!&6&/D!"/Et)ernet )ttpL//+++.spellman)v.com/en/Products/'ccessories/!0C1ption.aspx
CAEN %odeloL C'E? !&8&;. Dniversal %ultic)annel Po+er !upply !ystem. )ttpL//+++.caen.it/csite/CaenProd.spQidmodR#&6SparentR&5 C'E? 4 Krapper. "iblioteca C. Aversión 8.&5B. )ttpL//+++.caen.it/csite/CaenProd.spQidmodRJ68SparentR6J
MaxiGauge %odeloL %axigauge P &89 '. acuum measurement and control unit (or Compact auges. )ttpL//+++.p(ei((er1 vacuum.com/products/measurement/activeline/controllers/onlinecatalog.actionQ detailPdo0dR68&9Tproduct1accessories
Bronkhorst %odeloL "ron-)orst F1&5#C1%:1661 )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- PD. Dltra 4ig) Purity ransducer. )ttpsL//+++.s+agelo-.com/products/measurement1devices/pressure1transducers/ultra)ig)1purity1 (lo+1t)roug).aspx
25
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Motor paso a paso $! 8;mm stepper motor,#&9?cm #.Jdeg. &.8 )ttpL//es.rs1online.com/+eb/p/motores1paso1a1paso/868576
26
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO 2. PRESENTACIÓN DE OPCIONES PARA EL SISTEMA DE ADQUISICIÓN Y MONITORIZACIÓN betivo del documentoL presentar cinco opciones de sistema de control y toma de datos para el proyecto $E@1:%, resaltando características y di(erencias para su comparación, y (inal selección 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(icación 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 ms de 8 o #5 (rente a #-m del $!17J8B. 'dems, cada conexión necesitaría un puerto de la placa. >a meor opción es usar $!17J8, con este protocolo se pueden conectar )asta 6& dispositivos en cadena, (ormando una red y usando un solo puerto. bservando la tabla, vemos que no podemos conseguir agruparlas en un mismo tipo de protocolo, por tanto vamos a necesitar varios tipos de taretas de adquisición de datos. >a (uente !pellman de alta tensión la podremos conectar usando D!" o Et)ernet. por 2ltimo, a (alta de (iar el termómetro y caudalímetro nos queda una se3al entrada analógica, que )abr que digitalizar.
P"#!ues&s 1) National Instruments (PC-Módulos) + LabView
Consistiría en un bloque en el que se insertan el PC y los módulos para adquisición de datos. !e usaría >abie+ como so(t+are de programación. Figura #. >emaL V!olución empresarialV W Empresa >íder en el sector de la instrumentación.
27
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
W !olución utilizada en el mbito empresarial. Podemos con(íar en su robustez, (iabilidad, (acilidad de desarrollo y mantenibilidad. W Dsa >abie+, lenguae estndar a la )ora de buscar continuidad o ampliación. 2) PC + tarjetas + LabView
Dsaríamos un PC normal con las taretas necesarias para la captura de datos. como lenguae de programación >abie+. >emaL V!olución austada a una situación concretaV
Figura 2. Tarjeta PCI
W %s barata que la opción #. 1 Probable aparición de di(icultades en el desarrollo Adrivers taretas1PCB ante los cuales se producirn retrasos y en el caso ms grave vías muertas en las que )ubiese que cambiar )ard+are. W H>abie+I Dsar >abvie+ permite una mayor (acilidad a que el so(t+are sea modi(icado por otros. 3) PC + tarjetas + Python
Dsaríamos un PC normal con las taretas necesarias para la captura de datos. como lenguae de programación Pyt)on. >emaL V!olución austada a una situación concreta usando so(t+are libreV R %ismas consideraciones que en la opción & respecto al )ard+are. W HPyt)onI !o(t+are libre. >enguae sencillo con amplia gama de bibliotecas usado para prototipado rpido. 1 HPyt)onI llevar muc)as ms )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 usaríamos para la adquisición de datos, mientras el $aspberry Pi es un ordenador del tama3o de una tareta de cr*dito en el que instalaríamos un servidor con el que nos comunicaríamos por CP/0P desde cualquier otro ordenador. Figura 6. >emaL V!olución experimental e innovadoraV 1 $obustez y (iabilidad son una incógnita. Es algo muy nuevo 1 HPyt)onI !o(t+are libre. :esarrollo
Figura 3. Raspberry Pi y Arduino
28
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
costoso en tiempo. W pción barata. W $educción del ruido en la adquisición de datos. CP/0P es tambi*n muy robusto al ruido. W Exportable al resto del laboratorio. W %odularidad 5) PLC + tarjetas + SCADA
Consistiría en un P>C AProgrammable >ogic ControllerB o autómata 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. ?ecesitaría de las taretas de adquisición de datos que se pueden a3adir modularmente, y (inalmente, un sistema !C':' para control y monitorización remota. Figura 7. >emaL V!olución $obustaV W Es la opción ms robusta y (iable. X?o se colgaría en &5 a3osY. 1 El programa del P>C es ms di(ícil de modi(icar o reutilizar. 1 Coste, opción ms cara que las anteriores, tanto en )ard+are como en so(t+are.
P"esu!ues PXI de N.I. LabView Controlador Módulo RS-485 Módulo Analógico Chasis 5+1 Cables
5.800 1.700 592 1.330 1.209
PC + LabView 5.800 € LabView € PC 400 € Tjta C422 2xRS485 225 € Tjta PCI 9112 analog 450
PC + Python € Python € PC € Tjta
C422 2xRS485 € Tjta PCI 9112 analog.
€
Cables
10.630
€
Cables
6.875
€
Red Arduino Rbpi 0 € Python 0 400 € 225 € Arduino (x2) 50 450 € Raspberry Pi (x4) 200 Router/Switcher 100 Cables
1.075
€
350
29
€ € € €
€
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
T'( "esume+
FiabilidadL comprendería tanto el )ard+are como el so(t+are. :esarrolloL )aría mención 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-+ Propondríamos una solución mixta entre la opción 6 y 7. Esta consistiría en ensayar la solución 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 valoraríamos su (uncionamiento. seg2n sea este, podríamos seguir con esta opción o cambiar a usar un PC central con las taretas de adquisición sin muc)o costo a3adido.
30
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
31
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
32
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO /. ESTRUCTURA DE LA INTERFAZ 0RFICA I+&"#*u%%-+ :os ideasL A#B areas en paralelo par no bloquear la D0. A&B >a D0 es un recurso compartido al que se debe acceder en exclusión mutua. >a inter(az gr(ica AD0B utilizada para la comunicación con el usuario se eecuta en un modo llamado conducido por eventos, es decir, que est durmiendo esperando, por eemplo la pulsación con el ratón de un botón, para eecutar el código relacionado con ese evento. Para no bloquear la D0, 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 D0B a la )ora de escribir y leer datos.
Esquem $ '"ee e,!(-%%-+ *e sus e(eme+s >a estructura del programa en eecución quedaría re(leada en la (igura #. Explicación breve de cada elemento representado. &ntorno del rograma
El entorno del programa sería el marco donde coexisten tareas con su control de eecución, estructuras como la cola F0F, 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
paralelo. El modo en que trabaa es conducido por eventos. Espera durmiente a que ocurra un evento para eecutar el código correspondiente. Para no congelar la inter(az, este código se lanza como tareas en paralelo. Para actualizar la D0 programamos una acción periódica que se encargar de re(rescar las variables mostradas. 'areas en aralelo
>as tareas en paralelo son trozos de código cuya eecución se realiza al mismo tiempo y sin parar la tarea principal. El resultado de su trabao se guarda en una cola F0F a la que se accede en exclusión mutua. Exclusión 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 entremezclarían 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 periódicamente por la tarea principal y mostrados en la D0. *ariables globales
!on accesibles por tadas las tareas que comparten el mismo entorno. En este caso son variables booleanas. arantizamos la consistencia de los datos permitiendo que sólo la tarea principal escriba en ellos, y el resto solo las puede leer. Estas variables globales tienen como (unción (inalizar las tareas en paralelo. +alida ordenada
Dna vez que al programa le llega la orden de (inalizar, este sale del bucle de la D0 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 eecución del programa. )nicio
'l iniciar el programa se crearía el entorno del programa. Este contendría la tarea principal en eecución, y las variables, tanto las globales como la pila F0F. Figura &. En este momento inicial solo )abría una tarea en eecución. Esta sería la D0, la cual, est )aciendo sólo dos cosas. Dna,
34
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
contrario, la D0 quedaría congelada )asta que esta tarea acabase su trabao, y que se encargar de leer los datos del sensor y proporcionrselos a la D0. Puesto que podemos tener varias tareas en paralelo, )ay que tener cuidado con los recursos compartidos, por eemplo la D0. ?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 F0F a la que se accede en exclusión mutua. Periódicamente, la D0 los va tomando para representarlos en pantalla. +alida ordenada del rograma
Cuando se envía la se3al de cerrar la D0, es exactamente eso, cerrar la D0 y no el programa. >o que ocurre es que se sigue eecutando las instrucciones del programa principal que se encuentran a continuación del bucle de la D0. 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
36
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO 4. ACCESO A FUNCIONES C DESDE PYT5ON Explicamos el módulo ctypes de Pyt)on y varias soluciones a puntos problemticos que nos pueden aparecer. ndice
El módulo ctypes !oluciones a puntos problemticos Compilación de una biblioteca con (unciones C de prueba Función C gen*rica Función C que usa punteros como parmetros de entrada y reusados como salida Función C con arrays de C
E( m*u(# %&$!es Pyt)on permite m2ltiples (ormas de usar (unciones de C desde su código. ?os vamos a centrar en el uso del módulo ctypes para acceder a (unciones de C compiladas en una biblioteca de enlace dinmico A:>>B u obeto compartido A.soB en nix. Ctypes es un módulo de la biblioteca estndar 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 código interpretado de Pyt)on. Como eemplo introductorio vamos a usar la (unción 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 !uncin. hola # la cadena esperada. ccin de la !uncin.
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 solución inmediata. Para introducir estos problemas vamos a crear una biblioteca de enlace dinmico con varias (unciones que eempli(ican cada uno de estos casos y sobre las que probaremos las soluciones.
Creación de una biblioteca con funciones C de prueba >as (unciones estn distribuidas en cada eemplo para (acilitar la explicación, 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
simple.c y a partir de este vamos a crear con los siguientes pasos una biblioteca de enlace dinmico u obeto compartido en >inux. #B Compilar creando código de posición independienteL *cc +,all +!pic +c simple.c
!iendo 1c la opción 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 opción 1o, de output.
Función C genérica Con la (unción MsumaM vamos a dar un eemplo de como usar tipos de variables bsicas, tales como enteros y apuntadores. Código de la (unción C. Función “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
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 (unción sumaL Uso de “suma” desde Python # sample.py import ctypes # reamos ob$eto 4LL ue en5uel5e libreria de libimple = ctypes.cdll.LoadLibrary('./libsimple.so') # uncion suma en Python suma = libimple.suma # suma = atributo del ob$eto- tipo 4LL- libimple suma.ar*types = (ctypes.c7int- ctypes.P89:;<(ctypes.c7int)) suma.restypes = ctypes.c7int # Llamada a la !uncin suma a = ctypes.c7int(3) b = ctypes.pointer(ctypes.c7int(6)) print(suma(a-b)) # resultado
38
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Explicación 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 (unción de la biblioteca. 'sí, lib!imple.suma )ace re(erencia a la (unción MsumaM. ' continuación, con argtypes y restypes indicamos que tipos de parmetros deben ser pasados a la (unción. ?o es estrictamente necesario, pero en caso de no enviarle el parmetro 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 pgina o(icial de Pyt)on A)ttpL//docs.pyt)on.org/6/library/ctypes.)tmlB. Por 2ltimo, )acemos una llamada a la (unción suma en el que primero )emos creado explícitamente los parmetros correspondientes en el tipo adecuado. En caso de enteros, cadenas y bytes la conversión es automtica. Pero no para el resto. En los punteros distinguimos las dos instrucciones P0?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.P0?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 P0?E$AtypeAobBB
Función de C que usa punteros como parámetros 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 (unción 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 explícito 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 comportarn exteriormente como es esperable de una (unción de Pyt)on. Función “division_entera” en C // di5ision entera int di5ision7entera (int 4- int d) int resto = 4 ? d1 4 = 4 / d1 return resto1
Uso de “division_entera” desde Python # uncion di5ision entera 7di5ision7entera = libimple.di5ision7entera 7di5ision7entera.ar*types = (ctypes.P89:;<(ctypes.c7int)- ctypes.c7int) 7di5ision7entera.restypes = ctypes.c7int # uncion 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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('onciente ='- resCD- ' esto ='-resCED) # esultado@ ociente = B esto= E
Función de C con arrays ')ora vamos a ver como tratar con arrays. En Pyt)on una conversión natural sería 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 bsico 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 !uncin.
$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 (unción A.argtypesB se tiene AcUintB solo serían aceptadas instancias de ese tipo. !in embargo, )ay una excepción a esta regla en el caso de punteros, estos admiten instancias de arrays compatibles. Por eemplo, P0?E$AcUintB admite no solo enteros sino arrays de enteros. Por otro lado, P0?E$AcUint8B (ia el tama3o y no admite arrays de otras dimensiones, aunque si enteros en lo que debería ser un error. Como en los apartados anteriores se a escrito una (unción que recoge todo anterior a modo de modelo. En este caso la (unción media espera un array de enteros largos y un entero con su n2mero para )acer la media y devolverla como otro entero largo. Función “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 return total/n1
Dso de la (unción media desde Pyt)on creando otra (unción intermedia. Uso de la función “media” desde Python # uncion media 7media = libimple.media # iendo una eGcepcin- un puntero de un tipo acepta arrays de ese mismo tipo
40
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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: :ocumentación de ctypes en la pgina o(icial de Pyt)on. )ttpL//docs.pyt)on.org/6/library/ctypes.)tml
41
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
42
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO 5. CONTROL DE UN MOTOR PASO A PASO CON
ARDUINO Y MOTOR S5IELD 7"e/8 &l roblema %ue %uer-amos resolver utiliando 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 rduino rev.3 " un motor s/ield rev.3. n s/ield es un circuito integrado rearado ara conectar directamente al rduino.
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 Programación 6.# ariables y (unciones 6.& Comunicación y módulo Pyt)on 6.6 Dna interrupción reausta la posición 7 'uste del par 8 "ibliogra(ía
1. Esquema y breve explicación de un motor paso paso 4ay varios tipos de motores paso a paso, estos pueden ser de reluctancia variable, de imn 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 mínima.
1.1 Motor hbrido El motor )íbrido consiste en un rotor, (ormado por un imn permanente dividido en dos discos, o ruedas, y que presenta una serie de dientes alternados, (igura #. en un esttor con varios polos bobinados. Este tipo de motores consiguen una resolución 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 esttor, y en el que los dientes del polo ? del rotor estn alineados con los dientes del polo # del esttor, al igual que los del polo ! del rotor lo
43
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
estn con los del polo 6. En el siguiente paso, la intensidad dea de pasar por las bobinas # y & activndose a)ora los polos & y 7. El rotor se mueve en el sentido de las aguas del relo )acia posiciones de menor energía en las que los dientes se alinean creando un circuito magn*tico de mínima 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 & correspondería con el denominado de paso completo. Pero existen otros modos entre los que los ms comunes son el de medio paso en el que )ay cuatro pasos extra intercalados y en los que todas las bobinas estn activas. el micro1stepping, en el que las corrientes varían de una (orma continua y no en escalones todo o nada= Henlace #I.
1.! Circuito R" y par motor >os dos t*rminos ms importantes en el par motor, son la intensidad de la corriente y la posición 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 mximo es un dato de dise3o que aparece en las )oas de características 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 mximo no se llega instantneamente, 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 posición relativa. >a (uerza va desde el valor 5, cuando estn per(ectamente alineados los dientes del rotor con los de los polos de las bobinas, y de allí, se va incrementando )asta un mximo 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 mínimo inestable en el que los dientes estn alternados. >a (igura 7 representa el par, o la (uerza, en (unción del desplazamiento entre el rotor y el esttor. 'delantndonos al punto 7 en el que tratamos el auste del par, vamos a describir como un motor daría un paso estando bao la acción de un par resistente. !upongamos que este par es de valor la
45
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
mitad al valor mximo y que se parte de una posición a de equilibrio. Entonces avanzamos un paso activando y desactivando las bobinas correspondientes, la nueva posición con respecto a la alineación de los dientes pasaría a ser aM. Como el par del motor es superior al resistente )ace que el rotor se mueva )acia b, que ser la siguiente posición de equilibrio.
tro parmetro que aparece en las )oas de especi(icaciones es el par de retención A)olding torqueB. Este )ace re(erencia al par que muestra el motor a un cambio de posición cuando ya no pasa ninguna corriente. Este (enómeno aparece por la imanación del material (erromagn*tico y es interesante a la )ora del dise3o porque podemos saber si el rotor va a mantener la posición 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 tendríamos tres opciones. Primera, crearlo desde los componentes bsicos. !egunda, usar componentes ya empaquetados. 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 >&
46 'igura & (r)uino !no re*&3&
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
!.1 Circuito del #rduino Motor $hield El esquema del circuito completo, por ser libre, puede descargarse de la pgina +eb o(icial. HEnlaces 6 y 7I. El componente principal es un >&
a (igura 9AaB resume lo ms importante del esquema. El M'rduino %otor !)ield r6M tiene sus límites, sobre todo en lo concerniente a la intensidad mxima que puede tratar. Estos vienen dado sobre todos por el componente principal que es el >&
'igura +& (r)uino otor Shiel) re*&3
' 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 caída de tensión y que depende de la intensidad, por eemplo podemos encontrarnos una caída de #.; cuando la intensidad es de #.8'. Podemos encontrar los valores en las )oas de especi(icaciones del >&
!.! Control del Motor $hield con el #rduino ' día de )oy, la in(ormación para controlar un motor paso a paso con un 'rduino y su M%otor !)ieldM es bastante escasa, por no decir inexistente. casi toda la que se puede encontrar trata del control de motores de corriente continua. 0ncluso, todas las re(erencias a relación entre los pines del 'rduino y su (unción 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 cómo (unciona el puente completo y que pines del 'rduino controlan cada (unción para luego dise3ar el control de un motor paso a paso. Función
'
"
:irección
4E2
4E3
PK%/Enable
43
4EE
"ra-e
4I
4J
47
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
!ensor de corriente
E
En la (igura ;AaB podemos ver qu* relación existe entre cada pin del 'rduino y el conductor de puente completo. 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. Faltaría representar el estado en el que no se permite la circulación 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, tendríamos un voltae muy alto debido a que R>Gd0/dtR>Gin(inito. Este camino viene dado por unos diodos que al cerrar los transistores crearían un circuito de descarga. ampoco )emos usado la (unción 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 @?$ Aexclusive not $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
#
@
Paso 6
5
5
#
5
@
!P
5
111
5
111
@
@
>a conexión entre el PK% y el enable del >&
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 realización de cada paso. Para generar las se3ales va siguiendo la secuencia de la tabla anterior, en la que si se sigue en una dirección u otra dar un sentido de giro u otro.
%.1 &ariables y funciones ariablesL absPos!tep
posición absoluta en pasos, entero largo.
+)atstep
clase matemtica 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
49
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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.
!.! Comunicación 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 carcter de inicio, 6 caracteres de la instrucción, seguidas de una M,M cuando )ay que enviar un parmetro, el valor del parmetro, y el carcter de (inalización del mensae. !et ?umber o( steps to turn L sns eemploL 5&sns,J5556
%.% 'na interrupción rea(usta la posición Es probable que durante el (uncionamiento aparezcan errores de posición 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 dirección buscando un punto MceroM que produce el lanzamiento de una interrupción del micro1 controlador. >a (unción asociada a esta, detiene el motor y pone a cero la variable que almacena la posición absoluta de la sirga, reaustando así, la posición supuesta con la posición real. ines del rduino " 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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
(uese así, y no lo conectsemos a tierra, el valor del pin & quedaría indeterminado con lo que la interrupción podría lanzarse en cualquier momento. ambi*n colocamos un resistencia para no conectar directamente la salida de 8 con tierra. rogramaci!n de la interruci!n
Con la instrucción attac)0nterruptAinterrupt, (unction, modeB enlazamos la interrupción 5 Apin&B ó # Apin6B con la (unción 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 líneas que a3adiríamos al programa serían las siguientesL // Kariables lobales 5olatile lon* absPostep = 1 // absolute position in steps 5olatile unsi*ned lon* nsteps = 1 // number o! steps to turn // 9nterrupcion 5oid Mero7position() absPostep = 1 nsteps = 1
'unque una comparación al inicio del procedimiento que eecuta cada paso podría 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 interrupción para evitar perder el cambio de valor en momentos intermedios, con lo que podríamos pasarnos el punto de MceroM.
4. Aus&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 modulación por pulso APK%B en la que vamos cortando la intensidad a intervalos cortos para tener un valor entre el mximo y el mínimo. >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 posición del paso actual, y no antes porque si no dearemos atrs el movimiento real y no se mover, ni tampoco muc)o despu*s porque el movimiento podría ser una oscilación subamortiguada si el par es muy alto con lo que se produciría una (uerte vibración. >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 bsicas 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 Pgina o(icial del 'rduino.
51
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
)ttpL//+++.arduino.cc/ Henlace 7I Pgina del 'rduino %otor !)ield $ev.6. 'puntar que en el esquema las puertas ?'?: marcadas con una e son puertas @?$. )ttpL//arduino.cc/en/%ain/'rduino%otor!)ield$6 Henlace 8I 4oa de especi(icaciones del dual (ull1bridge driver >&J8#/!C#;<5/!!#888/PF96#7;
52
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
'igura & #s.ue/a )el (r)uino otor Shiel re*3
53
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
54
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
ANEXO >. PRO0RAMAS Introducción En los siguientes apartados, que se )an estructurado por conuntos de )ard+are, recogemos y explicamos los puntos ms importantes de los programas realizados para el proyecto. Por indicar un conunto que puede tomarse como base o plantilla tomaría el de digitalización de la se3al analógica. Por ser este el ms simple, pero a la vez el ms completo al reunir todos los tipos de programas que pueden aparecer. ndice de conuntos y programas Conjunto +agelo6 " 'emeratura 8igitaliaci!n de una seal anal!gica.
57
!-etc) 'rduino :igitalización
8<
'nalog'rduino!erver
9&
!oc-etClient
99
'nalog%odule
9;
'nalogui
9J
Conjunto :otor aso a aso
75
!-etc) 'rduino motor
;9
%otor'rduino!erver
;<
!oc-etClient
J6
%otor!)ield%odule
J7
%otorui
J9
Conjunto ;ron6/orst
93
"ron-)orst!erver
<7
!oc-etClient
"ron-)ors%odule
<<
"ron-)orstui
#5&
Conjunto :a$i
105
%axiauge!erver
#59
!oc-etClient
##5
%axiauge%odule
###
%axiaugeui
##6
Conjunto +ellman
117
!pellman%odule
##J
!pellmaui
#&6
55
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Conjunto C&=
129
Caen%odule
#65
Caenui
#67
56
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Conjunto Swagelok y Temperatura: Digitalización de una señal analógica. 'mbos conuntos, el del transductor de presión !+agelo- y el de temperatura, son similares ya que su misión es tomar una se3al analógica, discretizarla y permitir su visualización 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 selección de la (unción de discretización y de dirección en la red, 0P y puerto. En los siguientes puntos desgranamos la estructura y explicamos los detalles ms importantes de cada programa.
Figura 1. Interfaz gr á fica analogGui
+6etc/ rduino 8igitaliaci!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 digitalización cuesta 5.&8ms con #5 bits de resolución. la (orma en que se realiza la comunicación serie est recogida en la sección correspondiente de la memoria siendo. En caso de no entender la instrucción, por ser errónea o (allo en la comunicación, simplemente devuelve el mensae que le )a llegado sin )acer nada. nalogrduino+erver. Programa en Pyt)on que se est eecutando en el $aspberry Pi, aunque tambi*n lo podría )acer en cualquier PC, y que )ace de puente entre el puerto serie y la red Et)ernet.
Entre las características que posee, es el uso de excepciones para mantener el servidor en (uncionamiento en cualquier caso. Como eemplo, el cable serie podría desconectarse y simplemente avisaría a la vez que intenta volverse a conectar cada 8s ariables 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 módulo Pyt)on, com2n a todas las inter(az gr(icas, que resume la mecnica de comunicación por soc-ets en una (unción para ser utilizada desde cualquier programa Pyt)on que llame al módulo. ambi*n usa excepciones para, en cualquier caso, cerrar correctamente la conexión.
>a 0P y el puerto al que se conecta pueden ser especi(icadas en los parmetros de la (unción 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 módulo. nalog:odule. Este es el módulo en el que se encuentran las instrucciones de operación con el programa de digitalización del 'rduino. En este caso, solo )ay una, sensorAiB, que )ace una petición de una medición 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 instrucción )elpA'nalog%oduleB para obtener la ayuda que consta de la explicación de cada comando, como de los parmetros de entrada y salida que intervienen. Dsa el módulo !oc-etClient anterior para realizar la conexión y el intercambio de mensaes.
57
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
nalog
58
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Sketch Arduino Digitalización const const const const
char char char int
;N='"2'1 // ;N = "2 <;N='"3'1 // <;N = "3
char charin1 char entradaCstr7lenD1 int indeG = 1 int 5alor1
// operations inte*er 5ar
// unctions / unciones 5oid clear7bu!!er() Ohile (erial.read() >= )1
// etup 5oid setup() erial.be*in(I6)1 // Pro*ram loop 5oid loop() indeG = 1 entradaCindeGD = '"'1 // *et command !rom serial do Ohile (erial.a5ailable() == ) delay(E)1 charin = erial.read()1 // *et a character sOitch (charin) case <;N@ brea1 case ;N@ indeG = 1 entradaCindeGD = '"'1 brea1 case
59
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. entradaCindeGD= '"'1 i! (indeG > 6)indeG=61 // B chars 0 null- no sobrepasar lon*itud maGima Ohile( (charin Q= <;N) RR (erial.a5ailable() > ) )1 erial.print(;N)1 erial.print(entrada)1
// <S8 command //
sOitch (entradaCD) case 'r'@ // it's a reuest / 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 brea1 case '2'@ erial.print(T-T)1 erial.print(analo*ead(E))1 brea1 case '3'@ erial.print(T-T)1 erial.print(analo*ead(2))1 brea1 case ''@ erial.print(T-T)1 erial.print(analo*ead(3))1 brea1 case '%'@ erial.print(T-T)1 erial.print(analo*ead())1 brea1 case '6'@ erial.print(T-T)1 erial.print(analo*ead(%))1 brea1 brea1 case 'c'@ // clear sOitch (entradaC2D) case '!'@ clear7bu!!er()1 // clear input bu!!er brea1 brea1
60
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
brea1 // return erial.print(<;N)1 erial.!lush()1
// end messa*e // Oait send output bu!!er
61
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Analog Arduino Server # # # # #
analo*rduinoer5er Python 3 Pro*rama puente cepta una coneGion a tra5es de un socet ;P/9P ue hace de puente con un puerto serie
import import import import
socet serial time threadin*
# +++onstantes+++ ;N = b'"G2' <;N = b'"G3' # +++Kariables+++ acti5idad = # 4iccionario con el estado acti5idadC'run'D = ;rue # i alse => salir del pro*rama acti5idadC'serial'D = alse #
= 2 # se*undos1 tiempo maGimo de espera = .E # se*undos1 tiempo estimado de operacion
# +++lases+++ class Hessa*e()@ '''lase Hensa$e''' de! 77init77(sel!- bytetrin* = b''- n=)@ sel!.bytes9n = bytetrin* sel!.bytes8ut = b'' sel!.time = time.time() sel!.contador = n de! Orite(sel!- ob$ecterial)@ ob$ecterial.Orite(sel!.bytes9n) de! read(sel!- ob$ecterial)@ sel!.bytes8ut = b'' time = time.time() Ohile ;rue@
62
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. data = ob$ecterial.read() sel!.bytes8ut 0= data i! data == ;N@ sel!.bytes8ut = ;N i! (data == <;N) and (ob$ecterial.in,aitin*() == )@ brea i! time.time() > time0serial;ime8ut0serial;ime8p@ raise serial.erial;imeout
# +++unciones+++ #
<9<
de! serial7up()@
63
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ''';hread that mae an ob$ect serial instance Silo para establecer la coneGion serie rea una instancia de un ob$eto serial (L8UL ob$ecterial). 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('oneGion serie up') acti5idadC'serial'D = ;rue
#
8V<;
de! socet7up()@ *lobal *enocet try@ *enocet = socet.socet(socet.79:<;- socet.8V7;<H) eGcept 8
# +++++ 9:998 P8H +++++ print('+++ iniciando +++')
64
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. threadin*.;hread(tar*et=serial7up).start() # ;hread socet7up() Ohile acti5idadC'run'D@ # Uucle try@ # rea un socet cliente tras una peticion de coneGion print(',aitin* nue5a coneGion ;P/9P...') coneGioned- address = *enocet.accept() coneGioned.settimeout(2) print('oneGion con'- address) # recepcion del mensa$e data = b'' Ohile not <;N in data@ # reconstruye el mensa$e troMo = coneGioned.rec5(E2) i! not troMo@ brea data 0= troMo messa*e = Hessa*e(data- contador) contador = (contador 0 E) ? E i! acti5idadC'serial'D@ messa*e.serie(ob$ecterial) else@ messa*e.bytes8ut = ;N 0 b'error-serial7doOn' 0 <;N coneGioned.sendall(messa*e.bytes8ut) eGcept socet.timeout@ pass eGcept
65
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
SocketClient # socetlient # Hodulo para la comunicacion como cliente por socet # especi!ico para el rduinoer5er.py # aracteristicas@ # Propa*a eGcepciones # ierra siempre el socet import socet import time de! send7rec5(messa*e- ip='localhost'- port=%J- t8p=- t8ut=E)@ '''
66
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 socetlient as sc # 4ireccion y puerto donde se encuentra el ser5idor ser5erSost = 'localhost' # e$emplos@ 'localhost'- 'EI2.E6J.2.3' ser5erPort = % ;N = '"G2' # tart o! ;eGt character <;N = '"G3' #
67
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
AnalogGui # analo*ui # Python 3 # 9nter!aM *ra!ica import tinter as t import tinter.messa*eboG as tm import threadin*- ueue- time import analo*Hodule as ana # 8:;:;< L8UL< # 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) # K9UL< # Kariables *lobales buttons = # diccionario de ob$etos *ra!icos1 campos a actualiMar. labels = # diccionario de ob$etos *ra!icos1 campos a actualiMar. checbuttons = checs = # 5ariables del entorno de 5entanas checKalues = # 5alores de las 5ariables anteriores interpols = # con$unto de !unciones de interpolacion a aplicar acti5idad = 'play'@;rue- 'record'@alse # bit- si alse => close thread dataueue = ueue.Yueue() # ola de datos de acceso en eGclusion. # 5alores iniciales checKaluesC'sensor7E'D checKaluesC'sensor72'D checKaluesC'sensor73'D checKaluesC'sensor7'D checKaluesC'sensor7%'D checKaluesC'sensor76'D
= = = = = =
# unciones matematicas de! interpol(G)@ '''4e5uel5e un 5alor entero''' G= y= GE=E23 yE=E23 m = (yE+y)/(GE+G) G = int(G) return m(G+G) 0 y de! interpol7LH3%(G)@ '''4e5uel5e un numero
68
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ;CD = 0 .E;CKD''' G= y= GE=E23 yE=% # % m = (yE+y)/(GE+G) G = m(G+G) 0 y return '?0.E' ? (G) interpolsC'sensor7E'D interpolsC'sensor72'D interpolsC'sensor73'D interpolsC'sensor7'D interpolsC'sensor7%'D interpolsC'sensor76'D
= = = = = =
interpol7LH3% interpol interpol interpol interpol interpol
# unciones de! repeater(t7re!resco=2)@ try@ data = dataueue.*et(bloc=alse) eGcept ueue.
de! record()@ # :o implementado. e*uir el e$emplo HaGiau*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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 ey in checKalues@ i! checKaluesCeyD@ try@ resp = ana.sensor(int(eyC+ED)) i! type(resp) == int@ resp = interpolsCeyD(resp) eGcept
# 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
70
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. toolmenu = t.Henu(menubar) toolmenu.add7command(label='9nit'- command=notdone- underline=) menubar.add7cascade(label=';ools'- menu=toolmenu- underline=) helpmenu = t.Henu(menubar) helpmenu.add7command(label='bout'-command=notdone) menubar.add7cascade(label='Selp'- menu=helpmenu- underline=)
de! maechec(Oin- checbuttons=checbuttons- labels=labels)@ '''onstruye los checbuttons''' !rame = t.rame(Oin) !rame.pac() # reacion ob$eto *ra!ico@ hecbutton del sensor E checsC'sensor7E'D = t.9ntKar() chec7E = t.hecbutton(!rame- command=checerteGt=' ensor E@'- 5ariable=checsC'sensor7E'D- Oidth=E) chec7E.pac(side='le!t') checbuttonsC'chec7E'D = chec7E # reacion ob$eto *ra!ico@
71
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. # reacion ob$eto *ra!ico@ hecbutton del sensor checsC'sensor7'D = t.9ntKar() chec7 = t.hecbutton(!rame- command=checerteGt=' ensor @'- 5ariable=checsC'sensor7'D- Oidth=E) chec7.pac(side='le!t') checbuttonsC'chec7'D = chec7 # reacion ob$eto *ra!ico@
de! maetable(Oin)@ marco = t.rame(Oin) marco.pac() # cabecera titulo7status = t.Label(marco- teGt='st'- relie!='!lat'Oidth=3- b*='bei*e') titulo7sensor = t.Label(marco- teGt='sensor'- relie!='!lat'Oidth=I- b*='bei*e') titulo7data = t.Label(marco- teGt='data'- relie!='!lat'Oidth=E3- b*='bei*e') titulo7status.pac(side='le!t') titulo7sensor.pac(side='le!t')
72
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. titulo7data.pac(side='le!t') # tabla tabla = C(titulo7status- titulo7sensor- titulo7data)D !or i in ran*e(E-60E)@ marco = t.rame(Oin) marco.pac() status = t.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3) sensor = t.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I) data = t.Label(marco- teGt='++++'- relie!='sunen'- Oidth=E3) status.pac(side='le!t') sensor.pac(side='le!t') data.pac(side='le!t') tabla.append((status- sensor- data)) return tabla
#
9:998 P8H
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title(';emperatura') Oinroot.a!ter(%-repeater) # actualiMacion de la W9 maemenu(Oinroot) checbuttons = maechec(Oinroot) play() # lanMamiento del sistema de e5entos Oinroot.mainloop() # cierre de hilos print('cerrando') acti5idadC'play'D=alse acti5idadC'record'D=alse
73
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
74
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 módulo de instrucciones Amotor%oduleB, y algunos cambios mínimos en el motor'rduino!erver respecto al analog'rduino!erver. +6etc/ rduino 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 explicación ms extensa en el anexo 8. motorrduino+erver. Programa que )ace de puente entre la red Et)ernet y el dispositivo serie, en este caso el 'rduino. +oc6etClient. El mismo módulo que en el caso anterior, es un módulo que se encarga de )acer las conexiones CP/0P de la inter(az gr(ica al servidor Amotor'rduino!erverB.
Figura 2. Interfaz gr á fica motorGui motor+/ield:odule. 0nstrucciones para operar con el motor. >a ms importante es turnAinteger, booleanB por la que se ordena al motor a girar el n2mero de pasos indicados por el n2mero entero en una dirección u otra seg2n el booleano. tras instrucciones son setUstepUdurationAmicrosegundosB, getUabsUposAB. Con )elpAmotor!)ield%oduleB se puede obtener ms in(ormación en el int*rprete de Pyt)on. :otor
75
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Sketch Arduino motor / tepper Hotor- rduino uno motor shield 3 / // 9nclude tepper Library #include Ftepper.h> // Hap pins to constants const int pOm=31 const int pOmU=EE1 const int brae=I1 const int braeU=J1 const int dir=E21 const int dirU=E31 // steps !or a re5olution const int ;
76
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. //PH o! the motor // mytepper.setpeed(E)1 //
77
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. // // // // // // // // // // // // // //
di*ital,rite(dir- L8,)1 di*ital,rite(dirU- L8,)1 delay(E)1 //mytepper.step(+;
78
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
motorArduinoServer # # # # #
motorrduinoer5er Python 3 Pro*rama puente cepta una coneGion a tra5es de un socet ;P/9P ue hace de puente con un puerto serie
import import import import
socet serial time threadin*
# +++onstantes+++ ;N = b'"G2' <;N = b'"G3' # +++Kariables+++ acti5idad = # 4iccionario con el estado acti5idadC'run'D = ;rue # i alse => salir del pro*rama acti5idadC'serial'D = alse #
= 3 # se*undos1 tiempo maGimo de espera = .% # se*undos1 tiempo estimado de operacion
# +++lases+++ class Hessa*e()@ '''lase Hensa$e''' de! 77init77(sel!- bytetrin* = b''- n=)@ sel!.bytes9n = bytetrin* sel!.bytes8ut = b'' sel!.time = time.time() sel!.contador = n de! Orite(sel!- ob$ecterial)@ ob$ecterial.Orite(sel!.bytes9n) de! read(sel!- ob$ecterial)@ sel!.bytes8ut = b''
79
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. time = time.time() Ohile ;rue@ data = ob$ecterial.read() sel!.bytes8ut 0= data i! data == ;N@ sel!.bytes8ut = ;N i! (data == <;N) and (ob$ecterial.in,aitin*() == )@ brea i! time.time() > time0serial;ime8ut0serial;ime8p@ raise serial.erial;imeout
# +++unciones+++ #
<9<
80
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
de! serial7up()@ ''';hread that mae an ob$ect serial instance Silo para establecer la coneGion serie rea una instancia de un ob$eto serial (L8UL ob$ecterial). 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('oneGion serie up') acti5idadC'serial'D = ;rue
#
8V<;
de! socet7up()@ *lobal *enocet try@ *enocet = socet.socet(socet.79:<;- socet.8V7;<H) eGcept 8
81
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. # +++++ 9:998 P8H +++++ print('+++ iniciando +++') threadin*.;hread(tar*et=serial7up).start() # ;hread socet7up() Ohile acti5idadC'run'D@ # Uucle try@ # rea un socet cliente tras una peticion de coneGion print(',aitin* nue5a coneGion ;P/9P...') coneGioned- address = *enocet.accept() coneGioned.settimeout(2) print('oneGion con'- address) # recepcion del mensa$e data = b'' Ohile not <;N in data@ # reconstruye el mensa$e troMo = coneGioned.rec5(E2) i! not troMo@ brea data 0= troMo messa*e = Hessa*e(data- contador) contador = (contador 0 E) ? E i! acti5idadC'serial'D@ messa*e.serie(ob$ecterial) else@ messa*e.bytes8ut = ;N 0 b'error-serial7doOn' 0 <;N coneGioned.sendall(messa*e.bytes8ut) eGcept socet.timeout@ pass eGcept
82
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
SocketClientt # socetlient # Hodulo para la comunicacion como cliente por socet # especi!ico para el rduinoer5er.py # aracteristicas@ # Propa*a eGcepciones # ierra siempre el socet import socet import time de! send7rec5(messa*e- ip='localhost'- port=%J- t8p=- t8ut=E)@ '''
return strAresp, encodingRMasciiMB
83
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
motorShieldModule # motorhieldHodule # Python 3 # Hodulo para interaccionar con el setch del motor import sys import socetlient as sc # 4ireccion y puerto donde se encuentra el ser5idor ser5erSost = 'localhost' # e$emplos@ 'localhosts'- 'EI2.E6J.2.3' ser5erPort = % ;N = '"G2' # tart o! ;eGt character <;N = '"G3' #
# unciones 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 # socet try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E -t8ut=6) eGcept sc.socet.timeout@ return 'timeout' eGcept
de! set7step7duration(i)@ '''i$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 # socet
84
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=2 -t8ut=2) eGcept sc.socet.timeout@ return 'timeout' eGcept
85
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
motorGui # motorui # python 3 import tinter as t import tinter.messa*eboG as tm import threadin*- ueue- time import motorhieldHodule as motor # 8:;:;< L8UL< # 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) # K9UL< # Kariables *lobales buttons = labels = acti5idad dataueue
# diccionario de ob$etos *ra!icos1 campos a actualiMar. # diccionario de ob$etos *ra!icos1 campos a actualiMar. = 'play'@alse- 'record'@alse # bit- si alse => close thread = ueue.Yueue() # ola de datos de acceso en eGclusion.
posicion = '' #posicion = 'pos7E' pasos
0 0 0 0 0 0 0 0
pasos
# unciones de! steps7to7neO(neOPos)@ *lobal posicion i! posicion == ''@ try@ *et() time.sleep(E) eGcept
86
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. try@ steps = posicionesCneOPosD + posicionesCposicionD posicion = neOPos i! steps > @ return (steps-E) else@ return (abs(steps)-) eGcept
de! *et()@ *lobal posicion resp = motor.*et7abs7pos() i! type(resp) == int@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') i! posicionesCeyD == resp@ posicion = ey buttonsCeyD.con!i*(relie!='sunen') else@ return
de! pos7E()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos7E'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos7E') motor.turn(stepdCD-stepdCED) de! pos72()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos72'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos72') motor.turn(stepdCD-stepdCED) de! pos73()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos73'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos73') motor.turn(stepdCD-stepdCED) de! pos7()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos7'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos7') motor.turn(stepdCD-stepdCED) de! pos7%()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos7%'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos7%') motor.turn(stepdCD-stepdCED) de! pos76()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos76'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos76') motor.turn(stepdCD-stepdCED)
87
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. de! pos7B()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos7B'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos7B') motor.turn(stepdCD-stepdCED) de! pos7J()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'pos7J'D.con!i*(relie!='sunen') stepd = steps7to7neO('pos7J') motor.turn(stepdCD-stepdCED) de! rea$ustar()@ !or ey in posiciones@ buttonsCeyD.con!i*(relie!='raise') buttonsC'rea$ustar'D.con!i*(relie!='sunen') stepd = steps7to7neO('rea$ustar') i! stepdCED == @ motor.turn(E-E) time.sleep(E.%) motor.turn(stepdCD0%-stepdCED) time.sleep(E) motor.set7abs7pos() time.sleep(E) *et()
de! repeater(t7re!resco=%)@ try@ data = dataueue.*et(bloc=alse) eGcept ueue.
de! play()@ # lanMador del hilo play7thread threadin*.;hread(tar*et=play7thread).start() de! play7thread()@ # uturo uso Ohile acti5idadC'play'D@ time.sleep(E) motor.*et7abs7pos()
# 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
88
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. menubar = t.Henu(Oin) Oin.con!i*(menu=menubar) !ilemenu = t.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='ile'- menu=!ilemenuunderline=) editmenu = t.Henu(menubar) editmenu.add7command(label='Pre!erences'- command=notdone) menubar.add7cascade(label='
89
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. buttonsC'pos7J'D = bttn7pos7J buttonsC'rea$ustar'D = bttn7rea$ustar return buttons- labels
de! maebar(Oin- buttons=buttons- labels=labels)@ '''onstruye los campos donde se representan las lecturas de los sensores''' # reacion ob$eto *ra!ico@
de! maetable(Oin)@ marco = t.rame(Oin) marco.pac() # cabecera titulo7status = t.Label(marco- teGt='st'- relie!='!lat'Oidth=3- b*='bei*e') titulo7sensor = t.Label(marco- teGt='sensor'- relie!='!lat'Oidth=I- b*='bei*e') titulo7data = t.Label(marco- teGt='data'- relie!='!lat'Oidth=E3- b*='bei*e') titulo7status.pac(side='le!t') titulo7sensor.pac(side='le!t') titulo7data.pac(side='le!t') # tabla tabla = C(titulo7status- titulo7sensor- titulo7data)D !or i in ran*e(E-60E)@ marco = t.rame(Oin) marco.pac() status = t.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3) sensor = t.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I) data = t.Label(marco- teGt='++++'- relie!='sunen'- Oidth=E3) status.pac(side='le!t') sensor.pac(side='le!t') data.pac(side='le!t') tabla.append((status- sensor- data)) return tabla
#
9:998 P8H
90
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title('Posicion Hotor') Oinroot.a!ter(%-repeater) # actualiMacion de la W9 maemenu(Oinroot) buttons- labels = maebuttons(Oinroot) #buttons- labels = maebar(Oinroot) # lanMamiento del sistema de e5entos Oinroot.mainloop() # cierre de hilos print('cerrando') acti5idadC'play'D=alse acti5idadC'record'D=alse
91
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
92
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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. Programa bron6/orst+erver. que )ace de puente entre la red Et)ernet y el dispositivo serie. +oc6etClient. El mismo módulo 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.
Figura 3. Interfaz gr á fica bronkhorstGui
bron6o/orst:odule. 0nstrucciones para operar con el caudalímetro "ron-)orst. bron6/orst
93
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
bronkhorstServer # # # # #
bronhorster5er Python 3 Pro*rama puente cepta una coneGion a tra5es de un socet ;P/9P ue hace de puente con un puerto serie
import import import import
socet serial time threadin*
# +++onstantes+++ ;N = b'@' <;N = b'"n' # +++Kariables+++ acti5idad = # 4iccionario con el estado acti5idadC'run'D = ;rue # i alse => salir del pro*rama acti5idadC'serial'D = alse #
= 2 # se*undos1 tiempo maGimo de espera = .% # se*undos1 tiempo estimado de operacion
# +++lases+++ class Hessa*e()@ '''lase Hensa$e''' de! 77init77(sel!- bytetrin* = b''- n=)@ sel!.bytes9n = bytetrin* sel!.bytes8ut = b'' sel!.time = time.time() sel!.contador = n de! Orite(sel!- ob$ecterial)@ ob$ecterial.Orite(sel!.bytes9n) de! read(sel!- ob$ecterial)@ sel!.bytes8ut = b'' time = time.time() Ohile ;rue@
94
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. data = ob$ecterial.read() sel!.bytes8ut 0= data i! data == ;N@ sel!.bytes8ut = ;N i! (data == <;N) and (ob$ecterial.in,aitin*() == )@ brea i! time.time() > time0serial;ime8ut@ raise serial.erial;imeout
# +++unciones+++ #
<9<
de! serial7up()@ ''';hread that mae an ob$ect serial instance Silo para establecer la coneGion serie rea una instancia de un ob$eto serial (L8UL ob$ecterial).
95
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. Orite;imeout=E) # baudrate=3J eGcept serial.serialutil.erial 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('oneGion serie up') acti5idadC'serial'D = ;rue
#
8V<;
de! socet7up()@ *lobal *enocet try@ *enocet = socet.socet(socet.79:<;- socet.8V7;<H) eGcept 8
# +++++ 9:998 P8H +++++ print('+++ iniciando +++') threadin*.;hread(tar*et=serial7up).start() # ;hread socet7up() Ohile acti5idadC'run'D@ # Uucle try@ # rea un socet cliente tras una peticion de coneGion print(',aitin* nue5a coneGion ;P/9P...') coneGioned- address = *enocet.accept() coneGioned.settimeout(2) print('oneGion con'- address) # recepcion del mensa$e
96
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. data = b'' Ohile not <;N in data@ # reconstruye el mensa$e troMo = coneGioned.rec5(E2) i! not troMo@ brea data 0= troMo messa*e = Hessa*e(data) i! acti5idadC'serial'D@ messa*e.serie(ob$ecterial) else@ messa*e.bytes8ut = ;N 0 b'error-serial7doOn' 0 <;N # contestacion coneGioned.sendall(messa*e.bytes8ut) eGcept socet.timeout@ pass eGcept
97
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
socketClient # socetlient # Hodulo para la comunicacion como cliente por socet # especi!ico para el rduinoer5er.py # aracteristicas@ # Propa*a eGcepciones # ierra siempre el socet import socet import time de! send7rec5(messa*e- ip='localhost'- port=%J- t8p=- t8ut=E)@ '''
98
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
bronkhorstModule # bronhorstHodule # python 3 # unciones basicas # import socetlient 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 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' # socet try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E- t8ut=E) eGcept sc.socet.timeout@ return 'timeout' eGcept
99
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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') # socet try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort- t8p=E- t8ut=E) eGcept sc.socet.timeout@ return 'timeout' eGcept
100
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. tipo strin* de J caracters ''' l = '' # E2 nodo = '3' comando = '2' # send parameter sin peticion de estado proceso = 'E' # proceso parametro = '6' # tipo caracter () 0 Unr (parametro) 5alor = 'EEEEEEEE' 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 = '' # E2 nodo = '3' comando = '2' # send parameter sin peticion de estado proceso = 'E' # proceso parametro = '6' # tipo caracter () 0 Unr (parametro) 5alor = '' messa*e = ('@'0 l 0 nodo 0 comando 0 proceso 0 parametro 0 5alor 0 '"r"n') de! status()@ '''
101
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
bronkhorstGui # bronhorstui # python 3 # inter!aM *ra!ica para caudalimetro Uronhorst import tinter as t import tinter.messa*eboG as tm import threadin*- ueue- time import bronhorstHodule as br # 8:;:;< L8UL< # K9UL< # Kariables *lobales botones = # diccionario de ob$etos *ra!icos Uutton. record- play- stop. labels = # diccionario de ob$etos *ra!icos Labels- campos a actualiMar. dialo*os = acti5idad = 'run'@;rue- 'sa5e'@alse # boolean- i! alse => close thread dataueue = ueue.Yueue() # ola de datos de acceso en eGclusin mutua
# unciones de! repeater()@ '''ctualiMacion periodica''' try@ data = dataueue.*et(bloc=alse) eGcept ueue.
102
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
de! dialo*7chan*e7point()@ de! push()@ 5alor = dialo*o.*et() chan*e7point(5alor) popup.destroy() popup = t.;ople5el() dialo*o = t.= ) and (5alor F E))@ try@ br.set7point(int(5alor/32)) eGcept
# 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
103
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
de! maeUar(Oin- botones- labels)@ measure7teGt= t.Label(Oin- teGt='Heasure(?)@ '- Oidth=E2- hei*ht=2) measure7label = t.Label(Oin- teGt='++++'- Oidth=J) measure7teGt.pac(side='le!t') measure7label.pac(side='le!t') point7teGt= t.Label(Oin- teGt='etpoint (?)@ '- Oidth=E2- hei*ht=2) point7label = t.Label(Oin- teGt='++++'- Oidth=J) point7teGt.pac(side='le!t') point7label.pac(side='le!t') boton7point = t.Uutton(Oin- teGt='S:<'command=dialo*7chan*e7point- Oidth=) boton7point.pac(side='le!t') labelsC'measure'D=measure7label labelsC'point'D=point7label botonesC'point'D=boton7point return botones- labels
#
9:998 P8H
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title('Uronhorst') Oinroot.a!ter(E-repeater) # actualiMacion de la W9 maemenu(Oinroot) topmarco=t.rame() topmarco.pac() #botones- labels = maecanalbar(topmarco- botones- labels) botones- labels = maeUar(Oinroot- botones- labels) readin*() # lanMamiento del sistema de e5entos Oinroot.mainloop() # cierre de hilos acti5idadC'record'D=alse acti5idadC'run'D = alse
104
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Conjunto MaxiGauge tro dispositivo serie con lo que la estructura general a los vistos anteriormente. ma$i
Figura 4. Interfaz gr á fica maxiGaugeGui
105
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
maxiGaugeServer # # # # #
mauGiau*eer5er Python 3 Pro*rama puente cepta una coneGion a tra5es de un socet ;P/9P ue hace de puente con un puerto serie
import import import import
socet serial time threadin*
# +++onstantes+++ ;N= <;N= = L = <:Y= V= :V= <=
b'"G2' b'"G3' b'"G4' b'"G' b'"G%' b'"G6' b'"GE%' b'"GEU'
# # # # # # #
# +++Kariables+++ acti5idad = # 4iccionario con el estado acti5idadC'run'D = ;rue # i alse => salir del pro*rama acti5idadC'serial'D = alse #
= 2 # se*undos1 tiempo maGimo de espera = .% # se*undos1 tiempo estimado de operacion
# +++lases+++ class Hessa*e()@ '''lase Hensa$e''' de! 77init77(sel!- bytetrin* = b''- n=)@ sel!.bytes9n = bytetrin* sel!.bytes8ut = b'' sel!.time = time.time() sel!.contador = n de! Orite(sel!- ob$ecterial)@
106
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ob$ecterial.Orite(sel!.bytes9n) de! read(sel!- ob$ecterial)@ sel!.bytes8ut = b'' time = time.time() Ohile ;rue@ data = ob$ecterial.read() sel!.bytes8ut 0= data i! (data == L) and (ob$ecterial.in,aitin*() == )@ brea i! time.time() > time0serial;ime8ut0serial;ime8p@ raise serial.erial;imeout
# +++unciones+++ #
<9<
de! serial7up()@ ''';hread that mae an ob$ect serial instance
107
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. Silo para establecer la coneGion serie rea una instancia de un ob$eto serial (L8UL ob$ecterial). 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('oneGion serie up') acti5idadC'serial'D = ;rue
#
8V<;
de! socet7up()@ *lobal *enocet try@ *enocet = socet.socet(socet.79:<;- socet.8V7;<H) eGcept 8
# +++++ 9:998 P8H +++++
108
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. print('+++ iniciando +++') threadin*.;hread(tar*et=serial7up).start() # ;hread socet7up() Ohile acti5idadC'run'D@ # Uucle try@ # rea un socet cliente tras una peticion de coneGion print(',aitin* nue5a coneGion ;P/9P...') coneGioned- address = *enocet.accept() coneGioned.settimeout(2) print('oneGion con'- address) # recepcion del mensa$e data = b'' Ohile not <;N in data@ # reconstruye el mensa$e troMo = coneGioned.rec5(E2) i! not troMo@ brea data 0= troMo messa*e = Hessa*e(data) i! acti5idadC'serial'D@ messa*e.serie(ob$ecterial) else@ messa*e.bytes8ut = ;N 0 b'error-serial7doOn' 0 <;N # contestacion coneGioned.sendall(messa*e.bytes8ut) eGcept socet.timeout@ pass eGcept
109
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
socketClient # socetlient # Hodulo para la comunicacion como cliente por socet # especi!ico para el rduinoer5er.py # aracteristicas@ # Propa*a eGcepciones # ierra siempre el socet import socet import time de! send7rec5(messa*e- ip='localhost'- port=%J- t8p=.E- t8ut=E)@ '''
110
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
maxiGaugeModule # # # #
HaGiau*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 HaGiau*e.
import socetlient as sc # direccion 9P del ser5idor ser5erSost = 'localhost' ser5erPort = % ;N= <;N= = L = <:Y= V= :V= <=
'"G2' '"G3' '"G4' '"G' '"G%' '"G6' '"GE%' '"GEU'
# # # # # # #
# unciones 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 0 <:Y 0 0 <;N # socet try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort -t8p=E- t8ut=E) eGcept sc.socet.timeout@ return 'timeout' eGcept
111
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. return '8ut o! ran*e' messa*e = ;N 0 '<:' 0 y 0 0 <:Y 0 0 <;N try@ ans = sc.send7rec5(messa*e- ser5erSost- ser5erPort -t8p=E- t8ut=E) eGcept sc.socet.timeout@ return 'timeout' eGcept
112
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
maxiGaugeGui import import import import
tinter as t tinter.messa*eboG as tm threadin*- ueue- time maGiau*eHodule as mG*
# 8:;:;< L8UL< estado7sensor = C'8V'-'Wnd'-'85e'-' close thread dataueue = ueue.Yueue() # ola de datos de acceso # unciones de! repeater()@ try@ data = dataueue.*et(bloc=alse) eGcept ueue.
113
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ans = mG*.read7press(i) (st- 5alor) = ans eGcept
114
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. eGcept@ print('eGception') # 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
teGt='9:9;'- command=init- Oidth=3) teGt='<'- command=record- Oidth=3) teGt='PLZ'- command=play- Oidth=3) teGt=';8P'- command=stop- Oidth=3)
de! maetable(Oin)@ marco = t.rame(Oin) marco.pac() # cabecera
115
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. titulo7status = t.Label(marco- teGt='st'- relie!='!lat'Oidth=3- b*='bei*e') titulo7sensor = t.Label(marco- teGt='sensor'- relie!='!lat'Oidth=I- b*='bei*e') titulo7data = t.Label(marco- teGt='data'- relie!='!lat'Oidth=E3- b*='bei*e') titulo7status.pac(side='le!t') titulo7sensor.pac(side='le!t') titulo7data.pac(side='le!t') # tabla tabla = C(titulo7status- titulo7sensor- titulo7data)D !or i in ran*e(E-60E)@ marco = t.rame(Oin) marco.pac() status = t.Label(marco- teGt='++'- relie!='rid*e'- Oidth=3) sensor = t.Label(marco- teGt=str(i)- relie!='rid*e'- Oidth=I) data = t.Label(marco- teGt='++++'- relie!='sunen'- Oidth=E3) status.pac(side='le!t') sensor.pac(side='le!t') data.pac(side='le!t') tabla.append((status- sensor- data)) return tabla
#
9:998 P8H
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title('HaGiau*e') Oinroot.a!ter(E-repeater) # actualiMacion de la W9 maemenu(Oinroot) botones = maecommandbar(Oinroot) tabla = maetable(Oinroot) # lanMamiento del sistema de e5entos Oinroot.mainloop() # cierre de hilos acti5idadC'play'D=alse acti5idadC'record'D=alse
116
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
Conjunto Spellman Primer dispositivo que aparece con conexión Et)ernet. Por lo que no se va a necesitar el programa servidor que )acía de puente con el dispositivo serie. sellman:odule. %ódulo donde se recogen las instrucciones para operar con la !pellman. sellam
Figura 5. Interfaz gr á fica spellmaGui
117
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
spellmanModule # spellmanHodule # python 3 # modulo para en5iar comandos por socets ;P/9P import sys import socet import time ser5erSost = 'EI2.E6J.E.' ser5erSost = 'localhost' # oneGion serie ser5erPort = % ;N = b'"G2' # tart o! ;eGt character <;N = b'"G3' #
# unciones basicas de! conect()@ socob$ect = socet.socet(socet.79:<;- socet.8V7;<H) socob$ect.settimeout(3) socob$ect.connect((ser5erSost- ser5erPort)) return socob$ect de! send(socob$ect- byte7strin*)@ socob$ect.send(byte7strin*) de! recei5e(socob$ect)@ data = b'' Ohile ;rue@ try@ data 0= socob$ect.rec5(E2) eGcept socet.timeout@ return data i! <;N in data@ return data de! close7socet(socob$ect)@ socob$ect.close() # unciones compuestas de! command(cmd-ar*=:one)@ cmd = bytes(str(cmd)- encodin* = 'ascii') i! ar* == :one@ messa*e = ;N 0 cmd 0 b'"G2' 0 <;N else@ ar* = bytes(str(ar*)- encodin* = 'ascii') messa*e = ;N 0 cmd 0 b'"G2' 0 ar* 0 b'"G2' 0 <;N
118
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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
119
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ar* = :one try@ ans = command(cmd-ar*).strip(;N0<;N0b'-').split(b'-') return ansCD-ansCED-ansC2D-ansC3D-ansCD-ansC%D-ansC6D-ansCBD eGcept o)''' cmd = J% ar* = E try@ ans = command(cmd-ar*).strip(;N0<;N0b'-').split(b'-') return ansCD-ansCED eGcept o)''' cmd = J% ar* = try@ ans = command(cmd-ar*).strip(;N0<;N0b'-').split(b'-') return ansCD-ansCED
120
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. eGcept o)''' cmd = II ar* = E try@ ans = command(cmd-ar*).strip(;N0<;N0b'-').split(b'-') return ansCD-ansCED eGcept o)''' cmd = II ar* = try@ ans = command(cmd-ar*).strip(;N0<;N0b'-').split(b'-') return ansCD-ansCED eGcept
121
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ar* = name 0'-'0 ip 0'-'0 port 0'-'0 mas 0'-'0 *ateOay 0'-'0 H command(cmd-ar*) eGcept
122
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
spellmanGui # spellmanui # python 3 import tinter as t import tinter.messa*eboG as tm import threadin*- ueue- time import spellmanHodule as spll #import alerta7correo as alerta # 8:;:;< L8UL< maG7K=%< #%.- K coe!7K=maG7K/I% maG79=.6 #.6 m coe!79=maG79/I% # K9UL< alerta7acti5a = alse # Kariables *lobales botones = # diccionario de ob$etos *ra!icos Uutton. record- play- stop. labels = # diccionario de ob$etos *ra!icos Labels- campos a actualiMar. dialo*os = acti5idad = 'connected'@alse- 'sa5e'@alse- 'remote'@alse # boolean- i! alse => close thread dataueue = ueue.Yueue() # ola de datos de acceso en eGclusin mutua
# unciones de! init()@ '''9nicialiMa el pro*rama''' # try connection acti5idadC'connected'D=;rue readin*() de! repeater()@ '''ctualiMacion periodica''' try@ data = dataueue.*et(bloc=alse) eGcept ueue.
123
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 dataueue.put(('5olta*e'-'?%i' ? 5olta*e)) #E dataueue.put(('current'-'?6.%!' ? current)) #2 ans = spll.system() i! ans Q= b''@ hi*h75olta*e = str(int(ansCED)) dataueue.put(('h5'- hi*h75olta*e)) #3 i! (hi*h75olta*e7anterior == 'E') and (hi*h75olta*e == '')@ print ('====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)) dataueue.put(('remote'-remote)) # dataueue.put(('arc'- arc)) #% ans = spll.reuest74() i! ans Q= b''@ 5olta*e7dac = int(ansCED)coe!7K dataueue.put(('5olta*e7dac'-'?%i' ?5olta*e7dac))#6 ans = spll.reuest74(E) i! ans Q= b''@ current7dac = int(ansCED)coe!79 dataueue.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 implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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 = t.;ople5el() dialo*o = t.= ) and (5alor F (I%coe!7K))@ 5alor = int(5alor/coe!7K) print(''-5alor) spll.set74(-5alor) de! dialo*7chan*e7current7dac()@ de! push7dac()@ 5alor = dialo*o.*et() chan*e7current7dac(5alor) popup.destroy() popup = t.;ople5el() dialo*o = t.= ) and (5alor F (I%coe!79))@
125
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. 5alor = int(5alor/coe!79) print(' W<:;'-5alor) spll.set74(E-5alor) de! alerta7correo7on()@ *lobal alerta7acti5a alerta7acti5a = ;rue de! alerta7correo7o!!()@ *lobal alerta7acti5a alerta7acti5a = alse # 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
correo on'- command=alerta7correo7on) correo o!!'- command=alerta7correo7o!!) on'- command=remote7on) o!!'- command=remote7o!!) menu=toolmenu- underline=)
helpmenu = t.Henu(menubar) helpmenu.add7command(label='bout'-command=notdone) menubar.add7cascade(label='Selp'- menu=helpmenu- underline=) de! maeh5bar(Oin- botones- labels)@ marco = t.rame(Oin) marco.pac(side='le!t') etiueta7teGt = t.Label(marco- teGt=' SK @ '-Oidth=E) etiueta = t.Label(marco- teGt=' ++ '-Oidth=%) boton7h57on = t.Uutton(marco- teGt='8:'- command=h57on- Oidth=3) boton7h57o!!= t.Uutton(marco- teGt='8'-command=h57o!!- Oidth=3) etiueta7teGt.pac(side='le!t') etiueta.pac(side='le!t') boton7h57on.pac(side='le!t')
126
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. boton7h57o!!.pac(side='le!t') labelsC'h5'D=etiueta botonesC'h57on'D=boton7h57on botonesC'h57o!!'D=boton7h57o!! return botones- labels
de! maeremotebar(Oin- botones- labels)@ marco = t.rame(Oin) marco.pac(side='le!t') etiueta7teGt = t.Label(marco- teGt='
127
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. marco = t.rame(Oin) marco.pac(side='bottom') marcoE = t.rame(marco) marcoE.pac() marco2 = t.rame(marco) marco2.pac() 5olta*e7dac7teGt= t.Label(marcoE- teGt='Kolta*e 4(K) @ '- Oidth=E) 5olta*e7dac = t.Label(marcoE- teGt='++++'- Oidth=J) 5olta*e7dac7teGt.pac(side='le!t') 5olta*e7dac.pac(side='le!t') boton75olta*e7dac = t.Uutton(marcoE- teGt='S:<'command=dialo*7chan*e75olta*e7dac- Oidth=) boton75olta*e7dac.pac(side='le!t') current7dac7teGt= t.Label(marco2- teGt='urrent 4(m)@ '- Oidth=E) current7dac = t.Label(marco2- teGt='++++'- Oidth=J) current7dac7teGt.pac(side='le!t') current7dac.pac(side='le!t') boton7current7dac = t.Uutton(marco2- teGt='S:<'command=dialo*7chan*e7current7dac- Oidth=) boton7current7dac.pac(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:998 P8H
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title('pellman') Oinroot.a!ter(E-repeater) # actualiMacion de la W9 maemenu(Oinroot) topmarco=t.rame() topmarco.pac() botones- labels = maeh5bar(topmarco- botones- labels) botones- labels = maeremotebar(topmarco- botones- labels) labels.update(maetable(Oinroot)) botones- labels = maedac(Oinroot- botones- labels) # lanMamiento del sistema de e5entos init() Oinroot.mainloop() # cierre de hilos acti5idadC'connected'D=alse acti5idadC'record'D=alse
128
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección 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
Figura 6. Interfaz gr á fica caenGui
129
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
caenModule # caenHodule # python 3 # Hodulo con instrucciones para <: import ctypes path = './G6/libcaenh5Orapper.so.%.2' # lu*ar de la biblioteca path = './libcaenh5Orapper.so.%.2' # lu*ar de la biblioteca libaen = ctypes.cdll.LoadLibrary(path) # 5ariables slot = 3 #
//in
7initystem = libaen.<:SK9nitystem 7initystem.ar*types = ( ctypes.P89:;<(ctypes.c7char)ctypes.c7intctypes.P89:;<(ctypes.c7char)ctypes.P89:;<(ctypes.c7char)ctypes.P89:;<(ctypes.c7char) ) 7initystem.restype = (ctypes.c7int) de! initystem(
system:ame = b'ystem2'lin;ype = adress = b'EI2.E6J..E32'user:ame = b'admin'passOord = b'admin')@ return 7initystem(system:ame- lin;ype- adress- user:ame- passOord)
# 4einitystem 7deinitystem = libaen.<:SK4einitystem 7deinitystem.ar*types = ( ctypes.P89:;<(ctypes.c7char)) 7deinitystem.restype = (ctypes.c7int) de! deinitystem( system:ame = b'ystem2')@ return 7deinitystem(system:ame)
130
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. # int <:SKethParam( # const char ystem:ame- //in # unsi*ned short slot//in # const char Parname//in # unsi*ned short h:um//in # cnst uns* short hList//in # const char ParKalue //in de! ethParam( system:ameslotpar:amech:umchListparKalue)@ # de!inicion de los tipos de entrada 7ethParam= libaen.<:SKethParam 7ethParam.ar*types = ( ctypes.P89:;<(ctypes.c7char)ctypes.c7ushortctypes.P89:;<(ctypes.c7char)ctypes.c7ushortctypes.P89:;<(ctypes.c7ushort)ctypes.P89:;<(ctypes.c7!loat) ) 7ethParam.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.c7ushortlen(chList))(chList) #chList = (ctypes.c7ushortlen(chList))(chList) #chList = ctypes.c7ushort() #print(chList) parKalue = ctypes.c7!loat(parKalue) return 7ethParam(system:ame- slot- par:ame- ch:um- chList- parKalue) # int <:SKethParam( # const char # unsi*ned short # const char # unsi*ned short # cnst uns* short # const char
ystem:ame- //in slotParnameh:umhListParKalList
//in //in //in //in //out
de! ethParam(
system:ameslotpar:amech:umchList)@ 7ethParam= libaen.<:SKethParam 7ethParam.ar*types = ( ctypes.P89:;<(ctypes.c7char)-
131
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ctypes.c7ushortctypes.P89:;<(ctypes.c7char)ctypes.c7ushortctypes.P89:;<(ctypes.c7ushort)ctypes.P89:;<(ctypes.c7!loat) ) 7ethParam.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.c7ushortlen(chList))(chList) parKalue = (ctypes.c7!loatch:um.5alue)() return( 7ethParam(system:ame- slot- par:ame- ch:um- chListparKalue)CparKalueCiD !or i in ran*e(ch:um.5alue)D ) # int <:SKethParam( # const char ystem:ame- //in # unsi*ned short slot//in # const char Parname//in # unsi*ned short h:um//in # cnst u short hList//in # const int ParKalue //in #boolean de! ethUool( system:ameslotpar:amech:umchListparKalue)@ 7ethUool= libaen.<:SKethParam 7ethUool.ar*types = ( ctypes.P89:;<(ctypes.c7char)ctypes.c7ushortctypes.P89:;<(ctypes.c7char)ctypes.c7ushortctypes.P89:;<(ctypes.c7ushort)ctypes.P89:;<(ctypes.c7int) ) 7ethUool.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.c7ushortlen(chList))(chList) parKalue = ctypes.c7int(parKalue) return 7ethUool(system:ame- slot- par:ame- ch:um- chList- parKalue) # unciones especi!icas de! init()@ '''oneGion a la <: G no hay error'''
132
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. return initystem() de! out()@ '''4esconeGion''' return deinitystem() de! setK(n-G)@ '''i$a el 5alor de 5olta$e del canal n en G ch:um es el numero de canales pasados en chList''' return ethParam(b'ystem2'- slot- b'Ket'- E- CnD- G) de! set9(n-G)@ '''i$a el 5alor de la intensidad del canal n en G''' return ethParam(b'ystem2'- slot- b'9et'- E- CnD- G) de! *etK(n)@ return ethParam(b'ystem2'- slot- b'Ket'- E- CnD ) de! *et9(n)@ return ethParam(b'ystem2'- slot- b'9et'- E- CnD ) de! *etKHon(n)@ return ethParam(b'ystem2'- slot- b'KHon'- E- CnD ) de! *et9Hon(n)@ return ethParam(b'ystem2'- slot- b'9Hon'- E- CnD ) de! on(n)@ return ethUool(b'ystem2'- slot- b'PO'- E- CnD- E ) de! o!!(n)@ return ethUool(b'ystem2'- slot- b'PO'- E- CnD- )
133
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
caenGui # caenui # python 3 # inter!aM *ra!ica para <: import tinter as t import tinter.messa*eboG as tm import threadin*- ueue- time import caenHodule as caen # 8:;:;< L8UL< # K9UL< # Kariables *lobales botones = # diccionario de ob$etos *ra!icos Uutton. record- play- stop. labels = # diccionario de ob$etos *ra!icos Labels- campos a actualiMar. dialo*os = acti5idad = 'run'@;rue- 'connected'@alse- 'sa5e'@alse- 'remote'@alse # boolean- i! alse => close thread dataueue = ueue.Yueue() # ola de datos de acceso en eGclusin mutua caen.slot =3 canal = %
# unciones de! repeater()@ '''ctualiMacion periodica''' try@ data = dataueue.*et(bloc=alse) eGcept ueue.
134
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. ans = caen.*etKHon(canal) dataueue.put(('5olta*e'-'?.E!' ? (ansCEDCD))) time.sleep(.%) ans = caen.*et9Hon(canal) dataueue.put(('current'-'?.E!' ? (ansCEDCD))) time.sleep(.%) eGcept
de! canal7o!!()@ # threadin*.;hread(tar*et=canal7o!!7thread).start()
135
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. #de! canal7o!!7thread()@ try@ ans = caen.o!!(canal) i! ans == @ dataueue.put(('canal'- 'o!!')) else@ pass eGcept = ) and (5alor F E))@ try@ caen.setK(canal-5alor) eGcept
136
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. i! ((5alor >= ) and (5alor F E))@ try@ caen.set9(canal-5alor) eGcept
# 4e!inicion de las 5entanas de! notdone()@ tm.shoOerror(':8 implementado'- ':8 disponible."n
137
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura.
de! maeremotebar(Oin- botones- labels)@ marco = t.rame(Oin) marco.pac(side='le!t') etiueta7teGt = t.Label(marco- teGt='
138
Desarrollo e implantación de un sistema de adquisición de datos y monitorización para un sistema de detección de materia oscura. boton75olta*e = t.Uutton(marcoE- teGt='S:<'command=dialo*7chan*e75olta*e- Oidth=) boton75olta*e.pac(side='le!t') current7teGt= t.Label(marco2- teGt='urrent (u)@ '- Oidth=Ehei*ht=2) current = t.Label(marco2- teGt='++++'- Oidth=J) current7teGt.pac(side='le!t') current.pac(side='le!t') boton7current = t.Uutton(marco2- teGt='S:<'command=dialo*7chan*e7current- Oidth=) boton7current.pac(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:998 P8H
i! 77name77=='77main77'@ Oinroot = t.;() Oinroot.title('aen') Oinroot.a!ter(E-repeater) # actualiMacion de la W9 maemenu(Oinroot) topmarco=t.rame() topmarco.pac() botones- labels = maecanalbar(topmarco- botones- labels) botones- labels = maeremotebar(topmarco- botones- labels) labels.update(maetable(Oinroot)) botones- labels = maedac(Oinroot- botones- labels) readin*() # lanMamiento del sistema de e5entos Oinroot.mainloop() # cierre de hilos acti5idadC'connected'D=alse acti5idadC'record'D=alse
actividadHMrunMI R False
139