I am working on a Halloween project. Short story: Stand-up coffin's lid opens, skeleton 'jumps' out, (skeleton speaks, jaw and LED eyes move on the sound-this part is done by Arduino mega and VS1053 shield), skeleton retracts into coffin. The coffin and skeleton movements are done by relays.
I had the next sketch working, based on the example 'player simple':
Code: Select all
/*18AUG21
Scope is: when skeleton is outside the coffin, the jaw moves with the spoken words.
This will be activated when the end switch is made. (Have to implement this switch).
jawservo works and eyeleds are working.
*/
/***************************************************
Designed specifically to work with the Adafruit VS1053 Music Maker shield
----> https://www.adafruit.com/product/1788
****************************************************/
// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include <Servo.h>
Servo jaw; // Creates a servo object called jaw
const int jawPin = 8; // Connect jaw to Pin 8
const int ledPin = 9; // Led's on Pin 9
int audioVal = 0; //
const int audioPin = 0; // Connect to audio output to AI Pin 0
const int buttonPin = 2; // Switch Case Open contact connect to Pin 2
int buttonState = 0; // Variable for reading S(witch)C(coffin)O(pen) contact
int busy;
// See http://arduino.cc/en/Reference/SPI "Connections"
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer =
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
void setup()
{
Serial.begin(9600);
jaw.attach(jawPin); // Attaches the jawservo on jawPin
jaw.write(-90); // Put servo on -90 degrees
pinMode(jawPin, OUTPUT);
pinMode (buttonPin, INPUT);
pinMode (ledPin, OUTPUT); // set pin as output
pinMode (ledPin, HIGH); // set pin HIGH or LOW
Serial.println("Adafruit VS1053 Simple_servo Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
musicPlayer.sineTest(0x88, 500); // Make a tone to indicate VS1053 is working
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
Serial.println("SD OK!");
//----list files----
printDirectory(SD.open("/"), 0);
//----Set volume for left, right channels. lower numbers == louder volume!----
musicPlayer.setVolume(5, 5);
// Timer interrupts are not suggested, better to use DREQ interrupt!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
// audio playing
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
// Play one file, don't return until complete //Important, track name: 8 letters dot 3 letters.
//Serial.println(F("Playing track 001"));
// musicPlayer.playFullFile("/track001.mp3");
// Play another file in the background, REQUIRES interrupts!
Serial.println(F("Playing track 002"));
musicPlayer.startPlayingFile("/track002.mp3");
}
void loop() {
musicplayer();
}
void musicplayer()
{
int val = analogRead(audioPin);
val = map(val, 250, 1023, 15, 45); // Analog input between 0 and 1023 --> digital output between 0 and 255
jaw.write(val);
audioVal = analogRead(audioPin); // Read the audioPin
digitalWrite(ledPin, audioVal); // Light up the LED's. (original: audioVal / 4)
{
busy = analogRead(audioPin);
/* // File is playing in the background
if (musicPlayer.stopped()) {
Serial.println("Done playing music");
while (1) {
delay(10); // we're done! do nothing...
}
}*/
/*if (Serial.available()) {
char c = Serial.read();
// if we get an 's' on the serial console, stop!
if (c == 's') {
musicPlayer.stopPlaying();
}
// if we get an 'p' on the serial console, pause/unpause!
if (c == 'p') {
if (! musicPlayer.paused()) {
Serial.println("Paused");
musicPlayer.pausePlaying(true);
} else {
Serial.println("Resumed");
musicPlayer.pausePlaying(false);
}
}
}*/
delay(100);
}
}
/// File listing helper
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
I did found some info @ viewtopic.php?f=31&t=79556#wrap and tried to implement it at different positions. Most is now placed right under 'void loop()' in between the //////////// lines //////////////.
Code: Select all
[code]
/*18bAUG21
Scope is: when skeleton is outside the coffin, the jaw moves with the spoken words.
This will be activated when the end switch is made. (Have to implement this switch).
jawservo works and eyeleds are working.
*/
/***************************************************
Designed specifically to work with the Adafruit VS1053 Music Maker shield
----> https://www.adafruit.com/product/1788
****************************************************/
// include SPI, MP3, SD and Servo libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include <Servo.h>
// See http://arduino.cc/en/Reference/SPI "Connections"
// These are the pins used for the music maker shield
#define SHIELD_RESET -1 // VS1053 reset pin (unused!)
#define SHIELD_CS 7 // VS1053 chip select pin (output)
#define SHIELD_DCS 6 // VS1053 Data/command select pin (output)
// These are common pins between breakout and shield
#define CARDCS 4 // Card chip select pin
// DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt
#define DREQ 3 // VS1053 Data request, ideally an Interrupt pin
Adafruit_VS1053_FilePlayer musicPlayer = // create shield-example object!
Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
Servo jaw; // Creates a servo object called jaw
const int jawPin = 8; // Connect jaw to Pin 8
const int ledPin = 9; // Led's on Pin 9
const int audioPin = 0; // Connect to audio output to AI Pin 0
int audioVal = 0; //
const int c_s_o_Pin = 2; // Cuffin Switch Open contact connect to Pin 2
uint8_t buttonState, // Variable for reading S(witch)C(coffin)O(pen) contact
prevButtonState;
int busy;
void setup()
{
Serial.begin(9600);
jaw.attach(jawPin); // Attaches the jawservo on jawPin
jaw.write(-90); // Put servo on -90 degrees
pinMode(jawPin, OUTPUT);
pinMode (c_s_o_Pin, INPUT); //maybe ...INPUT_PULLUP
buttonState = HIGH;
prevButtonState = HIGH;
pinMode (ledPin, OUTPUT); // set pin as output
pinMode (ledPin, HIGH); // set pin HIGH or LOW
Serial.println("Adafruit VS1053 Simple_servo Test");
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F("Couldn't find VS1053, do you have the right pins defined?"));
while (1);
}
Serial.println(F("VS1053 found"));
//musicPlayer.sineTest(0x88, 500); // Make a tone to indicate VS1053 is working
if (!SD.begin(CARDCS)) {
Serial.println(F("SD failed, or not present"));
while (1); // don't do anything more
}
Serial.println("SD OK!");
//----list files----
//printDirectory(SD.open("/"), 0);
//----Set volume for left, right channels. lower numbers == louder volume!----
musicPlayer.setVolume(5, 5);
// Timer interrupts are not suggested, better to use DREQ interrupt!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int
// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
// audio playing
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int
// Play one file, don't return until complete //Important, track name: 8 letters dot 3 letters.
//Serial.println(F("Playing track 001"));
// musicPlayer.playFullFile("/track001.mp3");
// Play another file in the background, REQUIRES interrupts!
Serial.println(F("Playing track 002"));
musicPlayer.startPlayingFile("/track002.mp3");
}
void musicplayer()
{
int val = analogRead(audioPin);
val = map(val, 250, 1023, 15, 45); // Analog input between 0 and 1023 --> digital output between 0 and 255
jaw.write(val);
audioVal = analogRead(audioPin); // Read the audioPin
digitalWrite(ledPin, audioVal); // Light up the LED's. (original: audioVal / 4)
{
busy = analogRead(audioPin);
}
}
void loop()
{
///////////////////////////////////////////////////////////////////////////////////////////
buttonState = debounceRead(c_s_o_Pin);
if ((LOW == buttonState) && (buttonState != prevButtonState)) //if button was just pressed
{
if (musicPlayer.stopped())
{
if (! musicPlayer.startPlayingFile("/track002.mp3")) {
Serial.println("Could not open file track002.mp3");
while (1);
}
Serial.println (F("Started playing"));
}
else
{
musicPlayer.stopPlaying();
}
}
prevButtonState = buttonState; //update prevButtonState
///////////////////////////////////////////////////////////////////////////////////////////
}
//Use like digitalRead. Incorporates button debouncing.
uint8_t debounceRead(int pin)
{
uint8_t pinState = digitalRead(pin);
uint32_t timeout = millis();
while (millis() < timeout + 10)
{
if (digitalRead(pin) != pinState)
{
pinState = digitalRead(pin);
timeout = millis();
}
}
return pinState;
}
////////// tot hier okay, nog geen jaw functie
/*
{
musicplayer();
}
*/
/*void musicplayer()
{
int val = analogRead(audioPin);
val = map(val, 250, 1023, 15, 45); // Analog input between 0 and 1023 --> digital output between 0 and 255
jaw.write(val);
audioVal = analogRead(audioPin); // Read the audioPin
digitalWrite(ledPin, audioVal); // Light up the LED's. (original: audioVal / 4)
{
busy = analogRead(audioPin);
}
}
*/
/*
{
// File is playing in the background
if (musicPlayer.stopped()) {
Serial.println("Done playing music");
while (1) { // original (1)
delay(10); // we're done! do nothing...
}
}
if (Serial.available()) {
char c = Serial.read();
// if we get an 's' on the serial console, stop!
if (c == 's') {
musicPlayer.stopPlaying();
}
// if we get an 'p' on the serial console, pause/unpause!
if (c == 'p') {
if (! musicPlayer.paused()) {
Serial.println("Paused");
musicPlayer.pausePlaying(true);
} else {
Serial.println("Resumed");
musicPlayer.pausePlaying(false);
}
}
}
delay(100);
}
}
/// File listing helper
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println(" / ");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
*/
When the arduino is powered, it waits till the pushbutton is pressed, the MP3 will play, but no jaw movement or LED's are powered.
Can someone send me in the right direction? Or should I use a different 'example sketch'?