Laser y arduino mega+ramps

Buenas tardes,

En primer lugar me presentaré, me llamo Xavi y soy estudiante de primer año de un CFGS de automatismos y robótica industrial. Estoy aprovechando este verano para ir aprendiendo cosas por mi cuenta antes de empezar mi segundo año y he estado practicando con el arduino. Soy muy novato y voy aprendiendo sobre la marcha, buscando aquí y allá información para poder hacer un laser cnc (muy básico). En principio yo no estoy obligado a hacer un proyecto final, puesto que haré formación dual, pero como soy un culo inquieto voy haciendo un proyecto y si da la casualidad que funciona y me da tiempo a tenerlo listo, lo entregaré.
He hecho un poco de ingeniería inversa y prácticamente he conseguido copiar una estructura del Elekslaser A-3. He comprado los motores paso a paso de esa marca y un láser compatible de 5.5W. Ademas le he añadido alguna mejora tonta como ponerle finales de carrera que creo que la versión comercial no lleva, por algún extraño motivo…
Estoy usando un arduino mega, una Ramps 1.4 y una pantalla LCD RepRapDiscount Full Graphic Smart Controller y me gustaría hacer el proyectito que me he propuesto desde 0 yo mismo, sin usar Marlin ni ningún otro firmware, y ahí empiezan mis dudas…
No encuentro información de como hacer funcionar el laser “a pelo”, siempre se hace referencia a firmwares ya creados, comandos M106 S0, etc…
Que libreria debo utilizar para usar ese tipo de comandos? o para hacerlo funcionar?
Entiendo que el laser lo debo conectar a D9 + con + y - con -, pero que pines de la Ramps debo activar?

Perdonar si la pregunta ya ha sido respondida en algún momento, pero ni en el foro ni en ningún otro lugar encuentro información, pero me he atascado con esto y no logro avanzar nada de nada. :confused:
Os adjunto lo que llevo de código hasta el momento, voy probando cosas nuevas y puede que tenga alguna cosa rara.

#include <SPI.h>
#include <U8glib.h>
#include <SD.h>

#define X_STP 60
#define X_DIR 61
#define X_ENABLE 56
#define X_MIN 3
#define X_MAX 2
#define Y_STP 46
#define Y_DIR 48
#define Y_ENABLE 62
#define Y_MIN 14
#define Y_MAX 15
#define START 18
#define Z_MAX 19
#define DOGLCD_CS       16
#define DOGLCD_MOSI     17
#define DOGLCD_SCK      23
#define BTN_EN1         31
#define BTN_EN2         33
#define BTN_ENC         35
#define SD_DETECT_PIN   49
#define SDSS            53
#define BEEPER_PIN      37
#define KILL_PIN        41

Sd2Card card;
SdVolume volume;

int x=1, y=1, a, s, d, w;  // x=1850 y y=1300 valores maximos
int q=0;
char posX[4];                          
char posY[4];
int sd_detect_pin_status = true;
int scroll_direction=1; 
char tmp_string[16]; 
boolean gotsddata = false;
int sdcardinit;
int sdcardtype;
int sdvolumeinit;
int sdvolumefattype;
unsigned long sdvolumebpc;
unsigned long sdvolumecc;

U8GLIB_ST7920_128X64_1X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS);

//----------------------------------------------------------------------------------

void setup() {
     pinMode(X_STP , OUTPUT);
     pinMode(X_DIR , OUTPUT);
     pinMode(X_ENABLE, OUTPUT);
     pinMode(Y_STP , OUTPUT);
     pinMode(Y_DIR, OUTPUT);
     pinMode(Y_ENABLE , OUTPUT);

     digitalWrite(X_ENABLE , LOW);
     digitalWrite(Y_ENABLE , LOW);

     pinMode(X_MIN, INPUT_PULLUP);
     pinMode(Y_MIN, INPUT_PULLUP);
     pinMode(START , INPUT_PULLUP);
     pinMode(Z_MAX , INPUT_PULLUP);

     pinMode(SD_DETECT_PIN, INPUT);        
     digitalWrite(SD_DETECT_PIN, HIGH);
     pinMode(BTN_ENC, INPUT);              
     digitalWrite(BTN_ENC, HIGH); 
     pinMode(KILL_PIN, INPUT); 
     digitalWrite(KILL_PIN, HIGH);        
     u8g.setFont(u8g_font_helvR08);      
     u8g.setColorIndex(1); 
}
//---------------------------------------------------------------------------------
void loop() {
  u8g.firstPage();
  do{ 
    if(gotsddata) Sdscreen();
    else{ 
        u8g.setColorIndex(0);
        u8g.drawBox(0,0,128,64);
        u8g.setColorIndex(1);

        u8g.drawRFrame(1, 1*9, 125, 55, 1);
        u8g.drawStr( 3+q, 8, "LASER");
        u8g.drawStr( 3, 20, "Laser");
        u8g.drawStr( 3, 30, "Home");
        u8g.drawStr( 3, 40, "Center");
        u8g.drawStr( 3, 50, "X = ");
        u8g.drawStr( 3, 60, "Y = ");
        if(x==925 && y==650){
          u8g.drawStr( 60, 20, "READY");
          u8g.drawStr(60, 30, "DONE");
          u8g.drawStr( 60, 40, "OK");
          u8g.drawStr( 3, 50, "X = ");
          sprintf (posX, "%d", + (x));
          u8g.drawStr( 60, 50, posX );
          u8g.drawStr( 3, 60, "Y = ");
          sprintf (posY, "%d", + (y));
          u8g.drawStr( 60, 60, posY );
        }
        else{
          u8g.drawStr( 60, 20, "Not ready");
          u8g.drawStr(60, 30, "N/A");
          u8g.drawStr(60, 40, "N/A");
          u8g.drawStr(60, 50, "N/A");
          u8g.drawStr(60, 60, "N/A");
        }
    }
   }while( u8g.nextPage() );

  q=q+scroll_direction;
  if (q > 80) scroll_direction = -1;
  if (q < 1) scroll_direction = 1;

  if(digitalRead(START)==0){
    Home();
    }
  if(digitalRead(BTN_ENC)==0){
    Frame();
  }
}
//-------------------------------------------------------------------------------
void Home(){
  while (digitalRead(X_MIN) == 1){
    digitalWrite(X_DIR, LOW);
    for (int i = 0; i <= 1; i++){
      digitalWrite(X_STP, HIGH);
      delay(5);
      digitalWrite(X_STP, LOW);
    }
  }
  digitalWrite(X_DIR, HIGH);
  for (int i = 0; i < 20;i++){
    digitalWrite(X_STP , HIGH);
    delay(5);
    digitalWrite(X_STP, LOW);
  }
  while (digitalRead(Y_MIN) == 1){
    digitalWrite(Y_DIR, HIGH);
    for (int i = 0; i <= 1; i++){
      digitalWrite(Y_STP , HIGH);
      delay(5);
      digitalWrite(Y_STP, LOW);
    }
  }
  digitalWrite(Y_DIR, LOW);
  for (int i = 0; i < 20;i++){
    digitalWrite(Y_STP, HIGH);
    delay(5);
    digitalWrite(Y_STP, LOW);
  }
  x=0;
  y=0;
  delay(1000);
  Center();
}
//------------------------------------------------------------  
void Center(){
  digitalWrite(Y_DIR, LOW);
  digitalWrite(X_DIR, HIGH);
  for (int i = 0; i < 650;i++){
    digitalWrite(Y_STP , HIGH);
    digitalWrite(X_STP , HIGH);
    delay(5);
    digitalWrite(Y_STP, LOW);
    digitalWrite(X_STP , LOW);
    x++;
    y++;
  }
  for (int i = 0; i < 275;i++){
    digitalWrite(X_STP , HIGH);
    delay(5);
    digitalWrite(X_STP , LOW);
    x++;
  }
  delay(1000); 
 }
//-------------------------------------------------------------------------------
void Frame(){
  if(x==925 && y==650){
    d=925;
    Right();
    s=650;
    Down();
    a=1850;
    Left();
    w=1300;
    Up();
    d=1850;
    Right();
    s=650;
    Down();
    delay(1000);
    }
}
//------------------------------------------------------------------------------
void Right(){
  digitalWrite(X_DIR, HIGH);
  for (int i = 0; i < d;i++){
      digitalWrite(X_STP , HIGH);
      delay(5);
      digitalWrite(X_STP , LOW);
      x++;
    }
}
//------------------------------------------------------------------------------
void Left(){
      digitalWrite(X_DIR, LOW);
    for (int i = 0; i < a;i++){
      digitalWrite(X_STP , HIGH);
      delay(5);
      digitalWrite(X_STP , LOW);
      x--;
    }
}
//-------------------------------------------------------------------------------
void Down(){
  digitalWrite(Y_DIR, HIGH);
    for (int i = 0; i < s;i++){
      digitalWrite(Y_STP , HIGH);
      delay(5);
      digitalWrite(Y_STP , LOW);
      y--;
    }
}
//-------------------------------------------------------------------------------
void Up(){
      digitalWrite(Y_DIR, LOW);
    for (int i = 0; i < w;i++){//arriba
      digitalWrite(Y_STP , HIGH);
      delay(5);
      digitalWrite(Y_STP , LOW);
      y++;
    }
}
//------------------------------------------------------------------------------

Gracias de antemano.

Rerum:
No encuentro información de como hacer funcionar el laser "a pelo", siempre se hace referencia a firmwares ya creados, comandos M106 S0, etc...

Cuando hablas del laser supongo que tiene tambien la fuente de 12V con controladora TTL no ?

Si es asi solo tienes que usar una salida PWM controlada desde un potenciometro de 10K con los entremos en 5V y GND y el cursor (punto medio) a un analogico (A0) y asi manejas un pin PWM para controlar la potencia del laser por la entrada de control (azul-blanco), por ejemplo:

void setup(){
   //Nada
}

void loop(){
   int val = map(analogRead(A0), 0, 1023, 0, 255);
   analogWrite(9, val);   
}

Correcto, el laser venia con una fuente de 12 V y la controladora TTL. Muchisimas gracias, tu solución ha sido perfecta, ya lo he podido probar. Estaba muy estancado con esa tonteria y no era capaz de seguir adelante. Ahora tengo que aprender como enfocarlo y encontrar una velocidad correcta, etc... ya seguiré investigando.