以前购买了安信可的ESP32-CAM开发板,就是ESP32多了个摄像头。想着还是又拿出来用用,想到了将有线键盘转换为蓝牙无线键盘,以前也早就玩过了,所以想着直接用ESP32来转换。事实上我在本篇文章中,没写代码。。。。。没有啥技术,只是个简单的备忘介绍罢了(本文的后面就知道了),平常比较忙,不过有空的时候会折腾的。

3459570602.jpg

以前使用CC2541+Arduino

这里补充说明一下,以前是怎么玩的,需要使用两块板子,才行。最开始是油管的主播先发布的视频好像。具体的流程在下面的链接中有对应的介绍,这种方式不是本文的重点。
ARDUINO打造USB蓝牙键盘转接器
Arduino打造USB蓝牙键盘扩展器-github

在淘宝上可以购入CC2541为基础的开发板,如:HC-06蓝牙模块,AT-09,BT05-A。当然,以前也折腾过,道瑞X-doria KidFit儿童手环CC2541二次开发,同样可以写入德州仪器的BLE-stack,没有任何问题。关于CC2541可以上德仪官网查看

Nordic nRF51/nRF52

nrf51822等芯片也是便宜的选择。

转换过程

当然,我们究其前面的步骤本质,就是有这么个转换过程。
USB接口的键盘->USB HOST->串口->某种用于"透传"的蓝牙模块
如果想要这个步骤变得简单,那么就需要USB接口的键盘->USB HOST->某种用于"透传"的蓝牙模块,跳过串口传输这一步骤。

为什么ESP32不能直接用于USB HOST?

我觉得这个问题不是很难,主要的原因是ESP32类的芯片,没有直接用于USB HOST的接口,而CC2541,STM32F105等芯片,能对USB直接进行连接操作。当然,我解释有误的欢迎指出。

使ESP32增加USB功能

我个人认为,使用MAX3421E,对其进行转换是比较好的选择,和美信MAX3421E相同的这类芯片本来就是为了在单芯片IC上增加USB功能,可以查看MAX3421E的详情介绍页

MAX3421E
USB外设/主机控制器包含了实现USB规范2.0全速USB外设或全速/低速主机所需的数字逻辑电路和模拟电路。内置收发器具有±15kV
ESD保护和可编程的USB连接和断开特性。内部串行接口引擎(SIE)处理底层USB协议,如错误校验和总线重试。通过频率高达26MHz的SPI™接口访问寄存器组,实现MAX3421E的控制。利用简易的3线或4线SPI接口,可为任何SPI主机(微处理器、ASIC和DSP等)增添USB外设或主机功能。

当MAX3421E作为USB主机工作时,可将大量USB外设与各种微处理器、ASIC或DSP连接起来。对于点到点解决方案,例如,嵌入式系统的USB键盘和鼠标接口,由于仅需一个目标器件,因此可大大简化运行MAX3421E的固件。

内部电平转换器允许SPI接口工作在1.4V至3.6V的系统电压。MAX3421E内部执行USB定时操作,并在操作完成后提供中断,因此,SPI主机无需定时器来满足USB的定时要求。MAX3421E包括8个通用输入/输出,所有采用I/O引脚实现SPI接口的微处理器都能再次利用I/O引脚,获得额外的输入、输出端口。

乐鑫的论坛上面也看到网友的回复

That's somewhat more difficult than you may think, as the ESP32 does
not have any USB hardware. (The USB port on your devboard is provided
via a hardware USB-to-serial-port chip.) Using an USB keyboard would
either mean using an external USB host chip (like the MAX3421) and
implementing the stack to use this in software, or hoping the keyboard
still supports PS/2 signaling and bitbanging that protocol.

当然,在这里可能有人就会问了,为什么不使用FT232,CH340C等Cheap的芯片呢,那是因为显而易见的问题,我们这里的需求并不是将TTL(串口)转换为USB,而是需要对USB转换为ESP32能支持的信号,那么似乎最好用的就是转为通用SPI,这里ESP32的SPI可以,看官方引脚资料

沿着这个想法,一搜,果然,我又啥都不用做了,人家都做好了。

使用USB Host Library Rev.2.0,在Arduino IDE中也有相应的库,能行。

ESP8266 is supported using the ESP8266 Arduino core Note it uses pin
15 and 5 for SS and INT respectively Also please be aware that: GPIO16
is NOT usable, as it will be used for some other purposes. For
example, reset the SoC itself from sleep mode. GPIO6 to 11 is also NOT
usable, as they are used to connect SPI flash chip and it is used for
storing the executable binary content. ESP32 is supported using the
arduino-esp32 GPIO5 : SS, GPIO17 : INT, GPIO18 : SCK, GPIO19 : MISO,
GPIO23 : MOSI

MAX3421E的单芯片零售价还是稍贵的,某宝上面可以直接购买,直接搜索USB Host Shield 2.0,甚至自己焊接洞洞板都省去了。

2252600336.jpg

事实上,有的ESP32/ESP8266开发板就是已经有了STM32在上面,通过那个直接连接应该也是可行的,这我就不去尝试了,就和以前的方法一样。

另外有意思的项目

在GitHub上面有这么个项目,ESP8266 USB Software Driver,你可以先看图。使用ESP8266,将其作为Wifi鼠标用。(和本文无关)

basic-schematic.png

不过Software-only ESP8266 USB Device
ESP32 as software defined USB host? #45

还是有一些限制。

Limitations

  • You cannot use SDKs newer than 1.5.X. (As of dec-02-2016, 1.5.4 is the latest SDK that has been verified to be compatible.)
  • All ESP SDK 2.0 SDKs are incompatible.
  • By default, the chip expects D- on GPIO 4 and D+ on GPIO 5 - but any GPIO pair may be used. It is important to note that both D- and D+ MUST be adjacent.
  • This project only operates with low-speed USB (1.5 MBit/s) ideal for making peripherals, not for fake network devices and usb-serial bridges.
  • That said - you can still write "control" messages that communicate with the ESP8266.
  • Control messages are a great way to encapsulate your data since they handle all the framing and describing what function you wish to pass data for.

其他问题

最大的问题就是还没自己去试过,不过有空的时候,一定会试的。
Documents\Arduino\libraries\USB_Host_Shield_Library_2.0\examples中有相关例程。

附录-啥是ESP32

ESP32 系列模组专题

ESP32是一款WiFi和蓝牙系统级芯片(SoC),具有行业领先的射频性能、低功耗和高度集成的优势。ESP32集成了完整的发射/接收射频功能,包括天线开关,射频balun,功率放大器,低噪放大器,过滤器,电源管理模块和先进的自校准电路。自校准电路实现了动态自动调整以消除外部电路的缺陷。ESP32带有2个32位、LX6
CPU,主频高达240MHz,采用7级流水线架构。ESP32还集成了丰富的模拟传感和数字接口。
ESP32的超低功耗射频架构和拥有专利的省电技术延长了实际应用的电池续航时间。

我就这样就又水了一篇文,一直水文,一直爽。。。。

文章目录