Olá Habr!
Uma vez eu tive um "emprego" - era necessário gerenciar a caixa registradora Shtrikh-FR-K. Desde que minha carreira começou com o reparo da KKT, decidi começar esse trabalho.

É assim que a bilheteria e a imagem de teste do meu colega se parecem:

Além disso, além do controle dos mecanismos e da cabeça térmica do dispositivo, tive que escrever um pequeno script python usando a biblioteca OpenCV. Então vamos lá.
Tudo começou com o estudo de rem. doca. a este caixa eletrônico e a conexão subsequente do analisador lógico aos pinos térmicos da cabeça. Enviei a letra "C" para imprimir através de um teste de barra. E aqui está o que eu tenho:

De acordo com DATA, o valor dos pontos (432 pontos por linha), sinal SCK - relógio, STB0, STB1, STB2 - dispara para aquecer a cabeça térmica, trava LATCH - dados. Eu dirigi uma linha para a caixa registradora, queimei, continuei.
O próximo passo foi finalizar o conselho para acelerar o processo de desenvolvimento.

Agora vamos ao 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; } }
Existem dois circuitos de controle de motor de passo para essa bilheteria. 4 etapas e 8 etapas. Eu escolhi 8 porque os motores funcionavam melhor.
#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 dados ao cabeçote térmico. A cabeça térmica funciona como um registro de mudança. Como funciona, escrevi acima.
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);
A função de imprimir e gravar linhas.
void recieve() {
A principal função que gira no arquivo eterno. Quando a letra “P” aparece, eu ligo o modo de impressão. Além disso, todos os outros caracteres começam a ser digitados no buffer. Além disso, quando o buffer é empacotado com 54 bytes (ou 432 bits), imprimimos a linha e enviamos a palavra IMPRESSO via USART.
Bem, isso é tudo com a parte de ferro. Na próxima parte, escreverei sobre a parte do software, ou seja, sobre o programa em python.
Fontes .
