DEV Community

Cover image for Pequeño tutorial sobre Arduino
Gabriel Maizo
Gabriel Maizo

Posted on • Updated on

Pequeño tutorial sobre Arduino

Hola Paola,

Te comparto la pequeña lectura que preparé especialmente para ti. ¡Espero que la disfrutes y que aprendas algo nuevo! 😊

Hoy quiero hablarte sobre los zumbadores o buzzers, un tema que me parece fascinante. Mi idea original era presentarte el proyecto completo del pequeño juego de dados, pero como es un poco extenso, prefiero empezar con algo más sencillo. Si te gusta esta lectura, en el futuro puedo escribir una versión más detallada del proyecto.

¿Qué es un zumbador?

Un zumbador (o buzzer) es un dispositivo que transforma la electricidad en sonido, produciendo un zumbido continuo o intermitente en un mismo tono, generalmente agudo.

Buzzer Image

Existen dos tipos principales: los zumbadores electromagnéticos y los piezoeléctricos.

El zumbador electromagnético funciona de manera muy interesante. Cuando se activa, la corriente pasa por una bobina que genera un campo magnético, lo cual hace vibrar una lámina de acero en la armadura. Si te interesa verlo en acción, te recomiendo este video, que lo explica de manera sencilla y entretenida.

El segundo tipo, el zumbador piezoeléctrico, es un poco más complejo. Aquí, la corriente pasa a través de un disco piezoeléctrico, haciéndolo resonar y produciendo ultrasonidos que son amplificados por una lámina de metal. Este proceso está relacionado con un fenómeno fascinante llamado piezoelectricidad, del cual me gustaría contarte más.

¿Cómo funciona la piezoelectricidad?

La piezoelectricidad es un fenómeno que ocurre en ciertos materiales, como algunos cristales, que generan electricidad cuando se les aplica una presión mecánica. Es un proceso que funciona en dos direcciones: al aplicar energía mecánica al material, se produce un voltaje, y al aplicar un voltaje, el material genera una vibración.

Para explicarlo de manera sencilla, imagina un cristal piezoeléctrico colocado entre dos placas metálicas. En estado normal, el cristal está en equilibrio y no conduce electricidad. Sin embargo, cuando se aplica presión sobre el cristal, las cargas eléctricas dentro de él se desequilibran, creando una diferencia de potencial entre los lados opuestos. Este desequilibrio genera un voltaje que puede ser utilizado en un circuito eléctrico.

En términos más técnicos, la piezoelectricidad es la capacidad de ciertos materiales para generar una carga eléctrica en respuesta a una tensión mecánica.

piezoelectricidad

piezoelectricidad

En esta imagen se puede ver que se está utilizando lead zirconate titanate (PZT), que es un material cerámico que muestra un marcado efecto piezoeléctrico, y las placas metálicas que reciben la electricidad generada. En el gif puedes ver cómo el voltaje sube y baja cuando se ejerce presión sobre el material.

Eso es, una simple aplicación de presión mecánica, el estrujamiento de un cristal y de repente tienes una corriente eléctrica. También se puede hacer lo contrario, aplicar una señal eléctrica a un material como efecto piezoeléctrico inverso. Funciona así:

En la misma situación que en el ejemplo anterior, tenemos un cristal piezoeléctrico colocado entre dos placas metálicas. La estructura del cristal está en perfecto equilibrio.

A continuación, se aplica energía eléctrica al cristal, que contrae y expande su estructura.

A medida que la estructura del cristal se expande y se contrae, convierte la energía eléctrica recibida y libera energía mecánica en forma de onda sonora.

piezoelectricidad inversa

Es importante que la electricidad que aplicamos sea variable, ya que si utilizamos una corriente continua, como la de una pila, el material solo se expandiría sin volver a su forma original. Para producir sonido, necesitamos que el material se expanda y contraiga repetidamente, lo cual solo es posible con una corriente alterna que varíe en el tiempo.

sound waves

Altavoces y zumbadores

Los altavoces utilizan la piezoelectricidad para alimentar dispositivos como despertadores y otros pequeños aparatos mecánicos que requieren capacidades de audio. Estos sistemas aprovechan el efecto piezoeléctrico inverso convirtiendo una señal de tensión de audio en energía mecánica en forma de ondas sonoras.

buzzer

En esta imagen puedes ver con detalle cómo está compuesto un zumbador por dentro, si lo prefieres en video lo tienes aquí.

¿Cómo utilizar un buzzer?

Genial, Paola, ahora que ya aprendiste cómo funciona un buzzer, vamos a ver un ejemplo práctico de cómo reproducir un sonido y luego, ¡vamos a tocar una bonita melodía!

Para ello, vamos a crear un nuevo proyecto en Tinkercad. También puedes usar el kit físico, y debería funcionar sin problemas. Te animo a que lo pruebes; no tengas miedo de usarlo. Si te sientes más cómoda usando Tinkercad y luego replicarlo físicamente en el Arduino, ¡también es válido!

1. Configuración del Proyecto

Primero, vamos a configurar esta versión inicial de nuestro proyecto. Básicamente, añadimos el Arduino, la protoboard y el buzzer.

Paso 1: Conecta el negativo del Arduino (GND) al negativo del buzzer. En mi caso, hice un puente con el cable azul, pero puedes conectar directamente.

Paso 2: Conecta el pin 10 del Arduino al positivo del buzzer.

tinkercad init

2. Código Inicial

Ahora, vamos a agregar el siguiente código inicial:

// C++ code
//

// Pines
const int buzzerPin = 10;  // Pin donde está conectado el buzzer

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

void loop()
{
  digitalWrite(buzzerPin, HIGH);
}
Enter fullscreen mode Exit fullscreen mode

3. Explicación del Código

  • setup(): En la función setup(), configuramos el pin 10 del Arduino como salida (OUTPUT) porque lo vamos a usar para controlar el buzzer.
  • loop(): En la función loop(), mantenemos el buzzer encendido (HIGH) de manera continua. Esto hará que el buzzer emita un sonido constante. Si ejecutas este código, deberías escuchar un tono constante proveniente del buzzer.

¿Por qué el buzzer suena constantemente cuando está en HIGH?

Cuando aplicas un estado HIGH constante al pin conectado al buzzer, estás proporcionando una corriente continua (DC) al buzzer. Esto provoca que el material piezoeléctrico dentro del buzzer se deforme debido al efecto piezoeléctrico. Sin embargo, si la corriente es continua, ¿no debería el material permanecer expandido sin volver a su forma original y, por tanto, no debería de sonar?

¿Qué sucede con una corriente continua?

Cuando aplicas un voltaje constante (HIGH en el pin del Arduino):

Deformación Inicial: Al aplicar HIGH, el material piezoeléctrico dentro del buzzer se deforma (expandiéndose). Esto produce una pequeña vibración inicial.

Estado Estable: Sin embargo, después de esta deformación inicial, si el voltaje permanece constante, el material piezoeléctrico se mantiene en ese estado deformado. No hay más vibración del material, lo cual significa que no se están generando ondas sonoras continuas. Técnicamente, si se mantuviera una corriente continua pura y sin ninguna fluctuación, el buzzer no debería producir un sonido continuo.

Sonido Constante: En la práctica, los buzzers piezoeléctricos diseñados para circuitos como los que usamos en Arduino suelen producir un sonido constante cuando se aplica un voltaje constante debido a pequeñas imperfecciones o fluctuaciones en la señal que provocan una mínima vibración continua. Esta vibración mínima, aunque no es perfecta, es suficiente para que el buzzer emita un tono constante. Sin embargo, este sonido no es tan claro o fuerte como cuando se alterna el voltaje a una frecuencia específica (como con la función tone()).

¿Por qué suena entonces?

En resumen, cuando el buzzer recibe un voltaje constante:

  • Vibración Inicial: El material piezoeléctrico se deforma inicialmente, lo que genera un sonido.
  • Vibración Mínima Continua: Pequeñas fluctuaciones en la señal pueden mantener una vibración mínima, lo que resulta en un tono constante, aunque no óptimo.

Nota: Me he dado cuenta Paola que en tu carrera es muy común que existan este tipo de ruidos (factores externos), incluso la temperatura es capaz de generar electricidad que hace que las fotos se vean mal, tu carrera es muy bonita pero desafiante, te lo digo porque como desarrollador todo funciona perfecto sin ruidos y es muy interesante para mi.

4. Haciendo un Sonido con una Duración Específica

