Tutorial · Intermedio · 30 min

Busqueda de origen: coordenadas de maquina y pieza

Maquina en lazo abierto que despierta sin saber donde esta. La busqueda de origen: tres fases, limites por software y por que el cero de maquina no es de pieza

El problema que resuelve la busqueda de origen

Un eje paso a paso en lazo abierto tiene una memoria perfecta de todo lo que se le ha ordenado hacer y ningun conocimiento de donde esta. Enciendelo y su contador interno de posicion lee cero, no porque el carro este en el cero, sino porque eso es lo que vale un entero recien inicializado.

Peor aun: el contador puede estar equivocado incluso mientras la maquina funciona. Un paso perdido es silencioso: el driver sigue contando pulsos, el firmware sigue creyendoselos y el carro queda desplazado de forma permanente por algun multiplo de cuatro pasos completos. Nada en el lazo de control lo notara nunca, porque no hay lazo.

La busqueda de origen es la respuesta a ambos problemas. Es el unico momento en el funcionamiento de una maquina en que la posicion se mide del mundo fisico en lugar de acumularse a partir de una cuenta, y todo lo que viene despues depende de ella.

La busqueda en tres fases

Conduce hacia el interruptor, para cuando se active y llama a eso cero. Eso funciona, y se repite con unos medios milimetros de error, lo cual es inutil. Toda maquina real lo hace en tres pasadas:

Posicion del eje en milimetros frente al tiempo en segundos, mostrando un ciclo de busqueda de origen. La fase uno, una busqueda rapida, avanza desde 46 milimetros hasta la linea de activacion del interruptor a 2,4 milimetros. La fase dos retrocede a 7 milimetros. La fase tres se aproxima de nuevo despacio y activa el interruptor otra vez a 2,55 milimetros, donde la traza se asienta. Una linea roja discontinua marca donde se activa el interruptor, una linea continua en cero marca el cero de maquina G53 y una linea punteada a 18 milimetros marca un cero de pieza G54 elegido como desfase.
Rapido, retrocede, despacio. A la primera pasada solo se le pide encontrar el interruptor; la segunda aproximacion es la que fija el numero, y es lenta precisamente para que el punto de activacion del interruptor sea repetible. Descargar SVG
  1. Busqueda rapida. Avanza hacia el interruptor a una velocidad elegida por impaciencia, no por precision. Esta pasada solo existe para acercarse, y puede recorrer toda la longitud del eje.
  2. Retroceso. Retirate unos milimetros hasta que el interruptor se libere. Esto es lo que hace posible la tercera pasada, y ademas demuestra que el interruptor es un interruptor y no una entrada atascada.
  3. Re-busqueda lenta. Aproximate otra vez a una fraccion pequena de la primera velocidad y registra el punto de activacion. Esa es la medicion.

La razon de que la pasada lenta importe es mecanica. Un microinterruptor de palanca se activa cuando su vastago se ha movido una distancia concreta, pero el carro sigue moviendose mientras el firmware reacciona y mientras el eje desacelera. A 50 mm/s con una latencia de deteccion de 2 ms, el carro recorre 0,1 mm mas alla del punto de activacion antes de que nadie lo sepa. A 2 mm/s recorre 0,004 mm. La aproximacion lenta convierte la repetibilidad propia del interruptor (unos micrones en un microinterruptor decente) en la repetibilidad de la maquina, en lugar de dejar que la distancia de desaceleracion la domine.

Los ajustes tipicos son asi:

Parametro Tipico Por que
Velocidad de busqueda rapida 20-50 mm/s Solo tiene que llegar a la zona
Distancia de retroceso 3-5 mm Suficiente para liberar el interruptor por completo
Avance de busqueda lenta 1-3 mm/s La distancia de desaceleracion se vuelve despreciable
Retirada tras buscar origen 1-5 mm Deja el interruptor liberado para que tambien sirva de limite

Cablear un final de carrera

El interruptor en si es el mismo microinterruptor de palanca que un robot usa como parachoques, y la regla de cableado es la misma:

