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!
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
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.
// 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);
}
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!
#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' ){
}
}
}
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.
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.