Hi all
Using a DY-HV20T sound board in a Nerf project but no sound is playing. Previously I used a ISD1820 board and that worked fine so im confused as to what it could be?
- wire (blue) is connected to the arduino’s ground, + wire (red/ yellow) is connected to the raw voltage from the 2s lipo. Green signal wire is connected to an output pin on the arduino and activating the pin makes the signal go low which is what this board requires. 99.9% sure the SD card and audio file are correct, and ive tried all the different DIP switch combinations. There’s a 1.2k resistor on the signal pin to drop the voltage from 5v to 3.3v
If you look at the pinout drawing below, I do wonder if I’m missing a ground connection from the last pin that’s last in the line of the signal pins? But that seems to relate to switches rather than Arduino outputs?
Any help would be great! Code below as well.
// Updated for Arduino Pro Micro USB-C 5V - Jan 2026. Audio pin remains HIGH (Idle), pulls LOW to trigger sound.
const int alignPin = 5;
const int triggerPin = 6;
const int recoilPin = 7;
const int laserPin = 8;
const int audioPin = 4;
const int RotSwitch1 = 14; // Single
const int RotSwitch2 = 16; // 3-Shot (Note: Logic check below)
const int RotSwitch3 = 10; // Full Auto
void setup() {
pinMode(triggerPin, INPUT);
pinMode(alignPin, INPUT);
pinMode(laserPin, OUTPUT);
pinMode(recoilPin, OUTPUT);
pinMode(audioPin, OUTPUT);
// Set audio pin HIGH immediately so it doesn't trigger on boot
digitalWrite(audioPin, HIGH);
pinMode(RotSwitch1, INPUT_PULLUP);
pinMode(RotSwitch2, INPUT_PULLUP);
pinMode(RotSwitch3, INPUT_PULLUP);
}
void fireSequence(int postDelay) {
delay(6); // UIPM barrel delay
digitalWrite(laserPin, HIGH);
digitalWrite(recoilPin, HIGH);
digitalWrite(audioPin, LOW); // Trigger Audio
delay(10);
digitalWrite(recoilPin, LOW);
delay(15);
digitalWrite(laserPin, LOW);
delay(35);
digitalWrite(audioPin, HIGH); // Stop/Reset Audio
delay(postDelay);
}
void loop() {
int triggerState = digitalRead(triggerPin);
int alignState = digitalRead(alignPin);
int Rot1 = digitalRead(RotSwitch1);
int Rot2 = digitalRead(RotSwitch2);
int Rot3 = digitalRead(RotSwitch3);
// 1. ALIGNMENT MODE (Highest Priority)
if (alignState == HIGH) {
digitalWrite(laserPin, HIGH);
}
else {
// 2. SINGLE SHOT
if (triggerState == HIGH && Rot1 == LOW) {
fireSequence(684);
// Wait for trigger release (Debounce/Semi-auto logic)
while(digitalRead(triggerPin) == HIGH) { delay(10); }
}
// 3. 3-SHOT BURST
else if (triggerState == HIGH && Rot1 != LOW && Rot2 != LOW) {
for(int i = 0; i < 3; i++) {
fireSequence(15);
}
delay(675); // Cooldown after burst
while(digitalRead(triggerPin) == HIGH) { delay(10); }
}
// 4. FULL AUTO
else if (triggerState == HIGH && Rot2 == LOW) {
fireSequence(15);
}
// 5. IDLE - Ensure laser is off if not firing or aligning
else {
digitalWrite(laserPin, LOW);
digitalWrite(recoilPin, LOW);
digitalWrite(audioPin, HIGH);
}
}
}


