problema con il ciclo di homing

Buongiorno vorrei risolvere un problema che sto riscontrando, purtroppo essendo un principiante non so come fare, se qualcuno è cosi gentile da darmi una mano gli sarei grato.
Io devo fare un ciclo di homing ed attivare un fine corso e trovare la posizione del home,io sto utilizzando un motore 15BY ed la seguente scheda.

.
Ho montato il motore sull'asse z, il finecorsa sugli spin z- e sulla scheda ho caricato grbl v0.9j.
Adesso con grbl controller uso i seguenti settaggi

$0=10 (step pulse, usec)
$1=25 (step idle delay, msec)
$2=0 (step port invert mask:00000000)
$3=4 (dir port invert mask:00000100)
$4=0 (step enable invert, bool)
$5=0 (limit pins invert, bool)
$6=0 (probe pin invert, bool)
$10=3 (status report mask:00000011)
$11=0.010 (junction deviation, mm)
$12=0.002 (arc tolerance, mm)
$13=0 (report inches, bool)
$20=0 (soft limits, bool)
$21=1 (hard limits, bool)
$22=1 (homing cycle, bool)
$23=0 (homing dir invert mask:00000001)
$24=25.000 (homing feed, mm/min)
$25=500.000 (homing seek, mm/min)
$26=250 (homing debounce, msec)
$27=10.000 (homing pull-off, mm)
$100=250.000 (x, step/mm)
$101=250.000 (y, step/mm)
$102=250.000 (z, step/mm)
$110=500.000 (x max rate, mm/min)
$111=500.000 (y max rate, mm/min)
$112=500.000 (z max rate, mm/min)
$120=10.000 (x accel, mm/sec^2)
$121=10.000 (y accel, mm/sec^2)
$122=10.000 (z accel, mm/sec^2)
$130=200.000 (x max travel, mm)
$131=200.000 (y max travel, mm)
$132=200.000 (z max travel, mm)

Con il comando $H effettuo il ciclo di homing che all'inizio sembra funzionare bene, però poi quando il motore si ferma non esegue altri codici e facendo il reset con grbl controller compare il messaggio "ALARM Homing fail" e il motore si surriscalda di moltissimo.
Sapete a cosa è dovuto questo problema? gli assi x e y ancora non li ho collegati, mica può dipendere da questo?

Grazie mille a chi vorrà aiutarmi
Nicola

Scusa, ma non è la stessa domanda che hai posto QUI solo un po' più dettagliata ? ... sempre de ciclo di "homing" stai parlando o sbaglio ?

Guglielmo

Ciao Guglielmo diciamo che è il continuo dello stesso problema, nell'altra domanda avevo il problema dei pin e dell'interruttore che non funzionava, ora questo problema l'ho risolto ma il ciclo di homing non funziona come vorrei e per questo ho scritto questo post.
Riguardano entrambi il ciclo di homing ma il problema adesso è diverso da quello di prima.

Mmmm ... guarda, visto che nell'altro non hai più scritto né dato alcuna informazione ... io lo elimino e lascio solo questo. :wink:

Guglielmo

Ok Grazie, scusami per il disturbo :smiley:

Nik9:
Ok Grazie, scusami per il disturbo :smiley:

Nessun distubo, è che ... si configurava un "cross-posting" che, da REGOLAMENTO, punto 13, è proibito (anche tra lingue diverse) ::slight_smile:

Guglielmo

Hai ragione, non me ne sono reso conto e l'ho fatto senza volerlo, non lo farò più, Grazie ancora per la segnalazione :wink:

Nicola

Il problema all'inizio del post l'ho risolto, però sempre in riferimento al ciclo di homing, come faccio a fare in modo che l'asse z, dopo aver effettuato l'homing, non torni indietro della distanza di pull-off che ho fissato?
Il firmware è sempre grbl, so che dovrei modificare il programma .c però non riesco ad individuare la stringa di codice da modificare per fare questa cosa.
Grazie mille in anticipo a chi mi aiuterà.

Ciao.

Semplicemente non puoi. Quando scatta un fine corsa, (eccetto quando avviene nel ciclo di home) è un "errore" .
Se non facessi il pull-off il sensore di fine corsa rimarrebbe attivo e Grbl rivelerebbe l'errore. Devi comunque "liberare" il fine corsa.

