Hola encontré que no inicializas la SD antes de llamar al archivo y por eso el error.
Acá lo comencé pero hay una falla en un break de ajusteMotor() y como no tengo mas tiempo te lo dejo para que lo mires
#include <Stepper.h>
#include <SD.h>
#define SDPin 10
#include <TMRpcm.h>
#include <SPI.h>
TMRpcm audio;
int pinStep = 7;
int pinDirec = 8;
int micropausa = 600;
int micropausaInicio = 15000;
int posVert = 465;
int sensor = 155;
int micropausaLaser = 2000;
int micropausaSensor = 2000;
int haces = 6;
int pasosHaces = 12;
int pinLaser = 4;
int pinLed = 6;
int pinAudio = 9;
int pinBoton = 3;
int valBot = 0;
int noteStatus[] = {0,0,0,0,0,0};
int notasMIDI[] = {58,62,65,70,72,74};
void setup() {
pinMode(pinLaser, OUTPUT); // Declaro el pin del laser
digitalWrite(pinLaser, LOW); // Apago el laser
pinMode(pinLed, OUTPUT); // Declaro el pin del Led de status
digitalWrite(pinLed, LOW); // Dejo el Led de estatus apagado
// Para que suene el sable láser al arrancar
audio.speakerPin = pinAudio; // Debe ser el Pin 9 en Arduino Uno y Nano, y 11 en el Mega
Serial.begin(9600); // Para reproducir el audio al comienzo
pinMode(SDPin, OUTPUT);
// Reproduzco el sonido de sable láser:
if (!SD.begin(SDPin)) { // see if the card is present and can be initialized:
Serial.println("SD fail");
return; // don't do anything more if not
}
else{
Serial.println("SD ok");
}
ajusteMotor(); // Llamo a la función ajusteMotor() para colocar el espejo en su sitio y arrancar la secuencia de incio
//Arranco MIDI:
Serial.begin(31250); // Especifico el canal de comunicación para MIDI
Serial.write(192); // Byte para cambiar de instrumento en canal 0
Serial.write(15); // Número de instrumento
delay(100);
}
// Pongo el motor/espejo en su sitio al comienzo y secuencia de inicio:
void ajusteMotor()
{
int numpasosini; //número de pasos en la secuencia de inicio (se calcula automáticamente)
int contini=0; // contador secuencia de inicio (se calcula automáticamente)
pinMode(pinBoton, INPUT); // Declaro el pin del boton como input
pinMode(pinDirec, OUTPUT);
pinMode(pinStep, OUTPUT);
digitalWrite(pinDirec, LOW);
digitalWrite(pinStep, LOW);
for (int pos = 0; pos < 4000; pos++)
{
valBot = digitalRead(pinBoton);
if (valBot == LOW)
{ // si el botón está pulsado:
//digitalWrite(pinLed, HIGH); // Enciendo el led
digitalWrite(pinDirec, HIGH); // Cambio la dirección
for (int pos2 = 0; pos2<posVert; pos2++)
{
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
delayMicroseconds(micropausa);
}
digitalWrite(pinLaser, HIGH); // Enciendo el laser
audio.play("laser.wav");
}
// Secuencia abanico desplegado totalmente, acelerando linealmente:
numpasosini=(haces-1)*pasosHaces*17/2; // Calculo el número de pasos en la secuencia de inicio
// Compruebo la célcula fotoeléctrica, y mando arrancar la secuencia de inicio cuando se active:
while(true)
{
if ( (analogRead(0) > sensor*2 ) ) // Si el sensor recibe señal
{
digitalWrite(pinLed, HIGH); // Enciendo el led
digitalWrite(pinDirec, LOW); // Cambio la dirección
for (int pos2 = 0; pos2<((haces-1)*pasosHaces/2); pos2++)
{
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
digitalWrite(pinLaser, HIGH); // Enciendo el laser
delayMicroseconds(micropausaInicio-(micropausaInicio-micropausa)/numpasosini*contini++);
digitalWrite(pinLaser, LOW); // Apago el laser
}
for (int pos3 = 0; pos3<4; pos3++)
{
digitalWrite(pinDirec, HIGH); // Cambio la dirección
for (int pos2 = 0; pos2<((haces-1)*pasosHaces); pos2++)
{
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
digitalWrite(pinLaser, HIGH); // Enciendo el laser
delayMicroseconds(micropausaInicio-(micropausaInicio-micropausa)/numpasosini*contini++);
digitalWrite(pinLaser, LOW); // Apago el laser
}
digitalWrite(pinDirec, LOW); // Cambio la dirección
for (int pos2 = 0; pos2<((haces-1)*pasosHaces); pos2++)
{
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
digitalWrite(pinLaser, HIGH); // Enciendo el laser
delayMicroseconds(micropausaInicio-(micropausaInicio-micropausa)/numpasosini*contini++);
digitalWrite(pinLaser, LOW); // Apago el laser
}
}
break;
}
}
// // Si quiero ahorrarme la secuencia de inicio, habría que comentar la sección anterior.
// // Dejo el espejo en la posición del primer haz:
// digitalWrite(pinDirec, LOW); // Cambio la dirección
// for (int pos2 = 0; pos2<((haces-1)*pasosHaces/2); pos2++)
// {
// digitalWrite(pinStep, LOW);
// digitalWrite(pinStep, HIGH);
// delayMicroseconds(micropausa);
// }
break;
}
else
{ // el botón no está pulsado:
digitalWrite(pinLed, LOW); // Mantengo el led apagado
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
delayMicroseconds(micropausa);
}
}
}
void loop()
{
for (int pos = 1; pos < haces; pos++)
{ // En una dirección
digitalWrite(pinDirec, HIGH); // Establezco la dirección del motor
digitalWrite(pinLaser, HIGH); // Enciendo el láser
delayMicroseconds(micropausaLaser); // Dejo el láser encendido el tiempo micropausaLaser
// Compruebo la célcula fotoeléctrica, y mando tocar/parar de tocar la nota correspondiente:
if ( (analogRead(0) > sensor ) && ( noteStatus[pos] == 0 )) // Si el sensor recibe señal, y la nota no está sonando
{
noteMIDI(0x90, notasMIDI[pos-1], 0x45);
//tone(pinAudio,notas[pos-1]);
digitalWrite(pinLed, HIGH);
noteStatus[pos]++;
}
else if (analogRead(0) < sensor )
{
if (noteStatus[pos] >= 1) // Si hay una nota tocando (porque aún no la he apagado, aunque no haya señal)
{
//if (noteStatus[pos]++ == 2) //Solo para de sonar si ya han pasado tres ciclos sin recibir señal...
//{
noteMIDI(0x90, notasMIDI[pos-1], 0x00);
//noTone(pinAudio);
digitalWrite(pinLed, LOW);
noteStatus[pos]=0;
//}
}
}
digitalWrite(pinLaser, LOW);
delayMicroseconds(micropausaSensor);
for (int pos2 = 0; pos2<pasosHaces; pos2++) // Avanzo un haz (el número de (micro)pasos definidos en la variable pasosHaces
{
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
delayMicroseconds(micropausa);
}
}
for (int pos = haces; pos > 1; pos--)
{ // En la otra dirección
digitalWrite(pinDirec, LOW);
digitalWrite(pinLaser, HIGH);
delayMicroseconds(micropausaLaser);
if ( (analogRead(0) > sensor ) && ( noteStatus[pos] == 0 ))
{
noteMIDI(0x90, notasMIDI[pos-1], 0x45);
//tone(pinAudio,notas[pos-1]);
digitalWrite(pinLed, HIGH);
noteStatus[pos]++;
}
else if (analogRead(0) < sensor )
{
if (noteStatus[pos] >= 1)
//if (noteStatus[pos]++ == 2)
noteMIDI(0x90, notasMIDI[pos-1], 0x00);
//noTone(pinAudio);
digitalWrite(pinLed, LOW);
noteStatus[pos]=0;
//}
}
}
digitalWrite(pinLaser, LOW);
delayMicroseconds(micropausaSensor);
for (int pos2 = 0; pos2<pasosHaces; pos2++)
digitalWrite(pinStep, LOW);
digitalWrite(pinStep, HIGH);
delayMicroseconds(micropausa);
}
}
}
void noteMIDI(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
Para entender que hice observa este ejemplo