cwall 发表于 2024-11-2 11:30

输入法键盘

<div class='showpostmsg'><p>由于中国使用方块字,常见的符号也有七八千,只能通过虚拟键盘,也就是输入法来使用计算机。80年代很多人研究输入法,到今天也有很多输入法,比如搜狗,百度、腾讯,Google、微软等。现在电脑的性能和尺寸已经今非昔比,为什么不在键盘里嵌入一个电脑,把输入法从越来越庞杂的电脑系统中剥离出来呢?</p>
<p></p>
<p>头条上看到一篇文章:《电子工程师都怎么改装键盘?》,原帖发表于电子工程论坛中文站:https://www.eeworld.com.cn/avLy9WD,作者为彭丙浩</p>
<p></p>
<p>头条上还有另一篇文章:《树莓派400一体机,可以用作电脑的键盘了》,原帖发表于CNXSoftware中文站。显然这是一篇译文,原帖发表于CNXSoftware论坛,作者为Jean-LucAufranc。</p>
<p></p>
<p>他这篇文章所说的项目,事实上是GitHub上的pi400kb项目,地址为:https://github.com/Gadgetoid/pi400kb。</p>
<p></p>
<p>虽然看起来似乎风马牛不相及,但如果你仔细看下去,会发现这两篇文章其实说的是同一件事情,也就是把收到的键盘信号进行处理后再输出到另一台电脑,或者专业一点就是HID消息的转发/镜像过程,也就是HID-remapper。</p>
<p></p>
<p>这样有什么实际意义呢?单就HID-remapper而言,用户还是很多的,特别是游戏玩家,他们对键盘简直爱不释手。对中文输入法而言,现在有很多电脑用户使用电脑还需要他人帮助(安装、配置系统及常用软件等),将输入法硬件化,确实可以解决一些电脑用户使用电脑的问题。历史上雅达利公司(Atari)公司也曾推出一款内嵌MCU的智能键盘IntelligentKeyboard,ikbd)。</p>
<p></p>
<p>功能说明:</p>
<p>简单来说,它需要通过USB接入电脑主机,并充当一个HID设备(键盘和鼠标),同时从电脑主机获得电源;其次,键盘鼠标设备可以通过USB接入它,它能够识别并获取键盘鼠标输入,它还需要一个显示屏,用于输入法的运行。鼠标在选字(词)阶段参与输入法的运行,其余情况下透传至主机;用户也可以通过一个拨动开关设置键盘为透传模式。</p>
<p>拼音输入法的运行分为两个阶段:输入拼音、选择字/词。输入拼音阶段需要输入汉语拼音字母,例如:a。屏幕进行回显,并检索符合的汉字并显示(阿、啊),同时为用户提供选字/词功能,当然也可以继续补充输入拼音字母(比如ai、an等)。</p>
<p>选字/词可以通过鼠标或者方向键进行。</p>
<p></p>
<p>方案一:树莓派Pico</p>
<p></p>
<p>树莓派Pico基于树莓派RP2040,可以通过PicoPIO实现USB功能(需要扩展一个USBTypeA母口),官方提供4种主板:Pico、PicoH、PicoW以及PicoWH。</p>
<p></p>
<p>[图片]</p>
<p>vboOLUvbaOLULU</p>
<p></p>
<p>由JacekFedoryhski维护的基于Pico的HIDRemapper项目位于:</p>
<p>https://github.com/jfedor2/hid-remapper</p>
<p>需要一个USBTypeA母口,用于接入HID设备(键盘、鼠标),它同主板(Pico)的连接方式为:</p>
<p>USB——Pico</p>
<p>D+——GP0</p>
<p>D-——GP1</p>
<p>VBUS——VBUS</p>
<p>GND——GND</p>
<p></p>
<p>安装方法:</p>
<p>1、下载remapper.uf2文件</p>
<p>2、按住主板BOOTSEL按钮,重新插拔主板,主板将被识别为大容量存储设备,盘符为RPI-RPI2</p>
<p>3、将uf2文件拷入设备,设备将自动重启</p>
<p></p>
<p>显示:</p>
<p></p>
<p>Pico提供SPI接口,可以用于驱动ST7789之类的显示屏,例如微雪提供有Pico-ResTouch-LCD-2.8/3.5显示屏,其规格为:</p>
<p>操作电压:5V</p>
<p>分辨率:320x240/480×320</p>
<p>通讯方式:SPI</p>
<p>显示尺寸:        57.60×43.20mm/73.44×48.96mm</p>
<p>显示面板:IPS</p>
<p>像素大小:0.18x0.18/0.153×0.153mm</p>
<p>驱动芯片:ST7789/ILI9488</p>
<p>大小:70.20×50.20mm/86.00×57.20mm</p>
<p>触控驱动:XPT2046</p>
<p></p>
<p>ST7789LibraryforPico下Pico-ResTouch-LCD-2.8配置参数:</p>
<p>conststructst7789_configlcd_config={</p>
<p>.spi=spi1,</p>
<p>.gpio_din=11,</p>
<p>.gpio_clk=10,</p>
<p>.gpio_cs=9,</p>
<p>.gpio_dc=8,</p>
<p>.gpio_rst=15,</p>
<p>.gpio_bl=13,</p>
<p>};</p>
<p></p>
<p>中文显示</p>
<p></p>
<p>中文符号是方块字,不但编码需要多字节,字形信息也需要更多存储,比如16点阵,每个符号需要2x16字节,6763个汉字信息需要324624字节,24点阵则需要486936字节。</p>
<p></p>
<p>GB2312标准定义了6763个汉字和682个全角符号。</p>
<p>GB2312的编码方式为区位码,高字节为区码,低字节为位码。区码从A0(不含)开始,到FF(不含)结束,共计94个。位码从A0(不含)开始,到FF(不含)结束,共计94个,所以区索引号就是高字节-0xA1,位索引号就是低字节-0xA1</p>
<p></p>
<p>0-8:符号区</p>
<p>9-14:未编码区</p>
<p>15-54:一级汉字区</p>
<p>55-86:二级汉字区</p>
<p>87-93:未编码区</p>
<p></p>
<p>符号区0-8,共计定义94x9=846个符号</p>
<p></p>
<p>一二级汉字区码15-86,其中区号54码号250-254未定义,共计定义94x72-5=6763个汉字</p>
<p></p>
<p>为了节省空间,可以选用汉字库GT20L16SY1或者GT30L32S4W,它们采用SPI进行通信。</p>
<p>同Pico的连接方式为(使用spi0):</p>
<p>CLK——GP2(Pin4)</p>
<p>CS——GP1(Pin2)</p>
<p>SO——GP4(Pin6)</p>
<p>SI——GP3(Pin5)</p>
<p>它同AdagruitFeatureRP2040withUSBTypeAHost的连接方式为(使用spi0):</p>
<p>GT20L16SY1Adagruit</p>
<p>SCLK——SCK</p>
<p>GND——GND</p>
<p>CS——D24|D25等</p>
<p>VCC——3.3V</p>
<p>SO——MIMO</p>
<p>SI——MOMI</p>
<p></p>
<p>16x16点阵不等宽Ascii符号B的点阵数据为(34字节):</p>
<p>000C00F8F81818181818F8F0000000000000007F7F6363636363673E1C0000000000</p>
<p>地址计算方法:</p>
<p>Address=(ASCIICode–0x20)*0x22+0x1DE580;</p>
<p>B的Ascii码为42(十进制66),经计算后地址为0x1DEA04</p>
<p></p>
<p>USB:</p>
<p>PicoSDK通过TinyUSB提供USB功能,目前提供诸如MSC、MIDI、CDC、HID、Audio等类型的USB,我们需要的是HID设备(人机交互设备)如鼠标、键盘等的USB功能。</p>
<p>USB包括Host和Device两个部分,Host对接入的Device进行识别(枚举)、配置、通信、电源管理、解除配置等操作。</p>
<p>目前TinyUSB支持的传输速度为低速1.5Mbps、全速12Mbps和高速480Mbps。</p>
<p>USBDevice的结构分为Device、Configure、Interface和Endpoint,它们有各自的Descriptor,除此以外,还有字符串Descriptor,对于HID设备还有HIDDescriptor、ReportDescriptor等。</p>
<p></p>
<p>一个HID设备需要如下的Descriptor:Device、HIDReport、Configuration、String。</p>
<p></p>
<p>键盘HIDReport总共有8字节,其中第一字节用来表示特殊按键,第二字节保留,后面的六字节为按键的扫描码。定义如下:</p>
<p>typedefstruct</p>
<p>{</p>
<p>uint8_tmodifier;</p>
<p>uint8_treserved;</p>
<p>uint8_tkeycode;</p>
<p>}hid_keyboard_report_t;</p>
<p>typedefstruct</p>
<p>{</p>
<p>uint8_tbuttons;</p>
<p>int8_tx;</p>
<p>int8_ty;</p>
<p>int8_twheel;</p>
<p>int8_tpan;</p>
<p>}hid_mouse_report_t;</p>
<p>比如左ctrl键按下0100000000000000(十六进制),数字键1按下,0000590000000000(59是数字键1的16进制扫描码),数字</p>
<p>键1和2同时按下,0000595A00000000,</p>
<p>再按下左shift键,0200595A00000000,释放1键,02005A0000000000,全部释放,0000000000000000。</p>
<p>这里的键码为扫描码,USB定义了HID键盘设备的扫描码。</p>
<p></p>
<p>HIDDevice提供的函数包括:</p>
<p>tud_hid_keyboard_report:发送键盘消息</p>
<p>tud_hid_mouse_report:发送鼠标消息</p>
<p>tud_hid_report:发送消息</p>
<p></p>
<p>HIDHost提供的函数包括:</p>
<p>tuh_hid_receive_report:收取消息</p>
<p></p>
<p>在回调函数tuh_hid_report_received_cb中,可以对HIDReport进行解析。</p>
<p></p>
<p>TinyUSB通过宏定义进行功能定义,在头文件tusb_config.h中定义它们,例如宏</p>
<p>CFG_TUH_ENABLED的值决定是否使能Host功能,宏CFG_TUD_ENABLED的值决定是否使能Device功能。</p>
<p></p>
<p>拼音输入法:</p>
<p></p>
<p>pinyin是一个简单的拼音输入法,由iamyhw提供,代码位于:https://gitee.com/iamyhw/pinyin。</p>
<p></p>
<p>成品:</p>
<p>它基于Pico,通过底座接入一个显示屏,通过一个USBHub接入键盘和鼠标,然后在接入电脑。鼠标直接透传给电脑,键盘进行拼音输入,最后将一个(或几个)汉字传给电脑,或者直接透传给电脑(相当于关闭输入法,似乎应该增加一个拨动开关)</p>
<p></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

秦天qintian0303 发表于 2024-11-2 23:19

<p>中文库太大了,这要是单片机只能裁剪&nbsp;&nbsp;</p>

cwall 发表于 2024-11-3 05:13

秦天qintian0303 发表于 2024-11-2 23:19
中文库太大了,这要是单片机只能裁剪&nbsp;&nbsp;

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

秦天qintian0303 发表于 2024-11-3 12:40

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

<p>Pico板子还可以,现在也就ESP32和树莓派带这些,普通MCU就不行了</p>
页: [1]
查看完整版本: 输入法键盘