基于CH32V208的USB转蓝牙键盘转换器设计与实现
1. 项目缘起为什么用CH32V208做USB转蓝牙键盘最近在折腾一个挺有意思的小项目做一个能把有线USB键盘变成蓝牙键盘的“小尾巴”。市面上其实有现成的成品但要么功能单一要么价格不菲最关键的是作为一个喜欢折腾的嵌入式开发者我更想自己动手从底层理解整个数据链路是如何打通的。这个项目的核心就是利用沁恒微电子的CH32V208这款RISC-V内核的MCU来实现USB HID人机接口设备与蓝牙HID之间的双向协议转换。你可能会问为什么选CH32V208这得从它的几个核心优势说起。首先它内置了全速USB 2.0控制器和蓝牙5.3控制器这是实现本项目的硬件基石。一颗芯片搞定USB和蓝牙两大通信接口无需外挂复杂的USB PHY或蓝牙模块大大简化了硬件设计和BOM成本。其次它基于RISC-V内核开发环境友好社区资源也在逐步丰富。最后它的功耗控制得不错对于需要电池供电的便携式转换装置来说这是一个关键考量点。简单来说CH32V208提供了一个高集成度、高性价比的“二合一”解决方案让我们可以专注于协议转换的逻辑本身而不是在复杂的接口桥接上耗费精力。这个“USB转蓝牙键盘装置”听起来简单但细究起来它需要完成几个关键任务作为USB设备它要能正确枚举为键盘接收来自主机的配置指令并稳定地读取键盘通过USB线发送过来的按键数据包作为蓝牙主机或设备它要能发起或响应配对连接并将接收到的USB按键数据按照蓝牙HID协议的格式重新打包并发送出去。这中间涉及到USB协议栈、蓝牙协议栈、HID报告描述符解析与生成、电源管理等多个技术栈的交叉是一个非常好的综合性实战项目。2. 硬件设计与核心元器件选型动手之前合理的硬件设计是成功的一半。CH32V208虽然高度集成但外围电路的设计依然需要仔细考量以确保USB和蓝牙两个射频部分的稳定工作。2.1 核心MCUCH32V208的引脚分配与关键外设CH32V208有多种封装对于这个项目选择LQFP48或QFN48这类引脚数适中的封装即可。我们需要重点关注以下几组引脚USB引脚PA11/PA12这是芯片内置的USB全速设备控制器专用DP/DM引脚。布线时必须遵循USB 2.0规范使用差分走线阻抗控制在90欧姆并尽可能短。在DP线上通常需要串联一个22欧姆的电阻用于阻抗匹配并在靠近端口处放置ESD保护器件。蓝牙RF引脚RF_P/RF_N这是蓝牙天线的差分输出。这部分电路是性能的关键。通常需要连接一个巴伦Balun电路将芯片的差分信号转换为单端信号再连接到陶瓷天线或PCB天线。巴伦电路和匹配网络通常由电感和电容组成的参数需要参考芯片数据手册和射频设计指南最好能借助网络分析仪进行调谐以达到最佳的驻波比和辐射效率。时钟与电源CH32V208内部有高速RC振荡器但对于USB通信对时钟精度有较高要求误差需在±0.25%以内因此强烈建议使用外部高速晶振。一颗12MHz或16MHz的无源晶振配合两个负载电容通常为20pF连接到OSC_IN和OSC_OUT引脚能为系统提供稳定的时钟源。电源方面需要提供稳定的3.3V供电。如果使用电池如单节锂电池则需要一个LDO如XC6206将电压稳至3.3V。注意在电源入口和芯片每个电源引脚附近放置足够多的去耦电容如100nF和10uF并联以滤除高频噪声。注意蓝牙射频部分的电源纹波要求尤其严格劣质的LDO或糟糕的PCB布局可能导致蓝牙连接不稳定、距离短甚至无法连接。建议选用低噪声、高PSRR的LDO并为射频部分预留独立的π型滤波电路。2.2 外围电路从简约到完备一个最小系统除了MCU、晶振、电源和射频匹配电路还可以根据需求添加以下部分状态指示至少需要两个LED。一个用于电源指示常亮另一个用于蓝牙连接状态指示如闪烁表示广播常亮表示已连接。用户按键添加一个轻触按键用于控制蓝牙配对模式如长按进入配对、清除配对信息等。电池管理与充电如果设计为便携式需要集成锂电池充电管理芯片如TP4056和电量检测电路可以通过ADC测量电池电压。CH32V208内置了ADC可以很方便地实现粗略的电量显示。固件升级接口预留SWD调试接口SWDIO/SWCLK是必须的方便调试和烧录。也可以考虑通过USB进行DFU设备固件升级这样用户后期无需拆机就能更新功能。PCB布局时务必遵循射频电路布局原则蓝牙天线部分下方所有层净空禁止走线和铺铜天线周围用接地过孔围成一圈进行屏蔽。数字部分特别是时钟线和模拟射频部分尽量远离电源走线要宽形成清晰的电源路径。3. 软件架构与双协议栈解析软件是整个装置的灵魂其核心是让USB协议栈和蓝牙协议栈和谐共处并高效、正确地转发HID数据。3.1 整体软件流程与状态机设计程序需要一个清晰的状态机来管理装置的生命周期。一个典型的状态流转如下初始化配置系统时钟依赖外部晶振、GPIO、中断等。初始化USB和蓝牙协议栈。USB枚举上电或插入USB后MCU作为USB设备向电脑发送描述符设备描述符、配置描述符、接口描述符、端点描述符、HID报告描述符。电脑识别为一个标准的HID键盘后会完成配置。此时USB端点通常是中断输入端点准备就绪等待接收键盘数据。蓝牙广播与连接USB枚举成功后或由按键触发蓝牙协议栈开始广播。广播数据中包含设备名称、HID服务UUID等信息。当手机、平板或电脑的蓝牙搜索到该设备并发起连接后双方会进行配对可能涉及PIN码确认或Just Works模式。连接建立后蓝牙协议栈会建立HID所需的ATT属性协议通道和GATT通用属性配置文件服务。数据转发核心循环USB - 蓝牙主循环不断查询USB中断输入端点是否有数据到达。一旦检测到有新的键盘报告通常是一个8字节的数据包包含修饰键和6个普通键值立即将其解析。然后按照蓝牙HID报告格式格式可能与USB HID报告完全相同也可能需要简单映射重新封装通过蓝牙GATT的“报告”特征Report Characteristic以“通知”或“写”的方式发送给已连接的蓝牙主机。蓝牙 - USB可选如果需要支持蓝牙主机发送的LED状态如大小写锁定、数字锁定同步回USB键盘则需要监听蓝牙GATT中对应的“输出报告”特征。收到数据后通过USB控制传输Set_Report或中断输出端点如果键盘支持将状态发送给USB键盘。不过大多数USB键盘的指示灯由自身控制此功能非必需。这里的关键是数据包解析与转换。你需要同时理解USB HID报告描述符和蓝牙HID报告描述符的结构。幸运的是对于标准的键盘两者的报告格式通常是一致的Boot Protocol这大大简化了转换工作。你的代码中需要有一个转换函数其输入是USB报告字节流输出是蓝牙报告字节流中间可能涉及字节序或位域的微调。3.2 USB设备栈实现要点沁恒通常提供了完善的USB设备库。你需要做的是修改描述符在官方示例代码如HID设备例程的基础上修改设备描述符中的厂商IDVID、产品IDPID和设备名称。最重要的是正确编写HID报告描述符。一个最简单的键盘报告描述符定义了输入报告Input Report用于上传按键数据和输出报告Output Report用于下发LED状态。你需要确保你的描述符与你要转接的键盘兼容。处理中断传输配置好一个中断输入端点IN Endpoint。当键盘有按键动作时主机你的装置会通过USB读取该端点的数据。在你的代码中需要在该端点的数据接收回调函数里将收到的数据包放入一个队列或设置一个标志位供主循环处理。处理控制传输标准请求如获取描述符、设置地址、设置配置由库函数处理。对于HID类特定请求如Get_Report、Set_Report、Set_Idle等也需要在库的回调函数中妥善处理尤其是Set_Report它可能用于设置键盘指示灯。3.3 蓝牙协议栈实现要点CH32V208的蓝牙协议栈通常以库的形式提供你可能需要基于其“HID设备”或“GATT服务器”的示例进行开发。GATT数据库配置你需要构建一个包含HID服务的GATT数据库。HID服务包含多个特征如HID Information包含HID设备的版本、国家码等信息。Report Map存放蓝牙HID报告描述符内容可能与USB的报告描述符相同或简化。Report用于传输实际的按键报告数据。通常你会用到两个实例一个用于输入Input Report从装置到主机一个用于输出Output Report从主机到装置。Protocol Mode设置报告协议Report Protocol或引导协议Boot Protocol。HID Control Point用于控制设备如唤醒主机。广播与连接管理配置广播参数间隔、广播数据。实现连接事件回调在连接建立和断开时更新状态标志并控制LED。数据发送当需要发送按键数据时调用蓝牙库的API将封装好的报告数据通过Report特征属性为Notify发送出去。确保发送速率适中避免堵塞。实操心得USB和蓝牙都是事件驱动的系统。在编程时要避免在主循环中进行阻塞式等待。最佳实践是使用“事件标志”或“消息队列”。例如USB端点收到数据后只是设置一个usb_data_ready标志主循环检测到该标志后处理数据并触发蓝牙发送。同样蓝牙连接状态变化也通过事件回调来设置标志。这种异步架构能保证系统的实时性和稳定性。4. 开发环境搭建与调试实战理论说得再多不如实际动手调一遍。这里分享从零开始构建开发环境的步骤和必然会遇到的坑。4.1 工具链安装与项目创建安装RISC-V GCC工具链前往沁恒官网或芯来科技等网站下载适用于你操作系统的RISC-V GCC编译工具链并配置好环境变量。获取CH32V208的SDK从沁恒官网下载CH32V20x系列的评估板软件包EVT。里面包含了设备头文件、启动文件、链接脚本、外设驱动库以及丰富的示例程序。选择IDE你可以使用MounRiver Studio沁恒基于Eclipse定制的IDE它集成了工具链和调试器开箱即用对新手友好。也可以使用更通用的VSCode PlatformIO或VSCode RISC-V插件 OpenOCD的方案自由度更高。创建工程基于SDK中的USB和蓝牙复合设备示例如果有创建你的工程。如果没有可以分别从USB HID设备示例和蓝牙HID设备示例中合并代码。重点复制USB/Device、USB/HID、BLE目录下的源文件以及对应的Inc头文件。4.2 调试技巧与常见问题排查调试此类双协议设备逻辑分析仪和蓝牙调试工具是你的左膀右臂。阶段一USB枚举调试问题电脑无法识别设备或在设备管理器中显示为“未知设备”。排查使用USB协议分析软件如USBlyzer或逻辑分析仪配合DSView等软件抓取USB总线数据。这是最直接的手段。查看设备插入后主机发出的Get_Descriptor请求以及你的设备返回的数据是否完全正确。一个字节的错误都可能导致枚举失败。检查描述符。重点检查设备描述符的bcdUSB、idVendor、idProduct配置描述符的wTotalLength以及HID报告描述符的语法。可以将你的报告描述符与Linux内核中标准的键盘报告描述符进行对比。检查电源。用万用表测量MCU的3.3V电源是否稳定USB的D线上是否有正确的1.5K上拉电阻CH32V208内部通常可软件控制。阶段二蓝牙连接调试问题手机搜不到设备或连接后立即断开。排查射频问题这是最可能的原因。首先用手机上的蓝牙调试APP如nRF Connect或LightBlue扫描。如果完全搜不到问题大概率在射频电路——天线匹配不佳、布局不合理、电源噪声大。可以尝试用频谱仪或带射频功能的示波器观察天线端的信号。软件配置问题如果能搜到但连不上检查广播数据是否正确包含了HID服务的UUID0x1812。检查GATT数据库构建是否正确特别是Report Map特征的值是否有效。使用nRF Connect连接后可以查看并读写所有特征值帮助你判断服务是否完整暴露。内存与堆栈蓝牙协议栈运行时需要一定的RAM。检查链接脚本中堆heap和栈stack的大小是否足够。连接失败有时是因为内存越界导致程序跑飞。可以适当增大堆栈大小试试。阶段三数据转发调试问题USB按键后蓝牙端无反应或按键错乱。排查数据通路在USB数据接收回调函数和蓝牙数据发送函数处设置断点或打印日志通过串口。确认USB数据是否被正确接收以及转换后的数据是否被送入蓝牙发送函数。报告格式按键错乱几乎一定是报告格式解析错误。用一个已知的按键如字母A分别抓取原始USB报告数据和准备发送的蓝牙报告数据进行逐字节比对。确认键值码Keycode的映射关系是否正确。USB和蓝牙HID的键值码表是相同的这减少了工作量但要留意报告IDReport ID和报告长度是否匹配。时序与缓冲区检查是否有数据覆盖或丢失。确保你的数据缓冲区在读取和写入时受到保护如关中断。蓝牙发送可能有速率限制如果按键太快可能需要一个队列来缓冲。一个真实的踩坑案例在调试时发现蓝牙连接后几分钟就会自动断开。抓取蓝牙空中包发现是设备端没有及时回复主机的“连接参数更新请求”。原因是我的程序在处理USB数据时关闭了全局中断时间过长导致错过了蓝牙协议栈底层的中断。解决方案是将耗时的数据处理从中断回调移到主循环并优化代码执行时间确保蓝牙协议栈的实时性要求得到满足。5. 功能优化与进阶玩法基础功能跑通后可以考虑一些优化和扩展让你的装置更实用、更智能。5.1 低功耗优化对于电池供电的设备功耗是生命线。睡眠模式当USB未连接且蓝牙未连接时让CH32V208进入深度睡眠模式Stop模式。此时仅保留RTC和唤醒源如外部按键中断工作电流可降至微安级别。当用户按下配对键或插入USB时通过外部中断唤醒MCU。蓝牙连接间隔在蓝牙连接参数协商时可以尝试请求一个较长的连接间隔如100ms以上。更长的间隔意味着射频收发机更频繁地休眠可以显著降低平均电流。但这可能会略微增加按键响应的延迟需要在功耗和体验间取得平衡。动态频率调整在空闲时可以降低系统主频。CH32V208支持多种时钟源和分频在处理简单任务时使用较低的频率可以节省功耗。5.2 多设备管理与协议扩展设备记忆利用CH32V208内部的Flash或外置的EEPROM存储最近配对成功的蓝牙主机地址。这样下次开机时可以自动尝试回连无需重新配对。USB主机模式探索进阶CH32V208的USB实际上支持主机模式。这意味着理论上你可以将这个装置改造为“蓝牙转USB”的接收器连接蓝牙键盘到没有蓝牙的电脑。这需要实现USB主机协议栈和蓝牙设备端的角色转换复杂度更高但可玩性也更强。复合设备除了键盘你的HID报告描述符可以同时包含鼠标Mouse或消费电子设备Consumer Control如音量键的描述符。这样你的装置就能同时转发键盘和多媒体按键实现一个真正的多功能转换器。5.3 量产与固件升级考虑如果打算小规模制作需要考虑烧录与测试设计一个简单的测试工装通过USB连接电脑运行自动化测试脚本模拟按键并验证蓝牙端输出同时检查电流是否在正常范围。DFU设备固件升级实现通过USB的DFU功能。这样用户可以通过一个专用的PC软件轻松为装置升级固件修复bug或增加新功能。沁恒的SDK中通常有DFU的示例可以集成到你的项目中。外壳与结构使用3D打印为你的装置设计一个小巧美观的外壳将PCB、电池、天线妥善安置并留出USB-C口和状态指示灯孔。这个项目从硬件设计到软件调试完整地覆盖了嵌入式开发中USB、蓝牙、低功耗、实时系统等多个核心知识点。它不仅仅是一个“转换头”更是一个理解现代消费电子设备如何通信的绝佳窗口。当你亲手制作的装置成功将一次按键从有线端传递到无线端并在屏幕上显示出来时那种成就感是无可替代的。

