BAĞLAN

Çizim Yapan Mini Cnc Yapımı

  • Görüntüleme 5970
  • Merhaba arkadaşlar, bu projemizde bozuk dvd ve cd-rom sürücüleri geri dönüşüme kazandırmak ve düşük maliyette cnc yapımını anlatacağım. Çizim yapan mini cnc projesinin yapımına başlayalım.

    Malzemeler:

    1. Arduino ( nano , uno, mega olabilir)
    2. Bozuk dvd veya cd-rom (içindeki step motor çalışan olacak)
    3. 2 Adet l293d veya l293b motor sürücü ya da 1 adet Adafruit Motor Sürücü
    4. Servo motor ( Mg90 yeterli)
    5. 5v  2 amper batarya veya adaptör
    6. X eksenini sabitlemek için 20 x 16 cm ve kalınlığı 5 mm olan pleksi levha.
    7. Y eksenini sabitlemek için 15x 16 cm ve kalınlığı 5 mm olan pleksi levha
    8. Çizim tablası için 75×75 mm ve kalınlığı 5 mm olan pleksi levha kullanabilirsiniz.
    9. 1 Adet M5 cıvata somun ( Kalemi sabitlemek için)
    10. 14 Adet M4 cıvata somun

    Mini cnc ‘nin ön ve arka genel görünüşü ve parçalarının açıklamaları:

    Parçaların İsimleri

    1. X düzlemi Pleksi Plaka (200x150x3 mm)
    2. Y düzlemi Pleksi Plaka ( 200x150x3 mm)
    3. X ekseni hareket mekanizması ( dvd sürücü kızak mekanizması)
    4. Y ekseni hareket mekanizması ( dvd sürücü kızak mekanizması)
    5. Z düzlemi şase kısmı
    6. Servo motor
    7. Kalem tutamacı
    8. Kalem sabitleyici somun – vida düzeneği ( 1 Adet M5 cıvata somun)
    9. Kalem
    10. Çizim tablası ( 75x75x5 mm pleksi levha)
    11. Eksen destekleri ve vida yuvaları
    12. X ekseni hareketini sağlayan step motor
    13. Y ekseni hareketini sağlayan step motor
    14. Kağıdı sabitlemek için ataç
    15. 14 Adet M4 cıvata somun
    16. Kalem tutucu destek
    17. Z ekseni mili
    18. Kablolar
    19. 4 Adet Köşebent
    20. Kontrol ünitesi ( Arduino uno , 2 adet l239d, pertinaks( delikli plaket), enerji giriş jak)
    21. Bilgisayar bağlantısı için usb kablo

    Mekanik Kısım:

    Dvd veya Cd -R0m sürücünün içindeki raylı sistem olan kısmı kullanacağız. Bu kısımda step motor sonsuz vida miline bağlı ve mil döndükçe mile bağlı olan lazer okuyucu kısmı hareket eder. Bu kısma zarar vermeden çıkarıyoruz. Aynı şekilde diğer sürücüyü de söküp toplamda iki tane step motorlu raylı sistem çıkıyor. Dvd -Rom kullandıysanız onun lazer diyotları ile kendinize lazer kesici de yapabilirsiniz. Eksenlerin hareketini sağlayacak mekanik kısım bunlar .Diğer mekanik parçaları 3d yazıcıdan çıkaracağız.

    Z ekseni şase parçası:

    Kalem Tutucu Parça:

    X ve Y Ekseni Plakalarını Birbirine Sabitleyecek Destek Parçası:

    Kalemin Üst Kısmını Tutan Parça:

    X ve Y Eksenlerinin yükselteç ve vida yatağı parçaları : 

    Parçaların stl dosyalarını buradan indirebilirsiniz >> mini cnc stl dosyaları

     

    Elektronik Kısım:

    Elektronik sistemimizde x ve y eksenini hareket ettirecek olan iki adet step motoru ve kalemi kaldırıp indirecek olan bir adet servo motorun bağlantılarını yapacağız.

    Aşağıdaki devreden bağlantıları yapınız.

    Adafruit Motor Shield için devre bağlantısı:

    Yazılım Kısmı:

    L293d-L293b Motor Sürücüleri için Arduino Yazılımı:

    #include <Servo.h>
    #include <Stepper.h>
     
    #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, 2,3,4,5); 
    Stepper x_ekseni(adim_sayisi, 6,7,8,9); 
     
    float x_adim_mm = 6.0;
    float y_adim_mm = 6.0;
     
    struct point { 
     float x; 
     float y; 
     float z; 
    };
     
    struct point actuatorPos;
     
    float StepInc = 1;
    int StepDelay = 0;
    int LineDelay = 50;
    int penDelay = 50;
    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; 
    boolean verbose = false;
     
     
    void setup() {
     // Setup
     Serial.begin( 9600 );
     kalem_servo.attach(kalem_servo_pin);
     kalem_servo.write(kalem_kaldir);
     delay(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() 
    {
     delay(200);
     char line[ 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( line ); 
     }
     processIncomingLine( line, lineIndex );
     lineIndex = 0;
     } 
     else { 
     // Empty or comment line. Skip block.
     }
     lineIsComment = false;
     lineSemiColon = false;
     Serial.println("ok"); 
     } 
     else {
     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;
     char buffer[ 64 ]; 
     struct point newPos;
     
     newPos.x = 0.0;
     newPos.y = 0.0;
     
     while( currentIndex < charNB ) {
     switch ( line[ currentIndex++ ] ) { 
     case 'U':
     penUp(); 
     break;
     case 'D':
     penDown(); 
     break;
     case 'G':
     buffer[0] = line[ currentIndex++ ]; 
     buffer[1] = '\0';
     
     switch ( atoi( buffer ) ){ 
     case 0: 
     case 1:
     char* indexX = strchr( line+currentIndex, 'X' ); 
     char* indexY = strchr( line+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; break; } break; case 'M': buffer[0] = line[ currentIndex++ ]; buffer[1] = line[ currentIndex++ ]; buffer[2] = line[ currentIndex++ ]; buffer[3] = '\0'; switch ( atoi( buffer ) ){ case 300: { char* indexS = strchr( line+currentIndex, 'S' ); float Spos = atof( indexS + 1); if (Spos == 30) { penDown(); } if (Spos == 50) { penUp(); } break; } case 114: Serial.print( "Tam Pozisyon : X = " ); Serial.print( actuatorPos.x ); Serial.print( " - Y = " ); Serial.println( actuatorPos.y ); break; default: Serial.print( "Komut Tanınmadı : M"); Serial.println( buffer ); } } } } 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;
     long dx = abs(x1-x0);
     long dy = abs(y1-y0);
     int sx = x0<x1 ? StepInc : -StepInc;
     int sy = y0<y1 ? StepInc : -StepInc; long i; long over = 0; if (dx > dy) {
     for (i=0; i<dx; ++i) { x_ekseni.step(sx); over+=dy; if (over>=dx) {
     over-=dx;
     y_ekseni.step(sy);
     }
     delay(StepDelay);
     }
     }
     else {
     for (i=0; i<dy; ++i) { y_ekseni.step(sy); over+=dx; if (over>=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(")");
     }
     
     delay(LineDelay);
     
     Xpos = x1;
     Ypos = y1;
    }
     
     
    void penUp() { 
     kalem_servo.write(kalem_kaldir); 
     delay(LineDelay); 
     Zpos=Zmax; 
     if (verbose) { 
     Serial.println("Pen up!"); 
     } 
    }
    void penDown() { 
     kalem_servo.write(kalem_indir); 
     delay(LineDelay); 
     Zpos=Zmin; 
     if (verbose) { 
     Serial.println("Pen down."); 
     } 
    }

     

    Adafruit Motor Shield İçin Arduino Yazılımı :

    #include <Servo.h>
    #include <AFMotor.h>
     
    #define LINE_BUFFER_LENGTH 512
     
    char STEP = MICROSTEP ;
     
    const int penZUp = 95;
    const int penZDown = 60;
    const int penServoPin =10 ;
    const int stepsPerRevolution = 48; 
    Servo penServo; 
    AF_Stepper myStepperY(stepsPerRevolution,1); 
    AF_Stepper myStepperX(stepsPerRevolution,2); 
    struct point { 
     float x; 
     float y; 
     float z; 
    };
     
    struct point actuatorPos;
     
    float StepInc = 1;
    int StepDelay = 0;
    int LineDelay =0;
    int penDelay = 50;
     
     
    float StepsPerMillimeterX = 100.0;
    float StepsPerMillimeterY = 100.0;
     
    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; 
     
     
    boolean verbose = false;
     
    void setup() {
     // Setup
     
     Serial.begin( 9600 );
     
     penServo.attach(penServoPin);
     penServo.write(penZUp);
     delay(100);
     
     
     myStepperX.setSpeed(600);
     
     myStepperY.setSpeed(600); 
     
     Serial.println("Mini CNC Plotter alive and kicking!");
     Serial.print("X range is from "); 
     Serial.print(Xmin); 
     Serial.print(" to "); 
     Serial.print(Xmax); 
     Serial.println(" mm."); 
     Serial.print("Y range is from "); 
     Serial.print(Ymin); 
     Serial.print(" to "); 
     Serial.print(Ymax); 
     Serial.println(" mm."); 
    }
     
    void loop() 
    {
     
     delay(100);
     char line[ 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( "Received : "); 
     Serial.println( line ); 
     }
     processIncomingLine( line, lineIndex );
     lineIndex = 0;
     } 
     else { 
     }
     lineIsComment = false;
     lineSemiColon = false;
     Serial.println("ok"); 
     } 
     else {
     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( "ERROR - lineBuffer overflow" );
     lineIsComment = false;
     lineSemiColon = false;
     } 
     else if ( c >= 'a' && c <= 'z' ) { // Upcase lowercase
     line[ lineIndex++ ] = c-'a'+'A';
     } 
     else {
     line[ lineIndex++ ] = c;
     }
     }
     }
     }
     }
    }
     
    void processIncomingLine( char* line, int charNB ) {
     int currentIndex = 0;
     char buffer[ 64 ]; // Hope that 64 is enough for 1 parameter
     struct point newPos;
     
     newPos.x = 0.0;
     newPos.y = 0.0;
     
     
     while( currentIndex < charNB ) {
     switch ( line[ currentIndex++ ] ) { 
     case 'U':
     penUp(); 
     break;
     case 'D':
     penDown(); 
     break;
     case 'G':
     buffer[0] = line[ currentIndex++ ]; 
     
     buffer[1] = '\0';
     
     switch ( atoi( buffer ) ){ 
     case 0: 
     case 1:
     // /!\ Dirty - Suppose that X is before Y
     char* indexX = strchr( line+currentIndex, 'X' ); 
     char* indexY = strchr( line+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;
     break;
     }
     break;
     case 'M':
     buffer[0] = line[ currentIndex++ ]; 
     buffer[1] = line[ currentIndex++ ];
     buffer[2] = line[ currentIndex++ ];
     buffer[3] = '\0';
     switch ( atoi( buffer ) ){
     case 300:
     {
     char* indexS = strchr( line+currentIndex, 'S' );
     float Spos = atof( indexS + 1);
     // Serial.println("ok");
     if (Spos == 30) { 
     penDown(); 
     }
     if (Spos == 50) { 
     penUp(); 
     }
     break;
     }
     case 114: 
     Serial.print( "Absolute position : X = " );
     Serial.print( actuatorPos.x );
     Serial.print( " - Y = " );
     Serial.println( actuatorPos.y );
     break;
     default:
     Serial.print( "Command not recognized : M");
     Serial.println( buffer );
     }
     }
     }
     
     
     
    }
     
    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*StepsPerMillimeterX);
     y1 = (int)(y1*StepsPerMillimeterY);
     float x0 = Xpos;
     float y0 = Ypos;
     
     long dx = abs(x1-x0);
     long dy = abs(y1-y0);
     int sx = x0<x1 ? StepInc : -StepInc;
     int sy = y0<y1 ? StepInc : -StepInc;
     
     long i;
     long over = 0;
     
     if (dx > dy) {
     for (i=0; i<dx; ++i) {
     myStepperX.onestep(sx,STEP);
     over+=dy;
     if (over>=dx) {
     over-=dx;
     myStepperY.onestep(sy,STEP);
     }
     delay(StepDelay);
     }
     }
     else {
     for (i=0; i<dy; ++i) {
     myStepperY.onestep(sy,STEP);
     over+=dx;
     if (over>=dy) {
     over-=dy;
     myStepperX.onestep(sx,STEP);
     }
     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(")");
     }
     
     delay(LineDelay);
     Xpos = x1;
     Ypos = y1;
    }
     
    void penUp() { 
     penServo.write(penZUp); 
     delay(penDelay); 
     Zpos=Zmax; 
     digitalWrite(15, LOW);
     digitalWrite(16, HIGH);
     if (verbose) { 
     Serial.println("Pen up!"); 
     
     } 
    }
    void penDown() { 
     penServo.write(penZDown); 
     delay(penDelay); 
     Zpos=Zmin; 
     digitalWrite(15, HIGH);
     digitalWrite(16, LOW);
     if (verbose) { 
     Serial.println("Pen down."); 
     
     
     } 
    }

     

    Processing Yazılımı:

    import java.awt.event.KeyEvent;
    import javax.swing.JOptionPane;
    import processing.serial.*;
     
    Serial port = null;
     
    // select and modify the appropriate line for your operating system
    // leave as null to use interactive port (press 'p' in the program)
    String portname = null;
    //String portname = Serial.list()[0]; // Mac OS X
    //String portname = "/dev/ttyUSB0"; // Linux
    //String portname = "COM6"; // Windows
     
    boolean streaming = false;
    float speed = 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(frame,
     "Select the serial port that corresponds to your Arduino board.",
     "serial port 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;
     text("Menuler", 12, y); y += dy;
     text("p: serial port seç", 12, y); y += dy;
     text("1: hız 0.001 inch", 12, y); y += dy;
     text("2: hız 0.010 inch", 12, y); y += dy;
     text("3: hız 0.100 inch", 12, y); y += dy;
     text("Yön Tuşları: x-y Düzlemi", 12, y); y += dy;
     text("Sayfa aşağı-yukarı: z eksen ", 12, y); y += dy;
     text("$: grbl ayarlar", 12, y); y+= dy;
     text("h: Başlangıç Konumu", 12, y); y += dy;
     text("0: Güncel Konum", 12, y); y += dy;
     text("g: g-code dosya seç ", 12, y); y += dy;
     text("x: Çizimi Durdur", 12, y); y += dy;
     y = height - dy;
     text("güncel hız: " + speed + " adım", 12, y); y -= dy;
     text("güncel serial port: " + portname, 12, y); y -= dy;
    }
     
    void keyPressed()
    {
     if (key == '1') speed = 0.001;
     if (key == '2') speed = 0.01;
     if (key == '3') speed = 0.1;
     
     if (!streaming) {
     if (keyCode == LEFT) port.write("G91\nG20\nG00 X-" + speed + " Y0.000 Z0.000\n");
     if (keyCode == RIGHT) port.write("G91\nG20\nG00 X" + speed + " Y0.000 Z0.000\n");
     if (keyCode == UP) port.write("G91\nG20\nG00 X0.000 Y" + speed + " Z0.000\n");
     if (keyCode == DOWN) port.write("G91\nG20\nG00 X0.000 Y-" + speed + " Z0.000\n");
     if (keyCode == KeyEvent.VK_PAGE_UP) port.write("G91\nG20\nG00 X0.000 Y0.000 Z" + speed + "\n");
     if (keyCode == KeyEvent.VK_PAGE_DOWN) port.write("G91\nG20\nG00 X0.000 Y0.000 Z-" + speed + "\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; i = 0;
     File file = null; 
     println("Loading file...");
     selectInput("Select a file to process:", "fileSelected", file);
     }
     
     if (key == 'x') streaming = false;
    }
     
    void fileSelected(File selection) {
     if (selection == null) {
     println("Window was closed or the user hit cancel.");
     } else {
     println("User selected " + selection.getAbsolutePath());
     gcode = loadStrings(selection.getAbsolutePath());
     if (gcode == null) return;
     streaming = true;
     stream();
     }
    }
     
    void stream()
    {
     if (!streaming) return;
     
     while (true) {
     if (i == gcode.length) {
     streaming = false;
     return;
     }
     
     if (gcode[i].trim().length() == 0) i++;
     else break;
     }
     
     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: really?
    }

    Projenin Bütün Dosyalarını Buradan İndirebilirsiniz. Arduino Mini Cnc

    INKSCAPE  AYARLARI

    INKSCAPE ile gcode çıktısı almamız için öncelikle makerbot unicon G-code eklentisini buradan indirin >> İnkscape gcode eklentisi

    Eklentiyi zipten çıkartın ve işletim sisteminize göre aşağıda gösterildiği klasöre kopyalayın.

    OS X  kullanıcıları – /Applications/Inkscape.app/Contents/Resources/extensions

    Linux  kullanıcıları – /usr/share/inkscape/extensions

    Windows kullanıcıları – C:\Program Files\Inkscape\share\extensions

     

    İnkscape ile Yazıyı Gcode Çıktısını Alma : 

    1.adım: İnkscape programını açın. Aşağıdaki resimde gösterildiği gibi sayfa ayarlarına girin  sayfa boyutunu 80x80mm  ve metrik sistemi mm seçerek  ayarlayın.

    2.adım: Sayfa boyutunu 80×80 mm yaptık . Fakat yazı alanı olarak sadece sayfanın dörtte biri olan sağ üst alanı kullanacağız. Yani kullanacağımız alan 40×40 mm boyutlarında olacak. Aşağıda çizim alanı gösterilmiştir. Bu alanı taşmayacak şekilde yazınızı yazınız.

    3.adım: Yazıları seçin ve path menüsünden object to path ‘ tıklayın. Aşağıda gösterilmiştir.

    4.adım: Aşağıdaki gibi farklı kaydet diyerek gcode uzantısını seçin.

    5.adım: Kaydet e tıkladığınız karşınıza aşağıdaki gibi bir ekran çıkacaktır. Buradaki ayarları değiştirmeyin ve ok butonuna tıklayın.

    Yazımızın gcode olarak çıktısını bu şekilde aldık. Şimdi bir resmin gcode olarak çıktısının alınmasın bakalım.

    İnkscape ile Resmin Gcode Çıktısını Alma : 

    Yukarıda anlattığım gibi sayfa boyutlarını ve metrik sistemi ayarlayın. Çizim alanı da yine sayfanın dörtte biri olan sağ üst alanı olacak. Bu kısımları ayarladıktan sonra aşağıdaki adımları takip ediniz.

    1.adım: File menüsünden import a tıklayın ve çizdirmek istediğiniz resmi seçin.

    2.adım: Resmi çizim alanına sığacak şekilde boyutunu ayarlayın ve çizim alanına konumlandırın. Daha sonra resmi seçin ve aşağıdaki gibi path menüsünden Trace Bitmap e tıklayın.

    3.adım: Karşımıza bir pencere çıkıyor. Aşağıdaki gibi Colors seçeneğini seçin ve Update butonuna tıklayın. Ardından ok butonuna tıklayın işlem bitene kadar bekleyin. İşlem bittiğinde pencereyi kapatın.

    4.adım:  Resmi farenin sol tuşuna basılı tutarak yana kaydırın.Aşağıdaki gibi iki tane resim oluştuğunu göreceksiniz. Bunlardan yana kaydırdığınız resim vektörel forma dönüşmüş olan resimdir. Diğer resmi silin ve yana kaydırmış olduğunuz resmi çizim alanına yerleştirin.

    5.adım: Resmi seçin ve aşağıdaki gibi path menüsünden opject to path a tıklayın.

    6.adım: Resmi vektörel yaptık fakat dış çerçeve kısmındaki kalıntıları silmemiz gerekiyor. Bunun için sol taraftaki araçlardan fare okunun altında olan Edit Paths by nodes aracını seçin ve aşağıdaki gibi resim üzerine tıklayın. Kesikli çizgi üzerine gelin ve farenin sağ tuşuna basarak delete yi seçin.

    7.adım: File menüsünden farklı kaydet e tıklayın ve gcode u seçerek kaydedin.

    Gcode’ u Cnc’ ye Göndererek Çizim Yaptırma İşlemleri:

    Gcode çıktısını aldığımız çizimi cnc ye nasıl göndereceğimize bakalım. Öncelikle bütün bağlantıları tekrar kontrol ediniz ve doğru olduğundan emin olunuz. Daha sonra arduinoyu bilgisayara bağlayın. Processing programını açın ve processing kodunu ekrana aktararak programı çalıştırın. Karşımıza menülerin olduğu aşağıdaki şekildeki gibi bir ekran gelecektir.

    İlk önce p tuşuna basın ve arduinonun bağlı olduğu serial portu seçin. Ardından G tuşuna basarak çizdirmek istediğiniz gcode dosyasını seçin. Dosyayı seçtiğinizde çizim başlayacaktır. Ayrıca cnc çizim yaparken X tuşuna basarsanız çizimi durdurabiliriz. ve H tuşuna basarak da kalemi başlangıç noktasına alırsınız. Diğer bir özellik ise çizim hızını 1, 2 veya 3 tuşlarına basarak hangi hızda olmasını istiyorsunuz ayarlayabilirsiniz.

    PAYLAŞ

    Sezgin GÜL

    Makine Mühendisi, Maker, Robotik Sistemler Uzmanı

    53 Yorum "Çizim Yapan Mini Cnc Yapımı"

    1. yusuf
      12 Ocak 2017

      inkscape de yaptığım çizimi veya yazıyı kaydederken şöyle bir sorun çıkıyor. Bu sorunu nasıl çözebilirim

      Traceback (most recent call last):

      File “unicorn.py”, line 108, in

      e.affect()

      File “C:\Program Files\Inkscape\share\extensions\inkex.py”, line 268, in affect

      self.effect()

      File “unicorn.py”, line 102, in effect

      parser.parse()

      File “C:\Program Files\Inkscape\share\extensions\unicorn\svg_parser.py”, line 230, in parse

      self.svgWidth = self.getLength(‘width’, 354) * 0.28222

      TypeError: unsupported operand type(s) for *: ‘NoneType’ and ‘float’

      Cevapla
    2. Mustafa
      10 Ocak 2017

      Merhaba Sezgin Bey, adafruit motor shield için Arduino da servo ve step bağlantı uçları hangileri.

      Cevapla
      • Mustafa
        10 Ocak 2017

        Step motorlar için kullandığımız l293 motor sürücü ile arduino’nun bağlantıları hangi pinler

        Cevapla
        • Sezgin GÜL
          Sezgin GÜL
          10 Ocak 2017

          Kod kısmında step motor tanımında pinler belirtildi.
          Stepper y_ekseni(adim_sayisi, 2,3,4,5);
          Stepper x_ekseni(adim_sayisi, 6,7,8,9);

          Cevapla
      • Sezgin GÜL
        Sezgin GÜL
        10 Ocak 2017

        Motor shield arduino üzerine takıldığı için direk otomatik bağlantı sağlanıyor. Kod kısmında pin numaralarının belirtilmemesinin nedeni, pinlerin kütüphane dosyasında önceden tanıtılmış olmasıdır ve step motor tanımı yaparken bu pinler arka planda otomatik aktif edilir. Eğer hangi pinlerin atandığını öğrenmek istersen de motor shield kütüphanesine bakabilirsin. Servo motor pini kodda tanımlanmış ve dijital 10 pinidir.

        Cevapla
    3. FenciFd
      9 Ocak 2017

      Süpermiş oldu. Paylaşım için çok teşekkürler. Elektroniğin endüstriyel kısmında kalan bizim gibi insanlar için mikro denetleyicileri kullanmak yazılım yazmak zor. Ben bu sistemi çok yapmak istiyordum ama yazılımları doğru bir şekilde bulup kullanmak nasip olmamıştı. Sizin paylaşımınız ile olayı çözdüm çok Teşekkürler.

      Cevapla
    4. Orhan
      4 Ocak 2017

      Güzel bir açıklama olmuş teşekkür ederim ben herşeyi yaptım ve çalıştırdım ama anlamadığım olay şu.o çıkarılacak olan parçayı çıkarmadım ama yinede çalıştı cikarmamizin sebebi nedir cikarmazsak bi zararı varmı tekrar teşekkür ediyorum

      Cevapla
    5. okan köroğlu
      27 Aralık 2016

      hocam kolay gelsin
      prosessing programını yüklerken
      “İMPORT DOES NOT NAME A TYPE” diye hata veriyor
      yardımcı olursanız sevinirim
      başarılarınızın devamını dilerim. İyi çalışmalar…

      Cevapla
    6. okan köroğlu
      27 Aralık 2016

      hocam kolay gelsin
      prossessing programını yüklerken arduino ya böyle bir mesaj geliyor
      “import does not name a type”
      kod la ilgili bir problem mi var

      Cevapla
    7. ömer faruk
      25 Aralık 2016

      3 step motor ile yapmak isitıyorum bu projeyı.elınızde herhangı bı döküman var mı

      Cevapla
      • Sezgin GÜL
        Sezgin GÜL
        27 Aralık 2016

        Grbl olarak araştırın açık kaynak kodlarını bulursunuz.

        Cevapla
        • ömer faruk
          27 Aralık 2016

          herhangi bir kod bulamadım.baska bı sekılde aramam mı gerekıyor.3steple yapan herhangı bırıne rastlamadım henuz bı bılgınız var mı

          Cevapla
    8. faruk
      24 Aralık 2016

      inkspace de dosyayı kaydederken g gode uzantısı gözükmüyor neden olabilir

      Cevapla
      • Sezgin GÜL
        Sezgin GÜL
        24 Aralık 2016

        Eklentiyi yüklememiş veya yanlış yere yüklemiş olduğunuzdan kaynaklıdır.

        Cevapla
        • faruk
          24 Aralık 2016

          dediğiniz her şeyi yaptım ama ginede g code uzantısı gözükmüyor başka bişe yapmam mı lazım tüm sistem hazır çalışıyor tek eksik g code kaldı yardımcı olsanız size zahmet bu gece halletmem lazım internette birşey bulamadım bununla alakalı

          Cevapla
          • Sezgin GÜL
            Sezgin GÜL
            27 Aralık 2016

            inkscape 0.48.5 sürümününde çalışıyor. Sizdeki son sürüm ise onda başka eklenti çalışıyor.

            Cevapla
            • ahmet
              13 Ocak 2017

              usta başka eklentiyi nereden bulacağız

            • Sezgin GÜL
              Sezgin GÜL
              13 Ocak 2017

              inkscape 0.48.5 sürümünü yükleyin

    9. Ahmet Olmuştur
      19 Aralık 2016

      Ustam öncelikle eline saglık güzel calışma olmuş. Benim sormak istedigim sey acaba 3 tane step motor kullansak olmaz mı?. Bildigimden degil bilakis bilgilenmek amaclı soruyorum, sevo motor cok karmasık diye söylendi acaba step motorlarla yapmak daha mı kolay oluyor?. İyi calışmalar..

      Cevapla
    10. Hakan
      17 Aralık 2016

      L293 kullanarak yapmak istiyorum. Anlamadığım kısın Arduinonun için hem l293 kodlarını hemde processing kodlarını mı atacağız peşpeşe. G kodlarını işleyen kısım sanırım Processign programı??

      Cevapla
    11. Berkay
      17 Aralık 2016

      Hocam, dosyayı program filestaki ınkspace dosyasına attım fakat farklı kaydette .gcode eklentisini göremiyorum?

      Cevapla
    12. can arslan
      17 Aralık 2016

      Hocam ellerine sağlık cidden tek sıkıntım çizdiğim yada yazdığımı farklı kaydederken g code sekmesi yok onu nasıl halledebilrim yada sizin program sürümümü farklı bende 0.91 var . tek sıkıntım şuan bu sadece teşekkürler.

      Cevapla
    13. enver tilbe
      15 Aralık 2016

      sezgin bey iyi akşamlar.
      inkspace programında ara işlemleri hallettikten sonra kayıt işlemi yaparken böyle bir hata veriyor.
      yardımcı olabilir misiniz.

      Traceback (most recent call last):
      File “unicorn.py”, line 108, in
      e.affect()
      File “C:\Program Files\Inkscape\share\extensions\inkex.py”, line 268, in affect
      self.effect()
      File “unicorn.py”, line 102, in effect
      parser.parse()
      File “C:\Program Files\Inkscape\share\extensions\unicorn\svg_parser.py”, line 230, in parse
      self.svgWidth = self.getLength(‘width’, 354) * 0.28222
      TypeError: unsupported operand type(s) for *: ‘NoneType’ and ‘float’

      Cevapla
      • yusuf
        12 Ocak 2017

        merhaba aynı sorun bende de oldu siz nasıl çözdünüz acaba

        Cevapla
    14. Orhun
      29 Kasım 2016

      inkscape de yaptığım çizimi veya yazıyı kaydederken şöyle bir sorun çıkıyor. Bu sorunu nasıl çözebilirim

      Traceback (most recent call last):

      File “unicorn.py”, line 108, in

      e.affect()

      File “C:\Program Files\Inkscape\share\extensions\inkex.py”, line 268, in affect

      self.effect()

      File “unicorn.py”, line 102, in effect

      parser.parse()

      File “C:\Program Files\Inkscape\share\extensions\unicorn\svg_parser.py”, line 230, in parse

      self.svgWidth = self.getLength(‘width’, 354) * 0.28222

      TypeError: unsupported operand type(s) for *: ‘NoneType’ and ‘float’

      Cevapla
      • yusuf
        12 Ocak 2017

        merhaba aynı sorun bende de oldu siz nasıl çözdünüz acaba

        Cevapla
    15. ahmet kandilli
      25 Kasım 2016

      selamlar sezgin bey çalışmanız çok güzel bende son aşamalara geldim fakat şu yazılım olayını aşamadım
      Arduino:1.6.10 (Windows 10), Kart:”Arduino/Genuino Uno”

      C:\Users\KANDÄ°LLÄ°\Desktop\cnc\Arduino Mini Cnc\Mini_Cnc\Mini_Cnc.ino: In function ‘void loop()’:

      Mini_Cnc:90: error: ‘process’ was not declared in this scope

      C:\Users\KANDÄ°LLÄ°\Desktop\cnc\Arduino Mini Cnc\Mini_Cnc\Mini_Cnc.ino: In function ‘void processIncomingLine(char*, int)’:

      Mini_Cnc:143: error: ‘penUp’ was not declared in this scope

      Mini_Cnc:146: error: ‘penDown’ was not declared in this scope

      Mini_Cnc:170: error: ‘drawLine’ was not declared in this scope

      exit status 1
      ‘process’ was not declared in this scope

      This report would have more information with
      “Show verbose output during compilation”
      option enabled in File -> Preferences.
      hata mesajını alıyorum yardımcı olabilirmisiniz

      Cevapla
    16. yunus
      5 Kasım 2016

      Açıklama süper olmuş. Ben bu devreyi A4 boyutunda hazırlayabilir miyim ? Bunun için parçalarda ve kodlarda nasıl değişiklikler yapmam lazım. Cevabınız için de şimdiden teşekkürler.

      Cevapla
    17. rıza barış çakı
      26 Ekim 2016

      Merhabalar hocam ilk başta emeğinize sağlık cok güzel proje olmuş . bir çok sitede mini cnc üzerine yazılar var fakat sizinki kadar açıklayıcı değil hiç birisi. arduino programına kodu yüklerken ” ‘penUp’ was not declared in this scope ” hatası veriyor nerden kaynaklı olabilir yardımcı oluranız cok severim projelreinizin devamı bekleriz . :))

      Cevapla
      • Sezgin GÜL
        31 Ekim 2016

        teşekkürler Rıza bey. muhtemelen kodu kopyalayıp programa yapıştırdığınız için kod parçacığının bazı yerleri pasif duruma geliyor. Bu durum html karakter kodlarından kaynaklanabiliyor. Buradaki linkten projenin kodlarını indirebilirsiniz >> http://www.robimek.com/wp-content/uploads/Arduino-Mini-Cnc.rar

        Cevapla
        • ömür
          17 Kasım 2016

          abicim elektriği nerden vricez bulamadım da

          Cevapla
          • Sezgin GÜL
            19 Kasım 2016

            l293d veya l293b kullandıysan sürücünün 8. bacağı harici enerji girişidir. oradan motorlara enerji vereceksin. Eğer motor shield kullandıysan üzerinde enerji pinleri yazar oradan enerji verirsin. Motorların stabil hareket etmesi için yaklaşık 1500 – 2000 mah akımda 5v luk bir gerilim vermen gerekiyor.

            Cevapla
    18. abdulsamed öztoprak
      21 Ekim 2016

      hayrlı gnler bn proğramı arduinoya yüklerken ”( exit status 1
      ‘processIncomingLine’ was not declared in this scope )” böyle bir hata aldım çözümü için ne yapabilirim.

      Cevapla
    19. Osman ERDOĞAN
      20 Ekim 2016

      Sezgin bey çalışmanız için teşekkürler ”Adafruit Motor Shield İçin Arduino Yazılımı” derleme
      esnasında aşağıdaki hatayı veriyor..
      mini_cnc_af_motor:7: error: ‘MICROSTEP’ was not declared in this scope
      mini_cnc_af_motor:14: error: ‘AF_Stepper’ does not name a type
      mini_cnc_af_motor:15: error: ‘AF_Stepper’ does not name a type
      mini_cnc_af_motor.ino: In function ‘void setup()’:
      mini_cnc_af_motor:57: error: ‘myStepperX’ was not declared in this scope
      mini_cnc_af_motor:59: error: ‘myStepperY’ was not declared in this scope
      mini_cnc_af_motor.ino: In function ‘void drawLine(float, float)’:
      mini_cnc_af_motor:281: error: ‘myStepperX’ was not declared in this scope
      mini_cnc_af_motor:285: error: ‘myStepperY’ was not declared in this scope
      mini_cnc_af_motor:292: error: ‘myStepperY’ was not declared in this scope
      mini_cnc_af_motor:296: error: ‘myStepperX’ was not declared in this scope
      Bu konuda yardımcı olursanız sevinirim,teşekkürler.

      Cevapla
      • Sezgin GÜL
        20 Ekim 2016

        Afmotor kütüphanesini yüklemediğin için hata almışsınız.

        Cevapla
    20. Mert
      19 Ekim 2016

      Selamlar,Eski yazici parcalari ile bu projeyi Encoderli DC motor ile yapmamiz mumkun mu?
      Eger mekanizma hakkinda farkli bir fikriniz var ise paylasirsaniz seviniriz.

      Cevapla
    21. Baha
      16 Ekim 2016

      Abi su rayları iki farklı markalardan soksek yani step motorlar standartmi hizlarind sıkınti cikarmi ben iki farklı marka pc cd rom dan soktum de

      Cevapla
    22. Kadir
      11 Ekim 2016

      Hocam resimi nasıl çizdireceğimizi anlamadım açıklarsanız çok sevinirim.

      Cevapla
      • Sezgin GÜL
        11 Ekim 2016

        Merhaba Kadir. Yukarıda anlattım ancak yine de açıkça anlatayım. Öncelikle inkscape programında 80x80mm boyutlarında bir sayfa aç. Sayfanın dörtte biri olan sağ üst kısmı kullanacaksın. Yani 40×40 mm lik bir alanda resim veya çizimini yapabilirsin. Resim ve çizim ekleme adımlarını yukarıda anlattığım gibi yap ve g code olarak çıktı al. Daha sonra arduinoyu bilgisayara bağla. Processing programını aç ve vermiş olduğum processing kodunu program penceresine aktar. Sonra processing programını çalıştır. Karşına menüler çıkacak. Öncelikle arduinonun bağlı olduğu portu seçmek için p tuşuna bas ve portu seç. daha sonra g tuşuna basıp g code dosyasını seçtiğin an cnc çizime başlayacaktır. Hepsi bu kadar.

        Cevapla
        • Kadir
          13 Ekim 2016

          Çok teşekkürler elleriniz dert görmesin 🙂

          Cevapla
    23. Kemal Ozkan
      25 Ağustos 2016

      Merhaba, arduinoya yeni başladım merak ettiğimden soruyorum ;
      çizdirmek istediğimiz deseni veya herhangi bir şekli arduinoya kod olarak mı yükleyeceğiz ?

      Cevapla
    24. hasan
      16 Temmuz 2016

      hocam çok özür dilerim ama bize vahi mi gelcek te öğrencez hiçbi açıklama yok kodların yanında

      Cevapla
      • raimen
        21 Temmuz 2016

        Hasan bi zahmet kodların açıklamasını bulamıyorsan, arduino ile uğraşma

        Cevapla
        • hasan
          25 Temmuz 2016

          hocam istediğim şey kopyala yapıştır deil sen bulduyssan yukardakilerin “her bir satırının” açıklasmasını helal olsun

          Cevapla
    25. ceesur
      12 Temmuz 2016

      Selam Sezgin bey.. bir çok kısmı anlatmamışsınız…mesela adafruit shield kartının alt kısmında ne takılı olması gerekiyor arduino uno mu?..takılacaksa da klon olanlar takılabilirmi…resimi yapmak yazdırmak için program gerekmiyormu hex dosyası grbl controller gibi..yeni başlayanlar için alınacak malzemeleri tek tek sıralayabilirmisiniz… bilgisayara yüklenecek programları yazabilirmisiniz…bu verdiğiniz kodları nereye atacağız.. kafam iyice karıştı. adafruit shield yerine cnc shield olurmu bu yazıcı için…neyse teşekkürler fena değildi..

      Cevapla
      • Sezgin GÜL
        12 Temmuz 2016

        2 tane arduino kodu verdim. motor sürücü olarak adafruit shield kullanacaksan adafruit yazan arduino kodunu arduinoya yüklemen gerekiyor. Diğer motor sürücüler örneğin l23b l293d l298n gibi sürücüler kullanacaksan diğer arduino kodunu yükle. adafruit shield kütüphane ile stabil çalıştığı için ona özel kod ekledim. Yani projedeki 2 arduino kodu da aynı aslında. sadece motor sürücüye özel ayrı kod verdim. arduino modeli farketmez ister klon ister orjinal o açıdan da sorun yok kullanabilirsin. arduino kodunu yükleyip bağlantıları da yaptıktan sonra processing programını aç . projede verdiğim processing kodunu al ve çalıştır. diğer yapman gereken adımları yukarıda anlatmıştım.

        Cevapla
    26. abdullah
      3 Temmuz 2016

      ben bu programları anlamadım 3 ayrı program var nasıl yukleyecegim

      Cevapla
      • Sezgin GÜL
        3 Temmuz 2016

        2 tane arduino kodu verdim. Eğer adafruit motor shield kullanacaksınız kütüphanesi ile çalıştığından dolayı adafruit shield olan kodu kullanmanız gerekir. Diğer arduino kodu ise l293 gibi diğer motor sürücüler için geçerlidir. Yani iki arduino kodundan elinizdeki sürücüye uygun olanını seçip kullanın.

        Cevapla
    27. Sertan nokay
      24 Mayıs 2016

      S.a ben projeyi tamamladim bi tek kalemi servoya yukari assagi yapacak sekilde yerlestirmeyi beceremedim bunun icin yardimci olurmusunu

      Cevapla
      • Sezgin GÜL
        15 Haziran 2016

        processingdeki programı çalıştırın p tuşuna basın ve arduinonun takılı olduğu serial portu seçin.portu seçtiğinizde servonun açısı kalemi kaldırma pozisyonuna gelir. Ardından g tuşuna basın ve g code dosyası seçip onaylayın. Şimdi çizime başlayacaktır. Çizim yaparken servo motor kalemi indirmiş olacağından bu pozisyonda çizimi durdurun veya enerjiyi kesin. Servo motorun açısını oynatmadan kalemin ucu kağıda değecek şekilde takın ve kalem vidasını sıkın. Daha sonra programı tekrar başlatın. Çizime hazırdır.

        Cevapla

    Bir yorum yaz

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

    Projeler Devamı

    Bizi Takip Et

    izmir escort- izmir escort- izmir escort- izmir escort- izmir escort