Error compilación

Hola, actualmente estoy siguiendo un**blogdonde se desarrolla la creación de un arpa láser sin marco.
Comentar que no tengo ni idea de programación y realmente voy aprendiendo por el método de prueba y error.
El caso es que cuando cargo el código y compilo me sale un error.
El código podeis descargarlo desde
aqui,** es bastante largo y no me deja ponerlo completo en el post.

Debajo pongo el error por si podeis ayudarme.

Muchas gracias de antemano.

/Users/JuanAntonio/Desktop/ARDUPROYECTOS/arpalaser/arpalaser.ino: In function 'void ajusteMotor()':
/Users/JuanAntonio/Desktop/ARDUPROYECTOS/arpalaser/arpalaser.ino:93:28: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
     audio.play("laser.wav");
                          ^

Moderador
Hola, bienvenido al foro Arduino en Español
Luego de leer las normas postea el enlace del sitio que mencionas porque responder a tu error sin ver el código no es tarea fácil.

Normas del foro

Lo que te ha puesto no es un error sino una Advertencia o Warning

/Users/JuanAntonio/Desktop/ARDUPROYECTOS/arpalaser/arpalaser.ino:93:28: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
      audio.play("laser.wav");

Nota: Así se postean errores o códigos.

define antes del setup, si quieres antes algo como esto

char *archivo = "laser.wav";

y luego cuando debas llamarlo con audio.play haces asi

audio.play(archivo);

Hola, muchas gracias por su ayuda. En relación al código no lo puse porque es muy extenso y hay un limite de caracteres el cual excedía en exceso.

Hola, hice como me dijo pero sale lo mismo

#include <Stepper.h>	
#include <SD.h>       
#define SDPin 10     
#include <TMRpcm.h>   
#include <SPI.h>      

TMRpcm audio;   
char *archivo = "laser.wav";
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); 

  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

    // Reproduzco el sonido de sable láser:
    if (SD.begin(SDPin)) {  // Solo ejecuto si la tarjeta está accesible
      audio.volume(6); // Fijo el volumen (min=0, max=7)
      //audio.play("laser.wav");
    audio.play(archivo);
    }


    // 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);
}

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

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.