{"id":1494,"date":"2019-01-04T09:37:00","date_gmt":"2019-01-04T14:37:00","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=1494"},"modified":"2022-02-26T08:28:30","modified_gmt":"2022-02-26T13:28:30","slug":"pulso-cardiaco","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/edelros\/pulso-cardiaco\/","title":{"rendered":"Pulso Cardiaco"},"content":{"rendered":"<p>Se obtienen los datos para describir el comportamiento de un pulso cardiaco a partir de un \"Sensor cardiaco\" para arduino, luego pueden ser procesados con los conceptos te\u00f3ricos del caso, por ejemplo: <a href=\"http:\/\/blog.espol.edu.ec\/analisisnumerico\/\">MATG1052 M\u00e9todos Num\u00e9ricos<\/a>.<\/p>\n<p>Un ejemplo de los datos capturados \"en vivo\" se muestran a continuaci\u00f3n.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1536 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02-1.png\" alt=\"\" width=\"547\" height=\"421\" srcset=\"https:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02-1.png 547w, https:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02-1-300x231.png 300w\" sizes=\"auto, (max-width: 547px) 100vw, 547px\" \/><\/a><\/p>\n<p>Los datos del sensor se transmiten por medio del puerto USB al computador, donde son capturados con el programa Python. Los datos se agregan a un arreglo o vector y se pueden procesar con los algoritmos desarrollados en el curso.<\/p>\n<h2>1. Piezas y Partes<\/h2>\n<p>Para el ejemplo se requieren los siguiente elementos:<\/p>\n<ul>\n<li><a href=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1496 alignright\" src=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco02.png\" alt=\"\" width=\"207\" height=\"252\" \/><\/a>Arduino Uno<\/li>\n<li>Sensor de pulso cardiaco<\/li>\n<li>cables de conexi\u00f3n<\/li>\n<\/ul>\n<p>En las figuras se muestra el tipo de\u00a0 sensor que se aproxima a un dedo \u00edndice del sujeto\u00a0 bajo pruebas.<\/p>\n<p>El sensor dispone de tres pines: Se\u00f1al (S), Vcc(+) y GND (-)<\/p>\n<h2>2. Conexi\u00f3n Arduino<\/h2>\n<p>La se\u00f1al obtenida es de tipo anal\u00f3gica, por lo que se debe conectar a pines anal\u00f3gicos del Arduino, en el ejemplo etiquetado A0. El arduino cuantifica el valor y lo env\u00eda al puerto serial para procesar los datos.<\/p>\n<p>El diagrama b\u00e1sico de conexi\u00f3n se muestra en el esquema.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1499 size-medium alignright\" src=\"http:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco03-193x300.png\" alt=\"\" width=\"193\" height=\"300\" srcset=\"https:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco03-193x300.png 193w, https:\/\/blog.espol.edu.ec\/edelros\/files\/2019\/01\/PulsoCardiaco03.png 565w\" sizes=\"auto, (max-width: 193px) 100vw, 193px\" \/><\/a>Para evitar interferencias en las lecturas, se recomienda cubrir el sensor durante el uso con material obscuro. De \u00e9sta forma el sensor recibir\u00e1 solo la luz emitida por el LED (foquito).<\/p>\n<p>La lectura se debe realizar en reposo para mantener consistencia de los datos entre los pulsos y evitar lecturas con errores por movimientos del sujeto bajo pruebas.<\/p>\n<p>Los datos obtenidos se env\u00edan al puerto serial para ser procesados.<\/p>\n<h2>3. Instrucciones Arduino<\/h2>\n<p>Las instrucciones en arduino son sencillas, requieren identificar el pin de conexi\u00f3n, tiempo entre muestras o \"retraso\" y la lectura del valor.<\/p>\n<p>Cargue las siguientes instrucciones en al arduino para obtener las lecturas.<\/p>\n<pre><span style=\"color: #434f54\">\/\/ Monitor de pulso cardiaco<\/span>\r\n<span style=\"color: #434f54\">\/\/ \u00a0El sensor en PIN Anal\u00f3gico A0<\/span>\r\n\r\n<span style=\"color: #00979c\">int<\/span> <span style=\"color: #000000\">SensorPin<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #000000\">0<\/span><span style=\"color: #000000\">;<\/span>\r\n<span style=\"color: #00979c\">int<\/span> <span style=\"color: #000000\">retraso<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #000000\">100<\/span><span style=\"color: #000000\">;<\/span>\r\n<span style=\"color: #00979c\">void<\/span> <span style=\"color: #5e6d03\">setup<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">{<\/span>\r\n \u00a0<b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">begin<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">9600<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">;<\/span>\r\n \u00a0<span style=\"color: #000000\">}<\/span>\r\n<span style=\"color: #00979c\">void<\/span> <span style=\"color: #5e6d03\">loop<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">{<\/span>\r\n \u00a0\u00a0\u00a0<span style=\"color: #00979c\">double<\/span> <span style=\"color: #000000\">valor<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #d35400\">analogRead<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">SensorPin<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">;<\/span>\r\n \u00a0\u00a0\u00a0<b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">valor<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">;<\/span> \r\n \u00a0\u00a0\u00a0<span style=\"color: #d35400\">delay<\/span> <span style=\"color: #000000\">(<\/span><span style=\"color: #000000\">retraso<\/span><span style=\"color: #000000\">)<\/span><span style=\"color: #000000\">;<\/span>\r\n \u00a0<span style=\"color: #000000\">}<\/span>\r\n<\/pre>\n<p>Las lecturas se pueden observar en el IDE Arduino, men\u00fa de <code>Herramientas\/monitor Serie<\/code>.<br \/>\nSin embargo, para la captura de datos con Python, no se debe tener abierta la ventana del monitor serie del IDE Arduino, pues el <code>puerto com<\/code> puede ser usado por \u00fanico un programa al mismo tiempo.<\/p>\n<h2>4. Captura y Gr\u00e1fico de datos en Python<\/h2>\n<p>Las siguientes instrucciones de Python permiten la captura de datos desde el puerto serial, conexi\u00f3n USB, del arduino.<\/p>\n<p>Para obtener el n\u00famero del puerto \"com#\" se observa el valor en el IDE Arduino que tiene en el men\u00fa Herramientas\/puerto, con lo que se actualiza la variable \"puerto\" en las instrucciones siguientes.<\/p>\n<p>Para graficar los datos se conservan una <code>ventana<\/code> de 50 valores en el vector <code>yi<\/code>.<br \/>\nSi observa los valores de <code>yi<\/code>, se encuentran en el rango definido por los valores <code>a<\/code> y <code>b<\/code>, modifique si su sensor esta calibrado en otro rango.<\/p>\n<pre><span style=\"color: #ff0000\"># Grafica \"en vivo\" para actualizar datos<\/span>\r\n<span style=\"color: #ff0000\"># recibidos por puerto serial<\/span>\r\n<span style=\"color: #ff0000\"># Plantilla para proyecto, datos de prueba aleatorios<\/span>\r\n<span style=\"color: #ff0000\"># http:\/\/blog.espol.edu.ec\/edelros\/pulso-cardiaco\/<\/span>\r\n<span style=\"color: #ff0000\"># Tarea: Actualizar los datos en la funci\u00f3n una trama para yi<\/span>\r\n<span style=\"color: #ff0000\">#        Con los obtenidos desde el puerto Serial<\/span>\r\n\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> serial, time\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.pyplot <span style=\"color: #d35400\">as<\/span> plt\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.animation <span style=\"color: #d35400\">as<\/span> animation\r\n\r\n<span style=\"color: #ff0000\"># Datos puerto Serial<\/span>\r\npuerto  = <span style=\"color: #008000\">'com10'<\/span> <span style=\"color: #ff0000\"># revisar en arduino<\/span>\r\nbaudios = 9600\r\n\r\n<span style=\"color: #ff0000\"># PARAMETROS DE LA GRAFICA<\/span>\r\nretraso = 5\r\nventana = 50\r\n<span style=\"color: #ff0000\"># rango de lectura<\/span>\r\na = 495\r\nb = 535\r\n\r\n<span style=\"color: #ff0000\"># Datos a graficar<\/span>\r\nyi = [500]*ventana\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n\r\n<span style=\"color: #ff0000\"># Inicializa comunicaci\u00f3n con arduino<\/span>\r\narduino = serial.Serial(puerto, baudios)\r\narduino.setDTR(<span style=\"color: #d35400\">False<\/span>)  \r\ntime.sleep(0.3)  \r\n<span style=\"color: #ff0000\"># limpia buffer de datos anteriores<\/span>\r\narduino.flushInput()\r\narduino.setDTR()  \r\ntime.sleep(0.3)\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'\\nEstado del puerto: '<\/span>,arduino.isOpen())\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Nombre del dispositivo conectado: '<\/span>, arduino.name)\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'Dump de la configuraci\u00f3n:\\n '<\/span>,arduino)\r\n<span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'\\n###############################################\\n'<\/span>)\r\n\r\n\r\n<span style=\"color: #ff0000\"># GRAFICA figura<\/span>\r\nfigura = plt.figure()\r\ngrafica = figura.add_subplot(111)\r\ngrafica.set_ylim(a,b)\r\ngrafica.set_title(<span style=\"color: #008000\">'Pulso Cardiaco'<\/span>)\r\n\r\n<span style=\"color: #ff0000\"># Linea de pulso y ventana de datos a graficar<\/span>\r\ntamano = ventana\r\npulso  = yi[-tamano:]\r\nlineaPulso, = grafica.plot(pulso, <span style=\"color: #008000\">'y'<\/span>)\r\n\r\n<span style=\"color: #ff0000\"># linea del pulso y puntoreferencia:<\/span>\r\npuntoPulso, = grafica.plot(<span style=\"color: #ff00ff\">len<\/span>(yi)-1,yi[-1],<span style=\"color: #008000\">'ro'<\/span>)\r\n\r\n<span style=\"color: #ff0000\"># Nueva Trama<\/span>\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">unatrama<\/span>(i,yi,ventana):\r\n\r\n    <span style=\"color: #d35400\">while<\/span> (arduino.inWaiting()==0):\r\n        <span style=\"color: #d35400\">pass<\/span> <span style=\"color: #ff0000\">#esperar hasta recibir un dato<\/span>\r\n    linea   = arduino.readline() <span style=\"color: #ff0000\"># lee puerto serial<\/span>\r\n    lectura = linea.decode().strip() <span style=\"color: #ff0000\"># elimina \/r\/n<\/span>\r\n    undato  = <span style=\"color: #ff00ff\">float<\/span>(lectura)\r\n\r\n    <span style=\"color: #ff0000\"># actualiza datos xi, yi<\/span>\r\n    <span style=\"color: #ff0000\"># xi.append(angulo) <\/span>\r\n    yi.append(undato)<span style=\"color: #ff0000\"># numero del dato ejemplo<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># ventana de datos a graficar<\/span>\r\n    Pulso = yi[-ventana:]\r\n    lineaPulso.set_ydata(Pulso)\r\n    \r\n    <span style=\"color: #ff0000\"># Linea y punto del Pulso<\/span>\r\n    puntoPulso.set_ydata(Pulso[-1])  \r\n\r\n    <span style=\"color: #ff0000\"># Presenta valores \u00faltimos valores en pantalla<\/span>\r\n    <span style=\"color: #ff00ff\">print<\/span>(Pulso)\r\n\r\n    <span style=\"color: #ff0000\"># Si los datos son m\u00e1s de 1000<\/span>\r\n    <span style=\"color: #ff0000\"># Elimina el m\u00e1s antiguo del historial<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(yi)&gt;ventana:\r\n        <span style=\"color: #ff0000\"># xi.pop(0)<\/span>\r\n        yi.pop(0)\r\n    \r\n    <span style=\"color: #d35400\">return<\/span>()\r\n\r\n<span style=\"color: #ff0000\"># Animaci\u00f3n<\/span>\r\nani = animation.FuncAnimation(figura,\r\n                              unatrama,\r\n                              fargs=(yi,ventana),\r\n                              interval=retraso,\r\n                              blit=<span style=\"color: #d35400\">True<\/span>)\r\n\r\nplt.show()\r\n<\/pre>\n<p><strong>Referencias<\/strong>: Sensor <a href=\"https:\/\/pulsesensor.com\/\">https:\/\/pulsesensor.com\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se obtienen los datos para describir el comportamiento de un pulso cardiaco a partir de un \"Sensor cardiaco\" para arduino, luego pueden ser procesados con los conceptos te\u00f3ricos del caso, por ejemplo: MATG1052 M\u00e9todos Num\u00e9ricos. Un ejemplo de los datos capturados \"en vivo\" se muestran a continuaci\u00f3n. Los datos del sensor se transmiten por medio &hellip; <a href=\"https:\/\/blog.espol.edu.ec\/edelros\/pulso-cardiaco\/\" class=\"more-link\">Sigue leyendo <span class=\"screen-reader-text\">Pulso Cardiaco<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1293416],"tags":[],"class_list":["post-1494","post","type-post","status-publish","format-standard","hentry","category-pulso-cardiaco"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/posts\/1494","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/comments?post=1494"}],"version-history":[{"count":9,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/posts\/1494\/revisions"}],"predecessor-version":[{"id":2309,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/posts\/1494\/revisions\/2309"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/media?parent=1494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/categories?post=1494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/edelros\/wp-json\/wp\/v2\/tags?post=1494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}