Arduino Mini CNC: 8 Adım (Resimlerle)

Arduino Mini CNC: 8 Adım (Resimlerle)

İçindekiler:

Anonim

Merhaba arkadaşlar, bu projede bozuk DVD ve cd-rom sürücülerinin geri dönüştürülmüş ve düşük maliyetle cnc üretimi yapma hakkında konuşacağız. Çizen mini cnc projesini inşa etmeye başlayalım

Gereçler:

Adım 1: Malzemeler

  1. Arduino (nano, uno veya mega olabilir)
  2. Hasarlı DVD veya CD-ROM (içindeki step motor çalışacaktır)
  3. 2 adet hasarlı dvd veya cd-rom (içerideki step motor çalışacaktır)
  4. Servo motor (Mg90 yeterli)
  5. 5v 2 amper pil veya adaptör
  6. X eksenini tutmak için 20 x 16 cm ve 5 mm kalınlığında pleksi plakası.
  7. Y eksenini sabitlemek için pleksi plaka 15 x 16 cm ve kalınlığı 5 mm
  8. Çizim yüzeyi için 75 × 75 mm'lik bir pleksi levha ve 5 mm kalınlıkta kullanabilirsiniz.
  9. 1 adet M5 cıvata somunu (plakayı sabitlemek için)
  10. 14 adet M4 cıvata somunu

Adım 2: Mini Cnc'in Önden ve Arkadan Görünümü ve Parçalarının Açıklamaları

  1. X uçağı Pleksi Tabak (200x150x3 mm)
  2. Y Düzlemli Pleksi Tabak (200x150x3 mm)
  3. X ekseni hareket mekanizması (dvd sürücü alanı mekanizması)
  4. Y ekseni hareket mekanizması (dvd sürücü bahçesinde mekanizması)
  5. Z düzlem bölümü
  6. Servo motor
  7. Kalemlik
  8. Kalem sabitleme somunu - vida düzeni (1 adet M5 cıvata somunu)
  9. Dolma kalem
  10. Çizim masası (75x75x5 mm pleksi levha)
  11. Eksen destekleri ve vida somunları
  12. X ekseni hareketi için adım motoru
  13. Y ekseni hareketi için adım motoru
  14. Kağıdı sabitlemek için ataç
  15. 14 adet M4 cıvata somunu
  16. Kalem tutucu desteği
  17. Z ekseni
  18. Kablolar
  19. 4 açıları
  20. Kontrol ünitesi (Arduino uno, 2 l239d, pertinaks, enerji girişi jakı)
  21. Bilgisayar bağlantısı için USB kablosu

Adım 3: Mekanik Parça

Parçayı mekanik parça DVD veya Cd-R0m sürücünün içindeki ray sistemi ile birlikte kullanacağız. Bu bölümde, step motor sonsuz vida miline bağlanır ve şafta bağlı olan lazer okuyucunun kısmını çevirerek şaft. Bu kısmı zararsız bir şekilde kaldırıyoruz. Aynı şekilde, diğer sürücü de sökülür ve toplam iki adet step motor sistemi kurulur. DVD-Rom kullanıyorsanız, lazer kesiciyi lazer diyotlarıyla da yapabilirsiniz. Bunlar eksenleri hareket ettiren mekanik parçalardır. 3B yazıcıdan diğer mekanik parçaları çıkaracağız.

Stl dosyalarını buradan indirebilirsiniz >>

Adım 4: Elektronik Bölüm

Elektronik sistemimizde, x ve y eksenini hareket ettirecek iki kademeli motoru ve kalıbı kaldıran ve indiren bir servo motor bağlayacağız.

Adım 5: Arduino Kodu Bölümü

#Dahil etmek

#Dahil etmek

#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;

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

Step x_ekseni (adim_sayisi, 9,10,11,12);

şamandıra x_adim_mm = 6.0;

şamandıra y_adim_mm = 6.0;

yapı noktası {float x; şamandıra y; şamandıra z; };

yapısal nokta aktüatörPos;

şamandıra StepInc = 1;

int StepDelay = 0;

int LineDelay = 50;

int penDelay = 50;

şamandıra Xmin = 0;

şamandıra Xmax = 40;

şamandıra Ymin = 0;

şamandıra Ymax = 40;

şamandıra Zmin = 0;

şamandıra Zmax = 1;

şamandıra Xpos = Xmin;

