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:
LED + → Resistencia 220Ω → Pin 9 Arduino
LED - → GNDCódigo 1: Brillo gradual
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
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
#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()
analogWrite(pin, valor); // valor entre 0-255Cambiar frecuencia PWM (avanzado)
// Para Arduino Uno - cambiar frecuencia en pin 9,10
void setup() {
TCCR1B = TCCR1B & 0b11111000 | 0x01; // 31.25 kHz
}Ejemplo Práctico: Dimer de luz
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
Límites de corriente: No excedas 40mA por pin digital
Motores grandes: Usa drivers externos como L298N
Frecuencias: Por defecto es ~490Hz, puedes modificarla para aplicaciones específicas
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
Publicar un comentario