MakerLab创客实验室 — Let's Make something.
现在注册
已注册用户请 登入

Mini Panel真正开启中文汉字支持u8glib Marlin

3D打印机上用的LCD控制器都是英文的菜单,给新手带来了障碍,MakerLab现已开发支持中文的Marlin版本
Mini Panel简介49 U8glib如何显示中文75 U8glib如何定制字体9 Marlin中文版LCD界面27 如何使用Marlin中文版19 Marlin LCD菜单的功能12 bdf字体文档下载1
MakerLab创客实验室  ›  Mini Panel真正开启中文汉字支持u8glib Marlin
49

Mini Panel简介

中文版固件已开源

下载地址:中文固件Github地址
直接打包下载:https://github.com/MakerLabMe/Marlin/archive/add_chinese_font.zip

kossel、delta、并联版本下载:中文固件Github地址
kossel、delta、并联版本打包下载:https://github.com/MakerLabMe/Marlin_delta/archive/makerlab.zip

繁體版本下載:
https://github.com/MakerLabMe/Marlin/tree/add_traditional_chinese
打包下載:
https://github.com/MakerLabMe/Marlin/archive/add_traditional_chinese.zip

刚刚发布,如果发现有问题,请提出您的意见和想法,也欢迎有兴趣的朋友贡献代码。

如果你还没有自己的LCD,可以考虑MakerLab设计的Mini Panel,http://item.taobao.com/item.htm?id=21364183191 .

Mini Panel 基本参数

Mini Panel是为Mega Controller设计的脱机打印拓展板。可以通过拓展板上自带的SD卡(Micro)读卡器读取SD卡上的Gcode文件,从而实现脱机打印(无需连接usb线)。特点如下:

1、LCD像素为128*64,具有显示中文和图形潜力,中文版本固件已发布;
2、采用Mini LCD,传统LCD控制器,笨重难看,Mini Panel的尺寸为67*48mm;
3、原装ALPS编码开关,使用寿命更长,操作更顺畅;
4、Micro SD卡槽,Micro SD卡在智能手机上非常常用,所以我们选择了Micro SD卡作为存储Gcode的媒介;
5、引出RESET(复位,这里是真正的复位按钮,而不是停止及Kill按钮)按钮,主控板一般都不容易让人接触,按主控板上的复位按钮就有点难度了,所以我们引出了复位按钮,再也不用为了复位而弄乱导线或关掉电源重新启动了,不过这个功能只适用于Mega Contrller,如果用于Ramps1.4板子,复位按钮不起作用(因为Ramps复位没有引出);
6、单根排线与主控板(Mega Controller或Ramps)连接,避免了多根数据线连接错误而烧板子的风险;
7、支持中文



Mini Panel真正开启中文汉字支持u8glib Marlin Andy 2 年前 最后回复来自 Andy
75

U8glib如何显示中文

U8glib之前并没有用过。最近为了让Marlin固件支持中文显示(需要支持图形显示的LCD,如常见的12864液晶),花时间研究了一下这个库。很强大、很好的一个库。在这里简单介绍一下如何使用U8glib显示中文或其它字体的字(包括英文或其它语言)。希望对有同样或类似需求的朋友能够提供帮助和参考。

强大的库

U8glib是非常一个非常强大的库,我体验到的强大之处有:
1、不同驱动芯片及不同分辨率的支持,这就让用户几乎不必关系底层驱动的部分,只需要写自己的程序就可以了,要知道底层驱动的调试比较费时间的;
2、不同连接方式支持,可以支持硬件SPI、软件SPI及8位并行控制方式;
3、支持Arduino、AVR及ARM等不同芯片,CPU升级时,移植代价比较小;
4、多种字体(几十种)可选,从4像素到42像素都有,不过都是最常见的ASCII码,中文等其它特殊字符需要自己定制(即使用自己的字体文件);
5、更换或定制字体还算容易,对于我来说,的确是研究了一段时间才搞明白如何添加新字体,不过一旦掌握,就很简单了;
6、支持横屏或竖屏显示;

局限性

虽然U8glib有很多优点,但也有它的局限性,至少我发现是这样的。尤其是对中文这样的无法用ASCII码覆盖的复杂字符(需要用Unicode标识)。
U8glib的局限性主要体现者对字体的处理方式上,虽然支持几十种字体,但每种字体最多只支持255个字符(0x01~0xFF),而对于中文、韩文及日文等的字符数量成千上万个,要想实现中文语句:创客实验室,可能需要切换不同的字体来实现对各个字的显示,总是切换字体确实比较麻烦,并且切换字体后,还需要重新确定显示坐标。
另一个局限也是提现在字体方面,就是U8glib字体都是0x00~0xFF的ASCII码,而中文则是Unicode,当用ASCII表示中文时,意味着不是完整的Unicode,而是发送\xab\x03\xef等之类的不易读的ASCII码(不是标准的)。所以要想实现显示一句中文,需要自己对应好正确的字体和ASCII码两个才可以正确显示一个汉字,并且每一个汉字都可能需要不同的字体和ASCII。说的有点模糊,看看下面这个例子吧。

如果你不想学这些东西,可以直接下载我整合的bdf文件:http://www.makerlab.me/guides/9/articles/82

举例

如何显示创客实验室这5个汉字呢?
要想显示这几个汉字,还真是不简单,让我们按照步骤一步步的走。注意,U8glib没有所谓的带或不带中文字库,所以带不带中文字库的显示屏都需要以下步骤(这是我的理解,如果我有错误,欢迎指正)。

第一步,确定<code>创客实验室</code>这几个汉字的Unicode码

这一部不难,有很多工具可以使用,我用的上这样网站: 转码工具 输入这5个汉字后,点击向下的箭头,就可以看到这几个字分别对应的Unicode了:

  521B  [CJK Unified Ideographs]
5BA2 [CJK Unified Ideographs]
5B9E [CJK Unified Ideographs]
9A8C [CJK Unified Ideographs]
5BA4 [CJK Unified Ideographs]

第二步,使用U8glib提供的工具,生产字体文件

U8glib为我们提供了必要的工具和文档,下载U8glib后( https://code.google.com/p/u8glib/ ,由于这个地址需要翻墙,所以没办法翻墙的朋友可以到网盘下载:http://pan.baidu.com/s/1dDfApod ,提供了多个不同版本,我使用的是Arduino版本,并且我把所有的源文件都下载了下来,因为有几个工具及文件在Arduino版本代码里面并没有,需要单独下载),可能需要另外下载的工具上 bdf2u8g(.exe)【用来把字体文档bdf转化为字体数据的】,Unicode.bdf(则是完整的Unicode字体文件,比较大,在U8glib源码中可以下载到Unicode.bdf 9.8M大小),都下载完成后,放入同一个文件夹,来转换字体,命令如下(主要windows版本需要加.exe,linux系统不需要):
linux系统命令是:./bdf2u8g -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
windows系统命令是:bdf2u8g.exe -b 0 -e 255 -l 156 -u 157 unifont.bdf chinese_test chinese_test.c
等等,这都是什么意思?
bdf2u8g命令的参数说明:
必须的参数:
bdf文件,这是你需要转换的字体文件,bdf格式;
字体名称,用于生产代码数据的标识;
.c文件,c语言文件;
可选参数:
[-b 数字] ASCII码的起始位,范围是0~255;
[-e 数字] ASCII码的结束位,范围是0~255;
[-l page] 用于定位超出0~255范围的Unicode的页数,如果ASCII码范围是0~127,则使用这个参数,如果范围在128~255,则使用下面的-u参数;
[-u page] 用于定位超出0~255范围的Unicode的页数,如果ASCII码范围是128~255,则使用这个参数,如果范围在0~127,则使用上面的-l参数;
创 521B计算页地址为:0x521B/0x80 = 0xA4 = 164,由于1B=27 < 7F,所以使用-l参数即可,命令为:./bdf2u8g -b 27 -e 27 -l 164 unifont.bdf chinese_test chinese_test.c执行命令后,会输出:

encoding range 27..27
bbx 14 16 0 -2 encoding 27
input file '../bdf/unifont.bdf'
u8g font name 'chinese_test'
output file 'chinese_test.c'

这时打开生产的c代码文件内容如下:

#include "u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_FONT_SECTION("chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

需要注意的是,如果在Arduino IDE下使用,需要调整为:

#include "utility/u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

前面的include部分是必须改的,U8G_SECTION(".progmem.chinese_test")这个部分可能不同版本需要不同的写法,我用的版本必须改为下面的,否则会有错误。
完整的Arduino代码(显示一个字):

#include "U8glib.h"
#include "utility/u8g.h"
const u8g_fntpgm_uint8_t chinese_test[55] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,27,27,0,14,254,0,
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,8};

U8GLIB_MINI12864 u8g(45,47);

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(chinese_test);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 0, 22, "\x1b");
}

void setup(void) {

// flip screen, if required
// u8g.setRot180();

// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);

// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on
}

void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(500);
}

那么如何显示创客实验室5个汉字呢?你可能注意到了。这5个汉字并没有在unicode的同一页,也就是如果你想节省flash空间,降低字体数据大小的话,需要每个字生产一个字体,并且每个字切换一下字体(严格来说不是字体了,而是字数据),其它几个字的生产代码分别是:
客 5BA2生产代码:./bdf2u8g -b 162 -e 162 -u 183 unifont.bdf chinese_ke chinese_ke.c
实 ‎5B9E生产代码:./bdf2u8g -b 158 -e 158 -u 183 unifont.bdf chinese_shi chinese_shi.c
验 ‎9A8C生产代码:./bdf2u8g -b 140 -e 140 -u 132 unifont.bdf chinese_yan chinese_yan.c
室 ‎5BA4生产代码:./bdf2u8g -b 164 -e 164 -l 183 unifont.bdf chinese_shi2 chinese_shi2.c

其中有几个字,都在5B00~5BFF范围内,可以生产在一个文档中,不过夹杂的一些不相关字会占用flash空间。
数据都生产完成了,但每个字都需要切换一次字体,真的让人受不了,有没有解决办法呢?答案是有的,我经过很多测试和对比,发现如果直接将字体数据进行合并,会导致显示不正常,为了克服这个问题,需要对单独生产的数据进行调整,调整后的创客实验室5个字的数据为:

const u8g_fntpgm_uint8_t chinese_test[] U8G_SECTION(".progmem.chinese_test") = {
0,16,16,0,254,0,0,0,0,0,161,165,0,14,254,0,/\*<b>161,165</b>161165A1A5 \*/
//Chinese "创"
0,14,16,32,16,0,254,8,4,8,4,20,4,18,36,33,
36,64,164,190,36,34,36,34,36,34,36,42,36,36,36,32,
132,32,132,31,148,0,/\*8, \*/
//Chinese "客"
0,15,16,32,16,0,254,2,0,1,0,127,254,64,2,136,
4,15,240,16,32,44,64,3,128,28,112,224,14,31,240,16,
16,16,16,31,240,16,/\*16\*/
//Chinese "实"
0,15,16,32,16,0,254,2,0,1,0,127,254,64,2,136,
132,4,128,4,128,16,128,8,128,8,128,255,254,1,64,2,
32,4,16,24,8,96,/\*4\*/
//Chinese "验"
0,15,16,32,16,0,254,0,32,248,32,8,80,72,80,72,
136,73,4,74,250,124,0,4,68,4,36,29,36,228,168,68,
136,4,16,43,254,16,/\*0\*/
//Chinese "室"
0,15,15,30,16,0,255,2,0,1,0,127,254,64,2,128,
4,63,248,4,0,8,32,31,240,1,16,1,0,63,248,1,
0,1,0,255,254
};

要想显示这5个字,只需要将之前提到的arduino代码中的显示代码改为u8g.drawStr( 0, 28, "\xa1\xa2\xa3\xa4\xa5");就可以显示了,如图:

可以看到,中文可以显示了,但字体是Unicode.bdf文件中标准的字体,16X16像素,如果想显示个性字体,请参考下一部分

Mini Panel真正开启中文汉字支持u8glib Marlin Andy 一年前 最后回复来自 Andy
9

U8glib如何定制字体

通过上一部分的说明,你已经知道了如何显示unifont.bdf中任意字符了。但是你会发现unifont中的汉字是默认的16X16像素的字体(好像是宋体),这种字体看起来很笨拙,占用空间很大,视觉效果并不好。那么如何定制你自己的字体,来完成更加个性化或更漂亮的字体显示呢?

其实跟前面介绍的方法是一样的,不同之处在于你需要去找到或自己设计一个自己喜欢的字体,需要的字体格式是bdf格式,然后使用bdf2u8g这个工具转换为u8glib所需要的字体数据,就可以显示了。为了能够在Mini Panle LCD控制板上显示中文的Marlin操作界面,我尝试了自己画中文,来实现个性化的字体显示,虽然画的不漂亮,但是你可以发现,字体的大小都得到了控制,12X12像素,节省了很多宝贵空间。如下图:

自己画字体应该有很多软件可以用,我不是专业是字体设计师,随便找了一个我感觉简单好用的Fony。可以导出为bdf格式,这个很重要,否则你还需要对格式转换。下载地址:Fony.zip

程序界面如下:

由于这个小工具比较简单,并且我也不是专业的设计师,我就不介绍这个软件的用法了,大家研究一下。Fony可以创建0~255编码的字体,其中32~126是ASCII中可见的部分,所以应当都显示为标准的字符,其它部分我们可以用来定制自己的字符,比如特殊符号及汉字等。

