Skip to content

Instantly share code, notes, and snippets.

@stonehippo
Last active December 19, 2022 03:21
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save stonehippo/308a5f5c49d4981ac976 to your computer and use it in GitHub Desktop.
Save stonehippo/308a5f5c49d4981ac976 to your computer and use it in GitHub Desktop.
A simple Arduino trigger of the Adafruit Audio FX Sound Board
// A simple trigger for the Adafruit Audio FX Sound Board
// For complete info on the sound board, see https://learn.adafruit.com/adafruit-audio-fx-sound-board/overview
/*
This is a simple test of a direct trigger of the Audio FX Sounds Board from an Arduino.
For my test, I used an Arduino Pro Mini running at 3.3v & 8mHz. Digital pin #4 of the Arduino
was connected to trigger pin #0 of the Sound Board, and I tied them to a common ground. I powered
Sound Board via a USB external battery for the initial tests, and the Arduino via the FTDI cable.
For later tests, I powered the Sound Board via the Arduino's VCC (3v) pin directly.
*/
#define PIN 4
#define LED 13 // Most Arduinos have an LED on pin 13
#define BUTTON 2 // put a simple button on pin 2 to enable/disable sound playback
void setup() {
pinMode(LED, OUTPUT); // Make the LED pin active
pinMode(BUTTON, INPUT_PULLUP);
setupSound(PIN);
}
void loop() {
if (digitalRead(BUTTON) == HIGH) {
delay(500);
activateSound(PIN);
delay(500);
}
}
void setupSound(int pin) {
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); // Set the pin high as the default state
}
void activateSound(int pin) {
digitalWrite(LED, HIGH);
digitalWrite(pin, LOW); // bring the pin low to begin the activation
/*
According to the documentation, the Audio FX board needs 50ms to trigger. However,
I've found that coming from my 3.3v Arduino Pro, it needs 100ms to get the trigger
the going
*/
delay(100); // hold the pin low long enough to trigger the board; may need to be longer for consistent triggering
digitalWrite(pin, HIGH); // bring the pin high again to end the activation
digitalWrite(LED, LOW);
}

A simple trigger for the Adafruit Audio FX Sound Board

For complete info on the sound board, see https://learn.adafruit.com/adafruit-audio-fx-sound-board/overview

What I'm Doing Here

This is a simple test of a direct trigger of the Audio FX Sounds Board from an Arduino.

For my test, I used an Arduino Pro Mini running at 3.3v & 8mHz. Digital pin #4 of the Arduino was connected to trigger pin #0 of the Sound Board, and I tied them to a common ground. I powered the Sound Board via a USB external battery for the initial tests, and the Arduino via the FTDI cable. For later tests, I powered the Sound Board via the Arduino's VCC (3v) pin directly.

Things to Note

The Audio FX board pins are triggered when connected to ground (they're set up this way so they'll work with simple normally open push buttons connected directly to the board's ground). This has a couple of implications:

  • To trigger a given pin on the Audio FX board, we need to bring the Arduino pin tied to it to LOW, then back to HIGH.
  • I've found that adding a delay of 100ms after setting to LOW is long enough for the Audio FX board to register the trigger event with my 3v3 Arduino. The documentation stats that the board should be able to detect the trigger in 50ms. Not sure if the discrepency is due to the slower clock speed (8mHz) on the Arduino. I'll try it with a 5v Arduino running at 16mHz to see if that has any effect.
    • It turns out even 100ms might not be enough. In another project that I've got going, I had to hold the pin LOW for 250ms to consistently get a trigger to fire.
  • When the board is first powered on, the Arduino pins get set to OUTPUT mode. When that happens, the pins are triggered, causing the sounds to play. I'm not sure of the best way to suppress this, but it bears investigating. UPDATE: I don't think this is actually the case. I added a button to trigger the beginning of the playback. There is no trigger until that button is pressed. Yay!
  • Don't forget to tie the sound board and Arduino's ground together! :)
@tinker424
Copy link

tinker424 commented Nov 23, 2021

A rare, quiet day at work allowed me to play with it now, and I got it working thanks to you! I removed the activation of the second PIN from this code, to check that it worked. The following is part your original, part the new code you posted. And it compiles and runs perfect.

`#define PIN4 4

void setup() {
setupSound(PIN4);
randomSeed(analogRead(0));
}

void randomInterval(long min, long max) {
long wait = random(min, max);
delay(wait);
}

void loop() {
randomInterval(1000, 5000); // between MIN and MAX (say 1 to 5 seconds)
activateSound(PIN4); // trigger first sound
}

void setupSound(int pin) {
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); // Set the pin high as the default state
}

void activateSound(int pin) {
digitalWrite(pin, LOW); // bring the pin low to begin the activation
delay(100); // hold the pin low long enough to trigger the board; may need to be longer for consistent triggering
digitalWrite(pin, HIGH); // bring the pin high again to end the activation
}

I see now that my post from yesterday was unclear; I do not wish to play sound 1 then sound 2. I need to close a secondary circuit, then wait a fixed time, then trigger a pin to play the sound. PIN0 closes a circuit which releases a magnetic door. After 1.5 seconds I need the sound to play using PIN4 to trigger the soundboard.

Is it possible use minutes instead of milliseconds for "randomInterval"?

Now that this works, I will set up PIN0 on the Trinket m0 to handle the magnet. Thank you again for your help so far!

@stonehippo
Copy link
Author

stonehippo commented Nov 23, 2021

@tinker424 Here’s a trivial little application that shows one way to wait for minutes instead of milliseconds (I mean, you’re still waiting for milliseconds, but doing it in whole minutes).

There are a lot of design choices you could make, but for this example, I decided to limit the wait time between 1 and 60 minutes so that you’re always waiting for at least 1 minute. I think you get the idea, and can probably adapt this to whatever you need. As always, there are other ways to do this, but I tried for a simple, readable design.

@Darrell1972
Copy link

Darrell1972 commented Jul 18, 2022

@stonehippo, I'm trying to put together a Halloween scare house project for my kids using two Arduino Nano boards paired via Bluetooth using two Paired HC-05 Bluetooth Modules, also a Adafruit FX sound board and I want to trigger the sound with a break Beam sensor by Adafruit. I want to have the break beam sensor connected to the slave Bluetooth connected Nano board so when the beam is broken it activates and trigger the sound on the FX sound board that's connected to the master Nano board. I could really use your help to make this work if possible.

@MwaniN
Copy link

MwaniN commented Dec 19, 2022

Thank you so much for this! I wasn't sure how to trigger the pins to fire on the sound board, this helped a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment