Reprogramamos o caixa e imprimimos nele Keanu Reeves

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.

imagem

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

imagem

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:

imagem

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.

imagem

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); //vpered(300); //n=0; //_delay_ms(100); //vpered(100); } 

A função de imprimir e gravar linhas.

 void recieve() { ///while(f); if ((com==0x50)&&(rezhim==0))/// P { //USART_Transmit('X'); com=0; USART_Transmit('B'); rezhim=1; } if ((rezhim==1)&&(send!=0)) { str[iFF]=com; send=0; iFF++; if (send == 1) { USART_Transmit('B'); } if (iFF==54) { USART_Transmit('P'); USART_Transmit('R'); USART_Transmit('I'); USART_Transmit('N'); USART_Transmit('T'); USART_Transmit('E'); USART_Transmit('D'); PORTB|=1<<0; _delay_ms(1); print_all_pixel(); //print_all_pixel(); go1(1500,ggg); rezhim=0; iFF=0; ggg++; if (ggg==8) { ggg=0; } } } if ((com==0x52)&&(rezhim==0))///R { com=0; go1(1000,ggg); rezhim=0; iFF=0; ggg++; if (ggg==8) { ggg=0; } USART_Transmit('O'); USART_Transmit('K'); //vpered(300); } } 

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 .

imagem

Source: https://habr.com/ru/post/pt465867/


All Articles