commande cnc non prise en compte

bonjour les fous,
pour faire suite à mon projet cnc, je bute sur un truc tout bête, comme dab.
je suis parti du code gcodecncdemo2axesv1 pour piloter mes moteurs, tout fonctionne.
j'essaye d'implanter la commande du laser maintenant M03 et M05
ca fonctionne en lancant dans une console linux la commande, mais dès que je lance une série de lignes, la led reste tout le temps allumée
M03 => led ON
M05=> led OFF

echo -n "G21; " > /dev/ttyACM0 
echo -n "G90; " > /dev/ttyACM0 
echo -n "G92; " > /dev/ttyACM0 
echo -n "G01 X25.0 Y56.0;" > /dev/ttyACM0 
echo -n "M03; " > /dev/ttyACM0 
echo -n "G01 X26.0 Y56.0 F200;" > /dev/ttyACM0 
echo -n "M05; " > /dev/ttyACM0 
echo -n "G01 X28.0 Y56.0;" > /dev/ttyACM0 
echo -n "M03; " > /dev/ttyACM0 
echo -n "G01 X28.0 Y56.0 F200;" > /dev/ttyACM0 
echo -n "M05; " > /dev/ttyACM0

il faut que je remette une autre fois un M05 à la mano pour éteindre la led

ci dessous le code modifié avec la led sur pin 10 (libre après vérification)

//------------------------------------------------------------------------------
// 2 Axis CNC Demo v1 - only supports motor shield v1
// dan@marginallycelver.com 2013-08-30
//------------------------------------------------------------------------------
// Copyright at end of file.
// please see http://www.github.com/MarginallyClever/GcodeCNCDemo for more information.


//------------------------------------------------------------------------------
// CONSTANTS
//------------------------------------------------------------------------------
#define VERSION        (1)  // firmware version
#define BAUD           (115200)  // How fast is the Arduino talking?
#define MAX_BUF        (64)  // What is the longest message Arduino can store?
#define STEPS_PER_TURN (400)  // depends on your stepper motor.  most are 200.
#define MIN_STEP_DELAY (50.0)
#define MAX_FEEDRATE   (1000000.0/MIN_STEP_DELAY)
#define MIN_FEEDRATE   (0.01)


//------------------------------------------------------------------------------
// INCLUDES
//------------------------------------------------------------------------------
#include <AFMotorDrawbot.h>


//------------------------------------------------------------------------------
// GLOBALS
//------------------------------------------------------------------------------
// Initialize Adafruit stepper controller
static AF_Stepper m1((int)STEPS_PER_TURN, 1);
static AF_Stepper m2((int)STEPS_PER_TURN, 2);

#define laser 10

char buffer[MAX_BUF];  // where we store the message until we get a ';'
int sofar;  // how much is in the buffer

float px, py;  // location

// speeds
float fr=0;  // human version
long step_delay;  // machine version

// settings
char mode_abs=1;  // absolute mode?


//------------------------------------------------------------------------------
// METHODS
//------------------------------------------------------------------------------


/**
 * delay for the appropriate number of microseconds
 * @input ms how many milliseconds to wait
 */
void pause(long ms) {
  delay(ms/1000);
  delayMicroseconds(ms%1000);  // delayMicroseconds doesn't work for values > ~16k.
}


/**
 * Set the feedrate (speed motors will move)
 * @input nfr the new speed in steps/second
 */
void feedrate(float nfr) {
  if(fr==nfr) return;  // same as last time?  quit now.

  if(nfr>MAX_FEEDRATE || nfr<MIN_FEEDRATE) {  // don't allow crazy feed rates
    Serial.print(F("New feedrate must be greater than "));
    Serial.print(MIN_FEEDRATE);
    Serial.print(F("steps/s and less than "));
    Serial.print(MAX_FEEDRATE);
    Serial.println(F("steps/s."));
    return;
  }
  step_delay = 1000000.0/nfr;
  fr=nfr;
}


/**
 * Set the logical position
 * @input npx new position x
 * @input npy new position y
 */
void position(float npx,float npy) {
  // here is a good place to add sanity tests
  px=npx;
  py=npy;
}