şamandıra Ypos = Ymin;

şamandıra Zpos = Zmax;

boole fiili = yanlış;

void setup () {// Kurulum

Seri.begin (9600);

kalem_servo.attach (kalem_servo_pin);

kalem_servo.write (kalem_kaldir);

gecikmesi (200);

x_ekseni.setSpeed ​​(hareket_hizi);

y_ekseni.setSpeed ​​(hareket_hizi);

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

Seri baskı ("X min");

Serial.print (Xmin);

Seri baskı ("den");

Serial.print (Xmax);

Seri.println ("mm");

Seri baskı ("Y min");

Serial.print (Ymin);

Seri baskı ("den");

Serial.print (Ymax);

Seri.println ("mm");

}

boş döngü () {

gecikmesi (200);

char satırı LINE_BUFFER_LENGTH;

char c; int lineIndex;

bool lineIsComment, lineSemiColon;

lineIndex = 0;

lineSemiColon = yanlış;

lineIsComment = false;

(1) {

while (Serial.available ()> 0) {

c = Serial.read ();

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

if (lineIndex> 0) {

satır lineIndex = ' 0';

if (ayrıntılı) {

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

Seri.println (satır);

}

processIncomingLine (line, lineIndex);

lineIndex = 0; }

Başka {

// Boş bırak veya yorum satırı. Bloğu atla.

}

lineIsComment = false;

lineSemiColon = yanlış;

Serial.println ("Tamam");

}

Başka {

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

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

} Başka {

if (c <= '') {

}

aksi takdirde (c == '/') {

}

aksi takdirde (c == '(') {

lineIsComment = true;

}

başka eğer (c == ';') {

lineSemiColon = true;

}

else if (lineIndex> = LINE_BUFFER_LENGTH-1) {

Serial.println ("Yazma Hatası");

lineIsComment = false;

lineSemiColon = yanlış;

} else eğer (c> = 'a' && c <= 'z') {

satır lineIndex ++ = c-'a '+' A ';

} Başka {

satır lineIndex ++ = c; }}}}}}

void processIncomingLine (char * satırı, int charNB) {

int currentIndex = 0; char tamponu 64;

struct point newPos;

newPos.x = 0.0;

newPos.y = 0.0;

while (currentIndex <charNB) {

anahtar (satır currentIndex ++) {

'U' durumu:

penUp ();

break;

'D' durumu:

penDown ();

break;

'G' durumu:

tampon 0 = satır currentIndex ++;

tampon 1 = ' 0';

anahtar (atoi (tampon)) {

durum 0:

dava 1:

char * indexX = strchr (satır + currentIndex, 'X');

char * indexY = strchr (satır + currentIndex, 'Y');

if (indexY <= 0) {

newPos.x = atof (indexX + 1);

newPos.y = aktüatörPos.y;

} else eğer (indexX <= 0) {

newPos.y = atof (indexY + 1);

newPos.x = aktüatörPos.x; }

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

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

drawLine (newPos.x, newPos.y);

// Seri.println ("tamam");

actuatorPos.x = newPos.x;

actuatorPos.y = newPos.y;

break; }

break; 'M' durumu:

tampon 0 = satır currentIndex ++;

tampon 1 = satır currentIndex ++;

tampon 2 = satır currentIndex ++;

tampon 3 = ' 0'; anahtar (atoi (tampon)) {

vaka 300: {char * indexS = strchr (satır + currentIndex, 'S');

şamandıralar Spos = atof (indexS + 1);

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

} eğer (Spos == 50) {

penUp (); } mola;

} dava 114:

Serial.print ("Tam Ziyaretçi: X =");

Seri baskısı (aktüatörPos.x);

Seri.print ("- Y =");

Serial.println (aktüatörPos.y);

break; varsayılan:

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

Seri.println (tampon); }}}

}

boşluk drawLine (şamandıra x1, y1 şamandıra) {

if (ayrıntılı) {Serial.print ("fx1, fy1:");

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

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

eğer (x1> = Xmax) {x1 = Xmax; }

eğer (x1 <= Xmin) {x1 = Xmin; }

eğer (y1> = Ymax) {y1 = Ymax; }

eğer (y1 <= Ymin) {y1 = Ymin; }

if (ayrıntılı) {Serial.print ("Xpos, Ypos:");

Serial.print (XPOS); Serial.print ("");

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

if (ayrıntılı) {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);

şamandıra x0 = Xpos; şamandıra y0 = Ypos; uzun dx = abs (xl-x0); uzun dy = abs (y1-y0); int sx = x0

uzun ben; uzun süre = 0;

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

gecikmesi (StepDelay); }} else {için (i = 0; i = dy) {over- = dy; x_ekseni.step (sx); } gecikme (StepDelay); }}