字体设计完成后,就可以导出为bdf格式了,然后使用bdf2u8g工具生成u8glib可以使用的数据文件,请参考上面的命令,由于自己画的字体编号是0~255,没有更多的编码,所以-l及-u参数并没有使用。

下面就是我自己画的字体,见笑了。

Mini Panel真正开启中文汉字支持u8glib Marlin Andy 一年前 最后回复来自 Andy
27

Marlin中文版LCD界面

如果前面的操作已经掌握了,定制Marlin固件的中文(汉字)LCD界面就不难了。其实就是生成自己的字体数据,并且开始使用这些数据罢了。

更漂亮的字体

自己画的字体实在是不太好看,关键是不协调,没有统一的风格,尤其是中英文一起显示的时候,英文字母显得更加难看了。

所以要换一个更加漂亮专业的字体。在互联网上找了很多,终于找到了一款漂亮的字体,并且字体都是11像素的(有其它像素版本),并且是开源的,最主要的是提供bdf格式文件,这让我们省去了转换格式的麻烦。真是太棒了,感谢Firefly font 的作者,由于网站上没有说明作者信息,所以具体的作者信息我并不了解,如果你知道,可以在本文最下方留言,谢谢了。firefly_R11字体网盘下载:http://pan.baidu.com/s/1sjLSGrF

欣赏一下Firefly字体吧,图片中的中文支持 By 创客实验室 MakerLab.me都是Firefly字体,是不是漂亮多了?!:

提取需要的汉字

由于Firefly字体包含了所有的中文,全部使用是不现实的,所以需要把不需要的汉字或符号删掉,只保留最需要的符号及汉字,并且总数量最好能够控制在1~255之间。我提取了Firefly中,marlin固件所需要的字符,并且对这些字符(主要是汉字和其它不常用ASCII码)进行了重新编码,让汉字可以通过8位ASCII码来显示,缺点是这样的编码跟汉字的unicode没有任何关系。我提取的汉字及8位编码如下,仅列出汉字部分:

表格请参考下面回复部分
中文字体表格

显示汉字

Marlin固件中所需要的字体数据在这里:Marlin中文字体数据
看到这里,如果你明白了我之前所说的内容,你应该知道如何显示列表中任意一个汉字了。你只需要下载上述的代码,导入到U8glib自带的helloworld例子中就可以了,效果如下:

上述例子代码在这里,你可以试试其它汉字的显示:完整的例子代码

Mini Panel真正开启中文汉字支持u8glib Marlin Andy 一年前 最后回复来自 Andy
19

如何使用Marlin中文版

中文版固件已开源

