![Arduino Mini CNC: 8 kroków (ze zdjęciami) Arduino Mini CNC: 8 kroków (ze zdjęciami)](https://img.gwsigeps.com/img/img/blank.jpg)
Spisu treści:
- Kieszonkowe dzieci:
- Krok 1: Materiały
- Krok 2: Przód i tył Przegląd Mini Cnc i objaśnienia jego części
- Krok 3: Część mechaniczna
- Krok 4: Sekcja elektroniczna
- Krok 5: Część kodu Arduino
- Krok 6: Kod przetwarzania
- Krok 7: WPROWADŹ USTAWIENIA
- Krok 8: Proszę, zagłosuj na projekt :)
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
- Arduino (może być nano, uno lub mega)
- Uszkodzona płyta DVD lub CD-ROM (silnik krokowy w środku będzie uruchomiony)
- 2 kawałki uszkodzonego DVD lub CD-ROM (silnik krokowy w środku będzie uruchomiony)
- Silnik serwo (wystarczy Mg90)
- Bateria lub adapter 5 V 2 A
- Płyta Plexi o grubości 20 x 16 cm i grubości 5 mm do utrzymania osi X.
- Płyta Plexi 15 x 16 cm i grubość 5 mm, aby zabezpieczyć oś Y.
- Do powierzchni rysunkowej można użyć płyty plexi o wymiarach 75 × 75 mm i grubości 5 mm.
- 1 szt. Nakrętka M5 (do zamocowania płyty)
- 14 sztuk nakrętki śruby M4
Krok 2: Przód i tył Przegląd Mini Cnc i objaśnienia jego części
- Płytka X Plexi (200x150x3 mm)
- Płytka Y Plexi (200x150x3 mm)
- Mechanizm ruchu osi X (mechanizm napędu DVD)
- Mechanizm ruchu osi Y (mechanizm napędowy napędu DVD)
- Sekcja płaszczyzny Z
- Siłownik
- Stojak na długopis
- Nakrętka mocująca pióro - układ śrub (1 szt. Nakrętka śruby M5)
- Długopis
- Stół do rysowania (płyta plexi 75x75x5 mm)
- Podpory Axis i nakrętki śrubowe
- Silnik krokowy do ruchu w osi X
- Silnik krokowy do ruchu w osi Y.
- Spinacze do papieru, aby zabezpieczyć papier
- 14 sztuk nakrętki śruby M4
- Uchwyt na długopis
- Oś Z.
- Kable
- 4 kąty
- Jednostka sterująca (Arduino uno, 2 l239d, pertinaks, gniazdo wejściowe energii)
- 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”); }} 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ę? } 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 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ę:)Krok 6: Kod przetwarzania
Krok 7: WPROWADŹ USTAWIENIA
Krok 8: Proszę, zagłosuj na projekt:)