int maxpix = 120; // maximálna poloha v pixeloch
int stpx = 27; // lineárna závislosť medzi krokmi a bodmi
int stlf = 61; // množstvo krokov na posunutie o jeden pixelový riadok
int offset = 1; // offset od nominálnej hodnoty
int sthm = 600; // množstvo krokov po "homingu"
int duty = 18; // pracovný cyklus 1 pixelu
byte naTlac[130]; // alokované bajty (čislo v hr. zátvorkách sa musí rovnať hodnote maxpix)
long step = 0; // kroky motora tlačovej hlavy
long tarstep = 0; // cieľová pozícia motora tlačovej hlavy
long printpix = 0; // pixel na tlač
long pixel = 0; // horizontálna poloha v pixeloch
long stplnfdamnt = 0; // relatívne množstvo krokov na posuv papiera o riadok
byte val = 0; // hodnota čítaná z array naTlac
int toprint = 0; // má sa tlačiť? Platí len pre jeden riadok pixelov
int printdir = 0; // smer tlače
unsigned int clearing = 0;
long linfdstep = 0; // množstvo krokov na posuv riadku
byte fdp = 0;
int carrstepdelay = 30; // čas medzi polpulzmi kroku pre posuv tlačovej hlavy
void setup() {
pinMode(2, OUTPUT); // stepper 1 dir
pinMode(3, OUTPUT); // stepper 1 step
pinMode(7, OUTPUT); // stepper 2 dir
pinMode(4, OUTPUT); // stepper 2 step
pinMode(5, OUTPUT); // tlačiaca ihlička
pinMode(6, INPUT_PULLUP); // koncový kalibračný spínač
pinMode(A1, INPUT_PULLUP); // posuv o 5mm vpred (400 krokov)
pinMode(A2, INPUT_PULLUP); // posuv o 5mm dozadu (400 krokov)
digitalWrite(7, HIGH);
Serial.begin(57600);
Serial.write(0x0A); // tento riadok môžete vynechať
shlulls();
}
void loop() {
if (Serial.available()) {
fdp = Serial.read();
if (fdp == 49) {
naTlac[printpix] = 1;
if (printpix >= maxpix - offset) {
Serial.write(0x13);
printpix = 0;
toprint = 1;
}
else {
printpix = printpix + 1;
}
}
if (fdp == 48) {
naTlac[printpix] = 0;
if (printpix >= maxpix - offset) {
Serial.write(0x13);
printpix = 0;
toprint = 1;
}
else {
printpix = printpix + 1;
}
}
}
if (fdp == 50) {
fdp = 0;
stepMoveBlankLineForwards();
}
if (fdp == 51) {
fdp = 0;
stepMoveBlankLineBackwards();
}
if (toprint == 1 && printdir == 0) {
stepMovePrint();
}
if (toprint == 1 && printdir == 1) {
stepMovePrintReverse();
}
if (digitalRead(A1) == LOW) {
delay(250);
stepMoveBlankLineForwards();
}
if (digitalRead(A2) == LOW) {
delay(250);
stepMoveBlankLineBackwards();
}
}
void stepMovePrint() { // tlačenie jedného riadku
tarstep = pixel * stpx;
digitalWrite(2, LOW);
if (toprint == 1) {
while (pixel <= maxpix - 1) {
tarstep = pixel * stpx;
val = naTlac[pixel];
while (tarstep > step) {
tarstep = pixel * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(carrstepdelay);
digitalWrite(3, LOW);
delayMicroseconds(carrstepdelay);
if (tarstep - step <= duty) {
digitalWrite(5, LOW);
}
else {
digitalWrite(5, val);
}
step = step + 1;
}
if (tarstep <= step) {
pixel = pixel + 1;
}
}
}
toprint = 0;
digitalWrite(5, LOW);
printdir = 1;
stepLinefeed();
}
void stepLinefeed() {
digitalWrite(7, HIGH);
stplnfdamnt = stlf;
while (stplnfdamnt >= 1) {
digitalWrite(4, HIGH);
delayMicroseconds(60);
digitalWrite(4, LOW);
delayMicroseconds(60);
stplnfdamnt = stplnfdamnt - 1;
}
printpix = 0;
clearing = 0;
for (int i = 0; i <= maxpix; i = i + 1) {
naTlac[i] = 0;
}
Serial.write(0x11);
Serial.write(0x41);
}
void stepMovePrintReverse() { // tlačenie jedného riadku
tarstep = pixel * stpx;
digitalWrite(2, HIGH);
if (toprint == 1) {
while (pixel >= 0) {
tarstep = pixel * stpx;
if (pixel > -1) {
val = naTlac[pixel];
}
if (pixel == -1) {
val = naTlac[0];
}
while (tarstep < step) {
tarstep = pixel * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(carrstepdelay);
digitalWrite(3, LOW);
delayMicroseconds(carrstepdelay);
if (step - tarstep <= duty) {
digitalWrite(5, LOW);
}
else {
digitalWrite(5, val);
}
step = step - 1;
}
if (tarstep >= step) {
pixel = pixel - 1;
}
}
}
digitalWrite(5, LOW);
toprint = 0;
printdir = 0;
stepLinefeed();
}
void shlulls() {
digitalWrite(2, HIGH);
while (digitalRead(6) == HIGH) {
digitalWrite(3, HIGH);
delayMicroseconds(250);
digitalWrite(3, LOW);
delayMicroseconds(250);
}
while (step <= sthm) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delayMicroseconds(250);
digitalWrite(3, LOW);
delayMicroseconds(250);
step = step + 1;
}
tarstep = 0;
step = 0;
pixel = 0;
printpix = 0;
}
void stepMoveBlankLineForwards() {
linfdstep = stlf * 15;
digitalWrite(7, HIGH);
while (linfdstep > 0) {
digitalWrite(4, HIGH);
delayMicroseconds(60);
digitalWrite(4, LOW);
delayMicroseconds(60);
linfdstep = linfdstep - 1;
}
}
void stepMoveBlankLineBackwards() {
linfdstep = stlf * 15;
digitalWrite(7, LOW);
while (linfdstep > 0) {
digitalWrite(4, HIGH);
delayMicroseconds(60);
digitalWrite(4, LOW);
delayMicroseconds(60);
linfdstep = linfdstep - 1;
}
}