Piano LED RGB - Color rojo da problemas con el sonido de un buzzer

Hola, Foreros!

Estoy desarrollando un proyecto para una materia de la universidad con el Starter Pack de Arduino (Arduino UNO R3) y me ha surgido un problema:

Estoy desarrollando un "piano LED RGB" con los siguientes componentes:

  • Arduino Uno R3 (x1)
  • Pulsadores (x4)
  • Buzzer piezoeléctrico (x1)
  • LED RGB (x1)
  • Resistores
    • 220 ohmios (x4)
    • 10k ohmios (x2)
    • 1M ohmios (x1)
  • Cables (los necesarios para realizar las conexiones de Arduino – Placa Prototipado y los materiales en la Placa de Prototipado)

El problema ocurre cuando, al accionar un pulsador y este añadir intensidad al LED RGB en el color rojo, no sé por qué, pero hace que el buzzer tenga problemas. Este emite un sonido raro (nada melódico, más parecido al ruido de un aparato estropeado). Y mientras el LED RGB, tenga alguna intensidad del color rojo este problema sigue ocurriendo. Si al accionar un pulsador trabajo con los demás colores (azul o verde) esto no ocurre; al contrario, todo funciona correctamente.

¿Tienes idea de porqué ocurre esto? ¿A alguno le ocurrido algo parecido?

He probado a cambiar el resistor de la pestaña Red del LED RGB, añadirle uno de mayor resistencia (de 220 a 1k), por si era un tema de la tensión que le llega, pero igual, el color rojo sigue afectando al sonido.

A demás, he probado a colocar un condensador entre las conexiones de energía y tierra del buzzer, para darle más energía, pero nada.

Adjunto el código:

// array de las notas
int notes[] = { 262, 294, 330, 440 };

//constantes con el numero de pin de los colores del LED RGB
const int redLEDPin = 11;
const int blueLEDPin = 10;
const int greenLEDPin = 9;

//variables que almacenan la intensidad de los colores
int blueValue = 0;
int redValue = 0;
int greenValue = 0;

//variables de tiempo
int cuarto = 1000 / 4; // 1/4 de segundo
double pausa = 1.30; // pausa del 30% 


void setup() {
  //iniciamos la comunicación serial
  Serial.begin(9600);

  //los pines del LED RGB están en modo salida
  pinMode(redLEDPin,OUTPUT);
  pinMode(blueLEDPin,OUTPUT);
  pinMode(greenLEDPin,OUTPUT);

}

void loop() {
  // create a local variable to hold the input on pin A0
  int keyVal = analogRead(A0);
  // send the value from A0 to the Serial Monitor
  printInfo(keyVal);
  // play the note corresponding to each value on A0
  if (keyVal >= 1020 && keyVal <= 1030) {
    // play the first frequency in the array on pin 8
    tone(8, notes[0], cuarto);
    //digitalWrite(redLedPin, HIGH);
    if(redValue < 255 && redValue >= 0){
      redValue++;
    }
  } else if (keyVal >= 990 && keyVal <= 1010) {
    // play the second frequency in the array on pin 8
    tone(8, notes[1], cuarto);
    if(blueValue < 255 && blueValue >= 0){
      blueValue++;
    }

  } else if (keyVal >= 505 && keyVal <= 525) {
    // play the third frequency in the array on pin 8
    tone(8, notes[2], cuarto);
    if(greenValue < 255 && greenValue >= 0){
      greenValue++;
    }
  } else if (keyVal >= 5 && keyVal <= 20) {
    // play the fourth frequency in the array on pin 8
    tone(8, notes[3], cuarto);

    if(blueValue < 255 && blueValue >= 0){
      blueValue++;
    }
    if(greenValue < 255 && greenValue >= 0){
      greenValue++;
    }
  } else {
    // if the value is out of range, play no tone
    noTone(8);

    if(redValue <= 255 && redValue > 0){
      redValue--;
    }
    if(greenValue <= 255 && greenValue > 0){
      greenValue--;
    }
    if(blueValue <= 255 && blueValue > 0){
      blueValue--;
    }
    
  }
  analogWrite(redLEDPin, redValue);
  analogWrite(blueLEDPin, blueValue);
  analogWrite(greenLEDPin, greenValue);
  delay(cuarto*pausa);
}

void printInfo(int keyVal){
  Serial.println(keyVal);
  Serial.print("Red Value : ");
  Serial.print(redValue);
  Serial.print(", \t Blue Value : ");
  Serial.print(blueValue);
  Serial.print(", \t Green Value : ");
  Serial.println(greenValue);
}

Adjunto capturas del prototipo:

¡Gracias de antemano por la ayuda!

Un saludo.

Ary usando la biblioteca newtone...
https://bitbucket.org/teckel12/arduino-new-tone/wiki/Home

1 Like

El uso de la función tone()interferirá con la salida PWM en los pines 3 y 11 (en placas que no sean Mega)

Traducido de: tone() - Arduino Reference

Así como tone() interfiere con PWM, PWM interfiere con tone() en esos pines.

1 Like

Moderador
Lee el punto 5 de las normas y edita tu título.
Te envío mensaje privado con mas detalles

1 Like

Hola @MaximoEsfuerzo .

Gracias a tu comentario he podido solucionar el problema.
Como comentas el pin 11 estaba haciendo interferencias con la salida de datos (en este caso enviar valores a la pestaña R del LED RGB), y esto afectaba también al buzzer ya que se trabajaba con ambos componentes a la vez (dar intensidad al color y emitir vibraciones en el buzzer).

¡Muchas gracias!

Un cordial saludo.
Borja

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.