Pages: [1] 2   Go Down
Author Topic: commande cnc non prise en compte  (Read 673 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
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)
Code:
//------------------------------------------------------------------------------
// 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();
  }
}
Logged

Offline Offline
Sr. Member
****
Karma: 12
Posts: 277
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley et se tape des M05
Logged

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4978
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley et se tape des M05
bonjour
C'est OK pour moi avec
le serial monitor de l'IDE et 2 autres "terminal"
Logged

Offline Offline
Sr. Member
****
Karma: 12
Posts: 277
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
(Ou alors un problème «hard» du côté de la LED ?)
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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* smiley

je mets les infos envoyées maintenant et trouvez l'erreur
Code:
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 smiley
Logged

Offline Offline
Sr. Member
****
Karma: 12
Posts: 277
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Les espaces ? Si c'est le cas je comprends encore moins smiley 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  smiley-red
Logged

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4978
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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* smiley

je mets les infos envoyées maintenant et trouvez l'erreur
Code:
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 smiley
l'espace apres le ; ?
mais tu disais que ça s'allumait , mais ne s'eteignait pas ?
M03 et M05 avait la meme erreur
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
mais je continue quand même d'essayer de piger le pourquoi de la chose
Logged

Offline Offline
Sr. Member
****
Karma: 12
Posts: 277
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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 smiley
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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 smiley

et moi donc
je viens de modifier le code pour qu'il prenne aussi les ;_" en compte (_ => espace smiley-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
Logged

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 330
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 330
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1938
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1] 2   Go Up
Jump to: