[原创] 输入法键盘

cwall   2024-11-2 11:30 楼主

由于中国使用方块字,常见的符号也有七八千,只能通过虚拟键盘,也就是输入法来使用计算机。80年代很多人研究输入法,到今天也有很多输入法,比如搜狗,百度、腾讯,Google、微软等。现在电脑的性能和尺寸已经今非昔比,为什么不在键盘里嵌入一个电脑,把输入法从越来越庞杂的电脑系统中剥离出来呢?

头条上看到一篇文章:《电子工程师都怎么改装键盘?》,原帖发表于电子工程论坛中文站:http://www.eeworld.com.cn/avLy9WD,作者为彭丙浩

头条上还有另一篇文章:《树莓派400一体机,可以用作电脑的键盘了》,原帖发表于CNXSoftware中文站。显然这是一篇译文,原帖发表于CNXSoftware论坛,作者为Jean-LucAufranc。

他这篇文章所说的项目,事实上是GitHub上的pi400kb项目,地址为:https://github.com/Gadgetoid/pi400kb。

虽然看起来似乎风马牛不相及,但如果你仔细看下去,会发现这两篇文章其实说的是同一件事情,也就是把收到的键盘信号进行处理后再输出到另一台电脑,或者专业一点就是HID消息的转发/镜像过程,也就是HID-remapper。

这样有什么实际意义呢?单就HID-remapper而言,用户还是很多的,特别是游戏玩家,他们对键盘简直爱不释手。对中文输入法而言,现在有很多电脑用户使用电脑还需要他人帮助(安装、配置系统及常用软件等),将输入法硬件化,确实可以解决一些电脑用户使用电脑的问题。历史上雅达利公司(Atari)公司也曾推出一款内嵌MCU的智能键盘IntelligentKeyboard,ikbd)。

功能说明:

简单来说,它需要通过USB接入电脑主机,并充当一个HID设备(键盘和鼠标),同时从电脑主机获得电源;其次,键盘鼠标设备可以通过USB接入它,它能够识别并获取键盘鼠标输入,它还需要一个显示屏,用于输入法的运行。鼠标在选字(词)阶段参与输入法的运行,其余情况下透传至主机;用户也可以通过一个拨动开关设置键盘为透传模式。

拼音输入法的运行分为两个阶段:输入拼音、选择字/词。输入拼音阶段需要输入汉语拼音字母,例如:a。屏幕进行回显,并检索符合的汉字并显示(阿、啊),同时为用户提供选字/词功能,当然也可以继续补充输入拼音字母(比如ai、an等)。

选字/词可以通过鼠标或者方向键进行。

方案一:树莓派Pico

树莓派Pico基于树莓派RP2040,可以通过PicoPIO实现USB功能(需要扩展一个USBTypeA母口),官方提供4种主板:Pico、PicoH、PicoW以及PicoWH。

[图片]

vboOLUvbaOLULU

由JacekFedoryhski维护的基于Pico的HIDRemapper项目位于:

https://github.com/jfedor2/hid-remapper

需要一个USBTypeA母口,用于接入HID设备(键盘、鼠标),它同主板(Pico)的连接方式为:

USB——Pico

D+——GP0

D-——GP1

VBUS——VBUS

GND——GND

安装方法:

1、下载remapper.uf2文件

2、按住主板BOOTSEL按钮,重新插拔主板,主板将被识别为大容量存储设备,盘符为RPI-RPI2

3、将uf2文件拷入设备,设备将自动重启

显示:

Pico提供SPI接口,可以用于驱动ST7789之类的显示屏,例如微雪提供有Pico-ResTouch-LCD-2.8/3.5显示屏,其规格为:

操作电压:5V

分辨率:320x240/480×320

通讯方式:SPI

显示尺寸: 57.60×43.20mm/73.44×48.96mm

显示面板:IPS

像素大小:0.18x0.18/0.153×0.153mm

驱动芯片:ST7789/ILI9488

大小:70.20×50.20mm/86.00×57.20mm

触控驱动:XPT2046

ST7789LibraryforPico下Pico-ResTouch-LCD-2.8配置参数:

conststructst7789_configlcd_config={

.spi=spi1,

.gpio_din=11,

.gpio_clk=10,

.gpio_cs=9,

.gpio_dc=8,

.gpio_rst=15,

.gpio_bl=13,

};

中文显示

中文符号是方块字,不但编码需要多字节,字形信息也需要更多存储,比如16点阵,每个符号需要2x16字节,6763个汉字信息需要324624字节,24点阵则需要486936字节。

GB2312标准定义了6763个汉字和682个全角符号。

GB2312的编码方式为区位码,高字节为区码,低字节为位码。区码从A0(不含)开始,到FF(不含)结束,共计94个。位码从A0(不含)开始,到FF(不含)结束,共计94个,所以区索引号就是高字节-0xA1,位索引号就是低字节-0xA1

