653浏览
查看: 653|回复: 1

[ESP8266/ESP32] Ch554 制作USB Host 实现USB键盘转蓝牙

[复制链接]
之前使用Ch9350制作过一个 USBHost Shield 【参考1】,能够读取USB键盘鼠标的输入。最近在研究 Ch554 ,使用Ch554e制作了一个同样功能的Shield,配合ESP32-C3 能够实现USB 键盘转蓝牙的功能。
使用 Ch554 的有优点如下:
1.     价格较低,相对于Ch935010元的价格,最便宜的Ch554e 只要不到1.5元;
2.     焊接友好,对于TSSOP-20/SOP-16或者MSOP-10普通人都能够很好的进行焊接;
3.     如果你的设计对于体积敏感,可以选择MSOP-10封装的 Ch554e;
4.     外围电路简单,只需要2个电容和1个电阻
缺点:
1.     需要自己使用keil 编写程序;
2.     兼容性比不上Ch9350,可能出现无法驱动的USB设备;
这次带来就是基于Ch554e的设计。硬件部分设计如下:
Ch554 制作USB Host 实现USB键盘转蓝牙图1

下方就是CH554e的最小系统,外部配合20.1uf电容,以及110K电阻即可工作。下载方法是:上电之前短接 DL 位置,然后再上电使用WCHISPStudio即可。不过在研发阶段建议专门准备一个开发板便于操作。同时,官方的例子都是用第一个UART作为调试输出,而Ch554只有第2 Uart可供使用。
根据上述电路设计的PCB如下:

Ch554 制作USB Host 实现USB键盘转蓝牙图2


这是一个底板,上面直接连接DFRobot ESP32-C3即可。焊接后的板卡如下:

Ch554 制作USB Host 实现USB键盘转蓝牙图3
直接安装在ESP32-C3上即可使用:

Ch554 制作USB Host 实现USB键盘转蓝牙图4

接下来开始代码的设计,首先设计的是Ch554的代码,这里直接使用官方的代码进行简单修改。
为了便于使用我们使用和Ch9350相同的输出格式:

  
0-1
  
57 AB
数据头,固定数值
02
88
表示有效帧值
03
NN
后续数据长度,从04开始到最后的校验和
04
10
  
固定值
  
[7:6]:00 - 保留
  
[5:4]:01 - 鼠标
  
[3]  :0  - 保留
  
[2:1]:00 - 未知
  
[0]  :0  - 端口1
05-
AA BB CC…..MM
键盘数据,例如:08 00 00 00 00 00 00 00
XX
Num
帧序列号
XX
CheckSum
校验和,从05开始的数据和

例如:实际发送的一个数据:
57 AB 88 0B 10 08 00 00 00 00 00 00 0000 08
代码是基于WCH 官方修改而来的,基本原理是:比较每一次收到的数据(RxBuffer)是否和上一次(LastBuffer)相同,如果不同,那么进行上报。使用上面介绍的数据报文格式:

                        IsSame=TRUE;
                       for ( i = 0; i < len; i ++ ){
                           if (LastBuffer!=RxBuffer) {
                              IsSame=FALSE;
                               LastBuffer=RxBuffer;
                           }
                       }
                       //只有与前一次不同才进行输出
                       if (IsSame==FALSE) {
                           checksum=0x00;
                           CH554UART1SendByte(0x57);CH554UART1SendByte(0xAB);CH554UART1SendByte(0x88);CH554UART1SendByte(len+3);CH554UART1SendByte(0x10);
                           for ( i = 0; i < len; i ++ ){
                               CH554UART1SendByte(RxBuffer);
                              checksum=checksum+RxBuffer;
                           }
                           checksum=checksum+counter;
                           CH554UART1SendByte(counter);CH554UART1SendByte(checksum);
                           counter++;
                       }

代码使用 Keil4编译通过。
ESP32-C3代码如下:

  1. #include <Arduino.h>
  2. #include <BleKeyboard.h>
  3. BleKeyboard bleKeyboard;
  4. #define DEBUGMODE 0
  5. void setup() {
  6.   Serial.begin(115200);
  7.   Serial1.begin(115200, SERIAL_8N1, RX, TX);
  8.   bleKeyboard.begin();
  9. }
  10. void loop() {
  11.   while (Serial.available()) {
  12.     char c = Serial.read();
  13.     if (c == '1') {
  14.       Serial.println("get1");
  15.     }
  16.     if (c == '3') {
  17.       ESP.restart();
  18.     }
  19.   }
  20.   //根据 CH9350 Spec 每次最多输出 72Bytes
  21.   byte Data[72];
  22.   unsigned int CounterLast = Serial1.available();
  23.   unsigned int CounterCurrent = 0;
  24.   // 如果当前串口有数据
  25.   if (CounterLast != 0) {
  26.     // 进行简单测试,如果当前还在传输数据那么持续接收
  27.     while (CounterCurrent != CounterLast) {
  28.       CounterLast = Serial1.available();
  29.       delayMicroseconds(500);
  30.       CounterCurrent = Serial1.available();
  31.     }
  32.   }
  33.   if (CounterCurrent > 0) {
  34.     // 一次性将数据收取下来
  35.     Serial1.readBytes(Data, CounterCurrent);
  36.     unsigned int i = 0;
  37.     unsigned int Length;
  38.     while (i < CounterCurrent) {
  39.       // 识别帧头
  40.       if ((Data[i] == 0x57) && (Data[i + 1] == 0xAB)) {
  41.         // 有效键值帧
  42.         if (Data[i + 2] == 0x88) {
  43.           // 获得数据长度
  44.           Length = Data[i + 3];
  45.           if (DEBUGMODE) {
  46.             //Serial.print("Ln:");Serial.print(Length);
  47.             for (int j = 1; j < Length + 1; j++) {
  48.               if (Data[i + 3  + j] < 16) {
  49.                 Serial.print("0");
  50.               }
  51.               Serial.print(Data[i + 3  + j], HEX);
  52.               Serial.print(" ");
  53.             }
  54.             Serial.println(" ");
  55.           }
  56.           //如果是键盘
  57.           if (Data[i + 4] == 0x10) {
  58.             if (DEBUGMODE) {
  59.               Serial.print("Key");
  60.               for (int j = 1; j < Length + 1; j++) {
  61.                 Serial.print(Data[i + 3  + j], HEX);
  62.                 Serial.print(" ");
  63.               }
  64.               Serial.println(" ");
  65.             }
  66.             
  67.             //判断为Dostyle键盘
  68.             if (Data[i + 3  + 1] == 0x10) {
  69.               if (bleKeyboard.isConnected() == true) {
  70.                 bleKeyboard.sendReport((KeyReport*)(&Data[i + 3  + 2]));
  71.               }
  72.             }
  73.           }
  74.           i = i + 3 + Length;
  75.         } else if (Data[i + 2] == 0x82) {
  76.           i = i + 3; // 跳过
  77.         }
  78.       }
  79.       i++;
  80.     } // while (i < Counter)
  81.   }
  82. }
复制代码
使用时,只需要给ESP32-C3供电,连接好USB键盘后就可以搜索蓝牙键盘进行连接使用了。工作的测试视频在:





zoologist  高级技匠
 楼主|

发表于 2024-7-4 11:04:59

完整代码和测试视频可以在这里看到

工作的视频

Ch554的代码:
下载附件Ch554USBKBHost.zip

ESP32-C3 的代码:

下载附件Ch554 C3.zip

参考:


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail