certmundo.
es‑mx

6 min de lectura

¿Cómo usar entradas y salidas analógicas en Arduino?

Las entradas y salidas analógicas en Arduino te permiten leer y controlar señales del mundo real con valores continuos, no solo encendido o apagado.

Las señales digitales solo tienen dos estados: HIGH o LOW. Las señales analógicas tienen miles de valores posibles entre un mínimo y un máximo. Eso las hace ideales para sensores de temperatura, fotorresistencias y potenciómetros.

Entradas analógicas: analogRead()

Arduino UNO tiene 6 pines de entrada analógica: A0, A1, A2, A3, A4 y A5. Estos pines conectan el mundo físico con el microcontrolador.

El pin analógico mide un voltaje entre 0 V y 5 V. Arduino convierte ese voltaje en un número entero usando su convertidor analógico-digital (ADC) de 10 bits.

¿Qué significa 10 bits?

Con 10 bits, el ADC produce valores de 0 a 1023. El valor 0 corresponde a 0 V y el valor 1023 corresponde a 5 V. Cada paso representa aproximadamente 4.9 mV.

Sintaxis

int valor = analogRead(pin);
  • pin: cualquier pin analógico (A0 a A5 en Arduino UNO).
  • El resultado es un entero entre 0 y 1023.
  • No necesitas configurar el pin con pinMode() para leerlo; Arduino lo trata como entrada analógica de forma predeterminada.

Ejemplo 1: leer un potenciómetro

Un potenciómetro es una resistencia variable. Conecta sus tres pines así:

  • Pin izquierdo → 5 V
  • Pin derecho → GND
  • Pin central (cursor) → A0
int lectura = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  lectura = analogRead(A0);
  Serial.println(lectura);
  delay(200);
}

Al girar el potenciómetro, el Monitor Serial muestra valores que van de 0 a 1023. Esto refleja la posición del cursor entre GND y 5 V.

Ejemplo 2: convertir la lectura a voltaje

A veces necesitas saber el voltaje real, no solo el número del ADC.

float voltaje = 0.0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int lectura = analogRead(A0);
  voltaje = lectura * (5.0 / 1023.0);
  Serial.print("Voltaje: ");
  Serial.println(voltaje);
  delay(500);
}

La fórmula lectura * (5.0 / 1023.0) transforma el valor entero en voltios. Si la lectura es 512, el voltaje es aproximadamente 2.5 V.

Ejemplo 3: sensor de temperatura LM35

El LM35 es un sensor analógico muy común en México. Lo encuentras en tiendas de electrónica como Electronica Satélite o en línea en Mercado Libre por menos de $50.

El LM35 entrega 10 mV por cada grado Celsius. Conecta su salida al pin A1.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int lectura = analogRead(A1);
  float voltaje = lectura * (5.0 / 1023.0);
  float temperatura = voltaje * 100.0;
  Serial.print("Temperatura: ");
  Serial.print(temperatura);
  Serial.println(" C");
  delay(1000);
}

Si el voltaje leído es 0.25 V, la temperatura calculada es 25 °C. Es un cálculo directo y fácil de implementar.

La función map(): escalar valores

Muchas veces necesitas convertir el rango 0–1023 a otro rango útil. La función map() hace eso en una sola línea.

Sintaxis

long resultado = map(valor, fromLow, fromHigh, toLow, toHigh);
  • valor: el número que quieres escalar.
  • fromLow y fromHigh: el rango original.
  • toLow y toHigh: el rango nuevo.

Ejemplo: convertir lectura analógica a porcentaje

int lectura = analogRead(A0);
int porcentaje = map(lectura, 0, 1023, 0, 100);
Serial.println(porcentaje);

Si la lectura es 511, el porcentaje es aproximadamente 50. Esto es útil para mostrar el nivel de un sensor en una pantalla LCD.

Salidas analógicas simuladas: PWM con analogWrite()

Arduino UNO no tiene salidas analógicas reales. Sin embargo, simula señales analógicas usando PWM (Modulación por Ancho de Pulso).

¿Qué es PWM?

PWM enciende y apaga el pin muy rápido. Si está encendido el 50% del tiempo, el componente conectado "siente" la mitad del voltaje. Cuanto más tiempo está encendido, más voltaje efectivo recibe el componente.

En Arduino UNO, los pines con capacidad PWM están marcados con el símbolo ~: pines 3, 5, 6, 9, 10 y 11.

Sintaxis

analogWrite(pin, valor);
  • pin: un pin PWM (3, 5, 6, 9, 10 u 11 en Arduino UNO).
  • valor: un entero de 0 a 255. El valor 0 es 0 V (siempre apagado) y 255 es 5 V (siempre encendido).
  • No necesitas configurar el pin con pinMode() como salida antes de usar analogWrite(), aunque es buena práctica hacerlo.

