Hola Habr!
Una vez que tuve un "trabajo", fue necesario administrar la caja registradora Shtrikh-FR-K. Desde que mi carrera comenzó con la reparación de KKT, decidí retomar este trabajo.

Así es como se ve la taquilla y la imagen de prueba de mi colega:

Además, más allá del control de los motores y el cabezal térmico en el dispositivo, tuve que escribir un pequeño script de Python usando la biblioteca OpenCV. Entonces vamos.
Todo comenzó con el estudio de rem. muelle a esta caja registradora y la posterior conexión del analizador lógico a los pines del cabezal térmico. Envié la letra "C" para imprimir a través de una prueba de barra. Y esto es lo que obtuve:

Según DATA, el valor de los puntos (432 puntos por línea), SCK - señal de reloj, STB0, STB1, STB2 - luces estroboscópicas para calentar el cabezal térmico, LATCH - bloqueo de datos. Conduje una línea hacia la caja registradora, la quemé y seguí.
El siguiente paso fue finalizar la junta para acelerar el proceso de desarrollo.

Ahora pasemos al código.
void go(int n, int shag) { switch (shag) { case 0: PORTA=0b10001000; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 1: PORTA=0b10101010; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 2: PORTA=0b00100010; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 3: PORTA=0b01100110; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 4: PORTA=0b01000100; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 5: PORTA=0b01010101; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 6: PORTA=0b00010001; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; case 7: PORTA=0b10011001; PORTD|=(1<<2); dela(n); PORTD&=0b11111011; PORTA=0; PORTD|=(1<<2); PORTD&=0b11111011; break; } }
Hay dos circuitos de control de motor paso a paso para esta taquilla. 4 pasos y 8 pasos. Elegí 8 porque los motores funcionaban mejor.
#define DATA 2 #define SCK 1 #define LATCH 3 #define STB0 2 #define STB1 3 #define STB2 4 #define DATA_IN PORTB #define STB_IN PORTE int sck() { _delay_us(3); DATA_IN|= (1<<SCK); DATA_IN&= 0b11111101; } int x; int bit; void bait(int bait1) { x=0; while(x<8) { bit|= (1<<x); bit =bait1&bit; if (bit>0) { DATA_IN|=(1<<DATA); } else {DATA_IN&=0b11111011;} sck(); x++; } } void latch() { DATA_IN&=0b11110111; DATA_IN|=(1<<LATCH); }
Código para enviar datos al cabezal térmico. El cabezal térmico funciona como un registro de desplazamiento. Cómo funciona, escribí arriba.
void print_all_pixel() { while(n<55) { print_stroka(str[n]); _delay_us(3); n++; } latch(); n=0; STB_IN&=0b11111011; _delay_us(500); STB_IN|=(1<<STB0); STB_IN&=0b11110111; _delay_us(500); STB_IN|=(1<<STB1); STB_IN&=0b11101111; _delay_us(500); STB_IN|=(1<<STB2);
La función de imprimir y quemar líneas.
void recieve() {
La función principal que gira en el archivo eterno. Cuando aparece la letra "P", enciendo el modo de impresión. Además, todos los demás caracteres comienzan a escribirse en el búfer. Además, cuando el búfer está lleno de 54 bytes (o 432 bits), imprimimos la línea y enviamos la palabra IMPRESO vía USART.
Bueno, eso es todo con la parte de hierro. En la siguiente parte escribiré sobre la parte del software, es decir, sobre el programa en python.
Fuentes