/**
 * Uses bresenham's line algorithm to move both motors
 * @input newx the destination x position
 * @input newy the destination y position
 **/
void line(float newx,float newy) {
  long dx=newx-px;
  long dy=newy-py;
  int dirx=dx>0?1:-1;
  int diry=dy>0?-1:1;  // because the motors are mounted in opposite directions
  dx=abs(dx);
  dy=abs(dy);

  long i;
  long over=0;

  if(dx>dy) {
    for(i=0;i<dx;++i) {
      m1.onestep(dirx);
      over+=dy;
      if(over>=dx) {
        over-=dx;
        m2.onestep(diry);
      }
      pause(step_delay);
    }
  } else {
    for(i=0;i<dy;++i) {
      m2.onestep(diry);
      over+=dx;
      if(over>=dy) {
        over-=dy;
        m1.onestep(dirx);
      }
      pause(step_delay);
    }
  }

  px=newx;
  py=newy;
}


/**
 * Look for character /code/ in the buffer and read the float that immediately follows it.
 * @return the value found.  If nothing is found, /val/ is returned.
 * @input code the character to look for.
 * @input val the return value if /code/ is not found.
 **/
float parsenumber(char code,float val) {
  char *ptr=buffer;
  while(ptr && *ptr && ptr<buffer+sofar) {
    if(*ptr==code) {
      return atof(ptr+1);
    }
    ptr=strchr(ptr,' ')+1;
  }
  return val;
} 






/**
 * write a string followed by a float to the serial line.  Convenient for debugging.
 * @input code the string.
 * @input val the float.
 */
void output(char *code,float val) {
  Serial.print(code);
  Serial.println(val);
}


/**
 * print the current position, feedrate, and absolute mode.
 */
void where() {
  output("X",px);
  output("Y",py);
  output("F",fr);
  Serial.println(mode_abs?"ABS":"REL");
} 


/**
 * display helpful information
 */
void help() {
  Serial.print(F("GcodeCNCDemo2AxisV1 "));
  Serial.println(VERSION);
  Serial.println(F("Commands:"));
  Serial.println(F("G00 [X(steps)] [Y(steps)] [F(feedrate)]; - linear move"));
  Serial.println(F("G01 [X(steps)] [Y(steps)] [F(feedrate)]; - linear move"));
  Serial.println(F("G04 P[seconds]; - delay"));
  Serial.println(F("G90; - absolute mode"));
  Serial.println(F("G91; - relative mode"));
  Serial.println(F("G92 [X(steps)] [Y(steps)]; - change logical position"));
  Serial.println(F("M18; - disable motors"));
  Serial.println(F("M03; - laser ON"));
  Serial.println(F("M05; - laser OFF"));
 
  Serial.println(F("M100; - this help message"));
  Serial.println(F("M114; - report position and feedrate"));
}


/**
 * Read the input buffer and find any recognized commands.  One G or M command per line.
 */
void processCommand() {
  int cmd = parsenumber('G',-1);
  switch(cmd) {
  case  0: // move linear
  case  1: // move linear
    feedrate(parsenumber('F',fr));
    line( parsenumber('X',(mode_abs?px:0)) + (mode_abs?0:px),
          parsenumber('Y',(mode_abs?py:0)) + (mode_abs?0:py) );
    break;
  case  4:  pause(parsenumber('P',0)*1000);  break;  // dwell
  case 90:  mode_abs=1;  break;  // absolute mode
  case 91:  mode_abs=0;  break;  // relative mode
  case 92:  // set logical position
    position( parsenumber('X',0),
              parsenumber('Y',0) );
    break;
  default:  break;
  }

  cmd = parsenumber('M',-1);
  switch(cmd) {
  case 18:  // disable motors
    m1.release();
    m2.release();
    break;
  case 100:  help();  break;
  case 114:  where();  break;
  case 3:  digitalWrite(laser, HIGH);  break;
  case 5:  digitalWrite(laser, LOW);  break;

  default:  break;
  }
}


/**
 * prepares the input buffer to receive a new message and tells the serial connected device it is ready for more.
 */
void ready() {
  sofar=0;  // clear input buffer
  Serial.print(F(">"));  // signal ready to receive input
}


/**
 * First thing this machine does on startup.  Runs only once.
 */
void setup() {
  Serial.begin(BAUD);  // open coms
pinMode(laser, OUTPUT);
digitalWrite(laser, LOW);
  help();  // say hello
  position(0,0);  // set staring position
  feedrate((MAX_FEEDRATE + MIN_FEEDRATE)/2);  // set default speed
  ready();
}


/**
 * After setup() this machine will repeat loop() forever.
 */
void loop() {
  // listen for serial commands
  while(Serial.available() > 0) {  // if something is available
    char c=Serial.read();  // get it
    Serial.print(c);  // repeat it back so I know you got the message
    if(sofar<MAX_BUF) buffer[sofar++]=c;  // store it
    if(buffer[sofar-1]==';') break;  // entire message received
  }

  if(sofar>0 && buffer[sofar-1]==';') {
    // we got a message and it ends with a semicolon
    buffer[sofar]=0;  // end the buffer so string functions work right
    Serial.print(F("\r\n"));  // echo a return character for humans
    processCommand();  // do something with the command
    ready();
  }
}

Salut,
je n'ai fait qu'une lecture rapide et n'y ai rien vu de particulier, mais est-ce que tu as essayé de lire les données renvoyées sur la liaison série pour voir si elles ne contiendraient pas des indices de ce qui cloche ?

haifger:
Salut,
je n'ai fait qu'une lecture rapide et n'y ai rien vu de particulier, mais est-ce que tu as essayé de lire les données renvoyées sur la liaison série pour voir si elles ne contiendraient pas des indices de ce qui cloche ?

justement, toutes les commandes sont bien prises en compte en retour serie, d'où mon soucis et surtout mon incompréhension.
la led s'allume bien au 1er M03, mais après, elle part en vadrouille et fait du jardin sur le bitume :slight_smile: et se tape des M05

infobarquee:

haifger:
Salut,
je n'ai fait qu'une lecture rapide et n'y ai rien vu de particulier, mais est-ce que tu as essayé de lire les données renvoyées sur la liaison série pour voir si elles ne contiendraient pas des indices de ce qui cloche ?

justement, toutes les commandes sont bien prises en compte en retour serie, d'où mon soucis et surtout mon incompréhension.
la led s'allume bien au 1er M03, mais après, elle part en vadrouille et fait du jardin sur le bitume :slight_smile: et se tape des M05

bonjour
C'est OK pour moi avec
le serial monitor de l'IDE et 2 autres "terminal"

Bon bah même après avoir regardé le code un petit peu plus attentivement, y'a rien qui me choque... Une de mes dernières «idées» était qu'il pourrait s'agir d'un dépassement de taille du tampon de réception, mais si tu dis que l'echo des commandes envoyées est correct même après que la LED soit partie en sucette, ça ne peut pas être ça.

Alors maintenant si en plus ça fonctionne correctement chez Artouste, là je sèche encore plus :slight_smile:
(Ou alors un problème «hard» du côté de la LED ?)

entre le fait que les commandes s'affichent bien sur le terminal, ce qui se passe aussi pour moi et le fait que la commande ne se fasse pas sur la carte, il y a une petite différence :slight_smile:
voila ce que j'ai en réponse......

hooooooo putai.... le con, je viens de trouver pourquoi, et là, personne n'aurait mis le doigt dessus, quitte a parier un diner dans un 12* :slight_smile:

je mets les infos envoyées maintenant et trouvez l'erreur

echo -n "G21;" > /dev/ttyACM0 
echo -n "G90;" > /dev/ttyACM0 
echo -n "G92;" > /dev/ttyACM0 
echo -n "G01 X25.0 Y56.0;" > /dev/ttyACM0 
echo -n "M03;" > /dev/ttyACM0 
echo -n "G01 X26.0 Y56.0 F200;" > /dev/ttyACM0 
echo -n "M05;" > /dev/ttyACM0 
echo -n "G01 X28.0 Y56.0;" > /dev/ttyACM0 
echo -n "M03;" > /dev/ttyACM0 
echo -n "G01 X28.0 Y56.0 F200;" > /dev/ttyACM0 
echo -n "M05;" > /dev/ttyACM0

