0

Arduino Mini CNC Engrave Menggunakan Motor Driver L293D

Arduino Mini CNC Engrave

Dalam project kali ini saya akan menunjukkan kepada kalian bagaimana cara membuat mini cnc engrave menggunakan Arduino dan motor driver L293D

Dengan memanfaatkan motor stepper dan rel dari dua dvd rom bekas, kita bisa membuat sebuah mesin mini cnc yang dapat kita gunakan untuk menggambar atau menulis dengan area percetakan maksimal 4×4 cm.

Buat kalian yang pemula, jangan takut untuk memulai, karena ini sangat mudah!!!

Oke, tanpa panjang lebar lagi, untuk project kali ini kalian membutuhkan:

  • Arduino (saya menggunakan jenis UNO)
  • Motor Driver L293D
  • Servo
  • DVD Rom Bekas (2 buah)
  • Acrylic
  • Kabel

Pertama, kalian bongkar DVD Rom-nya, ambil stepper + rel nya. Stepper + Rel ini digunakan untuk sumbu x dan y.

Stepper + Rel

Lalu, solder kabel di stepper.

Stepper

Untuk rangka utamanya, saya  mendesain sendiri menggunakan software corel draw, yang kemudian dicetak ke arylic menggunakan laser cutting, yang selanjutnya pasang stepper sumbu x dan y di rangka yang sudah jadi.

Rangka Acrylic
Rangka Sumbu x dan y
Rangka Sumbu x dan y

Namun, buat kalian yang sedikit berhemat kalian bisa memanfaatkan bekas DVD Rom tadi untuk rangka nya.

Untuk sumbu z nya, saya menggunakan servo dan pulpen. Pulpen harus bisa naik ke atas dan turun kebawah.

Summbu z

Selanjutnya kita hubungkan stepper dan servo ke motor driver L293D.

Sekarang tinggal kita upload koding nya ke arduino, menggunakan software Arduino IDE. Di bawah ini Merupakan cuplikan koding nya, jika kalian ingin yang versi full contact kami lewat ig @idngulik, atau bisa klik tombol dibawah ini

#include <Servo.h>
#include <AFMotor.h>
#define LINE_BUFFER_LENGTH 512

char STEP = MICROSTEP ;

// Posisi Servo Naik Dan Turun 
const int penZUp = 110;
const int penZDown = 90;

// PIN Servo
const int penServoPin =10 ;

const int stepsPerRevolution = 48; 
 
Servo penServo;  
    
// Inisialisasi sumbu X dan Y Stepper di pin Arduino Menggunakan Modul L293D
AF_Stepper myStepperY(stepsPerRevolution,1);            
AF_Stepper myStepperX(stepsPerRevolution,2);  


struct point { 
 float x; 
 float y; 
 float z; 
};

// Posisi plothead saat ini
struct point actuatorPos;
    
//  Pengaturan gambar, harus OK
float StepInc = 1;
int StepDelay = 1;
int LineDelay =0;
int penDelay = 50;
    
// Langkah motor untuk mencapai 1 milimeter.
// Gunakan sketsa uji untuk menuju 100 langkah. Ukur panjang garis.
// Hitung langkah per mm. Masuk di sini
float StepsPerMillimeterX = 100.0;
float StepsPerMillimeterY = 100.0;
    
// Menggambar batas robot, dalam mm
// OK untuk memulai. Bisa hingga 50 mm jika dikalibrasi dengan baik.
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; 

// Setel ke true untuk mendapatkan hasil debug.
boolean verbose = false;
// Perlu ditafsirkan
// G1 untuk bergerak
// G4 P300 (tunggu 150 ms)
// M300 S30 (pena ke bawah)
// M300 S50 (pena atas)
// Buang apa pun dengan (
// Buang perintah lain!


void setup() {
//  Setup
      
Serial.begin( 9600 );
      
penServo.attach(penServoPin);
penServo.write(penZUp);
delay(100);

// Kurangi jika perlu
myStepperX.setSpeed(600);
myStepperY.setSpeed(600);  
      
// Atur & pindah ke posisi default awal
// TBD
// Pemberitahuan !!!
Serial.println("Mini CNC Plotter Terhubung!");
Serial.print("Ukuran Sumbu X Dari "); 
Serial.print(Xmin); 
Serial.print(" Sampai "); 
Serial.print(Xmax); 
Serial.println(" mm."); 
Serial.print("Ukuran Sumbu Y Dari "); 
Serial.print(Ymin); 
Serial.print(" Sampai "); 
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) {
  // Penerimaan serial - Sebagian besar dari Grbl, menambahkan dukungan titik koma
  while ( Serial.available()>0 ) {
    c = Serial.read();
    if (( c == '\n') || (c == '\r') ) {            // End of line tercapai
      if ( lineIndex > 0 ) {                       // Line sudah selesai. Kemudian jalankan!
        line[ lineIndex ] = '\0';                  // Hentikan string
        if (verbose) { 
          Serial.print( "Diterima : "); 
          Serial.println( line ); 
        }
        processIncomingLine( line, lineIndex );
        lineIndex = 0;
            } 
      else { 
      // Baris kosong atau komentar. Lewati blok.
      }
      lineIsComment = false;
      lineSemiColon = false;
      Serial.println("ok");    
    } 
    else {
    if ( (lineIsComment) || (lineSemiColon) ) {   // Membuang semua karakter komentar
      if ( c == ')' )  lineIsComment = false;     // Akhir komentar. Lanjutkan garis.
    } 
    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' ) {        
        line[ lineIndex++ ] = c-'a'+'A';
      } 
      else {
        line[ lineIndex++ ] = c;
      }
     }
    }
   }
  }
}

Jika koding arduino nya sudah di upload, sekarang tinggal kita ujicoba dengan menjalankan program CNC_Controller.pde di processing

Untuk koding cnc controller nya bisa dilihat dibawah ini

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 = "COM5"; // 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,
    "Pilih Port Serial Controller",
    "Port Serial",
    JOptionPane.PLAIN_MESSAGE,
    null,
    Serial.list(),
    0);
    
  if (result != null) {
    portname = result;
    openSerialPort();
  }
}

void setup()
{
  size(600, 400);
  openSerialPort();
}

void draw()
{
  background(#ef8519);  
  fill(#000000);
  int y = 50, dy = 15;
  textSize(24);
  text("==> PETUNJUK <==", 180, 24); y += dy;
  textSize(14);
  text("p: pilih port", 12, y); y += dy;
  text("arah: tes sumbu x dan y", 12, y); y += dy;
  text("s & a: tes sumbu z", 12, y); y += dy;
  text("$: tampilkan pengaturan grbl", 12, y); y+= dy;
  text("h: kembali ke titik awal", 12, y); y += dy;
  text("0: menjadikan titik awal", 12, y); y += dy;
  text("g: memilih file g-code", 12, y); y += dy;
  text("x: memberhentikan mesin cnc", 12, y); y += dy;
  y = height - dy;
  text("current jog speed: " + speed + " inches per step", 12, y); y -= dy;
  text("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("G21/G90/G1 X40  F3500\n");
    if (keyCode == RIGHT) port.write("G21/G90/G1 X-40 F3500\n");
    if (keyCode == UP) port.write("G21/G90/G1 Y40 F3500\n");
    if (keyCode == DOWN) port.write("G21/G90/G1 Y-40 F3500\n");
    if (key == 's') port.write("M300 S50\n");
    if (key == 'a') port.write("M300 S30\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("Membuka File...");
    selectInput("Pilih File Untuk Dijalankan:", "File Dipilih", file);
  }
  
  if (key == 'x') streaming = false;
}

void fileSelected(File selection) {
  if (selection == null) {
    println("Jendela ditutup atau pengguna membatalkan.");
  } else {
    println("Memilih " + 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?
}

Dibawah ini adalah hasil gambar yang telah dicoba

rp.rusdiana

Leave a Reply

Your email address will not be published. Required fields are marked *