Maquina de dibujo, servo vibra cuando se mueven los otros motores

Hola he construido una maquina de dibujo con Arduino Uno, el shield V3 y sus respectivos drivers Pololu conectado a una fuente,para levantar y bajar el lapiz tengo un servo que tambien esta conectado a la fuente en la salida de 5V y funciona cuando le doy la orden, pero al mover los motores paso paso el servo vibra y se quiere mover, cuando los motores se detienen el servo se vuelve a su posición.
Ya investigué por todos lados pero nada. Me ayudan?

Debes alimentar los motores con una fuente independiente del arduino.
Comparte GND y todo funcionará correctamente.
Usa una fuente que sea capaz de entregar la corriente de los motores.

Arduino no puede con mas de 350mA.

Hola Surbyte si ya tengo todo conectado a una fuente de alimentacion aparte y el Gnd comparte con el negativo de la fuente, no sera un problema de programacion? Que envia pulso al servo cuando no debe?

Hi,
Prueba desconectandoles la energia a lo otro motores y corre el programa para ver si se mueve. Si se queda estatico entonces tienes problemas en la forma que alimentas el systema. Otra cosa que puedes hacer es medir el voltaje para ver si tienes variaciones en voltaje cuando se mueven los motores. Otra cosa tu mencionas que el servo de levantar el lapiz esta conectado la fuente de 5 voltios. A que tu te refieres a los 5 voltios del arduino o a los 5 voltios de los motores.

Hola Tauro0021, desconecte los motores y cuando le doy ordenes a los motores el servo no se mueve. El servo esta conectado a la fuente de alimentacion aparteque tiene salidas de 5v y de 12V.

Bueno comparte tu código y un esquema de conexiones.

Este archivo es la parte del programa que controla el servo spindle_control.c

/*
  spindle_control.c - spindle control methods
  Part of Grbl

 
*/

#include "grbl.h"


#ifdef VARIABLE_SPINDLE
  static float pwm_gradient; // Precalulated value to speed up rpm to PWM conversions.
#endif


void spindle_init()
{
  #ifdef VARIABLE_SPINDLE

    // Configure variable spindle PWM and enable pin, if requried. On the Uno, PWM and enable are
    // combined unless configured otherwise.
    SPINDLE_PWM_DDR |= (1<<SPINDLE_PWM_BIT); // Configure as PWM output pin.
    SPINDLE_TCCRA_REGISTER = SPINDLE_TCCRA_INIT_MASK; // Configure PWM output compare timer
    SPINDLE_TCCRB_REGISTER = SPINDLE_TCCRB_INIT_MASK;
    #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN
      SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin.
    #else
      SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT); // Configure as output pin.
    #endif

    pwm_gradient = SPINDLE_PWM_RANGE/(settings.rpm_max-settings.rpm_min);

  #else

    // Configure no variable spindle and only enable pin.
    SPINDLE_ENABLE_DDR |= (1<<SPINDLE_ENABLE_BIT); // Configure as output pin.
    SPINDLE_DIRECTION_DDR |= (1<<SPINDLE_DIRECTION_BIT); // Configure as output pin.

  #endif

  spindle_stop();
}


uint8_t spindle_get_state()
{
 #ifdef VARIABLE_SPINDLE
        #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN
              // No spindle direction output pin. 
            #ifdef INVERT_SPINDLE_ENABLE_PIN
                if (bit_isfalse(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT))) { return(SPINDLE_STATE_CW); }
            #else
                if (bit_istrue(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT))) { return(SPINDLE_STATE_CW); }
            #endif
        #else
            if (SPINDLE_TCCRA_REGISTER & (1<<SPINDLE_COMB_BIT)) { // Check if PWM is enabled.
                if (SPINDLE_DIRECTION_PORT & (1<<SPINDLE_DIRECTION_BIT)) { return(SPINDLE_STATE_CCW); }
                else { return(SPINDLE_STATE_CW); }
            }
        #endif
 #else
 #ifdef INVERT_SPINDLE_ENABLE_PIN
            if (bit_isfalse(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT))) { 
 #else
            if (bit_istrue(SPINDLE_ENABLE_PORT,(1<<SPINDLE_ENABLE_BIT))) {
 #endif
                if (SPINDLE_DIRECTION_PORT & (1<<SPINDLE_DIRECTION_BIT)) { return(SPINDLE_STATE_CCW); }
                else { return(SPINDLE_STATE_CW); }
            }
 #endif
 return(SPINDLE_STATE_DISABLE);
}


