目录
一、实验原理
二、实验目的
三、实验内容
四、实验器材(设备、元器件)
五、实验步骤
六、实验数据及结果分析
七、实验结论
八、总结及心得体会
九、对本实验过程及方法、手段的改进建议
代码附录
温馨提示
一、实验原理
1.取模:在hzk16文件中每个汉字占32个字节。在GB2312-80代码表中,纵向分为0~93,共94行。将行号称为区号,列号称为位号,分别有94个区和94个位。区号和位号用十进制表示,不足两位前面补0。这样每个汉字或符号都可用4位十进制表示,也就是区位码。每一区共有94个汉字,而位记录该汉字在该区中的具体位置。通过区位码可以计算偏移量从而将汉字信息读取出来转为点阵并打印。但是hzk16文件较大,此处我们采取直接通过字模软件取模的方法。
2.打印机模型
通过3个电机(分别对应3个轴)协调打印
X轴为打印机水平平移方向,进行点阵的横向打印
Y轴为打印纸张竖直平移方向,使用一带轮电机滚动带动纸张平动,实现换行打印
Z轴控制水墨笔点出点迹
二、实验目的
1. 通过对计算机打印过程的分析,了解点阵字库的作用与打印过程的原理;
2.通过对打印机器人工作参数的定义分析过程,了解系统参数之间、系统参数确定对软硬件设计的影响;并可在系统参数、软件复杂度、硬件复杂度之间进行恰当的折中;
3.通过应用LEGO Digital Designer进行虚拟设计、组装实际的打印机器人并编写控制程序,了解系统分析设计、机械结构设计、软件编程验证、系统改进与维护等工程设计的整个流程;
4.学习进行组内任务划分和工作接口定义,了解初步的项目管理。
三、实验内容
1.打印机功能分析与参数定义:
(1)功能分析
打印出16×16点阵汉字
(2)参数定义
打印方式:单针击打式点阵打印
像素:16*16位
色阶:2色
打印速度:约0.4秒/点 约30秒/字
字符集:HZK16
语言:中文
纸张格式:A4(210mm*297mm)
打印尺寸:像素宽度4mm 文字大小3cm*3cm
机器尺寸:25cm*25cm*20cm
接口:USB micro B
主机:LEGO EV3
电源:10V DC
操作系统:Windows
使用温度:5-35℃
2.方案设计及任务规划:
以矩形为打印机基本框架,搭建轨道,上放小车(X轴),对面为进纸器(Y轴),将Z轴电机固定于小车上随小车一起移动,同时控制水墨笔打点。
3.进纸及打印机构设计:Y方向进纸
4.软件编程和调试:
通过robotc编写,用取模软件取模后生成点阵信息,读取每个点信息控制XYZ协调运动打印汉字,每行结束后Y轴行进一次,X轴反向移动。
四、实验器材(设备、元器件)
序号 | 名 称 | 型号与规格 | 数 量 | 备注 |
1 | LEGO Minstorms教育机器人 | NXT版本 | 1 | |
2 | RobotC开发环境 | 4.52版本 | 1 | 2015版 |
3 | 字模软件 | 畔畔字模提取软件 | 1 | |
4 | 电脑 | 联想拯救者R7000 | 1 | |
5 | 乐高积木 | 无 | 20+ | |
6 | 一只记号笔 | 晨光MARKER油性记号笔 | 1 | |
7 | 车轮 | 直径5cm | 4 | |
8 | 万向轮 | 直径1cm | 1个 | |
9 | 齿轮 | 24齿 | 4个 |
五、实验步骤
1. 搭建如图所示模型
以矩形为框架,外侧横向放置车轮增加稳定性,轨道与进纸区相对,小车与笔绑定,通过Z轴电机控制水墨笔上下移动完成打点,将主机固定于框架上
2.软件编程和测试
运用取模软件提取字模,生成点阵信息置于程序中生成二维数组,当其为1时x轴前进并打点,否则只前进不打点,每打完一行Y轴移动一次实现退纸
六、实验数据及结果分析
点距 | x(y)角度 | |
24齿 | 1.06mm | 5度 |
40齿 | 5mm | 5度 |
选择24齿更稳定,并且精度高
七、实验结论
打印笔细则辨识度高,轨道太轻则不稳定,不打点时让小车一次性多走几步能很大程度提高速度。
八、总结及心得体会
- 通过反复调试,我们将为0的多个点合并成一个记录0的个数的数字,完成一次性走完多步而不打点,这样减少了小车的启动和停止时间,从而大大提高了打印速度。
- 打印笔连接杆越长,越不稳定,精度越低
- 打印笔的平动和转动:最初我们通过齿轮将转动转化为平动,但当z轴速度越来越快时,通过齿轮控制笔杆跟不上,导致卡的现象,最终我们选择了转动
- 行进轮大小对打印机的影响:理论上轮径越小打印车越稳定,但当轮径过小时,不能达到最大平移速度,并且实验发现轮径越小,相同速度下笔尖平移越不稳定。于是,我们适当控制行进轮大小,结合程序调试达到最佳效果
- 通过橡皮筋绑定笔杆与连接杆时,两根橡皮筋不宜离得太近,否则笔会沿x轴移动,影响打印精度
- 轨道下方增加万向轮可以提高轨道稳定性,但也使得进纸摩擦增大
九、对本实验过程及方法、手段的改进建议
- 纸的移动会偏离Y轴,可在两侧增加固定板使得纸只能沿Y轴移动,从而提高精度
- 万向轮的添加降低了纸移动的灵活性,可撤销万向轮,通过降低轨道高度或在轨道上方添加一滑道减少打点时小车的晃动
代码附录:
void HexToBin(unsigned char* hexStr, unsigned char* binStr, int lenHex)
{memset(binStr, '0', lenHex * 8);unsigned char hexChar[2];for(int i=0;i<lenHex;i++){hexChar[0]=(hexStr[i] & 0xF0) >> 4;hexChar[1]=hexStr[i] & 0x0F;for(int j=0;j<2;j++){for(int k=0;k<4;k++){if(hexChar[j] & (0x08 >> k)){binStr[8*i+4*j+k]='1';}}}}
}task main()
{unsigned char bin[257];int i,p;unsigned char bits[32]={0x00,0x00,0x3F,0xF0,0x02,0x10,0x02,0x10,0xFF,0xFE,0x02,0x10,0x06,0x10,0x3F,0xF0,0x08,0x00,0x1F,0xF0,0x28,0x10,0xC8,0x10,0x08,0x10,0x0F,0xF0,0x08,0x10,0x00,0x00,};HexToBin(bits, bin, 32);while(1){for(i=0;i<256;i++){if(i%16==0&&i!=0){resetMotorEncoder(motorB);setMotorTarget(motorB, 5, 60);waitUntilMotorStop(motorB);resetMotorEncoder(motorA);setMotorTarget(motorA, 5*16, -60);waitUntilMotorStop(motorA);}if(bin[i]==0){p=1;while(bin[i+1]==0&&i%16!=0)p++;i++;resetMotorEncoder(motorA);setMotorTarget(motorA, 5*p, 50);waitUntilMotorStop(motorA);}if(bin[i]=='1'){resetMotorEncoder(motorc);setMotorTarget(motorc, 20, 50);waitUntilMotorStop(motorc);resetMotorEncoder(motorc);setMotorTarget(motorc, 20, -50);waitUntilMotorStop(motorc);}resetMotorEncoder(motorA);setMotorTarget(motorA,5, 60);waitUntilMotorStop(motorA);}if(i==256){break;}}
}