Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Wie man einen Mini-CNC-2D-Plotter mit einem Schrott-DVD-Laufwerk herstellt, L293D

Komponenten und Verbrauchsmaterialien

Arduino UNO
Maschinengehirn
× 1
L293D-Motorschild
Schrittmotoren der Achse steuern
× 1
Tower Pro Servomotor 9g
Zaxis-Bewegungsstift NACH OBEN &Stift NACH UNTEN
× 1
DVD verschrotten Dr
mechanische X-Achse &Y-Achse
× 1
Jumper (generisch)
× 1

Apps und Onlinedienste

Arduino-IDE
IDE verarbeiten
Inkscape

Über dieses Projekt

Ordnen Sie zwei Schrott-DVD-Laufwerke wie in Bild gezeigt an

1. Arduino-IDE herunterladen

2. Verarbeitungs-IDE herunterladen

3. Öffnen Sie die Arduino IDE und laden Sie den heruntergeladenen Code von hier .

4. Öffnen Sie die Verarbeitungs-IDE und laden Sie den heruntergeladenen Code von hier .

Öffnen Sie das Schrott-DVD-Laufwerk und entfernen Sie das interne Verschiebefach. Dieses Tablett mit einem Stepper-Mechanismus fungiert als unsere X-Achse und Y-Achse. Gehen Sie die beigefügten Bilder durch, um zu verstehen, wie Sie Ihre Maschine zusammenbauen. Machen Sie ein Loch in ein leeres DVD-Laufwerkgehäuse. Montieren Sie unsere X-Achse und Y-Achse mit Hilfe von Mutterschrauben auf dem jeweiligen DVD-Gehäuse.

Platzieren Sie sie nun senkrecht zueinander.

G-Code

Um G-Code-Dateien zu erstellen, die mit dieser CNC-Maschine kompatibel sind, müssen Sie Inkscape verwenden.

Inkscape ist eine professionelle Vektorgrafiksoftware, die auf Windows, Mac OS X und Linux läuft. Es wird von Designprofis und Bastlern weltweit verwendet, um eine Vielzahl von Grafiken wie Illustrationen, Icons, Logos, Diagramme, Karten und Webgrafiken zu erstellen. Inkscape verwendet den offenen W3C-Standard SVG (Scalable Vector Graphics) als natives Format und ist eine kostenlose Open-Source-Software. Laden Sie Inkscape von hier herunter und installieren Sie es.

(Wichtig :Version 0.48.5 herunterladen) Jetzt müssen Sie ein Add-on installieren, das den Export von Bildern in G-Code-Dateien ermöglicht. Dieses Add-On finden Sie hier mit Installationshinweisen.

Bitte folgen Sie dem Video auf YouTube, wie Sie eine G-Code-Datei erstellen.

  • Laden Sie die gctrl-Datei in die Verarbeitungs-IDE hoch und klicken Sie im Verarbeitungsfenster auf die Schaltfläche PLAY.
  • Drücken Sie zuerst 'p', um Ihren Kommunikationsport auszuwählen
  • Wenn Sie möchten, können Sie die Jog-Geschwindigkeit einstellen, indem Sie die Taste 1,2 oder 3 auf der Tastatur drücken
  • Drücken Sie 'g', um die G-Code-Datei zu laden
  • Ihre Maschine ist bereit zum Plotten, sobald Sie die Eingabetaste drücken, indem Sie die g-Code-Datei auswählen

Jetzt ist Ihr Plotter fertig. Einige fertige Links zum Herunterladen von G-Code-Dateien:

  • 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

Danke für Ihre Aufmerksamkeit! Besuchen Sie diesen Link für eine vollständige Illustration.

Video, um die Maschine live zu sehen:

Code

  • Arduino-CNC-Code
  • Verarbeitungscode
