Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« on: March 16, 2012, 05:11:39 pm » |
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! #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' ){ } } }
|
|
|
|
« Last Edit: March 16, 2012, 05:53:14 pm by a9965 »
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 595
Arduinotarrak
|
 |
« Reply #1 on: March 17, 2012, 12:13:10 am » |
Hola, si no compila, te dará algún error. ¿Podrías indicarnos?
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #2 on: March 17, 2012, 05:10:18 am » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 595
Arduinotarrak
|
 |
« Reply #3 on: March 17, 2012, 10:33:23 am » |
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_11Parece 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/ServoMi conocimiento de los timer es escaso, seguro que hay gente que conoce más profundamente el problema.
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #4 on: March 17, 2012, 10:50:37 am » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 595
Arduinotarrak
|
 |
« Reply #5 on: March 17, 2012, 01:10:45 pm » |
Hola, Mira en la página http://letsmakerobots.com/node/12803Ahí tienes un link para bajar la librería ServoTimer2
|
|
|
|
« Last Edit: March 17, 2012, 01:12:58 pm by curro92 »
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #6 on: March 17, 2012, 01:34:04 pm » |
Instalada ya la tenía, pero gracias de todas formas. Es que en ningún sitio pone nada acerca de la libreria.
|
|
|
|
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 595
Arduinotarrak
|
 |
« Reply #7 on: March 17, 2012, 02:55:57 pm » |
Hola, ahí va un ejemplo sacado de aquí http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?action=print;num=1285514626// 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); }
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #8 on: March 17, 2012, 04:55:49 pm » |
Muchas gracias! Lo pruebo y te digo algo. Un saludo
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #9 on: March 17, 2012, 07:28:21 pm » |
Teniendo en cuenta que es una librería del 2009, es imposible que funcione sin retoques en la versión 1.0 del IDE
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #10 on: March 17, 2012, 08:09:17 pm » |
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' ){ } } }
|
|
|
|
« Last Edit: March 17, 2012, 08:12:20 pm by a9965 »
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #11 on: March 18, 2012, 05:40:03 am » |
Hace como un ruido, como si se estuviera forzando. Ayudadme cuanto podais necesito tener ésto para esta semana. Gracias un saludo
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #12 on: March 18, 2012, 06:05:02 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #13 on: March 18, 2012, 08:33:24 am » |
Ya lo he conseguido. Pero sigo con el problema de que el servo se queda 'pillado'. El motor interno se mueve quedándose bloqueado.
|
|
|
|
|
Logged
|
|
|
|
|
|