{"id":1486,"date":"2022-10-13T22:18:22","date_gmt":"2022-10-13T21:18:22","guid":{"rendered":"https:\/\/theroamingworkshop.cloud\/b\/?p=1486"},"modified":"2022-10-24T19:51:22","modified_gmt":"2022-10-24T18:51:22","slug":"analogtouch-sensor-tactil-con-cualquier-pin-analogico-en-arduino","status":"publish","type":"post","link":"https:\/\/theroamingworkshop.cloud\/b\/1486\/analogtouch-sensor-tactil-con-cualquier-pin-analogico-en-arduino\/","title":{"rendered":"AnalogTouch: sensor t\u00e1ctil con cualquier pin anal\u00f3gico en Arduino"},"content":{"rendered":"\n<p>Una de las formas de evitar el uso de botones aparatosos en tus proyectos Arduino es utilizar placas o m\u00f3dulos con pines t\u00e1ctiles, como algunos m\u00f3dulos de ESP32.<\/p>\n\n\n\n<p>Eso s\u00ed, la mayor\u00eda de placas no cuentan con esta caracter\u00edstica, pero leyendo esta entrada en el foro de esp32.com di con algo interesante:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.esp32.com\/viewtopic.php?t=23066\">https:\/\/www.esp32.com\/viewtopic.php?t=23066<\/a><\/p>\n\n\n\n<p>Con una r\u00e1pida calibraci\u00f3n, se puede usar <strong>cualquier pin anal\u00f3gico<\/strong> como sensor t\u00e1ctil. Aunque hay varias librer\u00edas al respecto, realmente solo necesitas un par de funciones, as\u00ed que vamos al grano!<\/p>\n\n\n\n<div id=\"menu\" style=\"padding:20px 20px 20px 20px; border-left:2px solid darkgrey;\">\n<p style=\"font-weight:bold;\">Contenido<\/p>\n<\/div>\n<script>\nvar text;\nvar element;\n\nfunction fillmenu(){\n\nfor (let i=0; i<window.document.getElementsByTagName(\"h2\").length; i++){\nelement = window.document.getElementsByTagName(\"h2\")[i];\ntext = \"\u25b9 \"+element.innerHTML;\nvar newelement = document.createElement(\"a\");\nnewelement.innerHTML=text;\nvar postid=window.document.getElementsByTagName(\"article\")[0].id;\nvar url = \"https:\/\/theroamingworkshop.cloud\/b\/?p=\"+postid.substr(5,postid.length)+\"#\"+element.id;\nnewelement.setAttribute(\"href\", url);\nnewelement.appendChild(document.createElement(\"br\"));\nwindow.document.getElementById(\"menu\").appendChild(newelement);\n}\n}\n\nif(window.location.href.includes(\"tag\")){\n\n}else{\nwindow.setTimeout(fillmenu,2000);\n}\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"componentes\">Componentes<\/h2>\n\n\n\n<p>Para este proyecto voy a usar los siguientes compontentes:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>1x Placa SparkFun Pro Micro con ATmega32u4<br>De hecho es un clon chino de Aliexpress muy barato.<br><a href=\"https:\/\/learn.sparkfun.com\/tutorials\/pro-micro--fio-v3-hookup-guide\/hardware-overview-pro-micro\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/learn.sparkfun.com\/tutorials\/pro-micro--fio-v3-hookup-guide\/hardware-overview-pro-micro<\/a><\/li><li>1x Cable USB micro de datos.<\/li><li>1x Diodo LED<\/li><li>1x Resistencia 1K o 220 Ohm <\/li><li>3x Cables puente<\/li><li>1x Placa de prototipos (protoboard)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cableado\">Cableado<\/h2>\n\n\n\n<p>Si usamos la Pro Micro, esta es la asignaci\u00f3n de pines:<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Pro Micro<\/th><th>Componente<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Puerto Micro USB<\/td><td>Cable USB<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pin 21 (A3)<\/td><td>Cable puente desconectado<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pin 20<\/td><td>LED+<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">GND<\/td><td>Resistencia<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Solo debemos tener en cuenta que el cable puente que usaremos como sensor t\u00e1ctil deber\u00e1 ir conectado a un <strong>pin anal\u00f3gico<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/esquema-1.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"572\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/esquema-1.png\" alt=\"\" class=\"wp-image-1489\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/esquema-1.png 668w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/esquema-1-300x257.png 300w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><\/a><figcaption>(la placa mostrada no corresponde exactamente con la Pro Micro)<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"sketch-de-arduino\">Sketch de Arduino<\/h2>\n\n\n\n<p>En mi github puedes encontrar un sketch de Arduino listo para usar:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/TheRoam\/TRW_AnalogTouch\/blob\/main\/ProMicro_Blink_AnalogTouch.ino\">https:\/\/github.com\/TheRoam\/TRW_AnalogTouch\/blob\/main\/ProMicro_Blink_AnalogTouch.ino<\/a><\/p>\n\n\n\n<p>Ver\u00e1s que indica \"ProMicro\", pero realmente es compatible con cualquier microcontrolador. Solo tienes que elegir tu placa en el men\u00fa de Herramientas.<\/p>\n\n\n\n<p>La Pro Micro lleva un controlador ATMega32u4, que es compatible con la placa <strong>Arduino Leonardo<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"709\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2.png\" alt=\"\" class=\"wp-image-1490\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2.png 848w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2-300x251.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2-768x642.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/at2-676x565.png 676w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Con esta configuraci\u00f3n, compilamos el script y lo subimos a la placa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"resultado\">Resultado<\/h2>\n\n\n\n<p>Abrimos el <strong>Monitor Serie<\/strong>, que deber\u00eda aparecer en blanco ya que el texto de depuraci\u00f3n est\u00e1 configurado al m\u00ednimo por defecto.<\/p>\n\n\n\n<p>Ahora <strong>tocamos<\/strong> el extremo libre del cable puente y veremos c\u00f3mo se ilumina el led, y c\u00f3mo se detecta el \"toque\" en el Monitor Serie.<\/p>\n\n\n\n<figure class=\"wp-block-video aligncenter\"><video height=\"240\" style=\"aspect-ratio: 320 \/ 240;\" width=\"320\" autoplay controls loop muted src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/10\/touchled.mp4\" playsinline><\/video><\/figure>\n\n\n\n<p>Tambi\u00e9n ver\u00e1s que el script acumula los \"toques\" para poder utilizarlos en otros programas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"al-codigo\">Al c\u00f3digo<\/h2>\n\n\n\n<p>Brevemente explico lo que hace el programa:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Durante el <code>setup()<\/code>, iniciamos la comunicaci\u00f3n por serie, activamos el pin para el led, y rellenamos la matriz de lecturas anal\u00f3gicas con unas lecturas iniciales con <code>setTouch<\/code> (Por defecto se leen 20 valores).<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>void setup() {\n  \/\/ initialize serial communication at 115200 bits per second:\n  Serial.begin(115200);\n  \/\/enable LED pin\n  pinMode(LP,OUTPUT);\n  setTouch(TP);\n}<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\"><li>A continuaci\u00f3n, pasamos a la funci\u00f3n de ejecuci\u00f3n continua <code>loop()<\/code> donde refrescaremos las lecturas al inicio de cada bucle.<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>setTouch(TP);\n\/\/------loop continues------\/\/\nvoid setTouch(int tp){\n  \/\/fill up the array\n  for(int a=0;a&lt;VALUES;a++){\n    mean&#91;a]=analogRead(tp);\n    delay(10);\n  }\n}<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\"><li>Comprobamos si la depuraci\u00f3n es m\u00ednima o extendida y ejecutamos el programa principal correspondiente (es el mismo, pero con mayor salida al Monitor Serie).<\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/run check\n  if(out==1){\n    extended(TP);\n  }else if(out==0){\n    minimal(TP);\n  }<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\"><li>El programa principal:<ol><li>Recorre la matriz de lecturas,<\/li><li>Obtiene la media de los valores,<\/li><li>Obtiene una nueva lectura,<\/li><li>Calcula la diferencia de tensi\u00f3n entre la \u00faltima lectura y la media,<\/li><li>Si el valor es mayor que la caida de tensi\u00f3n de referencia, se identifica \"toque\", se imprime por Monitor Serie, se suma al contador y se ilumina el led.<\/li><li>Se restaura la media a 0, se apaga el led y se devuelve la variable de \"toques\".<\/li><\/ol><\/li><\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>int minimal(int tp){\n  \/\/start reading values\n  for(int i=0;i&lt;VALUES;i++){\n    \/\/get average of array\n    for(int j=0;j&lt;VALUES;j++){\n      avg+=mean&#91;j];\n    }\n    \n    avg=avg\/VALUES;\n\n    \/\/read current value\n    fin=analogRead(tp);\n    \n    \/\/compare average with current value\n    if((avg-fin)&gt;REFV){\n      Serial.println(\"----------  T   O    U    C    H  ----------\");\n      \/\/increase counter\n      touch++;\n      \/\/print touch count\n      Serial.print(\"T: \");\n      Serial.println(touch);\n      \/\/light led\n      ledON(LP);\n      \/\/wait 1 second after touch detected\n      delay(1000);\n    }\n    \/\/restart counter\n    avg=0;\n    \/\/restart led\n    ledOFF(LP);\n    delay(VALINTERVAL);\n  }\n  return touch;\n}<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"5\"><li>Con esto se reinicia el bucle, volviendo al punto 2.<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"otras-configuraciones\">Otras configuraciones<\/h2>\n\n\n\n<p>El script cuenta con diversas variables de configuraci\u00f3n que encontraremos en los '#define's<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>OUT<\/code>: define la cantidad de texto de depuraci\u00f3n. Valor 0: m\u00ednimo; Valor 1: extendido.<\/li><li><code>VALUES<\/code>: tama\u00f1o de la matriz de valores anal\u00f3gicos.<\/li><li><code>TOUCHPIN<\/code>: definir el n\u00famero del pin anal\u00f3gico a usar.<\/li><li><code>LEDPIN<\/code>: definir el n\u00famero de pin usado por el led.<\/li><li><code>VALINTERVAL<\/code>: intervalo de evaluaci\u00f3n en milisegundos.<\/li><li><code>REFV<\/code>: valor de caida de voltaje (en milivoltios) que identifica un \"toque\".<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ OUTPUT verbosity\n\/\/ 1: extended --&gt; Prints ADC array, mean value, touch count and touch message with touch count\n\/\/ 0: minimal  --&gt; Prints touch message with touch count\n\n#define OUT 0\n\n\/\/ comparison variables\n#define VALUES 20       \/\/values for mean array\n#define TOUCHPIN 3      \/\/touch pin\n#define LEDPIN 20       \/\/led pin\n#define VALINTERVAL 100 \/\/evaluation interval\n#define REFV 80         \/\/reference voltage drop in mV<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"calibracion\">Calibraci\u00f3n<\/h2>\n\n\n\n<p>Cambiando la configuraci\u00f3n se puede calibrar el script para distintas placas. Con lo que he probado, esta es una buena secuencia:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Define una <strong>REFV alta<\/strong>, por ejemplo 1000<\/li><li>Carga el script con depuraci\u00f3n extendida (<strong>OUT 1<\/strong>)<\/li><li>Abre el <strong>Monitor Serie<\/strong> y observa los valores medios (Average: 230)<\/li><li>Ahora, toca el cable puente y <strong>observa de nuevo los valores medios<\/strong> (Average: 170)<\/li><li>Haz la <strong>resta entre las medias<\/strong> en 3. y en 4. (230-170=60).<\/li><li><strong>Define el REFV con este valor<\/strong> y calibra a partir de aqu\u00ed.<ul><li>Para <strong>m\u00e1s sensibilidad<\/strong>, def\u00ednelo m\u00e1s bajo (50).<\/li><li>Si es excesivo <strong>puede detectarse sin contacto<\/strong>. Aum\u00e9ntalo (80).<\/li><li>Debido a la carga del CPU, REFV puede variar si hay depuraci\u00f3n OUT 1 respecto a OUT 0. Busca un valor que funcione para OUT 0.<\/li><\/ul><\/li><\/ol>\n\n\n\n<p>\u00bfTe ha sido \u00fatil o tienes dudas? Deja tu comentario en \ud83d\udc26 Twitter!<\/p>\n\n\n\n<p>\ud83d\udc26 <code><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/roamingworkshop\" target=\"_blank\">@RoamingWorkshop<\/a><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una de las formas de evitar el uso de botones aparatosos en tus proyectos Arduino es utilizar placas o m\u00f3dulos con pines t\u00e1ctiles, como algunos m\u00f3dulos de ESP32. Eso s\u00ed, la mayor\u00eda de placas no cuentan con esta caracter\u00edstica, pero leyendo esta entrada en el foro de esp32.com di con algo interesante: https:\/\/www.esp32.com\/viewtopic.php?t=23066 Con una [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1488,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66],"tags":[],"class_list":["post-1486","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-electronica","post-preview"],"_links":{"self":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/comments?post=1486"}],"version-history":[{"count":6,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1486\/revisions"}],"predecessor-version":[{"id":1574,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1486\/revisions\/1574"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media\/1488"}],"wp:attachment":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media?parent=1486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/categories?post=1486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/tags?post=1486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}