Puoi diminuire il valore di

$27=10.000 (homing pull-off, mm)

Ma non puoi eliminarlo.

Ciao
Pippo72

Ciao pippo72 e grazie mille per la risposta :), non lo sapevo pensavo che modificando il programma in c si potesse fare.
Beh grazie ancora sei stato gentilissimo.
Senti ti posso chiedere anche un parere? io essendo agli inizi sto facendo vari esperimenti per imparare a fare determinate cose, più nel dettaglio sto cambiato il codice per quando faccio l'homing per il singolo asse, in sostanza dopo aver effettuato l'homing per quell'asse, vorrei eseguire anche un movimento lineare, per esempio scrivendo la seguente sintassi $H X G01 Y-10, vorrei che il programma esegue l'homing sull'asse x e poi esegue il movimento lineare di arretrare y di 10.
Attraverso un file di testo è facilissimo basta inserire la sequenza di comandi ma via software mi sapresti dare un consiglio?
Io attualmente sto procedendo cercando i codici che permettono i comandi G e metterli dove mi servono, l'ho fatto ma come mi aspettavo sono usciti una valanga di errori.
I codici che ho trovato sono questi

uint8_t word_bit;
  uint8_t char_counter;
  char letter;
  float value;
  uint8_t int_value = 0;
  uint16_t mantissa = 0;
  if (gc_parser_flags & GC_PARSER_JOG_MOTION) { char_counter = 3; } // Start parsing after `$J=`
  else { char_counter = 0; }

  while (line[char_counter] != 0) { // Loop until no more g-code words in line.

    letter = line[char_counter];
    if((letter < 'A') || (letter > 'Z')) { FAIL(STATUS_EXPECTED_COMMAND_LETTER); } // [Expected word letter]
    char_counter++;
    if (!read_float(line, &char_counter, &value)) { FAIL(STATUS_BAD_NUMBER_FORMAT); } // [Expected word value]
    int_value = trunc(value);
    mantissa =  round(100*(value - int_value)); // Compute mantissa for Gxx.x commands.
    switch(letter) {

      /* 'G' and 'M' Command Words: Parse commands and check for modal group violations.
         NOTE: Modal group numbers are defined in Table 4 of NIST RS274-NGC v3, pg.20 */

      case 'G':
        // Determine 'G' command and its modal group
        switch(int_value) {
          case 10: case 28: case 30: case 92:
            // Check for G10/28/30/92 being called with G0/1/2/3/38 on same block.
            // * G43.1 is also an axis command but is not explicitly defined this way.
            if (mantissa == 0) { // Ignore G28.1, G30.1, and G92.1
              if (axis_command) { FAIL(STATUS_GCODE_AXIS_COMMAND_CONFLICT); } // [Axis word/command conflict]
              axis_command = AXIS_COMMAND_NON_MODAL;
            }
            // No break. Continues to next line.
          case 4: case 53:
            word_bit = MODAL_GROUP_G0;
            gc_block.non_modal_command = int_value;
            if ((int_value == 28) || (int_value == 30) || (int_value == 92)) {
              if (!((mantissa == 0) || (mantissa == 10))) { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); }
              gc_block.non_modal_command += mantissa;
              mantissa = 0; // Set to zero to indicate valid non-integer G command.
            }                
            break;
          case 0: case 1: case 2: case 3: case 38:
            // Check for G0/1/2/3/38 being called with G10/28/30/92 on same block.
            // * G43.1 is also an axis command but is not explicitly defined this way.
            if (axis_command) { FAIL(STATUS_GCODE_AXIS_COMMAND_CONFLICT); } // [Axis word/command conflict]
            axis_command = AXIS_COMMAND_MOTION_MODE;
            // No break. Continues to next line.
          case 80:
            word_bit = MODAL_GROUP_G1;
            gc_block.modal.motion = int_value;
            if (int_value == 38){
              if (!((mantissa == 20) || (mantissa == 30) || (mantissa == 40) || (mantissa == 50))) {
                FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G38.x command]
              }
              gc_block.modal.motion += (mantissa/10)+100;
              mantissa = 0; // Set to zero to indicate valid non-integer G command.
            }  
            break;
          case 17: case 18: case 19:
            word_bit = MODAL_GROUP_G2;
            gc_block.modal.plane_select = int_value - 17;
            break;
          case 90: case 91:
            if (mantissa == 0) {
              word_bit = MODAL_GROUP_G3;
              gc_block.modal.distance = int_value - 90;
            } else {
              word_bit = MODAL_GROUP_G4;
              if ((mantissa != 10) || (int_value == 90)) { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); } // [G90.1 not supported]
              mantissa = 0; // Set to zero to indicate valid non-integer G command.
              // Otherwise, arc IJK incremental mode is default. G91.1 does nothing.
            }
            break;
          case 93: case 94:
            word_bit = MODAL_GROUP_G5;
            gc_block.modal.feed_rate = 94 - int_value;
            break;
          case 20: case 21:
            word_bit = MODAL_GROUP_G6;
            gc_block.modal.units = 21 - int_value;
            break;
          case 40:
            word_bit = MODAL_GROUP_G7;
            // NOTE: Not required since cutter radius compensation is always disabled. Only here
            // to support G40 commands that often appear in g-code program headers to setup defaults.
            // gc_block.modal.cutter_comp = CUTTER_COMP_DISABLE; // G40
            break;
          case 43: case 49:
            word_bit = MODAL_GROUP_G8;
            // NOTE: The NIST g-code standard vaguely states that when a tool length offset is changed,
            // there cannot be any axis motion or coordinate offsets updated. Meaning G43, G43.1, and G49
            // all are explicit axis commands, regardless if they require axis words or not.
            if (axis_command) { FAIL(STATUS_GCODE_AXIS_COMMAND_CONFLICT); } // [Axis word/command conflict] }
            axis_command = AXIS_COMMAND_TOOL_LENGTH_OFFSET;
            if (int_value == 49) { // G49
              gc_block.modal.tool_length = TOOL_LENGTH_OFFSET_CANCEL;
            } else if (mantissa == 10) { // G43.1
              gc_block.modal.tool_length = TOOL_LENGTH_OFFSET_ENABLE_DYNAMIC;
            } else { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); } // [Unsupported G43.x command]
            mantissa = 0; // Set to zero to indicate valid non-integer G command.
            break;
          case 54: case 55: case 56: case 57: case 58: case 59:
            // NOTE: G59.x are not supported. (But their int_values would be 60, 61, and 62.)
            word_bit = MODAL_GROUP_G12;
            gc_block.modal.coord_select = int_value - 54; // Shift to array indexing.
            break;
          case 61:
            word_bit = MODAL_GROUP_G13;
            if (mantissa != 0) { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); } // [G61.1 not supported]
            // gc_block.modal.control = CONTROL_MODE_EXACT_PATH; // G61
            break;
          default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G command]
        }
        if (mantissa > 0) { FAIL(STATUS_GCODE_COMMAND_VALUE_NOT_INTEGER); } // [Unsupported or invalid Gxx.x command]
        // Check for more than one command per modal group violations in the current block
        // NOTE: Variable 'word_bit' is always assigned, if the command is valid.
        if ( bit_istrue(command_words,bit(word_bit)) ) { FAIL(STATUS_GCODE_MODAL_GROUP_VIOLATION); }
        command_words |= bit(word_bit);
        break;

Ora questi codici servono per generare i comandi G e fare determinate cose, ma non ci sta un comando software che mi permette di usarli?

Nicola

Ciao.
Probabilmente la causa è la cena con amici appena finita, ma non riesco a capire la tua richiesta.

GRBL è un interprete di g code. Per usarlo, una volta caricato su arduino, devi usare un programma da pc che, collegato via seriale, gli da in pasto i g code e lui li esegue.
Di questi programmi ce ne sono tanti, questi quelli consigliati dal sito di Grbl.

Se la richiesta invece è proprio quella di come modificare i sorgenti di grbl allora non sono in grado di aiutarti; quei sorgenti sono di parecchio sopra la mia conoscenza del C C++.

Ciao
Pippo72

pippo72 avevi capito bene, la mia intenzione è proprio modificare il codice e dato che sto trovando molte difficoltà, ho provato a vedere se potevi darmi qualche consiglio un suggerimento o qualcos'altro.
Comunque grazie lo stesso sei stato gentilissimo.