我们对收银员进行重新编程,并在上面打印基努·里维斯

哈Ha!

一旦我有了“工作”,就必须管理收银台Shtrikh-FR-K。 由于我的职业生涯始于KKT的维修,因此我决定从事这项工作。

图片

这是票房本身和我的同事的试用图像的样子:

图片

另外,除了控制引擎和设备中的热敏头外,我还必须使用OpenCV库编写一个小的python脚本。 所以走吧

这一切都始于对雷姆的研究。 码头。 到此收银台,然后将逻辑分析仪连接至热敏头引脚。 我发送了字母“ C”以通过条形测试打印。 这是我得到的:

图片

根据DATA,点的值(每行432点),SCK(时钟信号),STB0,STB1,STB2(用于加热热敏头的闪光灯),LATCH(锁存器)-数据锁存器。 我把一行插入移位寄存器,烧掉了,然后继续。

下一步是最终确定董事会,以加快开发过程。

图片

现在让我们继续执行代码。

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; } } 

该票房有两个步进电机控制电路。 4步和8步。 我选择了8个,因为引擎效果更好。

 #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); } 

用于将数据发送到热敏头的代码。 热敏头用作移位寄存器。 我如何在上面写道。

 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); } 

印刷和刻录线的功能。

 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); } } 

旋转到永恒文件中的主要功能。 当字母“ P”进入时,我打开打印模式。 此外,所有其他字符开始输入到缓冲区中。 此外,当缓冲区中填充了54个字节(或432位)时,我们将打印该行并通过USART发送单词PRINTED。
好吧,这就是铁的部分。 在下一部分中,我将介绍软件部分,即python中的程序。 资料来源

图片

Source: https://habr.com/ru/post/zh-CN465867/


All Articles