BAĞLAN

Çizim Yapan Mini Cnc Yapımı

  • Görüntülenme 7569
  • PAYLAŞ
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  

    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

    Sezgin GÜL

    Makine Mühendisi, Girişimci, Maker

    Kimler Neler Demiş?

    68 Yorum - "Çizim Yapan Mini Cnc Yapımı"

    avatar
    Sıralama:   En Yeniler | Eskiler | Beğenilenler
    batuhan
    Ziyaretçi

    sezgin bey öncelikle çok teşekkür ediyorum proje için ;
    Arduino ya kodu derlediğimde şöyle bir sorun ile karşılaşıyorum

    Arduino:1.8.1 (Windows 10), Kart:”Arduino/Genuino Uno”

    C:UsersbatuhanDocumentsArduinosketch_feb25bsketch_feb25b.ino:2:21: fatal error: AFMotor.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compiling for board Arduino/Genuino Uno.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    mustafa
    Ziyaretçi

    abi bütün yazilimi 1 sekmeyemi ekliyoruz

    enver
    Ziyaretçi

    iyi günler ben inkspace 0.48,5 kurdum anacak içine linkini verdiğiniz gcode dosyasını belirrttiğiniz adrese atmama rağmen gcode dosyası olarak kaydedemiyorum.
    farklı kaydet diyorum ancak gelmiyor gcode türünde kayıt.

    Fqtih
    Ziyaretçi

    Benim bi sorum olacaktı cevaplarsanız şimdiden teşekkürler.
    Processing dediğiniz kısmı hangi program ile yazacağız exe oluşturacağız.Ben bunu proje olarak düşünüyorum yazılımını kendim yapmadığım süre kabul etmez hocam şimdiden teşekkürler

    muhammed
    Ziyaretçi

    shieldı 5 volt 1 amper ile beslesek olurmu

    mert
    Ziyaretçi

    Bu fritzing devresinde hata yok mu?Sağ alt köşedeki kırmızı ve siyah kablolar aynı yerden çıkış almış biri artı biri eksi olması gerekmiyor mu?

    cemal
    Ziyaretçi

    merhaba kullandigim inscape programinda “Maker bot unicom g code” eklentisi yok nasil ekleyebilirim.
    te$ekkurler

    yusuf
    Ziyaretçi

    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’

    Mustafa
    Ziyaretçi

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

    Mustafa
    Ziyaretçi

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

    FenciFd
    Ziyaretçi

    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.

    wpDiscuz

    Yeni Projeler More

    • 16 Şubat 2017
      1 hafta ÖNCE 2 Yorum

      Öğrenme Fonksiyonuna Sahip Hareket Kopyalayan Robot Kol Yapımı

      Bu projede öğrenme yoluyla hareket kopyalayan robot kol yapımından bahsedeceğim. Endüstride kullanılan robot kollar, her zaman aynı hareketleri yapmaya odaklıdır. Örneğin ürün bandından bir nesneyi alıp başka bir banda aktarımını yapan robot kollar sürekli aynı hareketi yapmaktadır. Bu hareketler önceden öğretilerek robot kola aktarılır. Burada da aynı mantıkla robot ...

    • 11 Şubat 2017
      2 hafta ÖNCE 10 Yorum

      Arduino İle Labirent Çözen Robot Yapımı

      Kendi robotunu yap projelerimizin bu bölümünde arduino ile labirent çözen robot yapacağız. Labirent çözen robot özellikle robot yarışmalarında yer almaktadır. Bir labirentin çözüm yolunu bulmak aslında tek bir etkene bağlıdır. Bu etken sağ veya sol taraftaki herhangi bir duvarı takip ettirmektir. Bu etkenden yola çıkarak robot sol veya sağ ...

    • 07 Şubat 2017
      3 hafta ÖNCE Yorum Yok

      Arduino ile MLX90614 Kızılötesi Sıcaklık Sensörü Kullanımı

      Cisme temas etmeden, cismin sıcaklığını ölçen MLX90614 kızılötesi sıcaklık sensöründen bahsedeceğim. Dahili bir 17-bit ADC ve güçlü bir DSP, MLX90614'ün ölçümlerinde yüksek doğruluk ve çözünürlük verir. Vücut sıcaklığı ölçmek için uygundur. Ayrıca hareket algılamada da kullanabilirsiniz. MLX90614 Özellikler: Ortam sıcaklığı ölçme aralığı -40 ile + 125 ° C Nesne ...

    • 05 Şubat 2017
      3 hafta ÖNCE Yorum Yok

      Arduino ile Yazıyı Sese Dönüştüren Emic 2 Modülü Kullanımı

      Robotunuzu konuşturmak ve neler olup bittiğini söyletmek ister misiniz ? Emic 2 yazıyı sese çeviren modülle kolaylıkla projeleriniz konuşabilir. Emic-2, Parallax tarafından, ses sentezini tamamen zahmetsiz kılmak için Grand Idea Studio ile birlikte tasarlanmıştır.

    • 31 Ocak 2017
      4 hafta ÖNCE 7 Yorum

      Arduino ile DHT22 Sıcaklık Nem Sensörü Kullanımı

      DHT sensörleri, kapasitif nem sensörü ve bir termistör olmak üzere iki parçadan oluşur. DHT11 ve DHT22 olan iki DHT modelini ele alalım. Görünüm ve pin yapısı olarak benzer görünmelerine rağmen farklı ölçüm hassasiyetlerine sahiptirler. Aşağıda iki modelin karşılaştırmasına bakalım.

    Bizi Takip Et

    Son Yorumlar

    Sezgin GÜL
    Sezgin GÜL 2017-02-25 23:01:46
    merhaba batuhan, hatanın sebebi AFMotor.h kütüphanesini yüklemediğinden kaynaklanmış. Kütüphaneyi buradan indirebilirsin http://www.robimek.com/wp-content/uploads/AFMOTOR-master.rar
    batuhan 2017-02-25 21:52:21
    sezgin bey öncelikle çok teşekkür ediyorum proje için ; Arduino ya kodu derlediğimde şöyle bir sorun ile karşılaşıyorum Arduino:1.8.1 (Windows.....
    Emin ERKMEN 2017-02-25 19:55:34
    Bu robotun üstüne ekleme yapabilir misiniz? 1 hafta içinde? Bu bizim için çok önemli.
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 19:48:46
    Çizgili olan labirenti çözen robotlarda o özellik mevcut. İlerleyen günlerde o tarz proje paylaşacağım.
    Emin ERKMEN 2017-02-25 19:34:28
    Peki bu robot. En kısa yolu nasıl bulabilir. İkinci kez aynı labirentten geçtiği zaman en kısa yoldan gitmesi için ne.....
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 18:10:10
    Kodlarda sorun yok videodaki robotta kullanılan kodlardır. Motor yönlerini doğru taktınız mı. Yön komutlarında doğru yönde dönüyorlar mı bunları da.....
    Emin ERKMEN 2017-02-25 18:03:27
    kodlarda sıkıntı yok yani?
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 17:17:46
    Bağlantılarınız doğru ve sensörlerin konumları uygun ise enerji yetersizliğinden kaynaklanabilir