Arduino Mini CNC: 8 pasos (con fotos)

Arduino Mini CNC: 8 pasos (con fotos)

Tabla de contenido:

Anonim

Hola amigos, en este proyecto hablaremos sobre la fabricación de unidades de DVD y CD-ROM dañadas y su producción a bajo costo. Vamos a empezar a construir el mini proyecto cnc que dibuja.

Suministros:

Paso 1: Materiales

  1. Arduino (puede ser nano, uno o mega)
  2. DVD o CD-ROM dañado (se ejecutará el motor paso a paso en el interior)
  3. 2 piezas de DVD o CD-ROM dañados (el motor paso a paso en el interior estará funcionando)
  4. Servomotor (Mg90 es suficiente)
  5. 5v 2 amp batería o adaptador
  6. Placa de plexi con 20 x 16 cm y 5 mm de grosor para sujetar el eje X.
  7. Placa de plexi de 15 x 16 cm y grosor de 5 mm para asegurar el eje Y
  8. Puede utilizar una placa de plexi de 75 × 75 mm y un grosor de 5 mm para la superficie de dibujo.
  9. 1 pieza tuerca de tornillo M5 (para fijar la placa)
  10. 14 piezas de tuerca M4

Paso 2: Descripción general frontal y posterior del Mini Cnc y explicaciones de sus partes

  1. Placa Plexi plano X (200x150x3 mm)
  2. Placa Plexi plano Y (200x150x3 mm)
  3. Mecanismo de movimiento del eje X (mecanismo de patio de unidad de DVD)
  4. Mecanismo de movimiento del eje Y (mecanismo de patio de unidad de DVD)
  5. Seccion z plano
  6. Servo motor
  7. Titular de la pluma
  8. Tuerca de fijación de la pluma - disposición de tornillo (tuerca de tornillo M5 de 1 pieza)
  9. Bolígrafo
  10. Mesa de dibujo (placa plexi 75x75x5 mm)
  11. Soportes de eje y tuercas
  12. Motor paso a paso para el movimiento del eje X
  13. Motor paso a paso para el movimiento del eje Y
  14. Clips de papel para asegurar el papel
  15. 14 piezas de tuerca M4
  16. Soporte de pluma
  17. Eje Z
  18. Cables
  19. 4 angulos
  20. La unidad de control (Arduino uno, 2 l239d, pertinaks, toma de entrada de energía)
  21. Cable USB para la conexión de la computadora

Paso 3: Parte mecánica

Utilizaremos la parte con el DVD de la parte mecánica o el sistema de rieles dentro de la unidad Cd-R0m. En esta sección, el motor paso a paso está conectado al eje del tornillo sin fin y mueve la parte del lector láser que está conectada al eje girando el eje Estamos eliminando esta parte sin daño. De la misma manera, el otro controlador también se desmonta y se instalan un total de dos sistemas de motores paso a paso. Si usa DVD-Rom, también puede hacer un cortador láser con sus diodos láser. Estas son las partes mecánicas que mueven los ejes. Extraeremos otras piezas mecánicas de la impresora 3d.

Puede descargar archivos de piezas stl aquí >>

Paso 4: Sección electrónica

En nuestro sistema electrónico, conectaremos los dos motores paso a paso que moverán los ejes x e y un servomotor que levantará y bajará la matriz.

Paso 5: Parte del Código Arduino

#incluir

#incluir

#define LINE_BUFFER_LENGTH 512

const int kalem_kaldir = 130;

const int kalem_indir = 40;

const int kalem_servo_pin = 12;

const int adim_sayisi = 20;

const int hareket_hizi = 250;

Servo kalem_servo;

Stepper y_ekseni (adim_sayisi, 3,4,5,6);

Paso a paso x_ekseni (adim_sayisi, 9,10,11,12);

flotar x_adim_mm = 6.0;

float y_adim_mm = 6.0;

punto de estructura {flotador x; flotar y flotador z; };

struct point actuatorPos;

flotar StepInc = 1;

int StepDelay = 0;

int LineDelay = 50;

int penDelay = 50;

flotar Xmin = 0;

flotar Xmax = 40;

flotador Ymin = 0;

flotador Ymax = 40;

flotador Zmin = 0;

flotar Zmax = 1;

flotar Xpos = Xmin;

flotar Ypos = Ymin;

flotar Zpos = Zmax;

booleano verboso = falso;

void setup () {// Setup

Serial.begin (9600);

kalem_servo.attach (kalem_servo_pin);

kalem_servo.write (kalem_kaldir);

retraso (200);

x_ekseni.setSpeed ​​(hareket_hizi);

y_ekseni.setSpeed ​​(hareket_hizi);

Serial.println ("Çizim Yapan Mini CNC!");

Serial.print ("X min");

Serial.print (Xmin);

Serial.print ("den");

Serial.print (Xmax);

Serial.println ("mm.");

Serial.print ("Y min");

Serial.print (Ymin);

Serial.print ("den");

Serial.print (Ymax);

Serial.println ("mm.");

}

