Hoe maak je een mini CNC 2D-plotter met een schroot dvd-station, L293D
Componenten en benodigdheden
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Apps en online services
| ||||
| ||||
|
Over dit project
Schik twee schroot-dvd-stations zoals weergegeven in afbeelding
Open het schroot-dvd-station en verwijder de interne bewegende lade. Deze lade met een stappenmechanisme erop, zal fungeren als onze X-as en Y-as. Bekijk de bijgevoegde afbeeldingen om te begrijpen hoe u uw machine in elkaar zet. Maak een gat in de lege dvd-drivebehuizing en monteer onze X-as en Y-as op de respectievelijke dvd-behuizing met behulp van moerbouten.
Plaats ze nu loodrecht op elkaar.
G-code
Om g-code-bestanden te maken die compatibel zijn met deze CNC-machine, moet u de Inkscape gebruiken.
Inkscape is vector grafische software van professionele kwaliteit die draait op Windows, Mac OS X en Linux. Het wordt gebruikt door ontwerpprofessionals en hobbyisten over de hele wereld, voor het maken van een breed scala aan afbeeldingen, zoals illustraties, pictogrammen, logo's, diagrammen, kaarten en webafbeeldingen. Inkscape gebruikt de W3C open standaard SVG (Scalable Vector Graphics) als zijn eigen formaat en is gratis en open-source software. Download en installeer Inkscape hier.
(Belangrijk :download 0.48.5-versie) Nu moet u een add-on installeren waarmee u afbeeldingen naar g-code-bestanden kunt exporteren. Deze add-on is hier te vinden met installatie-opmerkingen.
Volg de video op YouTube hoe u een G-code-bestand maakt.
- Upload het gctrl-bestand naar de verwerkings-IDE en klik op de PLAY-knop in het verwerkingsvenster.
- Druk eerst op 'p' om uw communicatiepoort te selecteren
- Als je wilt, kun je de jog-snelheid instellen door op de 1,2 of 3 knop op het toetsenbord te drukken
- Druk op 'g' om het G-codebestand te laden
- Uw machine is klaar om te plotten zodra u op enter drukt door g-code-bestand te selecteren
Nu is je plotter klaar. Enkele kant-en-klare downloadlinks voor G-code-bestanden:
- https://www.dropbox.com/s/bazynxife4k1trv/Hisoka.gcode?dl=0
- https://www.dropbox.com/s/h6bkdr5lhegbj6a/papay.gcode?dl=0
- https://www.dropbox.com/s/ueku5ckt6m4cmg4/spong1.gcode?dl=0
Bedankt voor uw aandacht! Bezoek deze link voor een volledige illustratie.
Video om de machine live te zien:
Code
- Arduino CNC-code
- Verwerkingscode
Arduino CNC-codeArduino
Upload deze code naar Arduino#include#include #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP;// Servopositie voor omhoog en omlaag const int penZUp =95;const int penZDown =83; // Servo op PWM-pin 10const int penServoPin =10;// Zou goed moeten zijn voor dvd-steppers, maar is niet zo belangrijk hierconst int stepsPerRevolution =48; // maak een servo-object om een servo Servo penServo te besturen; // Initialiseer steppers voor X- en Y-as met behulp van deze Arduino-pinnen voor de L293D H-bridgeAF_Stepper myStepperY(stepsPerRevolution,1); AF_Stepper myStepperX(stepsPerRevolution,2); /* Structuren, globale variabelen */struct point { float x; zweven y; zweven z; };// Huidige positie van plotheadstruct point actuatorPos;// Tekeninstellingen, moeten OKfloat StepInc =1;int StepDelay =0;int LineDelay =0;int penDelay =50;// Motorstappen te gaan van 1 millimeter.// Gebruik test schets om 100 stappen te gaan. Meet de lengte van de lijn. // Bereken stappen per mm. Voer hier in.float StepsPerMillimeterX =100,0;float StepsPerMillimeterY =100,0;// Robotlimieten tekenen, in mm// OK om mee te beginnen. Kan oplopen tot 50 mm als goed gekalibreerd. float Xmin =0;float Xmax =40;float Ymin =0;float Ymax =40;float Zmin =0;float Zmax =1;float Xpos =Xmin;float Ypos =Ymin;float Zpos =Zmax; // Stel in op true om debug-uitvoer te krijgen.boolean verbose =false;// Moet worden geïnterpreteerd // G1 voor verplaatsen// G4 P300 (wacht 150 ms)// M300 S30 (pen omlaag)// M300 S50 (pen omhoog)/ / Gooi alles weg met een (// Gooi een ander commando weg!/********************** * void setup() - Initialisaties ******* ****************/void setup() {// Setup Serial.begin (9600); penServo.attach(penServoPin); penServo.write(penZUp); delay(100); // Verlaag indien nodig myStepperX.setSpeed(600); myStepperY.setSpeed(600); // Instellen en verplaatsen naar de oorspronkelijke standaardpositie // TBD // Meldingen!!! Serial.println("Mini CNC Plotter springlevend! "); Serial.print("X-bereik is van "); Serial.print(Xmin); Serial.print(" tot "); Serial.print(Xmax); Serial.println(" mm."); Serial. print("Y-bereik is van "); Serial.print(Ymin); Serial.print(" tot "); Serial.print(Ymax); Serial.println(" mm."); }/***** **************** * void loop() - Hoofdlus *********************/void loop () {vertraging (100); tekenregel [LINE_BUFFER_LENGTH]; char c; int lineIndex; bool lineIsComment, lineSemiColon; lineIndex =0; lineSemiColon =onwaar; lineIsComment =onwaar; while (1) { // Seriële ontvangst - Meestal van Grbl, ondersteuning voor puntkomma's toegevoegd while ( Serial.available()>0) { c =Serial.read(); if (( c =='\n') || (c =='\r') ) { // Einde van regel bereikt if ( lineIndex> 0 ) { // Regel is voltooid. Voer dan uit! line[ lineIndex ] ='\0'; // Beëindig string if (uitgebreide) { Serial.print ("Ontvangen:"); Serieel.println( regel ); } processIncomingLine( lijn, lineIndex ); lineIndex =0; } else { // Lege of commentaarregel. Blok overslaan. } lineIsComment =onwaar; lineSemiColon =onwaar; Serieel.println("ok"); } else { if ( (lineIsComment) || (lineSemiColon)) { // Gooi alle commentaartekens weg if (c ==')') lineIsComment =false; // Einde reactie. Hervat lijn. } else { if (c <=' ') { // Gooi witruimte en controletekens weg } else if (c =='/') { // Blokkeren verwijderen wordt niet ondersteund. Negeer karakter. } else if ( c =='(' ) { // Activeer de opmerkingenvlag en negeer alle tekens tot ')' of EOL. lineIsComment =waar; } else if ( c ==';' ) { lineSemiColon =true; } else if ( lineIndex>=LINE_BUFFER_LENGTH-1 ) { Serial.println ("ERROR - lineBuffer overflow"); lineIsComment =onwaar; lineSemiColon =onwaar; } else if ( c>='a' &&c <='z' ) { // Hoofdletters regel [lineIndex++ ] =c-'a'+'A'; } else { line[ lineIndex++ ] =c; } } } } }} ongeldig procesIncomingLine (char * regel, int charNB) {int currentIndex =0; char-buffer [ 64 ]; // Hoop dat 64 genoeg is voor 1 parameter struct point newPos; nieuwPos.x =0.0; nieuwPos.y =0.0; // Behoefte om te interpreteren // G1 voor verplaatsen // G4 P300 (wacht 150ms) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (pen omlaag) // M300 S50 (pen omhoog) // Gooi alles weg met een (// Gooi een ander commando weg! while(currentIndex =Xmax) { x1 =Xmax; } if (x1 <=Xmin) { x1 =Xmin; } if (y1>=Ymax) { y1 =Ymax; } if (y1 <=Ymin) { y1 =Ymin; } if (uitgebreide) { Serial.print("Xpos, Ypos:"); Seriële.print(Xpos); Serieel.print(","); Seriële.afdruk (Ypos); Serieel.println(""); } if (uitgebreide) { Serial.print("x1, y1:"); Seriële.print(x1); Serieel.print(","); Seriële.print(y1); Serieel.println(""); } // Converteer coördinaten naar stappen x1 =(int) (x1*StepsPerMillimeterX); y1 =(int)(y1*StepsPerMillimeterY); zweven x0 =Xpos; zweven y0 =Ypos; // Laten we eens kijken wat de verandering is voor de coördinaten long dx =abs(x1-x0); lange dy =abs(y1-y0); int sx =x0 dy) { for (i=0; i =dx) { over-=dx; myStepperY.onestep(sy,STEP); } vertraging (StapDelay); } } else { for (i=0; i =dy) { over-=dy; myStepperX.onestep(sx,STEP); } vertraging (StapDelay); } } if (uitgebreide) { Serial.print("dx, dy:"); Seriële.print(dx); Serieel.print(","); Serial.print(dy); Serieel.println(""); } if (uitgebreid) { Serial.print("Ga naar ("); Serial.print(x0); Serial.print(","); Serial.print(y0); Serial.println(")"); } // Vertraging voordat volgende regels worden ingediend vertraging (LineDelay); // Update de posities Xpos =x1; Ypos =y1;}// Verhoogt penvoid penUp() { penServo.write(penZUp); vertraging (penDelay); Zpos=Zmax; digitalWrite (15, LAAG); digitalWrite (16, HOOG); if (uitgebreid) { Serial.println ("Pen op!"); } }// Verlaagt penDown() { penServo.write(penZDown); vertraging (penDelay); Zpos=Zmin; digitalWrite (15, HOOG); digitalWrite (16, LAAG); if (uitgebreide) { Serial.println ("Pen neer."); } }
VerwerkingscodeJava
Upload deze code naar Processing IDEimport java.awt.event.KeyEvent;import javax.swing.JOptionPane;import processing.serial.*;Serial port =null;// selecteer en wijzig de juiste regel voor uw besturingssysteem/ / laat als null achter om interactieve poort te gebruiken (druk op 'p' in het programma)String poortnaam =null;//String poortnaam =Serial.list()[0]; // Mac OS X//String poortnaam ="/dev/ttyUSB0"; // Linux//String poortnaam ="COM6"; // Windowsboolean streaming =false;float speed =0.001;String[] gcode;int i =0;void openSerialPort(){ if (portname ==null) return; if (poort !=null) poort.stop(); poort =nieuw serieel (dit, poortnaam, 9600); port.bufferUntil('\n');}void selectSerialPort(){ String result =(String) JOptionPane.showInputDialog(frame, "Selecteer de seriële poort die overeenkomt met uw Arduino-bord.", "Selecteer seriële poort", JOptionPane. QUESTION_MESSAGE, null, Serial.list(), 0); if (resultaat! =null) { poortnaam =resultaat; openSerialPort(); }} ongeldige setup(){ size(500, 250); openSerialPort();}void draw(){ background(0); vullen (255); int y =24, dy =12; text("INSTRUCTIES", 12, y); y +=dy; text("p:selecteer seriële poort", 12, y); y +=dy; text("1:zet snelheid op 0,001 inch (1 mil) per jog", 12, y); y +=dy; text("2:zet snelheid op 0,010 inch (10 mil) per jog", 12, y); y +=dy; text("3:zet snelheid op 0,100 inch (100 mil) per jog", 12, y); y +=dy; text("pijltjestoetsen:jog in xy-vlak", 12, y); y +=dy; text("pagina omhoog &pagina omlaag:jog in z-as", 12, y); y +=dy; text("$:grbl-instellingen weergeven", 12, y); y+=dy; text("h:ga naar huis", 12, y); y +=dy; text("0:zero machine (zet thuis op de huidige locatie)", 12, y); y +=dy; text("g:stream een g-code bestand", 12, y); y +=dy; text("x:stop met streamen van g-code (dit is NIET onmiddellijk)", 12, y); y +=dy; y =hoogte - dy; text("huidige jogsnelheid:" + snelheid + " inches per stap", 12, y); y -=dy; text("huidige seriële poort:" + poortnaam, 12, y); y -=dy;}void keyPressed(){ if (key =='1') speed =0.001; if (toets =='2') snelheid =0,01; if (toets =='3') snelheid =0,1; if (!streaming) { if (keyCode ==LEFT) port.write("G91\nG20\nG00 X-" + snelheid + " Y0.000 Z0.000\n"); if (keyCode ==RECHTS) port.write("G91\nG20\nG00 X" + snelheid + " Y0.000 Z0.000\n"); if (keyCode ==UP) port.write("G91\nG20\nG00 X0.000 Y" + snelheid + " Z0.000\n"); if (keyCode ==DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + snelheid + " Z0.000\n"); if (keyCode ==KeyEvent.VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + snelheid + "\n"); if (keyCode ==KeyEvent.VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + snelheid + "\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 (sleutel =='0') openSerialPort(); if (key =='p') selectSerialPort(); if (key =='$') port.write("$$\n"); } if (!streaming &&key =='g') { gcode =null; ik =0; Bestandsbestand =null; println("Bestand wordt geladen..."); selectInput("Selecteer een bestand om te verwerken:", "fileSelected", bestand); } if (key =='x') streaming =false;}void fileSelected(File selection) { if (selection ==null) { println("Venster was gesloten of de gebruiker drukte op annuleren."); } else { println("Geselecteerde gebruiker" + selection.getAbsolutePath()); gcode =loadStrings(selection.getAbsolutePath()); if (gcode ==null) terugkeer; streamen =waar; stroom(); }}void stream(){ if (!streaming) return; while (true) { if (i ==gcode.length) { streaming =false; opbrengst; } if (gcode[i].trim().length() ==0) i++; anders breken; } 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("fout")) stream(); // XXX:echt?}
Schema's
sluit alle componenten aan zoals weergegeven in afbeeldingProductieproces
- Maak thuis een zelfgemaakte schrijfmachine voor huiswerk
- Maak Monitor Ambilight met Arduino
- Human Detection Robotics System met Arduino Uno
- Android bestuurd speelgoed met Raspberry Motor Shield
- Een aanpasbare ponsbare toetsenbordknop maken
- Hoe de massa van de aarde te meten met Arduino
- Een website maken die Arduino communiceert met PHP
- Muziek maken met een Arduino
- Hoe maak je op Arduino gebaseerde automatische deuropening
- Hoe maak je een Arduino Bluetooth-gestuurde auto
- Hoe maak je een kompas met Arduino en Processing IDE?