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 = 1; // množstvo krokov po "homingu"
int duty = 19; // pracovný cyklus 1 pixelu
byte pxln = 8; // množstvo pixelov tlačených naraz
byte hdstdly = 30; // čas medzi polpulzmi kroku posuvu tlačovej hlavy
byte pfstdly = 60; // čas medzi polpulzmi kroku posuvu papiera
byte naTlac[8][121]; // alokované bajty (čislo v hr. zátvorkách sa musí rovnať hodnote maxpix a pxln)
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
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; // hodnota čítaná z UART
byte pinval1 = 0; // hodnota ihličky číslo 1
byte pinval2 = 0; // hodnota ihličky číslo 2
byte pinval3 = 0; // hodnota ihličky číslo 3
byte pinval4 = 0; // hodnota ihličky číslo 4
byte pinval5 = 0; // hodnota ihličky číslo 5
byte pinval6 = 0; // hodnota ihličky číslo 6
byte pinval7 = 0; // hodnota ihličky číslo 7
byte pinval8 = 0; // hodnota ihličky číslo 8
int line = 0;
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(8, OUTPUT); // tlačiaca ihlička 1
pinMode(9, OUTPUT); // tlačiaca ihlička 2
pinMode(10, OUTPUT); // tlačiaca ihlička 3
pinMode(11, OUTPUT); // tlačiaca ihlička 4
pinMode(12, OUTPUT); // tlačiaca ihlička 5
pinMode(13, OUTPUT); // tlačiaca ihlička 6
pinMode(20, OUTPUT); // tlačiaca ihlička 7
pinMode(21, OUTPUT); // tlačiaca ihlička 8 (len pre tlač grafiky)
pinMode(5, INPUT_PULLUP); // koncový kalibračný spínač
pinMode(A1, INPUT_PULLUP); // posuv o 5mm vpred
pinMode(A2, INPUT_PULLUP); // posuv o 5mm dozadu
Serial.begin(115200);
Serial.write(0x0A); // tento riadok môžete vynechať
shlulls();
}
void loop() {
if (Serial.available()) {
fdp = Serial.read();
if (fdp == 49) {
naTlac[line][printpix] = 1;
if (printpix >= maxpix - offset) {
printpix = 0;
line = line + 1;
}
else {
printpix = printpix + 1;
}
}
if (fdp == 48) {
naTlac[line][printpix] = 0;
if (printpix >= maxpix - offset) {
printpix = 0;
line = line + 1;
}
else {
printpix = printpix + 1;
}
}
if(line > pxln - 1) {
Serial.write(0x13);
toprint = 1;
line = 0;
}
}
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 + 1) * stpx;
digitalWrite(2, LOW);
if (toprint == 1) {
while (pixel <= maxpix - 1) {
tarstep = (pixel + 1) * stpx;
pinval1 = naTlac[0][pixel];
pinval2 = naTlac[1][pixel];
pinval3 = naTlac[2][pixel];
pinval4 = naTlac[3][pixel];
pinval5 = naTlac[4][pixel];
pinval6 = naTlac[5][pixel];
pinval7 = naTlac[6][pixel];
pinval8 = naTlac[7][pixel];
while (tarstep > step) {
tarstep = (pixel + 1) * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(hdstdly);
digitalWrite(3, LOW);
delayMicroseconds(hdstdly);
if (tarstep - step <= duty) {
fastwrite(0);
}
else {
fastwrite(1);
}
step = step + 1;
}
if (tarstep <= step) {
pixel = pixel + 1;
}
}
}
toprint = 0;
printdir = 1;
stepLinefeed();
}
void stepLinefeed() {
stplnfdamnt = stlf * pxln;
while (stplnfdamnt >= 1) {
digitalWrite(4, HIGH);
delayMicroseconds(pfstdly);
digitalWrite(4, LOW);
delayMicroseconds(pfstdly);
stplnfdamnt = stplnfdamnt - 1;
}
printpix = 0;
clearing = 0;
for (int i = 0; i <= maxpix; i = i + 1) {
naTlac[0][i] = 0;
naTlac[1][i] = 0;
naTlac[2][i] = 0;
naTlac[3][i] = 0;
naTlac[4][i] = 0;
naTlac[5][i] = 0;
naTlac[6][i] = 0;
naTlac[7][i] = 0;
}
Serial.write(0x11);
Serial.write(0x41);
}
void stepMovePrintReverse() { // tlačenie jedného riadku
tarstep = (pixel + 1) * stpx;
digitalWrite(2, HIGH);
if (toprint == 1) {
while (pixel >= 0) {
tarstep = (pixel + 1) * stpx;
if (pixel > -1) {
pinval1 = naTlac[0][pixel];
pinval2 = naTlac[1][pixel];
pinval3 = naTlac[2][pixel];
pinval4 = naTlac[3][pixel];
pinval5 = naTlac[4][pixel];
pinval6 = naTlac[5][pixel];
pinval7 = naTlac[6][pixel];
pinval8 = naTlac[7][pixel];
}
if (pixel == -1) {
pinval1 = naTlac[0][0];
pinval2 = naTlac[1][0];
pinval3 = naTlac[2][0];
pinval4 = naTlac[3][0];
pinval5 = naTlac[4][0];
pinval6 = naTlac[5][0];
pinval7 = naTlac[6][0];
pinval8 = naTlac[7][0];
}
while (tarstep < step) {
tarstep = (pixel + 1) * stpx;
digitalWrite(3, HIGH);
delayMicroseconds(hdstdly);
digitalWrite(3, LOW);
delayMicroseconds(hdstdly);
if (step - tarstep <= duty) {
fastwrite(0);
}
else {
fastwrite(1);
}
step = step - 1;
}
if (tarstep >= step) {
pixel = pixel - 1;
}
}
}
toprint = 0;
printdir = 0;
stepLinefeed();
}
void shlulls() {
digitalWrite(2, HIGH);
while (digitalRead(5) == HIGH) {
digitalWrite(3, HIGH);
delayMicroseconds(156);
digitalWrite(3, LOW);
delayMicroseconds(156);
}
while (step <= sthm) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delayMicroseconds(125);
digitalWrite(3, LOW);
delayMicroseconds(125);
step = step + 1;
}
tarstep = 0;
step = 0;
pixel = 0;
printpix = 0;
}
void stepMoveBlankLineForwards() {
linfdstep = stlf * pxln;
while (linfdstep > 0) {
digitalWrite(4, HIGH);
delayMicroseconds(pfstdly);
digitalWrite(4, LOW);
delayMicroseconds(pfstdly);
linfdstep = linfdstep - 1;
}
}
void stepMoveBlankLineBackwards() {
linfdstep = stlf * pxln;
digitalWrite(7, LOW);
while (linfdstep > 0) {
digitalWrite(4, HIGH);
delayMicroseconds(pfstdly);
digitalWrite(4, LOW);
delayMicroseconds(pfstdly);
linfdstep = linfdstep - 1;
}
}
void fastwrite(byte allow) {
int pwrite = (pinval8 << 7) + (pinval7 << 6) + (pinval6 << 5) + (pinval5 << 4) + (pinval4 << 3) + (pinval3 << 2) + (pinval2 << 1) + (pinval1);
if(allow == 0) {
PORTB = 0;
}
if(allow == 1) {
PORTB = pwrite;
}
}
Homing switch
Line feed
Carriage move
Paper feed out of printer
Paper feed into printer