Una de las funciones más interesantes (si no la más) de Arduino y en general de los microcontroladores es su capacidad de interacción con el mundo físico. Podemos, por ejemplo, realizar mediciones de voltaje (tensión), obtener lecturas de gran variedad de sensores, encender dispositivos o controlar motores y actuadores. Esta interacción se lleva a cabo en gran parte mediante el uso de las entradas y salidas tanto digitales como analógicas.
En el siguiente tutorial aprenderemos a usar estas funciones, que resultan una parte fundamental en la mayoría de los proyectos. Empezaremos por las entradas digitales por ser las más sencillas.
Aunque estamos empleando Arduino como plataforma es importante remarcar que la mayoría de conceptos son aplicables a cualquier otro microcontronlador general. Al final veremos un código de ejemplo para Arduino, pero antes veremos un poco de teoría general.
¿Qué es una entrada digital?
Una señal digital es una variación de voltaje entre -Vcc a +Vcc sin pasar por los valores intermedios. Por lo tanto, una señal digital dispone solo de dos estados. Al valor inferior de voltaje -Vcc le asociamos un valor lógico LOW o ‘0’, mientras que al valor superior +Vcc le asociamos HIGH o ‘1’ lógico.
Sin embargo en el mundo físico las referencias de voltaje realmente son continuas. El proceso de lectura digital es un proceso de discretización de una señal analógica, el valor del voltaje, en un valor digital que representamos mediante dos estados, LOW y HIGH.
En realidad una entrada digital realiza una comparación de la medición con un valor de voltaje umbral. Si el valor medido es superior al voltaje umbral se devuelve HIGH, y si es inferior LOW. El valor del voltaje umbral varía de un microcontronlador a otro, e incluso no tiene porque permanecer constante a lo largo del tiempo.
En general es razonable suponer que el voltaje umbral es cercana al punto medio entre -Vcc y +Vcc. No obstante debemos evitar medir voltajes cerca del voltaje umbral porque pueden provocar mediciones incorrectas.
Conexión de entradas digitales en Arduino
En Arduino las entradas y salidas digitales comparten pin, motivo por el que se denominan I/O digitales. Esto significa que el mismo pin puede ejecutar funciones tanto de entrada como de salida aunque, lógicamente, no de forma simultánea. Es necesario configurar un pin I/O como entrada o salida en el código.
Arduino dispone de un número diferente de I/O digitales en función del modelo que estemos utilizando. Por ejemplo, Arduino UNO dispone de 16 I/O digitales y Arduino MEGA de 54.
En Arduino los valores de alimentación habituales son 0V y 5V. En este caso la tensión umbral será muy cercana a 2.5V. Por tanto si medimos una tensión con un valor intermedio entre 0 a 2.5V Arduino devolverá una lectura LOW, y si medimos un valor entre 2.5V y 5V, devolvera HIGH.
Nunca se debe usar un voltaje fuera del rango 0V a 5V en una entrada digital o analógica o podemos dañar el pin correspondiente y dejarlo permanentemente inutilizado.
Supongamos que queremos emplear Arduino para conectarlo con un sensor, o cualquier otro dispositivo, que dispone de una salida de voltaje ininterrumpida entre 0V a 5V. De momento no consideramos la posibilidad de que la entrada digital quede totalmente desconectada, algo que veremos en otro tutorial “Lectura de un pulsador con Arduino”.
Podemos realizar la lectura del valor de voltaje en el sensor con un esquema como el siguiente.

La lectura dará un valor “HIGH” si el valor de voltaje medido es superior al umbral, y “LOW” si el valor de voltaje es inferior.
Código en Arduino
El código para realizar la lectura es realmente sencillo. Simplemente tenemos que configurar un I/O digital como entrada con pinMode() y realizar la lectura con digitalRead()
.
int pin = 2;
int value = 0;
void setup() {
Serial.begin(9600); //iniciar puerto serie
pinMode(pin, INPUT); //definir pin como entrada
}
void loop(){
value = digitalRead(pin); //lectura digital de pin
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH) {
Serial.println("Encendido");
}
else {
Serial.println("Apagado");
}
delay(1000);
}
Los pines configurados como entradas están en estado de alta impedancia, es decir, se comportan como resistencias de muy elevado valor (del orden de 100 Mohms). Por tanto, por ellos circula una intensidad despreciable.
En realidad los pines de Arduino (Atmega) se inician por defecto como entrada, por lo que no sería estrictamente necesario configurarlos como entrada, aunque resulta una práctica conveniente.
Lectura de valores mayores a 5V
Hemos comentado que bajo ningún concepto debemos introducir un voltaje fuera del rango 0 a 5V en un pin de Arduino o nos arriesgamos a dañarlo permanentemente. Si queremos medir un nivel de tensión superior a los límites de alimentación la forma más conveniente es emplear un simple divisor de tensión.
Por ejemplo, para leer una señal digital entre 0 a 12V podemos emplear un esquema como el siguiente.

No utilices este sistema para leer tensiones superiores a 35V, o para dispositivos de corriente alterna sin estar muy seguros de lo que estáis haciendo. Es muy posible que las resistencias no aguanten.
Con esta configuración el pin digital de Arduino recibirá una tensión que varía entre 0 a 3,84V, suficiente para hacer disparar la tensión umbral, y por debajo del límite de alimentación.
Los valores de las resistencias a emplear dependen del voltaje que queremos leer, y de la impedancia del sensor. En general, deben cumplir las siguientes condiciones
- Deben proporcionar un voltaje superior a la tensión umbral
- Deben ser muy superiores a la impedancia equivalente del dispositivo a medir.
- Deben ser despreciables respecto a la impedancia de la entrada Arduino.
- Deben limitar la corriente que circula por ellas para minimizar pérdidas.
- Deben ser capaces de disipar la potencia que van a soportar.
En la siguiente entrada veremos cómo emplear la entrada digital para leer el estado de un pulsador.