Entradas digitales
Una entrada digital es la más simple que tiene un robot: solo puede decir dos cosas. Sí o no, hay o no hay, abierto o cerrado. No hay puntos intermedios.
Es la entrada de todos los elementos que "se accionan": un pulsador que aprieta el usuario, un final de carrera que marca que un brazo llegó al tope, un sensor de presencia que detecta si hay algo delante.
Cómo se lee
Se declara el pin como entrada y después se consulta su estado, que siempre va a ser uno de estos dos valores:
digitalRead(2)devuelveHIGHcuando el pin está en 5 V, yLOWcuando está en 0 V.- En un programa,
HIGHse comporta como verdadero yLOWcomo falso, así que se puede usar directamente dentro de unif.
El primer problema: el pin al aire
Acá aparece el error más común de todos cuando se empieza con electrónica. Si a un pin de entrada no le llega nada —ni 5 V ni 0 V—, no lee "cero". Queda flotando, y el valor que devuelve es impredecible: puede cambiar solo, con la humedad del aire o porque te acercaste la mano.
Es fácil de comprobar y muy desconcertante la primera vez: el robot "detecta" cosas que no existen, o el pulsador se dispara sin que nadie lo toque.
La solución es darle siempre un valor por defecto al pin, y de eso se encargan las resistencias de la sección siguiente.
Entradas analógicas
Una entrada analógica no responde sí o no, sino cuánto. Es la que permite medir una cantidad que varía de forma continua: la luz que recibe un sensor, la distancia a un obstáculo, la posición de una perilla, la temperatura del ambiente.
Cómo se lee
Se usa analogRead(pin), que devuelve un número entero en lugar de un estado. Ese número depende de la placa: en el Arduino Uno va de 0 a 1023, porque el convertidor que trae adentro tiene 10 bits de resolución, y en el ESP32 —la placa con la que se arma el robot en esta unidad— va de 0 a 4095, porque su convertidor es de 12 bits.
Lo que devuelve es una proporción, no una unidad. En la Uno, el 0 corresponde a 0 V y el 1023 a 5 V; el resto de los valores se reparten en el medio:
| Lo que devuelve | Tensión en el pin | Qué significa |
|---|---|---|
0 | 0 V | El mínimo |
256 | 1,25 V | Un cuarto del rango |
512 | 2,5 V | La mitad exacta |
768 | 3,75 V | Tres cuartos |
1023 | 5 V | El máximo |
En el ESP32 la tabla es la misma idea con otros números, porque el fondo es de 3,3 V y los escalones son cuatro veces más finos:
| Lo que devuelve | Tensión en el pin | Qué significa |
|---|---|---|
0 | 0 V | El mínimo |
1024 | 0,83 V | Un cuarto del rango |
2048 | 1,65 V | La mitad exacta |
3072 | 2,48 V | Tres cuartos |
4095 | 3,3 V | El máximo |
Dos consecuencias prácticas de esto:
- La precisión es limitada. Como hay 1024 escalones para 5 V, cada escalón equivale a unos 5 milésimas de voltio. Eso alcanza para casi todo, pero no para medir diferencias muy chicas.
- El número hay que traducirlo. Nadie piensa en "512"; se piensa en "la mitad de luz" o "2,5 V". La traducción se hace en el programa, y es el tema de la última sección de esta página.
A0 a A5. Los pines digitales no pueden medir valores intermedios: solo dicen si hay o no hay tensión. Si conectás un sensor analógico a un pin digital, el programa no va a fallar, pero va a leer cualquier cosa.
Resistencias pull-up y pull-down
Ya se vio el problema: un pin de entrada sin nada conectado queda flotando y lee al azar. La solución es ponerle una resistencia que lo lleve a un valor conocido cuando el sensor no está accionado. Esa resistencia se llama pull-up si lo lleva a 5 V, y pull-down si lo lleva a 0 V.
Las resistencias internas
La buena noticia es que casi nunca hace falta poner la resistencia a mano. Las placas de Arduino tienen una incorporada que se activa desde el programa:
pinMode(2, INPUT_PULLUP);
Con esa línea, el pin queda con su resistencia pull-up interna y se puede conectar el pulsador directamente entre el pin y masa. Se ahorran dos cables y una pieza por cada entrada.
la tensión de la placa —5 V en la Uno, 3,3 V en el ESP32—INPUT_PULLUP, la resistencia lleva el pin a 5 V, así que en reposo lee HIGH y cuando alguien aprieta el pulsador —que lo conecta a masa— lee LOW. Está invertido respecto de lo que uno espera: LOW significa "apretado". Si el programa no lo tiene en cuenta, el robot hace exactamente lo contrario de lo que debería.
Ruido y rebotes
Hay dos comportamientos eléctricos que hacen que una lectura digital no sea tan limpia como parece, y conviene conocerlos antes de que aparezcan.
Los rebotes del pulsador
Cuando se aprieta un pulsador, las láminas metálicas de adentro no se tocan una sola vez: rebotan durante algunos milisegundos antes de quedarse cerradas. El programa, que lee miles de veces por segundo, no ve "un apretón": ve decenas de contactos y separaciones seguidas.
El efecto práctico es que un solo toque puede contar como veinte. Si el pulsador cambia el estado de algo, se cambia y se vuelve a cambiar muchas veces.
La solución se llama antirrebote o debounce, y consiste en esperar un instante después de detectar el cambio para confirmar que es real. Se resuelve con un par de líneas en el programa, y hay una función que se puede usar solo para esto.
El ruido de los sensores analógicos
En las entradas analógicas el problema es distinto pero parecido: el valor nunca está quieto. Aunque la luz no cambie, las lecturas de un sensor pueden oscilar unas unidades para arriba y para abajo, por el funcionamiento de la propia electrónica.
Si el programa compara con un valor exacto, va a estar entrando y saliendo de la condición todo el tiempo. Se soluciona suavizando las lecturas: promediar varias seguidas, o usar una banda de tolerancia en lugar de un número exacto.
Umbrales: convertir un valor en una decisión
Este es el paso que cierra el tema, y es puramente de programación. El sensor entrega un número, pero el robot necesita decidir. Entre una cosa y la otra hay que poner un umbral: el valor a partir del cual se considera que pasó algo.
Un ejemplo concreto, con un sensor de luz: el sensor puede devolver cualquier valor entre 0 y 1023. Que devuelva 437 no significa nada por sí solo. Lo que sí significa algo es:
- Menos de 300: está oscuro, hay que encender la luz.
- Más de 300: hay luz suficiente, no hay que hacer nada.
Ese 300 es el umbral, y lo eligió una persona. No viene en la hoja de datos del sensor: se decide probando, mirando qué valores devuelve en la oscuridad y qué valores devuelve con luz.
Cómo se elige bien un umbral
- Medir en los dos extremos. Hay que saber qué devuelve el sensor en la situación "no" y en la situación "sí". El umbral va en el medio, no pegado a ninguno.
- Dejar un margen. Si en la oscuridad devuelve 280 y con luz 700, un umbral de 500 es seguro. Uno de 290 va a fallar apenas la luz cambie un poco.
- Un solo umbral no siempre alcanza. Si el robot tiembla justo en el límite, la salida oscila. Se agrega un segundo umbral para volver atrás, y así el sistema tiene memoria y deja de vibrar.
Ese truco de los dos umbrales se llama histéresis, y es el mismo principio que usa el termostato de una casa: enciende la calefacción a los 18 grados, pero no la apaga hasta los 20.
Resumen
| Concepto | La idea que hay que recordar |
|---|---|
| Entrada digital | Dos valores: hay o no hay. Se lee con digitalRead(). |
| Entrada analógica | Un valor intermedio. Se lee con analogRead() y devuelve de 0 a 1023. |
| Pin al aire | Lee al azar. Siempre hay que llevarlo a un valor conocido con una resistencia. |
| Pull-down | Resistencia a masa: en reposo el pin lee 0. |
| Pull-up | Resistencia a 5 V: en reposo el pin lee 1. ¡La lógica se invierte! |
| Rebotes | Un pulsador apretado una vez se lee como muchas. Se arregla con antirrebote. |
| Umbral | El valor a partir del cual el robot decide. Se elige midiendo los dos extremos. |
| Histéresis | Dos umbrales en lugar de uno, para que la salida no oscile. |