Cómo conectar un pin a tierra cuando se activa otro pin analógico

Estoy tratando de combinar dos proyectos de electrónica de trabajo en uno. Tengo un sensor piezoeléctrico independiente del que puedo leer valores cuando vibra a través de un arduino, y tengo una placa de audio independiente (no se necesita arduino) que reproducirá un archivo de sonido cuando conecte uno de sus pines a tierra (actualmente a través de un presionar el botón).

Esta es la configuración básica para la placa de audio.

y esta es la configuración básica para el botón piezoeléctrico /

Lo que quiero hacer es eliminar la necesidad de que el botón active los archivos de sonido y, en su lugar, usar la vibración del piezoeléctrico para activar la reproducción de una canción.

La placa de sonido está configurada para reproducir una pista cuando conecta uno de sus pines a tierra. Tiene una resistencia pullup incorporada. Con el piezoeléctrico, tengo un código ejecutándose de modo que, si la vibración supera cierto valor, activará una función para reproducir el sonido:

if (piezoV > 0.1){ //play sound }

¿Qué necesito desde la perspectiva del cableado y el código para que el piezo reproduzca el sonido? Lo que intenté fue configurar uno de los pines de arduino para hacer una escritura digital:

const int SOUND_PIN = 2; //Trigger Sound Board
void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(SOUND_PIN, OUTPUT);
}

void loop() {
  int piezoADC = analogRead(PIEZO_PIN);
  float piezoV = piezoADC / 1023.0;
  if (piezoV > 0.1){
    playSound();
    delay(5000);
    stopSound();
  } 
}

void playSound(){
  digitalWrite(SOUND_PIN, HIGH);
}

void stopSound(){
  digitalWrite(SOUND_PIN, LOW);
}

Luego pensé que podría conectar un cable desde el pin 2 de arduino a la tierra de la placa de sonido, y un cable desde la tierra de la placa de sonido a su propio pin 1 (para reproducir la pista 1), pero parece que, ya sea que haya vibración o no, cuando hago eso, el sonido se reproduce incondicionalmente.

ALAMBRADO:

Piezo a A0, Arduino Pin 2 a tierra, Tierra a Sound FX Board Pin 1

Configuración de cableado para reproducir audio con un botón:

ingrese la descripción de la imagen aquí

Si alguien puede señalarme en la dirección correcta, ¡lo agradecería!

¿No tienes la polaridad de la salida del pin invertida? ¿No deberías ponerlo BAJO para reproducir el sonido?
De acuerdo con @ crj11. digitalWrite (PIN, LOW) es lo mismo que conectar algo a tierra (ya que establece el pin del microcontrolador en 0V). Si bien no debe usarse para corrientes altas, supongo que está bien aquí. Como resultado, el comando playSound() debe establecer el pin bajo, no alto.
Hmmm, debe haber algo más que me estoy perdiendo, tal vez con el cableado. Dibujaré mi cableado actual.
No veo una conexión entre Arduino Ground y Soundboard Ground.

Respuestas (2)

¿Puede conectar la placa de sonido de la manera habitual, tierra de Arduino a tierra de la placa de sonido, pin 2 de Arduino al pin 1 de reproducción de la placa de sonido y modificar la salida para lógica invertida (BAJO = reproducir y ALTO = detener establecido como entrada = detener ) ?

Obviamente, suena todo el tiempo porque el pin de reproducción de la caja de resonancia siempre está conectado al pin de tierra de la caja de resonancia.

Esta es su primera configuración:

esquemático

simular este circuito : esquema creado con CircuitLab

Primera opción:

esquemático

simular este circuito

Arduino usa niveles de E/S de 0-5V, la caja de resonancia usa 0-3.3V, por eso debe usar solo pinMode (SOUND_PIN, INPUT); desconectando el pin de reproducción de sonido en lugar de digitalWrite (SOUND_PIN, HIGH) que tira del pin a 5V cuando desea liberar el pin.

Para tirar del pin a GND, use digitalWrite (SOUND_PIN, LOW); pinMode (SOUND_PIN, OUTPUT);

Vea el siguiente ejemplo:

const int SOUND_PIN = 2; //Trigger Sound Board
void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(SOUND_PIN, INPUT);// high impedance, sound pin disconnected
  digitalWrite(SOUND_PIN, LOW);//make sure the pin will be low when using it
  //this last instruction has no effect yet as long as the pin is configured as input
}

void loop() {
  int piezoADC = analogRead(PIEZO_PIN);
  float piezoV = piezoADC / 1023.0;
  if (piezoV > 0.1){
    playSound();
    delay(5000);
    stopSound();
  } 
}

void playSound(){
  digitalWrite(SOUND_PIN, LOW);//make sure the pin will be low
  pinMode(SOUND_PIN, OUTPUT);// set as output to drive the sound pin to gnd
}

void stopSound(){
  pinMode(SOUND_PIN, INPUT);// high impedance, sound pin disconnected
}

Puede usar la resistencia R1 para la etapa de desarrollo para proteger la entrada de la caja de resonancia de errores de software.

Otras opciones:

Usando un optoacoplador como puede ver en este enlace que encontré en esta pregunta anterior similar. El S2 debe ir a la tierra de la caja de resonancia y el S1 al PIN 1

Usando un relé, aquí hay un ejemplo, pero puede encontrar muchos en la web

