Dotter - большой матричный принтер на Arduino


Dotter — самодельный матричный принтер под управлением контроллера Arduino Uno.
В конструкции используется три шаговых двигателя: два для продвижения бумаги, а третий для позиционирования каретки.
На каретке установлена сервомашинка, по мере необходимости, толкающая маркер, который и ставит точки на листе бумаги.
Управление двигателями происходит по командам с компьютера от программы на Processing-е.

Программа для Arduino

/*
 * Created by Nikodem Bartnik
 * nikodembartnik.pl
 * If you want to shar this project remember to put link to the original project and my website
 * thank you
 * Happy making!
 * Because of SD library file names must be max 8 character and file extension max 3 character long (i.e. print.gco)
 */
#include "Motor.cpp"
#include "config.h"
#include <Servo.h>

Motor motorX(2, 3, 4, 5);
Motor motorY(8, 9, 10, 11);

Motor motorZ(18, 19, 20, 21);
Motor motorE(22, 23, 24, 25);
Servo servo;
bool currentSide = false;
int last_line_steps = 0;
bool first_trace = true;
String command;
void setup() {

Serial.begin(9600);
servo.attach(7);

servo.write(50);

}

void loop() {

while (Serial.available()){ 
  delay(10); 
  char command_char = Serial.read(); 
  if (command_char == '#') {break;} 
  command += command_char; 
  }
  if (command.length() > 0) {
    if(command.equals("1")){
      for(int i = 0; i < 50; i++){
      motorX.oneStep(1);
      last_line_steps++;
      delay(3);
      }
      servo.write(20);
      delay(200);
      servo.write(50);
      
    }else if(command.equals("0")){
      for(int i = 0; i < 50; i++){  
      motorX.oneStep(1);
      last_line_steps++;      
      delay(3);
      }
    }else if(command.equals("2")){
      for(int a = 0; a < last_line_steps; a++){
          motorX.oneStep(0);
        delay(3);
      }
      motorX.disableCoils();
      last_line_steps = 0;

      for(int b = 0; b < 60; b++){
     motorY.oneStep(0);
     delay(3);
    }
    motorY.disableCoils();
    }
    command = "";
  } 
  }



Программа для Processing-а

import processing.serial.*;
Serial serial;
PImage img;
String file_path;
Boolean file_choosed = false;
String command_line;
//#whenYouDontKnowHowToNameTheVariable
boolean there_will_be_a_dot_in_this_line;
int last_line_steps = 0;
int delay_this_line = 0;
boolean pressed = false;
String portName;
void setup() {
  size(400, 210);
  background(255,255);

portName = Serial.list()[1];
      serial = new Serial(this, portName, 9600);
  
  
  
}
void draw() {
  fill(255);
  rect(-1,-1, 401, 211);
  //open file button
   fill(255);
   rect(10,10, 140, 30);
   fill(0);
   text("OPEN IMAGE", 40,30);
   
   //open serial
   fill(255);
   rect(10,50, 140, 30);
   fill(0);
   text("OPEN SERIAL", 40,70);
   
   //load paper
   fill(255);
   rect(10,90, 140, 30);
   fill(0);
   text("LOAD PAPER", 40,110);
   
   //stop
   fill(255);
   rect(10,130, 140, 30);
   fill(0);
   text("STOP", 63,150);
   fill(255);
   
   fill(0);
   text("MADE BY NIKODEM BARTNIK \n                10.2017", 10,185);
   text("THIS PROJECT IS CALLED DOTER \n GOOGLE IT TO FIND MORE INFO", 180, 90);
   
 if(mouseButton == LEFT){
  if(mouseX > 10 && mouseX < 10 + 140 && mouseY > 10 && mouseY < 10 + 30 && pressed == false){
    if(serial != null){
   selectInput("Select a file to process:", "fileSelected");
   pressed = true;
    }else{
      print("Firstly connect to serial port");
    }
  }else if(mouseX > 10 && mouseX < 10 + 140 && mouseY > 50 && mouseY < 50 + 30 && pressed == false){
      //if you can't connect to serial port, change [1] to oder number that you have your arduino on
      

   pressed = true;
  
  }else if(mouseX > 10 && mouseX < 10 + 140 && mouseY > 90 && mouseY < 90 + 30 && pressed == false){
    try{
   serial.write("load paper#");
    }catch(Exception e){
    }
   pressed = true;
  
  }
  
 }
  
  
  if(file_choosed){
    image(img, 0, 0);
  img.loadPixels(); 
  println("Width: " + img.width);
  println("Height: " + img.height);
  for (int y = 0; y < img.height; y++) {
    boolean there_is_a_dot = false;
    for (int x_temp = 0; x_temp < img.width; x_temp++) { 
      if (img.pixels[x_temp + y * img.width] >= color(128)) {
        there_is_a_dot = true;
      }
    }
    if(there_is_a_dot){
      there_will_be_a_dot_in_this_line = true;
    for (int x = 0; x < img.width; x++) { 
      if(there_will_be_a_dot_in_this_line){
      if (img.pixels[x + y*img.width] >= color(128)) {
        serial.write("0#");
        print("0");
        last_line_steps++;
        delay(170);
      }
      else {
        print("1");
        serial.write("1#");
        last_line_steps++;
        delay(380);
      }
      
      there_will_be_a_dot_in_this_line = false;
    for (int xyz = x+1; xyz < img.width; xyz++) { 
        if (img.pixels[xyz + y*img.width] <= color(128)) {
       there_will_be_a_dot_in_this_line = true;
      }
    
       
    
    }
      
    }
    }
    }
   // command_line += "#";
   // serial.write(command_line);
  //  command_line = "";
   // while(serial.readStringUntil('\n') ==  null){};
    
    println("");
   
    serial.write("2#");
    delay(last_line_steps * 170);
    delay_this_line = 0;
    last_line_steps = 0;
  }
  file_choosed = false;
  }
}

void fileSelected(File selection) {
  if (selection == null) {
    println("Window was closed or the user hit cancel.");
    file_path = "";
  } else {
    println("User selected " + selection.getAbsolutePath());
    file_path = selection.getAbsolutePath().toString();
    img = loadImage(file_path);
    file_choosed = true;
    
  }
}

void mouseReleased() {
  pressed = false;
}


Ссылки
Dotter — huge Arduino based dot matrix printer

По теме
3D-принтер из старых DVD
Farmbot — открытый проект робота-садовника на базе Raspberry Pi и Arduino
Простой ЧПУ под управлением Arduino

Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
  • 0
  • 30 января 2018, 10:09
  • admin

Комментарии (0)

RSS свернуть / развернуть

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