Arduino Mini CNC: 8 kroków (ze zdjęciami)

Arduino Mini CNC: 8 kroków (ze zdjęciami)

Spisu treści:

Anonim

Cześć przyjaciele, w tym projekcie porozmawiamy o recyklingu uszkodzonych napędów DVD i CD-ROM i produkcji cnc po niskich kosztach. Zacznijmy budować projekt mini cnc, który rysuje

Kieszonkowe dzieci:

Krok 1: Materiały

  1. Arduino (może być nano, uno lub mega)
  2. Uszkodzona płyta DVD lub CD-ROM (silnik krokowy w środku będzie uruchomiony)
  3. 2 kawałki uszkodzonego DVD lub CD-ROM (silnik krokowy w środku będzie uruchomiony)
  4. Silnik serwo (wystarczy Mg90)
  5. Bateria lub adapter 5 V 2 A
  6. Płyta Plexi o grubości 20 x 16 cm i grubości 5 mm do utrzymania osi X.
  7. Płyta Plexi 15 x 16 cm i grubość 5 mm, aby zabezpieczyć oś Y.
  8. Do powierzchni rysunkowej można użyć płyty plexi o wymiarach 75 × 75 mm i grubości 5 mm.
  9. 1 szt. Nakrętka M5 (do zamocowania płyty)
  10. 14 sztuk nakrętki śruby M4

Krok 2: Przód i tył Przegląd Mini Cnc i objaśnienia jego części

  1. Płytka X Plexi (200x150x3 mm)
  2. Płytka Y Plexi (200x150x3 mm)
  3. Mechanizm ruchu osi X (mechanizm napędu DVD)
  4. Mechanizm ruchu osi Y (mechanizm napędowy napędu DVD)
  5. Sekcja płaszczyzny Z
  6. Siłownik
  7. Stojak na długopis
  8. Nakrętka mocująca pióro - układ śrub (1 szt. Nakrętka śruby M5)
  9. Długopis
  10. Stół do rysowania (płyta plexi 75x75x5 mm)
  11. Podpory Axis i nakrętki śrubowe
  12. Silnik krokowy do ruchu w osi X
  13. Silnik krokowy do ruchu w osi Y.
  14. Spinacze do papieru, aby zabezpieczyć papier
  15. 14 sztuk nakrętki śruby M4
  16. Uchwyt na długopis
  17. Oś Z.
  18. Kable
  19. 4 kąty
  20. Jednostka sterująca (Arduino uno, 2 l239d, pertinaks, gniazdo wejściowe energii)
  21. Kabel USB do połączenia z komputerem

Krok 3: Część mechaniczna

Użyjemy części z mechaniczną częścią DVD lub systemem szynowym wewnątrz napędu Cd-R0m. W tej sekcji silnik krokowy jest połączony z wałem ślimaka i przesuwa część czytnika laserowego, który jest połączony z wałem, obracając wał. Usuwamy tę część bez szkody. W ten sam sposób demontowany jest również drugi sterownik i instalowane są dwa systemy silników krokowych. Jeśli używasz DVD-Rom, możesz również wykonać laserową wycinarkę z jego diodami laserowymi. Są to części mechaniczne, które przesuwają osie. Wyodrębnimy inne części mechaniczne z drukarki 3D.

Możesz pobrać części stl pliki tutaj >>

Krok 4: Sekcja elektroniczna

W naszym systemie elektronicznym połączymy dwa silniki krokowe, które przesuną oś X i Y oraz jeden silnik serwo, który podniesie i obniży matrycę.

Krok 5: Część kodu Arduino

#zawierać

#zawierać

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

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

float x_adim_mm = 6.0;

float y_adim_mm = 6.0;

struct point {float x; pływak y; float z; };

struct point actuatorPos;

float StepInc = 1;

int StepDelay = 0;

int LineDelay = 50;

int penDelay = 50;

pływak Xmin = 0;

