Go Down

Topic: ¿Por qué no compila? (Read 1 time) previous topic - next topic

PascuaL

Mar 16, 2012, 11:11 pm Last Edit: Mar 16, 2012, 11:53 pm by a9965 Reason: 1
Radiofrecuencia y servomotores mezclados.He trabajado con los dos por separado y funciona perfecto, pero cuando los uno, no funciona.
La función es mediante radiofrecuencia, mover servos a determinadas posiciones.Por problemas de compatibilidad entre librerias.¿Qué hago?
GRACIAS!
Code: [Select]

#include <VirtualWire.h>

#include <Servo.h>

Servo myservo;  

int pos = 0;    



int pinRx = 4;

void setup(){
  myservo.attach(9);  


 Serial.begin(9600);

 vw_set_rx_pin(pinRx);
 vw_setup(2000);
 vw_rx_start();
//setup


}

void loop(){

 uint8_t mensaje[VW_MAX_MESSAGE_LEN];
 uint8_t longitud = VW_MAX_MESSAGE_LEN;

 if (vw_get_message( mensaje , &longitud ) ){    
   Serial.print("Recibido -> ");
   Serial.println( mensaje[0] );
   
   if( mensaje[0] == 'A' ){
     myservo.write(pos);            
   delay(15);  
 
     
             
   }else if( mensaje[0] == 'R' ){
               
   }else if( mensaje[0] == 'V' ){
     
}else if( mensaje[0] == 'N' ){
       
 
 }
}
}

curro92

Hola,
si no compila, te dará algún error. ¿Podrías indicarnos?


PascuaL

VirtualWire\VirtualWire.cpp.o: In function `__vector_11':
C:\Users\Santi\Desktop\arduino-1.0\libraries\VirtualWire/VirtualWire.cpp:416: multiple definition of `__vector_11'
Servo\Servo.cpp.o:C:\Users\Santi\Desktop\arduino-1.0\libraries\Servo/Servo.cpp:103: first defined here




Gracias!

curro92

Hola,
en Google hay bastantes menciones a ese conflicto de esas dos librerías. Busca en Google trozos del mensaje de error como multiple definition of  __vector_11
Parece que el problema está en que las dos usan el mismo timer.
En algún sitio he visto que presentan como alternativa usar "SoftwareServo.zip"
http://www.arduino.cc/playground/ComponentLib/Servo
Mi conocimiento de los timer es escaso, seguro que hay gente que conoce más profundamente el problema.


PascuaL

Si he estado mirando. La solución esta en usar la librería timerServo2. Pero no encuentro su sintaxis ni información acerca de ésta en Arduino.

¿Alguien sabe ésto?

Un saludo y gracias por su atención!

curro92

#5
Mar 17, 2012, 07:10 pm Last Edit: Mar 17, 2012, 07:12 pm by curro92 Reason: 1
Hola,
Mira en la página http://letsmakerobots.com/node/12803
Ahí tienes un link para bajar la librería ServoTimer2

PascuaL

Instalada ya la tenía, pero gracias de todas formas.
Es que en ningún sitio pone nada acerca de la libreria.

curro92

Hola,

ahí va un ejemplo sacado de aquí http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?action=print;num=1285514626

Code: [Select]
// this sketch cycles three servos at different rates

#include <ServoTimer2.h>  // the servo library

// define the pins for the servos
#define rollPin  2
#define pitchPin 3
#define yawPin   4

ServoTimer2 servoRoll;    // declare variables for up to eight servos
ServoTimer2 servoPitch;
ServoTimer2 servoYaw;

void setup() {
servoRoll.attach(rollPin);     // attach a pin to the servos and they will start pulsing
servoPitch.attach(pitchPin);
servoYaw.attach(yawPin);
}


// this function just increments a value until it reaches a maximum
int incPulse(int val, int inc){
  if( val + inc  > 2000 )
   return 1000 ;
  else
    return val + inc;
}

void loop()
{
int val;

  val = incPulse( servoRoll.read(), 1);
  servoRoll.write(val);

  val =  incPulse( servoPitch.read(), 2);
  servoPitch.write(val);

  val = incPulse(servoYaw.read(), 4);
  servoYaw.write(val);

  delay(10);
}


PascuaL

Muchas gracias! Lo pruebo y te digo algo. Un saludo

chiva

Teniendo en cuenta que es una librería del 2009, es imposible que funcione sin retoques en la versión 1.0 del IDE
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

PascuaL

#10
Mar 18, 2012, 02:09 am Last Edit: Mar 18, 2012, 02:12 am by a9965 Reason: 1
Ya he conseguido que vaya. Desde un teclado inalámbrico pulso el 1 y se mueve a un lado, y debería de ser que pulse el 2 y para el otro lado. Pero se queda bloqueado. Es cosa de que hay que meterle un refresco al servo o algo, no se si me explico.
Gracias a todos!


Code: [Select]
#include <ServoTimer2.h>
#include <VirtualWire.h>
int rollPin=9;
ServoTimer2 servoRoll;




int pinRx = 4;

void setup(){
   pinMode(13,OUTPUT);
servoRoll.attach(rollPin);     

  Serial.begin(9600);

  vw_set_rx_pin(pinRx);
  vw_setup(2000);
  vw_rx_start();
//setup


}


void loop(){

 
   
  uint8_t mensaje[VW_MAX_MESSAGE_LEN];
  uint8_t longitud = VW_MAX_MESSAGE_LEN;

  if (vw_get_message( mensaje , &longitud ) ){   
    Serial.print("Recibido -> ");
    Serial.println( mensaje[0] );
   
    if( mensaje[0] == 'A' ){
       servoRoll.write(100);        // Lo mueve hasta aquí, pero hay que meterle algo para que...
   
             
    }else if( mensaje[0] == 'B' ){
     servoRoll.write(50);            //...aquí te deje moverlo de nuevo
       

               
    }else if( mensaje[0] == 'V' ){
     
       
}else if( mensaje[0] == 'G' ){
   
  }
}
}

PascuaL

Hace como un ruido, como si se estuviera forzando. Ayudadme cuanto podais necesito tener ésto para esta semana.
Gracias un saludo

PascuaL

He estado realizando pruebas un buen rato. He retirado del código las acciones de mover el servo y para mi sorpresa, descubro que sigue con el 'forceo' que anteriormente, creia que era del código.

PascuaL

Ya lo he conseguido. Pero sigo con el problema de que el servo se queda 'pillado'. El motor interno se mueve quedándose bloqueado.

xangel

Hola yo he probado a modificar los Timer de la librería Virtual Wire, concretamente el Timer1 lo he renombrado como TimerX en todas la líneas del código (creo recordar que eran 2) de la librería VirtualWire.cpp y los errores de compilación desaparecen al trabajar con las dos librerías VirtualWire y Servo.
He intentado trabajar también con las librerías SoftwareServo y ServoTimer2 pero mi sorpresa es que arduino parece no reconocerlas, pues al importarlas no quedan marcadas de color como ocurre con otras librerías y las instrucciones del código, además de dar varios errores al compilar.

Go Up