c'est exactement le même code, mais à quelques différences près.
un indice, c'est un caractère invisible :slight_smile:

Les espaces ? Si c'est le cas je comprends encore moins :slight_smile: J'avais remarqué qu'il y avait une différence de ce côté-là, mais le code à l'air prévu pour sans que ça le dérange. J'ai dû louper un truc :blush:

infobarquee:
entre le fait que les commandes s'affichent bien sur le terminal, ce qui se passe aussi pour moi et le fait que la commande ne se fasse pas sur la carte, il y a une petite différence :slight_smile:
voila ce que j'ai en réponse......

hooooooo putai.... le con, je viens de trouver pourquoi, et là, personne n'aurait mis le doigt dessus, quitte a parier un diner dans un 12* :slight_smile:

je mets les infos envoyées maintenant et trouvez l'erreur

echo -n "G21;" > /dev/ttyACM0 

echo -n "G90;" > /dev/ttyACM0
echo -n "G92;" > /dev/ttyACM0
echo -n "G01 X25.0 Y56.0;" > /dev/ttyACM0
echo -n "M03;" > /dev/ttyACM0
echo -n "G01 X26.0 Y56.0 F200;" > /dev/ttyACM0
echo -n "M05;" > /dev/ttyACM0
echo -n "G01 X28.0 Y56.0;" > /dev/ttyACM0
echo -n "M03;" > /dev/ttyACM0
echo -n "G01 X28.0 Y56.0 F200;" > /dev/ttyACM0
echo -n "M05;" > /dev/ttyACM0




c'est exactement le même code, mais à quelques différences près.
un indice, c'est un caractère invisible :)

l'espace apres le ; ?
mais tu disais que ça s'allumait , mais ne s'eteignait pas ?
M03 et M05 avait la meme erreur

exact l'espace après le ; et avant le "
maintenant, pourquoi en tapant juste la dernière ligne avec ou sans espace, avec le M05 fonctionne......
mystère
je crois que je vais partir sur la création d'un shield avec de "vrais drivers" au lieu du shield 293d

j'ai posé laquestion sur le forum de gcodecnc, mais je pense que je vais attendre longtemps une réponse, et aussi sur leur facedebook.
normal, ils ont créé une carte Rumba et la vendent :wink:
mais je continue quand même d'essayer de piger le pourquoi de la chose

infobarquee:
entre le fait que les commandes s'affichent bien sur le terminal, ce qui se passe aussi pour moi et le fait que la commande ne se fasse pas sur la carte, il y a une petite différence :slight_smile:

Certes, disons que si envoi == réception ça élimine quand même (presque) totalement l'idée d'un dépassement de tampon d'envoi/réception.

Maintenant, savoir pourquoi ces espaces supplémentaires ne faisaient planter que la commande M05 et pas toutes les autres alors qu'il y en avait un peu partout, ça me dépasse. Et j'avoue que ça m'énerve même un peu :slight_smile:

haifger:

infobarquee:
entre le fait que les commandes s'affichent bien sur le terminal, ce qui se passe aussi pour moi et le fait que la commande ne se fasse pas sur la carte, il y a une petite différence :slight_smile:

Certes, disons que si envoi == réception ça élimine quand même (presque) totalement l'idée d'un dépassement de tampon d'envoi/réception.

Maintenant, savoir pourquoi ces espaces supplémentaires ne faisaient planter que la commande M05 et pas toutes les autres alors qu'il y en avait un peu partout, ça me dépasse. Et j'avoue que ça m'énerve même un peu :slight_smile:

et moi donc
je viens de modifier le code pour qu'il prenne aussi les ;" en compte ( => espace :wink: )
ca colle impec, par contre, via la console en envoyant trop de commandes d'un coup, j'atteins la limite du buffer et ca part à la campagne.
le code en lui même n'est pas compliqué en plus, mais c'est pas le top du top non plus.
les gcodesender et autres, ben rien a faire pour envoyer les même commandes avec, rien ne se passe du tout.
gnnnnaaaaaaaarrrrrggggggggg

