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:
Configuración de cableado para reproducir audio con un botón:
Si alguien puede señalarme en la dirección correcta, ¡lo agradecería!
¿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:
simular este circuito : esquema creado con CircuitLab
Primera opción:
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
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 LATCH
sufijo. 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
crj11
DSWG
mascadores
pedro bennett