pływak Xmax = 40;

float Ymin = 0;

pływak Ymax = 40;

float Zmin = 0;

pływak Zmax = 1;

pływak Xpos = Xmin;

float Ypos = Ymin;

float Zpos = Zmax;

boolean verbose = false;

void setup () {// Ustawienia

Serial.begin (9600);

kalem_servo.attach (kalem_servo_pin);

kalem_servo.write (kalem_kaldir);

opóźnienie (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.");

}

void loop () {

opóźnienie (200);

linia char LINE_BUFFER_LENGTH;

char c; int lineIndex;

bool lineIsComment, lineSemiColon;

lineIndex = 0;

lineSemiColon = false;

lineIsComment = false;

while (1) {

while (Serial.available ()> 0) {

c = Serial.read ();

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

if (lineIndex> 0) {

line lineIndex = '0';

if (verbose) {

Serial.print („Alıcı:”);

Serial.println (linia);

}

processIncomingLine (linia, lineIndex);

lineIndex = 0; }

inaczej {

// Opróżnij lub skomentuj linię. Pomiń blok.

}

lineIsComment = false;

lineSemiColon = false;

Serial.println ("ok");

}

inaczej {

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

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

} else {

if (c <= '') {

}

else if (c == '/') {

}

else if (c == '(') {

lineIsComment = true;

}

else if (c == ';') {

lineSemiColon = true;

}

else if (lineIndex> = LINE_BUFFER_LENGTH-1) {

Serial.println ("Yazma Hatası");

lineIsComment = false;

lineSemiColon = false;

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

line lineIndex ++ = c-'a '+' A ';

} else {

line lineIndex ++ = c; }}}}}}

void processIncomingLine (char * line, int charNB) {

int currentIndex = 0; bufor char 64;

struct point newPos;

newPos.x = 0.0;

newPos.y = 0.0;

while (currentIndex <charNB) {

switch (line currentIndex ++) {

sprawa „U”:

penUp ();

złamać;

sprawa „D”:

penDown ();

złamać;

sprawa „G”:

buffer 0 = line currentIndex ++;

buffer 1 = '0';

przełącznik (atoi (bufor)) {

sprawa 0:

przypadek 1:

char * indexX = strchr (linia + currentIndex, „X”);

char * indexY = strchr (linia + currentIndex, „Y”);

if (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;

złamać; }

złamać; sprawa „M”:

buffer 0 = line currentIndex ++;

buffer 1 = line currentIndex ++;

buffer 2 = line currentIndex ++;

buffer 3 = '0'; przełącznik (atoi (bufor)) {

case 300: {char * indexS = strchr (linia + currentIndex, „S”);

sposoby float = atof (indexS + 1);

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

} if (Spos == 50) {

penUp (); } złamać;

} sprawa 114:

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

Serial.print (actuatorPos.x);

Serial.print ("- Y =");

Serial.println (actuatorPos.y);

złamać; domyślna:

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

Serial.println (bufor); }}}

}

void drawLine (float x1, float y1) {

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

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

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

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

if (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; długi dx = abs (x1-x0); long dy = abs (y1-y0); int sx = x0

długo i; długo ponad = 0;

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

opóźnienie (StepDelay); }} else {for (i = 0; i = dy) {over- = dy; x_ekseni.step (sx); } delay (StepDelay); }}

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

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

