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
code: [select]
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: [select]
//------------------------------------------------------------------------------
// 2 axis cnc demo v1 - supports motor shield v1
// dan@marginallycelver.com 2013-08-30
//------------------------------------------------------------------------------
// copyright @ end of file.
// please see http://www.github.com/marginallyclever/gcodecncdemo more information.


//------------------------------------------------------------------------------
// constants
//------------------------------------------------------------------------------
#define version        (1)  // firmware version
#define baud           (115200)  // how fast arduino talking?
#define max_buf        (64)  // longest message arduino can store?
#define steps_per_turn (400)  // depends on stepper motor.  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];  // store message until ';'
int sofar;  // how in 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 appropriate number of microseconds
* @input ms how many milliseconds wait
*/
void pause(long ms) {
  delay(ms/1000);
  delaymicroseconds(ms%1000);  // delaymicroseconds doesn't work values > ~16k.
}


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

  if(nfr>max_feedrate || nfr<min_feedrate) {  // don't allow crazy feed rates
    serial.print(f("new feedrate must greater "));
    serial.print(min_feedrate);
    serial.print(f("steps/s , less "));
    serial.print(max_feedrate);
    serial.println(f("steps/s."));
    return;
  }
  step_delay = 1000000.0/nfr;
  fr=nfr;
}


/**
* set logical position
* @input npx new position x
* @input npy new position y
*/
void position(float npx,float npy) {
  // here place add sanity tests
  px=npx;
  py=npy;
}


/**
* uses bresenham's line algorithm move both motors
* @input newx destination x position
* @input newy 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 motors 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;
}


/**
* character /code/ in buffer , read float follows it.
* @return value found.  if nothing found, /val/ returned.
* @input code character for.
* @input val return value if /code/ 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 string followed float serial line.  convenient debugging.
* @input code string.
* @input val float.
*/
void output(char *code,float val) {
  serial.print(code);
  serial.println(val);
}


/**
* print current position, feedrate, , 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; - message"));
  serial.println(f("m114; - report position , feedrate"));
}


/**
* read input buffer , find recognized commands.  1 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 input buffer receive new message , tells serial connected device ready more.
*/
void ready() {
  sofar=0;  // clear input buffer
  serial.print(f(">"));  // signal ready receive input
}


/**
* first thing machine on startup.  runs once.
*/
void setup() {
  serial.begin(baud);  // open coms
pinmode(laser, output);
digitalwrite(laser, low);
  help();  // hello
  position(0,0);  // set staring position
  feedrate((max_feedrate + min_feedrate)/2);  // set default speed
  ready();
}


/**
* after setup() machine repeat loop() forever.
*/
void loop() {
  // listen serial commands
  while(serial.available() > 0) {  // if available
    char c=serial.read();  // it
    serial.print(c);  // repeat know got message
    if(sofar<max_buf) buffer[sofar++]=c;  // store it
    if(buffer[sofar-1]==';') break;  // entire message received
  }

  if(sofar>0 && buffer[sofar-1]==';') {
    // got message , ends semicolon
    buffer[sofar]=0;  // end buffer string functions work right
    serial.print(f("\r\n"));  // echo return character humans
    processcommand();  // command
    ready();
  }
}

salut,
je n'ai fait qu'une lecture rapide et n'y ai rien vu de particulier, mais est-ce que tu 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 ?


Arduino Forum > International > Français (Moderators: jfs, Snootlab) > commande cnc non prise en compte


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support