Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как сделать мини-плоттер с ЧПУ 2D с помощью DVD-привода для лома, L293D

Компоненты и расходные материалы

Arduino UNO
Мозг машины
× 1
Щит двигателя L293D
Управление шаговыми двигателями оси
× 1
Серводвигатель Tower Pro 9g
Ручка перемещения Zaxis вверх и ручка вниз
× 1
Записки DVD Dr
механическая ось X и ось Y
× 1
Перемычки (общие)
× 1

Приложения и онлайн-сервисы

IDE Arduino
IDE обработки
Inkscape

Об этом проекте

Расположите два DVD-привода для лома, как показано на рисунке

1. Загрузить Arduino IDE

2. Загрузить Processing IDE

3. Откройте Arduino IDE и загрузите код, загруженный с здесь .

4. Откройте среду Processing и загрузите код, загруженный с здесь .

Откройте дисковод для лома DVD и извлеките внутренний движущийся лоток. Этот лоток с шаговым механизмом будет действовать как ось X и ось Y. Просмотрите прикрепленные изображения, чтобы понять, как собрать машину. Сделайте отверстие в пустом корпусе DVD-привода, закрепите оси X и Y на соответствующем корпусе DVD с помощью гаечных болтов.

Теперь разместите их перпендикулярно друг другу.

Код G

Чтобы сделать файлы G-кода, совместимые с этим станком с ЧПУ, вы должны использовать Inkscape.

Inkscape - это программа для работы с векторной графикой профессионального качества, работающая в Windows, Mac OS X и Linux. Он используется профессионалами в области дизайна и любителями по всему миру для создания разнообразной графики, такой как иллюстрации, значки, логотипы, диаграммы, карты и веб-графика. Inkscape использует открытый стандарт W3C SVG (масштабируемая векторная графика) в качестве собственного формата и является бесплатным программным обеспечением с открытым исходным кодом. Загрузите и установите Inkscape отсюда.

( Важно :скачать версию 0.48.5) Теперь вам нужно установить надстройку, которая позволяет экспортировать изображения в файлы g-кода. Это дополнение можно найти здесь с примечаниями по установке.

Следите за видео на YouTube, как создать файл G-кода.

  • Загрузите файл gctrl в обрабатывающую среду IDE и нажмите кнопку PLAY в окне обработки.
  • Сначала нажмите "p", чтобы выбрать порт связи.
  • При желании вы можете установить скорость бега, нажав кнопку 1,2 или 3 на клавиатуре.
  • Нажмите 'g', чтобы загрузить файл G-кода.
  • Ваша машина будет готова к печати, как только вы нажмете клавишу ввода, выбрав файл g-кода.

Теперь ваш плоттер готов. Некоторые готовые ссылки для скачивания файла 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

Спасибо за внимание! Посетите эту ссылку для полной иллюстрации.

Видео, чтобы увидеть машину вживую:

Код

  • Код ЧПУ Arduino
  • Код обработки