const int X_MIN_PIN = 9;

void setup() {
  pinMode(X_MIN_PIN, INPUT_PULLUP);   // NO a masa, pin con pull-up
}

bool endstopTriggered() {
  return digitalRead(X_MIN_PIN) == LOW;
}

Cablea COM a masa y NO al pin, con el pull-up interno activado. Un cable roto leera entonces como “no activado”, que para un interruptor de origen es el fallo seguro: la maquina no consigue encontrar el origen y se detiene, en lugar de decidir que ya esta alli.

Eso es lo contrario de la regla para una parada de emergencia, donde quieres normalmente cerrado para que un cable cortado detenga la maquina. Un interruptor de origen y una parada de emergencia tienen estados seguros opuestos, y cablear ambos de la misma forma es un error real, no estilistico.

Dos detalles que causan la mayor parte de los problemas con finales de carrera:

  • Ponle antirrebote. Una sola pulsacion produce unos nueve transiciones en 4,7 ms. Durante la busqueda de origen estas sondeando en un bucle apretado, asi que el primer flanco es el que quieres y todo lo posterior debe ignorarse durante unos milisegundos. Nunca conectes una interrupcion que cuente flancos.
  • Encamina el cable del final de carrera lejos de los cables del motor. Un cable largo sin apantallar que corre paralelo a un cable de motor paso a paso troceado capta justo el tipo de ruido que parece un cierre de interruptor. Si la busqueda de origen funciona con los motores desactivados y falla con ellos en marcha, esa es la razon.

Coordenadas de maquina y coordenadas de pieza

Una vez buscado el origen, la maquina sabe una cosa con precision: donde esta el final de carrera. Ese punto, mas un desfase fijo, define el cero de maquina, en G-code el sistema de coordenadas G53. Es una propiedad del bastidor. No se mueve, y es el mismo despues de cada ciclo de busqueda de origen.

Ese casi nunca es el punto desde el que quieres medir tu trabajo. Asi que las maquinas mantienen un segundo origen movil: el sistema de coordenadas de pieza, G54 a G59, definido como un desfase respecto al cero de maquina.

Coordenadas de maquina (G53) Coordenadas de pieza (G54…)
Origen Fijado por los finales de carrera y el bastidor Dondequiera que lo pongas
Lo fija La busqueda de origen Tu, por trabajo
Sobrevive a un reinicio Si, tras volver a buscar origen Si, almacenado en el controlador
Se usa para Limites por software, cambios de herramienta, posiciones de reposo Cada linea del trabajo real
Cambia al sujetar otra vez No Si: de eso se trata

La separacion se gana su sitio en el momento en que ejecutas el mismo trabajo dos veces. El G-code dice “dibuja un cuadrado de 50 mm empezando en X0 Y0”. Pega el papel donde te convenga, desplaza hasta su esquina, pon a cero ahi las coordenadas de pieza y ejecuta. Mueve el papel, vuelve a poner a cero y ejecuta el mismo archivo. El programa nunca cambio; el desfase si.

El cero de maquina es lo que sabe el bastidor. El cero de pieza es lo que sabe el trabajo. Mantenerlos separados es la razon de que no tengas que editar un archivo para mover una pieza.

Limites por software

Un eje que sabe donde esta puede negarse a ir mas alla de su envolvente antes de que el carro llegue alli. Esos son los limites por software, y son estrictamente mejores que los de hardware porque detienen la maquina con una desaceleracion planificada en lugar de con una colision.

; GRBL
$20=1        ; limites por software activados
$130=200.0   ; recorrido maximo en X, mm
$131=200.0   ; Y
$132=60.0    ; Z

Una maquina con limites por software activados y sin ciclo de busqueda de origen es una maquina con limites por software que no puede hacer cumplir, porque la envolvente se mide desde un origen que no tiene. Por eso la mayoria del firmware se niega a funcionar hasta que se ha buscado el origen, y el mensaje de error que produce no es una molestia: es el enclavamiento funcionando.