Arduino CNC-CodeArduino
Laden Sie diesen Code auf Arduino
#include #include #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP;// Servoposition für Up und Down const int penZUp =95;const int penZDown =83; // Servo auf PWM-Pin 10const int penServoPin =10; // Sollte für DVD-Stepper richtig sein, ist aber hier nicht zu wichtig const int stepsPerRevolution =48; // Servo-Objekt erstellen, um ein Servo zu steuern Servo penServo; // Initialisieren Sie Stepper für die X- und Y-Achse mit diesen Arduino-Pins für die L293D H-bridgeAF_Stepper myStepperY(stepsPerRevolution,1); AF_Stepper myStepperX(stepsPerRevolution,2); /* Strukturen, globale Variablen */struct point { float x; schweben y; Schwimmer z; };// Aktuelle Position von Plotheadstruct Point ActuatorPos;// Zeichnungseinstellungen, sollten OK seinfloat StepInc =1;int StepDelay =0;int LineDelay =0;int penDelay =50;// Motorschritte um 1 Millimeter zu gehen.// Use Testskizze, um 100 Schritte zu gehen. Messen Sie die Länge der Linie. // Schritte pro mm berechnen. Geben Sie hier ein.float StepsPerMillimeterX =100.0;float StepsPerMillimeterY =100.0;// Zeichenrobotergrenzen in mm// OK für den Anfang. Könnte bei guter Kalibrierung bis zu 50 mm betragen. Schwimmer Xmin =0; Schwimmer Xmax =40; Schwimmer Ymin =0; Schwimmer Ymax =40; Schwimmer Zmin =0; Schwimmer Zmax =1; Schwimmer Xpos =Xmin; Schwimmer Ypos =Ymin; Schwimmer Zpos =Zmax; // Auf true setzen, um Debug-Ausgabe zu erhalten.boolean verbose =false; // Muss interpretiert werden // G1 zum Verschieben // G4 P300 (150 ms warten) // M300 S30 (Stift unten) // M300 S50 (Stift oben)/ / Verwerfe alles mit einem (// Verwerfe jeden anderen Befehl!/************************ * void setup() - Initialisierungen ******* ****************/void setup () {// Setup Serial.begin (9600); penServo.attach (penServoPin); penServo.write (penZUp); delay (100); // Verringern Sie bei Bedarf myStepperX.setSpeed(600); myStepperY.setSpeed(600); // Setzen und bewegen in die anfängliche Standardposition // TBD // Benachrichtigungen!!! Serial.println("Mini CNC Plotter alive and kicking! "); Serial.print ("X-Bereich ist von"); Serial.print (Xmin); Serial.print (" bis "); Serial.print (Xmax); Serial.println (" mm."); Serial. print("Y-Bereich ist von"); Serial.print(Ymin); Serial.print(" bis "); Serial.print(Ymax); Serial.println("mm.");}/***** **************** * void loop() - Hauptschleife ************************/void Schleife () { Verzögerung (100); Zeichenzeile [ LINE_BUFFER_LENGTH ]; Zeichen c; int lineIndex; bool lineIsComment, lineSemiColon; Zeilenindex =0; lineSemiColon =false; lineIsComment =false; while (1) {// Serieller Empfang - Meist von Grbl, Semikolon-Unterstützung hinzugefügt while ( Serial.available ()> 0 ) { c =Serial.read (); if (( c =='\n') || (c =='\r') ) { // Zeilenende erreicht if ( lineIndex> 0 ) { // Zeile ist vollständig. Dann ausführen! line[ lineIndex ] ='\0'; // Zeichenfolge beenden if (ausführlich) { Serial.print ( "Received:"); Serial.println (Zeile); } processIncomingLine( line, lineIndex ); Zeilenindex =0; } else { // Leere oder Kommentarzeile. Block überspringen. } lineIsComment =false; lineSemiColon =false; Serial.println("ok"); } else { if ( (lineIsComment) || (lineSemiColon) ) { // Alle Kommentarzeichen wegwerfen if ( c ==')' ) lineIsComment =false; // Ende des Kommentars. Zeile fortsetzen. } else { if ( c <=' ' ) { // Leerzeichen und Steuerzeichen wegwerfen } else if ( c =='/' ) { // Blocklöschen nicht unterstützt. Charakter ignorieren. } else if ( c =='(' ) { // Kommentar-Flag aktivieren und alle Zeichen bis ')' oder EOL ignorieren. lineIsComment =true; } else if (c ==';') { lineSemiColon =true; aufrechtzuerhalten. Sonst if (lineIndex>=LINE_BUFFER_LENGTH-1) { Serial.println ( "ERROR - lineBuffer overflow"); lineIsComment =false; lineSemiColon =false; } else if ( c>='a' &&c <='z' ) { // Großbuchstaben line[ lineIndex++ ] =c-'a'+'A'; } else { line[ lineIndex++ ] =c; } } } } }}void processIncomingLine (char* line, int charNB) {int currentIndex =0; Zeichenpuffer[64]; // Hoffe, dass 64 für 1 Parameter-Strukturpunkt ausreicht newPos; newPos.x =0.0; newPos.y =0,0; // Muss interpretieren // G1 zum Bewegen // G4 P300 (150 ms warten) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (Stift runter) // M300 S50 (Stift hoch) // Alles mit a . verwerfen ( // Alle anderen Befehle verwerfen! while( currentIndex =Xmax) { x1 =Xmax; } if (x1 <=Xmin) { x1 =Xmin; } wenn (y1>=Ymax) {y1 =Ymax; } wenn (y1 <=Ymin) {y1 =Ymin; aufrechtzuerhalten. Wenn (ausführlich) {Serial.print ("Xpos, Ypos:"); Serial.print (Xpos); Serial.print (","); Serial.print (Ypos); Serial.println(""); aufrechtzuerhalten. Wenn (ausführlich) {Serial.print("x1, y1:"); Seriendruck (x1); Serial.print (","); Serial.print (y1); Serial.println(""); } // Koordinaten in Schritte umwandeln x1 =(int)(x1*StepsPerMillimeterX); y1 =(int)(y1*SchrittePerMillimeterY); Float x0 =Xpos; Schwimmer y0 =Ypos; // Lassen Sie uns die Änderung der Koordinaten herausfinden long dx =abs(x1-x0); langes dy =abs(y1-y0); int sx =x0 dy) { for (i=0; i=dx) { over-=dx; myStepperY.onestep(sy,STEP); } Verzögerung (Schrittverzögerung); } } else { for (i=0; i=dy) { over-=dy; myStepperX.onestep(sx,STEP); } Verzögerung (Schrittverzögerung); }} if (ausführlich) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print (","); Serial.print (dy); Serial.println(""); } Wenn (ausführlich) {Serial.print ("Gehe zu ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); } // Verzögerung, bevor die nächsten Zeilen gesendet werden delay(LineDelay); // Aktualisieren Sie die Positionen Xpos =x1; Ypos =y1;} // Erhöht Penvoid penUp () { penServo.write (penZUp); Verzögerung (penDelay); Zpos=Zmax; digitalWrite(15, LOW); digitalWrite (16, HOCH); if (ausführlich) { Serial.println ( "Stift hoch!"); } } // Senkt Penvoid penDown () { penServo.write (penZDown); Verzögerung (penDelay); Zpos=Zmin; digitalWrite(15, HOCH); digitalWrite(16, LOW); if (ausführlich) { Serial.println ( "Stift runter."); } }
VerarbeitungscodeJava
Laden Sie diesen Code in Processing IDE hoch.
import java.awt.event.KeyEvent;import javax.swing.JOptionPane;import processing.serial.*;Serial port =null;// Wählen Sie die entsprechende Zeile für Ihr Betriebssystem aus und ändern Sie sie/ / Null belassen, um den interaktiven Port zu verwenden (drücken Sie 'p' im Programm)String portname =null; //String portname =Serial.list()[0]; // Mac OS X // String portname ="/dev/ttyUSB0"; // Linux//String portname ="COM6"; // Windowsboolean streaming =false;float speed =0.001;String[] gcode;int i =0;void openSerialPort(){ if (portname ==null) return; if (port !=null) port.stop(); Port =neue Seriennummer (dieser, Portname, 9600); port.bufferUntil('\n');}void selectSerialPort(){ String result =(String) JOptionPane.showInputDialog(frame, "Wählen Sie den seriellen Port aus, der Ihrem Arduino-Board entspricht.", "Select serial port", JOptionPane. QUESTION_MESSAGE, null, Serial.list(), 0); if (result !=null) { portname =result; openSerialPort(); }}void setup () { size (500, 250); openSerialPort();}void draw(){ background(0); füllen(255); int y =24, dy =12; text("ANLEITUNG", 12, y); y +=dy; text("p:Seriellen Port auswählen", 12, y); y +=dy; text("1:setze die Geschwindigkeit auf 0,001 Zoll (1 mil) pro Schritt", 12, y); y +=dy; text("2:setze die Geschwindigkeit auf 0,010 Zoll (10 mil) pro Schritt", 12, y); y +=dy; text("3:setze die Geschwindigkeit auf 0,100 Zoll (100 mil) pro Schritt", 12, y); y +=dy; text("Pfeiltasten:Jog in x-y-Ebene", 12, y); y +=dy; text("Bild hoch &Bild runter:Jog in Z-Achse", 12, y); y +=dy; text("$:grbl-Einstellungen anzeigen", 12, y); y+=dy; text("h:nach Hause gehen", 12, y); y +=dy; text("0:Nullmaschine (auf den aktuellen Standort zurücksetzen)", 12, y); y +=dy; text("g:eine G-Code-Datei streamen", 12, y); y +=dy; text("x:Streaming von G-Code stoppen (dies ist NICHT sofort)", 12, y); y +=dy; y =Höhe - dy; text("aktuelle Jog-Geschwindigkeit:" + Geschwindigkeit + " Zoll pro Schritt", 12, y); y -=dy; text("aktueller serieller Port:" + Portname, 12, y); y -=dy;}void keyPressed(){ if (key =='1') speed =0.001; if (Taste =='2') Geschwindigkeit =0,01; if (Taste =='3') Geschwindigkeit =0,1; if (!streaming) { if (keyCode ==LEFT) port.write("G91\nG20\nG00 X-" + Geschwindigkeit + "Y0.000 Z0.000\n"); if (keyCode ==RIGHT) port.write("G91\nG20\nG00 X" + Geschwindigkeit + " Y0.000 Z0.000\n"); if (keyCode ==UP) port.write("G91\nG20\nG00 X0.000 Y" + Geschwindigkeit + "Z0.000\n"); if (keyCode ==DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + Geschwindigkeit + "Z0.000\n"); if (keyCode ==KeyEvent.VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + Geschwindigkeit + "\n"); if (keyCode ==KeyEvent.VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + Geschwindigkeit + "\n"); if (Schlüssel =='h') port.write("G90\nG20\nG00 X0.000 Y0.000 Z0.000\n"); if (Schlüssel =='v') port.write("$0=75\n$1=74\n$2=75\n"); //if (Schlüssel =='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 (Schlüssel =='0') openSerialPort(); if (Schlüssel =='p') selectSerialPort(); if (key =='$') port.write("$$\n"); } if (!streaming &&key =='g') { gcode =null; ich =0; Dateidatei =null; println("Datei wird geladen..."); selectInput("Wählen Sie eine zu verarbeitende Datei aus:", "fileSelected", file); } if (key =='x') streaming =false;}void fileSelected(Dateiauswahl) { if (selection ==null) { println("Fenster wurde geschlossen oder der Benutzer hat auf Abbrechen geklickt."); } else { println("Benutzer ausgewählt" + selection.getAbsolutePath()); gcode =loadStrings(selection.getAbsolutePath()); if (gcode ==null) return; Streaming =wahr; Strom(); }}void stream(){ if (!streaming) return; while (true) { if (i ==gcode.length) { streaming =false; Rückkehr; } if (gcode[i].trim().length() ==0) i++; sonst brechen; } 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("Fehler")) stream(); // XXX:wirklich?}

Schaltpläne

Verbinden Sie alle Komponenten wie in Abbildung gezeigt

Herstellungsprozess

  1. Machen Sie eine DIY-Hausaufgaben-Schreibmaschine zu Hause
  2. Erstellen von Monitor-Ambilight mit Arduino
  3. Robotersystem zur Erkennung von Menschen mit Arduino Uno
  4. Android-gesteuertes Spielzeug mit Raspberry Motor Shield
  5. So erstellen Sie eine anpassbare stanzbare Tastaturtaste
  6. So misst man die Masse der Erde mit Arduino
  7. So erstellen Sie eine Website, die Arduino mithilfe von PHP kommuniziert
  8. Wie man mit einem Arduino Musik macht
  9. Wie erstelle ich eine Arduino-basierte automatische Türöffnung
  10. So erstellen Sie einen Kompass mit Arduino und Processing IDE