bucle de vacío () {

retraso (200);

línea char LINE_BUFFER_LENGTH;

char c; int lineIndex;

bool lineIsComment, lineSemiColon;

lineIndex = 0;

lineSemiColon = falso;

lineIsComment = false;

mientras que (1) {

while (Serial.available ()> 0) {

c = Serial.read ();

if ((c == ' n') || (c == ' r')) {

if (lineIndex> 0) {

line lineIndex = ' 0';

si (detallado) {

Serial.print ("Alıcı:");

Serial.println (línea);

}

processIncomingLine (line, lineIndex);

lineIndex = 0; }

else {

// Vaciar o comentar la línea. Saltar bloque.

}

lineIsComment = false;

lineSemiColon = falso;

Serial.println ("ok");

}

else {

if ((lineIsComment) || (lineSemiColon)) {

if (c == ')') lineIsComment = false;

} else {

si (c <= '') {

}

si no (c == '/') {

}

si no (c == '(') {

lineIsComment = true;

}

si no (c == ';') {

lineSemiColon = true;

}

else if (lineIndex> = LINE_BUFFER_LENGTH-1) {

Serial.println ("Yazma Hatası");

lineIsComment = false;

lineSemiColon = falso;

} else if (c> = 'a' && c <= 'z') {

línea lineIndex ++ = c-'a '+' A ';

} else {

línea lineIndex ++ = c; }}}}}

void processIncomingLine (char * line, int charNB) {

int currentIndex = 0; búfer de char 64;

struct point newPos;

newPos.x = 0.0;

newPos.y = 0.0;

while (currentIndex <charNB) {

interruptor (línea currentIndex ++) {

caso 'U':

penUp ();

descanso;

caso 'D':

pluma abajo();

descanso;

caso 'G':

buffer 0 = línea currentIndex ++;

buffer 1 = ' 0';

switch (atoi (buffer)) {

caso 0:

caso 1:

char * indexX = strchr (line + currentIndex, 'X');

char * indexY = strchr (line + currentIndex, 'Y');

si (indexY <= 0) {

newPos.x = atof (indexX + 1);

newPos.y = actuatorPos.y;

} else if (indexX <= 0) {

newPos.y = atof (indexY + 1);

newPos.x = actuatorPos.x; }

else {newPos.y = atof (indexY + 1);

indexY = ' 0'; newPos.x = atof (indexX + 1); }

drawLine (newPos.x, newPos.y);

// Serial.println ("ok");

actuatorPos.x = newPos.x;

actuatorPos.y = newPos.y;

descanso; }

descanso; caso 'M':

buffer 0 = línea currentIndex ++;

buffer 1 = línea currentIndex ++;

búfer 2 = línea currentIndex ++;

buffer 3 = ' 0'; switch (atoi (buffer)) {

caso 300: {char * indexS = strchr (line + currentIndex, 'S');

Spos flotantes = atof (indexS + 1);

if (Spos == 30) {penDown ();

} if (Spos == 50) {

penUp (); } rotura;

caso 114:

Serial.print ("Tam Pozisyon: X =");

Serial.print (actuatorPos.x);

Serial.print ("- Y =");

Serial.println (actuatorPos.y);

descanso; defecto:

Serial.print ("Komut Tanınmadı: M");

Serial.println (buffer); }}}

}

void drawLine (float x1, float y1) {

if (verbose) {Serial.print ("fx1, fy1:");

Serial.print (x1); Serial.print (",");

Serial.print (y1); Serial.println (""); }

si (x1> = Xmax) {x1 = Xmax; }

si (x1 <= Xmin) {x1 = Xmin; }

if (y1> = Ymax) {y1 = Ymax; }

if (y1 <= Ymin) {y1 = Ymin; }

if (verbose) {Serial.print ("Xpos, Ypos:");

Serial.print (Xpos); Serial.print (",");

Serial.print (Ypos); Serial.println (""); }

if (verbose) {Serial.print ("x1, y1:");

Serial.print (x1); Serial.print (",");

Serial.print (y1); Serial.println (""); }

x1 = (int) (x1 * x_adim_mm); y1 = (int) (y1 * y_adim_mm);

float x0 = Xpos; float y0 = Ypos; dx largo = abs (x1-x0); largo dy = abs (y1-y0); int sx = x0

largo i; largo sobre = 0;

if (dx> dy) {para (i = 0; i = dx) {over- = dx; y_ekseni.step (sy); }

retraso (StepDelay); }} else else for (i = 0; i = dy) {over- = dy; x_ekseni.step (sx); } retraso (StepDelay); }}

if (verbose) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print (",");

Serial.print (dy); Serial.println (""); }