// Disables the spindle and sets PWM output to zero when PWM variable spindle speed is enabled.
// Called by various main program and ISR routines. Keep routine small, fast, and efficient.
// Called by spindle_init(), spindle_set_speed(), spindle_set_state(), and mc_reset().
void spindle_stop()
{
    #ifdef VARIABLE_SPINDLE
        SPINDLE_TCCRA_REGISTER &= ~(1<<SPINDLE_COMB_BIT); // Disable PWM. Output voltage is zero.
        #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN
            #ifdef INVERT_SPINDLE_ENABLE_PIN
                SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);  // Set pin to high
            #else
                SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low
            #endif
        #endif
    #else
        #ifdef INVERT_SPINDLE_ENABLE_PIN
            SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);  // Set pin to high
        #else
            SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT); // Set pin to low
        #endif
    #endif
}


#ifdef VARIABLE_SPINDLE
  // Sets spindle speed PWM output and enable pin, if configured. Called by spindle_set_state()
  // and stepper ISR. Keep routine small and efficient.
  void spindle_set_speed(uint8_t pwm_value)
  {
    SPINDLE_OCR_REGISTER = pwm_value; // Set PWM output level.
    #ifdef SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED
      if (pwm_value == SPINDLE_PWM_OFF_VALUE) {
        spindle_stop();
      } else {
        SPINDLE_TCCRA_REGISTER |= (1<<SPINDLE_COMB_BIT); // Ensure PWM output is enabled.
        #ifdef INVERT_SPINDLE_ENABLE_PIN
          SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT);
        #else
          SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
        #endif
      }
    #else
      if (pwm_value == SPINDLE_PWM_OFF_VALUE) {
        SPINDLE_TCCRA_REGISTER &= ~(1<<SPINDLE_COMB_BIT); // Disable PWM. Output voltage is zero.
      } else {
        SPINDLE_TCCRA_REGISTER |= (1<<SPINDLE_COMB_BIT); // Ensure PWM output is enabled.
      }
    #endif
  }


  // Called by spindle_set_state() and step segment generator. Keep routine small and efficient.
  uint8_t spindle_compute_pwm_value(float rpm) // 328p PWM register is 8-bit.
  {
    uint8_t pwm_value;
    #ifndef SPINDLE_IS_SERVO
      rpm *= (0.010*sys.spindle_speed_ovr); // Scale by spindle speed override value.
    #endif
    // Calculate PWM register value based on rpm max/min settings and programmed rpm.
    if ((settings.rpm_min >= settings.rpm_max) || (rpm >= settings.rpm_max)) {
      // No PWM range possible. Set simple on/off spindle control pin state.
      sys.spindle_speed = settings.rpm_max;
      pwm_value = SPINDLE_PWM_MAX_VALUE;
    } else if (rpm <= settings.rpm_min) {
      if (rpm == 0.0) { // S0 disables spindle
        #ifndef SPINDLE_IS_SERVO
          sys.spindle_speed = 0.0;
          pwm_value = SPINDLE_PWM_OFF_VALUE;
        #else
          sys.spindle_speed = settings.rpm_min;
          pwm_value = SPINDLE_PWM_MIN_VALUE;
        #endif
      } else { // Set minimum PWM output
        sys.spindle_speed = settings.rpm_min;
        pwm_value = SPINDLE_PWM_MIN_VALUE;
      }
    } else { 
      // Compute intermediate PWM value with linear spindle speed model.
      // NOTE: A nonlinear model could be installed here, if required, but keep it VERY light-weight.
      sys.spindle_speed = rpm;
      pwm_value = floor((rpm-settings.rpm_min)*pwm_gradient) + SPINDLE_PWM_MIN_VALUE;
    }
    return(pwm_value);
  }
#endif


