Pwm para arduino

 PWM es una técnica para simular una salida analógica usando una señal digital. Funciona encendiendo y apagando rápidamente un pin digital, variando el tiempo que permanece encendido vs apagado.

Pines PWM en Arduino

  • Arduino Uno/Nano: Pines 3, 5, 6, 9, 10, 11 (marcados con ~)

  • Ciclo de trabajo: 0-255 (8 bits)

Tutorial Básico: Controlar brillo de un LED

Materiales necesarios:

  • Arduino Uno

  • LED

  • Resistencia de 220Ω

  • Cables

Circuito:

text
LED + → Resistencia 220Ω → Pin 9 Arduino
LED - → GND

Código 1: Brillo gradual

cpp
const int ledPin = 9;  // Pin PWM
int brillo = 0;        // Valor de brillo (0-255)
int incremento = 5;    // Incremento por paso

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

void loop() {
  // Escribir valor PWM
  analogWrite(ledPin, brillo);
  
  // Cambiar brillo
  brillo = brillo + incremento;
  
  // Invertir dirección al llegar a los límites
  if (brillo <= 0 || brillo >= 255) {
    incremento = -incremento;
  }
  
  delay(30);  // Pequeña pausa
}

Tutorial Avanzado: Control de motor DC

Materiales adicionales:

  • Motor DC pequeño

  • Transistor MOSFET o driver L298N

  • Diodo de protección

  • Fuente de alimentación externa

Código 2: Control de velocidad de motor

cpp
const int motorPin = 9;  // Pin PWM para el motor
int velocidad = 0;
int velocidadMaxima = 255;

void setup() {
  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Control de motor PWM");
  Serial.println("Comandos: + (aumentar), - (disminuir)");
}

void loop() {
  if (Serial.available() > 0) {
    char comando = Serial.read();
    
    if (comando == '+') {
      velocidad = min(velocidad + 25, velocidadMaxima);
    }
    else if (comando == '-') {
      velocidad = max(velocidad - 25, 0);
    }
    
    analogWrite(motorPin, velocidad);
    
    Serial.print("Velocidad: ");
    Serial.println(velocidad);
  }
}

Tutorial 3: Control de servo motor

cpp
#include <Servo.h>

Servo miServo;
int pinServo = 9;
int posicion = 0;

void setup() {
  miServo.attach(pinServo);
}

void loop() {
  // Mover de 0 a 180 grados
  for (posicion = 0; posicion <= 180; posicion += 1) {
    miServo.write(posicion);
    delay(15);
  }
  
  // Mover de 180 a 0 grados
  for (posicion = 180; posicion >= 0; posicion -= 1) {
    miServo.write(posicion);
    delay(15);
  }
}

Funciones PWM importantes

analogWrite()

cpp
analogWrite(pin, valor);  // valor entre 0-255

Cambiar frecuencia PWM (avanzado)

cpp
// Para Arduino Uno - cambiar frecuencia en pin 9,10
void setup() {
  TCCR1B = TCCR1B & 0b11111000 | 0x01;  // 31.25 kHz
}

Ejemplo Práctico: Dimer de luz

cpp
const int ledPin = 9;
const int potPin = A0;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Leer potenciómetro (0-1023)
  int valorPot = analogRead(potPin);
  
  // Convertir a rango PWM (0-255)
  int brillo = map(valorPot, 0, 1023, 0, 255);
  
  // Aplicar PWM
  analogWrite(ledPin, brillo);
  
  // Mostrar valores
  Serial.print("Pot: ");
  Serial.print(valorPot);
  Serial.print(" -> PWM: ");
  Serial.println(brillo);
  
  delay(100);
}

Consejos y Buenas Prácticas

  1. Límites de corriente: No excedas 40mA por pin digital

  2. Motores grandes: Usa drivers externos como L298N

  3. Frecuencias: Por defecto es ~490Hz, puedes modificarla para aplicaciones específicas

  4. Resolución: Arduino usa 8 bits (0-255), pero algunos modelos tienen mayor resolución

Aplicaciones comunes de PWM

  • Control de brillo de LEDs

  • Control de velocidad de motores

  • Generación de tonos de audio

  • Control de servomotores

  • Regulación de temperatura

  • Conversión digital-analógica

Comentarios

Entradas más populares de este blog

12. Demostracion de como usar Tinkercad para simular Arduino con circuitos

11. Ejemplos Básicos de Leds y Pulsadores

Lectura de Potenciómetro con Arduino Uno en Tinkercad