Код ЧПУ Arduino Arduino
Загрузите этот код в Arduino
 #include  #include  #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP; // Положение сервопривода для Up и Down const int penZUp =95; const int penZDown =83; // Сервопривод на выводе ШИМ 10const int penServoPin =10; // Должно быть подходящим для степперов DVD, но здесь не так важно const int stepsPerRevolution =48; // создание сервообъекта для управления сервоприводом Servo penServo; // Инициализируем шаговые двигатели для осей X и Y, используя эти выводы Arduino для H-моста L293D AF_Stepper myStepperY (stepsPerRevolution, 1); AF_Stepper myStepperX (stepsPerRevolution, 2); / * Структуры, глобальные переменные * / struct point {float x; float y; float z; }; // Текущая позиция plotheadstruct point actatorPos; // Настройки рисования должны быть в порядке float StepInc =1; int StepDelay =0; int LineDelay =0; int penDelay =50; // Шаг двигателя до 1 миллиметра. тестовый скетч пройти 100 шагов. Измерьте длину лески. // Рассчитываем шаги на мм. Введите сюда. Float StepsPerMillimeterX =100.0; float StepsPerMillimeterY =100.0; // Рисуем пределы робота в мм // Начнем с ОК. При хорошей калибровке может доходить до 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; // Установите значение true, чтобы получить отладочный вывод. Boolean verbose =false; // Требуется интерпретировать // G1 для перемещения // G4 P300 (ожидание 150 мс) // M300 S30 (перо вниз) // M300 S50 (перо вверх) / / Отменить все с помощью (// Отменить любую другую команду! / ********************** * void setup () - Инициализации ******* **************** / void setup () {// Настройка Serial.begin (9600); penServo.attach (penServoPin); penServo.write (penZUp); delay (100); // При необходимости уменьшите myStepperX.setSpeed ​​(600); myStepperY.setSpeed ​​(600); // Установить и переместить в исходное положение по умолчанию // TBD // Уведомления !!! Serial.println ("Мини-плоттер с ЧПУ жив и работает! "); Serial.print (" Диапазон X от "); Serial.print (Xmin); Serial.print (" to "); Serial.print (Xmax); Serial.println (" мм. "); Serial. print ("Диапазон Y от"); Serial.print (Ymin); Serial.print ("to"); Serial.print (Ymax); Serial.println ("мм.");} / ***** ***************** * void loop () - Основной цикл ********************** / void цикл () {задержка (100); строка символов [LINE_BUFFER_LENGTH]; char c; int lineIndex; bool lineIsComment, lineSemiColon; lineIndex =0; lineSemiColon =false; lineIsComment =false; while (1) {// Последовательный прием - в основном из Grbl, добавлена ​​поддержка точки с запятой while (Serial.available ()> 0) {c =Serial.read (); if ((c =='\ n') || (c =='\ r')) {// Достигнут конец строки if (lineIndex> 0) {// Строка завершена. Тогда выполняй! строка [lineIndex] ='\ 0'; // Завершить строку if (verbose) {Serial.print ("Received:"); Serial.println (строка); } processIncomingLine (строка, lineIndex); lineIndex =0; } else {// Пустая строка или строка комментария. Пропустить блок. } lineIsComment =false; lineSemiColon =false; Serial.println ("ок"); } else {if ((lineIsComment) || (lineSemiColon)) {// Выбрасываем все символы комментария if (c ==')') lineIsComment =false; // Конец комментария. Строка резюме. } else {if (c <='') {// Выбрасываем пробелы и управляющие символы} else if (c =='/') {// Удаление блока не поддерживается. Игнорировать персонажа. } else if (c =='(') {// Включить флаг комментариев и игнорировать все символы до ')' или EOL. lineIsComment =true; } иначе, если (c ==';') {lineSemiColon =true; } else if (lineIndex> =LINE_BUFFER_LENGTH-1) {Serial.println ("ОШИБКА - переполнение буфера строки"); lineIsComment =false; lineSemiColon =false; } else if (c> ='a' &&c <='z') {// Строка нижнего регистра в верхнем регистре [lineIndex ++] =c-'a '+' A '; } еще {строка [lineIndex ++] =c; }}}}}} void processIncomingLine (char * line, int charNB) {int currentIndex =0; char buffer [64]; // Надеемся, что 64 будет достаточно для 1 параметра struct point newPos; newPos.x =0,0; newPos.y =0,0; // Требуется интерпретация // G1 для перемещения // G4 P300 (ожидание 150 мс) // G1 X60 Y30 // G1 X30 Y50 // M300 S30 (перо вниз) // M300 S50 (перо вверх) // Отбросить все, что есть (// Отменить любую другую команду! While (currentIndex  =Xmax) {x1 =Xmax; } если (x1 <=Xmin) {x1 =Xmin; } если (y1> =Ymax) {y1 =Ymax; } если (y1 <=Ymin) {y1 =Ymin; } если (подробный) {Serial.print ("Xpos, Ypos:"); Serial.print (Xpos); Serial.print (","); Serial.print (Ypos); Serial.println (""); } если (подробный) {Serial.print ("x1, y1:"); Serial.print (x1); Serial.print (","); Serial.print (y1); Serial.println (""); } // Преобразуем координаты в шаги x1 =(int) (x1 * StepsPerMillimeterX); y1 =(число) (y1 * StepsPerMillimeterY); float x0 =Xpos; float y0 =Ypos; // Узнаем изменение координат long dx =abs (x1-x0); long dy =abs (y1-y0); int sx =x0  dy) {для (i =0; i  =dx) {над- =dx; myStepperY.onestep (sy, ШАГ); } задержка (StepDelay); }} else {для (я =0; я  =dy) {над- =dy; myStepperX.onestep (sx, ШАГ); } задержка (StepDelay); }} если (подробный) {Serial.print ("dx, dy:"); Serial.print (dx); Serial.print (","); Серийный принт (dy); Serial.println (""); } if (подробный) {Serial.print ("Переход к ("); Serial.print (x0); Serial.print (","); Serial.print (y0); Serial.println (")"); } // Задержка перед отправкой следующих строк delay (LineDelay); // Обновляем позиции Xpos =x1; Ypos =y1;} // Поднимает penvoid penUp () {penServo.write (penZUp); задержка (penDelay); Zpos =Zmax; digitalWrite (15, НИЗКИЙ); digitalWrite (16, ВЫСОКИЙ); if (подробный) {Serial.println ("Ручка вверх!"); }} // Понижает penvoid penDown () {penServo.write (penZDown); задержка (penDelay); Zpos =Zmin; digitalWrite (15, ВЫСОКИЙ); digitalWrite (16, НИЗКИЙ); if (подробный) {Serial.println ("Перо вниз."); }} 
