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, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