Esto no funciona (aún se reproduce todo el tiempo). ¿Tal vez necesito algo que rompa la conexión a tierra? Estoy publicando una imagen de cómo funciona la caja de resonancia con un botón. ¿Hay algo que pueda sustituir al botón que tenga el mismo efecto, solo que con corriente del arduino en lugar de una presión física?
Un relé pero sigo pensando que algo estás haciendo mal. Primero desconecte el pin 1 y vea si sigue jugando, tal vez quemó la entrada en el primer intento. Luego intente usar pinMode (SOUND_PIN, INPUT) en lugar de digitalWrite (SOUND_PIN, HIGH); y escritura digital (SOUND_PIN, BAJO); pinMode(SOUND_PIN, SALIDA); en lugar de digitalWrite(SOUND_PIN, LOW); para hacer flotar la salida cuando desee presionar el botón.
@mheavers También pruebe el código con solo detener el código de reproducción, ¿sigue reproduciéndose? Por favor, no vuelvas a la primera configuración, está completamente mal.
@mheavers Parece que las entradas de la tarjeta de sonido usan 3.3V. Arduino utiliza salidas de 5V. Debería ser seguro usar el código anterior pero no digitalWrite(SOUND_PIN, HIGH); ya que dará salida a 5V.
Lo probaré esta noche. Para responder a su pregunta, el sonido deja de reproducirse cuando desconecto un cable del pin 1 o tierra de la caja de resonancia, por lo que, afortunadamente, no se fríe nada. ¿Usar un transistor como interruptor es una opción? No estaba seguro de si el voltaje sería demasiado para que lo manejara un transistor. Lo siento, nuevo en electrónica...
en realidad no creo que tu comentario anterior tenga sentido para mí. ¿Puede proporcionar una respuesta con el código que está sugiriendo?
Gran respuesta, gracias. Solo hay un detalle que me perdí para cualquiera que trabaje con esta placa de sonido, y es que si desea que un sonido se reproduzca solo mientras el suelo es bajo, debe nombrar el archivo de sonido con el sufijo HOLD. Todas las demás convenciones de nomenclatura seguirán vigentes. Si desea que el sonido se reproduzca en bucle hasta que el pin vuelva a activarse bajo, nómbrelo con el LATCHsufijo. Consulte learn.adafruit.com/adafruit-audio-fx-sound-board/…

Gracias por la respuesta: estaba trabajando en un proyecto separado y tenía problemas para activar los pines. Hay un modo en serie, pero tengo mucho ruido en el sistema, por lo que se prefiere DIO. Usar INPUT para hacer flotar los pines funcionó muy bien. Aquí está mi código de muestra. Tenga en cuenta que solo necesita mantener el pin bajo durante> 120 ms para activar el audio.

#define PIN_RESET   2
#define PIN_SOUND0  3
#define PIN_SOUND1  4
#define PIN_SOUND2  5

#define AUDIO_TOUCH_DELAY 150

void setup() {
  pinMode(PIN_RESET, INPUT);     // high impedance, sound pin disconnected
  pinMode(PIN_SOUND0, INPUT);     // high impedance, sound pin disconnected
  pinMode(PIN_SOUND1, INPUT);     // high impedance, sound pin disconnected
  pinMode(PIN_SOUND2, INPUT);     // high impedance, sound pin disconnected
} // setup


void loop() {
  // don't need to reset to start
  //digitalWrite(PIN_RESET, LOW);  // make sure the pin will be low
  //pinMode(PIN_RESET, OUTPUT);    // set as output to drive the sound pin to gnd
  //delay(AUDIO_TOUCH_DELAY);
  //pinMode(PIN_RESET, INPUT);     // high impedance, sound pin disconnected
  //delay(500);

  // test interrupting a sound to play another - sound 0 is almost 2 seconds long
  digitalWrite(PIN_SOUND0, LOW);  // make sure the pin will be low
  pinMode(PIN_SOUND0, OUTPUT);    // set as output to drive the sound pin to gnd
  delay(AUDIO_TOUCH_DELAY);
  pinMode(PIN_SOUND0, INPUT);     // high impedance, sound pin disconnected
  delay(500);

  digitalWrite(PIN_RESET, LOW);  // make sure the pin will be low
  pinMode(PIN_RESET, OUTPUT);    // set as output to drive the sound pin to gnd
  delay(AUDIO_TOUCH_DELAY);
  pinMode(PIN_RESET, INPUT);     // high impedance, sound pin disconnected
  delay(500);

  // play the three sounds in order with delay time to play them
  digitalWrite(PIN_SOUND0, LOW);  // make sure the pin will be low
  pinMode(PIN_SOUND0, OUTPUT);    // set as output to drive the sound pin to gnd
  delay(AUDIO_TOUCH_DELAY);
  pinMode(PIN_SOUND0, INPUT);     // high impedance, sound pin disconnected
  delay(2000);

  digitalWrite(PIN_SOUND1, LOW);  // make sure the pin will be low
  pinMode(PIN_SOUND1, OUTPUT);    // set as output to drive the sound pin to gnd
  delay(AUDIO_TOUCH_DELAY);
  pinMode(PIN_SOUND1, INPUT);     // high impedance, sound pin disconnected
  delay(2000);

  digitalWrite(PIN_SOUND2, LOW);  // make sure the pin will be low
  pinMode(PIN_SOUND2, OUTPUT);    // set as output to drive the sound pin to gnd
  delay(AUDIO_TOUCH_DELAY);
  pinMode(PIN_SOUND2, INPUT);     // high impedance, sound pin disconnected
  delay(6000);

} // loop