Como fazer mini plotter CNC 2D usando drive de DVD de sucata, L293D
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
| ||||
|
Sobre este projeto
Organize duas unidades de DVD de sucata, conforme mostrado na imagem
1 Baixe o IDE do Arduino
2. Baixar IDE de processamento
3. Abra o Arduino IDE e carregue o código baixado de aqui .
4. Abra o IDE de processamento e carregue o código baixado de aqui .
Abra a unidade de DVD de sucata e remova a bandeja móvel interna. Esta bandeja com mecanismo de passo atuará como nosso eixo X e eixo Y. Consulte as fotos em anexo para entender como montar sua máquina. Faça orifícios na caixa vazia da unidade de DVD, monte nosso eixo X e eixo Y na caixa de DVD respectiva com a ajuda de parafusos de porca.
Agora coloque-os perpendicularmente um ao outro.
Código G
Para fazer arquivos de código-g compatíveis com esta máquina CNC, você deve usar o Inkscape.
Inkscape é um software gráfico vetorial de qualidade profissional que roda em Windows, Mac OS X e Linux. É usado por profissionais de design e amadores em todo o mundo, para criar uma ampla variedade de gráficos, como ilustrações, ícones, logotipos, diagramas, mapas e gráficos para a web. O Inkscape usa o padrão aberto W3C SVG (Scalable Vector Graphics) como seu formato nativo e é um software gratuito e de código aberto. Baixe e instale o Inkscape aqui.
( Importante :download da versão 0.48.5) Agora você precisa instalar um Add-on que permite a exportação de imagens para arquivos de código-g. Este complemento pode ser encontrado aqui com as notas de instalação.
Siga o vídeo no YouTube sobre como criar um arquivo de código G.
- Carregue o arquivo gctrl para o IDE de processamento e clique no botão PLAY na janela de processamento.
- Primeiro pressione 'p' para selecionar sua porta de comunicação
- Se desejar, pode definir a velocidade de corrida pressionando os botões 1,2 ou 3 no teclado
- Pressione 'g' para carregar o arquivo de código G
- Sua máquina está pronta para plotar assim que você pressiona Enter selecionando o arquivo g-code
Agora sua plotadora está pronta. Alguns links prontos para download de arquivos em código G:
- 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
Agradecimentos para sua atenção! Visite este link para uma ilustração completa.
Vídeo para ver a máquina ao vivo:
Código
- código Arduino CNC
- Processando código
Código do Arduino CNC Arduino
Carregue este código para Arduino#include#include #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP; // Posição do servo para cima e para baixo const int penZUp =95; const int penZDown =83; // Servo no pino PWM 10const int penServoPin =10; // Deve ser adequado para steppers de DVD, mas não é muito importante aqui int stepsPerRevolution =48; // cria um objeto servo para controlar um servo Servo penServo; // Inicializa os steppers para os eixos X e Y usando os pinos do Arduino para o L293D H-bridgeAF_Stepper myStepperY (stepsPerRevolution, 1); AF_Stepper myStepperX (stepsPerRevolution, 2); / * Estruturas, variáveis globais * / ponto de estrutura {float x; float y; float z; }; // Posição atual do ponto do plotheadstruct atuatorPos; // As configurações do desenho devem ser OKfloat StepInc =1; int StepDelay =0; int LineDelay =0; int penDelay =50; // Passos do motor para ir 1 milímetro.// Use esboço de teste para ir 100 etapas. Meça o comprimento da linha. // Calcule os passos por mm. Insira aqui.float StepsPerMillimeterX =100.0; float StepsPerMillimeterY =100.0; // Desenho de limites do robô, em mm // OK para começar. Pode ir até 50 mm se bem calibrado. flutuante Xmin =0; flutuante Xmax =40; flutuante Ymin =0; flutuante Ymax =40; flutuante Zmin =0; flutuante Zmax =1; flutuante Xpos =Xmin; flutuante Ypos =Ymin; flutuante Zpos =Zmax; // Defina como verdadeiro para obter debug output.boolean verbose =false; // Precisa interpretar // G1 para mover // G4 P300 (esperar 150ms) // M300 S30 (caneta para baixo) // M300 S50 (caneta para cima) / / Descartar qualquer coisa com um (// Descartar qualquer outro comando! / *********************** * void setup () - Initialisations ******* ***************** / void setup () {// Setup Serial.begin (9600); penServo.attach (penServoPin); penServo.write (penZUp); atraso (100); // Diminua, se necessário, myStepperX.setSpeed (600); myStepperY.setSpeed (600); // Definir e mover para a posição inicial padrão // TBD // Notificações !!! Serial.println ("Mini CNC Plotter viva e funcionando! "); Serial.print (" intervalo X é de "); Serial.print (Xmin); Serial.print (" para "); Serial.print (Xmax); Serial.println (" mm. "); Serial. print ("intervalo Y é de"); Serial.print (Ymin); Serial.print ("até"); Serial.print (Ymax); Serial.println ("mm.");} / ***** ****************** * void loop () - loop principal ************************ / void loop () {atraso (100); linha char [LINE_BUFFER_LENGTH]; char c; int lineIndex; bool lineIsComment, lineSemiColon; lineIndex =0; lineSemiColon =false; lineIsComment =false; while (1) {// Recepção serial - Principalmente de Grbl, adicionado suporte de ponto e vírgula while (Serial.available ()> 0) {c =Serial.read (); if ((c =='\ n') || (c =='\ r')) {// Fim da linha alcançado if (lineIndex> 0) {// Linha está completa. Então execute! line [lineIndex] ='\ 0'; // Terminar string if (verbose) {Serial.print ("Received:"); Serial.println (linha); } processIncomingLine (line, lineIndex); lineIndex =0; } else {// Vazio ou linha de comentário. Pular bloco. } lineIsComment =false; lineSemiColon =false; Serial.println ("ok"); } else {if ((lineIsComment) || (lineSemiColon)) {// Jogue fora todos os caracteres de comentário if (c ==')') lineIsComment =false; // Fim do comentário. Retomar linha. } else {if (c <='') {// Jogue fora os espaços em branco e os caracteres de controle} else if (c =='/') {// Bloqueio de exclusão não suportado. Ignore o personagem. } else if (c =='(') {// Habilita o sinalizador de comentários e ignora todos os caracteres até ')' ou EOL. lineIsComment =true; } else if (c ==';') {lineSemiColon =true; } else if (lineIndex> =LINE_BUFFER_LENGTH-1) {Serial.println ("ERROR - estouro de lineBuffer"); lineIsComment =false; lineSemiColon =false; } else if (c> ='a' &&c <='z') {// Linha maiúscula e minúscula [lineIndex ++] =c-'a '+' A '; } else {line [lineIndex ++] =c; }}}}}} void processIncomingLine (linha char *, int charNB) {int currentIndex =0; buffer char [64]; // Espero que 64 seja suficiente para 1 ponto de estrutura de parâmetro newPos; newPos.x =0,0; newPos.y =0,0; // Precisa interpretar // G1 para mover // G4 P300 (esperar 150ms) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (caneta para baixo) // M300 S50 (caneta para cima) // Descarte qualquer coisa com um (// Descarte qualquer outro comando! While (currentIndex =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 (""); } // Converte as coordenadas em etapas x1 =(int) (x1 * StepsPerMillimeterX); y1 =(int) (y1 * StepsPerMillimeterY); float x0 =Xpos; float y0 =Ypos; // Vamos descobrir a mudança para as coordenadas long dx =abs (x1-x0); long dy =abs (y1-y0); int sx =x0 dy) {for (i =0; i =dx) {over- =dx; myStepperY.onestep (sy, STEP); } atraso (StepDelay); }} else {for (i =0; i =dy) {over- =dy; myStepperX.onestep (sx, STEP); } atraso (StepDelay); }} if (verbose) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print (","); Serial.print (dy); Serial.println (""); } if (verbose) {Serial.print ("Indo para ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); } // Atraso antes que qualquer linha seguinte seja enviada delay (LineDelay); // Atualiza as posições Xpos =x1; Ypos =y1;} // Gera penvoid penUp () {penServo.write (penZUp); atraso (penDelay); Zpos =Zmax; digitalWrite (15, BAIXO); digitalWrite (16, ALTO); if (detalhado) {Serial.println ("Caneta para cima!"); }} // Diminui penvoid penDown () {penServo.write (penZDown); atraso (penDelay); Zpos =Zmin; digitalWrite (15, ALTO); digitalWrite (16, BAIXO); if (detalhado) {Serial.println ("Caneta para baixo."); }}
Processando código Java
Carregue este código no IDE de processamentoimport java.awt.event.KeyEvent; import javax.swing.JOptionPane; import processing.serial. *; Serial port =null; // selecione e modifique a linha apropriada para seu sistema operacional / / deixe como nulo para usar a porta interativa (pressione 'p' no programa) 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 (); porta =novo Serial (este, nome da porta, 9600); port.bufferUntil ('\ n');} void selectSerialPort () {String result =(String) JOptionPane.showInputDialog (frame, "Selecione a porta serial que corresponde à sua placa Arduino.", "Selecione a porta serial", JOptionPane. QUESTION_MESSAGE, nulo, Serial.list (), 0); if (resultado! =nulo) {portname =resultado; openSerialPort (); }} configuração vazia () {tamanho (500, 250); openSerialPort ();} void draw () {background (0); preencher (255); int y =24, dy =12; texto ("INSTRUÇÕES", 12, y); y + =dy; texto ("p:selecionar porta serial", 12, y); y + =dy; texto ("1:definir a velocidade para 0,001 polegadas (1 mil) por jog", 12, y); y + =dy; texto ("2:definir a velocidade para 0,010 polegadas (10 mil) por jog", 12, y); y + =dy; texto ("3:definir a velocidade para 0,100 polegadas (100 mil) por jog", 12, y); y + =dy; texto ("teclas de seta:mover no plano x-y", 12, y); y + =dy; texto ("page up &page down:jog no eixo z", 12, y); y + =dy; texto ("$:exibir configurações grbl", 12, y); y + =dy; texto ("h:ir para casa", 12, y); y + =dy; text ("0:zero machine (set home to the current location)", 12, y); y + =dy; texto ("g:transmitir um arquivo de código g", 12, y); y + =dy; texto ("x:interromper o streaming de código G (NÃO é imediato)", 12, y); y + =dy; y =altura - dy; texto ("velocidade atual de jog:" + velocidade + "polegadas por passo", 12, y); y - =dy; texto ("porta serial atual:" + nome da porta, 12, y); y - =dy;} void keyPressed () {if (key =='1') velocidade =0,001; if (chave =='2') velocidade =0,01; if (tecla =='3') velocidade =0,1; if (! streaming) {if (keyCode ==LEFT) port.write ("G91 \ nG20 \ nG00 X-" + velocidade + "Y0.000 Z0.000 \ n"); if (keyCode ==RIGHT) port.write ("G91 \ nG20 \ nG00 X" + velocidade + "Y0.000 Z0.000 \ n"); if (keyCode ==UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y" + velocidade + "Z0.000 \ n"); if (keyCode ==DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y-" + velocidade + "Z0.000 \ n"); if (keyCode ==KeyEvent.VK_PAGE_UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z" + velocidade + "\ n"); if (keyCode ==KeyEvent.VK_PAGE_DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z-" + velocidade + "\ 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; Arquivo arquivo =nulo; println ("Carregando arquivo ..."); selectInput ("Selecione um arquivo para processar:", "fileSelected", arquivo); } if (key =='x') streaming =false;} void fileSelected (Seleção de arquivo) {if (selection ==null) {println ("A janela foi fechada ou o usuário clicou em cancelar."); } else {println ("Usuário selecionado" + selection.getAbsolutePath ()); gcode =loadStrings (selection.getAbsolutePath ()); if (gcode ==null) return; streaming =verdadeiro; Stream(); }} void stream () {if (! streaming) return; while (verdadeiro) {if (i ==gcode.length) {streaming =false; Retorna; } if (gcode [i] .trim (). length () ==0) i ++; senão quebrar; } 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 ("erro")) stream (); // XXX:realmente?}
Esquemas
conecte todos os componentes como mostrado na figuraProcesso de manufatura
- Faça uma máquina de escrever trabalhos de casa DIY em casa
- Faça Monitor Ambilight usando Arduino
- Sistema de detecção de humanos usando Arduino Uno
- Brinquedo controlado pelo Android usando Raspberry Motor Shield
- Como fazer um botão de teclado punível personalizável
- Como medir a massa da Terra usando o Arduino
- Como criar um site de comunicação do Arduino usando PHP
- Como fazer música com um Arduino
- Como fazer a abertura automática de porta baseada no Arduino
- Como fazer uma bússola usando Arduino e IDE de processamento