Los interruptores de limite fisicos en el extremo lejano de cada eje son un respaldo aparte y mas tosco para cuando los limites por software estan mal. Muchas maquinas pequenas se los saltan y confian solo en los limites por software, lo que es un intercambio razonable cuando nada de la maquina puede herirte.

La maquina de estados

La busqueda de origen es de forma natural una pequena maquina de estados finitos, y escribirla como tal mantiene honesto el manejo de los tiempos de espera:

enum HomeState { IDLE, SEEK_FAST, BACK_OFF, SEEK_SLOW, HOMED, FAILED };
HomeState state = IDLE;
long stateStartedAt = 0;

void homingStep() {
  switch (state) {
    case SEEK_FAST:
      if (endstopTriggered()) { stopNow(); enter(BACK_OFF); }
      // un eje que nunca encuentra su interruptor debe rendirse, no moler
      else if (travelled() > AXIS_LENGTH_MM + 10) enter(FAILED);
      break;

    case BACK_OFF:
      if (!endstopTriggered() && travelled() >= BACKOFF_MM) enter(SEEK_SLOW);
      break;

    case SEEK_SLOW:
      if (endstopTriggered()) {
        stopNow();
        machinePosition = HOME_OFFSET_MM;   // la unica medicion real
        enter(HOMED);
      } else if (travelled() > BACKOFF_MM * 2) enter(FAILED);
      break;
  }
}

Las ramas FAILED son la parte que merece copiarse. Un eje que busca y nunca se activa tiene un interruptor desconectado, un carro agarrotado o esta perdiendo cada paso que se le da, y en los tres casos la respuesta correcta es parar y decirlo. Una rutina de busqueda de origen sin tiempo de espera muela alegremente un carro contra el bastidor tanto tiempo como la dejes.

Cuando algo sale mal

Sintoma Causa Arreglo
Busca el origen en un punto ligeramente distinto cada vez No hay segunda pasada lenta, o es demasiado rapida Anade la re-busqueda; bajala a 1-3 mm/s
Va en la direccion equivocada y choca Direccion de busqueda o del motor invertida Cambia el ajuste de direccion o invierte un par de bobinas
“Final de carrera activado” antes de moverse Interruptor cableado normalmente cerrado, o atascado Comprueba NO frente a NC; confirma que el pin lee alto en reposo
Funciona en frio y falla cuando los motores arrancan El cable del final de carrera capta ruido del driver Desvialo de los cables del motor; anade 100 nF a masa
Busca el origen bien y luego todo movimiento esta desplazado HOME_OFFSET o la retirada mal Mide desde el interruptor hasta donde quieras el cero
La maquina se niega a moverse tras encender Limites por software activados, sin origen buscado Busca el origen: eso es el enclavamiento, no un fallo
Repite bien pero la pieza esta en el lugar equivocado Desfase de pieza, no la busqueda de origen Vuelve a poner a cero G54 donde esta de verdad el trabajo
Z busca el origen dentro de la cama Direccion de Z invertida, o desfase de sonda sin fijar Comprueba la direccion antes de fiarte de ningun desfase

Donde encaja esto

La busqueda de origen es como una maquina en lazo abierto recupera lo unico que estructuralmente no puede medir. Merece la pena ser claro sobre lo que te da y lo que no: hace que la posicion de la maquina sea correcta al inicio de un trabajo, y nada mas. Si el eje esta perdiendo pasos a mitad de trabajo porque el limite de corriente o el perfil de aceleracion estan mal, buscar el origen entre ejecuciones solo reinicia el error a cero cada vez sin arreglarlo nunca.

La senal es sencilla. Una maquina que busca el origen con precision y termina un trabajo en el lugar equivocado tiene un problema de movimiento, no un problema de busqueda de origen.

Explora el grafo

Forma parte de estos montajes

Proyectos y rutas de aprendizaje que incluyen este tutorial.

Lecturas adicionales

Referencias