if (ayrıntılı) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print ("");

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

if (ayrıntılı) {Serial.print ("Gidiyor ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); }

gecikmesi (LineDelay);

Xpos = x1; Ypos = y1; }

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

Zpos = Zmaks; if (ayrıntılı) {Serial.println ("Pen up!"); }}

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

gecikmesi (LineDelay); Zpos = Zmin; if (ayrıntılı) {

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

Adım 6: Kod işleniyor

ithalat java.awt.event.KeyEvent;

ithalat javax.swing.JOptionPane;

import processing.serial. *;

Seri port = boş;

Dize portname = null;

boolean akışı = yanlış;

şamandıra hızı = 0.001;

Dize gcode; int i = 0;

void openSerialPort () {

if (portname == null) dönüş;

if (port! = null) port.stop (); port = yeni Seri (bu, portname, 9600); port.bufferUntil (' n'); }

geçersiz selectSerialPort () {

String result = (String) JOptionPane.showInputDialog (frame, "Arduino kartınıza karşılık gelen seri bağlantı noktasını seçin.", "Seri bağlantı noktası seç", JOptionPane.QUESTION_MESSAGE, null, Serial.list (), 0);

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

geçersiz kurulum () {boyut (500, 250); openSerialPort (); }

boşluk draw () {background (0);

(255) doldurmak; int y = 24, dy = 12; metin ("Menüler", 12, y);

y + = dy; metin ("p: seri bağlantı noktası seç", 12, y); y + = dy;

metin ("1: hız 0,001 inç", 12, y); y + = dy; metin ("2: hız 0.010 inç", 12, y); y + = dy;

metin ("3: hız 0,100 inç", 12, y); y + = dy; metin ("Yön Tuşları: x-y Düzlemi", 12, y);

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

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

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

y + = dy; metin ("x: Çizimi Durdur", 12, y); y + = dy; y = yükseklik - dy;

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

metin ("güncel seri bağlantı noktası:" + bağlantı noktası adı, 12, y); y - = dy; }

void keyPressed () {if (key == '1') hız = 0.001; eğer (anahtar == '2') hız = 0.01;

eğer (anahtar == '3') hız = 0.1; if (! streaming) {

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

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

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

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

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

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

if (key == 'h') port.write ("G90 nG20 nG00 X0.000 Y0.000 Z0.000 n"); if (key == '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 (key == 'e') port.write ("$ 16 = 1 n"); if (key == 'd') port.write ("$ 16 = 0 n");

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

if (! streaming && key == 'g') {gcode = null; = 0; Dosya dosyası = null; println ("Dosya yükleniyor …"); selectInput ("İşlenecek bir dosya seçin:", "fileSelected", dosya); } if (key == 'x') streaming = false; }

void fileSelected (Dosya seçimi) {if (selection == null) {println ("Pencere kapatıldı veya kullanıcı iptal etti."); }

else {println ("Kullanıcı seçildi" + selection.getAbsolutePath ());

gcode = loadStrings (selection.getAbsolutePath ()); if (gcode == null) dönüş;

akış = true; Akış(); }}

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

akış = yanlış; dönüş; } if (gcode i.trim (). uzunluk () == 0) i ++; başka bir mola; }

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

void serialEvent (Seri p) {Dize s = p.readStringUntil (' n'); println (s.trim ());

if (s.trim (). başlarWith ("ok")) stream ();

if (s.trim (). startsWith ("error")) stream (); // XXX: gerçekten mi? }

Adım 7: INKSCAPE AYARLARI

INKSCAPE ile gccode çıktısı almak için, önce makerbot unicorn G-code eklentisini buradan indirin >> Inkscape gcode plugin

İnkscape projesinin tüm ayarları ve detayları >> Arduino cnc projesi

Adım 8: Lütfen, Projeye Oy Verin:)

Yarışmaya CNC ve 3D Design CONTEST 2016'da katıldım. Oyunuzu bekliyorum. Sağ üstteki "oyla" düğmesine tıklayarak oy verebilirsiniz.