0-8:符号区

9-14:未编码区

15-54:一级汉字区

55-86:二级汉字区

87-93:未编码区

符号区0-8,共计定义94x9=846个符号

一二级汉字区码15-86,其中区号54码号250-254未定义,共计定义94x72-5=6763个汉字

为了节省空间,可以选用汉字库GT20L16SY1或者GT30L32S4W,它们采用SPI进行通信。

同Pico的连接方式为(使用spi0):

CLK——GP2(Pin4)

CS——GP1(Pin2)

SO——GP4(Pin6)

SI——GP3(Pin5)

它同AdagruitFeatureRP2040withUSBTypeAHost的连接方式为(使用spi0):

GT20L16SY1Adagruit

SCLK——SCK

GND——GND

CS——D24|D25等

VCC——3.3V

SO——MIMO

SI——MOMI

16x16点阵不等宽Ascii符号B的点阵数据为(34字节):

000C00F8F81818181818F8F0000000000000007F7F6363636363673E1C0000000000

地址计算方法:

Address=(ASCIICode–0x20)*0x22+0x1DE580;

B的Ascii码为42(十进制66),经计算后地址为0x1DEA04

USB:

PicoSDK通过TinyUSB提供USB功能,目前提供诸如MSC、MIDI、CDC、HID、Audio等类型的USB,我们需要的是HID设备(人机交互设备)如鼠标、键盘等的USB功能。

USB包括Host和Device两个部分,Host对接入的Device进行识别(枚举)、配置、通信、电源管理、解除配置等操作。

目前TinyUSB支持的传输速度为低速1.5Mbps、全速12Mbps和高速480Mbps。

USBDevice的结构分为Device、Configure、Interface和Endpoint,它们有各自的Descriptor,除此以外,还有字符串Descriptor,对于HID设备还有HIDDescriptor、ReportDescriptor等。

一个HID设备需要如下的Descriptor:Device、HIDReport、Configuration、String。

键盘HIDReport总共有8字节,其中第一字节用来表示特殊按键,第二字节保留,后面的六字节为按键的扫描码。定义如下:

typedefstruct

{

uint8_tmodifier;

uint8_treserved;

uint8_tkeycode[6];

}hid_keyboard_report_t;

typedefstruct

{

uint8_tbuttons;

int8_tx;

int8_ty;

int8_twheel;

int8_tpan;

}hid_mouse_report_t;

比如左ctrl键按下0100000000000000(十六进制),数字键1按下,0000590000000000(59是数字键1的16进制扫描码),数字

键1和2同时按下,0000595A00000000,

再按下左shift键,0200595A00000000,释放1键,02005A0000000000,全部释放,0000000000000000。

这里的键码为扫描码,USB定义了HID键盘设备的扫描码。

HIDDevice提供的函数包括:

tud_hid_keyboard_report:发送键盘消息

tud_hid_mouse_report:发送鼠标消息

tud_hid_report:发送消息

HIDHost提供的函数包括:

tuh_hid_receive_report:收取消息

在回调函数tuh_hid_report_received_cb中,可以对HIDReport进行解析。

TinyUSB通过宏定义进行功能定义,在头文件tusb_config.h中定义它们,例如宏

CFG_TUH_ENABLED的值决定是否使能Host功能,宏CFG_TUD_ENABLED的值决定是否使能Device功能。

拼音输入法:

pinyin是一个简单的拼音输入法,由iamyhw提供,代码位于:https://gitee.com/iamyhw/pinyin。

成品:

它基于Pico,通过底座接入一个显示屏,通过一个USBHub接入键盘和鼠标,然后在接入电脑。鼠标直接透传给电脑,键盘进行拼音输入,最后将一个(或几个)汉字传给电脑,或者直接透传给电脑(相当于关闭输入法,似乎应该增加一个拨动开关)

  • IMG_0464.jpeg

回复评论 (3)

中文库太大了,这要是单片机只能裁剪  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-11-2 23:19
引用: 秦天qintian0303 发表于 2024-11-2 23:19 中文库太大了,这要是单片机只能裁剪  

Pico板载Flash容量为2M,有国内厂家的兼容品板载Flash为16M,也可以通过SPI读取TF卡,刚开始没多想,谢谢!我对单片机不熟悉,树莓派还算了解一些。感觉Pico的门槛很低,开发起来很容易。

点赞  2024-11-3 05:13
引用: cwall 发表于 2024-11-3 05:13 Pico板载Flash容量为2M,有国内厂家的兼容品板载Flash为16M,也可以通过SPI读取TF卡,刚开始没多想,谢谢 ...

Pico板子还可以,现在也就ESP32和树莓派带这些,普通MCU就不行了

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-11-3 12:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复