Estoy intentando controlar 4 servos a la vez con un acelerómetro de 5 pines ADXL335, usando este código:
#include <Servo.h>
Servo motor1;
Servo motor2;
Servo motor3;
Servo motor4;
//Pines analogicos de lectura
const int xPin = 0;
const int yPin = 1;
// Valores mínimos y máximos del acelerometro en reposo
int minVal = 266;
int maxVal = 400;
void setup ( ) {
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
/* pinMode(9, OUTPUT);
pinMode(6, OUTPUT);
*/
motor1.attach(11);
motor2.attach(10);
motor3.attach(9);
motor4.attach(6);
}
void loop ( ) {
//Lee los valores analogicos del acelerometro
int xRead = analogRead(xPin);
int yRead = analogRead(yPin);
// mapea los valores leidos a un rango -90 a 90 grados (-π a π )
int xAng = map(xRead, minVal, maxVal, -90, 90);
int yAng = map(yRead, minVal, maxVal, -90, 90);
//Imprimimos en el monitor serial los caluculos
Serial.print(" | x: ");
Serial.print(xAng);
Serial.print(" | y: ");
Serial.println(yAng);
//Espera 1 decima de segundo
motor1.write(xAng+90);
motor2.write(yAng+90);
motor3.write(xAng+90);
motor4.write(yAng+90);
delay(90);
}
Sin conectar ningún servo, el acelerómetro va bien, pero cuando le meto servos la medida de los ángulos varía y hay veces que directamente resetea la placa y vuelve a variar, moviéndose de un lado a otro. Incluso si lo fuerzo para moverse se mueve hacia los lados.
Os incluyo un vídeo donde intento controlar dos de los 4 servos sin salir junto con el problema del forzamiento.
Me urge mucho, pues necesito el proyecto en una semana. Gracias de antemano si podéis ayudarme.
Los servomotores son estos: http://campuscomponent.com/images/Product_images/130020.jpg
De nuevo, disculpas por no aporta mucha información, pero nuestro profesor no nos ayuda mucho tampoco.
Lo que tienes que hacer es :
Leer las Normas del foro.
Luego ve a More (abajo a la derecha), click, luego Modify y estas en modo EDICION.
**Selecciona todo el código y click en </> arriba del emoticon **
Gracias por corregirlo, ya lo he editado. Ahora espero que os facilite el que podáis ofrecer una poca de ayuda.
hay veces que directamente resetea la placa y vuelve a variar, moviéndose de un lado a otro. Incluso si lo fuerzo para moverse se mueve hacia los lados.
Eso ocurre porque alimentas los servos con tu placa Arduino y el consumo de los servos hace que se resetee.
Usa una fuente de 5V distinta al arduino. Arduino con su fuente, Servos con otra fuente. Compartes GND entre arduino y fuente de servos y listo. Lo demas no cambias nada.
¿Y solo por eso me sucede ese problema? ¿Y qué fuente puedo usar para sustituir la de Arduino? ¿Y el código en sí está todo correcto?
Te juro que como funcione te pongo en un altar.
No se que servos usas, ni cuantos son. Suma las corrientes de todos ellos y date un margen de 25% como mínimo. Un valor asi estaría bien.
Supongamos que fueran 4 servos consumiendo 100mA, eso desde ya suma 400mA que es mas de lo que arduino entrega por su salida sin tener problemas.
Entonces una fuente de 500mA 5V estaría bien.
Solo un ejemplo.
¿Cómo calculo sus corrientes?
Lo buscas por internet. Dinos que modelos de servos tienes.
Cuando plantees un tema, debes dar toda la información aunque creas que no es relevante ya ves que si lo es.
Ahora lo que queremos hacer es que los servos no midan los ángulos que sobrepasen 60º, por ejemplo, hemos puesto de delay 200 y ya hay menos error, pero hay un poco.
Acabo de subir una URL con el modelo de servomotor que estamos usando, por si eso puede ayudar. No sabemos como medir las intensidades de los servos.
Vaya con haber puesto en google: arduino SG90 corriente ya hubieras visto que esta por debajo de los 100mA.
Si usas 4 entonces son 400mA. Busca una fuente de 600 o 1000mA y estarás bien x 5V claro.