由于中国使用方块字,常见的符号也有七八千,只能通过虚拟键盘,也就是输入法来使用计算机。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接入键盘和鼠标,然后在接入电脑。鼠标直接透传给电脑,键盘进行拼音输入,最后将一个(或几个)汉字传给电脑,或者直接透传给电脑(相当于关闭输入法,似乎应该增加一个拨动开关)
引用: 秦天qintian0303 发表于 2024-11-2 23:19 中文库太大了,这要是单片机只能裁剪
Pico板载Flash容量为2M,有国内厂家的兼容品板载Flash为16M,也可以通过SPI读取TF卡,刚开始没多想,谢谢!我对单片机不熟悉,树莓派还算了解一些。感觉Pico的门槛很低,开发起来很容易。
引用: cwall 发表于 2024-11-3 05:13 Pico板载Flash容量为2M,有国内厂家的兼容品板载Flash为16M,也可以通过SPI读取TF卡,刚开始没多想,谢谢 ...
Pico板子还可以,现在也就ESP32和树莓派带这些,普通MCU就不行了