salut a toi
pourrais tu m'indiquer le site ou tu t'inspire pour ce projet ?
merci

anthology:
salut a toi
pourrais tu m'indiquer le site ou tu t'inspire pour ce projet ?
merci

cherche gcodecncdemo :wink:
plein de sites parlent du cnc avec arduino, mais peu avec la carte que j'utilise.

merci a toi
tu a fabriquer ta carte tout seul ?
perso je pense peut etre a me faire une CNC mais qui servira aussi a de la decoupe lazer etc
donc besoin de pas mal d'IO

anthology:
merci a toi
tu a fabriquer ta carte tout seul ?
perso je pense peut etre a me faire une CNC mais qui servira aussi a de la decoupe lazer etc
donc besoin de pas mal d'IO

ben non
y a pas plus d'IO entre une cnc et un decoupe laser pour les modèles simples.
xyz + activation led

oui ça c'est sur mais l'idée serais d'utiliser toutes les IO dispo pour avoir quelques axes en plus et des accessoires ^^
j'ai vu la carte que le site que tu ma donner vend
belle bête mais j'avoue niveau tarif sont pas mal quand meme

Tu disposes de beaucoup d'E/S si tu montes une CNC + Arduino avec la librairie GRBL.

Regardes dans le fichier config.h (pour la version 0.82 de Grbl, Mega2560) l'assignation des pins :

  • Axes X, Y, Z et C (les commandes step et dir sur 4 axes) = 8 pin en sorties
  • Limit switches X, Y, Z, C (les butées limites de fin d'axe) = 4 pin en entrées
  • Spindle (enable + direction, pour la broche, ou le laser, ou la tête d'impression 3D...) = 2 pin en sorties
  • coolant (flood / mist, pour les fluides de refroidissement) 2 pin en sorties.

Rien ne t'empêche si tu as ta propre carte maison de leur attribuer d'autres fonctions : 4 axes et divers accessoires ça passe.

anthology:
oui ça c'est sur mais l'idée serais d'utiliser toutes les IO dispo pour avoir quelques axes en plus et des accessoires ^^
j'ai vu la carte que le site que tu ma donner vend
belle bête mais j'avoue niveau tarif sont pas mal quand meme

déjà un conseil, pars sur 2 axes pour te faire la main, puis augmente après histoire de bien comprendre la méthodologie et aussi les commandes G/M/F.
sinon, tu vas galérer si un gcode de donne juste 4 lignes sur un dessin :wink:
on est plusieurs a utiliser des 3d, cnc et autres trucs de malade sur le forum, donc pas de soucis pour les explications simples si besoin.
je connais au moins 2 gros malades sur les cnc ici, héhéhé

oui ça laisse pas mal de place sur une mega
mais après pourquoi ne pas avoir des axes en plus et surtout
d'avoir 2 endstop par axe pour que la CNC ce calibre toute seul
après niveau sortie ça va vite aussi
une tête imprimante 3D donc 1 sortie 1 entrée
une broche contrôler en pwm 1 sortie
1 laser 1 sortie
ne pas avoir a faire de conf peut être pratique aussi
tu branche tu sélectionne ce que ta mit comme broche et roule ma poule

oui vaut mieux s'habituer au gcode car ça peut faire peur au début
après j'ai déjà une imprimante 3d ( mendel ) qui tourne depuis plus d'un an donc le gcode j'en bouffe régulièrement

Bonjour,

anthology:
une tête imprimante 3D donc 1 sortie 1 entrée
oui vaut mieux s'habituer au gcode car ça peut faire peur au début
après j'ai déjà une imprimante 3d ( mendel ) qui tourne depuis plus d'un an donc le gcode j'en bouffe régulièrement

Le rêve de tout le monde d'avoir la machine universelle :slight_smile:
Attention : La CNC équipée d'une tête d'impression 3D cela fonctionne (beaucoup l'utilise) mais tu n'auras jamais les performances de la Mendel à cause des masses en mouvement (inertie).