Buenas a todos, estoy realizando un proyecto de final de grado en el cual uso 6 servos controlados por el driver PCA9685 y un motor paso a paso controlado por el dirver A4988, la finalidad de esto es hacer un pick and place, qu el servos hagan la funcion de bajar el robot y coger el objeto y el paso a paso girar la base. El problem que tengo es que cuando el motor paso a paso no tiene que funcionar porque aun no tiene que girar la base empieza a dar tirones y descuadra el punto de cogida. Me podriais decir porque pasa eso y como lo puedo resolver?
Gracias.
Adjunto cableado
#define STEP 4 // pin STEP de A4988 a pin 4
#define DIR 5 // pin DIR de A4988 a pin 5
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);
int pos0=102;
int pos180=512;
void setup()
{
pinMode(STEP, OUTPUT); // pin 4 como salida
pinMode(DIR, OUTPUT); // pin 5 como salida
servos.begin();
servos.setPWMFreq(50);
}
void setServo(uint8_t n_servo,int angulo){;
int duty;
duty=map(angulo,0,180,pos0, pos180);
servos.setPWM(n_servo, 0, duty);
}
void Home(){
delay(10000);
setServo(7,75);//PIN 7 BASE_SOPORTE_1 (IZQ) (+grados delante)
setServo(8,80);//PIN 8 BASE_SOPORTE_2 (DER) (-grados delante)
delay(1000);
setServo(10,80);//PIN 10 BRAZO_PINZA (+grados sube)
setServo(12,140);//PIN 12 BRAZO_BASE (+grados hacia delante)
setServo(11,15);//PIN 7 GIRO_PINZA
setServo(13,90); //PIN 13 PINZA (90º abierta)
delay(2000);
}
void Abrir_pinza(){
setServo(13,90);
}
void Cerrar_pinza(){
setServo(13,30);
}
void Bajar(){
setServo(7,75);//PIN 7 BASE_SOPORTE_1 (IZQ) (+grados delante)
setServo(8,80);//PIN 8 BASE_SOPORTE_2 (DER) (-grados delante)
delay(400);
setServo(7,80);//PIN 7 BASE_SOPORTE_1 (IZQ) (+grados delante)
setServo(8,75);//PIN 8 BASE_SOPORTE_2 (DER) (-grados delante)
delay(400);
setServo(7,85);//PIN 7 BASE_SOPORTE_1 (IZQ) (+grados delante)
setServo(8,70);//PIN 8 BASE_SOPORTE_2 (DER) (-grados delante)
setServo(12,145);
delay(250);
setServo(12,150);
delay(300);
setServo(10,75);
delay(250);
setServo(10,70);
delay(300);
setServo(10,65);
delay(300);
setServo(10,60);
}
void Subir(){
setServo(7,75);//PIN 7 BASE_SOPORTE_1 (IZQ) (+grados delante)
setServo(8,80);//PIN 8 BASE_SOPORTE_2 (DER) (-grados delante)
setServo(12,155);
delay(150);
setServo(12,140);
delay(1000);
setServo(10,70);
delay(150);
setServo(10,75);
delay(150);
setServo(10,80);
delay(150);
}
void Giro_coger()
{
digitalWrite(DIR, HIGH); // giro en un sentido
for(int i = 0; i < 200; i++){ // 200 pasos para motor de 0.9 grados de angulo de paso
digitalWrite(STEP, HIGH); // nivel alto
delay(10); // por 10 mseg
digitalWrite(STEP, LOW); // nivel bajo
delay(10); // por 10 mseg
}
}
void Giro_dejar()
{
digitalWrite(DIR, LOW); // giro en sentido opuesto
for(int i = 0; i < 200; i++){
digitalWrite(STEP, HIGH);
delay(10);
digitalWrite(STEP, LOW);
delay(10);
}
}
void loop() {
Home();
delay(2000);
Bajar();
delay(2000);
Cerrar_pinza();
delay(2000);
Subir();
delay(2000);
Giro_dejar();
delay(2000);
Bajar();
delay(2000);
Abrir_pinza();
delay(2000);
Subir();
delay(2000);
Giro_coger();
delay(2000);
}