// Immediately sets spindle running state with direction and spindle rpm via PWM, if enabled.
// Called by g-code parser spindle_sync(), parking retract and restore, g-code program end,
// sleep, and spindle stop override.
#ifdef VARIABLE_SPINDLE
  void spindle_set_state(uint8_t state, float rpm)
#else
  void _spindle_set_state(uint8_t state)
#endif
{
  if (sys.abort) { return; } // Block during abort.
  if (state == SPINDLE_DISABLE) { // Halt or set spindle direction and rpm.
  
    #ifdef VARIABLE_SPINDLE
      #ifndef SPINDLE_IS_SERVO
        sys.spindle_speed = 0.0;
        spindle_stop();
      #else
        // For servo send min. PWM instead of deactivate PWM
        sys.spindle_speed = SPINDLE_PWM_MIN_VALUE;
        spindle_set_speed(spindle_compute_pwm_value(SPINDLE_PWM_MIN_VALUE));      
      #endif
    #else
      spindle_stop();
    #endif
  
  } else {
  
    #ifndef USE_SPINDLE_DIR_AS_ENABLE_PIN
      if (state == SPINDLE_ENABLE_CW) {
        SPINDLE_DIRECTION_PORT &= ~(1<<SPINDLE_DIRECTION_BIT);
      } else {
        SPINDLE_DIRECTION_PORT |= (1<<SPINDLE_DIRECTION_BIT);
      }
    #endif
  
    #ifdef VARIABLE_SPINDLE
      // NOTE: Assumes all calls to this function is when Grbl is not moving or must remain off.
      if (settings.flags & BITFLAG_LASER_MODE) { 
        if (state == SPINDLE_ENABLE_CCW) { rpm = 0.0; } // TODO: May need to be rpm_min*(100/MAX_SPINDLE_SPEED_OVERRIDE);
      }
      spindle_set_speed(spindle_compute_pwm_value(rpm));
    #endif
    #if (defined(USE_SPINDLE_DIR_AS_ENABLE_PIN) && \
        !defined(SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED)) || !defined(VARIABLE_SPINDLE)
      // NOTE: Without variable spindle, the enable bit should just turn on or off, regardless
      // if the spindle speed value is zero, as its ignored anyhow.
      #ifdef INVERT_SPINDLE_ENABLE_PIN
        SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT);
      #else
        SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
      #endif    
    #endif
  
  }
  
  sys.report_ovr_counter = 0; // Set to report change immediately
}


// G-code parser entry-point for setting spindle state. Forces a planner buffer sync and bails 
// if an abort or check-mode is active.
#ifdef VARIABLE_SPINDLE
  void spindle_sync(uint8_t state, float rpm)
  {
    if (sys.state == STATE_CHECK_MODE) { return; }
    protocol_buffer_synchronize(); // Empty planner buffer to ensure spindle is set when programmed.
    spindle_set_state(state,rpm);
  }
#else
  void _spindle_sync(uint8_t state)
  {
    if (sys.state == STATE_CHECK_MODE) { return; }
    protocol_buffer_synchronize(); // Empty planner buffer to ensure spindle is set when programmed.
    _spindle_set_state(state);
  }
#endif

spindle_control.c (9.01 KB)

Esta imagen es el esquema de conexiones, que creo que funciona bien

.

Mi amigo, tenemos normas en este foro, códigos e imágenes deben hacerse visibles.
No tengo porque tener que descargar ambos para saber de que se trata.
Te paso guía para que lo edites.

Hi,
En el dibujo tu no demuestras si tienes los cables de tierra conectados al la tierra del la tarjeta del Arduino UNO. Todos los voltajes deben tener al cable de tierra conectados en un punto. Podrias verificar que si tienes las tierras todas conectadas en un mismo punto incluyendo el Arduino..

Pero dice Shield V3 y esta conectado GND.

Hola he construido una maquina de dibujo con Arduino Uno, el shield V3

Ese obvio que ese SHIELD esta unido al Arduino UNO y por ende los GND están unidos.

Me gustaría ver la imagen para tener una idea de lo que hablas, de esa manera también puedo instruirme en el tema, gracias. :slight_smile: