本帖最后由 jinglixixi_457498010 于 2023-7-24 15:59 编辑

绣花机是一种较贵重的设备,因此在用于实验教学时分配到每个人亲自上手的时间并不多。
为了能得到更多的学习的机会,可以仿真的方式来提高操作的技能和熟练程度,并减少那些因经验不足而出现的问题。
就仿真的方式讲可分为两种,即软件仿真和硬件仿真。自然硬件的仿真会更加趋近于真实的操作,故这里是从硬件的角度进行尝试。
在硬件仿真方面,它主要涉及从存储介质中读取花样文件并提取数据,从而实现绣制过程模拟。由于是进行仿真,故其机械方面的运动及传动过程不在此范围中。当然为了便于更直观地观察,可将步进电机在绣制过程中的轨迹运动也纳入其中。
STM32F103开发板上,所实现的界面设计如图1所示。
image.png
1 仿真系统界面

出于时间的原因,这里主要解决的是花样文件在SD卡中的选取(实际应用中是由U盘来读取)、文件的读取及数据的提取和分析处理。
image.png
2 选取花样文件

实现花样文件选取的程序代码为:
  1.                  while(1)
  2.                 {
  3.                         key=KEY_Scan(0);
  4.                         if((t%20)==0)LED0=!LED0;
  5.                         if(key==KEY1_PRES)
  6.                         {
  7.                                 if(curindex)curindex--;
  8.                                 else curindex=totpicnum-1;
  9.                                 break;
  10.                         }else if(key==KEY0_PRES)
  11.                         {
  12.                                 curindex++;
  13.                                 if(curindex>=totpicnum)curindex=0;
  14.                                 break;
  15.                         }else if(key==WKUP_PRES)
  16.                         {
  17.                                 pause=!pause;
  18.                                 LED1=!pause;
  19.                         }
  20.                         if(pause==0)t++;
  21.                         delay_ms(10);
  22.                 }

花样的文件格式有多种,如DSTDSBDSZ等。这里仅以DST格式加以介绍,该格式文件是由3部分构成,即文件头、针位信息部分及结尾标识。它有些类似位图文件的格式,即也在前面放置文件的关键信息,然后在后面放置图像数据。对于花样文件头,它要占用512字节,主要是对花样的总体信息加以描述。花样体则包含花样的绣制信息,其信息量的大小会随花样的复杂程度而变化。至于结尾标识,则是以固定的标志符来结束文件。花样文件头的信息结构如表1所示:

1 花样头文件信息结构
image.png

利用文件头的信息,可用来判别机针初始位置的合理型,以防止出现机头撞击挡板的情况发生。
其次,利用换色次数可检查各色线轴是否就位。
至于花样总针数,则可用于控制绣制模拟过程的运行步数。

image.png
3 显示文件头信息

显示文件头信息的程序代码为:
  1. void head_inf(void)
  2. {
  3.                   for(i=0;i<3;i++)  // LA
  4.                  {
  5.                          LCD_ShowChar(20+i*8,60,databuf[i],16,1);
  6.                 }
  7.                 for(i=0;i<19;i++)
  8.                 {
  9.                         wjm[i]=databuf[3+i];
  10.                 }
  11.                 Show_Str(44,60,240,16,wjm,16,1);
  12.                 for(i=20;i<30;i++)  // ST
  13.                 {
  14.                       LCD_ShowChar(20+(i-20)*8,80,databuf[i],16,1);
  15.                 }
  16.                 N=0
  17.                 for(i=23;i<29;i++)  // N
  18.                 {
  19.                      N=N*10+(databuf[i]-'0');
  20.                 }
  21.                 for(i=31;i<37;i++) // CO
  22.                 {
  23.                    LCD_ShowChar(20+(i-31)*8,100,databuf[i],16,1);
  24.                }
  25.                 for(i=38;i<46;i++)  //+X
  26.                 {
  27.                    LCD_ShowChar(20+(i-38)*8,120,databuf[i],16,1);
  28.                }
  29.                 for(i=47;i<55;i++)  //-X
  30.                 {
  31.                    LCD_ShowChar(20+(i-47)*8,140,databuf[i],16,1);
  32.                }
  33.                 for(i=56;i<64;i++)  //+Y
  34.                 {
  35.                    LCD_ShowChar(20+(i-56)*8,160,databuf[i],16,1);
  36.                 }
  37.                 for(i=65;i<73;i++)  //-Y
  38.                 {
  39.                    LCD_ShowChar(20+(i-65)*8,180,databuf[i],16,1);
  40.                 }
  41.                 for(i=74;i<83;i++)  //AX
  42.                 {
  43.                    LCD_ShowChar(20+(i-74)*8,200,databuf[i],16,1);
  44.                 }
  45.                 for(i=84;i<93;i++)  //AY
  46.                 {
  47.                    LCD_ShowChar(20+(i-84)*8,220,databuf[i],16,1);
  48.                 }
  49. }

对于针位信息,它是采用三进制编码,即以24位来表示一针数据,其结构见表2所示。

2 针信息存储结构
image.png

1)控制码
它在花样文件中起着控制的作用,其包含的操作有刺绣、跳针、剪线、换色及结束等动作,相应的控制位见表3所示。

3 控制码定义
image.png
刺绣:0x03
跳针:0xc2
换色:0xc3
剪线:0xc2(多个)
结束:0xf3

2)针迹位移码
它在花样文件中占有很大的比重,其主要是用来描述针迹在XY方向的位移dxdy。而步进电机正是凭此来控制移框操作。
DST文件中,dxdy是由三字节的数据经各位权值来计算出的。
image.png

利用针位信息,所实现的模拟绣制过程如图4所示。
image.png
4 绣制效果及模拟轨迹

image.png
5模拟效果

实现绣制模拟的程序代码为:
  1. if(d==1)
  2. {
  3.          x1=0;
  4.          y1=0;
  5.          POINT_COLOR=GREEN;
  6.          for(i=0;i<N;i++)
  7.          {
  8.                 if(i>0)
  9.                 {
  10.                          x =databuf[512+i*3];       // A7-A0
  11.                          y =databuf[512+i*3+1];     // B7-B0
  12.                          c =databuf[512+i*3+2];     // C7-C0
  13.                          v=0;
  14.                          if((x&0x08)==0x08) v=-9;
  15.                          if((x&0x04)==0x04) v=v+9;
  16.                          if((x&0x02)==0x02) v=v-1;
  17.                          if((x&0x01)==0x01) v=v+1;
  18.                          if((y&0x08)==0x08) v=v-27;
  19.                          if((y&0x04)==0x04) v=v+27;
  20.                          if((y&0x02)==0x02) v=v-3;
  21.                          if((y&0x01)==0x01) v=v+3;
  22.                          if((c&0x04)==0x04) v=v+81;
  23.                          if((c&0x08)==0x08) v=v-81;
  24.                          x2=x1+v;
  25.                          v=0;
  26.                          if((x&0x80)==0x80) v=1;
  27.                          if((x&0x40)==0x40) v=v-1;
  28.                          if((x&0x20)==0x20) v=v+9;
  29.                          if((x&0x10)==0x10) v=v-9;
  30.                          if((y&0x80)==0x80) v=v+3;
  31.                          if((y&0x40)==0x40) v=v-3;
  32.                          if((y&0x20)==0x20) v=v+27;
  33.                          if((y&0x10)==0x10) v=v-27;
  34.                          if((c&0x10)==0x10) v=v-81;
  35.                          if((c&0x20)==0x20) v=v+81;
  36.                          y2=y1+v;
  37.                          LCD_DrawLine(10+x1/2, 200-y1/2, 10+x2/2, 200-y2/2);
  38.                          x1=x2;
  39.                          y1=y2;
  40.                          delay_ms(2000);
  41.                 }
  42.            }
  43.          d=0;
  44. }

结束语:

未来的改进方向是添加比例控制以使大尺寸的图像能较完整地绘制在窗口中及步进电机的驱动控制等,目前完成的还只是个初步的探索和尝试。