Aunque el sonido continuo es un buen primer paso, el siguiente objetivo es agregar control para generar tonos específicos. Vamos a explorar cómo hacer que el buzzer emita una frecuencia particular, lo que nos permitirá tocar notas musicales.

Aquí tienes un código que lo hace posible:

const int buzzerPin = 10;  // Pin donde está conectado el buzzer
const int NOTE_A4 = 440;   // Frecuencia para la nota A4

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

void loop() {
  // Generar tono A4 manualmente
  playNoteManual(NOTE_A4, 500);  // Toca la nota A4 durante 500 ms
  delay(5000);  // Pausa de 5 segundos

  // Toca la nota A4 durante 500 ms usando tone para comparar
  tone(buzzerPin, NOTE_A4, 500);  
  delay(5000); // Pausa adicional de 5 segundos
}

// Función para generar una nota manualmente
void playNoteManual(int frequency, int duration) {
  int period = 1000000 / frequency;  // Calcula el periodo en microsegundos
  int halfPeriod = period / 2;       // Mitad del periodo

  long cycles = duration * 1000L / period;  // Número de ciclos a realizar

  for (long i = 0; i < cycles; i++) {
    digitalWrite(buzzerPin, HIGH);  // Enciende el buzzer
    delayMicroseconds(halfPeriod);  // Espera la mitad del periodo
    digitalWrite(buzzerPin, LOW);   // Apaga el buzzer
    delayMicroseconds(halfPeriod);  // Espera la otra mitad del periodo
  }
}
Enter fullscreen mode Exit fullscreen mode

5. Explicación del Código

a. Generación Manual del Tono

La función playNoteManual() nos permite generar manualmente un tono en el buzzer al hacer que el pin del Arduino se encienda y apague a una velocidad específica. Veamos cómo funciona:

  • int period = 1000000 / frequency;:

    • Calcula el período de la onda sonora en microsegundos, que es el tiempo que tarda en completarse un ciclo de la onda (un encendido y un apagado).
    • Para la nota A4, que tiene una frecuencia de 440 Hz, el período es 1000000 / 440 ≈ 2273 microsegundos.
  • int halfPeriod = period / 2;:

    • Calcula la mitad de este período. Esta es la cantidad de tiempo que el buzzer estará encendido (HIGH) y apagado (LOW) para crear la onda cuadrada que produce el sonido.
  • long cycles = duration * 1000L / period;:

    • Calcula cuántos ciclos de encendido/apagado se deben realizar para mantener la nota durante el tiempo deseado (duration en milisegundos). Multiplicamos duration por 1000 para convertirlo a microsegundos.
  • Bucle para Generar el Tono:

    • Dentro del bucle for, encendemos y apagamos el buzzer según el tiempo calculado. Esto crea la onda sonora a la frecuencia deseada.
    • Por ejemplo, para generar la nota A4 durante 500 ms, el buzzer se enciende y apaga repetidamente con un período de 2273 microsegundos, lo que produce la vibración necesaria para la nota.

b. Comparación con tone()

Después de la generación manual del tono, usamos la función tone() para reproducir la misma nota. Esto permite comparar ambos métodos y notar que tone() es una forma más sencilla y eficiente de hacer lo mismo, aunque es importante entender cómo se genera el sonido de manera manual.

c. Pausas en el Código

Después de tocar la nota, agregamos un delay() de 5000 ms (5 segundos) para hacer una pausa antes de volver a tocar la nota, permitiéndote escuchar claramente la diferencia entre las notas generadas manualmente y con tone().

6. ¿Por Qué Funcionan los Hz para Notas Específicas?

Cada nota musical corresponde a una frecuencia específica medida en Hertz (Hz), que representa cuántas veces por segundo el material piezoeléctrico dentro del buzzer vibra.

  • Nota A4 = 440 Hz: Esto significa que el buzzer vibra 440 veces por segundo cuando reproduce la nota A4. Al alternar el encendido y apagado del buzzer a esta frecuencia, se genera una onda sonora que nuestro oído percibe como la nota A4.

7. Conclusión

Al generar tonos manualmente con playNoteManual(), puedes obtener una comprensión más profunda de cómo se interrelacionan la frecuencia, el período y las vibraciones en el material piezoeléctrico para producir sonido. Aunque la función tone() simplifica este proceso, conocer el método manual te brinda una visión más detallada del funcionamiento interno de dispositivos electrónicos como el buzzer.