if (verbose) {Serial.print ("Going to ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); }

opóźnienie (LineDelay);

Xpos = x1; Ypos = y1; }

void penUp () {kalem_servo.write (kalem_kaldir); opóźnienie (LineDelay);

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

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

opóźnienie (LineDelay); Zpos = Zmin; if (verbose) {

Serial.println („Pen down”); }}

Krok 6: Kod przetwarzania

import java.awt.event.KeyEvent;

import javax.swing.JOptionPane;

import processing.serial. *;

Port szeregowy = null;

String portname = null;

strumieniowanie boolowskie = false;

prędkość pływaka = 0,001;

String gcode; int i = 0;

void openSerialPort () {

if (portname == null) return;

if (port! = null) port.stop (); port = new Serial (this, portname, 9600); port.bufferUntil ('n'); }

void selectSerialPort () {

String result = (String) JOptionPane.showInputDialog (ramka, "Wybierz port szeregowy odpowiadający twojej karcie Arduino.", "Port szeregowy seç", JOptionPane.QUESTION_MESSAGE, null, Serial.list (), 0);

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

void setup () {size (500, 250); openSerialPort (); }

void draw () {background (0);

fill (255); int y = 24, dy = 12; tekst („Menuler”, 12, y);

y + = dy; tekst („p: port szeregowy seç”, 12, y); y + = dy;

tekst („1: hz 0,001 cala”, 12, y); y + = dy; tekst („2: hz 0.010 cala”, 12, y); y + = dy;

tekst („3: hız 0,100 cala”, 12, y); y + = dy; tekst („Yön Tuşları: x-y Düzlemi”, 12, y);

y + = dy; tekst („Sayfa aşağı-yukarı: z eksen”, 12, y); y + = dy;

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

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

y + = dy; tekst („x: imiizimi Durdur”, 12, y); y + = dy; y = wysokość - dy;

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

tekst („port szeregowy güncel:” + nazwa portu, 12, y); y - = dy; }

void keyPressed () {if (klucz == '1') prędkość = 0,001; if (klucz == '2') prędkość = 0,01;

jeśli (klucz == '3') prędkość = 0,1; if (! streaming) {

if (keyCode == LEFT) port.write ("G91 ng20 ng00 X-" + prędkość + "Y0.000 Z0.000 n");

if (keyCode == PRAWY) port.write ("G91 ng20 ng00 X" + prędkość + "Y0.000 Z0.000 n");

if (keyCode == UP) port.write ("G91 ng20 ng00 X0.000 Y" + prędkość + "Z0.000 n");

if (keyCode == DOWN) port.write ("G91 ng20 ng00 X0.000 Y-" + prędkość + "Z0.000 n");

if (keyCode == KeyEvent.VK_PAGE_UP) port.write ("G91 ng20 ng00 X0.000 Y0.000 Z" + prędkość + "n");

if (keyCode == KeyEvent.VK_PAGE_DOWN) port.write ("G91 ng20 ng00 X0.000 Y0.000 Z-" + prędkość + "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 (klucz == '0') openSerialPort (); if (klucz == 'p') selectSerialPort (); if (key == '$') port.write ("$$ n"); }

if (! streaming && key == 'g') {gcode = null; i = 0; Plik pliku = null; println („Ładowanie pliku …”); selectInput („Wybierz plik do przetworzenia:”, „fileSelected”, plik); } if (key == 'x') streaming = false; }

void fileSelected (Wybór pliku) {if (selection == null) {println ("Okno zostało zamknięte lub użytkownik nacisnął Anuluj."); }

else {println ("Wybrano użytkownika" + selection.getAbsolutePath ());

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

streaming = true; strumień(); }}

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

streaming = false; powrót; } if (gcode i.trim (). length () == 0) i ++; jeszcze złamać; }

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: naprawdę? }

Krok 7: WPROWADŹ USTAWIENIA

Aby uzyskać wyjście gccode za pomocą INKSCAPE, najpierw pobierz wtyczkę G-code z makerbot unicorn tutaj >> Wtyczka gcode Inkscape

Pejzaż pełne ustawienia i szczegóły projektu >> Arduino cnc project

Krok 8: Proszę, zagłosuj na projekt:)

Dołączyłem do konkursu w KONKURSIE CNC i 3D Design 2016. Czekam na twój głos. Możesz głosować, klikając przycisk „głosuj” w prawym górnym rogu. Z góry dziękuję:)