相关新闻

基于行空板的智能小管家项目:从状态机原理到自动光控实践

基于行空板的智能小管家项目:从状态机原理到自动光控实践

1. 项目缘起:从“点亮LED”到“智能管家”的跨越如果你已经跟着行空板的Python入门教程一路学过来,从第一课的“Hello World”到第十三课的传感器数据采集,那么恭喜你,你已经掌握了与这个小小开发板对话的基本语法。但编程的魅力远…

2026/7/28 8:58:13阅读更多 →
异构图Transformer在多智能体任务分配中的实践优化

异构图Transformer在多智能体任务分配中的实践优化

1. 项目概述:异构图Transformer在移动多智能体任务分配中的应用2025年NIPS会议这篇论文提出的异构图Transformer模型,正在重新定义移动多智能体系统的协同决策方式。我在实际部署多无人机编队系统时发现,传统集中式任务分配方法在面对动态环境…

2026/7/28 8:58:13阅读更多 →
解决行空板apt update失败:网络、源配置与GPG密钥全解析

解决行空板apt update失败:网络、源配置与GPG密钥全解析

1. 问题现场:当行空板拒绝更新时,你看到了什么?如果你正在鼓捣一块行空板,准备安装新软件或者更新系统,第一步往往就是打开终端,信心满满地敲下sudo apt update。这个命令对于任何基于 Debian/Ubuntu 的 Li…