Ejemplo 1: controlar el brillo de un LED

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  for (int brillo = 0; brillo <= 255; brillo++) {
    analogWrite(9, brillo);
    delay(10);
  }
  for (int brillo = 255; brillo >= 0; brillo--) {
    analogWrite(9, brillo);
    delay(10);
  }
}

El LED conectado al pin 9 aumenta y disminuye su brillo de forma suave. Este efecto se llama "fade" o atenuación.

Ejemplo 2: controlar el brillo con un potenciómetro

Aquí combinamos entrada analógica y salida PWM:

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  int lectura = analogRead(A0);
  int brillo = map(lectura, 0, 1023, 0, 255);
  analogWrite(9, brillo);
}

El potenciómetro en A0 controla directamente el brillo del LED en el pin 9. Al girar el potenciómetro, el LED cambia de intensidad en tiempo real.

Ejemplo 3: control de velocidad de un motor DC

Un motor DC pequeño conectado a través de un transistor o un módulo L298N responde a PWM igual que un LED. Este tipo de proyecto es común en cursos de robótica en preparatorias técnicas de México.

int pinMotor = 6;

void setup() {
  pinMode(pinMotor, OUTPUT);
}

void loop() {
  analogWrite(pinMotor, 128); // 50% de velocidad
  delay(3000);
  analogWrite(pinMotor, 255); // velocidad máxima
  delay(3000);
  analogWrite(pinMotor, 0);   // motor detenido
  delay(2000);
}

El valor 128 corresponde al 50% del ciclo de trabajo PWM. El motor corre a la mitad de su velocidad máxima.

Errores comunes

Error 1: usar analogWrite() en un pin sin PWM. Si intentas usar analogWrite(4, 200), el pin 4 no tiene PWM. Solo producirá HIGH o LOW. Revisa siempre que el pin tenga el símbolo ~ en la placa.

Error 2: confundir el rango de analogRead() y analogWrite(). analogRead() devuelve valores de 0 a 1023. analogWrite() acepta valores de 0 a 255. Si pasas directamente la lectura analógica a analogWrite() sin usar map(), el resultado será incorrecto porque los valores superiores a 255 se truncan.

Error 3: esperar voltaje exacto en la salida PWM. PWM no es un voltaje analógico real. Es una señal que se enciende y apaga. Algunos componentes sensibles, como circuitos de audio o sensores de precisión, pueden no responder bien a PWM sin un filtro adicional.

Error 4: dejar flotante el pin analógico. Si conectas A0 al aire sin ningún componente, las lecturas serán ruido eléctrico aleatorio. Siempre conecta el pin analógico a algo definido: un sensor, un resistor o GND.

Tabla de referencia rápida

Función Rango de valores Pines válidos (UNO) Propósito
analogRead(pin) 0 – 1023 A0, A1, A2, A3, A4, A5 Leer sensores analógicos
analogWrite(pin, valor) 0 – 255 3, 5, 6, 9, 10, 11 Controlar brillo, velocidad
map(v, fl, fh, tl, th) Cualquier rango N/A Escalar valores entre rangos

Puntos clave

  • analogRead() lee voltajes de 0 a 5 V y los convierte en enteros de 0 a 1023 usando el ADC de 10 bits.
  • analogWrite() simula una señal analógica con PWM en los pines marcados con ~; acepta valores de 0 a 255.
  • Usa map() para convertir el rango de analogRead() (0–1023) al rango de analogWrite() (0–255) cuando necesites conectar ambos.
  • El sensor LM35 es económico, disponible en Mercado Libre desde $50, y es un excelente primer sensor analógico para practicar con analogRead().
  • Siempre verifica que el pin tenga el símbolo ~ antes de usar analogWrite(); sin eso, la salida solo será digital.

Puntos clave

  • `analogRead(pin)` convierte un voltaje de 0 a 5 V en un valor entero de 0 a 1023 usando el ADC de 10 bits de Arduino; no necesitas `pinMode()` para leer pines analógicos.
  • `analogWrite(pin, valor)` usa PWM para simular una salida analógica con valores de 0 a 255; solo funciona en los pines marcados con `~` (3, 5, 6, 9, 10 y 11 en Arduino UNO).
  • Usa `map(lectura, 0, 1023, 0, 255)` para escalar correctamente la lectura de `analogRead()` antes de pasarla a `analogWrite()`; pasarla directamente produce resultados incorrectos.
  • Un pin analógico sin conexión definida queda flotante y produce valores de ruido aleatorio; conecta siempre el pin a un sensor, un resistor o GND.
  • PWM no es un voltaje analógico real: es una señal que se enciende y apaga muy rápido; componentes como motores DC y LEDs responden bien a PWM, pero circuitos de alta precisión pueden requerir un filtro adicional.

Comparte esta lección:

¿Cómo usar entradas y salidas analógicas en Arduino? | Arduino y Electrónica Básica | Certmundo