Код обработки Java
Загрузите этот код в Processing IDE
 import java.awt.event.KeyEvent; import javax.swing.JOptionPane; import processing.serial. *; Serial port =null; // выберите и измените соответствующую строку для вашей операционной системы / / оставьте значение null, чтобы использовать интерактивный порт (нажмите в программе 'p') String portname =null; // String portname =Serial.list () [0]; // Mac OS X // Строка portname ="/ dev / ttyUSB0"; // Linux // Строка portname ="COM6"; // Windowsboolean streaming =false; float speed =0.001; String [] gcode; int i =0; void openSerialPort () {if (portname ==null) return; если (порт! =ноль) port.stop (); порт =новый последовательный (это, имя порта, 9600); port.bufferUntil ('\ n');} void selectSerialPort () {String result =(String) JOptionPane.showInputDialog (frame, «Выберите последовательный порт, соответствующий вашей плате Arduino.», «Выберите последовательный порт», JOptionPane. QUESTION_MESSAGE, null, Serial.list (), 0); если (результат! =ноль) {имя порта =результат; openSerialPort (); }} void setup () {size (500, 250); openSerialPort ();} void draw () {фон (0); заполнить (255); int y =24, dy =12; текст («ИНСТРУКЦИЯ», 12, y); y + =dy; текст («p:выберите последовательный порт», 12, y); y + =dy; text («1:установить скорость 0,001 дюйма (1 мил) на шаг», 12, y); y + =dy; text («2:установить скорость 0,010 дюйма (10 мил) на шаг», 12, y); y + =dy; text («3:установить скорость 0,100 дюйма (100 мил) на шаг», 12, y); y + =dy; текст («клавиши со стрелками:бег в плоскости x-y», 12, y); y + =dy; текст ("страница вверх и страница вниз:перемещение по оси z", 12, y); y + =dy; text ("$:отображать настройки grbl", 12, y); y + =dy; текст («ч:иди домой», 12, у); y + =dy; text ("0:нулевая машина (установить текущее местоположение)", 12, y); y + =dy; text ("g:поток файла с g-кодом", 12, y); y + =dy; text ("x:остановить потоковую передачу g-кода (это НЕ сразу)", 12, y); y + =dy; y =высота - dy; текст ("текущая скорость толчкового режима:" + скорость + "дюймов на шаг", 12, y); y - =dy; текст ("текущий последовательный порт:" + имя порта, 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-" + скорость + "Y0.000 Z0.000 \ n"); if (keyCode ==RIGHT) port.write ("G91 \ nG20 \ nG00 X" + скорость + "Y0.000 Z0.000 \ n"); if (keyCode ==UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y" + скорость + "Z0.000 \ n"); if (keyCode ==DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y-" + скорость + "Z0.000 \ n"); if (keyCode ==KeyEvent.VK_PAGE_UP) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z" + скорость + "\ n"); if (keyCode ==KeyEvent.VK_PAGE_DOWN) port.write ("G91 \ nG20 \ nG00 X0.000 Y0.000 Z-" + скорость + "\ 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"); // если (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"); если (ключ =='d') port.write ("$ 16 =0 \ n"); если (ключ =='0') openSerialPort (); если (ключ =='p') selectSerialPort (); если (ключ =='$') port.write ("$$ \ n"); } если (! потоковая передача &&ключ =='g') {gcode =null; я =0; Файл file =null; println ("Загрузка файла ..."); selectInput («Выберите файл для обработки:», «fileSelected», файл); } if (key =='x') streaming =false;} void fileSelected (Выбор файла) {if (selection ==null) {println ("Окно было закрыто или пользователь нажал кнопку отмены."); } else {println ("Выбрано пользователем" + selection.getAbsolutePath ()); gcode =loadStrings (selection.getAbsolutePath ()); если (gcode ==null) возврат; streaming =true; ручей(); }} void stream () {если (! streaming) return; в то время как (истина) {если (я ==gcode.length) {поток =ложь; возвращение; } если (gcode [i] .trim (). length () ==0) i ++; иначе сломаться; } println (gcode [я]); порт.write (gcode [я] + '\ n'); я ++;} void serialEvent (серийный p) {String s =p.readStringUntil ('\ n'); println (s.trim ()); если (s.trim (). startWith ("хорошо")) stream (); если (s.trim (). startWith ("ошибка")) stream (); // XXX:правда?} 

Схема

подключите все компоненты, как показано на рисунке

Производственный процесс

  1. Сделайте машинку для письма домашнего задания дома
  2. Создание монитора Ambilight с помощью Arduino
  3. Робототехническая система для обнаружения человека с использованием Arduino Uno
  4. Игрушка под управлением Android с использованием Raspberry Motor Shield
  5. Как создать настраиваемую перфорированную кнопку клавиатуры
  6. Как измерить массу Земли с помощью Arduino
  7. Как создать веб-сайт, взаимодействующий с Arduino с помощью PHP
  8. Как создавать музыку с помощью Arduino
  9. Как сделать автоматическое открывание дверей на базе Arduino
  10. Как сделать компас с помощью Arduino и Processing IDE