2026/7/28 8:58:13阅读更多 →
AFL、libFuzzer与Honggfuzz实战横评:漏洞挖掘场景下的工具选型与调优指南

AFL、libFuzzer与Honggfuzz实战横评:漏洞挖掘场景下的工具选型与调优指南

1. 项目概述:为什么需要一场Fuzzing工具的“实战对决”? 在安全研究领域,Fuzzing(模糊测试)早已不是新鲜词汇,它被誉为自动化漏洞挖掘的“瑞士军刀”。无论是企业安全团队进行内部代码审计,还是…

2026/7/28 11:24:12阅读更多 →
B站视频下载终极指南:如何永久保存大会员4K和充电专属内容

B站视频下载终极指南:如何永久保存大会员4K和充电专属内容

B站视频下载终极指南:如何永久保存大会员4K和充电专属内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾为无法…

2026/7/28 11:24:12阅读更多 →
Unity MMORPG服务器架构:基于Mirror的区域管理与兴趣网格实战

Unity MMORPG服务器架构:基于Mirror的区域管理与兴趣网格实战

1. 项目概述:构建一个能承载万人在线的MMORPG世界 做MMORPG,尤其是想做一个能承载成百上千甚至上万玩家同时在线的世界,最头疼的往往不是客户端的美术和玩法,而是服务器端那套看不见摸不着的网络架构。很多独立开发者或者小团队&a…