if (verbose) {Serial.print ("Ir a ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); }

retraso (LineDelay);

Xpos = x1; Ypos = y1; }

void penUp () {kalem_servo.write (kalem_kaldir); retraso (LineDelay);

Zpos = Zmax; if (verbose) {Serial.println ("Pen up!"); }}

void penDown () {kalem_servo.write (kalem_indir);

retraso (LineDelay); Zpos = Zmin; si (detallado) {

Serial.println ("Pen down."); }}

Paso 6: Código de procesamiento

import java.awt.event.KeyEvent;

import javax.swing.JOptionPane;

importación processing.serial. *;

Puerto serie = nulo;

String portname = null;

transmisión booleana = falso;

velocidad de flotación = 0.001;

String gcode; int i = 0;

void openSerialPort () {

if (portname == null) return;

if (port! = null) port.stop (); puerto = nuevo número de serie (este, nombre de puerto, 9600); port.bufferUntil (' n'); }

void selectSerialPort () {

Resultado de cadena = (Cadena) JOptionPane.showInputDialog (marco, "Seleccione el puerto serie que corresponde a su placa Arduino.", "Puerto serie seç", JOptionPane.QUESTION_MESSAGE, null, Serial.list (), 0);

if (result! = null) {portname = result; openSerialPort (); }}

configuración de vacío () {tamaño (500, 250); openSerialPort (); }

empate vacío () {fondo (0);

relleno (255); int y = 24, dy = 12; texto ("Menuler", 12, y);

y + = dy; texto ("p: puerto serie seç", 12, y); y + = dy;

texto ("1: hız 0.001 inch", 12, y); y + = dy; texto ("2: hız 0.010 inch", 12, y); y + = dy;

texto ("3: hız 0.100 inch", 12, y); y + = dy; texto ("Yön Tuşları: x-y Düzlemi", 12, y);

y + = dy; texto ("Sayfa aşağı-yukarı: z eksen", 12, y); y + = dy;

texto ("$: grbl ayarlar", 12, y); y + = dy; texto ("h: Başlangıç ​​Konumu", 12, y); y + = dy;

texto ("0: Güncel Konum", 12, y); y + = dy; texto ("g: g-code dosya seç", 12, y);

y + = dy; texto ("x: Çizimi Durdur", 12, y); y + = dy; y = altura - dy;

texto ("güncel hız:" + speed + "adım", 12, y); y - = dy;

texto ("puerto serie güncel:" + nombre de puerto, 12, y); y - = dy; }

void keyPressed () {if (key == '1') speed = 0.001; if (clave == '2') velocidad = 0.01;

if (key == '3') speed = 0.1; si (! streaming) {

if (keyCode == LEFT) port.write ("G91 nG20 nG00 X-" + velocidad + "Y0.000 Z0.000 n");

if (keyCode == RIGHT) port.write ("G91 nG20 nG00 X" + velocidad + "Y0.000 Z0.000 n");

if (keyCode == UP) port.write ("G91 nG20 nG00 X0.000 Y" + velocidad + "Z0.000 n");

if (keyCode == DOWN) port.write ("G91 nG20 nG00 X0.000 Y-" + velocidad + "Z0.000 n");

if (keyCode == KeyEvent.VK_PAGE_UP) port.write ("G91 nG20 nG00 X0.000 Y0.000 Z" + velocidad + " n");

if (keyCode == KeyEvent.VK_PAGE_DOWN) port.write ("G91 nG20 nG00 X0.000 Y0.000 Z-" + velocidad + " n");

if (clave == 'h') port.write ("G90 nG20 nG00 X0.000 Y0.000 Z0.000 n"); if (clave == 'v') port.write ("$ 0 = 75 n $ 1 = 74 n $ 2 = 75 n"); // if (key == 'v') port.write ("$ 0 = 100 n $ 1 = 74 n $ 2 = 75 n");

if (key == 's') port.write ("$ 3 = 10 n"); if (clave == 'e') port.write ("$ 16 = 1 n"); if (key == 'd') port.write ("$ 16 = 0 n");

if (clave == '0') openSerialPort (); if (clave == 'p') seleccioneSerialPort (); if (key == '$') port.write ("$$ n"); }

if (! streaming && key == 'g') {gcode = null; i = 0; Archivo de archivo = nulo; println ("Cargando archivo …"); selectInput ("Seleccione un archivo para procesar:", "fileSelected", archivo); } if (clave == 'x') streaming = falso; }

void fileSelected (selección de archivo) {if (selection == null) {println ("La ventana se cerró o el usuario presionó cancelar."); }

else {println ("User selected" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ()); if (gcode == null) return;

streaming = verdadero; corriente(); }}

void stream () {if (! streaming) return; while (verdadero) {si (i == gcode.length) {

streaming = falso; regreso; } if (gcode i.trim (). length () == 0) i ++; de lo contrario romper }

println (gcode i); port.write (gcode i + ' n'); i ++; }

void serialEvent (Serial p) {String s = p.readStringUntil (' n'); println (s.trim ());

if (s.trim (). startsWith ("ok")) stream ();

if (s.trim (). startsWith ("error")) stream (); // XXX: de verdad? }

Paso 7: CONFIGURACIÓN DE LA PINTURA

Para obtener el código de salida de gccode con INKSCAPE, primero descargue el plugin de código G de makerbot para unicornio aquí >> Inkscape gcode plugin

Configuración completa de İnkscape y detalles del proyecto >> Arduino cnc project

Paso 8: Por favor, vota sobre el proyecto:)

Me uní a la competencia en el Concurso CNC y Diseño 3D 2016. Estoy esperando su voto. Puede votar haciendo clic en el botón "votar" en la parte superior derecha. Gracias de antemano:)