Es importante tener en cuenta que los sonidos generados por playNoteManual() y tone() pueden no ser exactamente iguales, ya que Arduino optimiza este proceso. Sin embargo, este método manual es una excelente aproximación para aprender y experimentar.

¡Genial! Hemos llegado al final. Ha sido un recorrido bastante interesante, y espero sinceramente que este texto te haya sido útil. Si te surge alguna duda, no dudes en escribirme por WhatsApp. Además, te recomiendo que visites este enlace, donde encontrarás una lista de las notas musicales y sus frecuencias. Con tone(), puedes incluso tocar una melodía. Si te interesa, no dudes en preguntarme, y podemos explorarlo juntos o revisar el código del proyecto completo.

Para inspirarte, aquí tienes un ejemplo que adapté de esta página. Se trata de la música de Mario, aunque utiliza un C++ un poco más avanzado.

#define NOTE_C5  523 
#define NOTE_D5  587 
#define NOTE_E5  659 
#define NOTE_F5  698 
#define NOTE_G5  784 
#define NOTE_A5  880 
#define NOTE_AS5 932 
#define NOTE_B5  988 
#define NOTE_C6  1047
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_G6  1568
#define NOTE_A6  1760

#define buzzerPin 10

// Mario main theme melody
int melody[] = {
  NOTE_E6, NOTE_E6, 0, NOTE_E6,
  0, NOTE_C6, NOTE_E6, 0,
  NOTE_G6, 0, 0,  0,
  NOTE_G5, 0, 0, 0,

  NOTE_C6, 0, 0, NOTE_G5,
  0, 0, NOTE_E5, 0,
  0, NOTE_A5, 0, NOTE_B5,
  0, NOTE_AS5, NOTE_A5, 0,

  NOTE_G5, NOTE_E6, NOTE_G6,
  NOTE_A6, 0, NOTE_F6, NOTE_G6,
  0, NOTE_E6, 0, NOTE_C6,
  NOTE_D5, NOTE_B5, 0, 0,

  NOTE_C6, 0, 0, NOTE_G5,
  0, 0, NOTE_E5, 0,
  0, NOTE_A5, 0, NOTE_B5,
  0, NOTE_AS5, NOTE_A5, 0,

  NOTE_G5, NOTE_E6, NOTE_G6,
  NOTE_A6, 0, NOTE_F6, NOTE_G6,
  0, NOTE_E6, 0, NOTE_C6,
  NOTE_D5, NOTE_B5, 0, 0
};

// Mario main theme tempo
int tempo[] = {
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,

  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,

  9, 9, 9,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,

  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,

  9, 9, 9,
  12, 12, 12, 12,
  12, 12, 12, 12,
  12, 12, 12, 12,
};

void setup() {
  pinMode(buzzerPin, OUTPUT); // buzzer
}

void loop() {
  playMelody(melody, tempo, sizeof(melody) / sizeof(int));
  delay(3000);  // Espera antes de repetir la melodía
}

void playMelody(int *melody, int *tempo, int size) {
  for (int thisNote = 0; thisNote < size; thisNote++) {
    int noteDuration = 1000 / tempo[thisNote];
    buzz(buzzerPin, melody[thisNote], noteDuration);
    delay(noteDuration * 1.30);
  }
}

void buzz(int targetPin, long frequency, long length) {
  if (frequency == 0) {
    delay(length);
    return;
  }

  long delayValue = 1000000 / frequency / 2;
  long numCycles = frequency * length / 1000;

  for (long i = 0; i < numCycles; i++) {
    digitalWrite(targetPin, HIGH);
    delayMicroseconds(delayValue);
    digitalWrite(targetPin, LOW);
    delayMicroseconds(delayValue);
  }
}
Enter fullscreen mode Exit fullscreen mode

Referencias

Sobre este video no es necesario verlo entero, aunque en mi opinion es muy bonito e interesante, es solo para que aprendas sobre la parte sonora de los primeros minutos: ¿Qué es la Transformada de Fourier? Una introducción visual

Este otro vídeo a primera vista, no parece tan serio, pero se aprende de forma divertida cómo funcionan los altavoces y los micrófonos: ¿Se puede crear un altavoz con un VASO?

Este es bastante opcional aunque tiene que ver: Qué es una ESCALA MUSICAL

Enlaces variados que he consultado para escribir esto 😊:

Top comments (0)