2026/7/28 11:24:12阅读更多 →
JDK 21虚拟线程在支付网关高并发场景下的实践

JDK 21虚拟线程在支付网关高并发场景下的实践

1. 项目概述 去年秋天JDK 21正式发布时,虚拟线程(Virtual Threads)作为预览特性首次亮相就引起了我的强烈兴趣。作为在金融支付系统摸爬滚打多年的老码农,我深知传统线程模型在高并发I/O场景下的痛点——每个Socket连接都需要独占…

2026/7/28 11:24:12阅读更多 →
编写程序统计纯粹为了自我满足而创作的作品数量,以此作为衡量人生充实度的核心标准。

编写程序统计纯粹为了自我满足而创作的作品数量,以此作为衡量人生充实度的核心标准。

为自己而做:用 Python 统计"无用创作",重建人生的充实度量尺。说明:本文为纯技术实践分享,不涉及任何课程推广、营销引流或商业产品。所有代码可在本地离线运行。一、实际应用场景描述在《心理健康与创新能力》课程中&a…

2026/7/28 11:24:12阅读更多 →
终端AI编程工具Claude Code提升开发效率40%

终端AI编程工具Claude Code提升开发效率40%

1. 为什么终端AI编程正在改变开发方式在2023年Stack Overflow开发者调查中,87%的专业开发者表示已在日常工作中使用AI编程工具。而更值得关注的现象是:越来越多顶尖工程师开始将AI编程工具深度集成到终端工作流中。Claude Code作为新兴的CLI工具链&#…

2026/7/28 11:22:11阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →