Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como fazer mini plotter CNC 2D usando drive de DVD de sucata, L293D

Componentes e suprimentos

Arduino UNO
Cérebro da máquina
× 1
Blindagem do motor L293D
Motores de passo de controle do eixo
× 1
Tower pro Servo motor 9g
Caneta de movimento Zaxis PARA CIMA e caneta PARA BAIXO
× 1
Scrap DVD Dr
eixo X mecânico e eixo Y
× 1
Fios de jumpers (genérico)
× 1

Aplicativos e serviços online

Arduino IDE
Processando IDE
Inkscape

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 processamento
 import 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 figura

Processo de manufatura

  1. Faça uma máquina de escrever trabalhos de casa DIY em casa
  2. Faça Monitor Ambilight usando Arduino
  3. Sistema de detecção de humanos usando Arduino Uno
  4. Brinquedo controlado pelo Android usando Raspberry Motor Shield
  5. Como fazer um botão de teclado punível personalizável
  6. Como medir a massa da Terra usando o Arduino
  7. Como criar um site de comunicação do Arduino usando PHP
  8. Como fazer música com um Arduino
  9. Como fazer a abertura automática de porta baseada no Arduino
  10. Como fazer uma bússola usando Arduino e IDE de processamento