下载地址:[中文固件Github地址](http://github.com/MakerLabMe/Marlin/tree/add_chinese_font
直接打包下载:https://github.com/MakerLabMe/Marlin/archive/add_chinese_font.zip

kossel版本下载:中文固件Github地址
kossel版本打包下载:https://github.com/MakerLabMe/Marlin_delta/archive/makerlab.zip

繁體版本下載:
https://github.com/MakerLabMe/Marlin/tree/add_traditional_chinese
打包下載:
https://github.com/MakerLabMe/Marlin/archive/add_traditional_chinese.zip

中英文切换(包括繁體中文)

如果你想切换回英文菜单,可以来到language.h文件中选择不同的语言配置,如果需要显示为 中文,则配置为10,如果需要显示为英文菜单,配置为1,

// Languages
// 1 English
// 2 Polish
// 3 French
// 4 German
// 5 Spanish
// 6 Russian
// 7 Italian
// 8 Portuguese
// 9 Finnish
// 10 Chinese(简繁版本都是10,下载不同的版本对应不同的字体。)

#ifndef LANGUAGE_CHOICE
#define LANGUAGE_CHOICE 10 // Pick your language from the list above
#endif

英文版本占用是Flash及RAM大小为:
Sketch uses 124,658 bytes (48%) of program storage space. Maximum is 258,048 bytes.
Global variables use 4,578 bytes (55%) of dynamic memory, leaving 3,614 bytes for local variables. Maximum is 8,192 bytes.

中文版本占用Flash及RAM大小为:
Sketch uses 125,024 bytes (48%) of program storage space. Maximum is 258,048 bytes.
Global variables use 4,554 bytes (55%) of dynamic memory, leaving 3,638 bytes for local variables. Maximum is 8,192 bytes.

可以看到Flash空间比英文版本多占用了366Bytes的空间。还远远没有达到Mega 2560芯片的Flash空间,所以中文版本对Flash空间开销不大。奇怪的是RAM空间中文版本比英文版本少,具体原因还需要分析一下。

繁体支持

考虑到有台湾台湾朋友可能会需要对繁体的支持,欢迎台湾朋友帮我翻译为繁体字,然后添加一个繁体版本。

不足之处

1、使用SD卡的朋友应该已经发现了。中文版本没有一个文件夹图标,所以在显示文件夹时,都是一个这样的符号:

这不是乱码,而是表示文件夹的标志。
2、目前不能支持中文文件名的显示,所以大家文件名要使用字母:

图中的乱码是因为文件名不是标准字母导致的。

Mini Panel真正开启中文汉字支持u8glib Marlin Andy 3 年前 最后回复来自 Andy
12

Marlin LCD菜单的功能

中文固件已经发布了,但很多朋友对各个菜单什么功能并不了解,这里就做一下简单总结。希望对大家有帮助。

下图为各级菜单之间的关系:

0、信息界面(Info screen)


信息界面上有很多有用的信息,上半部分从左到右标记为1、2、3的位置,表示三个加热头,下面显示相应加热头的实时温度,上面为预设的温度,如果对应加热头没有开启,则温度不会显示。接下来一个横线和3个反S曲线的表示为热床,上面为热床的预设温度,下面为热床的实际温度,如果没有开启热床,则该温度不会显示。再往右,应该可以猜出那是风扇指示,如果风扇已经打开,这个位置的风扇会模拟旋转的动作。并且下面的数字表示转速的百分率。

往下,就是黑底白字部分,标记为X:000.0 Y:000.0 Z:+000.0表示现在所在的位置坐标。

再往下,FR后面跟100%(或其它数字),表示的为Feedrate,即打印速度,这是全局速度,在信息界面选择编码开关,会调整这个参数,也就意味着会改变打印时的速度。如果你不想重新生产G代码来改变打印速度,可以使用这个方式来快速调整打印速度。

右侧,一个SD卡标记,一个时间标记,一个进度条标记,标识SD卡上的G代码打印机进度及时间。如果没有打印,不会有显示。

下面的部分是信息显示部分,会有不同的信息进行显示,比如错误信息,如果没有接热敏或热敏配置错误,可能会显示错误,如果你看到的信息是准备打印,说明你的打印机已经准备就绪,没有错误,可以开始准备打印了。

在信息界面下,按一下右侧的旋转按钮,会来到主菜单,进行对打印机的控制和操作,见下文。

1、主菜单(Main)

1.1、信息界面(Info screen)

点击后,会来到信息界面

1.2、准备(Prepare)

选中该选项后,将进入【2、准备】菜单

1.3、控制(Control)

选中该选项后,将进入【3、准备】菜单

1.4、存储卡菜单(Card Menus)

选中该选项后,将进入【4、准备】菜单

2、准备(Prepare)


2.1、主菜单(Main)

点击该选项回到主界面

2.2、自动开始(Autostart)
2.3、关闭步进驱动(Disable steppers)

通过这个命令,可以手动关闭步进电机驱动,关闭后,各轴就可以手动移动了。

2.4、自动回原点(Auto home)

让各轴会原点。

2.5、设定原点(Set origin)

设定当前位置的坐标为X0 Y0 Z0.

2.6、预热 PLA(Preheat PLA)

为打印PLA预热加热头和热床(如果有的话)。预热的温度由【控制-》温度-》PLA预热设定】来决定。

2.7、预热 ABS(Preheat ABS

为打印ABS预热加热头和热床。预热的温度由【控制-》温度-》ABS预热设定】来决定。

2.8、降温(Cooldown)

手动降温,及关闭加热头及热床,风扇可能还会保持。

2.9、移动轴(Move Axes)

3、控制(Control)

3.1、主菜单(Main)
3.2、温度(Temperature)
3.3、运动(Motion)
3.4、保存参数(Store memory)
3.5、载入参数(Load memory)
3.6、恢复出厂设定(Restore Failsafe)

4、存储卡(SD Card)

4.1、主菜单(Main)
4.2、刷新(Refresh)
Mini Panel真正开启中文汉字支持u8glib Marlin Andy 2 年前 最后回复来自 Andy
1

bdf字体文档下载

我整理了一下marlin固件中使用的字体文件,没有多余文字,全部是固件中用到的文字,不管是添加还是删除,使用这个bdf文件将大大降低花费在这上面的时间。
简体:http://pan.baidu.com/s/1qWwTFHU
繁体:http://pan.baidu.com/s/1sjujQep

使用方法:

bdf2u8g -b 32 -e 255  ../bdf/Marlin_ff_BR.bdf firefly firefly.c

希望对大家有用。

Mini Panel真正开启中文汉字支持u8glib Marlin Andy 2 年前 最后回复来自 Andy