{"id":2683,"date":"2020-11-20T15:34:18","date_gmt":"2020-11-20T20:34:18","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2683"},"modified":"2021-08-18T10:56:25","modified_gmt":"2021-08-18T15:56:25","slug":"lora-rssi-y-snr-datos-usb-serial-a-un-archivo-txt","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lora-rssi-y-snr-datos-usb-serial-a-un-archivo-txt\/","title":{"rendered":"2.2 Captura datos. Dispositivo con USB-Serial a un archivo.txt usando Python"},"content":{"rendered":"<p>La relaci\u00f3n de valores de Rssi y distancia hacia cada punto de referencia (baliza), se estima a partir de las mediciones en varios puntos establecidos y ubicados en un mapa.<\/p>\n<p>En cada punto, los valores se estiman considerando usar al menos 100 lecturas hacia cada baliza en cada punto.<\/p>\n<p>En \u00e9ste proceso usa un computador port\u00e1til que captura las tramas de cada paquete recibido por el dispositivo desde el puerto USB-Serial a un archivo.txt.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/SerialUsbTXT01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2760 aligncenter\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/SerialUsbTXT01.png\" alt=\"\" width=\"409\" height=\"312\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/SerialUsbTXT01.png 409w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/SerialUsbTXT01-300x229.png 300w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><\/a><\/p>\n<p>Cada baliza periodicamente emite un paquete que permite al dispositivo registar los valores de Rssi y SNR. Cada captura se registra en una l\u00ednea de texto como un paquete recibido y etiquetado como \"rx\".<\/p>\n<p>Para registrar el Rssi y SNR desde el otro extremo, la baliza, se emite un paquete de difusi\u00f3n desde el dispositivo, con el que la baliza al recibirlo toma los valores de Rssi y SNR y los envia al dispositivo en el pr\u00f3ximo env\u00edo. El paquete de difusi\u00f3n del dispositivo se etiqueta como 'tx' en el archivo txt.<\/p>\n<p>En la pantalla del computador port\u00e1til se muesta el estado del registro de datos en cada evento de recepci\u00f3n.<\/p>\n<h2>Configuraci\u00f3n del algoritmo en Python<\/h2>\n<p>La captura de datos desde USB se realiza usando instrucciones en Python, con la que se pre-procesa cada paquete y se almacena en un archivo.<\/p>\n<p>En el bloque de INGRESO es necesario indicar:<\/p>\n<ul>\n<li>el puerto 'com' y los baudios del dispositivo conectado por USB<\/li>\n<li>el nombre del archivo de texto que registra la captura de datos<\/li>\n<li>las direcciones de las balizas, identificadores indicados en la secci\u00f3n anterior<\/li>\n<li>la cantidad m\u00ednima de lecturas desde cada baliza<\/li>\n<\/ul>\n<p>El puerto 'com' se puede verificar antes de iniciar la captura, usando el IDE de arduino, al conectar lo muestra en el menu de herramientas\/puerto.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaPuertoCom01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2775\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaPuertoCom01.png\" alt=\"\" width=\"523\" height=\"471\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaPuertoCom01.png 523w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaPuertoCom01-300x270.png 300w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><\/a><\/p>\n<p>El proceso de captura se ejecuta en un lazo, en caso de ser necesario deterner se pueden usar las teclas \"Ctrl-c\".<\/p>\n<p>En cada punto de referencia se requiere asignar un nombre a cada archivo, iniciando el nombre con \"multipunto\" a\u00f1adiendo letras para identificar el sector y un n\u00famero como identificador del punto.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaLocalizaCampus01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3142\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaLocalizaCampus01.png\" alt=\"\" width=\"643\" height=\"507\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaLocalizaCampus01.png 643w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/LoRaLocalizaCampus01-300x237.png 300w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/a><\/p>\n<p>En los puntos de prueba el nombre del archivo inicia con \"mpcircuito\". Observe que ambas palabras de inicio contienen la misma cantidad de caracteres, pues facilita el procesamiento de los archivos.<\/p>\n<p>Los archivos se almacenan en una carpeta de donde se puedan leer por lotes en el siguiente proceso de los datos.<\/p>\n<hr \/>\n<h2>Algoritmo en Python<\/h2>\n<pre><span style=\"color: #008000\">''' Rssi y SNR LoRa punto a punto\r\npaquete de datos desde puerto Serial\r\ngenerados desde dispositivo LoRa\r\nmodelo Heltec Lora 32 v.2\r\nGirni 2020-10-07 propuesta: edelros@espol.edu.ec\r\n'''<\/span>\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\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> serial, time\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\n<span style=\"color: #ff0000\"># Puerto de captura de datos USB-Serial<\/span>\r\npuerto = <span style=\"color: #008000\">'com3'<\/span>\r\nbaudios = 115200\r\n\r\n<span style=\"color: #ff0000\"># Archivo para el registro de cada evento rx,tx<\/span>\r\nnombrearchivo = <span style=\"color: #008000\">'multipuntoFIEC101.txt'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># identificadores de balizas<\/span>\r\nbaliza = [<span style=\"color: #008000\">'d1'<\/span>,<span style=\"color: #008000\">'d2'<\/span>,<span style=\"color: #008000\">'d3'<\/span>]\r\n\r\n<span style=\"color: #ff0000\"># M\u00ednimo de lecturas por baliza<\/span>\r\nlecturasMin = 100\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n<span style=\"color: #ff0000\"># Crea registro de lecturas<\/span>\r\nn = <span style=\"color: #ff00ff\">len<\/span> (baliza)\r\nregistro = {}\r\n<span style=\"color: #d35400\">for<\/span> elemento <span style=\"color: #d35400\">in<\/span> baliza:\r\n    registro[elemento] = {<span style=\"color: #008000\">'cuenta'<\/span>: 0 ,\r\n                          <span style=\"color: #008000\">'rssi'<\/span>: np.array([0.0,0.0]),\r\n                          <span style=\"color: #008000\">'snr'<\/span>:  np.array([0.0,0.0]),\r\n                          <span style=\"color: #008000\">'SumaRssi'<\/span>: np.array([0.0,0.0]),\r\n                          <span style=\"color: #008000\">'SumaSnr'<\/span>:  np.array([0.0,0.0]),\r\n                          <span style=\"color: #008000\">'minmaxRssi'<\/span>: np.array([0.0,-200.0,0.0,-200.0]),\r\n                          <span style=\"color: #008000\">'minmaxSnr'<\/span>: np.array([100.0,0.0,100.0,0.0])\r\n                          }\r\n\r\n<span style=\"color: #ff0000\"># inicializa archivo.txt a vacio<\/span>\r\narchivo = <span style=\"color: #ff00ff\">open<\/span>(nombrearchivo,<span style=\"color: #008000\">'w'<\/span>)\r\narchivo.close()  <span style=\"color: #ff0000\"># Cierra el archivo<\/span>\r\n\r\n<span style=\"color: #ff0000\"># Abre puerto Serial<\/span>\r\narduino = serial.Serial(puerto, baudios)\r\narduino.setDTR(<span style=\"color: #d35400\">False<\/span>)\r\ntime.sleep(0.3)\r\n\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<span style=\"color: #ff0000\"># Lectura de datos<\/span>\r\nnp.set_printoptions(precision=2)\r\nconteo = 0\r\ndifunde = 0\r\n<span style=\"color: #d35400\">while<\/span> conteo&lt;lecturasMin:\r\n    <span style=\"color: #ff0000\">#esperar hasta recibir un paquete<\/span>\r\n    <span style=\"color: #d35400\">while<\/span> (arduino.inWaiting()==0):\r\n        <span style=\"color: #d35400\">pass<\/span> \r\n\r\n    <span style=\"color: #ff0000\"># leer linea desde puerto serial<\/span>\r\n    linea = arduino.readline()\r\n    <span style=\"color: #ff0000\"># binario a texto, elimina \/r\/n<\/span>\r\n    texto = linea.decode()\r\n    texto = linea.strip()\r\n    \r\n    <span style=\"color: #ff0000\"># identificar la trama como rx, tx<\/span>\r\n    cond1 = texto.startswith(<span style=\"color: #008000\">'tx'<\/span>)\r\n    cond2 = texto.startswith(<span style=\"color: #008000\">'rx'<\/span>)\r\n    <span style=\"color: #d35400\">if<\/span> cond1 <span style=\"color: #d35400\">or<\/span> cond2:\r\n        archivo = <span style=\"color: #ff00ff\">open<\/span>(nombrearchivo,<span style=\"color: #008000\">'a'<\/span>)\r\n        archivo.write(texto+<span style=\"color: #008000\">'\\n'<\/span>)\r\n        archivo.close()\r\n        \r\n        <span style=\"color: #d35400\">if<\/span> (texto.startswith(<span style=\"color: #008000\">'tx'<\/span>)):\r\n            difunde = difunde + 1\r\n        <span style=\"color: #d35400\">if<\/span> (texto.startswith(<span style=\"color: #008000\">'rx'<\/span>)):\r\n            texto = texto.split(<span style=\"color: #008000\">','<\/span>)\r\n            tipo  = texto[0]\r\n            dir_remite = texto[2]\r\n            paqrcbvID  = texto[3]\r\n            rssi_tx    = <span style=\"color: #ff00ff\">float<\/span>(texto[4])\r\n            snr_tx     = <span style=\"color: #ff00ff\">float<\/span>(texto[5])\r\n            rssi_rx    = <span style=\"color: #ff00ff\">float<\/span>(texto[6])\r\n            snr_rx     = <span style=\"color: #ff00ff\">float<\/span>(texto[7])\r\n            <span style=\"color: #d35400\">if<\/span> tipo == <span style=\"color: #008000\">\"rx\"<\/span>:\r\n                <span style=\"color: #ff0000\"># conteo de lecturas<\/span>\r\n                cual = dir_remite\r\n                registro[cual][<span style=\"color: #008000\">'cuenta'<\/span>]=registro[cual][<span style=\"color: #008000\">'cuenta'<\/span>]+1\r\n                <span style=\"color: #d35400\">if<\/span> registro[cual][<span style=\"color: #008000\">'cuenta'<\/span>]&lt;conteo:\r\n                    conteo = registro[cual][<span style=\"color: #008000\">'cuenta'<\/span>]\r\n\r\n                <span style=\"color: #ff0000\"># acumulado<\/span>\r\n                registro[cual][<span style=\"color: #008000\">'SumaRssi'<\/span>][0] = registro[cual][<span style=\"color: #008000\">'SumaRssi'<\/span>][0]+rssi_tx\r\n                registro[cual][<span style=\"color: #008000\">'SumaSnr'<\/span>][0]  = registro[cual][<span style=\"color: #008000\">'SumaSnr'<\/span>][0]+snr_tx\r\n                registro[cual][<span style=\"color: #008000\">'SumaRssi'<\/span>][1] = registro[cual][<span style=\"color: #008000\">'SumaRssi'<\/span>][1]+rssi_rx\r\n                registro[cual][<span style=\"color: #008000\">'SumaSnr'<\/span>][1]  = registro[cual][<span style=\"color: #008000\">'SumaSnr'<\/span>][1]+snr_rx\r\n\r\n                <span style=\"color: #ff0000\"># promedios<\/span>\r\n                cuantos = registro[cual][<span style=\"color: #008000\">'cuenta'<\/span>]\r\n                registro[cual][<span style=\"color: #008000\">'rssi'<\/span>] = registro[cual][<span style=\"color: #008000\">'SumaRssi'<\/span>]\/cuantos\r\n                registro[cual][<span style=\"color: #008000\">'snr'<\/span>]  = registro[cual][<span style=\"color: #008000\">'SumaSnr'<\/span>]\/cuantos\r\n\r\n                <span style=\"color: #ff0000\"># minimos y maximos<\/span>\r\n                registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][0] = np.min([rssi_tx,registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][0]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][1] = np.max([rssi_tx,registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][1]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][2] = np.min([rssi_rx,registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][2]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][3] = np.max([rssi_rx,registro[cual][<span style=\"color: #008000\">'minmaxRssi'<\/span>][3]])\r\n\r\n                registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][0] = np.min([snr_tx,registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][0]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][1] = np.max([snr_tx,registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][1]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][2] = np.min([snr_rx,registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][2]])\r\n                registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][3] = np.max([snr_rx,registro[cual][<span style=\"color: #008000\">'minmaxSnr'<\/span>][3]])\r\n\r\n            <span style=\"color: #ff0000\"># Muestra en pantalla el estado de recepci\u00f3n<\/span>\r\n            <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'\\n difusion: '<\/span>,difunde)\r\n            <span style=\"color: #ff00ff\">print<\/span>(texto)\r\n            <span style=\"color: #d35400\">for<\/span> elemento <span style=\"color: #d35400\">in<\/span> baliza:\r\n                <span style=\"color: #ff00ff\">print<\/span>(elemento,registro[elemento][<span style=\"color: #008000\">'cuenta'<\/span>],\r\n                      <span style=\"color: #008000\">'\\tprom Rssi[tx,rx] \\t   Snr[tx,rx]'<\/span>)\r\n                <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">\"prom   :\"<\/span>,registro[elemento][<span style=\"color: #008000\">'rssi'<\/span>],<span style=\"color: #008000\">\"\\t  \"<\/span>,\r\n                      registro[elemento][<span style=\"color: #008000\">'snr'<\/span>])\r\n                <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">\"min,max:\"<\/span>,registro[elemento][<span style=\"color: #008000\">'minmaxRssi'<\/span>],\r\n                      registro[elemento][<span style=\"color: #008000\">'minmaxSnr'<\/span>])\r\n\r\n<span style=\"color: #ff0000\"># Cerrar el puerto serial.<\/span>\r\nserial.Serial.close\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La relaci\u00f3n de valores de Rssi y distancia hacia cada punto de referencia (baliza), se estima a partir de las mediciones en varios puntos establecidos y ubicados en un mapa. En cada punto, los valores se estiman considerando usar al menos 100 lecturas hacia cada baliza en cada punto. En \u00e9ste proceso usa un computador &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lora-rssi-y-snr-datos-usb-serial-a-un-archivo-txt\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"2.2 Captura datos. Dispositivo con USB-Serial a un archivo.txt usando Python\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1463489],"tags":[1457738,20777],"class_list":["post-2683","post","type-post","status-publish","format-standard","hentry","category-localizacion-rssi-lora","tag-lora","tag-python"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=2683"}],"version-history":[{"count":28,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2683\/revisions"}],"predecessor-version":[{"id":3742,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2683\/revisions\/3742"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}